diff --git a/.astylerc b/.astylerc deleted file mode 100644 index 23f5919..0000000 --- a/.astylerc +++ /dev/null @@ -1,16 +0,0 @@ -# find include src test -name '*.[ch]' | xargs astyle --options=.astylerc ---style=google ---indent=spaces -#--indent-preproc-define -#--indent-preproc-cond ---pad-oper ---pad-comma ---pad-header -#--unpad-paren ---align-pointer=name ---add-braces ---convert-tabs ---mode=c -# disable backup files ---suffix=none ---lineend=linux diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..1bc78a5 --- /dev/null +++ b/.clang-format @@ -0,0 +1,246 @@ +--- +Language: Cpp +# BasedOnStyle: Mozilla +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignArrayOfStructures: Right +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: true + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveMacros: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveShortCaseStatements: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCaseColons: false +AlignEscapedNewlines: Right +AlignOperands: Align +AlignTrailingComments: + Kind: Always + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: false +AllowBreakBeforeNoexceptSpecifier: Never +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortCompoundRequirementOnASingleLine: true +AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: TopLevel +AlwaysBreakAfterReturnType: AllDefinitions +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: Yes +AttributeMacros: + - __capability +BinPackArguments: false +BinPackParameters: false +BitFieldColonSpacing: Both +BraceWrapping: + AfterCaseLabel: false + AfterClass: true + AfterControlStatement: Never + AfterEnum: true + AfterExternBlock: true + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: true + AfterUnion: true + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: false + SplitEmptyNamespace: true +BreakAdjacentStringLiterals: true +BreakAfterAttributes: Leave +BreakAfterJavaFieldAnnotations: false +BreakArrays: true +BreakBeforeBinaryOperators: None +BreakBeforeConceptDeclarations: Always +BreakBeforeBraces: Mozilla +BreakBeforeInlineASMColon: OnlyMultiline +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeComma +BreakInheritanceList: BeforeComma +BreakStringLiterals: true +ColumnLimit: 120 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: false +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: true +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: None +IndentRequiresClause: true +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertBraces: false +InsertNewlineAtEOF: false +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +KeepEmptyLinesAtEOF: false +LambdaBodyIndentation: Signature +LineEnding: DeriveLF +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 4 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: false +PackConstructorInitializers: BinPack +PenaltyBreakAssignment: 4 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakScopeResolution: 500 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 200 +PointerAlignment: Right +PPIndentWidth: -1 +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +RemoveParentheses: Leave +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SkipMacroDefinitionBody: false +SortIncludes: false +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: false +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeJsonColon: false +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + AfterPlacementOperator: true + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParens: Never +SpacesInParensOptions: + InCStyleCasts: false + InConditionalStatements: false + InEmptyParentheses: false + Other: false +SpacesInSquareBrackets: false +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 8 +UseTab: Never +VerilogBreakBetweenInstancePorts: true +WhitespaceSensitiveMacros: + - BOOST_PP_STRINGIZE + - CF_SWIFT_NAME + - NS_SWIFT_NAME + - PP_STRINGIZE + - STRINGIZE +... + diff --git a/.cmake/32bit.cmake b/.cmake/32bit.cmake new file mode 100644 index 0000000..bd98bdf --- /dev/null +++ b/.cmake/32bit.cmake @@ -0,0 +1,8 @@ +set(CMAKE_SYSTEM_NAME ${CMAKE_HOST_SYSTEM_NAME}) +if(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "x86_64") + set(CMAKE_SYSTEM_PROCESSOR i686) +endif() +set(GMP_LIBRARY "BUILD" CACHE STRING "" FORCE) +set(GMP_BUILD_CONFIG_ARGS "ABI=32" CACHE STRING "" FORCE) +set(CMAKE_C_FLAGS "-m32" CACHE STRING "" FORCE) +set(CMAKE_EXE_LINKER_FLAGS "-m32" CACHE STRING "" FORCE) diff --git a/.cmake/bm.cmake b/.cmake/bm.cmake new file mode 100644 index 0000000..5f95ef2 --- /dev/null +++ b/.cmake/bm.cmake @@ -0,0 +1,12 @@ +add_custom_target(bm + COMMAND ${CMAKE_COMMAND} -E echo "Running all benchmarks..." +) + +foreach(bm_bin ${BM_BINS}) + add_custom_command( + TARGET bm + POST_BUILD + COMMAND $ + COMMENT "Running ${bm_bin}" + ) +endforeach() \ No newline at end of file diff --git a/.cmake/flags.cmake b/.cmake/flags.cmake index 2a9cdda..ab450be 100644 --- a/.cmake/flags.cmake +++ b/.cmake/flags.cmake @@ -24,19 +24,29 @@ if(MSVC) endif() else() set(STRICT_OPTIONS_CXX "${STRICT_OPTIONS_CXX} -std=c++14 -O2") - set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wall -Wuninitialized -Wno-deprecated-declarations -Wno-missing-field-initializers") - if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wall -Wuninitialized -Wno-deprecated-declarations -Wno-missing-field-initializers -Wno-unused-function -Wno-missing-braces") + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -Og -g") + else() set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -O3") endif() - set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -std=c99 -Wno-error=strict-prototypes -fvisibility=hidden -funroll-loops -Wno-error=implicit-function-declaration -Wno-error=attributes") + set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -std=c11 -Wno-error=strict-prototypes -fvisibility=hidden -funroll-loops -Wno-error=implicit-function-declaration -Wno-error=attributes") if(CMAKE_C_COMPILER_ID MATCHES "Clang") set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wno-error=unknown-warning-option -Qunused-arguments -Wno-tautological-compare") - set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wno-unused-function -Wno-pass-failed") + set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wno-pass-failed") endif() if(ENABLE_STRICT) - set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -Werror -Wextra -Wno-unused-parameter -fno-strict-aliasing") + set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} ${STRICT_OPTIONS_CPP} -Werror -Wextra -Wno-unused-parameter -fno-strict-aliasing") endif() endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${STRICT_OPTIONS_C}") -#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${STRICT_OPTIONS_CXX} ${STRICT_OPTIONS_CPP}") \ No newline at end of file + +if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + # enable link-time optimization (LTO) + include(CheckIPOSupported) + check_ipo_supported(RESULT result) + if(result) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() +endif() diff --git a/.cmake/gmpconfig.cmake b/.cmake/gmpconfig.cmake index 027a016..34a8e37 100644 --- a/.cmake/gmpconfig.cmake +++ b/.cmake/gmpconfig.cmake @@ -1,5 +1,16 @@ +if (GMP_LIBRARY STREQUAL "SYSTEM") + # use system gmp version + message(STATUS "Using system GMP") -if (ENABLE_GMP_BUILD) + find_library(GMP gmp) + find_path(GMP_INCLUDE gmp.h) + + add_library(GMP UNKNOWN IMPORTED) + set_target_properties(GMP PROPERTIES + IMPORTED_LOCATION ${GMP} + INTERFACE_INCLUDE_DIRECTORIES ${GMP_INCLUDE} + ) +elseif (GMP_LIBRARY STREQUAL "BUILD") # Download and build own libgmp version if (POLICY CMP0135) cmake_policy(SET CMP0135 NEW) @@ -8,29 +19,70 @@ if (ENABLE_GMP_BUILD) option(ENABLE_GMP_STATIC "Option to statically link. Default is dynamic linking" OFF) if (ENABLE_GMP_STATIC) - set(GMP_LIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX}) - else() set(GMP_LIB_SUFFIX ${CMAKE_STATIC_LIBRARY_SUFFIX}) + else() + set(GMP_LIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX}) endif() - message("${GMP_BUILD_CONFIG_ARGS}") + cmake_host_system_information(RESULT N QUERY NUMBER_OF_PHYSICAL_CORES) + if (N EQUAL 0) + # Choose a "safe" amount + set(N 8) + endif() + set(GMP_PARALLEL_BUILD_ARGS -j${N}) + + message(STATUS "Building GMP with additional options: ${GMP_BUILD_CONFIG_ARGS}") include(ExternalProject) find_program(MAKE_EXE NAMES make gmake nmake) set(libgmp_INSTALL_DIR "${CMAKE_BINARY_DIR}/libgmp") ExternalProject_Add(libgmp_external PREFIX ${libgmp_INSTALL_DIR} - URL https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz - URL_HASH SHA256=fd4829912cddd12f84181c3451cc752be224643e87fac497b69edddadc49b4f2 + URL https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz + URL_HASH SHA256=a3c2b80201b89e68616f4ad30bc66aee4927c3ce50e33929ca819d5c43538898 CONFIGURE_COMMAND ${libgmp_INSTALL_DIR}/src/libgmp_external/configure --prefix=${libgmp_INSTALL_DIR} ${GMP_BUILD_CONFIG_ARGS} - BUILD_COMMAND ${MAKE_EXE} -j8 + BUILD_COMMAND ${MAKE_EXE} ${GMP_PARALLEL_BUILD_ARGS} INSTALL_COMMAND ${MAKE_EXE} install + BUILD_BYPRODUCTS ${libgmp_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gmp${GMP_LIB_SUFFIX} ) - set(GMP ${libgmp_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gmp${GMP_LIB_SUFFIX}) - include_directories(${libgmp_INSTALL_DIR}/include) + # Needed to avoid errors about missing directory when creating the GMP target + file(MAKE_DIRECTORY ${libgmp_INSTALL_DIR}/include) + + if(ENABLE_GMP_STATIC) + add_library(GMP STATIC IMPORTED) + set_target_properties(GMP PROPERTIES + IMPORTED_LOCATION ${libgmp_INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}gmp${GMP_LIB_SUFFIX} + INTERFACE_INCLUDE_DIRECTORIES ${libgmp_INSTALL_DIR}/include + ) + else() + add_library(GMP SHARED IMPORTED) + set_target_properties(GMP PROPERTIES + IMPORTED_LOCATION ${libgmp_INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}gmp${GMP_LIB_SUFFIX} + INTERFACE_INCLUDE_DIRECTORIES ${libgmp_INSTALL_DIR}/include + ) + endif() + + add_dependencies(GMP libgmp_external) +elseif (GMP_LIBRARY STREQUAL "MINI") + # Use mini-gmp + message(STATUS "Using mini-GMP") + + include(CheckTypeSize) + + add_library(GMP STATIC + ${PROJECT_SOURCE_DIR}/src/mini-gmp/mini-gmp.c ${PROJECT_SOURCE_DIR}/src/mini-gmp/mini-gmp-extra.c) + target_include_directories(GMP PRIVATE ${PROJECT_SOURCE_DIR}/src/common/generic/include) # for tutil.h + target_include_directories(GMP INTERFACE ${PROJECT_SOURCE_DIR}/src/mini-gmp) + set_source_files_properties(${PROJECT_SOURCE_DIR}/src/mini-gmp/mini-gmp.c PROPERTIES COMPILE_OPTIONS "-w") + + set(CMAKE_REQUIRED_INCLUDES "${PROJECT_SOURCE_DIR}/src/mini-gmp") + set(CMAKE_EXTRA_INCLUDE_FILES "mini-gmp.h") + check_type_size("mp_limb_t" MP_LIMB_T_BYTES) + + math(EXPR GMP_LIMB_BITS "${MP_LIMB_T_BYTES} * 8") + + add_compile_definitions(GMP_LIMB_BITS=${GMP_LIMB_BITS}) + add_compile_definitions(MINI_GMP) else() - # use system gmp version - find_library(GMP gmp) - find_path(GMP_INCLUDE gmp.h) - include_directories(${GMP_INCLUDE}) -endif() + message(FATAL_ERROR "Invalid choice for GMP_LIBRARY: ${GMP_LIBRARY}") +endif() \ No newline at end of file diff --git a/.cmake/impl_type.cmake b/.cmake/impl_type.cmake index a0a74dd..6079df9 100644 --- a/.cmake/impl_type.cmake +++ b/.cmake/impl_type.cmake @@ -1,7 +1,15 @@ get_filename_component(CCSD_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) string(TOUPPER ${CCSD_NAME} CCSD_NAME_UPPER) +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/include) + set(INC_${CCSD_NAME_UPPER}_GENERIC ${CMAKE_CURRENT_SOURCE_DIR}/include) +endif() +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${CCSD_NAME}x) + set(${CCSD_NAME_UPPER}_GENERIC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${CCSD_NAME}x) +endif() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/broadwell AND SQISIGN_BUILD_TYPE MATCHES "broadwell") add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/broadwell) +elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/arm64crypto AND SQISIGN_BUILD_TYPE MATCHES "arm64crypto") + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/arm64crypto) elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/opt AND SQISIGN_BUILD_TYPE MATCHES "opt") add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/opt) elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/ref) diff --git a/.cmake/sqisign_variant.cmake b/.cmake/sqisign_variant.cmake index 04f6878..9909d74 100644 --- a/.cmake/sqisign_variant.cmake +++ b/.cmake/sqisign_variant.cmake @@ -1,6 +1,6 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/generic) set(LIB_${CCSD_NAME_UPPER} sqisign_${CCSD_NAME}_generic CACHE INTERNAL "LIB") - set(INC_${CCSD_NAME_UPPER} ${CMAKE_CURRENT_SOURCE_DIR}/generic/include CACHE INTERNAL "LIB") + set(INC_${CCSD_NAME_UPPER} ${CMAKE_CURRENT_SOURCE_DIR}/generic/include CACHE INTERNAL "INC") add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/generic) FOREACH(SVARIANT ${SVARIANT_S}) string(TOUPPER ${SVARIANT} SVARIANT_UPPER) diff --git a/.cmake/target.cmake b/.cmake/target.cmake index 67096a1..75d0cde 100644 --- a/.cmake/target.cmake +++ b/.cmake/target.cmake @@ -1,39 +1,100 @@ # SPDX-License-Identifier: Apache-2.0 -if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64") - add_definitions(-DTARGET_ARM64) - add_definitions(-DRADIX_64) -elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") - add_definitions(-DTARGET_ARM) - add_definitions(-DRADIX_32) -elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64") - add_definitions(-DTARGET_AMD64) - add_definitions(-DRADIX_64) -elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "i386" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "i686") - add_definitions(-DTARGET_X86) - add_definitions(-DRADIX_32) -elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(s390x.*|S390X.*)") - add_definitions(-DTARGET_S390X) - add_definitions(-DTARGET_BIG_ENDIAN) - add_definitions(-DRADIX_64) +include(CheckTypeSize) + +function(check_target_feature CODE RUN_RESULT) + set(TEMP_FILE "${CMAKE_BINARY_DIR}/check_target_feature.c") + file(WRITE + ${TEMP_FILE} + "int main(void) { + ${CODE} + return 0; + }") + + try_run(TEMP_RUN_RESULT TEMP_COMPILE_RESULT ${CMAKE_BINARY_DIR} ${TEMP_FILE}) + + set(${RUN_RESULT} ${TEMP_RUN_RESULT} PARENT_SCOPE) + if (ARGC EQUAL 3) + set(${ARGV2} ${TEMP_COMPILE_RESULT} PARENT_SCOPE) + endif() + + file(REMOVE ${TEMP_FILE}) +endfunction() + +if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64") + add_compile_definitions(TARGET_ARM64) + set(RADIX 64) + + if (NOT APPLE) + check_target_feature("asm volatile(\"mrs x0, PMCCNTR_EL0\" : : : \"x0\");" CYCCNT) + + if (CYCCNT STREQUAL "FAILED_TO_RUN") + message(STATUS "Cycle counter not supported, reverting to fallback measurement") + add_compile_definitions(NO_CYCLE_COUNTER) + endif() + endif() +elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") + add_compile_definitions(TARGET_ARM) + set(RADIX 32) +elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64") + add_compile_definitions(TARGET_AMD64) + set(RADIX 64) +elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "i386" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "i686") + add_compile_definitions(TARGET_X86) + set(RADIX 32) +elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(s390x.*|S390X.*)") + add_compile_definitions(TARGET_S390X TARGET_BIG_ENDIAN) + set(RADIX 64) else() - add_definitions(-DTARGET_OTHER) - add_definitions(-DRADIX_64) + add_compile_definitions(TARGET_OTHER) + set(RADIX 64) message("Warning: system architecture not detected, defaulting to 64 bit") endif() -if (UNIX) - add_definitions(-DTARGET_OS_UNIX) +if (NOT GF_RADIX STREQUAL "AUTO") + if (NOT((GF_RADIX EQUAL 64) OR (GF_RADIX EQUAL 32))) + message(FATAL_ERROR "Currently supported options for GF_RADIX: 32 or 64. Aborting") + endif() + set(RADIX ${GF_RADIX}) +endif() + +if (NOT DEFINED SQISIGN_BUILD_TYPE) + set(SQISIGN_BUILD_TYPE "ref") +endif() + +if (RADIX EQUAL 32) + if (${SQISIGN_BUILD_TYPE} MATCHES "broadwell") + message(FATAL_ERROR "Broadwell implementation not supported in 32-bit build") + endif() else() - add_definitions(-DTARGET_OS_OTHER) + # Testing for unsigned 128-bit integer support + check_type_size("__uint128_t" uint128_t) + if (${HAVE_uint128_t} AND (uint128_t EQUAL 16)) + add_compile_definitions(HAVE_UINT128) + elseif(${SQISIGN_BUILD_TYPE} MATCHES "ref") + message(WARNING "Compiler/platform does not support unsigned 128-bit integers, falling back to 32-bit build") + set(RADIX 32) + endif() +endif() + +message(STATUS "Using ${RADIX}-bit radix for gf module") + +if (RADIX EQUAL 32) + add_compile_definitions(RADIX_32) +elseif (RADIX EQUAL 64) + add_compile_definitions(RADIX_64) +endif() + +if (UNIX) + add_compile_definitions(TARGET_OS_UNIX) +else() + add_compile_definitions(TARGET_OS_OTHER) endif() set(C_OPT_FLAGS "") -if ((NOT DEFINED SQISIGN_BUILD_TYPE)) - set(SQISIGN_BUILD_TYPE opt) +if (NOT DEFINED SQISIGN_TEST_REPS) + set(SQISIGN_TEST_REPS 10) endif() -if ((NOT DEFINED SQISIGN_TEST_REPS)) - set(SQISIGN_TEST_REPS 1000) -endif() +add_compile_definitions(SQISIGN_TEST_REPS=${SQISIGN_TEST_REPS}) diff --git a/.dir-locals.el b/.dir-locals.el deleted file mode 100644 index 51fa635..0000000 --- a/.dir-locals.el +++ /dev/null @@ -1,16 +0,0 @@ -;; Emacs style file -;; -;; Sets spaces-only indentation, 4-spaces tab stops, linux kernel -;; coding style -( - (nil . ((indent-tabs-mode . nil) - (tab-width . 4) - ) - ) - (c-default-style . ((c-mode . "linux") - )) - (c-mode . ((c-file-style . "linux") - (c-basic-offset . 4) - ) - ) - ) diff --git a/.github/workflows/checks-daily.yml b/.github/workflows/checks-daily.yml new file mode 100644 index 0000000..4c0b3a6 --- /dev/null +++ b/.github/workflows/checks-daily.yml @@ -0,0 +1,19 @@ +name: Daily workflow for various checks + +on: + schedule: + - cron: '0 0 * * *' # This cron expression means "run at midnight UTC every day" + +jobs: + checks: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install dependencies + run: | + sudo apt -y update && sudo apt -y install gcc cmake libgmp-dev scala + + - name: Check namespace + run: scripts/check_namespace.sh \ No newline at end of file diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 598e62c..6046f68 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -2,113 +2,179 @@ name: CMake on: push: - branches: [ '*' ] - pull_request: - branches: [ "main" ] + branches: ["**"] +# pull_request: +# branches: [ "main" ] env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) - BUILD_TYPE: Release + BUILD_TYPE: Debug jobs: build: # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. - # You can convert this to a matrix build if you need cross-platform coverage. - # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix - runs-on: ubuntu-latest - strategy: matrix: + platform: [x64, arm64] + toolchain: [""] sqisign_build_type: [ref] sqisign_test_reps: [10] + gf_radix: [AUTO, 32] + enable_sign: [ON] + gmp_library: [SYSTEM] + include: + - platform: x64 + toolchain: "" + sqisign_build_type: broadwell + sqisign_test_reps: 10 + gf_radix: AUTO + enable_sign: ON + gmp_library: SYSTEM + - platform: x64 + toolchain: .cmake/32bit.cmake + sqisign_build_type: ref + sqisign_test_reps: 10 + gf_radix: 32 + enable_sign: ON + gmp_library: BUILD # Redundant, as it's set in .cmake/32bit.cmake + - platform: x64 + toolchain: "" + sqisign_build_type: ref + sqisign_test_reps: 10 + gf_radix: AUTO + enable_sign: OFF + gmp_library: SYSTEM + - platform: x64 + toolchain: "" + sqisign_build_type: ref + sqisign_test_reps: 10 + gf_radix: AUTO + enable_sign: ON + gmp_library: MINI + + runs-on: [self-hosted, "${{ matrix.platform }}"] steps: - - uses: actions/checkout@v3 - - - name: Install dependencies Valgrind, GMP, Doxygen, TeX - run: | - sudo apt update && sudo apt --fix-missing install valgrind libgmp-dev doxygen texlive-xetex - echo "Valgrind installed" + - uses: actions/checkout@v4 - - name: Configure CMake - # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. - # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DSQISIGN_TEST_REPS=${{ matrix.sqisign_test_reps }} + ## - name: Install dependencies Valgrind, GMP, Doxygen, TeX, gcc-multilib + ## run: | + ## sudo apt update && sudo apt --fix-missing install valgrind libgmp-dev doxygen texlive-xetex gcc-multilib - - name: Build - # Build your program with the given configuration - run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + - name: Set up environment for ccache + run: echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV - - name: Build documentation - # Create html and latex documentation, TODO: do we need different docs for ref and opt? - run: doxygen Doxyfile && cd latex && xelatex refman + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DSQISIGN_TEST_REPS=${{ matrix.sqisign_test_reps }} -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja - - name: Upload latex documentation - uses: actions/upload-artifact@v3 - with: - name: docs - path: latex/refman.pdf + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} - - name: Test - working-directory: ${{github.workspace}}/build - # Execute tests defined by the CMake configuration. - # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail - run: ctest -j4 -C ${{env.BUILD_TYPE}} - - - name: Examples - working-directory: ${{github.workspace}}/build/apps - run: | + - name: Build documentation + # Create html and latex documentation, TODO: do we need different docs for ref and opt? + if: ${{ ((matrix.gf_radix != 32) && (matrix.enable_sign == 'ON') && (matrix.gmp_library == 'SYSTEM')) }} + run: doxygen Doxyfile && cd latex && xelatex refman + + - name: Upload latex documentation + if: ${{ ((matrix.gf_radix != 32) && (matrix.enable_sign == 'ON') && (matrix.gmp_library == 'SYSTEM')) }} + uses: actions/upload-artifact@v4 + with: + name: docs-${{ matrix.platform }}-${{ matrix.sqisign_build_type }} + path: latex/refman.pdf + + - name: Test + working-directory: ${{github.workspace}}/build + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest -j16 -C ${{env.BUILD_TYPE}} -E "KAT$" + + - name: Examples + working-directory: ${{github.workspace}}/build/apps + run: | ./example_nistapi_lvl1 ./example_nistapi_lvl3 ./example_nistapi_lvl5 + if: ${{ matrix.enable_sign == 'ON' }} - - name: CT-Tests - # TODO: re-enable for those tests that should be ct - if: false - run: | + - name: Release build & test + run: | rm -rf build - cmake -Bbuild -DENABLE_CT_TESTING=ON -DCMAKE_BUILD_TYPE=Debug -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DSQISIGN_TEST_REPS=${{ matrix.sqisign_test_reps }} + cmake -Bbuild -DCMAKE_BUILD_TYPE=Release -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi cmake --build build - # valgrind --track-origins=yes build/ - # valgrind --track-origins=yes build/ - # valgrind --track-origins=yes build/ - # valgrind --track-origins=yes build/ + CTEST_OUTPUT_ON_FAILURE=1 ctest -j16 -V --test-dir build -E "KAT$" - - name: Memcheck - run: | + - name: Memcheck + run: | rm -rf build - cmake -Bbuild -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DSQISIGN_TEST_REPS=${{ matrix.sqisign_test_reps }} + cmake -Bbuild -DSQISIGN_TEST_REPS=1 -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DSQISIGN_TEST_REPS=1 -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi cmake --build build - ctest -T memcheck --test-dir build - if: false + valgrind --error-exitcode=1 --max-stackframe=4116160 ./build/test/sqisign_test_scheme_lvl3 + valgrind --error-exitcode=1 --max-stackframe=4116160 ./build/test/sqisign_test_scheme_lvl1 + valgrind --error-exitcode=1 --max-stackframe=4116160 ./build/test/sqisign_test_scheme_lvl5 + if: ${{ matrix.toolchain == '' && matrix.platform == 'arm64' && matrix.gf_radix == 'AUTO' }} - - name: Address Sanitizer ASAN - run: | + - name: Build shared libraries + run: | rm -rf build - cmake -Bbuild -DCMAKE_BUILD_TYPE=ASAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 + cmake -Bbuild -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} -DCMAKE_C_COMPILER=clang ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi cmake --build build - ctest -j4 -v --test-dir build + find . -name '*.so' | grep so + CTEST_OUTPUT_ON_FAILURE=1 ctest -j16 -V --test-dir build -E "KAT$" - # MSAN needs instrumented gmp - - name: Memory Sanitizer MSAN - run: | + - name: Address Sanitizer ASAN + run: | rm -rf build - cmake -Bbuild -DCMAKE_BUILD_TYPE=MSAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 + cmake -Bbuild -DCMAKE_BUILD_TYPE=ASAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi cmake --build build - ctest -j4 -v --test-dir build + CTEST_OUTPUT_ON_FAILURE=1 ctest -j16 -V --test-dir build -E "KAT$" - if: false - - - name: Leak Sanitizer LSAN - run: | + # MSAN needs instrumented gmp + - name: Memory Sanitizer MSAN + run: | rm -rf build - cmake -Bbuild -DCMAKE_BUILD_TYPE=LSAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 + cmake -Bbuild -DCMAKE_BUILD_TYPE=MSAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi cmake --build build - ctest -j4 -v --test-dir build + CTEST_OUTPUT_ON_FAILURE=1 ctest -j16 -V --test-dir build -E "KAT$" + if: ${{ matrix.gmp_library == 'MINI' }} - - name: Undefined Behavior Sanitizer UBSAN - run: | + - name: Leak Sanitizer LSAN + run: | rm -rf build - cmake -Bbuild -DCMAKE_BUILD_TYPE=UBSAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 + cmake -Bbuild -DCMAKE_BUILD_TYPE=LSAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi cmake --build build - ctest -j4 -v --test-dir build + CTEST_OUTPUT_ON_FAILURE=1 ctest -j16 -V --test-dir build -E "KAT$" + + - name: Undefined Behavior Sanitizer UBSAN + run: | + rm -rf build + cmake -Bbuild -DCMAKE_BUILD_TYPE=UBSAN -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DCMAKE_C_COMPILER=clang -DSQISIGN_TEST_REPS=1 -DGF_RADIX=${{ matrix.gf_radix }} -DENABLE_SIGN=${{ matrix.enable_sign }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -G Ninja + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build build + CTEST_OUTPUT_ON_FAILURE=1 ctest -j16 -V --test-dir build -E "KAT$" diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml new file mode 100644 index 0000000..d03da0a --- /dev/null +++ b/.github/workflows/daily.yml @@ -0,0 +1,54 @@ +name: Benchmarks (Daily Workflow) + +on: + schedule: + - cron: '0 0 * * *' # This cron expression means "run at midnight UTC every day" + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + +jobs: + benchmarks: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + strategy: + matrix: + platform: [x64, arm64] + toolchain: [""] + sqisign_build_type: [ref] + include: + - platform: x64 + toolchain: "" + sqisign_build_type: broadwell + sqisign_test_reps: 10 + - platform: x64 + toolchain: .cmake/32bit.cmake + sqisign_build_type: ref + sqisign_test_reps: 10 + + runs-on: [self-hosted, "${{ matrix.platform }}"] + + steps: + - uses: actions/checkout@v4 + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} + + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + + - name: Run benchmarks in apps folder + run: | + build/apps/benchmark_lvl1 50 + build/apps/benchmark_lvl3 20 + build/apps/benchmark_lvl5 10 + + - name: Run Benchmarks (make bm) + run: cd build && make bm diff --git a/.github/workflows/daily_trigger.yml b/.github/workflows/daily_trigger.yml new file mode 100644 index 0000000..71fe078 --- /dev/null +++ b/.github/workflows/daily_trigger.yml @@ -0,0 +1,60 @@ +name: Benchmarks (Daily Workflow, manual trigger) + +on: + workflow_dispatch: + inputs: + commit_sha: + description: 'The commit SHA to run the workflow on' + required: true + type: string + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + +jobs: + benchmarks: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + strategy: + matrix: + platform: [x64, arm64] + toolchain: [""] + sqisign_build_type: [ref] + include: + - platform: x64 + toolchain: "" + sqisign_build_type: broadwell + sqisign_test_reps: 10 + - platform: x64 + toolchain: .cmake/32bit.cmake + sqisign_build_type: ref + sqisign_test_reps: 10 + + runs-on: [self-hosted, "${{ matrix.platform }}"] + + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha }} + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} + + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + + - name: Run benchmarks in apps folder + run: | + build/apps/benchmark_lvl1 50 + build/apps/benchmark_lvl3 20 + build/apps/benchmark_lvl5 10 + + - name: Run Benchmarks (make bm) + run: cd build && make bm diff --git a/.github/workflows/kat.yml b/.github/workflows/kat.yml new file mode 100644 index 0000000..6a6765e --- /dev/null +++ b/.github/workflows/kat.yml @@ -0,0 +1,189 @@ +name: Known Answer Tests (KAT) + +on: + workflow_dispatch: + inputs: + commit_sha: + description: 'The commit SHA to run the workflow on' + required: true + type: string + +jobs: + x86-KAT: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + strategy: + matrix: + compiler: [gcc] + build_type: [Release] + platform: [x64] + #fast_math: [-ffast-math, -fno-fast-math] + #fp_contract: [-ffp-contract=on, -ffp-contract=fast, -ffp-contract=off] + fast_math: [""] + fp_contract: [""] + toolchain: ["", ".cmake/32bit.cmake"] + sqisign_build_type: [ref] + gf_radix: [AUTO, 32] + gmp_library: [SYSTEM, MINI] + + runs-on: [self-hosted, "${{ matrix.platform }}"] + + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha }} + + ## - name: Install dependencies Valgrind, GMP, Doxygen, TeX, gcc-multilib + ## run: | + ## sudo apt update && sudo apt --fix-missing install valgrind libgmp-dev doxygen texlive-xetex gcc-multilib + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_C_COMPILER=${{matrix.compiler}} -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DGF_RADIX=${{ matrix.gf_radix }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -DCMAKE_C_FLAGS="${{ matrix.fast_math }} ${{ matrix.fp_contract }}" + + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --parallel 8 --config ${{matrix.build_type}} + + - name: Test + working-directory: ${{github.workspace}}/build + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest -R KAT$ -j3 -C ${{matrix.build_type}} + + broadwell-KAT: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + strategy: + matrix: + compiler: [clang, gcc] + build_type: [Release] + platform: [x64] + #fast_math: [ON, OFF] + #fp_contract: [ON, FAST, OFF] + fast_math: [""] + fp_contract: [""] + toolchain: [""] + sqisign_build_type: [broadwell] + gf_radix: [AUTO] + gmp_library: [SYSTEM, MINI] + + runs-on: [self-hosted, "${{ matrix.platform }}"] + + steps: + - uses: actions/checkout@v4 + + ## - name: Install dependencies Valgrind, GMP, Doxygen, TeX, gcc-multilib + ## run: | + ## sudo apt update && sudo apt --fix-missing install valgrind libgmp-dev doxygen texlive-xetex gcc-multilib + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_C_COMPILER=${{matrix.compiler}} -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DGF_RADIX=${{ matrix.gf_radix }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -DCMAKE_C_FLAGS="${{ matrix.fast_math }} ${{ matrix.fp_contract }}" + + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --parallel 8 --config ${{matrix.build_type}} + + - name: Test + working-directory: ${{github.workspace}}/build + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest -R KAT$ -j3 -C ${{matrix.build_type}} + + arm64-KAT: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + strategy: + matrix: + compiler: [clang, gcc] + build_type: [Release] + platform: [arm64] + #fast_math: [ON, OFF] + #fp_contract: [ON, FAST, OFF] + fast_math: [""] + fp_contract: [""] + toolchain: [""] + sqisign_build_type: [ref] + gf_radix: [AUTO] + gmp_library: [SYSTEM, MINI] + + runs-on: [self-hosted, "${{ matrix.platform }}"] + + steps: + - uses: actions/checkout@v4 + + ## - name: Install dependencies Valgrind, GMP, Doxygen, TeX, gcc-multilib + ## run: | + ## sudo apt update && sudo apt --fix-missing install valgrind libgmp-dev doxygen texlive-xetex gcc-multilib + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_C_COMPILER=${{matrix.compiler}} -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DGF_RADIX=${{ matrix.gf_radix }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -DCMAKE_C_FLAGS="${{ matrix.fast_math }} ${{ matrix.fp_contract }}" + + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --parallel 8 --config ${{matrix.build_type}} + + - name: Test + working-directory: ${{github.workspace}}/build + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest -R KAT$ -j3 -C ${{matrix.build_type}} + + DebugKAT: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + strategy: + matrix: + compiler: [clang, gcc] + build_type: [Debug] + platform: [x64] + #fast_math: [OFF] + #fp_contract: [FAST] + fast_math: [""] + fp_contract: [""] + toolchain: [""] + sqisign_build_type: [ref, broadwell] + gf_radix: [AUTO] + gmp_library: [SYSTEM] + + runs-on: [self-hosted, "${{ matrix.platform }}"] + + steps: + - uses: actions/checkout@v4 + + ## - name: Install dependencies Valgrind, GMP, Doxygen, TeX, gcc-multilib + ## run: | + ## sudo apt update && sudo apt --fix-missing install valgrind libgmp-dev doxygen texlive-xetex gcc-multilib + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_C_COMPILER=${{matrix.compiler}} -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DSQISIGN_BUILD_TYPE=${{ matrix.sqisign_build_type }} -DGF_RADIX=${{ matrix.gf_radix }} -DGMP_LIBRARY=${{ matrix.gmp_library }} ${{ matrix.toolchain && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.toolchain) || '' }} -DCMAKE_C_FLAGS="${{ matrix.fast_math }} ${{ matrix.fp_contract }}" + + - name: Build + # Build your program with the given configuration + run: | + if [ -n "${{ matrix.toolchain }}" ]; then + cp ~/gmp-6.3.0.tar.xz ${{github.workspace}}/build/libgmp/src + fi + cmake --build ${{github.workspace}}/build --parallel 8 --config ${{matrix.build_type}} + + - name: Test + working-directory: ${{github.workspace}}/build + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest -R KAT$ -j3 -C ${{matrix.build_type}} + \ No newline at end of file diff --git a/.github/workflows/s390-daily.yml b/.github/workflows/s390-daily.yml new file mode 100644 index 0000000..1cdcc40 --- /dev/null +++ b/.github/workflows/s390-daily.yml @@ -0,0 +1,33 @@ +name: Big-endian s390x test (Daily Workflow) + +on: + schedule: + - cron: '0 0 * * *' # This cron expression means "run at midnight UTC every day" + +jobs: + s390-be: + strategy: + matrix: + BUILD_TYPE: [Debug, Release] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Setup multiarch/qemu-user-static + run: | + docker run --rm --privileged multiarch/qemu-user-static:register --reset + - name: Run build and tests in s390x container + run: | + docker run --rm -v ${{ github.workspace }}:/workspace multiarch/ubuntu-core:s390x-focal bash -c " + set -x && + cd /workspace && + ls -l . && + uname -a && + lscpu | grep Endian && + apt -y update && + apt -y install cmake gcc libgmp-dev && + cmake -B build -DCMAKE_BUILD_TYPE=${{ matrix.BUILD_TYPE }} -DSQISIGN_BUILD_TYPE=ref && + cmake --build build --config ${{ matrix.BUILD_TYPE }} && + cd /workspace/build && + ctest -j4 -C ${{ matrix.BUILD_TYPE }} + " diff --git a/.gitignore b/.gitignore index c095a45..ef8e9b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ -build/ +build*/ html/ latex/ +.vscode + +*.DS_Store diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..4032020 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,7 @@ +repos: +- repo: https://github.com/pre-commit/mirrors-clang-format + rev: v18.1.6 + hooks: + - id: clang-format + types_or: [c] + exclude: ^src/precomp/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f059fb..42ae352 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,48 +1,59 @@ # SPDX-License-Identifier: Apache-2.0 -cmake_minimum_required(VERSION 3.5) -project(SQIsign VERSION 1.0 LANGUAGES C ASM) +cmake_minimum_required(VERSION 3.13) +project(SQIsign VERSION 2.0 LANGUAGES C ASM) set(SQISIGN_SO_VERSION "0") -set(CMAKE_C_STANDARD 99) +set(CMAKE_C_STANDARD 11) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) include(CTest) -option(ENABLE_STRICT "Build with strict compile options." OFF) +option(ENABLE_STRICT "Build with strict compile options." ON) option(ENABLE_TESTS "Enable compilation of tests." ON) option(ENABLE_CT_TESTING "Enable compilation for constant time testing." OFF) -option(ENABLE_GMP_BUILD "Download and build external version of GMP" OFF) -option(ENABLE_DOC_TARGET "Enable building API documentation using doxygen" OFF) +option(ENABLE_SIGN "Build with sign functionality" ON) +set(GMP_LIBRARY "SYSTEM" CACHE STRING "Which version of GMP to use: SYSTEM, BUILD or MINI") +set(GF_RADIX "AUTO" CACHE STRING "Set the radix for the gf module (currently supported values: 32 or 64), or AUTO.") if (NOT DEFINED SQISIGN_BUILD_TYPE) - SET(SQISIGN_BUILD_TYPE "ref") + SET(SQISIGN_BUILD_TYPE "ref") endif() -if(SQISIGN_BUILD_TYPE STREQUAL "broadwell") - SET(SVARIANT_S "lvl1") -else() - SET(SVARIANT_S "lvl1;lvl3;lvl5") +if (${SQISIGN_BUILD_TYPE} MATCHES "ref") + add_compile_definitions(SQISIGN_BUILD_TYPE_REF SQISIGN_GF_IMPL_REF) +elseif (${SQISIGN_BUILD_TYPE} MATCHES "opt") + add_compile_definitions(SQISIGN_BUILD_TYPE_OPT SQISIGN_GF_IMPL_REF) +elseif (${SQISIGN_BUILD_TYPE} MATCHES "broadwell") + add_compile_definitions(SQISIGN_BUILD_TYPE_BROADWELL SQISIGN_GF_IMPL_BROADWELL) +elseif (${SQISIGN_BUILD_TYPE} MATCHES "arm64crypto") + add_compile_definitions(SQISIGN_BUILD_TYPE_ARM64CRYPTO SQISIGN_GF_IMPL_REF) endif() +SET(SVARIANT_S "lvl1;lvl3;lvl5") + include(.cmake/flags.cmake) include(.cmake/sanitizers.cmake) include(.cmake/target.cmake) -if(ENABLE_DOC_TARGET) - include(.cmake/target_docs.cmake) +if(ENABLE_SIGN) + include(.cmake/gmpconfig.cmake) + add_compile_definitions(ENABLE_SIGN) endif() -include(.cmake/gmpconfig.cmake) +set(BM_BINS "" CACHE INTERNAL "List of benchmark binaries") set(SELECT_IMPL_TYPE ${PROJECT_SOURCE_DIR}/.cmake/impl_type.cmake) set(SELECT_SQISIGN_VARIANT ${PROJECT_SOURCE_DIR}/.cmake/sqisign_variant.cmake) set(INC_PUBLIC ${PROJECT_SOURCE_DIR}/include) - add_subdirectory(src) add_subdirectory(apps) +add_subdirectory(test) -if(ENABLE_TESTS) - enable_testing() - add_subdirectory(test) -endif() +include(.cmake/bm.cmake) + +#if(ENABLE_TESTS) +# enable_testing() +# add_subdirectory(test) +#endif() diff --git a/COPYING.LGPL b/COPYING.LGPL new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/COPYING.LGPL @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/DEVELOPERS.md b/DEVELOPERS.md index 4b8a76b..67c86c2 100644 --- a/DEVELOPERS.md +++ b/DEVELOPERS.md @@ -4,106 +4,196 @@ Please read carefully before contributing to this repo. ## Code structure -The code is split into the modules below: - +The source code is in the [`src/`](src) directory and it is split into the +following modules: - `common`: common code for AES, SHAKE, (P)RNG, memory handling. Every - module that needs a hash function, seed expansion (e.g., KLPT), + module that needs a hash function, seed expansion, deterministic alea for tests, should call to this module. -- `uintbig`: multi-precision big integers. +- `mp`: code for saturated-representation multiprecision arithmetic. - `gf`: GF(p^2) and GF(p) arithmetic. - `ec`: elliptic curves, isogenies and pairings. Everything that is purely finite-fieldy. -- `quaternion`: quaternion orders and ideals. This is, essentially, - replacing PARI/GP. -- `klpt`: implementation of KLPT. +- `precomp`: constants and precomputed values. +- `quaternion`: quaternion orders and ideals. +- `hd`: code to compute (2,2)-isogenies in the theta model. - `id2iso`: code for Iso <-> Ideal. -- `util`: auxilary code shared among libraries. - -The sources for the modules are in [`src/`](src). Each module is -structured as follows: - -``` -SQIsign -└── src - └── - ├── - │ ├── generic - │ └── lvl1 - ├── opt - │ ├── generic - │ ├── lvl1 - │ ├── lvl1_var1 - │ ├── lvl3 - │ └── lvl5 - └── ref - └── generic -``` - -where: - -- `` is the name of the module. -- `` are optional architecture-specific implementations of the - module (e.g., `broadwell` for code using assembly instructions - specific to the Broadwell platform). -- `opt` and `ref` are the portable *optimized* and *reference* - implementations. -- `lvl1`, `lvl3`, `lvl5` are parameter-dependent implementations of - the module, corresponding to NIST levels 1, 3 and 5, respectively. -- `lvl1_var1` is a variant of `lvl1`, e.g., using a different prime - characteristic. The naming is free, and implementors are encouraged - to choose more explicit naming, e.g., `lvl1_varp6983` for the - variant using the `p6983` prime defined in the SQIsign AC20 variant. -- `generic` is a parameter-independent implementation of the module. - If no folder is named like the currently selected variant (see - [Build](README.md#Build)), then this is compiled instead. - -Each of the folders above is allowed to be a symlink. E.g., if a -module has no separate optimized and reference implementation, then -`opt` can be a symlink to `ref`. Other example: a module's code only -depends on the field size, but not the specific prime, then -`lvl1_varp6983` could be a symlink to `lvl1`. +- `verification`: code for the verification protocol. +- `signature`: code for the key generation and signature protocols. ### Contents of a module -The leaf folders described above should arrange code as described -below. We use the `generic` implementation of the `uintbig` module as -an example. - +Each module is comprised of *implementation types* and common code. An +implementation type refers to the *portable optimized*, *portable reference* or +any architecture-specific implementation of the module; a module must contain at +least one implementation type. Each implementation type must be in its own +directory within the directory of the module. The optimized and reference +implementation types must be placed in the `opt` and `ref` directories, +respectively; there is no rule for naming other architecture-specific +implementations. Common code refers to optional generic code that is shared +among all implementation types. Common code is placed in special directories +within the directory of a module: header files in the `include` directory and +source files in the `x` directory, where `` is the +name of the module. An example of a module is given below: ``` -generic -├── bench -│ ├── CmakeLists.txt -│ ├── bench1.c -│ └── bench2.c -├── include -│ └── uintbig.h -├── test -│ ├── CmakeLists.txt -│ ├── test1.c -│ └── test2.c -├── CmakeLists.txt -├── internal_header.h -├── soruce1.c -└── soruce2.c +src +└── + ├── include + ├── x + ├── opt + ├── ref + └── ``` - where: +- `` is the name of the module. +- `opt` and `ref` are the portable optimized and reference + implementation types, respectively. +- `` is an optional architecture-specific implementation type of the + module (e.g., `broadwell` for code using assembly instructions + specific to the Broadwell platform). +- `include` contains header files common to all implementation types. +- `x` contains source files common to all implementation types + (i.e., `opt`, `ref` and ``). -- `include/` shall contain a **unique header file** named - `.h`, where `` is the name of the module. - This header contains the public API of the module, and is the only - header that can be included by other modules (e.g., via `#include - `). These files must contain extensive doxygen-formatted - documentation describing the module, see - [Documentation](#Documentation). -- `bench` and `test` contain one executable per file, containing, - well, benchmarks and unit tests. Refer to [Benchmarks](#Benchmarks) - and [Tests](#Tests) for instructions on how to write these. -- Internal headers for the private use of the module, such as - `internal_header.h` go to the root. Include these using `#include - "internal_header.h"`. -- The implementation of the module also goes into the root. +Header files in the `include` directory above can be included by other modules +and must contain extensive doxygen-formatted documentation describing the +functions declared there; see [Documentation](#Documentation). Any +implementation-type directory above is allowed to be a symlink; e.g., if a +module has no separate optimized and reference implementation, then +`opt` can be a symlink to `ref`. +Similar to a module, each implementation type is comprised of implementation +*variants* and common code. A variant refers to either a *generic* +implementation, an implementation whose parameters are defined by one of the +NIST levels (i.e., 1, 3 or 5) or a variation of the latter. An implementation +type must contain at least one variant. Each variant must be in its own +directory within that of the implementation type. The generic variant must be +placed in the `generic` directory and variants corresponding to NIST levels 1, +3 and 5 are placed in the directories `lvl1`, `lvl3` and `lvl5`, respectively; +there is no rule for naming the directory of a NIST variation, but +implementors are encouraged to choose informative namings. Common code refers to +optional variant-independent code that is shared among all variants of the same +implementation type. Common code is placed in special directories within that of +the implementation type: header files in the `include` directory and source +files in the `lvlx` directory. Expanding on the example above, we show the +details of its implementation types: +``` +src +└── + ├── include + ├── x + ├── opt + │ ├── include + │ ├── lvlx + │ ├── lvl1 + │ ├── lvl1_var1 + │ ├── lvl3 + │ └── lvl5 + ├── ref + │ ├── generic + │ └── lvl1 + └── + ├── include + ├── lvlx + ├── lvl3 + └── lvl5 +``` +where: +- `lvl1`, `lvl3`, `lvl5` are implementations of NIST levels 1, 3 and 5, + respectively, for the corresponding implementation type. +- `lvl1_var1` is a variation of `lvl1` for the `opt` implementation type (e.g., + using a different prime characteristic). +- `opt/include` contains header files common to all variants in the `opt` + implementation type (i.e., `lvl1`, `lvl1_var1`, `lvl3` and `lvl5`). + Similarly, `/include` for all variants in the `` implementation + type (i.e., `lvl3` and `lvl5`). +- `opt/lvlx` contains source files common to all variants in the `opt` + implementation type. Similarly, `/lvlx` for all variants in the `` + implementation type. +- `generic` contains a parameter-independent implementation of the `ref` + implementation type. + +As the name suggests, the `generic` variant is a generic implementation which +does not depend on the parameters defined by the NIST levels or any variation +of these. If this directory is present, all other parameter-dependent +implementations are ignored and the `generic` implementation is built instead. +As with modules, header files in the `include` directory of an implementation +type (e.g., `opt/include` and `/include` above) can be included by other +modules and must contain extensive doxygen-formatted documentation describing +the functions declared there. + +Each implementation variant must be organized as follows: +- Header files that can be included by other modules are placed in the `include` + directory. These files must contain extensive doxygen-formatted documentation + describing the functions declared there. +- Source files of the implementation and their private internal header files are + placed directly in the implementation variant directory. +- Source files of unit tests and their private internal header files are placed + in the `test` directory. Refer to [Tests](#Tests) for instructions on how to + write these. + +Common code (in `lvlx`) for all variants in an implementation type follows the +same organization as above, with the exception that `lvlx` never contains an +`include` directory. This role is taken by the `include` directory in the +implementation type. Below is an example with the detailed organization of the +common code and the `lvl1` variant for the `ref` implementation type of a +module: +``` + +├──ref +│ ├── include +│ │ └── header_ref.h +│ ├──lvlx +│ │ ├── test +│ │ │ ├── test_internal_header_ref.h +│ │ │ │ ... +│ │ │ ├── test1_ref.c +│ │ │ └── test2_ref.c +│ │ ├── internal_header_ref.h +│ │ ├── source1_ref.c +│ │ └── source2_ref.c +│ ├──lvl1 +│ │ ├── include +│ │ │ └── header_ref_lvl1.h +│ │ ├── test +│ │ │ ├── test_internal_header_ref_lvl1.h +│ │ │ │ ... +│ │ │ ├── test1_ref_lvl1.c +│ │ │ └── test2_ref_lvl1.c +│ │ ├── internal_header_ref_lvl1.h +│ │ ├── source1_ref_lvl1.c +│ │ └── source2_ref_lvl1.c +│ ├──lvl3 +│ └──lvl5 +``` + +Finally, common code for a module must be organized as follows: +- Header files that can be included by other modules are placed in the `include` + directory. As mentionde before, these files must contain extensive + doxygen-formatted documentation describing the functions declared there. +- Source files and their private internal header files are placed in the + `x` directory. +- Source files of unit tests and their private internal header files are placed + in the `x/test` directory. Again, refer to [Tests](#Tests) for + instructions on how to write these. + +The example below shows the detailed organization of the common code of a +module: +``` + +├── include +│ └── header.h +├── x +│ ├── test +│ │ ├── test_internal_header.h +│ │ │ ... +│ │ ├── test1.c +│ │ └── test2.c +│ ├── internal_header.h +│ ├── source1.c +│ └── source2.c +├── opt +└── ref +``` ## Tests @@ -113,27 +203,28 @@ to ensure consistency across the modules. ### Unit tests -These go into `src////test/`. -Refer to ... for an example of how to write tests. +These go in the `src//x/test` and +`src////test/` directories. +Refer to [`src/gf/gfx/test/test_fp.c`](src/gf/gfx/test/test_fp.c) for an example +of how to write tests. ### Integration tests -These go into `test/`. Refer to +These go in the `test/` directory. Refer to [`test/test_sqisign.c`](test/test_sqisign.c) for an example. ### Known Answer Tests (KAT) KATs help validate consistency across implementations. By ensuring that, e.g., the optimized and reference implementation produce the -same signatures. - -See [Known Answer Tests in README.md](README.md#Known Answer Tests (KAT)). +same signatures. KATs are generated by executing `PQCgenKAT_sign_` in +the `apps` directory. KAT tests go in the `test/` directory. ## Benchmarks -Benchmarks for a module go into -`src////bench/`. Global -benchmarks go... +Benchmarks for a module go in the same directories as for tests. +Global benchmarks go in the `apps` directory; e.g., +[`apps/benchmark.c`](apps/benchmark.c). ## Documentation @@ -145,9 +236,9 @@ All code should be extensively documented. The public module headers CI automatically builds a PDF of the doc every time code is pushed. To download the PDF, go to -[Actions](https://github.com/SQIsign/sqisign-nist/actions), click on +[Actions](https://github.com/SQIsign/sqisign-nist2/actions), click on the workflow run you're interested in, then go to Artifacts -> docs -(see figure). +(see figure). PDFs are retained for 2 days. ![](https://user-images.githubusercontent.com/149199/231756751-0f2780f8-33fe-4db9-8800-b5f145423b65.png) @@ -155,11 +246,11 @@ the workflow run you're interested in, then go to Artifacts -> docs Always work on topic branches, never push work in progress on the `main` branch. Once a task / issue / work unit is completed, create a -pull-request and ask your team leader for a review. +pull-request and ask for at least one review. ## Coding style -- **C version**: All code must compile cleanly as *C99*, without +- **C version**: All code must compile cleanly as *C11*, without emitting any warnings, using recent versions of GCC and clang. - **Names**: Externally visible functions and types should be prefixed @@ -187,7 +278,23 @@ pull-request and ask your team leader for a review. Global *state* (modifiable global variables), on the other hand, is strictly forbidden. -- **Whitespace**: Try not to mix tabs and spaces. Line endings - should be UNIX-style (i.e., `\n` rather than `\r\n`). Whitespace - characters at the end of a line, or by themselves on an otherwise - empty line, are to be avoided. +- **Formatting**: This project uses + [`clang-format`](https://clang.llvm.org/docs/ClangFormat.html) to + format the code. From the root of the project run the following + command: + + ``` + find ./src -path ./src/precomp -prune -type f -o -iname '*.h' -o -iname '*.c' | xargs clang-format -i + ``` + + to automatically format all appropriate files with `clang-format`. + + If you want, you can install a [pre-commit + hook](https://pre-commit.com/) to ensure that your work is correctly + formatted before pushing + + ``` + pre-commit install + ``` + + Will use the `.pre-commit-config.yaml` file. diff --git a/KAT/PQCsignKAT_1138_lvl3.rsp b/KAT/PQCsignKAT_1138_lvl3.rsp deleted file mode 100644 index 33b6c7d..0000000 --- a/KAT/PQCsignKAT_1138_lvl3.rsp +++ /dev/null @@ -1,902 +0,0 @@ -# lvl3 - -count = 0 -seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 -mlen = 33 -msg = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 -pk = C5CD571DF86630A93C72B41595D1FC20D258095588CB6409FEA9A4E183B866C77D2F423A7559FB3D6E1ADF0604B36802DDC5C9420E8EC55D547FB02B83346DC9CC1857EB589EE94E666B37D8C5F2DF6BBBD3EAE8E28078D54659765E2FCFCD00 -sk = C5CD571DF86630A93C72B41595D1FC20D258095588CB6409FEA9A4E183B866C77D2F423A7559FB3D6E1ADF0604B36802DDC5C9420E8EC55D547FB02B83346DC9CC1857EB589EE94E666B37D8C5F2DF6BBBD3EAE8E28078D54659765E2FCFCD000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A625A3E972588FA81DF7633783A07C1706821432C975D27F15A34FA67B9D225ADACED4DE4B43D8FC47CE7D27ED46915D23B7C424097C49DAF3083D638019A408E2600D00000000000000650856D96EDE15B689CE0AAC09EBD75779A4C3E7816D66392EF00ACA5A174C391ABB6DF1706D1ACE4EC456C71703E733458A34E4A65EE8BD4A590E8FB76BDC3FA51A0200000000000000451F15E02AF5A3796577D51000D0AEDAAD344FB7BD70CE10690A93BFE3EBFE1066B17B6B9F8B1976EC074A00000000000000000000000000000000000000000000000000000000000000D60B8866D7E34F7DC07FD5B384EA6CDAD7E5C33CAC15B2035BB11F6B637C4B61C0C19BF3C2BBD72A141FDC01000000000000000000000000000000000000000000000000000000000000509418E5DABD7787AF06C141853A097DBC384998A77136B9944C8398B09C49587037D8999B47A57622EAF23ADF634F01142EA3263617904DD61CA29F8C0AE547143E5A59F4357EBE87E5C67A3FE28F49AC8BC61CE6938A2976088558AD7EFA025BFC8FB940465800FB71D1347090AD23EEC7F19B6099C5CFC307F271E35830A72081FDDF66E65C398B6844D2008DFF02BC760CD8961696C1C75386B52F814D0B1CBE5101AA668E9E0F8CDBB8515FC443CB82647FDE4DCD0CDF7F59E6A3769B0178F1327684445B4C4CFCD115DA53DA7BE29A03FB454A61DF6C4062E249F6B449DE28C128CF03F15B2B0A50DBBB1D8802106C7086570F99C384EB115DB6C61C70CDBDC68CCA2D8CA3E0BB0ED711224F336FDB396EAA9DECD1F4ADF7B4E71C08003862E5998B4E6417E9B9E8D1BAAA8C9D57D922D52BFC7B865933E315F35367A16A6CA84747373FF1F343EFC250E6E3010A3A303E4C7468D7CD5A4473E2D89D868027B20FF8A65FC28E563B1F9083BBF8ADC8A25587AC8464A9CF2A3064155600495ADE62542A878A3B51E75BA0244679132FCD7C223B3C52292A242C0F834749B30F0FD7C882F14822D713F87FF24D01A217899BD7C71D24DDA2AD2E307ACF65097882D67DE556BBFB89DD329155B8DA34E7F76E8C7DF7850D0F8F0DE667C503EF710825A9E70D2BCF08A2308F2B13DEE2447AE1E82299A8E2DD7D1FE8326A8752FFCDB63FD265CADEF4C36011987D00543309DA51AC698E8EFA3C9E4C425EB7D28F6E8909071453019CB5F15F0FE1152E565E94B48E35129D684C72AF2351010881E4CA2FB863959490737DF96A3AF85123CC5F918BA09B3538C25F8F186B1D29A33E2B24D320411D42E38A79C4DD000933533CBFA2EC6970E8E23EB5E4BE7CAA3C06E43508F0A8F4D1B6374D3F7622B164918A85E81D90B23A7213EF532502 -smlen = 296 -sm = 306CE5F32F4582C3500AF2620155D3E371A3F8F8E97FC2B12201EF741C2EDB2AA406E7E8E55000166D1779123BBDA1EAC94E37015CA5A4EBFF19E4C1A4BF973001B51F41475C42458883DCF70C000FD50A8A817E14ECD7D19C5301F2C0589E87A226D1254C3CB2009EBF2C4AE9900BA151FEB479005B2CBBE93071BB4E3FAC2B3C01E750294D05CC03DA2EC8F20F0013E028CAC06488DDD5BEF3BD005DA9BA82D8F2A214E087844C00658066AA9B238B339B36556B015F8787BE4932E28B70EF6947001AF5C0DF52E41321862E8136000069018C3FEB9FAC4DCF6F4B852C8D42F7A6F0B8A622FEBC42220001B0745E9F8D6E8A54CE67030801F56FA9FE51B512AF06FC50F9EC0AD81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 - -count = 1 -seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 -mlen = 66 -msg = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 -pk = E5FD4F342B0F422134B7E8D38C5338DFF5DBCEC0E4AFC0BA8FEC4277220C660F05E2718D3FE0EB3A7005B89F91FF2C00EEABFA2CF43413F058388EB8B3E080C0A5BD31DDA29DC788F9DE291F88950F249F1A51AEE8C4C5B339B0C359DC855203 -sk = E5FD4F342B0F422134B7E8D38C5338DFF5DBCEC0E4AFC0BA8FEC4277220C660F05E2718D3FE0EB3A7005B89F91FF2C00EEABFA2CF43413F058388EB8B3E080C0A5BD31DDA29DC788F9DE291F88950F249F1A51AEE8C4C5B339B0C359DC8552030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A52C3344510A501811CB798AC8DAC14711D6EB097FAF009BF3A1B8141CCE083ABDDAB4ED5C1370C50932C4B5DC273928E5BA196C1950E7FA49F85EA38C7BEEC52173DAFFFFFFFFFFFFFF9E1D3BBED732E021A1FB542D4A020D029A52871841211ED197616F24DF30BA0B6446824BB3AD87003E82D48E75B3540D14AF7468B1C5624DFC808A52C54A362B1640EAFFFFFFFFFFFFFF6665350E0C47F9FF022FF6DF34538CCF306139A1D8126F5B73A6B7EE558C6B5D1BC14866AB0BFF657348C1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD509FD98D1C4548514973C2ED7D9BFCD7DAEAF5CCB05A999452ECD9D48C752ED0E1461AC7DA5F0B0768FBD00000000000000000000000000000000000000000000000000000000000000C900EBD4A6094EBE5543787DCA057B49D5DC91A020B27457FDB99947A15B25F0384BA48303699FB8B88993BF95F441035A36007842763F83033067DAA80E9CB82FAC0947588EFCDC0123D879E43C509A7B7F1A3DEB798DBA6DD9E20330832E0006756CF309B94C8BC6750E3FB75851C13AB49815351CB7583F285AF80472564883C5260FDC4F3CC94FD170C9F269B10254D90A9994C9E58ABBCFAC068593FED8017F5F3BF5CB512A7A13D5047996C8FAD15691C1F068AB5500C716530CC46F010F424C440D21BACE88634787A0F937CF74455EA3C708776DCD2E145777E51C5CB79B8A380264966033B955CECC8A9D03BE4132911B318442A0CFBA8B02DE787E9745A7259C426A150C5D6D8B7C68134FE850E387CEA22E0DA3DC1A646668B602173EAAA869901A5A31C8FCFE58B8A8960F1C8C6704CEC475DC316CC7336948A508F4D8C67F86327841F8A441E6779301AABD40CEFA1FFE267F164849CD7302D793309A8FBFC964B0D1353DCA601677DAD3D95AE1785F75FB275DE14C9528FD02D2D0B5C92AE5816755943F84C276CB74B67557D947A4F9A5BBE9CB754FB6958E96C9B4ECF6495A3E42174DED5CFA84031FF1A2BD5F109BA2353CFDCCAD97B370FDF22D3202D8DB09CD539804E51BD4901BE0ADD34390CFD7009365F9D2AE88018C457D02EF0CAEBEE57C4C9A375F8C34BEB7404B563ED437D4D07309DAC04ED0FC599180A11E9920F8282D754A6A6401E778B227A3F47515DCC8130799830BC58484F82132E20BC4073631D9FE7DE4110DF02E27BAAD00E561D66F1A3BEE2B0070131CE2C831E47CB819C67DA1AA1D3459018B1D8BCE7DC8EEF560F03736F7CFD5132FDB0FF3068000BAAA1256671600406E7B6D0EA886E409B3D49D4028055BC736D6F23648251BC7E7F3CC50D46382677533AD7091D021B75DD10C6FF3B903 -smlen = 329 -sm = 8FCDA231661A15C8E995251A009B38ECEE3AADFF1E005733AD01ADDC30B7EF7F4B85F6891ACF00F1394D69FE4F2E94CCCD7DCF01827CB2FD00E50C3A9F8835F3002DFCCF996BE8DF3179A5AC4101B6804A54868C79BB69B3F4890067783728BBF2B47D5D3EA7CF008025879917C609A6CAEEAF48002CDA30B4CBF4A719FBF1A09C018A50B758B842A9E73A0BCFE40107E41555C57661CD9B528D77011275011B2359908F07F3BAB40165C06E6F4A03AC7EE943E08000A291818A5334FB32379334410138C4896BE0D38483304E85D00101CBD6548000E88466AD9BE9809E6E39EC675735611B08D289C01503C23AAA6C1A568089C504DE31012C0928FF52198EE78BC0420F400D225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 - -count = 2 -seed = BFF58FDA9DB4C2D8BD02E4647868D4A2FA12500A65CA4C9F918B505707FA775951018D9149C97D443EA16B07DD68435B -mlen = 99 -msg = 2B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF -pk = FB8D0F03C7088BC719F4D6602FAAC589D8F1F98CA633CB9AEF846A4178120B978FB0142A835B06807114CCEF22DD5D024463EBD6504E103154EFCBA00D60437CE20090AEB2454382BD32C2C01758951963746523AA80F539820F6FC1E4F91903 -sk = FB8D0F03C7088BC719F4D6602FAAC589D8F1F98CA633CB9AEF846A4178120B978FB0142A835B06807114CCEF22DD5D024463EBD6504E103154EFCBA00D60437CE20090AEB2454382BD32C2C01758951963746523AA80F539820F6FC1E4F9190302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ADFD9364EE2AE0C2D2CC1C574E299FD3D0BC481BF1951889DC2C4F505B635505BD876C54FCDE57A5573FAD424CECE656BD6F73AC6E9E280AAC2D37F7A431B01834A10000000000000004D347ED377DE046F9CE495D7E5B736DE189BE39343E236EAA39B9CD0BF29F32624F84FC1361A9463D058BA29AFDCDA7DBBDFBD878E8AFAE4E65F0E52EFEAB73EEE93D2FFFFFFFFFFFFFF3D184FC9AB3E0EBE7E4C9EA0BBF076FF95079D3E6A8CBDF1E885CB813C48C6585DAF68B3CC9F290E9DA1B6FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF728581D29F5C1D73C9F1F775A16F37CA612EC250E444F4CE6A7EAA2C2E43A8BD5F9731C578B7D24C9AF6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD60B357ADD7DC9B6013DD6CA3A89EF70D3C84F7000724D1BC69DF4791D58839D8EA5A5EA7E50DA0B61ABCF87ABC1DB03DFCA0132F4D78F8F3923AC500E9C421E031703DA803D6CCD5E0569A8B254DF86980A8164FEC379D0E207C14D774FEE00C0EFEDDBB2F39AFB7FC9DF6ED43DE165228774D52CD0033FC3669442D214A638C680EDB0DB00470B48593ED84FC6F2001956BA48E0F7A7E35BC54E06E441AFFEEB55B73703DA9BE45ACDD50326BD77F901E404DA9F66BAE1666951466921D101FBAAFB4C262AD7207C05C3552559EC186FA35761E616C2EA2BAC6D803D80D89D1839A46C8D2FF39555F99589B18255026E1FFB4D43FF228DDD34680A80D6898E43C1BC2854C30418BE8BA89203B186C49F2092B14A651E6CF16BC280348B0702CEA5847FFA92130E5355AC85916CAEB693A660FF840353F28B71C7119E4AE0DFBB564BC324BE135269F03DE6A1D6B4016368F9B2A31DA13685371FADF898FD3B5FCBB935008F744244B73CBEDE4DE97E97DA443438879914272BE30364D431025A8341F9541488952E3BA60E94337F5CF8D8B41D5C05C41F1245A5EEBB9DD11DED6747A873C001454F975AA8049165017267EBD876841B571B9AAE6F665D3CDBC78A331D089832EEF8BAF74C7C5557A46D2919553C0714196F2EBE3E4E6D8F02440CF01C48883FEFFB96C2FCDD76E4653215A2F267385F333BE18953DB140FDD22A7EE192ED87B1F8BC57F020EBB8202BA028E4E9DEA7FD038CC1D3C6FAD7CB6987450FF11AABA6723969FB46874C875AA1DD2627DF21F83DC2DBC81A2FADE036F55CE1A859502F9006C2505B324E1838938F0109AB4FA5A1C988827C19796F1275FDA23DE311CDA4DCA04D5AFD1CC005A09DE37CA0F6E1FED973850590FE59217A0D5ADF4E30C2D99D2126EF3DD45605E674793E5379BAFD419E21452072101 -smlen = 362 -sm = 7AA1040252794075DC273D0A001F17C530F3EF4BF5A41EB7D901DF6F9DB63BF482507B3F3D83011C205516BF0A12A890FDE8DB00A1667C1121C07606897D055801468FC0DC4F052A4110F5436E0036CA201AD113B48F3717A7FE00FABB1C0B700415D3FAC8FF260035E9ADF3E019A7935A5603D3015FAAA0390BB38372BC4055C801E72DF5F420B3580B943F1CB0017C07CC9D2BAEAB927D5FE3BD008C7D4ECF1FA4EFEC3A6D509901B834727B42D98FD90998E82601E5C695C614C1DE249BB69EDE01AB595AE3379048291764885B000137BA8955B2F3E0F7DD5FD3E058B381E17D83AEC7059C5600231801E00B1CF2584E1120D25A143C00018CDCF2B57A829847400645D6082B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF - -count = 3 -seed = 58C094D217BC13EDFDBEA57EDBF3A536F8F69FED1D54648CE3D0CCB4847A5C9917C2E2BC4D5F620E937F0D329FCF8A16 -mlen = 132 -msg = 2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE -pk = 7A231E42490FEB4377812D4A3A18A14886D035BE73F7C34E0C38B8B07CBBDC25081DF000A3C9807C87BB0C650796B60241D12CA461969CE95D9DD6652863D74AEE53A5580B030A0338EACEEDED43C20CBF9D4E313477112CB5D84F5F033F8A03 -sk = 7A231E42490FEB4377812D4A3A18A14886D035BE73F7C34E0C38B8B07CBBDC25081DF000A3C9807C87BB0C650796B60241D12CA461969CE95D9DD6652863D74AEE53A5580B030A0338EACEEDED43C20CBF9D4E313477112CB5D84F5F033F8A030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000685DD55D0659673760302ECB6124DD2C3AF371B9D8C4AAB180DC0BE9D769F6C8BE9BD77634E60C6082B31D3D2E90B7958CD37F9EAA72830F7240CB0224EDDAC340801000000000000000FB56048A0E5790A761D97FE1F487185079BB8733F36A61CEB43A5940DE507E4C8D635A6959BD89FA6B0C970B30172ECF1AEAE2F9E5F60257BE9C1998CF84699279671500000000000000FB1BF171F497ACE6D5B7ED6E8C9968B714991F3C639845846057F7D3A1FDED9C21AE0983965A90C9B3165B00000000000000000000000000000000000000000000000000000000000000C8456E04B73AAF7485C7C8501F9BFADF26FF385FC856D14EE3F427D55CE0B4E6B14E87AAB95A6855DDD13C01000000000000000000000000000000000000000000000000000000000000ADFD06F4238A8FC1E8BFF2EA8CB258841426DD726A3E3D026FDCBECBC365EF5FEA4BDCFDE5268A35F59D91CBB6DF1E027A9ABAA332F4A9634D85D8F2547520C30A2D2AFD7510652D0F892604071610C91F3F2336422B549A6D32E518DD4DDF0099AD647128980E25C7FB0EE152C786824EE28324B671FA80E728D6B8B47B24E8D57CA496A29B46CC019D38EA8DD777037F5BD06EBC7F92DC18146D100E4E5B71DE1B360319ED4127896B95975BF405405F8B1DA4AA2B6D0E2AB27E8D224E89017051EC51101700AB3F263E437CC6EB45EB16F3BFB0E8DA20F4E4D62DE91261CBAE9161C8C3D398CAD9142DDE8EE31201759F3E76EAEC3EEA09D280DD328AD1C0EEF903C8033D992003F29F576D559F51D16F13B0F9E487F679CEC6992D89DE00EDE7C07D134F6D47E0A36DD7392B3C68558F9F9D6E7B6A4B20F35FD3F20719505821935FB08531CAE556098F06A9D703FE7BE795D0EEA931F1AB9F7575C8DF4AE11A434AAB6B1758A441CA85D85AFA7ABF9A76B4B0FF6356F2B05F890B0A130193286130A2A8B876501AB08591FF96461AB342DB05BC1E249F3E0CF908EA4814B6BC34257734FA492503C3B590769403A8793580A0FE75347EC83F053F9F0284261E7EB0B7FB2CE52186453FF90DEA732A0958AA5D2046F8C18211EBA7B3C0016FEBBE37159D80CFFA542A7D5915EFD50C405BAEE4AF1065C601341137F81BB42073991F987DEB6E8185DCB8F0E38C027E4F76782914516826C4053FFAE88DC77026562CEB2F648116247F02F20B4BE1EFFD5DCE15034ED94C063011310BAD007FC0B67B6194FFFC180560DADE6CE9A9E288EEB7E5ADF0F0AA5D5D459B9FAF3EC10C52A0980EC9EA3441A4035069270318E5BCBE688B79E917B767C83D8434823352FA6DC8CA8F8486D76D681850FB92AE99EABA9ED666A594EFD56F444B4F01 -smlen = 395 -sm = 4CB23CF8A6928F98527A1F3E0003FFFCCF382529B6570912C200C5B16BBC22CC874346FAA42A00420BAF6AB17442345A1517F9005C3FCB574331A95834FAECF20180BC164ACD4CEEDBBC1281980190E42D544E26D3113235244700D5CA534653B1AF4CF4FAE8D201FF7A9C5617E1ED30F12A37F6019B5775718E2E1A98A5AEE9A201D46B3540FDAB07800870FDF400DF1BA69AF62A7C4694623FC30016160D4522F55F739898031D00A02936673CAB028691E646240084352B296836F333A0B00BEF011FD32415EB28145827F663D80101A550B1970D7D106B08A28B7661A39529472344A3967F8A7FC20A02508EABF9908E0883CC43158A01679B6E3E0F485C9A14C5565E820B2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE - -count = 4 -seed = F1902A7815F37BC7F5802D8CBCE5B48D82EB85691718062BFB84D8C06AA41D6E9039B0A107245DAFA4EC109A57332914 -mlen = 165 -msg = 1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 -pk = 5401A37B4D8E4EDA5DF9D4A08D36E5289D7E44799C6B30F66E811ED3BF3A4B2322F510DD523E435D26E174ED17F7BF01DFFE3B0C958A640C3860D28F573DF0616C5F5DCCFF391CE8ACFBEAFE9F648984597E3984A6680952F8D184EF4EB50303 -sk = 5401A37B4D8E4EDA5DF9D4A08D36E5289D7E44799C6B30F66E811ED3BF3A4B2322F510DD523E435D26E174ED17F7BF01DFFE3B0C958A640C3860D28F573DF0616C5F5DCCFF391CE8ACFBEAFE9F648984597E3984A6680952F8D184EF4EB50303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095FEC774BB3782121B099DCBAC921C06BB463FBE6143422113DD42B094941EB6E68250EB9B322AED968B35F8D8D58F7A0CA442EEAD2EBD53978A25EB43B88E8726902E00000000000000D42C84692991610AF7E489990866BFC2693238398B8181285EF8AF1531C739018B1E8EBCE88B6CF94ED38DC72654AE2D5DA9EBEC15975BB9AA6520BDECEB1D562CC217000000000000006CAF7B491A4A4174004B109166E17FF8B2F46064297021B0CF725EBE935765B3C81EEAD41CD3FA615812E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BD8C742547D128FFAD1C76F828EC115C706B0B6F897D737FA29244CA2F8B972EF28EE3C63760ED814489E0000000000000000000000000000000000000000000000000000000000000008E9AE2624801BB1BC845740CDDEEBF74AC98E5EA2974D04D97F43BE5AF148493AFCF52254FF30085A8417A139908302E4BFE270250FD2340E793E5E07F787B26930D49E7566A0CD59B0BAF6448B8C5CC55A6FCE796D7257015A3A37FAD03A01E92EB62C92B1D9DD904464A6C797C25573F104C51F14B1902F3B27DFA8BA4F34E04616A964AD4B6724C7D199489E180022F48AE78E2CBF4C980EBAE727D267E59A0DD250A9A4F355BF9A7918A0226D8FFCD4C61FB4045B94EA9BCBFE1D6EC101E86C2288A5767E2EAF7E28C65C990B67ED794F2F94ADD9309E2EDA6035A74A9C8E80F6A9329DCDC0FAF5C99B28A67B00F18C76AB5DAEE08560A2AA8F1AC1BF82F66A3DB460F3BE684F6592028F10FF24FF4A9765312388A23905F7EE505D9C02820D50F7579D1B4221CBCE4CF3B58D7F47177E54F34C49BA35D5CD696E1FDFBE1FE504DCF032AAB07183D2BC79C85F00FC460B48F874FB58D7FD4C0AFF111E696AD371D87D364A773B8164A12502A6C11BDBFF65D5D04C85FF0D3A1ADFFEFF008EF61B1EA762AFF46CCDE80D6FD4294802B522FB3692964FF107569A59FCE82902DC2EDF0FBED1EB2439BA87FC0E6D00941B9140730CF53B84CA3D2767A6EBBEF69C965E8FD9D848792894ADA0A3EFB901F410CF23AC99372035F1D2D5CD5502D48401424339458CB3522C5DC4C13F7DCB4E6FF256E9521A0A6042CF1AB822C7664E9FA22B8E99774AE22B69280E26011AAF17D7A713C89444CE78473B5F5DCACB15574C21C66E5D38875206D3257AC6FB5B2785F1BF49E4B6B1B2BEAE675C034580188D0F3742D4273D7F6F32EE2FD6D08449F0EDBCF57D0BFA4F5BE2806117BAC8956867028552715C0CF37CF5BD00B3E8FDD2883A7541EF7F93606DACF87FB45052FA1C6E182293CE5BBDF65ABA434D1E129EF83BE279E7112BF0B0185A01 -smlen = 428 -sm = 98C00ADC55617000C2EC326100509BFF0E70FC796A6D8B44B601B02FA0B6A198DD451F8AE60F01CE55166BF95FF680691C856F011BD864ED6CFA5EEA69B9908300D43F4A75C44317B482FA120301FAB87128AC75E45AE547EB12003C065D5E8D9A62F076C39AD900B90EFD85B9200ADCEEF413DB010C8C0DAAE962230C8400B489007F284F7878B9778CA498E63F0061D68A29D9B80139AE54D57B0161C0F41BAED5178180A2DBAF0066ED0855460C5179A24DF4AD0090BEB7AC935ADF0710845416002E35006C99FA81A735CC46DC0001ABC148656A573AD585AF9CA2E23610EBF0FA655E85286BD0910F023C81EEB4E2CFFED04C5FC9C101B6897F0DB42AA195F4AC5F1169021CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 - -count = 5 -seed = 75224ECC026C18159FF92256844D0ADF953F0A4DD8D74D4EBF1DC5EE8F5630B011A447FD4DC34A2404D620CA0E1F273E -mlen = 198 -msg = DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD -pk = 22726A97C996F2F6685827CFD87CB205B0AB116B2D39BABBFAA65FAB5DFECC4C6035826AC3831A98CE25885B8FB847030F4ABE7C54041E3A52F58355D38D97E8D1D4CBB064EF94E31287EBBFA99AAA2B67A8650D9850EF6F33727210AE58BA00 -sk = 22726A97C996F2F6685827CFD87CB205B0AB116B2D39BABBFAA65FAB5DFECC4C6035826AC3831A98CE25885B8FB847030F4ABE7C54041E3A52F58355D38D97E8D1D4CBB064EF94E31287EBBFA99AAA2B67A8650D9850EF6F33727210AE58BA0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C2B4768B32E2EDD6E50895160435C13398A6677588B8C4E5122C0EB48E0FD00DAB3852DADFC006EB8BE4AA64AD3B5CD17DCFF427BD509268FB87DD054E4346C01D3010000000000000047729C5E8621D1C843E951FBC44967642DB82C25B3AB369F3A080B3F74002F92DF62FDDDC82C389B0F72E5D63F0B89397A5559B922064136474ED9DA1AF7C877F0B90600000000000000475557BCA8B2B9FA25ADC3E7CB23E0B4C96D006AFE89E0EC95C66FD227FD17C39A769A5F0DB8F233C3CD9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC5C830E42852204E4D3F49A24236D0BD845AA6ADCE5EA56C3DD8EA426BC8E9AD70287AAD27AC73A4BC57001000000000000000000000000000000000000000000000000000000000000E7721641E7D148C0A5696B2860DB5B198E0C9F157F5014DC4CF220C562671799BCEB86F849D7C616AA8B2406F0321400A180850CDE42DF4186395022BDE2670A1FB98762A3AE3DF9A28BFE5D78A14580EB785BCEE7584B039CE87E8FDC235603324DB484E1320B1616BCE540C030A81FB904521F6E78E8532BB8AE1101F9CB7A0A636E1E4AC3E11FA75FF95000D4B80270F7F104FD976A10A802E1ED1B4F52B08A73D2898B94D76A9FAF2F7BED3A6C00C2582D55C2E464129DC547FCC7FDBB0143E783BF83C0DF124DB5038E154F8C66064D946E976C09C91DC92E7421F533C85C47F56D36487F746FB11BFC7912970012D896B3715E624A1B59F9571D177AB67ACB97ED7F047794C0D7C6D0D44AEEF7E2981675B11FB5106A1C42BFB399250290FCB1FA3195EC33EC0DE04A277A509EE1DC7E7636851F4286F00D847AD4D43040D5F7F5572CDCDAEF12419D1F4C12006DAD5F60A523E7095DDCA48430A8EA1A46B5511434DB642E6A064FFB0893BC4FB7B038E0A0B5C890D4FFE5B5682A670190F6173C2359065368D2F7B488B28D07F8324FB1A50C0D761B70D5B0A54E8A42D5699B5058FB2E6D6429C69CD5F8BD023545F2FB226D0381A32414FB25A2E2C47CF82C9110A6A57AB757E1E2169E9B34EE7B55002DB2F655CBC606FF5FCDC10268C798D36862A13B13AC66531B02EB4F673827D5545D6DA4FB75D99E3DBDA74719FC8E3326B7F835CBE378529A61C303FD6B6F6EC6BEC70ECB7E6BE5241E9AAA0E0246779CAA7B76A8E647104B87461D1C49628E5D8D5573A6702B15289747013B708F63488F26343DB058B8F97F71491AA2910A856578BC57ED3CF0B8A8A4439DFD85341F51631CE9D36ABD8C4A7C02A3B9F5ED2DDF224DD4C41D03E0C52D8902F77C64835EA0C1730C384CC47D2B2CC6DEE0DE662940138A93BF7E4D99AB01 -smlen = 461 -sm = 3CE3736EA44AD0CED73C5BC500E75ACFB1575ACB39AA97654C019A310B02655D991709A90FBE0060CFA34A16E8A6A10C3C31C1001CC45D9071ACCA6348771C18012BDF3DA51765112F67CBE8CE005F2E6BCA6DB2F46ECF04A125008743C868FB85AE2745EF3B99007A903D3FD9E0C30980E2EB6C016989B6CCA2118E0E38116B580141E98B6FCD2C251C99FF05B8014ACF72C299D3B1E329BA940B00E11C6B639AFA2F5E5A5FA5BE00CC4CEC41F385719B7A0FD45D01E9A50FD324F2D9D29309537900545DA94F8001CBF33CB3356E000123DDA4EB7C2B6C7066411067F5EE4670FA2ED8F9E56BB78A251303122DE8CBC015286433036DA600DAD294C9B1305FCDB4EB7C42A601DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD - -count = 6 -seed = 447F03C8CD27EDAA1FA0436DA492812F57AC946479A9F1F90EC4F5E913A05F8AB0DD7645026A96510F6D40AF05D85B07 -mlen = 231 -msg = 0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B -pk = 1CDB64FFB7E1DADF70A2289611A0B768AF64EF0016648ACFDE96F6980FBD43CA2A660A8B97C2294ABF098D0D508F30001633D00212B782F833C978CB13796B7945473D5075C200393E99DCEA32268B961D6161A8CB25D669FF2D6DE55D3F9903 -sk = 1CDB64FFB7E1DADF70A2289611A0B768AF64EF0016648ACFDE96F6980FBD43CA2A660A8B97C2294ABF098D0D508F30001633D00212B782F833C978CB13796B7945473D5075C200393E99DCEA32268B961D6161A8CB25D669FF2D6DE55D3F990302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007BA6362853E5F36DE2A5F667D0B5985889B50B598CF0225C06AFCA71FD1C4FCBF2964E2757C7C2826C2D1CF2AF3212BECF7B87187A070DA023C06F44A0114AFAD8DA2D000000000000009E017023046E388002AD167C7AFF386521275EE9C5E98CE521506BD854C00DFA1ACD1DB0A6346EFBEE1A83486F6970AD5D2825E564CFB5213040A069AC84365EFDDDF1FFFFFFFFFFFFFFEA215A1FEE48429CD6C8A14F0440202444CE08550CC723C8239B069CF47A26584831ED665C620B1315F8C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B494138C9176F2F23B66670C35B22AFEF340741A5EF32A9AA703BB5321C85AE17BBDEE47C4680271A3634010000000000000000000000000000000000000000000000000000000000001BEA9A159D03DB96C1C84CEF7F39AEB6B867E1E14BA4BDCCD9F7305EE7508E76A9C1A9C616774686123B8B841C82A303D2D6393E67A4ABAF1EEE74DBA0FE35507B637AB9ED3BF10F9B2AFBAB382061BA81476B7C98042A685491221526124E036C923D42C5B9114B6B5E0FC313A6A19EE7D915A162C7BB5AD1174EB4C0A5B7A1AA1A3AD8522FD4C404EEA7CA14A951024DA6EA4786373D6AF20A91FF4D0F1583749CB36AE15838CBCD5BE42D8F8B52F6391A86C3B388A60F35B09D42D4AB1E030E30627A4D0289DDE7129506952064B24F7D8B52ABE404A70B94F92A377238F5A43EA445C466CA6090BAF0F4D105D900DBF958CF2DA2EFBF73F39A92A133068D68B9711863F9A4857DDB9F2A46AC918D52D18752BB8947184875E364A893AC01ED49EABAAFE3C623B74E2A3FBB0CAB447AEB30443841362125BFCC9C35D3D49F8E5525885CACB290D328C9F380DCF101528683B3350CABB0B7E87EC6A3FF9E39D44791F433969B1AF46DC5BA9636B1FD5A4FC9CBCD9D0461957FA97E350B08030E708092EE3CC0E4F04D6708FBFCCA9EAE3C91910F1C80573308D0E82F74348D559B994F2E7665AEF616067CD16E3702C5D5BE19F317F6D5A09B44F9D7530787FF8A0B6E9FAC5ED16BF27337F146FD152C2B61377562D2BCC0B250EFC5D77B03B57F0824889A188308465194284BFABF9682A2D6BB20EF5A581240ABEA17845867DB878BDA6BC0A5F926416889F90600F0259AD9C9E5C7B576350B3CA5EF20811B4DA5452FB62BCE686B0A399A5EEC43A34C533F9B6D60E43F61948F1512A4008E33DF33CE467B56C62F49AA90CEFE4DFFAF294373B3CF91E85EC34CE15E7559F60DDE356EEAACA94013FDD6080EB00224E9CABA4D37F39E50130D6D972A30DDCB32868D731081CEED4270A3972FCB9CE9B699A0284DF0858B152B98DBD0D903 -smlen = 494 -sm = 5C8F77CC8AB52F7DA8019BC500135EF2032B4BB046A019FB7F010CF2E5FE40B1924DD42595F8008913CE7404D9219D86676567008E9139910D32F04EF5618FD20130FBCA8240CF0462C9510C5B00D562B33FEB6483DDB9646CDE00F48EC4A5A6C5EDD2839F894E00EF96CCF5948DC1FBCC73633801991232646118E943059781C301A3AAAEAC273389D46B06A1470053281AF1A36984E26AB7D7230022907F0EB5773EEC3E4630EA01931E22A9391B987C50DC324C0021FEA398C942DFE9FF50B3B90110143EE7FFC3B77F30EC05AA0101292E524EC41056D9E77C4B4A8A2D52C595AF631AD11E513B421402FE896C39972EB11A13106DBF00C62D9948E50FC3122FD372AE37050073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B - -count = 7 -seed = 8C151C556DA912A82DEB32144C8A8C9090CFAF5C12AB822AC3C72618837A41C2453B715EEFF3724CAFE69B1ADCAE9DDA -mlen = 264 -msg = A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 -pk = 866BE432A05A94254CC007E4B30043056B3034AF8E2D79B8C1B636E19B6F31C85C14E4B1F9F901F94E741453A27A4F020BEA7DE808280DC63399BAC0B5C0005E597B99822FD0E8C5600670E6296B0BB669A924C2211B814F7872E49731D30A03 -sk = 866BE432A05A94254CC007E4B30043056B3034AF8E2D79B8C1B636E19B6F31C85C14E4B1F9F901F94E741453A27A4F020BEA7DE808280DC63399BAC0B5C0005E597B99822FD0E8C5600670E6296B0BB669A924C2211B814F7872E49731D30A0302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001D1047606FBE743FFCF572596D16D3D348430C98F5D629A9499684B899F96F6993D26EC3FEC7AB63D13D115A35B278F6744778962DB772E6F123166B89BBB0E6E0C31D000000000000002E12A6FF081E3851FA1475398B9C687BC422C4FE623692028F2A5B4517536686FB2620E2372267944478C19D293C071AD10FF3E947BD6C0E83C54CFF2FEAADE0F8F5D4FFFFFFFFFFFFFFA6C9A1971D7CBDA4BA942CC6B1D13842A804A0F59D3EFA7C04FAE1106AD3EBB7B96FC825A8C88B33EF8F4C000000000000000000000000000000000000000000000000000000000000002D4A0EB5A629529381E97F97F24C3AE21B827F15AB5180A2DD360F48200236FA17D11B5F9AC58B9C6928A600000000000000000000000000000000000000000000000000000000000000B889B33024A80C46C2717D6EC99758CDD4A9FA82FDC806F68A4DEF6A7416A440C9EDC46D2EA33895531B72B8558A1600B7D140AB5C364FE7415720E73ADAAF510B2C05ED61C0F4DFFFFFE2D409E3516C6ED37E45C26096FDC0EB4D653CEE0603BA33279AE035DC03160631CAB97E0A7221B7F0A167F13792B09B0DCF33A3C406784693E6B9D0392CF55FA20F37FB3B00ACB8B6754DA69A1BA1FF2D384F5B39E5D0AEA0EDC122B1DCE25A04F0EB294DC3DF9B11681B171A104890A1D26BB44F02A7643497C08B0E4F24928F7455BE72D14A1261F3AB8C649F9C64BA1999A5EB1BE7538AB36FDA74BFC5937711640C3000BD2963A33F9C63115E8C8698950E2EE0D1DE202ECF7CE31B2CE63060ED1E41E68F8252A6228840E57B7D634072B744011AD27E3C6B9BA714CD6DA447F7DF1B6FE27EA1DD51B5B8B8CA7B2B4F91461C858F91357089280B5A18288257F95CC703CCBB5C09BEBF518355136F5E0E14302A9AE5F67726F9A062B3C3E7716B2D21004E3EB28FCFCA40785DB564CF1A376B033196310676529245CF9B417A21A16A7CEC4A2CFD01FFE0C6CDE2A371B41806866B85A0460E916B357FFBD54D4E623A020635A8391B67BCDDD561EFBDB583EE07C00912408FF88A0CE41875D41569D22D90F9A3792C0B1185074B01D78AFE68031D18FD566342E0EFA69343BB792807E2827EC0D0FAAECB7E20F168B8AE94F28A4B1130FDB6E1A17601824E53FC3CC201EF27FFECAC03F18D7708B642478EC1666B890741DC0EFF3A98FA04FDE18F1335934319A08B05546F2F5E3DB4F6D51900A46975B555051098736412A49098DA21FBA68A35A5921711699943BE2BC269D20F061A3B7BE5ED0B5551544171592102061F013CD91244207897EAA7E0E3E845B8986BCAD801DD45B7C85D27EBD57A075BFDA012EE85B06E87CEE8976E17E402 -smlen = 527 -sm = 2FE0DB2C3CC984EB3E63163501D083D2022FC57F933C14723D00E33F8A5FEA4C01B885CD1DE90044D627710C3124D460CEC502000C59C3A3EF1B5D1481648CEA01029E8BF8B22004CC5F3B126100ED9A4A61FC29F6FA2A2959C0014F394701FB9E82E5FFB79B6F0040EF2F71DEF2E36EB811482A01ABE1629F0C956BA4B531E57B0084B8F1DB3B4143185F1CBC7C00543AB3239CB29BB58CCCF36301FE546E0C25B8BFECCA0D618100E994DE25B50F1E9A1AE4F2C600787156A2D1413826962CE91700CD305879EE7E22FBA5B1DCF600019144BA9649BE8609E592E9DA1FCBF12C35C0AFEC0579243A5B140242C41D90A65ECD4A21E16FEE0186F85F5EF1F63ACD73A811466009A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 - -count = 8 -seed = 9B42F41492530EAC81992F17613EFDF155F407D7E67F18AE193EDCE714D65D1031E7AD10839AAB46D0850EAF5997AB4D -mlen = 297 -msg = 9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 -pk = 2B8305440715FCF923C30F6F18D37ACB2CC2503366F932586F969E1405ED383A484BC1CDAC048522C8563280205DEF027619C19D0A288D64AC99FDBE1F9E86EDA15EA2AD173635D1EF61EBEA208AFF32F6DD63158BDE47979DF4E4C3C1597001 -sk = 2B8305440715FCF923C30F6F18D37ACB2CC2503366F932586F969E1405ED383A484BC1CDAC048522C8563280205DEF027619C19D0A288D64AC99FDBE1F9E86EDA15EA2AD173635D1EF61EBEA208AFF32F6DD63158BDE47979DF4E4C3C159700102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006798F59D52E0B8107E0AFE7233D6AFDD93206E46EEB17137CD593A40C2DD4CCC39992841A7B82E94E0043F56811FC6C9854C041A73073D0474D3DA7824B32998660C1300000000000000B821BE7E9BFCC97B8042934419F20FE3B9E3E9D063D5611E4E0E2102C2EAEEAE83CA93B23EE91B0E48A21DBB3A7AA660DA81885BB7C7F5EC88ACCB355ED66F6E2B5F2400000000000000548DE0001978FF8EE3C157A7023B56B75DADAF055859A67A8B584B95F82AAA3898DD555B340769F7C839B40000000000000000000000000000000000000000000000000000000000000091FC2F203E6CA400C7CE89A0E528C6583615F5E72A575E0F43EF5E1DA79EF0209FE8DF7B7DFE9763847CE600000000000000000000000000000000000000000000000000000000000000397F00D74816BC72EAADC587F1007FC66A236930C10B84D00004C3B33AA8C564B98BAB92CA9B5EC0407C133BA22D7503424CD18C5A1F65964F91CD127D3F08F3A5EA48B0678BCF27E74DCC3A5469CC733E1B729F0F0F0B06EF31D786C167170006DE0DB6BB80D3269C24D00F7A775AA0542F88138904DDD560B518DFAEC9B2DD9526BED1EF29C82B5ED4E55AD870D603762F45BD1ED46C303D2636EA86AE017450427FD2BB1BFB553325E78C200FBFB91889AE2C58444D2508B439B13FE09100FF268AFB70DC0E2DEB34BFB8E8E9E7AC9159717A47AA8445650869EB7CF7D6B73415072F036D6DD68C7D480ED885CA034CAE7494AA9602D77E52D8B1A941E1EB4104E555724E566DE39A50285823733CE52AF7D45B497C128300F992C951C2039E90212FB1A9215F0A288DD1396A131CA0622730B1BA29FF47711FB153C1EC730CA90FC451D8E0FA9581BECA292EBC003EB4E01EE00744C3D874E7217F471DD7FD4B404018DA1586E8669EE46F82CBF5E6D55EA7B287E39EDB7459FE32063600E5A2A0EFFB613CCC621D654AB5BAE113EE049394594398EFF5797CFF2B8A61C26E796C1FCB75E8AA8B71ABCDBCC088019116FA4E0EAA6C3ABF3745E70CACA8A16CFD982645689F7CAF744651689681F76DE018C776BC458690AA04F9D9F2BF005C75C19A0D43527D2D0C15A189EA9AB759BC556FC64DB8433877F37F25252316F5215A9FA496C07552FC32E4CC8B8103C4127F0605DEF24EC3C54C9C04FEC3FE325C503993ACA805523707CB034CC070002E49B52A1E2E12B5CD87D8757BF1016142BD42823CCECCAA48CDC0671821E9BC69443EDC7A9CA99F08283B3707BE1694432A1174034A2144AC2268288C47003F930B2C6A1DCE7D51B9555784E4C78DDDE8DCAEAEB71550E45815A1B98CDFC50C5807651BB33196E69166E1521FDA01 -smlen = 560 -sm = A5619595B53234C411453D54006A55B3B4DF8BE9D83CE80F040160880B418B62B57FC26879DC01D4A7135A9811ADFF25FF50D500CDF83692B7ECEE464216616A009DFB30FC3AE230E6187761370064AE5B950C637376E5909AB501FF937A926AE50D06A6B5FB9B01BC4380E0A961B385E717F4F1002CD1613A491D8CF4E3D18F790173FFD97128A2E52F4EFCD6F901A4F70C9EA6F17DFAA535CC9D018252A6B8278E32EFECFD18D4016716FBEE67E21DA2931E94EF01073EFC6F6C4C3FDF2CCF4590002B80CCD02E75D3E6EF09985E0101A71ACBE800D520CD8EC039720370538C68C8956C7BE9DCF20E0302B0090B44CFFF7E6B772BEF55010601A62D8A31157397B6A0C3C9069366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 - -count = 9 -seed = 11134936880F5A11ED3504CF7B273E55A351FCCB10943BBBD186623EE6C7A13A6565C3080D1F536BFDB018F99C4E46CD -mlen = 330 -msg = 0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 -pk = 9D969E69442572212B591746566C094C298A3C53E8C89D8C1013C18A4CE4B1380B19FCF41197FE1C588A192C61A22A001D1F3889095DD08BC8B2CA69D7445942846C7BDCF5F37E246E4766C7E7171BFD2A0BA1FB8B2B642E1F6A72A777975800 -sk = 9D969E69442572212B591746566C094C298A3C53E8C89D8C1013C18A4CE4B1380B19FCF41197FE1C588A192C61A22A001D1F3889095DD08BC8B2CA69D7445942846C7BDCF5F37E246E4766C7E7171BFD2A0BA1FB8B2B642E1F6A72A77797580002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009EAF38E21AB4854724866EA370C9B87B87B0342C2599299F77690EFDD25800E19DB3721E0993080CCF2C868A0972B41E6C3A68FF1DB3A1B04AA14F35D2AB118A5EF31F00000000000000214CE65D2900082BAE3297F13CBEF6058DE882110E7362223B814F980EF6B086062C161FC27FC34BB320E04409F2374BD327D5F3CA2287C28562E56C0BA14882EE28DEFFFFFFFFFFFFFFF14EA289E6F1C436B9A2FC63D54AAC0989C720F553D2DD0DE37CFEABF4C3755F6460E5698BF32036E00A90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A9391E5CDC14B3F21BECB93114AFB26B122BE5A35F2330723AD09D44BCCBE6FFF834F659CA478D4C855A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDC7EC3B9FC6FED48EAA05AF0CA9498A546B83A1DB7ADAA6650A7D482FF06CD3BDE332BE730ECCAABF3AB174D96DAA037F05A0A9534BE1BBF367CDF3260D80ACCD4BC4245CEC09721D08E3776315684084D2AB4CC88A91681B0E36DA4FD02200D2EB982269B435936444BF813037AB4C33BD3C9DF2B6F84F6B30A40445F791D87012718C85EABFB11E8A2670B51ABF00798A70C645825F97BF0EF458FB8008F6E8CEBB2814DA8CE91CC567923DC697FB3CDDC59A4C62BDFB5EDBB8BFA407FF022E2C24F9A73B1E0AA8309A6BAB5FD8D7F2179EC048C9BA11E9901D70E97DB654AB35AA821675175FD37442DF78585F0249140E02174CD344A6052A10DA2405ECD3F4E305AACC4559B3616994C8926974A82D1612CD68E6D273CAA0F27376C0002B0B972818C040EC81BB4F71B413492BA42585690EEFE3D3E0BC4CDD1EB3E28E92C78E73BF040F57415C3C5C15C1680256F3262DF2204FC4D070672CE8C1F532A543642F111446D289BE597D768D0A68FA242E0D000396798FCC4E7259641F01D67256D4CD88AE1BFBDC3B77CC92176CB64AEA877D18E4AEE3ADBCFF8B7F9B1D5D23B0F2718D789A37FD52EEB1543A0371C9F9A61290A00A2ED5D8A2B513CA12881BB98608457D50C4BC4817253DCDB0F3B5FD0DF11F46DE81712B52435A5E02E7E3C6E6779EF3FCCC82571EB91CF0D12ACE08E9E27C9509373F85A2A2B8A2BA69F17285406592B22288DC1890263B02D16F7E49C91E0EA7E0F7F9FE1EE6CA4CF3275470325CA50FEB1A3F0C7883F6939D927531486002AEC1942D3A17CE43021152E747087E9F11BD8DB8DBEC7B993314224C73CEC8D987F24FA9195E53EAD31E60EA6E3FD37ECF82250E793FE644021B9D4D121844AC3FD76CCE1D813C4DD8210A08501A1C2245057D84AC0827A7339B2C3C383F04FAEFC06AE5B5C3A4C703 -smlen = 593 -sm = F888FEEA4392C1CEA73B8C6B0034C89ACAC73CB8C913B8BEF401B602A67ADA12E56C9248D96401637041C059B243613133E2D30178146D7E4514268B4549FDA201504AC4115770AEB5DA085198009EC3987E83C6109113D7C3E2003218BDDEA4FCF836F7CA084E000B7B6AC7F5F76919F73967E0005FD907329AF2B0D9B8A8674E0082716577ED3F86B0D8192A7201D55813B127FA80EEFC9CB7F701D40A331B65230CD0FC221AFE00CF29D1C4D74BE7BD3D2096BD001DC1C99AF6CC0CF4797D6DA30169E76FC933F56303860AACA500019790355096BD85ABE86630A119AE97B4334C9D89B17B07C3AB0D007C3288A9CEF0F050219D2DBC018A8CA067017A588A60FFAB48D60C0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 - -count = 10 -seed = 98DDA6B97E89A479D5EE214E660DD6B5D8F6CC638A1CD4F462A0EC545F5B0B0A1A403AADF566F7B1C0C5FFCA29B36FCB -mlen = 363 -msg = 4CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C -pk = 793B5BA0BC8D543BB3D7028833B0AF7D0ED0616BD6849C0DE8C5F7191898D7EB668C57C635B51BF9EF3CF98ED04ECA020AAC76AED929208B9DABD28AD54A1C50DAD29464AFC9B40926CB7BCAA8820AA30EC49B7A2D561A0F5613B017C120EB00 -sk = 793B5BA0BC8D543BB3D7028833B0AF7D0ED0616BD6849C0DE8C5F7191898D7EB668C57C635B51BF9EF3CF98ED04ECA020AAC76AED929208B9DABD28AD54A1C50DAD29464AFC9B40926CB7BCAA8820AA30EC49B7A2D561A0F5613B017C120EB000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A924780887BEB4D31113FBAF3FF9564BBC6618476D9E655D48F39F40D85F017DBABCEF5316597F9A5AB013B1485C637FE631E92D24A2132BF2C83460EAD9D20F709715000000000000003CEB8C794E18265D4FE8B93762895A92D2D70D785D375566FE43455EC24BCD80C8B73394BF6A3131F40B2C80BD40A6EAA6430951241B316C59271B6E798271DF1F90DDFFFFFFFFFFFFFF34639C01BC10FF81B4CF2D71C38E03AAFDBCE734BA7DE4F0AADD543CDF950D7B4BC1B9374B23C38963141600000000000000000000000000000000000000000000000000000000000000971F2061EEA47FA9E65131D34F63988E5A006D8BA7568E51C17E5FBB6FE089B2C1FA41A08C909778E4942FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1924B5C5B9F242A8DE89D383C9E244A07E28BE8291B64AF362B685CCB5AF925EE4C06FE189784CFF9FD4B3D5BCD2ED00F76A0A4112E60807AD8491F7AAFC52992C04A5AFFE463E09AF07130C161704BE97F597005A581D1D7008BAFCCB4FA002840570A442EAB4AC1725EEFE9CBA1DC95BDC0AD8143FFE027DE9A3FEBADED13CB6EC80894E43DAFCD654B4230A9F2300115EE3F284B97A7DD8706386ECEB68B7234C8DBB6D82EF0BB32FA748B8D2CBF2B858A51AA8982A2077B3C9FC594EC900CC19560B52B2AB9D5DD042280EE90B9898918D7496700984D0BF0EBCF510325FE552B3FD649D9B10D17EA4EEF99388025D557A2738703FF1F0D2A0A2736B0B4252809AC67CCBFE1928A9CA41ADD60A10CCC50DDAAFD1EC4CC8166A10B1BFCB0099C0EFE71D4FEB9D4C076B41C3413EFBDA7376921C4E38D3D25C1D82CA7631C00A157F584396ACF1768F639435FF1D01B0667BB297675FE7AD6993D1F95BEA111B3CD28405850743485C8E9A2714A26B11B46904DCECD518A6AFE7FED5801A008E926A1F3327CA5EF423099F15F68987D5B27DF15E162C812CB06A8D4A12A4C93F2F02DD009E8B95B5374AAB3898D5019B6F1690E28004DF8AFB3EE911E79E6CBD7F1E79001794D006ADE334C93C30D09965CB0C1F2ADE9578DF09E16468D6020B67BF2E648FF115D640290D46D9594146C67C2942E4F5DFF7CA911C6DE7581BEEA69CCFD43CF8B94CE3AC1B8F2B1E031E1ED8BBE6499487E1DD5EA8F5D2D3A5E513F95574EAC1BACE0BC59CBFF466BD5CDDC6DC3F1FD68953D405D3FC225C0152E1CF5BE6687E7B59123A91AFBA1567893745F960C6E6AA75DCFE4256A4D510DFB8E9FCDE030A03409D18B1A240EF01655C664F793AF086B7D79FB256DDA01D684F908D7E69EF45262526841C06EE9FDF715BA2B7E86EC96CF221B4CF750703 -smlen = 626 -sm = B14015330240C36212CE676C01374A01A4413AE73B631CA3AD0093FE9598864C727FCEB0E3DF00B4772D1D9964046975DCB97800778FE078822F60AE0032488201118D18A9732CCD11DDEFDC3D0054DE8F1F36EA25E21965112200099FA2D97A2B2B5CF7CB75850094F041853084EF431EBADF96011186AA36F9341146F2BD4B4E010582A5648692544332B6FEF300B085BB3D3D10560F14A5B47D00446E9B0112141F717E835649005CF38D984BF0F2C92C78DD060140AB6BAE1C93453CE333955001E9C0002F1B02268C4B875570000183408CDE44C1647DE2BE22FF05DB147DA806D4D5D1565A143A0C03CA6D668A05A4FCCC9D8A1F9801AA01764B4A82EB5BEC289A70B6084CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C - -count = 11 -seed = D34A0AAD27ECAD31A5E08E9A2D7901A9B85F864D9B1B46F40CDCA0B3615B2CBA04EF82AD7BD8CF627C3E861477030BE2 -mlen = 396 -msg = 5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 -pk = 6FACD3337F04F658AA05E91CF9F2809996363A5064A5C543F980F0E40B2D89D5660682AD44D74983B43391756BBBF100CF76F9CC3A5691F24FFBE443EE73D9EDB317CD0AFA0ED99EA0678C3506995E523EA5E23A7B0399901B20586A67EBA000 -sk = 6FACD3337F04F658AA05E91CF9F2809996363A5064A5C543F980F0E40B2D89D5660682AD44D74983B43391756BBBF100CF76F9CC3A5691F24FFBE443EE73D9EDB317CD0AFA0ED99EA0678C3506995E523EA5E23A7B0399901B20586A67EBA0000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730C8995A1B0A0A99E129FC8B82CDDDFECDE6C33B389DED4B1BAC853B58D9CD3B27BE1199FA0B0297CBDB2BFCCADA438B8ABD4642F5B62CC0CDB35B00A9C3868EB7019000000000000002AC5DEA65216A5A8F18AF6087B2FA3CF199926811DC2BC8DEE79AB0897F59BE0F28417685916143F2720F8373AC09B8DE321042586B74666D7022BF2DD1E43E47293F7FFFFFFFFFFFFFFFEB18C4A0587D53104765A2DC66EE54357715A8A57353FBC1918B8CC8C46E777CF6AD68F86BE289D369778010000000000000000000000000000000000000000000000000000000000003D70E60720C7A448D270955D117CDD1DFD9AEC0DFF90D99BFD72B445F11A5C378277AEDE1BAE9832EB65E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF624D2B8047A262CC0F7BCFA49784F385C63A5882341ECB2D8A680D511BEC97A82CAD972CCB806037F4DB37EA34424A02A635B6293316E9D1F932D69C245D4DE744AE435148BD51D2F19D5EF2FE76CCC4872FE4776B4A3247C870E7E824A00900565FAF85798A02FF87B0EFD16D913AAE8DCEC6C261896BC6919A851B8E4D856DF815B58DA3999B406ABEB1AB90955902C4BB2A7C76E73563DE18EE91428691FF705E388785A77A722777BCFE157035A7055194769A737444E84BE5B0651524028CDF160BB93DA47EA5FE4BF5383FB59858EF3C598B1DFC2705465A8D7862B1C2889EE5EAC9C785BDF35CE4BA95D4A1039C838935474D8CEBC901BA62F63348186CB5D8266BC36A0597EF35552FF41CB59142CAEEE2AE66B5C1FA556035CBC103AE9ED6680DA52555DDDAC74288D5FF5DE25F50467C0DA74863210F24722C005F8479CAA9D9CB71731AE1B46466AC4102DA13DCED6E5E6A15AB31202FB2573EBA69EA2E4FCDC9A0276F3CA8DDA89F088671A0E48771CD80DE30D961B1D77BD100DA3538D4EE89C88A0FAC4EC799B233AABDB26D1DAB5971914BA3FF893F9985F5D2797D5B284E3676D4CF804E8D052C019A8176724BABEACEEB8E6DD1F2B38BE8960F347F3A79C765D6A7E94DF73CB26263A4788CB6B2487B3B030954CB8EA70229D464BA6104A9707A9DB6E820D27AE73F2E2017D8ACFF63C8C67271A683D01C601126856CFDA13DD5334B196F21A800A789BA732B105DEA4133D2AD35EB4267CDABD3813DB2EAB7925A654B7A515EC232856C6A05A84BC110FBBB84EE52F5013B68E9EF17496AF3C5496F7FBD38403DB8A109CC635E78B6B870546A8B06A2EB15CAEADD318377C43EBABBCB8CC6CD005A2CFE711E4EBD930CCC710A0A3B9667090CFFFB68DDCAC30AA3F61629ED0E85EE7699A70BDAB516BDC8C8755EE2D703 -smlen = 659 -sm = 768CBBD7750DBE7FFE26754501CFC02B4B8E461FC65D01D6EA012BE45BC54EC36E5D0EBA83260048222EE4459349717BDE997A0131CE0A9E2B921BE212572C05010735DD1ADDD43395ECB379380041BD49BED9ABDAFE0C213E78006169E6C57418BBE1FC09E742018D2CDB8C997591EBFB83E43A00330CCF2E0C700CDC9B7642930088D74CA94A1AE32E21FDF0CB01D19880DD543E5540A9D163C400F4FE2E6A480BA9B19564E36A0193B0B0DE412457DB3E4351740178975EF929DDA118E91BD99600BB5D328AC1864EA02DAEAFA200019F2FDE185BFAF66253EF908E4268F75DD55F5CC245B2BE2D150001F7B42910E9BAEDFB80DF85F0008A92D95B93BA3C4EA57091E1A10D5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 - -count = 12 -seed = 4FDA9FB6929E3F391901D69FA0AA2F25A9657D249A620F1B9E305A5965676BA76794CAD3355EB632579C3958CA7D443D -mlen = 429 -msg = 49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D -pk = 2FBAEE10339D9B2FD8934806E7D0B22002765370F889C8E32B389361B0C8E1F59CBBEB99582BB8726727211E1F44CB00BD7C437E589DBF54F0F7CC10AEDDDE2DC29FC9BC91435162814D61A16D9D5B3061545A82FED69A5242458ED320880400 -sk = 2FBAEE10339D9B2FD8934806E7D0B22002765370F889C8E32B389361B0C8E1F59CBBEB99582BB8726727211E1F44CB00BD7C437E589DBF54F0F7CC10AEDDDE2DC29FC9BC91435162814D61A16D9D5B3061545A82FED69A5242458ED320880400020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075BB8FECF65210D70644E6F9C438FC39EF682ACBFD22E6E3891690BD6657030B1D0AED1A8A4E72EFA418845403E1C175CD66A4F4A21ED3B779C0360895D4E3EF8183000000000000000082243295526DFCE24EEE93595750501A7992685F4C59BB59B26E1B9E69B392DC542DCA899E9139DD421BD163B215F7ED6738B21E8AF92B662C84E35DE0B691D8C5BDC8FFFFFFFFFFFFFF220842421575E4F2B59DC5912C22F9F322E234D385228E42A1E08D0649661ADC6AB252245E8CE7F4701F83FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB4897AA7945BD204AC7CB8F7D73973918D958F3F9DACBE7792702FB0429256AF068F560852F04383A882C00000000000000000000000000000000000000000000000000000000000000B5E0A98A052459DF5290BFA117E9B1208AC9DC2F3827D826E600D226BEFE5AE4ED3F641626229F21569A820D81C03F035FA68280A3D5346BC7994066F12ECFB82B36751C20167E91C476DE35271527E094159299B28A5E1252BFF8DB12682101BF4A654810AD053B03D475D73E155127529E9D54875C0A0C3FAEDBDEFB9BF7B27F053808BB4D4243692434F0E36DAF0056430F75FC88FD2FF9CD9C0CD5E528E5B3360CFF75DDFBEAC18F2D022BAF193A6DAEA94D92937349BD6632F62CE1D7031A884CD67FD3180E506E4B7B87ACC072EE96F9516D311560D1C4C72223CADC0AB558DD80E7CD53A7A0A482056E067B011A646A8927865FF0BF3D333E3EFBDAD73EFBBFDBC0811280E321AB816933002DA57DC82E94A3AEF90007B12C71614601910865AF2273992496841C98693938D78D19866E57F5F060691B26CD17269EFE0294AF20A9E66211F81E04805A7D9603AA19406C76627C9398B18ED534BCA9E2E9A88BCEB6FFF245A30079C80C4998691A4FDE8095F586E1C0473BC654DC13010427F3B8654936570BB89A6228B969E30549AEB8E916BED172A4E0F53FF1E28969E7EADCAC7354A025BB2B12F475B8015663D5622CE18A16AAAC419E584CB1D7B714311C02C390E02B0803360DD2CC5B79D95BABCE8F185AC1BEC694650ABC039B4653B628E6BD147D9AC2E1FEF3498506AB9FBCA744DF87E3F3A41B7437AFA4B954B43F0C0DB581A522CA8BCDFE8B03BBCD8C383E1CA87D8C268DEBF9E5F6D1959729E1A1FAD18A284CD606E8A1ADB6B129A14D68CB04782D1DBC3A8A97E902CEC81C4EF4526DB0D31C13B56256C3C5B4B9F18F8EC0485B2F8F6A1BA33DD01BA29C97DCA02934382125A3A971AEEE01C7EAA5DE55738FFD643FAA07E23A8C9A35359C9A75040073D2A3B118BCEBC54AF14C0399F469D888A730601E822BC903 -smlen = 692 -sm = ACB167C19814EC822FB0D5AA01D29CC593F00E2025DAEEFD260130F22EC91535CF7CCEF529B600F973385F14BDA88CE815B93A012ADB21BA41C03FAB8ABD6DEE01CDD9061ED64C91CC9C46A432004C4155FDDAAD572F2CB9931B01520E327CAF3E33EE744460000145D52B543936348D5F0DCE8B006918DC8C0DA682C43A339ED000421AC21C11DA2271883386AF01D66D7017538F1625E0B5668A013DCC0EAF31DFD88EED7EBBFE01978823CFF1226A52B50171D3019A9CA6B83A33FFF1D0336BE001796A2B7DEFC5247E21E4792F010153ACFE2CB4D6DA78D52512F245D1F4507A27A6DE2F6C657AA90C026421D3F461E4AF0D52003E6800C48F65077A0CFE9C74DDEA7B8C0A49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D - -count = 13 -seed = B0E6A23FAB10A7A333E3720BE00D31507917F39C5EFE1C98CA18BEB5C3101FB4479B478A1558C4C00398C55C9822FC44 -mlen = 462 -msg = 439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 -pk = 1625D3A657B6DD38CBAD17D7B3C061F8964BE10A0928CA62E708FB1E5870D06D7890B31E0A75E6E16DAE9A68575F870141C2ED5D121AA5C0046D5E020F8BCA847ED3C698392B1FB2A22A5A8FFC1F2CF5C2EF7D144EE512A9CF05A22F3E939F03 -sk = 1625D3A657B6DD38CBAD17D7B3C061F8964BE10A0928CA62E708FB1E5870D06D7890B31E0A75E6E16DAE9A68575F870141C2ED5D121AA5C0046D5E020F8BCA847ED3C698392B1FB2A22A5A8FFC1F2CF5C2EF7D144EE512A9CF05A22F3E939F030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B9CDC445B6FBFD3E431CBF0AB094A910DE805DD58FD8AAE8E88F2616053BE94BB3A46E891E85B716F30A7777975654A90EC0ED56BEA8B78E03412180A281699864EBE6FFFFFFFFFFFFFFB29C56E0F52B32A0C778FFDB3DB6948DAC4CFBD23F7F436D07E811BBAA16D9204A6BAC699E2D0458B5E06AF58CE521C989CF43980C7DDE26579975CA4DD53BCB4B5CE4FFFFFFFFFFFFFFC6CA1A92B8B1DDD6E017E07CD8EAE5D157887572E4F5EC56A96F92FF5801A17B6FBF508C49ACDD28C4D32DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D27AF0A7A016CF548B5E8B739AEF830FDBD64B616EB2B95CC023F2A8784061DCD3FB2B00DCD033D3F89D00000000000000000000000000000000000000000000000000000000000000C6AF9310F5C8B6666E743D99F5D48549113B9A874DC3446D826B5B367C8A806F3BC39328056B28468AF00C026DD7E4009078FCAC1B828518E1D5B8AEC3501F6A98EBB6BFA96B7DA127FFFAF62171A587F5826B55204A849366E4BE9A6C288200907B232117B98F2E17005FD52678F65CA28B4566324D56D14B7C605E8797433AC936C749F287F2461504225F798EDA004A4376353E2466C10D43B0D599EF3A6F2D870BC8531F103A18CDA06C68639CBB7383228B94A085D404E8E78415D53D03BB6CE2FF03E8E24AC13BDF8A950958C58DA1CF4256E4953D5EDD14AE9911BA9E6744C62D8F6D18FBE8F9C1B2962370029B259400C417BEA4BDCF16DD35E4E3E055206F921910FDF384768AF0352706D50BB4F84BE2BDC2521616578487F6940205BCAF7F4A709DD2ED7D1D5EA531FEFFB47E28BB38BA6B45C7CA358A41F7D34ECAF8728167F42F4B8D9817A31C718102078D7B2714C69161491FFB37E5BBCA762BCB3415469E4D1F0E5E2AF8905A4C981EB645222E80E581D8F9E54753BA3A03B0FF8135A10952AA3F3F01CB83B4CCADE1ACD7C10EF7379138A353383EFC4C1D1185BFEBF9FE15AD812150BA6A7B330387D2515BC2F80E04E50F60B87FD09D9D49CB4E8DA9692BA98CF4D356DAC543C44B9DBCC8814E47C000E744DEAFCD43022183EAFF3B17F78D42C2C0DC03C5828A4D946D29D7DF1A90E40DF97E172BEC75B78E2A5A3C28BBDB8654A3C20B54F002792CED296F06916F6546B93C50CAB2019DE18E50F84FFF405093A535C41A9EA60F86569031B49C6B2B441C6021AE1800A681DC5DB41A7D25E6C35DCDD383996313E48DA442873E990BA6D1F198F7F401E2E835FBDF640E2E0207703A13847902A980593FE43987C402B62096342389858151B0858D739B72954E5969D04C3930C242D3CEB6A21E4F6997103B4483DA03 -smlen = 725 -sm = 8240C7AC2D952BA0D22EB5D4010D3006A15FE61A63CBF0EAD5003A6BD485A2E696B882B10EAF01EC3022E82BA4C67E322F2696006313F8D2B553F3AA734F7F5600CE84F55DA3A5A1407B2996BA00BBD392801E524B8989D4F1250101B595239D798A5D4CC224920176747402BFA218830B7C5F4900B80D95C6A9D5A0DBCDDC987A017CBA77BB69E7B6B73875DBFA01AF0E301E9280C250D4D3C0AE00698BA23A8BCA721FBE39576200AF0CAA46E6448A0C2DD7BEA301C665E0E8FFD55E9BEE756E0700A41ABA2DF9A42C46DB8086DD000113281F0DCE4DED2362C9CB5AAC091E04EB3F9D59AB41C553A11902E09E63174FCCBE1C95D4D9E700A039499E00DD6F63670F88D19B00439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 - -count = 14 -seed = 0A98A2BD2B9FF42CFC18D3396BAD052E1D0F3372854DA69A318B142F7A1AAC609C3861263BD8FB0549DA7266784DB8B4 -mlen = 495 -msg = 8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A -pk = F68E28E922444EC662819A1B5E1687DB88A895B147A15A14FB30A2F477EC7D8DC74AA8CAA10839994EFA20CB079DAB015CC975E42A2EC94A367DD167FFDC122347CCE54619645B3F16CACB6C9D14483484BC72F8407EFFD0DCF51109CAA3C203 -sk = F68E28E922444EC662819A1B5E1687DB88A895B147A15A14FB30A2F477EC7D8DC74AA8CAA10839994EFA20CB079DAB015CC975E42A2EC94A367DD167FFDC122347CCE54619645B3F16CACB6C9D14483484BC72F8407EFFD0DCF51109CAA3C203020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090BC2BF29A2AC160DEDEE9D8DC9998A7674946827699189EDDDB8B9C86537229D5225FCF38862FC6383D3FD1AC6A23D2BDF3620F388D6E5C01536D9E4ACAB1CC39281300000000000000EDBFFC833F3E9734876818710AB9A03208EDF91BF66FE11E9BC3F2BE47DCC82C2E9DF55A37DBC4A61054F332B50A4F47189B8AE7EC99A246E9C387474C1FE1AFF34FEFFFFFFFFFFFFFFFDBFB1AADBB5B9FB7AA5A2B44382C6E2074FFC08D3C0062C0E4D5D4C2D852501783CA308195C6D8D1B290D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC9B0577ACB94005F279F718262F7CF40E83A80E06EC9145C70993879AD49BD7F57BB59D4D0D6C4A248E7201000000000000000000000000000000000000000000000000000000000000541393992930289430D2EE0209064EC40F81B725EF813EE3FED9E646066CFF3D2B79430EF5FBFA1EEA48A462FBA6A400AFA4911713611B79A42FA31569B4441A177EDB0FB76736926D1D0AA34FCAF8815729DE1B2C68B76A1503F23227F8520339EE81DDE2D400F12E9347EA1DDF0EF0BB2CBC46679AEAD7CB5DEE440C39A60F0CE7FA6E87A48D4E3694B9FA4D873B032047D44625DEF845C67F86DE37B4F1CAA18B23AFF21D6E03235A905B71455CC5C70673846AB60EDD123C7144B74A53004A951F2258F1265FE05AF735A72110F7DF9BD47A8DC97624B0E6B0681A2FC0E7D43B744F5D9A7BAC811838C4D3EEA102F75F184B8212211C30E6CA3EEA5ECEABD3463D85FB9D530972D870D4012FEA8D294279EA9B39ABB8CB5B75E5C8F5D20192CD9470F039DD2FFFDE3ED041242E689F0265FB11AF2BCF6AACAEAFF1A423695C5944EF6396D67A05105915DDBEFC007D53EE7E2359A7023E1D72445F5B6136E911BB423A2FB661386B715A515BBE1C89AC0831393A71A255891DE8C03A21004EA9F769D1ECB9BD24E2DB77B26F59953F9638BBB55F5577FF7714F6EFF16FE2FE04572E4EECCB659FAC663CEE2B83036EB7BF8C59AAA609EAF51EB3E2082432C3BAD3C2B7323D0C530D75F75F276703F322B9DA171C17C157672C3F07741B003F9088A9D06346C303C82B4C755593DEE6753118608066C0FF620B48FD16F10A1CB05395CCF6DF35A34C8FBAA0E63F01F787DAEF31D2C5946DCE0CB117654212FFA446FD0E6CF1B93119E73DC9BEE58B13DA4E6ABF3D0A92A0DE718DD2032502556F89319D73CD86D39238DF5CA85929A5D17782D35DB3F9DC68305A62504BD494D6658261319AA722550D23E26C3700CCFDC50001331DC031D3B5CCB25B4C741DC13CF9F56B814203E88EE1B3B02E09F714FD3DCFA28DD29E9743819B543502 -smlen = 758 -sm = BC246918E0E15EFCE7704345016090378E22160C7C9ECFD778002C135BA9F5EB43588169E7CF00777092929A12655F0EF9884B01647F037034A856AE91AC92D2002182AF64F315B16FF1DC1970019D614A8B1316CAB47DAF8F7400707EF2F030F7F065B92E8D69014706334B2B49DBD16FC06E5E014DFEB25595EBA760E9D7235501CE23488D0B793682316EF4270156D171749B745C9CF14AA8D6018984818C49C230ADEA9B866500C5A813867F6E53CC43A8779501E749A8CC0D0FBC6D4D243A720102B4E7178BA39AD848D8089600013BDD79DF0B36FAD6C3CDFA398207F85B1D8ACA8F7F5FFF208E010238FB6D42EA599A8FB308B5E0019CC33ECCB270AE5BF711BD4754058CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A - -count = 15 -seed = 9887F1FD854241A301EE0120645CD8E119B43F7BEE11F77A835E9ADF518C3A51CB76D86653FBE73AA716264C146797EE -mlen = 528 -msg = 9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 -pk = 29C975FD609AA3D25732895EC1D7CBF8A410A65E04E89AAE67F0CBE4D101383FDA23CDB8FFC453AE9CC96160EA547B006D4BE1A3A659621B2A1238EE819EB1C2B42B37467A25BD47A2A0F0C5F8ABC1B6B7FE89BCF6470F360CD179F6B15D0103 -sk = 29C975FD609AA3D25732895EC1D7CBF8A410A65E04E89AAE67F0CBE4D101383FDA23CDB8FFC453AE9CC96160EA547B006D4BE1A3A659621B2A1238EE819EB1C2B42B37467A25BD47A2A0F0C5F8ABC1B6B7FE89BCF6470F360CD179F6B15D0103020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099DE3F4AD937911F14B0ACF87864EB8E1CA0A2BE4C80A4B2D76EFBD974CD67E4CE3EC9A3BA978F48FB901013369F77B7720CBE1A2C4820A7A79165E83CAE4A3729A522000000000000007AAF8C4BC202952F9794246CECDD318B2406492C147D9D8D0539FFC0628D067F6D77D9E5C8A0CF66436BC38903016D7B6F1DB8F88C3E013D7CED34B00E550E9FAA8AFFFFFFFFFFFFFFFFD2CF8086C1A8A100871F02D6381AD6306714584879A24938691F8E55F6CD61431A3DA11B01B394FF973CD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89E69288FD5D966F96EB076374CC1E5CA779B5B1DB4A129561B7FDBBCE611ACA1E520E7BDA0E57F1F3CC3E0100000000000000000000000000000000000000000000000000000000000005430E96C53952411B4E165DBCF8951D65BA2B3220AD3A1AE73FDB9A3D69A1AC60AE3A1F295FE73926000DBA0BA9A603C9BF5E4650CBF59F39E1A0E9D5270FA61780E91831CE299C1B3AEA2FEF01091894FCD65F2084C3B9E23725119D32A9005FCECF6D864D52E444B7BCCE7A9196A299455B4A0A2FFA8CEFB97FE0CA1C0DC46F2F7E5BB6C8B595FF9583707D748102CBCA77775B6DCE530C39CA8477D77312518F8C0FF947A170F581D14E52F0E1DB8AAF03FFA33CAE8011BDBBB9525EDE014517AFE709723F4432D49007C1A7DCC5905B300B6D975194F3940538421F6DE28D17667CC7CE8805248EEE17138D9F03EB00725646E668A0074B0BAB6B43F0434AADCE4E3B7DD37518A430132802455A5650F5D9BBACBF1B64EA7635A7588F02D491C3B41C7FABA7D2620C9FA1798AA6F2A4B32D4B974E314EF78D718038A08391B7627C59268975218921546236C700C959E349C26A41D5C5A40B6D0EA9E1FFB4B6E1EEEA84F6F064419AFC3AA779267510AFF6FB51CB0C99A096C78136FB01467F4AD2CF7ED730795DA43CF759753DD2D2E292D9D75163EAB369BC2985F033F2849887AAE2893562ACE8B023C6CA0295ED0D76545F3EDCB3311848C30C3963C3C93B4BE4455460C571C5491AAC6AB89016E463C6E0AC83AFB74EB3BEFFD300AC45A5C6042A39A04ECF53F50B3DA1E5A9E5C86858F9F80D0BF59B6B7CB9F4E5B541011830ADD58E6479724C18C8AA0337C54060446A37EF9CFEB4C09FAB3AB1E55C81C83511719C33CB048CB0CD76B9D579176990D69A42A35D5CAD03514D02E917BF23932DA6E3A6C3E9CFDD7FC70D410EE2ADBA3E251555B8F6680688E8581A83EF2C674CEE43B1F80001676D5B00950B30ED96392291A7FDD3EB5D51BC9348D70359BAA6A5597D58E1AB7BF82737AAE521CCA3063E1D5147E13EC9ED9203 -smlen = 791 -sm = 75E1CE64122E3C590665440001E3EAA6B5B037E7C354A8D3F4005F91CDEB32440AD2F1414D79019A84CCFD5125EE2204EA4C4B01D36B40B54F36329A1AEDFC8800932ADBAF79BABB1DAD35E20B01C867E5E957F7F22E88F386E90046DD69B2C039EBCCF3127C3E00D28F38A60DA07CE5485C80CA00D0FCA2505BD259E5BDC3E8D1014DB70C4B53473E3676A478D80141580B6EED45554BBFC1A94001548DD810FD86AE5B987C987701055A92270E1B06CD9AD369EF012351A1F609CE94CE413B017101010236CE94C05BDAC44B548F0101533A7AB6791DE345895A5E88E5AD40BC4AF92A4E7049632C4E13035FAF328773FD25AA62DB89A30125A61C69C8C01E86F5F5FB9A810C9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 - -count = 16 -seed = 5B485527C3B9A5E5B7579950049CD357975D4BCFEF83FE33C087ACBFCC10A0BE4225E7F8A5F77203B5FC7C0B5FC0E78B -mlen = 561 -msg = 922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 -pk = 7B6CBB5AB868F7E3624C758FB6DCA6BE32EEB377DC60751A960EDB965E6839F7D88F9CA606A697427CAAE7CDF3D9BF00F4F7B2299C5E51609D69F539A6CAAD1F65CC37C8C8A87C49EF109AEA2C1749EDD4A026971A071376509978148CCA1602 -sk = 7B6CBB5AB868F7E3624C758FB6DCA6BE32EEB377DC60751A960EDB965E6839F7D88F9CA606A697427CAAE7CDF3D9BF00F4F7B2299C5E51609D69F539A6CAAD1F65CC37C8C8A87C49EF109AEA2C1749EDD4A026971A071376509978148CCA16020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A3659FBE03AF88E2115636FF9E19FA94F863666EFCB51CEED51771BE39F0FD35834F698BC5513792BBBAF41EE164BA462DC39A79C8A77D3FB63DB7613111BF88AE2332000000000000001A914EB3E8854387A1BF0610E336DC8B3AD797E0205F29CE2741D93996DA2292FAEBA8699BD0CE51D2DD7AF9D6F3F0CFC63187653F01455503AD4F7C09143003434CF7FFFFFFFFFFFFFFEA2AAA7CC2891048890C702F60B5B0E6D705B8EBE3EC35077F79FE9AD9FDB0064E1696D89475FDED2C68AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D889838B523D8F6C90D3ED679DB956E9C47BAD49ADE2CDC1F06F70E5BD2D1DEE015E92CEDDF9A9455CC8A00000000000000000000000000000000000000000000000000000000000000300AFDDBDC39A47B7CBACC0B5653D04CAC88159CCE9C0703458C025C907FE6299963B170069CDC40EE2EEA19248E3C0071E4121472A1228F0AF6B42D552C3AAA443BAE1AC785AEBBB9C1B71AC7685B50DD7786E55AD85D3DCE1E322381566503D85D82D5FB3DD3F24BDB42A9676F1E5C4074C1DBAEA1368A518B7A8F6D3EF702392E710DC60B72B3C63655B653D87602ABC6A5464A198239317B9E35602EE11DF89059AFD6314965DB971C822DB64F1D75DFFD9C389A5CD00735320A039B4303E949BBB9AD99AE391B16C79261F8ACD62CCE0EB50B76AD997B8C7D33B02B261F3418286E5F54F7F7C4EDB50A3C5324038FF6E4002991767DF016EF3A71A7A73816F7D01D9F53FB8021568FC68C9388F9DE3D540154FC62249777E1D64AC9A70276FFA8F0C810C89D84058330C12BE01D099BF3EDC9093B41E2113A0F1AC76659EA2E3BD826D3520BD8B552A95FB81100B167AAD3BDE60ED914FD547F6258B317645F4C3AFAFC47036A787EE7BDE5F7252E74AC47E5404F80887EAE9DF769580234E2EC7C4BF0F9C838421ACFA5D8D3156FA623E806F758C3D8BF17AB3063C55781B510A22C4DD2A2D72DDF884C658700E4DB5C8B48F578A53492C561085157F7775FF0A0AB474DFDD456CFEB1D75E4754E82A279A5480E9012B020D8CE0A8E02C2E999AFEE33A669BA46535A7447D3E5A8C3D2363578615B3D7843E5314EE38D9B7CE7DB69B4618F6411D56E8102750348C8970AD32CB1FC94C4233790F0854E7265E8216FFF39C7D4925957D9D00D2D3E7A3C16CD54E6079E5771BF28A046034E1760225794C47A0B422CBD02A2A405F0B695FB3F1250A6CE13D38B0F82B891AB64FF912EAB3DF899B34196228A20037C40CAF6C0D01CD05794B82BD22F952D798B1003A0C37B675B3BAC7A688F1828290F7521582845A27591E89C206E1300 -smlen = 824 -sm = C3E23989E8D4B9E974E2787501D20D54B95C5DB410F13A6A380098E00540D1E28F88886FF21200EA2855035E2420F22334CF78003B1302870392A46969C7606F008202DBE5C26E75ADD64C33A4011467A25236E1AB2D07B8EB63014CC8D8104083369722A53FF801CFBC37F910E8AA0BC884BADC005BFE9E58205E2C2941A930CB0076A70E5B9C7438517A656CF600CA234B42BF452F3A5BC1D9D201A289B1D5802745F27119E0B200FE2F7AB746F44F3046B71AE40185C5F290174B07B6BB9EBEBC00B1E9B66E37F90B1202D73F340101A550CAA40FC832567F773BE321465E8FFC34AC1B49B819E0420E03E25487CBACCC9C392D553CFA01C04094B60A9B70ED06FE890A380D922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 - -count = 17 -seed = 327CE565CFF6CD9A25EDD84F482FA0758B78CBC246567DAE98B818314AE28CD438E339043EB3FF16E1C2B4B104A717B8 -mlen = 594 -msg = 576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC -pk = 9B2F28DDF24B629FC6BEB208E36122D3B6581D35716125BAA41A8A4B48080AE37326940248B6EEF5001410EEBEAF18031109BBC1DFB214D443D368AF4BAD55D2AA96354A36C3BAB7A9B13E242E2EAF00EB65CA2E6BBF28082E3E062394176600 -sk = 9B2F28DDF24B629FC6BEB208E36122D3B6581D35716125BAA41A8A4B48080AE37326940248B6EEF5001410EEBEAF18031109BBC1DFB214D443D368AF4BAD55D2AA96354A36C3BAB7A9B13E242E2EAF00EB65CA2E6BBF28082E3E0623941766000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000395756E33E3E07B0FCD10DFBD74DC8EDCA88A110FF83B355F2A51756AF2F4376FFF3749201424E424CCD927406E66F35D31EEC2E4AE48D6ABF6D32DF3EB8A9D614860B000000000000007EE829437673F96059C40131605BBF8310D9ABE72A434BFC7C74DEFE7B21B361DA7156F46F765D669146DBC4F9D767F6E4111F1EE9267C4C8F462229BF86FA2ED976D8FFFFFFFFFFFFFFE219B0F78CA9C3147F3892E39AD4AA514AE0D98B664CD10C6DF4AFD071D03598999B63A23087DF7C3661990000000000000000000000000000000000000000000000000000000000000079B2851D2CCF7506CD68941FF25B1C3D048C7514C8B823C5C699A3D3047550605FDBD6028FE9BF702ACB010100000000000000000000000000000000000000000000000000000000000050C49BA0135B88F5226FF1DAC5E1C1BD6FC3CD07F4BB5575642587AE9468B2DC87A9820CC0AC6EFD53A851BD9A23E101F0DA8D4304B34A89589D839E57BE1CCBA677DCD7115B6460EA42B7DCBD289EDEDD7582E356AAEA44D1AD54E63722920080D2B33980B21D60ECB0B7EB3E41C372FC62736875D27F215B376C10B8A8F01EE00ADB8AD35ED0BABEBD377E38FBFC01D13DDCF0AA2CABE67A0AFD263B9BDE6A9DB684FD333BF2674E7BE420C870AF3424D4C296F11B6C7C9E9BEDA6A10451023BDFDA3CE4132D988437A04B3DC4A92BC8DACD6CD66A8ABBD3A7DB6A22FC734C4F283E134C13B183D5BD454BEAF1B60270B973E69FF2CDC61EB07360120FD339AEC5A2989A0B4D8188F3B1B1C51AACBF789FB373ABC322AE73591514EFA651032CC0381557DCCFEC6CF58650F3FC645C02204A59BC36A0FFADE34D8AC472F159EFF8534E5520AFDC25221276830518019B30AD5F9B0F7D10365BD04A8B094AFB089B92EE448DCD45229AE21EE85A0C7CD450BC170FB8A03241542B0D31CED703598256FD29135E7AD4497EC7497D6046CD7A2A57C01026F6F88819D1568382044E66E2B03C350A4F15ACF03138892301EB5B38D87E9BC4F81E1468C6A89D5139629373826734656B31B401EC13F6F002E69AD47AFB2D5C4A9AB28FB08428EC01350FD4E22C861CA090F2949D9E585727D2AC328D7682FE89992833E4B534887064ECA065E56D08E4A9EF24602D37D202582FF16A4379FFD66433541DCA09676723B31C1A7453EA2108BC7F488FF0F945EA2CE8D9F04A302573F8C839C03C25009B84B3B594ADDCB761ABA88D16E9737735247827612257925601E3C135548064385813C79DC7BF9CC8712862CBB695033E3C72F45F0E9574C48CBC104E73653AB4E9E122911E208451FFC84B3858CE51C8D330FAFC6B26DA0741C749DA680803 -smlen = 857 -sm = DFC59FD03716C32577D59BE60085D59BF7B3092D7029EB2FCD01173A3A05F843EEDBC049FA45003569A78F675C5F6C86E9564D00C582043DD8F29E3193BE882D00CCD1C0008D284A269C4B3F65007483E4D18ACA1B33BF895BA8017CC651588241FB335BE50F3400103292376EF930D0AB2F58D3000AF881EF156F935791B35AC000D70DF42594A90BD4F12E611201FE54C7BDDCD06748ECC0C45600F61B28936C375F06B918A86B00E404759A7B62704DBA5EDA8500DA47216A3DA55FD0D4B28F38009142457DA84DA5FECB98638E00012760003042ED991E53DE310493D3458FE0EDDE6043011A35841300E27125B7E1C6988098D7613301FB101DB39E36289C676411B75908576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC - -count = 18 -seed = 790FC03F956D1301A735504075B67A05944A762E0A4BDA77BB8C036C5CF911E2B561EC1CA6AA355D5CEC919AED42A1D2 -mlen = 627 -msg = 021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 -pk = 17DBBC260C7A797E46664337301D2DC067BFF2C35C024F29BC96FB80A5F13F97242DC66B591B0749A2905BDD3CAA37013EB6FA4FD8ED0250891DB52964BE46ECA786FB85D82C9538DDFE9148225D68800A6614480B0D5446B7A770C3841C0703 -sk = 17DBBC260C7A797E46664337301D2DC067BFF2C35C024F29BC96FB80A5F13F97242DC66B591B0749A2905BDD3CAA37013EB6FA4FD8ED0250891DB52964BE46ECA786FB85D82C9538DDFE9148225D68800A6614480B0D5446B7A770C3841C070302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009F6F6799295B7409ED32914DBD6D4CDC921FE85EB3B21E81AA1A68F4AF9A46D0BD8DC4AD43C1D2E903FA787FB95A74EC78B4F7D28DF8E55A647F63557A632AB8F0BFFFFFFFFFFFFFFFFF1E9B2636075FE121C5D8CDE2E8E5E414224ACF28B095BE749CB78323FF82F6CF266DFC907706020F906943923B356C38314DEFB0B5745DCFE0C7F8A1D2DE638ECCBDE6FFFFFFFFFFFFFF5A3AADDC99BF5B94AC7A0CB5B26163D6BE13BD8FCA7BE50CF903365FA742C723971955600DB1DFC6E3E6C1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1F504C789BD8C39CF8889B2DE035FD37D66DEF40661A0022128319071BF2488CF3C17A1C0C522C5C9AB520100000000000000000000000000000000000000000000000000000000000065345CA9EC46ADBA1318605B601917F3963448CFBAF2DF349458A66B7C66D3BA8FCFDE1D040A0B13FC6C7BA848CB0B01F11E95A5432F59467C3928D7DE9ED841E05238BB5F29515B1AB5B7A1596A1DE45392EA38375EDA156E1709A67ADB99013BB26B2162BEA63486689B66CD214A57AFAA27DF18AAB5D45EBB916D0F58D0671807752B3A24C6335CFB60019216AE01D89EB347B271A6076E34F11627BE25A6DBB491B825B905DFB3FD4088F41CF18CEC33864C949C67EC32FDC443697C2A006E06B43CF8C5230EE2522F0AF13BD54BE10CA224FB9330DFCE761EF3DCEF899A8072506AE9073BE642F11573B5BA2203B1B60E4D53D2196F77650A1F88181292122B6A01B0361686950608A7595D9CF1F4206B66A2281D1D83CF39D5FA28EB01CAFB4FEFA6462A6B8CD164FE2D04A478DB795F0736A6F14BBA696DF6D53AEB9A538D26623248D68AE217BF3F797F2700B3EAD099BE1083594083F6CFA7CC71DC17B2F90DE741366609E6556BE59C3F8F23A47DE9B925090046D249008B057B01D415346C6D8A8D552216DC335EA4C94C18CF482A4197DA78C16EE7D1F84D4319832FC7F6C8D0D6C8645A8BC825A5CD023D13FE945DCAAD9267FDB74C2E4C0DE0006E4CF0A89A7C619C808DFC97C2569E6463357D068B0480611DFBDBB1DAFF01D5FF0374FD475FE60F35531F64597295403BF3BEB02DF7380FA15C285CCBB4D32C07A09141B9455499C4F3647A9F89009F5A5357111B5830C0686B32B24BBD8366037EDA6E48DD5BAEB3110EDF274D7DD927F84AAB5BE56F0ED34CAC66D71500AE3071EAC9C8F5117E67896725A20279571ED6B91C87CCC1577A649E51429C9F8DFF673F7BCDEA06778A9B66347759025929FBA349FB8145AC3898C7939F06120A845EBF7FA3C4EE4EC05728A03C08041D750994E9C325C9572645D579A03D02 -smlen = 890 -sm = C621A055785106E211F06D1300835CF5384885B866267262F70034ACB6F3157FFA4781752A0001A2DB07B7624BB0501D339294012B158B89E0CE535E69A7C4D2006E192A6F73D85D2B0D81845B00345A56E0EBA8B93DC974FA8601117E73674E43E7ED1E1FB8D200E5404D2427E5F0F3470D82F3008308B641180A7D5F41CF231D0097CDD76CCFE0AEE64374A8F80196FA831793C90F49770488FA0199E74E7F1299B5334312678D00C0C54B2F9023E35981FC2C3101FBED526981367AC947ECCACC00A8521075765BB19607185194010099F663AB6B5F0BAC826059158BBEBAE094E090FA6815D1ADA11A035E0BEFFFD525800201EB7279011F2E69E39FE0143B11439E636F07021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 - -count = 19 -seed = 716354F7DEAE272CD26929C0932CA257AED1DD23D67260726B5213D82E61466FA99BB6A7D81DEE9D0EBE03DEEE4DBFC7 -mlen = 660 -msg = 7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D -pk = 41EE2696CA7E20546B312E67EB5F8D3B05FEB5B1C20C500319E71DB7007296CA4E49C4D2449B7ACFF625D38FA8447603C69EF2C5176CDA89D6CCBA01DECCEC0B06A85E5DEA5B4814CEF75469C43C72CBBAA55F9149118233762493D6F64C6302 -sk = 41EE2696CA7E20546B312E67EB5F8D3B05FEB5B1C20C500319E71DB7007296CA4E49C4D2449B7ACFF625D38FA8447603C69EF2C5176CDA89D6CCBA01DECCEC0B06A85E5DEA5B4814CEF75469C43C72CBBAA55F9149118233762493D6F64C630202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001CF5027541AEEDCD20AD293C45D45EA7A232023758A0BBED0609B670B5B66EA418B7B4E1A17975A42676D0F994642924A8B4C98F7F897839A9882F7AEAD99E7B3F641400000000000000E5507A51854FBC046AB6D8573297F615FE70BF12505F7C3D395E7656874038B64CDB79CF3BDB6334F96BCE4E15CC37501FC8D132F74017CD12EFBF1BED4E9A634AE90C00000000000000A5FAED0AAFADECBA21AD36C7B433843BB0BF3BA7FED314EC5BE0DB9474BD98029846253BF8C8F33FA5FEF1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF149F2EB31D5F03510E0934600FB839D096B8C62FB344DCE298283555ED8DED1DB661E3F71853725C09C9EB000000000000000000000000000000000000000000000000000000000000006272D4FC93C923A8B63190945DF52EE6E7C4D9E42A723672EF7032083E434B103CAC65930C4C24D33D8D602715259C02E474BF35BFB698D55227665173C51DC465BB4D90F78B7544D91D0F72D30DFC03FE02E621ED3BAE65A11EDC56CA4E2900120EBDFFB3EBAA54310FAE55B3B341C4A5DA73BFCD0C6B090453FB6BA1C3A47C630A67A39BB66916DA7D307348C26C02E5F65CF4737292BCEEF9FF62055919AC74EB2A07AEDC833FE3179B9950AE28306577F1D1F1056CFD94D6EEEF0CBDDE0266718176B07C834E0981A4DE58D5EB89ABC774EFA7E0B76CD073FC83057899D165722CE86C352F4E49BC8FE88CA1A703B57F091AF741C5899FDE8BA0BBB3BC03685784F51CD0AA5101E0F696F8AFCCBFB1E4618E7FF824B4638D9DB48735670346A5D271B354D9911FD13C75C3CC54236495431FE0EF91560476080FA34EE24D854D48C97E7C9ED98AA2D0BB54603100659A27AD99DBDE9DD9216E7440619F66A1D73066FEC0CBA7374275A10D7839EDB2504D9E771700592D80C642FB64B403EE74D9605F5B50D76EC48D548AA8C68D37BAB8D85194786771FD12B8D5929D98ADD44DC0449F3589363C030C1CEFCE0299037CCE078613B1BB91F15B965F4FF574061DDCD0E1186DEC4987927F6BC27E060752163E24FB855A524871FC293D021969EDA07AD91A7BE70F056E0062F84EC388184B543866EFA4E6624D12FDCB2849B200A5AB1D2C6CDDC888010BBD47023265046EA2B142EB9872AF4ECA2EC9357867048D8A94D747A858D75868865A2FF1570247EFCDE3AD4658F21DA5522802F41DF3D2A2FF383A8D655B827217AB4BDE0C04958C0BBD17716B12D4B2D8F775D5CB4C6D374298441C4C47704DEBB003A533CA162A90B9D4B9940D9A011B52FEC7E59BBF8B37F14C4468BC4DAD8C18DA762B73257C3A5E780BBEAFA0EF900102 -smlen = 923 -sm = 56E583E95D5F5B14613DABB101FD66511DCE17D0DB203DAC2B0164A8D3B34DDC52BC4A52B73C01D46C08D0A4712446924E75F00021DE8CC95DDAC100A9A89B8401B328B5799DE8A8AC345DE2A60066DB2205393F1621C511516500B771B82C3A71A85B4ADF484100B2CABD99318EAA75BE98D566005ABA2F0373331DA54047A83A0110F4AF88A832AA28E781410C0173C0DD8580F03CBE567D4EEB01620001447DC77B1336304CCF006A627BA74F36D0CF43748B4100050471DE0CC94CCEA5162EC80030A811FD86050F79F629D7BE010149183A4BA660A712FF23F190EC8D713CD7FDB9BA75BBA0D13B0302446D27AC7DBF72F0EFC588450024B968F61B02EBB11980CCFE4B007BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D - -count = 20 -seed = A32E6FF879EC8866A5F5E4F6318DA8FE6743812ED2CF5FB94F5C3AA3EDF953CBC32665810B71B2CFEBF343A571CBC570 -mlen = 693 -msg = A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 -pk = 94FCBA9C18FA774B67447891DE1B55C3C8A9D3211915EC41CE70E069B20BC23C11606C679318E3510530E32859822603325F8C69E292B8F6647787EB33E6BBD7BF65813E9677A4E8659947F46ECFE83409031FBF0327895DB577C7F575DAAC01 -sk = 94FCBA9C18FA774B67447891DE1B55C3C8A9D3211915EC41CE70E069B20BC23C11606C679318E3510530E32859822603325F8C69E292B8F6647787EB33E6BBD7BF65813E9677A4E8659947F46ECFE83409031FBF0327895DB577C7F575DAAC0102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001D732137AF903B7AD07BD3F5E28E11D469FACA71680781E197D87A3FBEA1EF1E3C5C809437C902C06BA00F82042F2EDB663500C67C4241CED0D779AD2192631F1E58170000000000000032510EE2166A806FBEB40D272434BB8439BA7DB1494373412922E9CC6A018225E89926559361732B2CC4EC4AA7B7004EE25E578CACF2D95ED299874298511E46D224E4FFFFFFFFFFFFFFD63FC9D0CC262F4DE3FE49C5249F252310025E03C1EB4967A26D2CFBCCAA14162DF5123224D99EC8E50BA4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD320958F1DFDA19A09D80F1EBE56CDCEBB27B44AF624FCAEA9AF0F1C1438CE5CF406B375F1E94A61D7557010000000000000000000000000000000000000000000000000000000000005148BB4C341F2EFD5A58CD24E5FBF4C80096D25959C1AC73D8FDF0D53030B9019BC6E322ED1028F7C234E8C4FD73D502E5FB53517742C910D277C70EEEA25A624BE6F7C504D75673BE8572E65C5AC3013B810EFF684552633D70E52AC38F7000D1D130F9388BC55B35A658E6F2C8DC2F3D06C7FEDAD155A42312335C72CAFED5C8646CAED4D56B92136C7B523C3D3700A0331CE342A611F8F92ED8A369187FD76E209B00120498C28681D8EC7D3398E37225C6F5E2E2C7B5A7EBDA12C8C5A903306423A0F5C803C55D20C607207494281188EAA887B703ABFD483196D5F9A0FD3387D24EEF8BDBF5751C87DD62E5E801FB883FD8B8BBCB130A11E134B5914D13D18626277CAF888B6DE69D1B8DF06F915F00FCA982796CF6070B3A50C044A4027EF4C32222C7849F23399F5AB929B8CD2C644583D2A0FC0D8130F60093C1BF451C50D0F8803221898452F67BF137A001DE66C9477569EAB489FB41C9EC89A2CFDF0C7DF0D39297800D43D10647C10D94D4B3225C62983EFC6B8816D173F71403B8FADBC6E90C9D192A93C6C7052D29CB7FDD5B1BC7611EDB0B2DA1A4FBC88755B53587BFEE4699FA47A474E43463B30307845CEFF39BE69E4CD50AD1DEB3225CE9D96776ADBE0A4D58EC981AA2296A584F0A25E7E160C85C7F225BDFA959BD000BAB910A8801AE391E27AA28154443FBB3F4C92C29EEAF9B0D72A803DB88FCDEEFE4ECC4A5D5FC9A2FE07F67A785EF00864A27A0F9DF9C8156EA7AE813B96B8052531531E8E54717043546E6234153BC5E2DD4E44FB11EDBF30A7516396F0E02137C98D63456B8302657AC83403B53231E546CEB6BA2CC6A5F3D9D635A2BE3328E6E4522F4B2C83B5E88AD6E4CC04A01C53AC0D83AA72F29CC162CC681857552D614E1BC9077551D8B5295E272CB1B29D19648C24C81C4A6F33B7AD4F8FDFB01 -smlen = 956 -sm = DC8EAB9397118D077704DE310076812B98B0427D3E3FFEA56C01C210C59FF961B1AA9A1D3F1200D4DAF523E08504A4A4F076DC00F71FD476D34D7F9B890B2166012924AAB3868CD3AFED38335601F9B6B72229037BF3FE252ABB018FCDD604966729723F34F9B0015D9231E8C009F29F985F9F130085598C0D5C7FCBCA1C5FF3460182B8534A664BE4667492DC5801337866CCC41FEBAD4FC9ED12008500B02A7D5B3C989A32350901C51B0CB9D52998EA54D5F1EA00D8F57E784E85792FA67A2B6800F2F89705E0EFE40618AADF10010087084DADDEED691FD53CCC74F4E621252AC0B25857AD379FD50D01E0771B2BE0BB2E6A51E5D7F600996CA49E62F80B98EE07D75FDD0AA86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 - -count = 21 -seed = 5A64401EF8E63AEE18E8CC0162845DC7AF388230E86728ECB330007F2546F949764273EA05B397FE71F567E1527FA445 -mlen = 726 -msg = F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 -pk = 06634F3B6837211D6CA7BEB76253A3D7E3EE14FFDB0FBAF2CD52F9FE224FF692FEDE8AE7A06A1E7795446DCFFFF1CF015785FAE7BEBA447620C66EF41A632682B8ABAEB82ED1E3E9D03853E9D67A2971CBB9953075688AE3E7F030DF98956401 -sk = 06634F3B6837211D6CA7BEB76253A3D7E3EE14FFDB0FBAF2CD52F9FE224FF692FEDE8AE7A06A1E7795446DCFFFF1CF015785FAE7BEBA447620C66EF41A632682B8ABAEB82ED1E3E9D03853E9D67A2971CBB9953075688AE3E7F030DF9895640102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008B3F36E4465B70D96CC7014EE829C5BD9C1FD68588FF7D78AB411676233F528317F3093EC1327945D72512DB82E0136A44B1CEE9E6256732CD2C6F5D21C2510E39D81900000000000000A6C5D9FA0A18E5794E23F5225153E18E1AC73CE7A2D19E292D87F4BFD96357263090A982A67BA94EEDC829EF173BE0460FAD4ED818AD83DB96BFE25459DDF2F3E147DBFFFFFFFFFFFFFFF6630FE88DFB5B756EE7D24DBA82635E5653597B0C3B1199509AD12A97813E46482F3223794AEEEBBA4F6CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B60A3089BA493A3FCAA3340AC6FFB722754CB714B48EBFC7375662A472872CDA1EB3F7654E44277EE80BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E9B2534CF2F686BADBA8986EFB81BD1E4A7364C6DF2D690E86092C464E165D74EF5BD04B781B6F04E40DFE8B0EA0102638A6A1938A0D73CC197E331375B9282A96E036A0E77F9A08B84D2472B4E5149AA3CD056BD2162DB03037FDD0EB5D70359F3F6C07276E075EEBF3FBA01A66290E925FB72527E15DC13D0F9EE93B592048AC061EE9C55766D3C26233DAF034103B17DD7A8FCCCF1A2DAFBC4A462EC4F815508F30099B244F628F7DA78F69C5447C676672EE3174F04DC599BCAE380AB004B23CFC05E16B7C1F675DB161F150A3DAB6B40FA1721C61B4D82CEC6176C05E44BB5483DB649FDDE87D27016D420BC02AF06502035667E9B3EDBD0E959996CFA403C9A4F58C6B3C63030116471CAC09992BDCDF468256E608017661CE31AF00266216E85CE13168D70427975208794B0874BCDCFD371384E5C52E9CF03A1B521A6797FF6B94C9B0797DBA92E1BFD8B01CCD74E80B657D1FC7BDF6B53294C958713C8AB09A96254D66C74F314041734955F7C13781629FBB392908A654E1EAA01CCC624D7343454319631BC914FB42AEB7D6A69220ACFD73A271BF3010D3018C10EE183A10D1E72DEEEA466CC02CA79016C310C336D146A522C76CE1892423A101FF775C1BEB3C7802E6A06AEA7A7A4973DFF267121607588A6D2082A8D38710018C388DF9D000B58E17A78E6F8FC5B24A53B88DD370C78774758748A394092B07A2D340D28C634343D6E0FA5E2E45802978A9060CCDE3B407F262F0EB896A4FE43190A5FB94982C8EC21B7A4FFDA2CF3C7F4DD892A70F49B5621F1175B7BA500E05289704452E75258E049D85ED12DEE4869727172113CCB515F2EC3924CBBE4468C5849DB2A2155885603CA54F40A0178F29DE8497BC92DFBBEE8EF84700384153A5ACAF724DD4B9558106825CF96258F599DBAF370BDEBCFB7C602AA73C301 -smlen = 989 -sm = 0C090C13F4F11EB32706693B01908866FAC51C16FA32FB517F010CBCF8E219EEA5DB4021B0A0000FE20C0D5D5D8B55691A5CF701150EE396743F4463DA7F1248012E42172A1242625462AE119A0109C1798220319174A7E2B2F30195D476776290E1B7262DB09D009BE25D8AABFD286ABC0EFC750013D17A6F282462D40C484DED01B101F86550398E41832B0A8F01E1A592F5B5ED0239EF99895C01EB16AFBABA2BB9C653E1C3760142B5DDD4EE0437975EED027C0179F04B73B234E69ED3E16A4F015CFFBA4C3B6520EE6ADB0A61000189DF2E8BDCF87EA389E94D5E8FB341AB4F32F4B0C6CBA94BF6060113F8FA4931DF2671986F8D1701321EF2C99348F5E6E930A62A2707F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 - -count = 22 -seed = 3222E4B55D6767E300FDE03DB3D8227E19FB8B08EA9B923FEDE18D699DC3694EFFA7C4DAE2AF57E4A0162B7C564199BD -mlen = 759 -msg = 4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D -pk = E5942917AFA9085E87E2A4F03A5F68C96EAA3CB5F6A9BD4E99E88EBFCDC65097D1226EFF828E157C9D0CD9B62A79840284B05A70800CE23B8622E6C7388B4DFB4BFB06FB03044085D970CF750178178CB533506963BC30D189BE9000A5CF3702 -sk = E5942917AFA9085E87E2A4F03A5F68C96EAA3CB5F6A9BD4E99E88EBFCDC65097D1226EFF828E157C9D0CD9B62A79840284B05A70800CE23B8622E6C7388B4DFB4BFB06FB03044085D970CF750178178CB533506963BC30D189BE9000A5CF370202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004AEEE1992FF3419C88D18C821DA5F083031F126A58B623D4507E685C8ADE02D3A84CCDC171A2197AE5DE8647BD9CD1D2A074022D4AB51945B5AD7F912B3B3902D9F30400000000000000A178E55FAB986CADCC154C78C20A1087924730D47C3CC361991479D3875BA27452FEF3938E3A115A4AC60B43EF001A7353046D29B9A6FE29812F8E0DE97D4DF84F0DFDFFFFFFFFFFFFFF8FFE88821AB419086AC6CF76D6CDAF3A0CD609573751108EA3E2DD7714000114C54D115446296366A722D5000000000000000000000000000000000000000000000000000000000000008E187A61121ACDA57FD8CC3015724871D216FD8921BD34BC94F810767EE6352BBB350318F9AD9783CD4A4E010000000000000000000000000000000000000000000000000000000000001B2625D54201A1976E473FE92EC9A8A1BBEC042932A576D27DCB05B4CB9A99300D2E63EC8B984EB20957E6071549A20106F907F6BED607FC291F33582EA8B177095418351A21292260414FB4798EAB9965632A822410CE6F37B4E8D5B542150235618C12AD0778453BE17FE9397BDE37519B65D098FECE942F7D2A7B8A5F01BC37FF2F6FAD182517CDF3DED1379F1B00D832CDE946DA7C9674A19AA01D10FFF395E90212E51F33CB842B49E62A2104C0E74C1513D7D552628296BF17243BB90192E2842FF8D3BCEFDB463C7EC3198AC023665092F8718D7D5F35A968458F81DC5A698C818EABAB59C324D466451C1F01DB82116A59AE116D1028FC149D15022F1EA61D49C17DE3BED6851E7F8C9C9C7E347F19B23818B334C78038A4B6DE0A035C623E2D746EA32A66FDF9610A35B931DE49469C62ACF2CBB93DE2650E915FE427186D0F409C3D1EE3CA2B69DAABDE014F11CFA51F0B8DE4FA61BE5DCBC6FD8CF7F1DBAB8D3F1A3DA51E3A990E7D6A1CAD04179DC5E4F592AE83CBBB4EE78B02363BD9F84A2C360195DD6B5936C446B567FF9FFB93B7EDDA938D895B4CA30EB347E4D82C25B49DCED752340B085D6E00411D89A549B68E442C3C86405A2FF8D26806AC54E1E8D1CC1FAE9EA9807AD2700AAC048EBD523684BAFB4AB92D8811027163E885072A1E46A51CBC03AB4AA2BC9D873640C2DD092946DF917F5B37E01E517CC81C3F43CCE1AEB4BB819BC43A0257277DBCCA453F519CEDD72B98AB378588F8F89A40C64F332D4E707BA41832EB74752EAED4A46D67C2A1F27EE5BC5B00DA23515FC66469C13202100D5133DFB44D63EE2A01247C48A35816CFCD6B412E923408EE6494C382F4B5A042041B2003E5353BFAA366E3F8C7012BD5880505D60ADBDB99819BA6FE5A585577C1C0CABED3101008E6E0C333D18416F4803E8201 -smlen = 1022 -sm = B77ED4B98C918F6635AAD1C80057BAA969C70063A4205B691F0160DE5D3CF63D395880C1CB79011328ADF5CC4E1C96BFEDFEE501E92072C199D38195FC5B1D7C0192EC3AA39159ED33FA2E05B601579C649E5937DE772BF6D6130031ABECAF1BA99071CF05E21E01F6A626F3E5CEE83304855FEB0014416F93CC060CD9ACAB5D1301E085AA0254E5891F2A18740600CC4B663CE142EB698E44F380019390D9D4911FA6071622522701635397047B5E8200059E35AE009E45FD81A817EF45D4DD004C00A61152753BE205E2D1A92F3D0101F17C3C6D0433468720A3A88D60D06A699E85C50C4DC4B9ABD21103A6C2D38424C00387FFD3357E015B8F3E6A384F630161E2962A270A4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D - -count = 23 -seed = F41B3C6225245C06455272A6A073F363E5F19F09A0B146AFCDFC2B3B0EA64BAA3F90359F32B2D1017608B03064E90AB2 -mlen = 792 -msg = 72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF -pk = 2CE2179848EA0B165B6C95FE487FA5A30D9F079FF9E200ECFEDD41223A82A70908AF7C2D95F587AB063239A7BE14A203EECCEB2550882D62E63406A92E7D239C46FA31F41E368EC5DC544345E4559A156525DBB9068D850CF3023D79D73FAF01 -sk = 2CE2179848EA0B165B6C95FE487FA5A30D9F079FF9E200ECFEDD41223A82A70908AF7C2D95F587AB063239A7BE14A203EECCEB2550882D62E63406A92E7D239C46FA31F41E368EC5DC544345E4559A156525DBB9068D850CF3023D79D73FAF010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4B17352253997A2819A943A02587C5CDD37FE2B7A19DAF2F3F5E439DC420E589E9611A5BD24F777F30A8F4DE06959D072359E51F39FF584622A7CFB6F07368814F71D000000000000004B87DB9AEEADD52FBD93028E8A83211605E999B2B18A21399D9F2E4D7612F0A9803B6301D46D42E8FA487427C1EFE26EC495A87DFA20A42169A8DAD0DB4F3B747053060000000000000075B9DD9FF48BDF15A4C099E231DE0BE848A1B0E7820936D9AC29FEF0E20E59629872AF271C0C89213C452901000000000000000000000000000000000000000000000000000000000000B4C0766B8EB8B2445CA305BE4A227244A5ADC80D206C711B8A7452B56C427F40FA8A64FA13031D685353A2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0EB472CB6FD96781A09073313DAD600297DFD00C00DB46356EAE9F7FA2CA41FDE6B3E082467BEE2F21D74E75A0951B03F7762B0030A7D80852D7AB538145EC08275DDB7B07ABBAA2748E74279822D747A53228FD598BD585703D1515DB9971035C33031DBDACE596537C7E573C611F2C580B86A291C35CCED1861C4187296D3A2483122C48E9A57795002164C8A40C00304BC8CEBF5D29C74C2638D58ACD52DB7D9802BB52C23F1AA57CC826198F50A1CE1B987569EBEC37CA5D1F507984B102153C454D5AA798E224B9519ED3855CA6980B64A3866920A96A6BA90D5146FB1C8FC20733A2FB0E670FAAC9EC7F930403CF387C08215E5693D04A12E8DDC5A5DEF2CECEA337102381DF122C31851FC821E24C1192441FC82BB50A44FB79B4C403A84124E524944050F7A9B73E777A2BEF9338F38809B1ECF120FE06FE42F7349E112B727324D97E1385E7C1B0687D7400A124599BD3A24BBCED6004D853336EFC95E2012CCEFC8CAECCF1B621FA6BF9C662C09493BBE17E6250568544761DCA0377928CE0DBC8DF1A15F6705114C210947E5F7E210F903BAFA4449BA8E56A2129A28E02CCB462A01CD6540CE56B5FBA005EA8A85D13024871DA8BE6C1DB7B1A6C87B3CB49167511DD26F878DC69157872C99805195B80454A858E4DC5175353004A8194C7DB29F00853B3093817835AFD39E0B44272D492BF94ECDD8BC81E8BB540E86F188A49395FBB33FF87E7DBC0009B03A63F64A0585C0562F0960372D89075742F17DA06AF373E487BFB0B616F28B76BA13EF0CA19B2BC58BD7A21BC970174B07E5919594155C3E3CAF3EEE4EE08EF1B43CE78758C5EB039DF23CE1C7988D89E63EE6AD2FD1EAA3FB62F51EC4C02C09C92272DECA829D9D2F36FAA0DBEB29D44459FE06520519683FB0A87F23B0069E390509A0B34FF22D55F35C15BE600 -smlen = 1055 -sm = BE12FF8EC60932A838B57DFF0199E7936C637A1726B1B25D1A0105BD2F218D50F1FAFAFBA11B002F2699591E5F3ACDBCC17A7A011575DCA00AC1FC0FC0575D2E01378F4E2AEA3427E8E733103E0188AAEF2C1A8991E4587F4AA50017792C035B7433A4B55F168401C0AB977E7E5C706519A95CEC01E0DD23CA9BC92AAF7F25A70A01A91E2A9878A7F9E4696878D3018DF6BA4CE4EF9D8B8878A8A000C8686DA15770C237CD4E0E30013B31A99965F934947AFCC3B20039FDFA634C1D21A44BD48AF8008D9E64B2EC66AE62232DF3E50100B7B716F3381A11624EB1F1904CFDE1C45AEB20BAC21051B9CA1203937E151ABF4C69ACDDACA3160005B27B60C854C381F9C189C6730972713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF - -count = 24 -seed = A08AD391E0FC57A83B74CA8CF44DB67F8178262ED9B20AA0163CDD8274AC2BE05F558B112B094244370C1AAAB75077E6 -mlen = 825 -msg = 209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E -pk = 9175BD572F74F2D3318D7513C97D695096D0012D81A9D7B2765125A4ADC2446D4E43CD287D7E34A15BC7F1D22A121101878D8BC1B56085B458ECFB28528FA60AA432C17468D16409C970FF27BCB8644A17FF3E455CFD2BBBB0B4C47191CC7401 -sk = 9175BD572F74F2D3318D7513C97D695096D0012D81A9D7B2765125A4ADC2446D4E43CD287D7E34A15BC7F1D22A121101878D8BC1B56085B458ECFB28528FA60AA432C17468D16409C970FF27BCB8644A17FF3E455CFD2BBBB0B4C47191CC74010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B1EA1FE926DE1634E54D1AD3258AC13F2A37FF1D65E736DEE69A0593077895B02DC8251B7C223553003FF6FE970AFA86E986F12EA6DB463E14C3BCED0427B75B0D6B0300000000000000CE9A04EF2A214CB2FCFBD616AA45E92DE276AA478A10E7C719B2625A3E9AB846D9170C0CDB8F9D95E8C119A5144DDF652B69A7372F4C506FB8C29333E849F30FDB11E6FFFFFFFFFFFFFF8698AC9F8C7015BF1E35A5CF0B7FEFF1DE9E88BA3E594A00F81743F9EA44A82BD5660DFDB9D005F2CFC0C3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC226D41E145232C1A805AE3229FE6792783F982CAAC04D396F97B01EE81E6C0C757F495B46CFF6DEF400000000000000000000000000000000000000000000000000000000000000032AF9F3307210BA47E0CA3FCD9C5948434C0EF7D6F601170A5398627897742E34E4F02670D2C62BA4DE8C6239BC90200520753029A269AD944328FDB2200D7F113D1202BD0069D2867C73D08BEC3B4C5FCB90F11EEC8E9E967240DEA16096300818E0EB0C7C3876A74DA90F23526D12A625F4B3CC65AF0DFC2B08D3B4A193AEC593E7F31F4041E996A67C8758A8F2502A3B0427E18313DB133A04B2807F944960DEE653835DCF259B36F60FE5090ECBB7FF8F1C676671687A2BC410726C8EF01396E7BBE9D0064D79A4128ADA28165F1375C828513B2C4C9F21CE31F0CA0B84A9FCF823BC86C7C171647AFA04443E2005E5EB4CDF6625B62372739F3CA7698ABF71BCE64B03B176270F6C35BE3E840A5E3D24B20023A46E2F69CC325BA121F011AFD6DC22A5A73AE7969153B5A1565EAB0BF33D0D3BF3C93CCBD45EE56D0D07F854C248B7E93050FD2D829A0EEAE6D033FE3DB366A8A769392DCE67D3FD1A89B0229627D4CE6F164057BABC3457F4CE1484370698298C5DBB46921B66C82BD016410073E6E5C0DDA6C1BBCFCBFB1898F9C0F78FD0D7CE2ADE60BA8DED248D08417559F4B96655DCA1E78754C60DD5F03A0FD2D6114B79AEAECAE66C279D65DB5BC1BBFC353B727A4C8B8BE7762DE93BF8B62DF688CBA5B544D65C85189D0D4008247067CD0A358A3EB80F239F97B3A1F31CD1507E08890216D1814A15A37CEFDA5B350FC26B88D1D6FB11B2E4F576B00E35F4DC601234062DBB009EBE27D970CE4BC0475AE6262F44A408D4B2816592D93E84C16791B4480026FD912F132B50013BB632857380E667D83B588CEF0B3C00F207BEC68A933217F959B710BFC166FD63CEE5BDCEBB7E60B491B5CB3D82C004AF23158B4C6976B96561B0EEEFCEB85E313598C35B686E4EC7FC78DD895CF527E2D8FF6BC055D9ED59A31E5B1F2CA00 -smlen = 1088 -sm = 5E6DCF5C60317567555DE1F601F1DED6474949D7D682ACD34501F5EBF543CF91B20144A6F62C00BC67C0B0A04C0976BB9B1EE800C5A720AB8FE616B03307B28B01D32D84952A0572A9C911D17000BEEF99E8136A8666CC5CCE4D016109E8B81708FADE3F6E11270149F13E140D87231DEA2E755201033688680340C68FE9EA5E01002B482651D24B383EB3DAFE8F00BDCB9BC0B883EAE490EBD08A0096565F2149C30B4310C7923A0081B03E158210AA59C31C515901A97F3029AB20297306D9B85401A158317515745FE9E225592500009D0B9B8AE5F0B12167EAAB33B4030498DF1F04CDC1094CDBD416036DA93A332D15B7E1574DCF830002ACDA3B92639D7A90EA764E050B209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E - -count = 25 -seed = 6E0A8EF5156D693FD0140BC4A31084E79773A83F42C8D133AC8A9D62DE3CD74511F893DCB26041E6B35E2B175408FCE7 -mlen = 858 -msg = 8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A -pk = 571CC2FFA75C8111F0F1D25CA09D3DE6B2F102908B1890EBF0779F92AF88CB31D4D31F6B7D0DA9487855AAB77E3E140159CA3CAF65D18242CDF87745A04040B528C1C46EB73B1C41427C85EE8771E3BA267A475B87775FAC6F459705F4E3C901 -sk = 571CC2FFA75C8111F0F1D25CA09D3DE6B2F102908B1890EBF0779F92AF88CB31D4D31F6B7D0DA9487855AAB77E3E140159CA3CAF65D18242CDF87745A04040B528C1C46EB73B1C41427C85EE8771E3BA267A475B87775FAC6F459705F4E3C9010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E6F40F655B904C729D13EB1211C73929EE46467724C3379858A094C72473244D85A8C37F63E7FA49DAB4C276B6F4679B134AFFFDBFFC49080FCFB09C8CE2652DA9240300000000000000A5D016EB78D8E0512838831A84A8E7C5589EE81C33C9DCABB467F522FD5B43A0744DE58D184BAE37031C1455E922780F426559724BEF1EDAD95E30370345386D57AAE3FFFFFFFFFFFFFFFB0227B4A1652F0D3A47EB021B0D1C6222608D8ED4875AF7D38ECAA55148D51E8F5894C8D1FA00F456B7DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A582D149895C0FA3F52028E04AB3F18C2EFD8C7970B48B24E149AB8A0EA023E80FD1A5B5FE4741B8BF3920100000000000000000000000000000000000000000000000000000000000040C3C1764A1BF62C24B22F8E67479F6BDEE3E5DF49502E0339C371ECABF15228FDB3A9C724465D0B744E3788E28166017D7B1E154C62268DE0A182589646823A5211154682C837E8790E8F11766E3B4E33E8827DBC1DDF50AA9B6EE9F1EFFB019CC780883EF101C3AEF928F6C76B9AABE46FDCC55F1D6620F32DC6882B01742F4332D083EB3037399FF3150204801700DABD33D7B74878FEB3CE9A60935156F345414DD2D26625615742A7746F7CABCF370A0F877E4F192FB788B8E06BCDE901BB247767428036E6EF04C05AC167372C89060BCDF25F1CCEB73C33CCAB9765BA4C1BCCDEC5056C6FF67A1AE711D73601EF32892B9F7D175B5FF3820DEE7C4D822A538E8E9F7E62E01554397CECAFCAF42A1B3C02FC4BCB34506A5330152DC403DF9F1D05E0D3DF5B2DEE0AA9088D107B125785FE321A9F6602E69C8D31F90E17509C2A187255E1A08308A21F1EA61203E34F2DB3BE3AF105BB647603AD5A4296977BD7FB7F22850C0167B3E052B3DC84A2801A29DE331ABD7C4C8F2233AF4900D3E77CED9C4F9665855ACF264941414A2D299ADB6A11878C236AFF71429A9D8B9E2A5B4356F695372B144530BBF5930068ED887E92AC0D2A614DE813BD65143D72C695800EB0F405D96BB258335A40F3B9E942AAE4BA66F6544EB13895209001E2B0985465B44CAF4675C9DD1EAF91D3BB2BF42EE3233A1A0367B40B2ECB18E7AA84E10F6C32D855874B17BF6AB7D8025441DECD256B35811934E5F17E0C57F9F64E6BB9B54FF4222C5B2F30801132388CDA2CBFF330D323301A2F1626405A037DEC2F70613758D60EE63FA4EF302C303EE7B0A8C0A6687C33DC551DB073678CF61FDB7E8CFF963E2281D405077B2500C1D238832FFB1339BA64940CF86AC50722CE668827702306DCF5BD224D1D99634373602358487D75E8EA31584CD40903 -smlen = 1121 -sm = 2287F02B654F133D54E73EE00011C5035D9C15C61B20504416005DC37F9018DC0A9DFD2BDBC5008DC353D6D6A2DDC3D97C3A81016F2AAED0E8B101A31B95859B0148F36F0A2DBBAD647374C2E900E9B7E60861D45A329F02D1A001DFE2E4674860E235E95DB27F0013B8E4341C52E6F8A782C1890190A003F6E5DD1C8F53DE4145011639F55D7ECA2B2AACBEE006001D8C01F51582DFD3E66DA27A0184C8984791C4922652AA80BE00AB5247E30C7DC8D4A537C609018A8A94D1F38F5BDE3E9FAB8D016AB63BE4970BE99C61858AB20100990ADD12587385C0D0DFD1B45682CBDF696B7CA8222938F7DA1102925493DFF3E75F9DDF94CE2701DEC7942354725E2C92160AFB31038F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A - -count = 26 -seed = 49CC05312D1DBE216FF03B60575017A6A1464C06D2C5A4A6F973AD9F275F7C66163A29A803BE759B117043862D277C27 -mlen = 891 -msg = 30D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 -pk = BA9DB4A1D2ADC3C0159EFBD93B2194E185E0FD0D546546C86E29059F67204C444D455FCCA5E348117B3B5AD2C3C2C301C4C147ABB9994E528278FB0724C0BE878878D074451E4807D4D678BA153358C51994C1D3FF4AF574A4CD9F9D3B828A01 -sk = BA9DB4A1D2ADC3C0159EFBD93B2194E185E0FD0D546546C86E29059F67204C444D455FCCA5E348117B3B5AD2C3C2C301C4C147ABB9994E528278FB0724C0BE878878D074451E4807D4D678BA153358C51994C1D3FF4AF574A4CD9F9D3B828A010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D3D62CD3CA7548A8FE6A6AF0770150DC810433F370EDF19DEFB2B691C74792B3F2C695C98CBCC33072C9D30BF124A07C0BF0FCB304CFED009B9AA13CEEAEB421FDB4E6FFFFFFFFFFFFFF58F1562B04B7B95020C9080130469DAA31D9347D6020C54E76534482EF00FAB7673030D725551ABEECCC9DE0812A06747FEAEFF931201F8B27581B39A19A8013BB04EBFFFFFFFFFFFFFF50F43DB13874C55A225A069884B067FCBC5ECB380F795BB61790A44EAAF6CFDED1FC7F353C0BC37E6D1B09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4DE870CE120D0090B583BEA9A30C1E19F67D84BA5C51782E513D73719E756946F8603EF00D615510178949010000000000000000000000000000000000000000000000000000000000006D23670C8EA30F6955A023416F700D847D94B435BF551D6381FC5216FA45096870BF19E97DF4D62A057CF99ABAAFF802D754B5F404136C728D7CC8B100B06C6EFCE2C14E827F75D7ACFD8B26B1665E974D624119FEA3B8F937D16688E4F5060252193ACCD2F773D9076EA34D1BD445019B493030A3407B17BF19A71B4ABD4F46146A723DB666E4E87DA8910781B27602A271262E9DDD26C6A55DF7C890FC58381E45D30DF401F0ECEEE07D8F2A81E21659DB90487449D8C9C729536EB42F790106C23F8C3C82973B020D471E266DDD97A15BBB8F2571BFFF2F7CFE949F22DD4BDD8337FCAF13B6AB46407EB420187E00F6210F9F2AB7DA2C83700BC33BC4789FBE0226D39884D946EE1DD24E8B4002F691612E3F4919F9808A231CFB5BE02701390DFBB61BDA2DC7AD1804C9592E59C1C84857FA80F3021392B93A85E2BEEDD92E3E82CF732837E138A64192194BAA02440B577F9F2DE3FE795156AC111518C4682B9370E120D8B672A826C619339AB50AFFDDE494D408BCEF6741DC2ED6960361AF4D57B36D8ABA4B3BAFAD42176AB5959A6291656DB9270F23A5F029BBA55F44C423ADDF455BB1A1B0D64A21DF1201ACE641078C1BC6A4BDDA99320DEEAAA365DA6FE701FC56CDC4D41513C344635E6CB27DD8675395835F49F8882F62C901FF010B4763BF55BBBE0670E43FFA7FF6AE125D12183FDD710BDB19F89D98C143A077FB4B85DAD580F896E18A0E8E080343822AAB2A072163DFD2DA33E76B6A46FA2CF39963F4837C3D8ECA39C6ABF7D4F052C1D3C2AFAA93CCBC0274797BFC0180EA21DED53D8A154981B783343C3D9FD4A7E83BEBD9A59A5C2CCADB238F2E49C71D422913EDFF4DA46EA9F9F58B7E0087FB6863F368C02DAC2FDE6740304FF7D2C140D96E9B9780D1D998502452AEE853404F64A95CEC4CB49987EC47036101 -smlen = 1154 -sm = 36453464F6B3AEA160137BCA011F2C2CF59877677FF9D6BAFA00AAF331971EC847F845F69F0E01B6A0727DCD5CFF126093590D004F66F90BD927BDB0978A560301CA75940D823652CDD2E752E3000FC91A2F86A36544404826220118C1DFD0CFEB0D160515F25F01BD8B9989D5C7D6B2A53D2E4D0062C5614CDBD016597625BF5000BB988EC869621B342F8204C6010018DEB988A6DE992393556D00435DD350B6286500705904590096B0A7ECBD90E38B3064A70E001DD47DCD41B85B1DFBF0B595007EA8C4EF0DAC4066F78FB2EC0001E7CE7061CE39E55C8E16BA294D34200CA79721747F4B4C87F1120388810D7C9B25B9154E5AC96501488FAE0BFED79B51A47945C06E0930D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 - -count = 27 -seed = C33EE43A9CBB4347BFAF71147B7FBDD88D212462CB06FBE695A35402C503CD15732B7D0E8BF829A555B9167BCFA2F2BF -mlen = 924 -msg = C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 -pk = 936CA59F9F37E0E2881CD3DE4FC1D73554BFD57E956B01C97BF3BAADD9E988D0BBED6C969FB01169484149F9A3E0F802A71572AF443082448B9AFBDC04B895C65D95501B6B617A5489ADEBBD60BB42ECCC644DAB8D969F213DD7713886842B00 -sk = 936CA59F9F37E0E2881CD3DE4FC1D73554BFD57E956B01C97BF3BAADD9E988D0BBED6C969FB01169484149F9A3E0F802A71572AF443082448B9AFBDC04B895C65D95501B6B617A5489ADEBBD60BB42ECCC644DAB8D969F213DD7713886842B00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016B74B3E067CA8240845E688C3D0F7247E288DE12F228CDE1435C1AA22F998FE996BAD0C819F657EFCF5D17F778732DCA206462AA4163AE70E41370919DC7431838A2B000000000000004778E38226A70F303D426D33660138F83B6294E35BCD74B31D31BE214D61E0152FE1CA3B46373150B7F63D3A9733B9D180DBA05012A2A029EB89F5996BB80546369C04000000000000000798C3465486ED717AEC15F23DD960DD3DEBE0FD8E7651A9F3FBA11DDB2F6A50BB6F71BBE97221DEC88A53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AA9CBF8FDB1EFF4741A040C826E43C046D947AA7957E06A3753FA2E38699B2A0C00280E0C5C4552C4A643010000000000000000000000000000000000000000000000000000000000004D9F72451038B56AD5FB7536F4184C9B7D72007CCE9757858529714CEE9B10F268A1107CEFC6FABEBAFA4C5F9AAAC00382D6B4FE3298DA5BD865EFE64C468B8281D0A721B4A21A4CFBF6923CB5ECAA89D43AF635B30C044C55439432EC6293008EA3BE611EA0008BBDB17BB71299C4964FC51654EB38FAE8A5886274FC9C0EDAD705D5D888BA09107D20923C8B3180019DD52F5DACF8FBC6E2838569997E2CCF50C04105191E65AA9BCE668C0D1A45FA06242B32BD21F603138FE8F79F7C7602516D8B2811AB11E6C397F401EAF5390688BDC381C88BEC92034C665035AC272E3B065625CC0BB32032D0CA6D062AC50287AEA84A3E7791EF6E6D2920A227EC12DF9FB259A543D06BB22C1C1E01697C2A4DF8019D49F65AC3D94D754097956F035BFC73C4B3FE2F5A3B595F683CD3716A89354822162255CB25E6FB0A7AFC59E2DFEA2F3684C15B367B8B5FD281564101892B2CDC3CF0BB4AF492322865273879011676161B7A791C39AD67156066F56DD7EA69DA4A010F68B13B4D3833213502B2EB84F8B2CBA8673FCEAF4F128CF873BF44580B62BBC05F53738022D3968AB603168679ADB0DDA09FD37C2F9377B70005DDCE19710118C46C8957B26D3042787D4FBB1FE7ED1E2C7C951552CE68BD521268F607719198CD90D18654A0075F01B52ACFB494595D4BE1807CC0C5C7F245403A84907E788A149F6E6AE4898FFB754408F756EF9D45686C3E62C56FC74D02187E9A6C6CC7F286B712159F4F5974F13C0A502C08FFB4F16F8999A76E1543D2E798866B05CA56BBB785B4898DAD9C010D354D053A38BA3E4F12C027AE9B65D69CB59E869AEB0882E6A6E9DD01FD4224E7F0CA38054D7464BA9E2E3F7C16C70265AE1F68E086C555881DFBA7EF18B1483465A04397EE265C7DD712E0BF2680A6693AAF330B5401465C53873051705D03 -smlen = 1187 -sm = C8CD3B5EED5963E1DF6F137C01BE1226CD65FA4E9F1551605001B49CEE80BD95262430C026600092B3019A7FC4F2FDA4811FB401D85EF3E195975A4234E2A43F0057625E9F062A6EACF1E1DB7F01453BFC5EDAB5E547FDD260A90149C3FE76919F551997E32F5F016DF16E20F083618FA310EFA50134FC94D2ACBFDC959B0B15C300AB506BD6A2897C3C3233DD6F00A23B6291B681ECB6967F2BBA019F9F6B6D0FB029B264579FE90196ED15DBE0043725B22D0B7701C50DC8C588DB1F3669C0079900A14F963625CDEABA6E4766A1000021C4ED07E025C5412826BCCB0D98D2076AD4B8EE5783B0E3AC1802B0B3F003D3D29ED87E6192D6000F235076FF09F312130462D69B00C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 - -count = 28 -seed = 19CB4BE2332F7FF0C078BC001FAB3C5FD8569A76EBCE373D1ED4FC8EB5D744C6464E2B5EECB9EE836CD5D87BEDA78BA7 -mlen = 957 -msg = 86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 -pk = D9EDF479425F72DDF1FFF7A66794C8BC00D61746AEA6B128AA15EF1CE781F772BDA908DF71055FB0DAEC7F1C26EF8101DC68DE617DE594FFE57BD34909D03621DA1DF8BB3AD2886B7AD581AF6A307D116A5527814893597221E42FF7E4C57B01 -sk = D9EDF479425F72DDF1FFF7A66794C8BC00D61746AEA6B128AA15EF1CE781F772BDA908DF71055FB0DAEC7F1C26EF8101DC68DE617DE594FFE57BD34909D03621DA1DF8BB3AD2886B7AD581AF6A307D116A5527814893597221E42FF7E4C57B0102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E840FAD75A5E8484E42502BA194AE7F3062D147BB6920657AA0CF2533ED8C93B5B389CA03B08F7F06A8BA6BBD92F04D05ED23C310EF603D702EFFA0037BEE905C92110000000000000017B3CB969CC5CEC803310A1ED14ED8C08E30BA6E78DB962A969A46460EEF8B7EBD0398BF1B813E2C58B45E55FAAC70C18228A57F198060753C0F6A401EC75E328C57D3FFFFFFFFFFFFFFA9CC9A4EE6CCF7B8D5F13685D413D59D69654A30354E8733A3070FE66369E293B97BED62FAF184039A943400000000000000000000000000000000000000000000000000000000000000EEB2E74881D2AA7D9BA871A94EE7B909BA17AC338336D147B0C71F1D068F214E25D8251CE249747DA8BCF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1036C4B2E0F1F36494D2C142E3ED6F16BC640DB2898A45FFFA6B9F3C797C6F61ACE7698693291AB5F18277D21A074B03B33E6D07A60A429BFE50DB32A1B78328B21B44D1C16737FF523E6ED59795EAD3BC075485EC1B1ADF33B41E99679A5B02255E07077EC0C94369CA7E4DD499B7203CEFD2DB22859FB9F2093EABEDB61CDA099419E3EBCEDBF128901FA19CA01700A8124835D533056807103B17E6103390C055540B5A1163246025F9446F12ED0AC4AB96CEEEDE902FA514BAB3478653028E397364C2723DB79103BECC07100DCBB074FA29D4079071443EFE1C8889A9489165757067D9967DE3A70046678416038D36E21BECA7299A2EA95DDC54A0DA0EBA65503A8C137E9532ED19D15B36ACD1372BE98F86B45E5F54907BA7AE0C2F0028250DB22BD05B91B62EE658E61A4769A05ED6BE9861A35F37D70F1AA665A5C8EE73BD63284DE6293E22C4348E46C503F092E2E14C2E62D37634792B57741DAA76D5D3674A59F2E4C141017760E5BFD7ADCB77F5EC975C77CB3B24811806DB00186F0B4721E16821F600DC0BEAF4167C818D7CD85B755304FA83D9572E603E0B470C06C02E7C8DBA11B522370FEC1201B814940BD9758876C5BB5FFCA8AA2D7187D3EF4C64AB4631DB048A498BA02F899FB4893471D653ABEFDAC2B7615F8A00C006D8C46A547EDA368DDB958AF1A7E066EC14FA3EC710341F2FB7A2741B103A0B601ED28C6D385FC70ED63BF72FB5022F7263CC494A42677582F77F6B3A41B8990DD76319C950EB56B2BF939D2AECD50E82D4624799EE15AC0BF022EF060C02EF2E2779A48DF76E6FD8E261379830B2FE2BBABF2B31C7D0D5C6115D1EB6E3F8AE9582C889580A6DE1FB5A1C22B630026869A25C041ABB075BF4CB965D20D6819A220C35120ADF803E4A928E34DB745E2F5A1CBED6BDCA75035383EA2CCF8700 -smlen = 1220 -sm = 66D50FAFF43B06D992D54F3401A464C51E4001E1AC8D1B7098001391575A8BBCA5A59F32BA880013E9B4E5D169BA5F7BC58B470061416253FA85F668C305D75E0030D1DB2994A658CA89A6B8540044FBD748729D465D9B4AD29400CB8D9248F0512E053D4D1A2200AECEE230028D592867897FDD01B598E0A1FF0C965D7A2EFC5E0185E4903F8D8F0E3B7F5671A700AD9C96705D976368F5C3231901BAEE0016F776F9663E809F3901844780CDFA72DF88259C583800997D607EB4C07B330EA34FE5014FA7F3BDD9EA0105F4549B4C01017746087A80DF02F17EA2696FE5745321525E2EB2D644B5152606013DE1E6117B9CB19C065C4E03005BC0E7672942E7AF9A96AC74B50586D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 - -count = 29 -seed = 6BD93FD13C0299B3EC7403638673F3DBC449F3A617B691DDF73C072B62BF028913375D7460BED2CF9FDCA517690CBAC3 -mlen = 990 -msg = 56ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED -pk = 5889EC0267113885A8BFDAC3F44456629B70213AA523C4C6F7C6256E5E962125957C7A671832E99338A38BAEE16EFC0099FD5ABF074FEBC9F1D9CFBFF56969CCE52A70DAA5A3678E05A7627A5E65ABC206D2CCC496C101EA24EF74CF4E1F9B03 -sk = 5889EC0267113885A8BFDAC3F44456629B70213AA523C4C6F7C6256E5E962125957C7A671832E99338A38BAEE16EFC0099FD5ABF074FEBC9F1D9CFBFF56969CCE52A70DAA5A3678E05A7627A5E65ABC206D2CCC496C101EA24EF74CF4E1F9B030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DD3746268796D145EF9BADC3BFBF6B2B1F92B338627EC2A20823D8D5BC0F6188DF854ABB1CBDB5BD537D66E91EC7CA23DB04DB97B7818BB5E5B272DD304D27D4CF130400000000000000A0C007C4482353ABBA85EDD41DAAB1F7CB670AB37F6B436F8729D799CB74E3B6C70E95D7BE826579A149DB2DA282D0619EEA0BDEC443A0035BA8E81F5E56041E19B4D3FFFFFFFFFFFFFF0859743AC256CE81B5E67A52DBC8B4678C2C89999DBC1EB6383F981F3829A74B94F81485B13745C78E2DDBFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D8174C0EF744ADF05EE8E503D2571B98A40F57D9879AF2F69A0FD04919887EC5D5CF5AC1557A07E2FAA96000000000000000000000000000000000000000000000000000000000000002545C681D3104779834515488136E3AA5B81B133AF3024117C44701157A779AA9F4811F420E8E7B59BE60CFF98F4E1010C035A9AE645498C7FD0CFD541C4B6DAF950B4C861D09E233C613AF1F97498855CB107DB103A7ADC393C655E043082015DFFD5382E38AEB4DC2EA4FFF190DE12232A0CFAE1C9212FE08D41EBBA4A4B85CC6D198ADF4FAF24EAE5C069D6F8D30302121A1DB1B2DD942403793EC6CFFD0084759AAFCE495E8257F5D2DA7A8119866902BCE33FB8759F699F7F528AA6BB017201B35AD59DA4C55827BF9FB8F5D7850A89F984B2B011382C1DFCCAA03A655CFF24351794A7E33A8FA5C5B731F58D019A9EFC83591D233B5EDB91179A635516DDC11FD3DB11694B85513ACF9FA4C6427BC7D58D1DD8E075F315125CAE9008018B17AFDD7129100C9BBD6F3142B2A5CBFD037F9AC8D9B29C619E725C3C7B7B707321BF1FCDB814B57490BAE7700F510283DA5B84C540A668787D76624ADAC01278EF5087F38D6BF199C2401DD4DF68D2FC502D93CC5068B42192F0FABBF62002E7111C7B0AFF6A90FBD33FF9566E224D31174E1F2B5253F6B06EBE464579AC35E66BBE1E11CBA1396D3A96D2A34BA6004A66644D20C77BDB4270F2A8D55A73CA4C190DF692D16DEC537D21E47BAE7444A094F4545E4BEE3A13778CD14B57AC00417497AD9F009AD59667C96EF79E6B833F2203A3B3E5C3639CDD81100D83DE16FC45E3D5B50AFC607BC8B9B36B253C0283E026D5FBE4DFB77B9CD5959B37AFF6AC535F7F261DD3E0F4AB896F33C77A78153CC4E693719AB0776C371A0036A00089ED9D63248A2049EEAEC7C9F6C10FBA94DAD145A7FEB1DEBC41121F3C810C9CD493599927F94E8A5A82CABA63628B025DD8496D70AE9FAEA9A8A356A983D6CE5A19FFF051711EE34F799B90CD0C6727C77F8883E5BCA0FD71775FB391806E00 -smlen = 1253 -sm = 032FB4B7B277A71C9CD2D0ED00F3D0B057FFEE5ACB056C3E8600B07639E6B6244002362418BD00A3669444B86F00D595A806CA00296E91645367DE794CF42BEA0126BD565B925E802067A2576C00DCA2BB876718A3DAE18DB1BD00EF3E85BBB7EB75CEE3AFB15100F0D2E69C6171FA46C2CD4D1700AA25EBED33FB41F50CDC4818015BB687018886A40F7C750EF30182159E03C44DD93F53CA9CBC0070471E4D1858030BFF49157A00A172A45F8C067BE30796A5D601E8C5496262D57E02C54922D200DA2BC1F333FBCF70693274690001B1F8D8DC6E1B412C29AAFD685CC55037E455CC58EBE67B8615100218FAB0A8C04D77CF036DFFF50028312CB5AA4C6A1B47201A4AE70856ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED - -count = 30 -seed = 1787C82DA9F2E6CA9ACF7D6CCA70116A1724902C81EDC1439F332C74807AF2BCCCCDC7AC1788BA798520B2999F39DC3B -mlen = 1023 -msg = E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 -pk = E6BD469126B7BD10562779F412461308530503F6335C389206913CBF4D8C84276CEB1EFD13279A2912A4EDF2CC2F4E038B67A830DE7AE358E84BE2B1723A14AB1A721F63E805D7A0C3DE64E7B71C3CB71D0767719CC36A1F20587AFF98974700 -sk = E6BD469126B7BD10562779F412461308530503F6335C389206913CBF4D8C84276CEB1EFD13279A2912A4EDF2CC2F4E038B67A830DE7AE358E84BE2B1723A14AB1A721F63E805D7A0C3DE64E7B71C3CB71D0767719CC36A1F20587AFF989747000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B3E3840484DE1C88342B2DF37AC6CC905C32FECE6E7E58AE690C0906AEC2FD0E1D73C41CA20B1FFECDE52DDC388FAC1960818D725C5C1E60E6D7EF46994C1985862C1C00000000000000DA4B645B7B4E845CD705657D29EFDFCB2D2FC960DEBF7C75C83248611DC39FB5109BD36C5C28F508CA1E09B06B3E72FA357FE1580585C5E33817C4B442AB831B4505FFFFFFFFFFFFFFFF0E3E4E813E02302E7BC2039861DC8D0C851A9F613BD3531650A6B695A447A2DDECE88FC9A16C0B8767F47AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF039A9D8CC80B2E22A10BFFD322179F6CA9C7ED752D07D7BDDEE41F7A9E276F9078644BAAAEFD26D6861F0801000000000000000000000000000000000000000000000000000000000000653D2DE8D0AC453CBE55FC68B2CB0D2109EEA7DDF4D4B28DC6F594171983EBA5734B1B942E75EECED4EB724E4D9438007B865893BBCB10D73FDA512B2399935B5BB184811B767E8F4E0568A21DF41AAD3C977B0B38F8D555AC44A2BE7FCF3B03EB58F5B858BAD39FCDA11C8291054DAC515BAF38BF97FD4FC704B365F6D1010BFAC7C48EF9B5DAF53139B879F3214C02945B2DE642DB7566C518C2C532B316298EE662D1BCAC0AB139AE1845338E62166E3E4DBDD54D031E58E2FE3F6ACCE8009CE0B57D99940106BF6CA3E8F90633A686663DBEC17BA1CACEA98CE759AFBE764C3E592E5B56B2A17C316903163C87021DF64D843AFE02AAD5EEAEAD64C69B2E05B1A90400E9CCF826B4B9403D2BD61250CE0E9D46F5B14D4667FE0823274C00B35E151CCC094E1E11B403F6E861AB8C3D4F01A3BC2DE7C2899CA9F054BC4064F1CBBC0501A809FA9E22EA509FEB5703BED23687731CF66B0C9191D658EC17FAF25998BC3E21C995496A309011B0FB05F9455E39A1BC573CB0514CD8D70A9601414F36F9641A59574E90A12A630DF2CD3346A94212D02B31858EAB51431487F9C6A3BE2E7CFAC1139809EBAE9089A2008134C29ECD5DECC876861D43D8DBE67B3863145C9F0496538D0D225DF9DCC37DA3829BCBCEB5130BE2487C2E7CF07100AF8081D2AE1D2FB732C66BD5ED704A1841B545E649BB08B8E053CBB479920DA93DCC470076232455243ACE71904CA902834C83FC3127A239ACEBADC7EFAE1D24A971068D2268F25E723ABBDE2344E699E8FEC2EF9893C7D2CAC9611A0CEDFF011E13EF8F3709ABDD672040C4FBBE0333AB3550F59013BCC8D178FF096727DBC8330C156FEF3454B132EF68FF7077A20200DFBC3C35AD6A7866BBA8A9311ED518BF167D518EEDD1AC59897FC2048FF88EC659D751045FBD123A1D42CC8AE32901 -smlen = 1286 -sm = B418B142443DFCE789DCDAEF00BED3E7D1477CE22D94B36F06018E9A13494482751371153E6D014330BE175DF2E3DF56CD2C4300A9A30A4EEF8909E3E859CD1500077156C9A3239EB15B89B69F00C82433DC09157409E626C76A00DD150696C783AFE8A03FAA1A00D2D3A118EA6B5CE8018EEA0801326B442F072EA3AF0AB78445013AD640429C57F8546CA3BD480138A4921342EBDFFE8ECC95AE003B9FEE335929070A6549398C01A1A409041E97249EC67FEF93010126D46C0870FBD8179A65300121C1F2B477A679AA30653D2601005F8E48CC5D7B512A66052E34BEFFED65EAE6073D396EB908FF00034033FCEBA6EC68767557A43101F85752048435E47829BF4305D001E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 - -count = 31 -seed = 9E6E12F025B2A57B0F5A3A9FA70396FC332E1802608E5CA07CC4FBA922F1FE5DEA6721B96F1BA2BFB97825A19F08FF2F -mlen = 1056 -msg = 9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC -pk = 0E244EF601FD2E9D2D29CE2FC29AE6932845432EA6928AE6DA09098A945B0BF86F6B21C378029F44479A93D77C11A102859DD585CEB68379BAA8FBE6E32381DAA5BB2F593876DA960761146790BF019C9B0506B92CC63784E070C77B5D8C2401 -sk = 0E244EF601FD2E9D2D29CE2FC29AE6932845432EA6928AE6DA09098A945B0BF86F6B21C378029F44479A93D77C11A102859DD585CEB68379BAA8FBE6E32381DAA5BB2F593876DA960761146790BF019C9B0506B92CC63784E070C77B5D8C24010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F46E2F5C8F0DA12A26C39F811968D62D51FFD3547078263A6F515773D4651C52697059F20B0CEBA1D511CE598F3B008906FE35026C7FADD35F08CBFC5904BCD565C70000000000000000DF8822F0CEA675D761B7AB420237D752DC91386C81A75E99E0E7DC9E67BCAD804750EA79975F17960970EE265767986A9F1F3DFC7965C41281200208D8B0BCFB7341D0FFFFFFFFFFFFFFD778975A9CC75015F8008802E5936A8FB8F2E1E922A5A7AF42FF503E8F570FE96DD07EC932FC1C070DDA240000000000000000000000000000000000000000000000000000000000000028C097F68B2D8C2157EA0AD6B377D31389DDEC3C68301BD7807258CDD43AA20A2309E9FF53E751FA10B37DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08C857B9CB488A9506DEF23C09DFF5D935150EE28DEB8AA2DD825BF27D8601F1A47B0DD9142B49E8AC070812369FB002EC7B61BFA9414E5FEC867E7E757CCAE8B6423C74B50AED7B6404A4EDAA3119C450B0AA6F0A79077A3CBDF917F1280D02B21DC75C7848FD5947FDE86395D5AE58297E974B0E34927626B8B5554B1295ECE5A45AF7E0371150DEF630FD41CB0F0139940A6A9CF29DF6528C36C659269E6784D0D2C41D453101443899024C2CAD0D7E4A4B4F6D90C2852B5B2BB6CFD01802DF311E021F66F68DE0A422E21F74FC73CD00A03625ED13B4D5315963DCCA34475793F468299854F5A2A11AE0D0059C03E12BE1B1F60D09409717D9806004DF8CFF7CB4A2F3D92A1D7A6A36FEDCD450FA4936EDBE505236C555E8487343C86B01CECB8FD236F487DF093B491B6FDA6BC45F686735EE577E64D3044BB595FB12195DFA7319012A0276DBBF35D4EE587E02D51F0A4DB151BA425C3A1806E2AFA5056A813FA8B7E727196CAC1691795DD5100F9EBEC285028A82913E9D55E982EE00AD096FB1A1BBAC41434483359395ECFF78F7F70236AC5EA7DE78DD8197EAF403B434F165E652C734B147847B27AB4A0145EA17ABB7666911A2635EF53CD70DC4F1B10E20540C628918B3C61E34F7600A24EA9AC66B987C74B82685F783455703FE3A76D2F0026643AEE93FAED58D4D179672A1CBD6A2E9402591FB394FD57C8BF3A0AE7E9371532F19F59B124A902600B869E96B0F1A61EBCF3220B396BDC15826D4534ADC91D59671EA506E396A7C9646B5AC05C4A8F029C0E3EB46E1713E03027488E6FDB5BFD1862E9F61B3FD1D0B855D3F907AE138B1BCE1614D5454D45D1F0F710DCA2F48A7B1268AEC237A0B00974DA1C628426AC2D78829E8BEB34C97E70B678F634BD2A0546C77E353715D1532207D5A8D003816E702BCCD1E407501 -smlen = 1319 -sm = 39A42C588D3D02D49025600A003074C5D54980A7C0A66B31DE00ED328377A3085EE968778632018A41F6A218C69FF9673B2DD4010C85AC378FAFAEA0949F5B40010B8ECC7E1FCD9420A4C20C8900D6B77018748AAFC9CA6BFE15007C401406022A946A97C25A2F01980F63FD4455437E5C1299B900160D6184FA3EF2E7DB507EF201FA69275AEF435000D9023C31003ABFB0512E2FF9621776200E0188390BAEED8663C97E0A2D020139B75F69601083303E2EFE8200683ABBE74B055FE8C524C52200E53B9CA5073E7A2E9C3597970101D7A420AE6DC70B8E7345DA8FB823C732E9266BFBA4AFE2EC2E18033FC828C4F532ADFAEE94766601488FDDF9539EB1E69E89C6027C039C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC - -count = 32 -seed = 569B8B9BDB707B19CD6F9BEB29F304D603C1509B9CF25987C280C342E870B1E13EFC7DD7E41DC85BF4F42D0493B84B0F -mlen = 1089 -msg = 7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 -pk = 12B645881B466A168B09C241AF12B0169AC97C529512C24CBCABC0F57973EB2CB91BD1F505A4D41527F16BB87E07E9025EE8A9A56EAD59F29D9A32246DB58216592570ABCD1FA4C58ABF7607F0E0027D35A61C597F648870093F46D480DC6000 -sk = 12B645881B466A168B09C241AF12B0169AC97C529512C24CBCABC0F57973EB2CB91BD1F505A4D41527F16BB87E07E9025EE8A9A56EAD59F29D9A32246DB58216592570ABCD1FA4C58ABF7607F0E0027D35A61C597F648870093F46D480DC60000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F54D029501322702F4CA993BF9429FEEEAC3353E1F5A766002C4E6C30ADDC2CBD88025A05A08B2065E2316F96085292BBC6DCB68BAF1A765ED82AA3A050E48AB8B0AF1FFFFFFFFFFFFFFE452A499460C92E5DD33233D9D6E7E9DD3258BB01C9B4420A53EABFABBA9F800351997CEAE6BBCDE9527A1C5FA18EA874C56069A860BD5A7A725FC04B6CB6CA95F26D3FFFFFFFFFFFFFFC8EA5EDAAB0370D4A2EB4767CFAB22DE9AD7E32100708B67D4E4ADC4B2CD84AAC8B3799326456FCAB1EBD3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE37BDBF687BD3FD642BF3FFC669329D34D5AC704B6DB6A2DCFBAE1FD0A49AC49CA0547290E72BEE4C5E8EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB50B3DD41891257E8D7188EE5716EF53C05F0608898A7D021FCD9277120D8D3FF9125A2C89B3F062AA4589F146CA7C007209AFEF52F1EF040B6FDB5B1C77379115882B3A5247A1DC2BD6E99D4E43000865BABC86BB508CAACD622B53641D8401B6506C9006D1566FBE0256AC0603292DEEBA0345C3E5E5700F7284B0E1948C28B2C8C5AF47D02D12B247731A884D98023952E05814E2188C96AE9DFC72592439092DCB56590EBEEE6B65763031825C7BA5F86E5CBB0147FA8A0E3F66D2084D0258BA0CB777EFD3A30FBC8F6FA6C35B0D3C8B847C9794DCD1551F37F667880855EF25B69F141187B749848FF5020A8D011E11CE37914760D7F3B2E81C42CEF6421CD54C6D0A46E65B2451E2623164A067F8F5D9DDB0CB5852A0ABA36188CCC002448588053D588DB7B70463022A16C0D6768623B032697A3271E98BDFDA9C5466B5ED1076F54766647C577C1B796BA7016DC26203A805A393AC2D14E5B4798ADAF15459C512DC25D331FCA4A288349804168EEDA7DEB457B8846F7A0AE620EA02F49F914732BA8BB353D4321739B07B72A4EAB39B9602FFF71068A5EDB397A48746135E922A513FB588D7A77555A02803BE770A909F0BE19C89A88412C498D4C00CA1B0FCD9A2252327CCFF52B8D9501DA02375F570F9A5043DA2F5F9364EEB020C4E65B7F61BBD02AA536C1A8E7F4B87D312259F1FBF5C83670B3228AC21E2934438CC724464A789C32E1891DEAE65025022EEA991C5C9EFDEAE3DF9C0A3872F8E3DA2F77665A156ECD96BC1C02512B53005588FAF3D40C405F1B4B04387F301058CA842BEA6E9FA5D12892207A3FDCA24C88665056E75A3000384590E793DBE5FEDC62451C5B719EB76EC47030841018B933C411A274A5F045E1BECA4C078B2ACAD4616C7DCF38721060723E905031040A1DDFBAA56FB52539295F15CB16301 -smlen = 1352 -sm = 6299A4B659E6C238EFEEE4DC00C0856F809A95D4080E49058101ECEEF1D72850EC39533521F9005F574E4C48E325EEEF44F70A0037A7210105CA7BDF2E424DBF008A7060E59E1AFF84F2FDA51D00C725B528563CBD42EB7AE47900C663EE1E57AF7933DBA9A81000C42085CD951D19BA93D551040151F123A9EF90F09A5A980A45007D6B859820CA1C71A7A5A66700694385B6DBD65A6C824850BB0104D10016050A559453A664AF007836774C459DBD0303D9D4E20108BBAFE508F54FF264FE50DF0135E221B2B2BD9CED7195EF7F0101A5F83347C8E350ABCC119B044068FED0DC3A9261D171FDBF530F02DA68C1D2BF08D965F50FC4BD0052865CAA8030762115D708F36F0B7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 - -count = 33 -seed = F32C3715B0BA8C1D0BD59F0645E9697DFCF9AEAF761A71ECDF9672215B9F138C0502D7214F6B1BB4D6612432F9FBED5E -mlen = 1122 -msg = 789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F -pk = 7AB1E4E13DED41143AB6320A5C6E1911B5E8C5DBDE42F560EAAB0A49AD507A347C8064D98EA81A5FC182493ED22E680268B8E41D5ED91D4E022917925A6A8C746398DF0C693A8267274ADE0B28BDA51D52A73760A7406DF5CD691FFF05C58003 -sk = 7AB1E4E13DED41143AB6320A5C6E1911B5E8C5DBDE42F560EAAB0A49AD507A347C8064D98EA81A5FC182493ED22E680268B8E41D5ED91D4E022917925A6A8C746398DF0C693A8267274ADE0B28BDA51D52A73760A7406DF5CD691FFF05C5800302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005337A298B3029EB9CE8C435329A372103BA96F6F53A8CC67F86B56A4B83BB5629E673C329765D85046AB3C23092CF39825946C5964164DA645BC19E1EDFDF7E1F5A2F3FFFFFFFFFFFFFFD60A1B2FA63328FC4E6FA49674473D07781D1D5AB6F54E0D327F7CF3B0A1F8B51B4272D48CC7F2CD3EDB7B2D4854D61BB5C8C82B15B4311819AE2818B477A9777FA8D7FFFFFFFFFFFFFF4A57DCCF3CF400090B5CB3605EDCDA9FDAA39EFBB82BC3BC2FA7D331ED490CF37AD04F18C20883C5FBFE4EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D90AE949FDD3CFBFCF76BF28944FB7FFF1F20A2AB811EBA3CC90456059FBB37777AC51FA9AE68D8A80A0801000000000000000000000000000000000000000000000000000000000000FC167B48A3BAED5EB78C40B3D8424F1CA4A6638A635E0C5154690C3A39710672101B391FE32EFEC7962CE7575CD93503D17D09A97F90BF04E551BAE145C445D9AD881AE587E617EEFE7BC1AFFF1D30569E6D5A6C1E1E9831D8938FABAEEE48018D379FAC60B0269FD04514BCFB95BDC0E744808820B9CE25DCE10FEB60CD44367312D0BB9FDE6485AD46DA57D72FAA02BC3DDF77F5FB6B570C64493B34D9C50783329E7052FA9769D56233B41AC153310E5823EA5062EDC06E83B5FC86125D016AC74D8F8D365E4399BB08F0664AA80C5459570174155AC7557EC4821796EA0EF33690AD81A6EAD762E53C977EB83901C7C82EF34A54699BA21092010F533C112453BF9E9D819722A0F3C6F3E34243C0CC3180C9E25F5F45B31CFAB6FD806A0063AED42A6C58960A97819DD075CDF1C4A054A520E0734580945FF6A6026D0FD464108313BEB32594014EEE3F0F0E2B02AFCF9470F5DD4377C542968EECF9128BAEB31A977B4E727BF70892C34B61C92F0BF618C845D62C9A4F282A6B1F1B4C03568748C569B6A7E099AF3B0621CBAABCB536D9108B2CF08D6847F97996E643039A08707416C3C8F39271B740B0422603462103DD095D440D32ECDCDC2228A65F80449C9A007EE5A1033FAB94988DA4FED45F49ABBC2BB3478C0D6304401CA000652769D5EE0DC4C5E639DEFA3530D4C854200B5B5FDABE5BC132D39198AB7AC992CAF9EB7238B3A0B240D62BBF5B8E00E6F8F6C7A963CAFB50283D0EFC44D6EEBC16E28608CBE776B254C1F1AA2D58448C658F6B3966129A6E7D09626AAE7D0266BDB950CDDC854CE5247F830FD7B77B406C5C9DBDB2A4510045858B634DED92E9F7314B6F50606541B86B8C177AA001A0CE4EFA4CED372A023372A9F8E73C00F5353FBBD8621EA34A5F5FA2CE4741E24D3B3BB162C2179CCE93788D43E32903 -smlen = 1385 -sm = B4E739CA8A30DD47EC3B30770103D348810DE85E4714C9B530009A312951D157347EBFC7311600DDA1B63E6F2907520563AF4C00C58E5B6F17458EF2E1BFF868004E7D4762142797B09DE0447B016896F5725195D9A10EE0A66500FC9FC4DBE13FC8E84F3CB409001FB716C66A2339BDB5B1C7A401A92DF2B681FC4748B75C411A0166416F2B5C70272A83C3FBEC01E39C5099A024A3DAA19C5D98001FE03DF89763690DE98E70610083549043A0F806229575D8D800986C71D1F235D3CD99F52AF20091AA033B1AB9411AEBA4F0E30000897F7F4228EB765A6CFF4037C9EABC37BDB4778FD02B6B065C0101E648E9BAB7BF1B111743A050001BD787031D12649037FB22BADE0C789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F - -count = 34 -seed = B0C7530A52AC9F561C2C14548D3A5F5053396B738EA1C7A5190F5AB01C9C38719C4DBE856E42D37A114FA24FD5DF5081 -mlen = 1155 -msg = A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B -pk = F7A6AA7E85E12180E2F0B9EE8ECC77D2F08D13FC8756EFFD322A14B1FAA78CB845DAEB81D0253663890A1A7549F4A403C60EF486D7CF1B1F87FFEDF11A82E604A7E421C7F255D648F0DE04B8B5B819EE5CFD705D3535B7EC5047A7AD04482C01 -sk = F7A6AA7E85E12180E2F0B9EE8ECC77D2F08D13FC8756EFFD322A14B1FAA78CB845DAEB81D0253663890A1A7549F4A403C60EF486D7CF1B1F87FFEDF11A82E604A7E421C7F255D648F0DE04B8B5B819EE5CFD705D3535B7EC5047A7AD04482C010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F1B8DCFC18CF48204C0F71515B780245554904C1EDCDE8619D644B2F776773372D051B13A5209D2EF9B81B7A9F8E815036B3CF6021E8A4AC7158B9BA5ED0DC03D3FFF9FFFFFFFFFFFFFFA4DE43668D67EB8F0AEB0E5D71D73BC494FCB0889F9418CCD208B62C3EBB117E40F6BDA9E947A65A547F970BEEE7FAD43FFD94471434A543F6B28E7B734C09CCC8E9CFFFFFFFFFFFFFFF4C3CFD2D0A978D0B659D28FFC131714CD1C74062E3A1895DA7F40E460FA667AEFCA0D900AA7520A83445B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFE965385B71B38139A6DEB62C470F2929CBCC723AA1822F141FCEFE4694241EEF3AD8CA7F153797BE29C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE941F2C9511742116B63DE0E93F3028594A39CB7FF8D593FAC6E7238AD1401195594F4F9AB20A3E2BA429E97027310029F2B3D08497D8F2F9F949334353214A068BE37E9D5C1EA41132662065398C732BAB55CDF2B8250D80CF1D29033C09901ADA120E87500B73D7BA91A84C77E32D7DF6EB65F16CC2A67CD7603FC15FFB3BBDC138E132694E47197A4763E8C3EFB00B4C47597D60067868AE3611342E0C572CE9B74DA8DE069187EAC8DFD0E129AC0ADA78ED031F974CD47998AC6F4BA0301ABCAF7EACD091E5FAE8CEC0EB4A07E8049EF9F310F34A95BC98092F0792EC351A5971EC3F39203B7754A89991D6764038CEBED1133FA1DDBEF084B3F73F2E005016757C3CA4580A4F129F5BA494C72C8E22E3057F86A052F623EF9E4C1ED7202C5E95458D47BCC4B1968199FE92B26D8A84CE21FFA9176D59D40169325377F02ECBE84AB161AB9EE79067F30E0B72103C4A6554E11B0B671BC09659605A40AF1BB439E6C714CAEE96B15F09C609BF74B91380BAE73B60F720FB626CFDD88A801827869669FF58CB6B15C666599D911089F1184A0D5D3FE162E5FF5F12E2EB186D0FBBCADADC63760D91F12C62E31A30175650C404B7640D7CB35B73EE8D746B8189AB73D4A3F3DFC3743D4A9056C0898EDC0B3D1A5342F244441FB377D22FA0109C10898EF471D06F957EA15C2251E6D0FB13B7E0B4D07B2AF66FAF511A41A6A77D31B759060143B04CD5442741F1D01111A2C6354C27642D82CACA9D4D776F5857B9D0194262EFC11986539557F504A000F8F31C66DD3CF8E689A63DD995C01C852D86127A71C3E056176DEF84C9387B90B97C908E2367C0A83030905DA3326C5B60639B14D10208C61DDB22D450A01A37135E449EE9C822C3277B13B650520541818BA7FAE06936DF81C7B3C631752BD6022073E55B83A521D263083F34F01 -smlen = 1418 -sm = 746BF7E4E896E5C3F9B020B101775EA1D34E67A48FEF4C375F0022FCF7690C6C0110A59DDD54019076716B946A767AE1E85F1A012606312DF10D9C5FACA172A4018E052DF4B390FA4885428AB300359018982CD3DA152DD5D2800088CFEF96F1EF0B8B2C44C42300B9EBD392EF5145FEE02BA69300801378C4CB62DEAB3BAB2CDA01CD9F357ABA6AAA9FB25B54AC0148267524B844FCCDF74722B9005C2EAD2F0E0266F1F8879A17019DD0BFF2E0AA68966A79D88501E9779C24C5DB86CC73D5A3350081230E9BDA01A4B4A24CB14100006732E8DA01C7EA68A5B1294DA99EC361550B282CAEEF8BFDFC10026A15000C66B2275CF0B6430500662D60860F05D7606DB4D5FAE10CA4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B - -count = 35 -seed = B2FD7BFAAFB667C9DABE5915C3BC271EF41F18588666A6F4990C09D098E62DB590110DF6A56F08C5E0DE65B00F91D60F -mlen = 1188 -msg = E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED -pk = 4DE1EDE62CDB3E91B039D8F339E3FEED1B81D0882C7A0AEFBA4AB304D6919F63B431471CAD4AF1C10BF4E6F4107C8E001F1871DD1821639F8E2C532B00C521725CFD6C43FCD3853D4EC850095C5BD7CD8DC6215BD1FB7AC0C35099EF2FE74900 -sk = 4DE1EDE62CDB3E91B039D8F339E3FEED1B81D0882C7A0AEFBA4AB304D6919F63B431471CAD4AF1C10BF4E6F4107C8E001F1871DD1821639F8E2C532B00C521725CFD6C43FCD3853D4EC850095C5BD7CD8DC6215BD1FB7AC0C35099EF2FE7490002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007987023E2142B83EE0615FF19D37B8E62DAB3E7B2BFC6934E13B54C275056B674E2AF8187B6F2F0D8DA4E123A0C57DA76DF6A2D62142858A03DF7D307F93BC3EB9FE230000000000000034237B62FDF5F0483FBE036C4DB08BACD0720D5073ADE4FC1ADEF807571DC64F29C652ADE192514B675227DD409423EE05139E52F044DAE546DE74F65125758E38501100000000000000ECAF3EC0FC4FCEB08F9D255D0CA705BC4B28222842976BC81BCDC919C4075F8750A6ED8788D0B06D84D1C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07D466BDAF5F1959AEAE0F96EDDB6384052FDEF9B4D522F06698BE9CE65B355A69FA9D179C5354195E35D6000000000000000000000000000000000000000000000000000000000000009D5B10FBCBABF4C2B1EEA26D43E4BF230FC8D7D7BEEBA6A6EC970634537E47A49208B9AFD4D8646A208C4C8933DFEA00EA5E144E5F75338860F680780E8464A80C34C516C2A344FD7E10E26E0657514CB3422C12090316998D9B658DEF532D02E565C6D98F57031B042DF00B7EEB2DB4D49898D4AC7734A4553F14CC810679FAA66B562EEF72F76B76D59D3CB5905A005C6B7834919415B4928D7F03D4D6FC5B5836C246DA52F4A83DB63F4556AEF1C39BAAEC5411416426A4FFC31CBFB2CD005CD666D7051E41232D1A05A110FCA031F84DFE69C4F6C27473B6FCC863B2DBB174BD3883D43097A165E30FB9B6D7FF0193AD72C10C9F3C12B1EF0416878570D88F419D0CA486ACBE64EA1322218B29E186D655CB9784CD3B0FB9577554078A006B0C2FAEF9ECA6DC3CD594D2E52F8DFCC9A65A936199BC3425E51ECCF476F8FF945597EC8E7E6A663B16FC7AEFAEAE020886DE010911156D43899BB3792324A1409F42DD5EB577D0AD8B1D06029D69944C367180C7EB95D6AE39755B50694400A55DDB641233AF55696F8F0A8481A240CC1D4F746C4EE8DFCD3F69C75ADC47E236C91F1E41D153851BF032E0268BB903B5EBE6343E97CE109E107B7548EEDC155F096F724A1D862BD0378FA866BB3898CBE6A88813490E4DD0D68C909456BD03AD2CF32F82C407C91C9FA8B62BDA1721A22124A6E06CB19F0B069E33BC773A102DDF6FB67CD8F4C73823397B35937800F6570ADE073FB83C21BD50EA89A815A91B45809B84664CD3047A3A8EFAA88FB96AF47E9DE51E7E6246153F5DD9E45B003B736AAF50D8BE3F5B8889E12591206BB550D1651F19E957398A2350D90DD401A0E4FF007C01A20E948379E91FA59303F6562E5029EB69A6548AE45ED032BD3996556BCBB366A3F369966358BB7339764C53F507885C002A136F3E4C32A89F02 -smlen = 1451 -sm = 64A5F9E69FC46D6806BCFD0C013E07CDA1879CDB3BFA6D5281006D89D139C9D5B07095B15E65018ABBE3F419C7143FEA8859C00168E40B9E8C43B7506C387249002218733DA03379ABE989138C01E7D2F788D26925DC180EB88A006EA34411E197B2F9B155E60C008A63C4BA93F7A86739A58A9C015C45D62591D432BA7CE9219C01B82E317C5173BDE743F7248100FB760462A651B8FFAD9BFFB40051FDCB72A1C37D6956A4522800AC9629A9C5A1C7FF96610CC900FB982DF14F77422388DD48C700528430834225A2D5B750F114010173FED8B2D251400742036A7A7D7123E1A1F242F3629DC4DB24120129226B8E2125530E69D06B55009C03EDCA6B7B4A925C81CEAF1302E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED - -count = 36 -seed = C08E846A8E039C8655651919A8433D475F494899FB617DC3B4715DEF0C992C195CE38158B7FF40E0684B30FD7E623265 -mlen = 1221 -msg = 743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 -pk = BCFF8131A36AB271C13AFD573AD887219CA9A9D965D35F57C32EDF64CD03C4B3466B052AA3434C11E52A3E2519C68103F032DD41F16407C75A706C5AE5F4F718F768498617EF4A3400CF9CE7B2DB487DF9BBF3428C542CA2CC1D42CDF7B2E502 -sk = BCFF8131A36AB271C13AFD573AD887219CA9A9D965D35F57C32EDF64CD03C4B3466B052AA3434C11E52A3E2519C68103F032DD41F16407C75A706C5AE5F4F718F768498617EF4A3400CF9CE7B2DB487DF9BBF3428C542CA2CC1D42CDF7B2E502020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012BEDC55490052272216E1C469AB1F23D9C5A5FC15EB9ECEA4580A306073FEDE9EAB9650A4A0A891810B4E622D85ADEA4B72EEE87AE7A4AE1A63D5628CD627864145F0FFFFFFFFFFFFFFDD003021AAF724B82229A42846DED7B62D7170C1015E9814C0B999DFFA106A0590CF634D7C7404E07F3AFC68ECEB0D16A45681897FB71ED1530CA44B96D167DA3413D1FFFFFFFFFFFFFF53FF97D994A0AFD65A2164B0F640A1AC146696D9B549E194BFC72AF12161AB7995ADBDE2AF885F9D5C197E00000000000000000000000000000000000000000000000000000000000000BAEBE4EEEB9552586EDE7307E76685E52BF9E898F1DEFA47CE8E6F867A258B362EBF5351821BB269E0B02F00000000000000000000000000000000000000000000000000000000000000A2AC39B0B88EF0608F97D438A8811F572C97BEFEC7CA8268EA0CB3C9F58BD6BE61DF04824E5E2AE81E0D0AD7C494B1008EE0F2EBA6D8E0080B0E31402399593CD10A7EA4E30451CC048590E15B05CD342773E3345C48906DA8213C63CF4DAF003EB9F4762E2190C5E8676CA0960663A0B56AA7158CCF8D7911779B294BFA0B2999760E72B8C301069241EAE1204925038C3A2708ED8A94DB0BEB709B2EF6D2A118587AA3C680ABA42C30162250D07BBB5C2C386763648B6DD7C8C2FB0DE11100164BA1707892E466BBD49216503C432B8B7E2BA2B831F334ACED338CD75C7D0B3AD15924DA8DC5A269CF4DC8A0336C00F560A10F80904EF6B31CDAD4F7947DCE5842F20D30DAD1D31526B982532B81799049A8230E353398FD4355D52D84E600F23FE4A55D39252C1D68226EB6A4A9075CEEF8FF8C2392A43A6096F792CCB5778B54A337AC943828551BC14E746D6701BC538FD6470227BA78A4ABD40E61F53CF5B2AE7D92618DAF393105CAA4D37BE17EFB87BB9DEC87AC8AC5EB1794B4C301052084D5324012DBFC5B24AE031C09CF8A5C68C907537D88B7D1AEBFDC67943E7DC1AC683D41B251CA8AE5AC1A8EAE033E45CDCA4E885A97CB54FB8E8E5386022D49276331CFEBC4A253A0716F9020812BE5E7883E63A1F717ADE9B84036280351A550B4C1B66D3C8E52F14263F948A0B4D8437672754FB58B5BE46D2F733D9E108FC48F2B631B75396720586AD1B30217AA586274AC0E6874A832E83637562F5272B1B45890596E01FF27A08AB025D42966F762C6728CAEE5904622E709FF0207431892773D93ECC67EF52792F37842DB3432143A2D25EBEC1D86CA43B8350A32BD83BE8E5C8054A2504EFE15D419014BC5B353CA7642B82137B14C70A81F84844F823CECA7C9C3C9B40A88726570270B2B4C79BD92DF573CE6AD7DEFD9DF02 -smlen = 1484 -sm = 113E6656F9928DE141561EC1003900707D25436746DC7C8C5200EDF5A67E11EC85A9E3553A15019A140C620A8F891008D6EFEE00FE4DF994AF6894CE0BD340B800E40C0448E6BB1189BE87ECFB008F6492B0FD7FBF92F996B5A800377FF43F920D631DCFA2265101BD0D9439185B762688AFB4160132156030137FC1BDD2555ECD018D8A9D8E05AE70BF6CBBBCF40080AC0C7CFE7BE4D64CD99AF50093542D2AED6D826A3F03E76C00B8ABAC943510722581C796690082C4E9111E059F960F33FE90011FFCBD0CDCC6233C9D9485AF01010F2F5747AFEF24E0BFA77A1F5D4DBE109DF2A235BA7E0121E61201E06FA2D4EBB5DA2A874D091D0085571618D1D199C0E54D5CD90300743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 - -count = 37 -seed = 1D9C060EA0408A068BD982D9694D39D02BA5A473378F6F9F09349F686566F331E767263FAFF5DC0E823BB6F648843876 -mlen = 1254 -msg = 3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 -pk = 531E1A910A4868D349A4174674B39AC0B2471061CF75DBB291ED7BAFFAD4BFB61DB2BA1BF04A823B41B334787B23EE0200DD6C8169C424F1FA3CF7651569A619133D36DE8BCDF828E2C16A262363CF3F6E8350996C09122367D85707AFFD2A03 -sk = 531E1A910A4868D349A4174674B39AC0B2471061CF75DBB291ED7BAFFAD4BFB61DB2BA1BF04A823B41B334787B23EE0200DD6C8169C424F1FA3CF7651569A619133D36DE8BCDF828E2C16A262363CF3F6E8350996C09122367D85707AFFD2A0302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E549A3EE86F6FD66030CB6ED39B7AE98EA995BA08B71F72F9A84BEE548C933C9299F3B927AA56CB8CADB79B45DF46122389EDFD48198151159D8608DDEA7138C14BE4FFFFFFFFFFFFFF4DCE135D29C5498DD095B0A1C97448781A379066EE95140D46BCEE6BAC507204F7EBE3CA6B44B48C02331227BE9379E456FFD6396A58FACDDA62C6666F5E86BF5E7C260000000000000053540295DE98467C6BEDEB40C2B078BCD32F9CDD385E2AD92BD9396D288D992398214F2364F811FF6342D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42A4AA68789FA4F253B1C15E6EF32041B70F664A95234D595C5E79981938B17F2D41B88069C556F758D7D600000000000000000000000000000000000000000000000000000000000000C754C02902BE4E102C6E4F249FB42D1190702887BF97CD15EFC50D195476F038592A6FAB1CBD8EF354B2851C34453F018268FB536C4308965312D9A94AC324CA49FE5577AB485F7F0196E1D9161C30F77552C0BBF9B90BFDA0C87F88AD3930019DACD423396A412523E83B065CF6B0A3AC77292D5ABE6034418E5E1259594D8FE2E9A1EC973435509F66DE18F6D9C6002D528872A7E87BE3C298EC535A39C16CDC6857C836F81CBD14504015DCEB1E94A98A2FA028891F603842B63D9B47CA02DAD5A031133C305DFE79A559F88B7B16A27BD4DEBAF5695BA99A1C8487EBE00604C00C10178F0A1828C38869BB8D9D010DAD79A7D319CDB2F79CAC09948045C05183169897C0A08D6ED28D200A0A7FE7D3C25FA482A116965CF09D55E8138C0006B2259336482D83DDE19FEFB2435A9C66BCEDB2A7D0FC52994A5AEC110CA991941E111D121B3835B48C9868519200031417975B7430F2FAF1A7A32C70F6C2BBD78A6267CAE8A66F559298B0A320DBFD56A7EF1085A1A3090CBA9A03871958010EC38A3E4E0294C3755D14152BCF2F752122B2F9894619EB6AB77215E4BD257408B1790BF679585379CBAC416A4D16028DB1C82F199FD36CAEC498356F684F6D27050C1CDCFBECB3A385A11950E8E48F55F743FD3EDBB06007EFA14466CDE202BA5CA206E8F2FD153121A7FAFD74C901B9EC0BAF377E0A9A5CDC7A14EA3FD7366BF68A594BCA69B7CE89B258D0D6D3024130C1234A94A8C9C4656BCADA0CE4127220BF2DCC89ED22C0B024D00390BE5EDA4A8644E074E16857F24C7E15DD8E00E0CD02D32CB426FACBD95A5831EE2C91F1E13DCE0F2453340719B1E954B88D12BB48BFF730A96615E7B4938C983FCD03B2DC2DD7C6F73B89A07F1B1C97C3C606896AE388A31C1D0A28A09800D226BD3F0AA883BEE9492EFDE2F1EE5617793003 -smlen = 1517 -sm = 1F07E916BF9A5D1FC58D95D4005E087A0BFC0B1DA1AD91A41700F4B5B4B5EBBEA443155D74D8003828A89B1AC5B82228317ABD01FCC78BF3D63F28D99825A0E1007D3FF2937E5472EDF6FE642400A9CC1623B90FBED797B08D6F01334F066BA3956672DCC0549B011AD58F4025F5A3AB2D1C403F014B61BE724D1C7F1B1655AF7900D23009957F711FA484E04619002BC98FE9FFA0D291A1B714930041F7F954EE43DAB768332039011B71F95836C61B878BB3920F0143BCECDAD11D085CE08AF0290164899700D8B7C55A088B1D2400018F5026C306A9E398D0AE43B3A90BD7BC1DBB1A3150C052A3681902D4666237D9F703DE659D74F1012B41767CF15842380DEA45335D083382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 - -count = 38 -seed = A4563D09AD21D3916BF4636301F2E64183A8F003DA186753D7F2DC3BE0089BA09C62B8A52B72C2C8451213606801FB29 -mlen = 1287 -msg = 67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 -pk = EFD001F0602B7DA66828F198CF4E1B147E83E1F963CB52EF3C85BE2C3027BD2FC219BFC84ECDF6A64064125683327803594638FD484033B6867142000161F6710CA53304400B9017650B24AEDAA5CCB4EFCCFCD7FC0E2735A92C40689A860F00 -sk = EFD001F0602B7DA66828F198CF4E1B147E83E1F963CB52EF3C85BE2C3027BD2FC219BFC84ECDF6A64064125683327803594638FD484033B6867142000161F6710CA53304400B9017650B24AEDAA5CCB4EFCCFCD7FC0E2735A92C40689A860F0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003176055B8A14474CDC6B4C21B94D08A836C78A8C70FEB9175C5282927CFB5C4D13713A6B8EF1819EACF402B5B7CD62F41983371936D06F84278E92D3997BFCC57A69EDFFFFFFFFFFFFFFC6849DC57AD411AEB8884ACC30C17CAC7B48A4DB224344342E8689D81F5AFD365BE1F1F38101A66910BF48315C48319CFF4FE5D24FF92542BA3C3EB342522190799ED1FFFFFFFFFFFFFFDEDAC002A1617C57C58DB4E02CAFECC5B2DD6CFED33A0649CE2F87F0C2187BA7842475AFB97B6322EB084D0000000000000000000000000000000000000000000000000000000000000001135620AA24C1852BC082BAF783CB7DEB055E9F2421CCCD7E557FAB05AE648DD6567735975D44F25CDC37010000000000000000000000000000000000000000000000000000000000008A5A739A3790E3CA2D2E149800B0B028716598F9677B9A313E2B2AF652CFDDA765F1F6EF8FAEF6F59B046E7B07EC1F01321980F4486E3C5867F1A0D4CC16A123B8DCF4F96B4F4261D5DCA3E74AA9CFDCAEEEA5DD9D9A66096D00257CA7AD3A018AB47FBC4E30A31306E9A2E9949FB2A245BD29750BB23655C1C6E2A6E4084E93B28DAED8E0FBDF1FD9662A4687B90A00A2709041137347FE1066F57B60845CFBA8A379E21E5A56EB7E82361A5ED01D85636AAD04802A8CA5C1830BC6970A3C03F5A404D153D73D2D0DCA6E06ABB08FEB40045D5A97D775A2FBCEDB01749E2EF350BA395165C9F251BE9EAFFE7D87DE0296DAEC77A20630A5EBBEA148588F0CB3A9DBA2898E31897716E02F27BB7132323A053113F4FBC919229F8B918EA59402C8675DDDF78A3166D851B428282DD7BE8372CB991CFDCFE315FAA2CBB866313D10177AFBE3E5D371C6C8010AAA7042037D1DDE42F9AE60C8579F545AC3C2DEAFE6567F0844EDE98ABD439E9BC9581A99EEE8022AAF90EF13BF459EACA8B3420201CB1649534A5BEBD2B38FDD124BF253F205D11D9F54E04CB731662B9EE32959B798A6061DFF044255EA2B34E553D600F678714257CFFE79A0083D2BEE4A1F3DAE920B10350D79A59631D8E30FC82E0FB4A5437BBA7DA32765FED6AF321CD902C8508C7B4C647B6B80EE688F98130620732F707BE75FBFEFF63ACE4D23D019EC3A1775FA4EFE1F7F0653A2C990598F01E0880B756F1085A69D01D485B9A446FB1C04F9AEAED8FB0CF54C08E10674ECAACBCC530047CFF067BA428A4395550101642786AD562EA84930811F16F4DC421535F69ACD67B81879AACEFA841FACDE8AA9252CDF822B72A108469BDC22E101027F96D13F1299FB51ACF2920EB05539501E5C0285F8961F561790492973FF58B416986D4D7C7DB28A25EFA7C02D76E001 -smlen = 1550 -sm = AA38145A7A85BB7104B0CED50192A03A4F7B0472E43E5397520123D2ECB8E041BA477D4FCA870133C92D55084685827102E4E901113931531A57BA697728AA0F01D85A7DD50B74C546A5B8499E00F25A4FBC655E93B1E9B50F6D01AE7FFA0FCD1AE4F7E1A9A6820169D6CA352E3334B77E9D8B71017D814D83C63B862004A8330C019DA685921F12FB1685E7E77D01FF67F80B37EC6D7D301D04A701BB64469E9C0E883077C06C4600301DA9B3855F59B25462B59201B55DC3517A22D8AF9939DE1A0188065E0898C47E03C6BFF39D0000BB4FCB0F1D24857CCD555B696A5D540B9E37B5DAF17F8695651001E5894CD5008999F28CE658B7003DB3517B370B49E661D5BD6F7A0067109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 - -count = 39 -seed = 811A8A2ED2917CC616FAF246C5F9BB902E5FBF5430AB078AD6CE871CF8C160512A748216EFAB3A4CE1271AAFEA12C11B -mlen = 1320 -msg = 061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 -pk = 4808FDEFD4E1A93F36790F970AAFABE77F40C9F892D9D512EF72975444271DB887D36CBD85BCC8A0108B2207C4C0A1006C5235B91B33B5CE35B166FF24ECC2A7061EC4A29DAE93368901F6651A5731A46629838C3C5DD55CD51A6B4DEC0F9F00 -sk = 4808FDEFD4E1A93F36790F970AAFABE77F40C9F892D9D512EF72975444271DB887D36CBD85BCC8A0108B2207C4C0A1006C5235B91B33B5CE35B166FF24ECC2A7061EC4A29DAE93368901F6651A5731A46629838C3C5DD55CD51A6B4DEC0F9F0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007D4A70E465ABFCD96DCC7A17F0DBB3E2359B4BBA3E33A493F0D2E7171FF4B40680415F8772A786D7096AF8D65BDEEAFFB421B4C2D3C3A07A1C3F3617CD2D49E8F462030000000000000032B999589F73763AD949AFDA65D039746D54DC6CF823963B5BA9F70F9FAACC906A495E12413B722993012649BF6E621D72B5E5B353C8F77C362A08DAE27544929DCFDCFFFFFFFFFFFFFF3E536A72B761F6D9511B27B22A4F60C4FB850E6BA88F7EFB9AE7E392798E91D34CC673B4527777356A507FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D399F9B30AE61D7A87825C18A33B4E9ABD973730AF86DC46C9EA1541C2F041C65D7F9A4F31A3385CDC44F00000000000000000000000000000000000000000000000000000000000000794BFCBC62ED6E6027FF575D26499A54481135AD759FA07EC8699282421AEFE58F2C59326EB894C7131707C5A88206033328CA692C533F40F5A27F4AD98B7F293987091BF4379588E4DF7AD619CB02B50FE56A37016B12DEAD29E9841692A003C38A04D039F4ACBFD3C69E6BE71A5FCC3DA6983D380D2B2739DCB943C7AFCEA5CCF968ECE856588607181375D0DC7C0204EC5BD9815F1F0244AA993A8963B1BF578188DB5C334B0367CA83B1D4CBB907BE3AFB7A9E596DA7AB11F192E3D6CC012AD426ABA6FC02C2019F5C12707ACEDB5FCF5555EC0FB245F06E0B4C7381536E755361705AA35840CFEA11E2A2AE0401CB508FFCADC0B0014EF651BAC629FB3FE44B7232C897E805A40907210C0E8B880EF3BFA2873710453EFECFE35E831B02800039F39BD33FFBBD22E8BF4B639C1109DAA5B7816D8F30AB6D28C8EB9E7462EA871E8EB77CDA514B99E7BE8E8C9800B82F39A2BC5DB451E659B72A2F609203E9BE378476EAD3F0990CDBE27145725B7073E27F4DC505C01563B1B280255E025BC1D7C8E3FC256A38DFA0EFB163F4560A4EB5A705FF21311FB8475C58B061E395403ADD1D828EA76037273D84EB8B006AA2B14F7DF0D1713E364A6393DA4E5F42A7B4446168357F1019F26C11EBAF6300D5E4CA31C63EA9EF372B2F4B08250179E3623DABE67EF85F7C9D737C69932E041CDEEB7DA54E4309AD51DD6EADE21E27D339DE3808E1B7AC5AACD20F2C3F03D6B58344F3F5CF8424EAF4AE16FBA12754FDA40E7AB9D85068DF66E1C6684CC5AF9BCBB263B6C8650E81605B7E336103DD48DE94F49E0FF508D4543801BAFBCBEFDBB9239B1B003D406865227A00A95AE5FDBC10E9FFD37E3FE0426855E9A3016034EF566F309B45536F4DAD8D7210FE029B5FD0A0A523BE67FD1101B754CE9C71DD4ACB82BFB099F6D7726B9F7F0C01 -smlen = 1583 -sm = A28115A2070462969772A6540016643A37DD63AA9172326FD100B54ACE2A9A14C606A37DF3A8015EA185CE8B31EDE299E83C5E01F6B5388C65D50BFAB3C660290195728011241477450E69111A00613AE86F66B13B13AA7C69F9017E0F5C4799AE163F273F09A4017C2184200570796B6CEB6B5200125E4667488666D0C3510E750161126770214668928AC92E8701AD0B0CFA9F8511EF19D958E200EBC303810E860A644F12A31B012F615027A534051E565A870F00048827135DAEE4548DB4EF23006298A4874F9F825CAFBE2734010043839A0810FDF12215966F5EB07AA96F77DCB22565A99C02BD1703FEF11EA211D819A0EB2752D5002D0AC3F76FD7E5DC4E272FB0AB0D061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 - -count = 40 -seed = 41CC9DB2E90239AB5158A2628E7478D0B3512FDF84CD27A4CA5FE3119A455C22045F198C3C5C39F491FB975BD1CFF7F8 -mlen = 1353 -msg = AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 -pk = 1D4F35FA430B677EC7CCE0A7ACE49FB4E4440A05C38DAFBEF1FC8F6AB130F92BFB6B4394ADAD2EE7E3A256A149C82B017A35EDEA43A3BDD021B7CEF942E9CE29195299BA3C665BA82A31A5AA6CDC093CDDB5B20179F718DA2C79D8A99C676B01 -sk = 1D4F35FA430B677EC7CCE0A7ACE49FB4E4440A05C38DAFBEF1FC8F6AB130F92BFB6B4394ADAD2EE7E3A256A149C82B017A35EDEA43A3BDD021B7CEF942E9CE29195299BA3C665BA82A31A5AA6CDC093CDDB5B20179F718DA2C79D8A99C676B010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000391286EE2F440780ADC735C8C0923A6E6B23159FB1B5F89E0ABFC6C3D29AB3C38F6733347EE8210A144CB80F81A3AA4F9958C0B2F975EB55814E8C953C56DDE5A871290000000000000028C81A4C1302C18F7AACD29E5AFE62C302E67281549DE2B6DEE10F3225E4AEBB518C4F655EE9DC8FAD18FFC018BD939C4FB4103909459312ED93656E62368E405848F8FFFFFFFFFFFFFF307BA00DF1D5D80646CF65E4C584F252A1894627FB0E5F1725B71FE732F616B863882848FB4B7A26E83B4900000000000000000000000000000000000000000000000000000000000000272C7FCC26C9E91664D3A30B73C41C87988E44CE49595E5F271741D4A4A5C44CA69DB6328CD1584C3A9D67010000000000000000000000000000000000000000000000000000000000002F92D89E737AFEA71B974574A2D08622A117781B42B2A11FF0238460584B9DF0E926D4D938532AB4440D1DE7424C32036935B2EF535BFA854112AAFCCBCF5655549145E03A00AE4DE4FD3CDB12EA3DA2A78881804D7B4B862FAB71D68DEB210063F9E1A7925A46A33756D773D30D2C5673B181C668B5FE8FA84C075A3EE39369A4B3DE6AACF50072226BFA427C5DA5034F23DB66BDE60BBC6859A137484423B179E26BD6D9367C26441B23907C02A5C79C65DAA23E9A572AFFFE2B182A3C910079B0932F709FEAEF4C339861AC06C80368A6167D4DD915CB4D5141AAF1519C0F729541B6A4A90816675D2AB8B521D303567477FEB246598446229B775DD975BBD92B8E3F0C5355CF43A7B5BEF9060316B9AB4FFFDC546106DB11AD26BB16C60301577DCA6927FA1CAFB1339C8D5F742F0012EC2E28F6555EC884BADA88B7DF988A5AAB3FD43DA7F043C2B7F7EE5F90009B0E734F2519C221F420D10B73B3D661389531B09AE10FA8500C0C9197FAA9122F408750B71E7B38BDC973B65242EE0289D6F135478F9BF27329922BFEF2CB54EBC9A2772151D81E9F4E459F918D4F8BC5DF3F19D01BF2EE1192C902DF4B6D02F9F6F46868BB8677F78DD995D99426E30F1E85FE4070196EF1DE772EE139980AC6FFBF37A84679521E19908D956A530267A7EE9ACF218E80D0AB5A1FC8E3C255DE73FF34EAADCF68AB733B50C701ED4666E5BE5F454CF3AAFB6765C083FD86035ADDE512D29AF15E5D278D593DED0DA13CCED55ECCF439871BF6CF6012F1D59519B4F4C398A6E8FD0AAEFD78DF1CA302538EB218FF7760222B65F203494CA2270FA4C96D427A4144743191247513F7B0C92224CB634675511C3A0B81F54DE802CFF9A0BCEE4078C342E0316E0B72D6F77E64E4115B6B4D14B6371C99ED9F029A4ECEC220A480884CB0B41D2B896B8101 -smlen = 1616 -sm = 4476AFA0B15FFF5AAFFC5BA40128ACDE874DC04F64745603F501AA65C023ECB79335DD681C0B01104BDCB28245912F31FCC3D90028CF252C938505A816975B5E00CE3ECD61D68E393C9FB61776000F63A1020142904E19551A1500D2561BC6D64B00B388DB2DAC01369E527F6EA6CCFDDA48727900BB3FF62EC2572FED960C054A00EF7975956B7CAD2088A6633900859BF5A91BEAC31BD10B71D6018210560EADB811D7AF49459E007CA927297CA5063DB46B9B0F00DFDCBAA31F0C3327995B0990013B7138CCEDEE85AB4B17C4DF000091058D7C96026394ACF0469ABEC3695ED679BF29AF71B7513C1703744CB15CEF65915FC6DCD52E01D854F2AC5C09407A912A42BCBC06AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 - -count = 41 -seed = 1C13369824A3FDD41B1065E17297574715D9BD9CE5BB733D36D22C31B62BB1033989A604D78BFB1A0746BD4A2271FC0C -mlen = 1386 -msg = 9D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 -pk = 23DE594EE88C72B6622330C4D15A5E2E22C366DEC094FEADB45AE128530958A2F87FDC3A199E95227657463BE335F401FE5A436B54B93D5CE79EE8FD2EC26742276721A489EFB483E6ED2A966F9C45BD2EBDE3CF7131B9852AE00279824C3602 -sk = 23DE594EE88C72B6622330C4D15A5E2E22C366DEC094FEADB45AE128530958A2F87FDC3A199E95227657463BE335F401FE5A436B54B93D5CE79EE8FD2EC26742276721A489EFB483E6ED2A966F9C45BD2EBDE3CF7131B9852AE00279824C36020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A1163462944DE49B35BFE7645F4D8B39A6304437590579F9D6664042A42F464937CDA697ABACFA85A62B8ABCD5767618FDB965512C2FE8944866D0C0F6BC4CC87CFA15000000000000004E8F424DE15B56F14E541FA736B4A0C2E7D37DF70ECF2F4F805300481E0B2B615734C8E916B1DF5F940C71A2885BB7FB514399A9255D0E9591CCD3B462ACF29D2799CDFFFFFFFFFFFFFFD6819529CA4F710B4E9CD172BCA99499D56D115D564C7DB51569BE807D96CEA2D7498D4A335EC541957535FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF916E01FD84ECC2DF1E67DB390DB2B0052742A9CD2E8DBEF492C11335A6BCEA1D68E0C196A828BA3E4A4A58FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7EC5AF8D69727B9675EF62BF48D0BCEF336A902F96F2B8EF14ACBCF565B6BE024698C18D153E5CA6EE5A52F619CCBF019A452B69BF82568712369F35BFEB78DB4A82BB561BEEA3A9EDDA5E4B130C1C61FE5094668069EA2B3A048A0187387700A622F4F29B5BD6710AA7E6D2C38C31FBE4E4A940CB1108EEF3CC27DC56C61832D6F964B35F3DEEAB84D1CDE1849A4E03BC0647B745E7F6A8C0F410C99410BB2895F97233FE3B38D575C7C77A7BA1255A3BC9E93E15B4CE2CE63E5EA097BBBA008CF5ADF4877D5DBD345F8D5117DD8521AA78C02E13FCFAF07C60BE5C99F0BD2EAE576645455D8574313AE6700A55E702EED87FB3F4C71E26FDA40A9BDD765E80A05C74A40C854DC1E253238E55D06413E63884F5723C19F693B1C1C782D85F00005D14CB75433AE6F8371A51AB16D6F4E2351477EAE60B182220A004AB18F250D29D5E776FFC054EBFD18B9AC8942802F97BD0C98525B576CEB28AC878402357466CE99075299CDC11FA317618455A1B7D0A87C87F090E9C9004757D210B0702444DA04D1E8B0C7DBB205E8171620225FF2E7D83CAD0DB5636E222477F5BC23B77DD0ADDCCD2D87EB47678DCA591C302A78372C9ED25031F5E66034BE22DCC8DC4BB81AF481BFCECE8CA2D05CC221DC31C6DD507D21748CABA10E2769230B600D2AFB7F2C4BCF29B7A0C97702819EA8CAA41262FBC936B890123FDF70D70DBD6B85AEA1C5952D9C928EF5FAB90F3EA02B726FB4B6F1F241479E2F19A6B535A7D9D103B9835FCC15EC85E5E1347E922F0C44BB739AC223A0745E01CF35BF4B500379DA545E3767AB83BA64C83FF74B24C6D25B4AB04EE3B9D178E908EF5983049E290FA77C8B07034769B0C542FB3AA032195DA80B6D51A73A39896C68BD5EDA997BE62DCB54AC30B42B9799CD142523EF2643F7C32340B719799FA76E28E2203 -smlen = 1649 -sm = 34023E0450DED8F9B557574F0132C36F5B527A7C1B260D435100398A27D99522363FE34A2F5201004428A155EFA9915051B868006DF8B4A0E71CBAB33494A84D01459360CA5A8C1400E19567C50120BBB64D66DED4A4B365D5F900B04311D76C61FF4C1B35834B014112EAB338A7AFE27772A00300B7505509C463DA587F59D18E01515EC2098E70E5D795F35BC1006AE5F3892B7B92CFC2FDDCA50085DA2960450AA2161BD4DCB400E9769C35AE2C0324331FC58401BC5EB148DF85287839DE09C400B6237A732506E207E5C17C150101B5FB382C19EA98D7C35B5173C08043273CB52D31BA67D499E8140358186F8574132313F22CD45900D3B6DED23195B1CD48EF91FEE2019D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 - -count = 42 -seed = 7AD6C7DF00C9E52A75290D28DA946305D83CCF6DE2515C19A8E26850C34C8C2E545E2E32108F13B9C97F87AB68D10131 -mlen = 1419 -msg = AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA -pk = F2434A723059C395A29790FBB2CB12C2645A2D41854E1CBF1C379D5BE339453015E96610F59E8D2B535966F6DE72D7004A4880DC6FA275577A27D83E573AE361688E1F09AE5268A404421D619D210E807FBEF0AE5B38D60F0D8191B5AC391002 -sk = F2434A723059C395A29790FBB2CB12C2645A2D41854E1CBF1C379D5BE339453015E96610F59E8D2B535966F6DE72D7004A4880DC6FA275577A27D83E573AE361688E1F09AE5268A404421D619D210E807FBEF0AE5B38D60F0D8191B5AC3910020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095014FBA35A2EF2ECCA1129E90362BAB382C870FF12963DBB6B7240176BE1C4AAB2DCD99CA94DE2E3E2F8042D32212816AE1090A994B312273F0EF8FA8451BA1606E0FFFFFFFFFFFFFF98AF20B9DFA168CD9DD9421653BC1C31C3EBC220EE11E0281B9B87B155B05ACCAAE0C7FA491A5EFDEE298759F494BB858C13E9D53F74684B0F90CB419192217FE150E9FFFFFFFFFFFFFF34683713DC0A656559424DA11D4C5905DB4038606E582D614D71089A379C3FEC2DDB374CA66D29C8A2442D00000000000000000000000000000000000000000000000000000000000000FFBFF1342BCBD8E84F4517F7DD9A2EA95BE9BA1095411F1903B88A74D29989FCDAB91EF6DC1E8A6F2AB1070100000000000000000000000000000000000000000000000000000000000072D987183F7869E46494BFB5E3496AC6DDB9A32DEA9580F044CBAF67C3FECDA0C0E9F583723ECB07E57A34349495170159B864A9064E3A77F152DFB34DC6D7E2F757A195F17F5DC0D1BCBD9CB26788B215716E0D341808D572664801A500A9037F0362C1964F30828286A2D4DA927F27A92264F32BACB6DFFBE035D0B8D99BE9E1FB2464B3F4FE967D478DA1D81E6D0243B79EB7CE37C9B33C8E03B20203292ECC8B9B735B4F9D7CC4D0EE8FC87648AC85FCDD3B05C7617578C7C1DED8AA710353D60F9F09F11E6A44CE8E90B053B3DE2DA5F3F1720D1B8DDB42904D8343049B72842B9EEDE43BCB3859C9A918BF580073DC6E741A6C78B8C86DC834EA0E3D42305E0A4AF221B28FDF948149E177808553937CCC072E8BC72B4FC9EC219DA0027BDE85D53E21BED03C9FF5B775C055C3C420499CE4617421AA19F57412F13A602ED2217A13349C83C39EF3A0934C0601A0605B807C73D1377B91D975DE88F6028F492755C716E604AC92109BB8A641E5A12552A257E6B3DD190156C963C09F02D9DA559A2FF871A3DB24D358AF009ABB68B028E340206BAE902734BF769ED3E7E60005EFE05B9C5E32F03C5656C2CD033B278BE134D2F65D973C311A41497AE338770BF7E1B8E719AAA86FC2380FEBFB089A9AE291AC1D61FF2C2261A910DA009BBCD6622212B41C6FA172EFC743E402AC02D3916E2E8AF35EA39F23046D8147F97CFAAF5375F32507E6958BBB2E6201C8C1CE2413689EB682E4F9D22F98493A796D8E4977DB13FB3956D7DD3D43E2DEE2574EEC245E254ABE6AD1531ECFB803EC11E690B43D3E6CBFA375EFA4CFBC605DBD90A53E14CEC69ACCFE2582D7AF56B17877EC71EB9B25EC5E07182DC786007BEE68605A13E14B878969F6A7EC13E3F14B4E2312D3E7BB12D908AAFE6D237D05C2C040C3D7B689B30C7629952BE802 -smlen = 1682 -sm = A57F660AFD0D38BB26205D8A009D4D16D68C2009F62F20261000A3D8A448B5C993E812A1F0A100BFE07E904E16F312ED1EB6BA01024830C4EA626F24C32B54B900C2A5D3F7C6E30D8BA2FDBACD00567148550129216BD7CC9B1F003A80E29D41C3AD1AE42395FF01915ED2C95467B5ED36D34C6200AFBB866B26C69B2721878E2D0072BDFBC12514C1079F62E7050117598CB2E2CD4F6E10883E5A00353B9C24C19A9ED465A0B0F801C8CB7153735E81C513B6F62101EE6F1AE15E83B71253CD8FC3011BFB2EC754DBBDB545605F260001F54D79482A51BF8F3C1E4AF8BE96435B65943D1672A625107D0E005A8C066431525F21F9CB4029001C9FB68896AECAC34B7444196B0CAF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA - -count = 43 -seed = 38FFDE9B60DEDB5BBFAD6C52AA02EF6D49369BF276C99E588D796A4F260E0FF0A65C96C35863BAACFFD9B212EC305E7F -mlen = 1452 -msg = ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C -pk = 11484B2EBF62D5E01D7DCD1B00DF62CEB104BAB484CA2C2314350F95678DA611D8224D9917BA3FCD435A415CDFC35A0258B077E8D4DFA7502E2AE8BE31C70B878317EBA517CCA35E04B47D21DF79FA481E0EE58473637A3AE3C04ABEEF1D1100 -sk = 11484B2EBF62D5E01D7DCD1B00DF62CEB104BAB484CA2C2314350F95678DA611D8224D9917BA3FCD435A415CDFC35A0258B077E8D4DFA7502E2AE8BE31C70B878317EBA517CCA35E04B47D21DF79FA481E0EE58473637A3AE3C04ABEEF1D11000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A677DCA866D471CF686A4EF3714C145D62EB86FBFF5B958B9C8937388ACA019DF7D44B626EC1A8B639A9A384A851BF9EDB7885DFEBC96E09E9D8BA11AEFA33632236EAFFFFFFFFFFFFFFF98A300DB81B23C47E466A8AE727530B14A35B38CFCE059A056C48C11B44B30F0E7531930A2F4F43F1B2F0460A90FC07BC9294955CF6DFD922DCDD67BAA4C86005CD0D000000000000005775C2F34C8592FC0B2CAA35CE318C701F971636085A98F9189452B27A1A2EEB1FB7F3CBD0D7A17604DB3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE758C658F897755F4A7140426B8199B1B6E56831B3BAF81F0E0CA090DAD45F0FF4A1F3DDA951F247C8C4101000000000000000000000000000000000000000000000000000000000000A79EAE15A3B232F7C359DE88E275383AF598E8032BA07E96AE5004969BD111DCE02F6ECD907124590D6C9CEF81796C032BED09E5188E0222DB0B79473D055970C34ED0950E04946606FCAFADA0A564641048A8836242FBC5BBAC7E3C7750FB01DA1F555AABE2FA108A6C8FA17790A78EE44C4294738BD0FDF84D57F61C90DBB869667A134EFEE9B9A16BF299CECEDB03CB94C00318E187D1BDD9E0BA479754AAC18A7BF9BDB81F73E283025E671D744B1E993AB916086BA316B9F7C78FE3680098AC70DEB00875C62951637D98A0F31A10DE9898759DC52D97F9D5CD0FE54702B5395B90ADF5B09B6B644AFA2ECB24038FC511B88F1E58373EEF6901364C8D0D24DB17076E9FEB7B5CE09C53C4C1D8BE5187B7D0F24B814068CDF0CD08C381037C92302EF36628252812D5E573F6423AA0D446EFCC803B0E2633E7FEC34E242A33F034D3E96CA67A6A5749F7D3A92E00E23BA74C0E2F23BD3D85F16E98D2FCC7F8A51BEF938645AAA858391734B48BA269F6D799EE5C5178A4B1D4A27C832E011F44E097B6D0BF22FF596C906D85F254C2C661DA21A33A7D73F7F5849CD957CC9F8A517D1B8D5B6FEFBF93B125B6E801897C769EC6D1BA21075085017778515D8D93DDEDA0E64DD309C7817D666BEA47CB721352B65D926ED8E6D8FB437B0B02F6DE0B815607EBD0B4C09AA65EBFF7E26EB39C43167A90220AAACDB597FB2F03CAB4ABBA58EA87666C061B8B0E5F1A003402B6C262F196EAF421D0713B83A1243FF851B9D9B17AE144EB9E47DF136FB0F54AE2F101A24BE9B984597CB757CC0164D0DFEE598427A3099D2AB56CF8D89A4841A12F2572CC6249E25BAC4EFCA522390826D328A7A91241EC44E79E0B5A01F796D825EF6F2EF679F435567E9E40163E1758E86A50CB2EA658F5EE0BA7F2CF4E238536B587B0A2E7203DE5C5BF9C02 -smlen = 1715 -sm = 1695B64C71BE6EA964D7C5C001F05B4F85F3C5168A0D4B311701C272DEB77F87B4F1B61280F0018CC237355776C85B5EF8C9DA00FE7278BA199C176ACD1683410028190445FA02A1C4CFF4110E01A68B12962E3D15DFD3B1D3C3005F4627AFEDE55A25E7C851220118BB9F324290B96B7AE788C7006B9D08B7560CBB021AE8EED300C3972AAF94A61BA9DA81760F01175D7ABE37373DF93D185B93019D818CA49E2E10EB664487D6003D090887C0509928E570E3E9014BACB633C5D451F4FDA6111A00688746393A647198160F86600001CF22DDB54D14D7CDB5B34AA8B65A5F625D5D58EF201E2AD1420B02781E37D54A8C84C69F2E3B1700F02DAC8AC504FDEE86AD41AEA206ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C - -count = 44 -seed = ACC98B16DCC9A50EF57F332D66255CA56C2BB679CAE705B4297F1418DA845861448DA6CC5CC458DE6C6E96128EEB2898 -mlen = 1485 -msg = 96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 -pk = C07501C20FAE425E98295740CB466F5259DBA03EE202FD52B48D8BA8661088ACB5105FC5319A4FB5DA6A5D5317061001BA84AE7079EF3E8CD49C0063642230D75FE14A97F019696187169ED28C9519EA9D9FB05D24B0A89B8A4D3E694EE95E03 -sk = C07501C20FAE425E98295740CB466F5259DBA03EE202FD52B48D8BA8661088ACB5105FC5319A4FB5DA6A5D5317061001BA84AE7079EF3E8CD49C0063642230D75FE14A97F019696187169ED28C9519EA9D9FB05D24B0A89B8A4D3E694EE95E030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000923F39884833C82E1AD88C1DDB3174D4332D9A5234D6A03F712DE4C9884612C205740AE371457DFCF4F261F127C0796B8509AFBE0A29627679A2A4DFF5E7E5A2E296F6FFFFFFFFFFFFFFD9B6FD515FFB89CADDAD6C5D1E2F0B1685197018FE29E2D732F03D71A43513AD5B7C3FEAB9EBEA0A93987416CB893964522BC9E68BA9644A56D6D8CC1EC3A03390AED9FFFFFFFFFFFFFFD977ABA68092B3366A86D4E1DAA6F6C5313A61D6DEEFABA8B8A0D6D5EC0EF2878EE7FC85A3FB6CA8CDF0CDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEB842F173F5AA217D3B6C731273CC0D9FE3B371466B94AC3C919539F3F796BB872017B572A0EA77CF1135000000000000000000000000000000000000000000000000000000000000003F0CB59BE30A393D381F1DA0F8D6B0F466124F1A2CABC741EEA913876468CCE3A8F4331DF7225C9035D644FDD3ABC20217B39AFF5A1D15AF13C4FED52B5CD2988542C6216F92DD07ECE8B7367DC5F179265D2E062F36A481CA64DDB85E1DA9039DFAE8E77E21A4D232AA92DDE7EC2EFCEDEC6E54591CCC4B675935D629A562D236B9E1C5605C3643ED0EA2DBA4B783018FC65EC4A649EC4F79E262A4B4C661D9CFB75811BE6479DB3FE6DBE74F38E4FBD81D049463E3BFCEBF5E17389DA73E01876CFA9B8AA6D7BF8731B2FE7CA0904EEB94FD6F1E27A7EA2D66C40868320E403657534EB0970C2EDBCD3E987F673A0018C7299343186E06ABB9ECCD1141858B1574C38FA760D4535DD48D11B19DAA475D274966C6BB0FAFAF574AA6C9D4EC003EB5DC58C8B335410760BE9AE9D00414EB6F4EFA4CA739C080315E3BE6108B53B0DA09EC48B32C2059AE3A4C237E330313E6762660CDC8E7BEA54D0AA219F853357AA7AA351E9314A8266C92E0EA7C303CA1D9A7080DE30AD9F9E5F1353B2902B19796F51B1989B0B18FE351EDBED75A2FC4074DD0D43C43803C9295BAECBB6FADAB7C2504C3C4BD4682F29D07E07B03D47B93F0059D331C9F9481BEF7567831327A7A8712634967939991C66482382A260E6C1832E218CAD116BB9E11B38402BFC29AAEB8DE4550453E63047DB419B09218E9A156F411179455B685DA2B58A498252FD2F9A9E44DBFFDDA8118C718020AC27169880DDD8C1816326ECAC72A40146167C97357E2611B12E5A5A4133EC2A244CB2CAA7F9C8C4C3680677654A8017AF127517EEC5A76E109406B0DC1823AB066551D287C495E2B16F55A8372D3AE625A39834CF385CA93AC302F9CD47203C9731FFD978B127E96DE9AFBAC4F375702CA5E68276407AE9E8AD0F0551C250C87707D2BD4478A365FD62FCA980EAC03 -smlen = 1748 -sm = E28E451128940BEF0DAE68B500C4FA40E5AD7538587957DE6C0013D4AA76CCF23399D380F7FB013AA50B8CFB987F039818013D01F77B2D34911ACF19C37E9B9501BB7E76FD8290187C061463EF00CB2A8369C6A12ED6496E318901866731C5AF96D5500CFF4A5901E35D83295AA8DD307AAB639900F3CB54F8DBB18FBCC80BDA86009B7A8445095455347875BAAA0059FBC557C62B0790C3C09DDE01B6A6A50958C08CAD2A3686360077FF06F03CB4E3D7D5CDF1710163D69CF406C9F7B99F1C752801F936C4F888ECB7F517AFAEF00000C5EFF8D87AF5425778835B15D906259ED5E2C8BDAFC59299CF1201F82259517F289F1024AD7F0E0111597B4F791FAF9D5500D6D5440B96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 - -count = 45 -seed = 8BEA4E384E73C7E0B47381B3063334291A0F06D28DB61B5BF65B01D0A747722E0AA62B81AD46C00C8A5C31494E513836 -mlen = 1518 -msg = 047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 -pk = FEAB1D7143B33F90CA9A6BF64BE0FCE2A8D478147801C386383D8FFC81DBBF0439D37AA7CE963322AD4F5B79C2DC4A0228D381D66DD6F0068CAD9058154216DA2F8CB50EA4C43FE01D2CC6EF73E183408B69BF770475E3EA6AB989E1DDF9BA00 -sk = FEAB1D7143B33F90CA9A6BF64BE0FCE2A8D478147801C386383D8FFC81DBBF0439D37AA7CE963322AD4F5B79C2DC4A0228D381D66DD6F0068CAD9058154216DA2F8CB50EA4C43FE01D2CC6EF73E183408B69BF770475E3EA6AB989E1DDF9BA000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000646AA84BB2E09FF9A3213DBB3BF91F7ED18388D6D9F8A0E334A85D9799917A7ED9932F4C4D88C83AD778CF6FD34283B95EF295CB3940DDA6517E7F5354DFEAF2F3851800000000000000A9C0F2FF7543CF51D257EA899909B9178168F603C44DF547DF0BEF66823339BF4A25E872AA01E9AE39F8F5BAE983E776A7196FB2204C71DC7CF46E14B3693F70E5F5E0FFFFFFFFFFFFFFB179A4F95CD1011F69F6821A0C0109894EE9885D92900801187D96579C1E41AD73C396ACDB1ED15AA64AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68EB66B060D5F7BFCBBC0D99224400448424C6F558895E23B82A417257B17293797B85837687E33F9B0FFF0000000000000000000000000000000000000000000000000000000000000060AF975B984B6EDFE56438CD49B92A77B7AC16A1873A22016D4B8F8B2162338F0A1B5059398DE5722CA84FC590FCD603708B2ECB73C030205F32EAEA59D8DDEA1A29CB716C97FAE23D1D341A4F8D9B6A9A14C79E09D8C1A55E6CA7597C591803E9BEF2B1FA1DEEB6B356E19E3D419D371602FA98C34E3B9D3A7BC6B47212FFA1F39DF263617AAE16B4B88EA9E7ACEA023B82BF34DF231029A078B24911BDD0BE8CCF5400D0973BEBA25E4454A5AC78213AA7CC2A578DDB7678D7C1F2AE5D5D006B31C5BDE54A0E73299EF4E7D914894BFF9485155D3C484206C774EC731385FAF256998781697BD33611F55B09A11F01D437A67D25E1A0A86EA62CD4795592A924F1ECF8DD15310F67982D43270C4CF3462805FE106CEABCF5C1699F94A28A030E03A5AA4EA472D927027DAA0D53883207E92BA14F8AB6EBEF35B299106BE16CCABE33FA74EE570151E1D31AC30B5D02393C5EDC0EF5AAE944212E71EBFBBA0E82E0E9630157AE585DB1227D1FF1329F071E7EB3514DB2373C6CAA6C2208B50244D43B403D4629481E2647754477AD36A7FD0B02EDC6BA8CD5683932912DD6ABCE95E3843245C22BCFBFD28CA7FAC400006A9A05E409D521993DF8F4DAD47B4E40F3C34E972C648D014BB1203569354EC9018448A1BAFCAFA6C6EE3120A74003046487993F521EC95544CBF157EDE0DE35A35D58A735184F8318DAA8E45EA83F4D589C85D8348FC818DA891B06CF5E031538C5E8A74063E6B6BCF4340B10879C925052D1F97D317B0804BFC96AB39C4771803F9904E87D6BBCDB06B5E6E13602962ED8F3464AB3EC47DB2A58DDD5F8F3BEEA71D5B509E3627AA14DFE9252248E9066D55DDAFF99DB1CEFD93449E223029D3384E1F702086E389E979BD65AF2C4F9358EFB0920D4C3B25965DD7E05E3AB3431F4E5318B766ABEB94BAC978EC202 -smlen = 1781 -sm = 9AA6E8A1DF75D8FF03CAEDCB00FB10C01E835F359442FB272500EBA17F06F57DDCA48CB17FEA012287A9D72F2FB03A8F1BA8B900D409141416838A51192E4787012443261D0743DFD55FD4962100A1E4B10EB065A7EE329AD2640009FE63F8AA3F754B8BE5050100B19DAFBA1ED8B78E71838E2D00B5D7F3B3BA778642A905929E01CCD6753B2751607D020F1A4C01709259B9B5C1C89E8C62DBB50074D163B92BEA19FE2F06D09301A7FD891CC473044398AEBE050074F88A50036040A1E490945300895F2996B4F2700335FBF56C0000FFB1BE6C834B3259706A5C38F384A12697B7BBCAF95ED33E3B1B0110C16D82FAF5DF2A145E094B0183B0A2005B373F19400940B19606047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 - -count = 46 -seed = CFA713E4A63A6FFBA43BFB898956DC400507F68AD164C3D24A67B5F8D7548C9DB44DAA43E5E4A0990325A4233089318A -mlen = 1551 -msg = 6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 -pk = A7B2625D4C4CDBEFB08B2C8F1F8FB440B2E1ED8768D848C7E1616BC068C535FC173CE7C39D25DAD657EE74216828D601286B9EEDEED252DC85139743137BB65BDF5E13A179A028AC1AC156AB6185D372B13A7CFB04815E8F6F4ABD7E667DEF00 -sk = A7B2625D4C4CDBEFB08B2C8F1F8FB440B2E1ED8768D848C7E1616BC068C535FC173CE7C39D25DAD657EE74216828D601286B9EEDEED252DC85139743137BB65BDF5E13A179A028AC1AC156AB6185D372B13A7CFB04815E8F6F4ABD7E667DEF000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D470B7D65ABE08F4DFD9FB21DE7E5FDCEA79D2605A36B13D6C1BFE12F471E984C280C961201B64ED453B817D34640A10B98C3596E64966E5B3829516A2ECAB029E181F00000000000000D19A76B2FC3F581D70ADDEE0CAEC902FCAE3EA5D85FF6F7E075002D88D16BB6A9197EBA2564C8E52E7D8CF997DE7B24B449463F06E494F2DD5B6DD1DA428EB9E8651ECFFFFFFFFFFFFFF27C1255167214B5A1B5AE038339C65935B989D4206B42417896681F324616A5FBCD057ADEE80ADEF35E4B10000000000000000000000000000000000000000000000000000000000000098B60ACFA525BFA7D2C04C1528BBD4148A0915F06D5E99B43B64FE55441942F63562EEF7EC7647225C0A59FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BF623E3EFE3C20D71F2CC3A7931ACF253DD147C7531D994DF05A7B898BD5AC06391C6C06F42AA62592874219910C7020440E93EA229915C9C8CB6C51402C9926E0A8EB0A8CC06F9D1A6AC118741FC6090207FDD08DBD2A12869CCEE26EBD001C8F6912BBF11D3E57554ED25F1588FD699DC7EC2D7AF897143C87E48795898386630543511FF5A5D8C8A4BEC02468400B7ADC3206F701C6BC960969CB5C663FA549BD529260E804FC2DE17AA1B38D48C5F7D8965F56AF96501BFD2F46816EE01568F8D634DCADD262332782BB633783899693FE5889BD20C48B81A950F0F5B17A1A89B084EE0271B2861014D92BCE9018E89D78444DAE12FFBAC380CB7594CA9B3DE92EF94E4A7CADBA50639E897036C5649F6D380DF69C37AAB98AAB5C0B603E27D80F25131E3C2A32BD9FD147022C074887DEA5EC0B9FE0E62DDF318CC3EE9C8F2382F81DEA50E790AFF0F827632030FCE67B0D2D126B282AF30F3C4D0EB0D0CBE536F989F4824159B352E23FECDD4C28C9D6E9B3618E5913F3BECB8CF5D0345221C7F55A699DD80F37E28F0074C96088F6606DB8975886D7913A0FAF1E164A224C7A1CE370B9F1AB1C9B4BF25E002EF62251F728E3325D96ED344851AC3FEDAF013A3BCA78C84B4B064F4249717C571F3D49FE784BA0524DB8A515A637103808C03E89CE8307B225FB4853F4C3B94040F67DD69AB0740048C75D4C214D186D6EE4AB954721125C8F36DDCA508B3005B5BFCFF25746A102B0561D3E9F51194DE1D7633680C9381E6D887CEBCE38468D7D8CF34B0644EB88152A35BCA864302AC20651060253D0C3C1CAC86C56BB552696B5A752C957AB4EA9A6DEB010A680BC0730BD052977C807D0704D97109D4010177CFB30806E5C0145AD94B027A3C7B1F5033EFE58B80C3E7CCC914302B4E3F81BDA5550E6A4C906DD5C148B99A1303 -smlen = 1814 -sm = DC2BA004051D38C8AD9E5F9B00670DBD058339D7F983D1E44E0068893DEF3E93B17E37B649A801EB91515462E1B7D00AA63214014090704A95403C37AA864FCB01066E2DFBD4391F177B8C495300546C8A8D79CCD33A9E58E6AB01C18B0B9B94D2FC497575307200CF2715AF9B8866DB205C778101C67AC3A91A6AA358B4170EF801255E0F679B9E1F413C64175900BFA68C43A663FF7E8A4B028E00E22BF3A9C762459D75BAF82401602831B80E0D40962DD3E798002E14C41CD00AF2513F8380DE010BCFEC954DED1C59528102CF01019BC4A7A7F4A500C93F2E00D758CF97E36AB718934E84B3A221130325BEF5AE51E883BDC9FAAFB400AF82DB37E74DF202C7359CCF3E0C6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 - -count = 47 -seed = 1F3193EBC58EF65E9E396D69220ADB8ADC729BB388A72CEC9028A094F1CBDED21CFB0C41356AF31E0CF66A3B0D843666 -mlen = 1584 -msg = 139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA -pk = 177591826BAD1B073E5B69A5A83410ACE58C26CCD4B183BE75FD328D0604C60FF2ED81B6259605C9187390AA451271011A8F2DAE49703E1687F9B4740249FD830846755F16D9E65ABA0097803B86CADC8E0F0D8E6FFA3FF05C343C64A359C803 -sk = 177591826BAD1B073E5B69A5A83410ACE58C26CCD4B183BE75FD328D0604C60FF2ED81B6259605C9187390AA451271011A8F2DAE49703E1687F9B4740249FD830846755F16D9E65ABA0097803B86CADC8E0F0D8E6FFA3FF05C343C64A359C803020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068EFFC0E03C3ED2EC246C66B16E2BA7869BA6F3095E459F70794EEEFF7306DE2C51F4ED8014930410D499EAB6311FFD05A598D9D80F26D3C2BA1FA2CA37326309C3F070000000000000031D69E90C90589825D803D93C2719C4007E293DF27961A8843110564CF019BF0ED9A4A3CB7835816D11B7EAAE452B87D4394E9267B709B638B444CCE7E28D1671872EAFFFFFFFFFFFFFFCF5C779B01F4B209106EEE9C087C10797E9DF61599264BE7CD3A7B74F315E883CEA1169F65D1800EC7B490FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF861D48BF4C23D231F0EA40F120E31BB8DF2D3C97BF20A65695DFFB61EC1535353E4A5D2DF3B13A3DC175400000000000000000000000000000000000000000000000000000000000000F95CDF3980CEA66B564F00B812509E82ABF3475D370EA48D61A517C3681E7C5138A43C53F44DB123CE5D2AD3FC22A5034AA9835AF0414647446F3F0BF2EEB906EAB0B66202DB80592065DD82708069D21CD42D47533E036264E73886229C6F01BE71A140188AA5C13CB5FF568295512B44280C929A5C25C424A6C832BC4452DA541B3AE745C44F5A93475933C040C002FFCF9597D4F93E7AA1820CA15841AFCF9AA78BAB871567CB818B03AD01194DCD05EA96EDAD15437EE98AB53CD3B27001E626CB1C35610D0D472E4FEA2610D75958B815A7C7F73099326A5A95139D62284E6E2CC734FC6BF899713E6212C5520208670CA48479EEB232B30C66045D13970C4CBA44D141ACD1AFF095193FB25D7E9FF306BA36842109ECC4AA6853B0D303E7A83502111BC626953580C1A390EF7FBB36B627F989E37C20DEEC440ADD8E0FD45BD4B920578D1AF242659EE6F71C004E75DFB295CFDC396F10259584D16D32DE3C94826C265E51A3E6F632B9F06D2FE325117DA657B8C5F1460AAC2A792C02D00F78ECDF9E26016C069B9ED2A5CDDE834CA340CF242A3EBC9D672EAEE52C740A5B5EE8307391DB10829BBB157C4802C4C3A15FD39EB1E7419B4586AEE94BBADAA04900FACFC75F3C93D32FF8E67AEDC7CB80F6CB32B163013A0AF8DAA24B02390B402D82300E121F4CD01CBDB15E9DC143AE7DE5CAB6B1F97148B3BB3B2D3A42326660C6EA2BE06BDDF23A3E41BF031A19A9D452D6945080B781B9B89D33BF6287E430998400B8AD371F1CEF97673E7B9B7ECFC758D974E6C8FC5911463503ADF062E8FF1BAEC181E14FB21949155E20F4C58550452AC37AAD90F7DA4D11345C7F4BC14C6527092DFC5EA121BFC20386BDF3CA563EEEF4CBECE6722B0A35382A2F94B7481FC170F004C0FB044159A7D3041D5EB6400F4800271DA293C55201 -smlen = 1847 -sm = 51CA650E16296CF1A92A6BFA00842D81E8E21F86F36BE046F30187CD5489A4FCE7BEFD82566700C037DCDB04E93C973932058500F297F7DD21100214A6C9023201458792E563FFBC8056398190012350D1DA692B7351EF22FC01011AB7A651337E13FB930FF42A01818031D5555E81A253D1A9C7004372FEABCAB5B8874C7A6D12016CFAB41F670C7240DDE589D001EB568E05EC41E0CA9EA5D34F0013FB79C2953D2F744317CEE201D341F5EDF060B75ED914B6BF01F5C4446DD9EB73BD5DDDB1AF01CEC4796BAD5170973692C52B0001D12805422451CC73C5F8A7501F47AFBA39701AE210BBCF133A000238EF0E7B46B4BEFF18EF44B401928E9144F158F81D459E0603FE0B139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA - -count = 48 -seed = CF5A04DDB5EBC45328F703D486D24443A7692D65AA55F054E3078DB76A7939590A3F35CF1A21E82A845445DD1B64A85A -mlen = 1617 -msg = EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 -pk = F464A4C3C2F326E373AB65DD1D049FC1F6F8B9CEC859ABBFC7E6FDD7B500672868F87AED9C799241ECAD83ADF1A44400629AC272218F030942F177CF8B4F5C3FCA51616BF578547195CC38DCC548B8EF512155A639DA2E67C5CF9A09CB0D2202 -sk = F464A4C3C2F326E373AB65DD1D049FC1F6F8B9CEC859ABBFC7E6FDD7B500672868F87AED9C799241ECAD83ADF1A44400629AC272218F030942F177CF8B4F5C3FCA51616BF578547195CC38DCC548B8EF512155A639DA2E67C5CF9A09CB0D22020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2EDAC48E3F6E6EFAD6185E417A16F25D5B0B071345E36846D9C7D76E2F23BAB1BF19976F7436879CEF72FC6184223A18E4BD0EF534A416242E3F0BC6075E500CA85F3FFFFFFFFFFFFFF8FD2A9A97A5FA86A4D76478AA5740317C7C6BB20BF7FBAEB810DFD23D5925A8259FF8B7D14A0DA56FCD1F529C31C18FE3038D80B8FC80F0EC8B536CC8FA27D41B1A1E6FFFFFFFFFFFFFF613F04651214A56CE93BDA9C62183A0AD13974331A6E9EE32729EDF2489F2826B8EED5638632C247B56ACFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA60AE23E0B48BD8D32804BBA3D9563911A9CDBEEEC841C24F55FA1CC40CA3F0E6A81BCAC2181CBEB6DD9A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E0D2F67E8D10ABDAF470415B450C9B18E52F35E676EFBE16752345D481342E2E0E6D31F268634A8008E5EC2C63E06038E26BB64721FD5BE9FB212CBF452148179581BC4FD933AF07CFF115E0B6402181AC6BF305C3590CFB6782FBD10451D03D69C1C5C0DA69A78C7A6333B735E962BFCF0CC97723614AB207CA001A26B1F4F47B8184384EF428537A8129B20004E01360916DF6B72C71AEBFE5A613045FC22E0E6BC326CD74208FDF959C1433E301462329A835BA4BEE08204E295138E5D031EFDCB672AEFA1B46870FF9015B870F44AE478142FCF4B3E3B4DA617BA12B815A2DDE6A455B67E4C02A1D5AE19C58202D245509BB143555D16E05F4AD5F08B5E8C40366D664D027F1A348BB29E6046B7F137C469727CF4247862175C382D70030CCE5DB282CE01B3D086FF0F032025F8FE592A4FBD328F193F139C59D58F9BFA25C660C0B52DC92C424622061B9F80035ABD514E0969679D388B5AB270FEB1DE563EF1C5CD5917693BD49EEA1D09545E8F8348D1D29E80E1479B45A5E79D7B02AC5A7087770DF355973A87C0FE04DDB0F99A3CB381142307EDD804072EB4E8190AE8839D24C09691080A2E1B15658A01B2CDBB4FFEF6A3FE40C2A69A596396D63365534F55372707D3E06BA1452797EBCC37780653004B9F37AF25F0A9DC71001FBBD8B5B99067E9C81525B85E1AB603F6DE20852931967EFECCD30AC0E5911E0AA6AE5457B516F6BB7D140724231B03066F2E25802F6CEA2B24C8BA4336BB3B37390C621A3335905803941B1BF916C51A267BC46416BA81226FC45E3CA12902F4A1A97711CC6F9C79F77C63C4A910B1BEEC195CF5BD6A033E8F48DA6121D43E7C329E740F5E294FCCEEB9E6BAD63001F635E6079549701EB8F2B5CAA1B29AB64AE5B8919B0D1EF68B542AC0753291B2AD4199BA61F261F0577249117F96B102 -smlen = 1880 -sm = A899C74AF7D92A165A6F37C40041C1C3AB7679CA6E5405C544001EC14AAD8B18A7BF38E0629300099B287B03819FD9F5FDE543000F20FF64EA18A2F6368217F100DB6739BFFA94E5B7C74D4223003F6B106A039BD7430E42BEB700D06A532A0FD4C847EFD1D7C100EA193AA3D42F4E7AB70871FA01380BC737883AF7553EF1E2B401D3BA7E32DA202EB5AAC19D99002C9A139C992251945F85A70B003E4C402023545C1FA9EDEDD10132B0F508FED03214EDF036600128C78BC338DC32DDF28795AE01AC08A9C133346AD8B371688B01015123901D57CB0EB1233BFFEA95B41EA85EA3950D8C4F88C45710032ED6B82762AD662753EBDBB2006E50AB0BA642C4748D438DBC1207EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 - -count = 49 -seed = 8C3D2FBBE0D39E293AF2D2CC5A9BEDEAAE3752DFD19CDC1E186D41E717A0412AA429CBDF005445AFDE684656B5D17690 -mlen = 1650 -msg = D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 -pk = F0F8D8C3B3BE3CB941020490DF8612E032DCC2CD3A642F50C0F6328EF6A8AAAA7E0A86EA46FFF5C4ED3785F18A4E86036D198C0F46753C0239924607E30DE923DACB8E66C468490187AE99868F2E69AEBE667E0616DD8CEAD771DBD5F7831C01 -sk = F0F8D8C3B3BE3CB941020490DF8612E032DCC2CD3A642F50C0F6328EF6A8AAAA7E0A86EA46FFF5C4ED3785F18A4E86036D198C0F46753C0239924607E30DE923DACB8E66C468490187AE99868F2E69AEBE667E0616DD8CEAD771DBD5F7831C0102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008E490D37AAB6C269FA2592CCBF41AD8590BDC0D953A13643CF23E08B20542EEBE7651AE862344677A140F9C8DFA5846B34BA3F521D40A207A432732A8B770F4B0F3B0600000000000000299D00110896A0DF9ADAF57921E6704F8EDCA32209D85B699F85EDDE8645F1ACC248B2D0425B9A176CD2565D195CDDD32582681719D1FF7BFA79589C0101107CF3D9DBFFFFFFFFFFFFFFF99B67AFD68738DC72ED1A9346650A926196D4FF2C44F97D29D48AF0B3A580FAC08B514C4279509ED02A89FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBAD3CA8512027A572BA0BDE0DAD80199E41D61FEA2ABA774D4378DE955F6881D15962FF26821FC4CA40F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7E7CE885BC33AA1CFD1F019F8D1D04D722B7CC2DE8DA3B599D753F19C7487F47477BC1CA859D6A6C023F4A061D2DD01C75A6A1E3480FE1B133F88B5A0B735D90772D2C1B6E1BEFE63FBB77D179054FA6C43AEC4A1398C64FF08CA8D8D9504039A863EBCA64C15E355A182A13C5F780D3BD2ED6A427F087D6A361DCD57E3B52A5DBD5F4E772AEBDC6E060BFA012BB5017EC4F8EA386EBE02D117533D145C80AA85F813E8E2077122D8916B16288EE8A9423F856AE8B598FE64B1DC84FAD09B00687C7B11578CC5AB55C1ADFF05E2B623D580A4AAE8496ABA0BA4271BF761BC12197E30E6BD8BAB9DD5D107FE029372034AA8B2C44FE3D18F211ABB4296601DDF90ADD8C6910CAE005E362D042BAECD824746F1AAD45133923775F307F9C63802CEC43C311B693343EEDDE326F37D31C01EBB0193FEA0DFFF5D497E92605D4057966D6DBEA3C9979EB7D7E0BDDEF34F00215B6B403C9BD9A0F4D276C752F747CC655D347305AA41617B93E3C1FC2ABFB8AB58B6ACB32872C0553CA0DCD6921802DDE64576DA33E530244A0ED822AE4CD31275070AA24C47E762EC411FF72822A3F2C7667BA4EFB87B5838F1435B3EA003F6E4B6D9B4BED33BD9546B87F0D2F4E3DBB824E98DBCE0EF0C8119D96AF2D05B21CFB5D2C77CC0CBE0135C1D97AEA403E3B095AFE04509EA436D2995443145D2F9EC6779AEB3C01527F2710BB1EB0978BF174D7D93FD86586437D1678FA8C600779487C9B5D99E54359C73A7AA1DCB2F77CEBEC3059CB3066457338BCFEAED6FBB63177CD16C055FFA77EE38BE9D4100B831DF4DF4684F73B3755703E62831E9CE6D77547B3A5A1F9DC9AA0758638450081F35B5A867EA0A66F1BE0F50145D03FF4C8F58A09B7ECB9C74BFCDE8991EF823CB0D1B6C70DBB8B5ADF6F6A26EB5126F126BC1DE1114FC7852884F246CB402 -smlen = 1913 -sm = 6A3D614AD571B8AB672ED78A01ACFDD07A04A1F6D90936BD5D01A2FE23DCCC67576E7F2AD08D017A0C65FFC3C17946FE0F48AA00C29424FA886D091329A1FA920140E0F2EF852E075DC5F2D02A0003F0E8DEF6E9897474D7851C01FB4D7F5FEB56C809A05C83B6013F27F4AAD385BD7419D21C2001A85196F867AC49EFED5DF932010E27B12F10133DB8B06784C6005425CEFA65423EA0CDFC4AB001321FEED4E5F3F00334BD2E64011C7EE8987D039E21B208E563016C00D9492EB578118F2E6D9501CA23E211BA967F1F5011C8B60101559B68ED2FA041AC515C06DBA2D5C91AE2E54EE0FED0130F480301C9FB44426AA92237E7C462EC0034263265BECC9B10F79F975F3000D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 - -count = 50 -seed = C10427EF0B26328163F85D45E22EC5215415326F013FF31EDD58BD3E97B1A72FF07D275D4C1B517F4661B0638F75640C -mlen = 1683 -msg = 4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 -pk = D5E9DAF8A6DFB3C39DE1E862EF16E6A9CCC37F732B332250711ECCB384A4A8659DCEF76C2012D48377900D3360561003B4BDAD3E910A6A5408EEDA34F56E8AA3DE368401CF51A7699DD93E51429BEBD7ED90B85F286A0649120D649D90683900 -sk = D5E9DAF8A6DFB3C39DE1E862EF16E6A9CCC37F732B332250711ECCB384A4A8659DCEF76C2012D48377900D3360561003B4BDAD3E910A6A5408EEDA34F56E8AA3DE368401CF51A7699DD93E51429BEBD7ED90B85F286A0649120D649D906839000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A6A64B3FB17A05B21163F9BB32262C2F137936A7C62500F82BAB7C97D0B6068C04BF9A55811B0E3BF13E9A027A8C0A8072E5EC1FF48321E1DE54EC2B291BBF5437DE0800000000000000C313FA0C4266B411DAD383BF3E72513AD031BCEF5FBAFE040DDE82757DFB7C55603983D4E0EB07181ACC3480AA11F6C738EBB591E0BF4C8A4052E039FC774C4254B3D2FFFFFFFFFFFFFFC30A928804AA5B62E306B0C52A7B3B932CD0CDF3884B8B26635221F72A8210A027339592901D8BE58F43C800000000000000000000000000000000000000000000000000000000000000DA9C32CF4332EEA6C4DEFE6251B768ACD74F7AD41C8DA785531830BC661226B872C5D51E52987FD9838DD100000000000000000000000000000000000000000000000000000000000000BC743A9EC72F996B85BE2BC3953A2184E46FCF614CBF26D5068A853417E8B3AC7651D4AD8D6DEF4E8367C84FF87E8C01F7258813326E774220959FD937F2B5FCA0E0D3F707CBD8971EDB80328FC72684F21F87EB36A79CEBDB9CFC7E9EFD7E00E65FB36CBF57BDA1E6AB8864D1F55AD3ACC7517241EA34ACF86F63824E4DAEF29B73C50BFBA2C4F92DECFB1A0AB79E000034D6C14D9454D16F460409AE3D5D4E06A50E0F0634A1249DB1AA68DA11F3A2320881FAD68EE415E1487BCE25AFB3016B7E630F97876466137C48A9F7BA0C89955783CA98DF176D5CF8D654B9539C6EB93420903D9FF68C78EA7F91B3C800020E45CF848659CC0F7BFE545EBB398044707A50B655089236DDA795E14D1CCF3B43FF0422B10DBDD78FBC0452DCF8730140901698F5497D8538F0B3197B12EB22BFFFF2BEDA93A2FD24AF09746420BC7C1762E8DAF7F68EB3DB02598D021C4002E2CA28CA734660B5F7C798FBBA8D505B8CA0461112E1F8AD97853FE98E942CF99AE2697F895C51049077A146195F2C01C7D26153292ADCFE0EED56E3C24A890B9BD7B2849D8B5903EC1396F1D18DE1F576AF39EE944D090CB5C8BF7C2DBDBA00D6044A85F1DAFDDD50BA16F635FC8B73A3EB95E8DFF541CEFAA65573D10E94E4B145CFF418E60D89E16658FD0606B200ED65709E1A18987A0A91A9594988BC6C9A1F0CB9F74EEC94BE696353498CC614E75262ED9F82A1A0323FC1F7EF8909010DF984A019FE99246D5C257AD34D1824DA79DE4C2884DA3D129DC23B8C397553C25FF0BA0D715AA4918E17D365C3AC03205F23DA7164E64C781DB923D7EE5A2262218F8B9ABCEE210642F39CBA327349C7F78DD47954A194FBAA793AE191310389CCD3EEBBA407C5EE810D00B4DB98DA8AEB94628DB5242D1F9F75C7145387008590C3009D50E9581DF5C583DD160F03 -smlen = 1946 -sm = 180415C0CFF5D63DB079398A0061697D161FD60CC5B2517A7300CDB76792C0C701B85A1F209501E73C77EE401338C224170F290043E79EE86CF70E2ABA71B68C002B595AA783327A7CCCF1E87301D786F5B860DFB105480AD4730197DB37220B75856F45BD196000C736D7B8E192DC1938D2BE5F01BA1186335E0AA7AB2D9857DA01450D1C9CE60D642D375E34D0009131E29CCBA4992C0F7807CA0173331A177308DF123D2D2F88015C4E6AB5541D99E3E8DAC8B70128D44AC970A7D7D69E472F4901FE45D9E58C4FDE198C498461000073240092EDBB0AA89DE48D7687CF85550E88EC0148BCC868780D0294CF94E174245D200A084B220194BB560B634E183B0281AA2AEC0B4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 - -count = 51 -seed = 4B6B73E042CE76DBE39535E45D3BB2F3B9F8B2BDA170E76CC88666844703E32B2367460A0F6A0A2E3F4E7A6CD32BE998 -mlen = 1716 -msg = 0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 -pk = 56D29578FF9CD55CAD548E99E8B15B9B4A4553EEEF992DEC87D1E82A2E9766F3D2C189C1896ED93E0E96CA592E4A24027C437B82FED405DDD00F4F1448C19560A08467093BB1E9EC293548C096DEFD1D872369826CF19DDC51DBD0D8B5803A03 -sk = 56D29578FF9CD55CAD548E99E8B15B9B4A4553EEEF992DEC87D1E82A2E9766F3D2C189C1896ED93E0E96CA592E4A24027C437B82FED405DDD00F4F1448C19560A08467093BB1E9EC293548C096DEFD1D872369826CF19DDC51DBD0D8B5803A030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B498FB1BFA20B5A3A9BAD0C90E30C724C740D1BCA1D1D9FF1363FE7556B396B197993242D1B616E68567B7F44A863C4053F24AABFFC610A8384E763F75F10A0B03F902000000000000000B38634EE2D9E6D6803CE60A25B0035B6E1D2A8733B2C2D09047472D9196F0B58412D98DB35A426FDF10ABBFDA58819E39B6146744AB401FAB9C73C005380A23671BF2FFFFFFFFFFFFFFDDD0E855FC59EFFBADBACF788EB6672247010921B7BD70E74148D68C75F2371477CA1914337F8DF2C31873FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8BCFA1C76EDC4E52704999229CC1B5CCC7F456BE5C7FE2C160880B43FFE5970ED4899DF9DA4642927FFC8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF157F5DC7EEE0578C4D12A6EFF0573584117F9450BBDB5554D3DE25E51226E9FC93E0C74805813996238E71A7F375A902F6BD3815CA8E286F11D3AA83D210FB2C518CA1175F4A7172FD1DD1714CBCA8AFBC935DA3D4EEAFA42EC7D4A497858001D7C6ECA04A83EAB30CD3FAD44983D7DD87B2F3D3298DDE8535954FBC4539A14152C07DD4B6E19B10C71D2FF16F8F2C00B6518D31937BC13543D3FC956C89AE849ECD658327C2BCDE96C3728DC1BAEC6F4C5B3B67511CEEB55C1BC07C851A3C00CA8B5CF939BB4E06C171F75275DD9FB98E84E7BD1954563315E64CC535598BC64BC69FB58A0721C20FC8CBAAE2FB5502A4179BBB4BBE23E551509930891E00F355FB602802F3D094E171AEB6BC1466000B6AD9AF9A38820F70D1F0F2585CB402EC20D1AF429F5F45FC1AFCC0271D8F9D7D1C936F2B391E89287B227E0D358AC09CA145B1B02067B2A8BB923DBEB2FD0020E140B9FC3F0F6DF4A8C883319050DF541A2CDAADEE4C5F59E9D438EBC116F002A020362F7DCCF535731A53EA0BCA000DEA2BFB24D1F97119EBE25CCB2E47518738541E3870E962E76D739E9D1D01AC53F626BFCADE59D956E3364B198C180064E1A6B885ED62F2A9F11F3218BA3067476EAA38EDDB862BCCBBD708566617E361E2B735B57A426D99246221E4628B0051741191DE1C3C39174B54E4AA163E7E63F3693B2D4A97FFEDB2049E1C9EED0338C8178B5DC08D1232190DC151AA0A01FDD63145D09906F6BCE3D750AD1DA4E4512BA3ADEECE2BA19F18117497D1EFD39C78EB1B3AD49C2E83D8F97DCA5FDC018C08FA54FAFA56CC0CE94FFB6A81383E1EA61B62D1218AC8CFC5C1E890D3506B0896FE83C267D5A623F707F9DAFB920164EA02B0B0FF4A956AE22B4C7BA43A8052535F405F41765914704DBAE4D6FAF8B72C1EB4403AC598E16B48663AC4A103 -smlen = 1979 -sm = 09D9B092F3BF16FBC8FFF1FD012F972BE2B8AD35AD61214D9401FDA8C2FFDFFE0F4F9FA2DB0C011346D7B9F4123987780B1C3A0052E25E00085B9A76426011280195D5389330EEAE57411370D001B22E275C3D066C06E89C0CC800D89F181110AF76C6F2F07841002D739D50725D798A71C83C1900753108B56E353CD9C17D64390164A94356B857B6A09DEF60FC00AFCA87918D361886CD20C653019B3DEFA4903E3582DD40B2470159D9D23DD321EC41D7B9B9A5005907D0522A4EA234063DFA8D0138D05FF4E30FC5AA847627270101E5CD47C39CDD4125B5A1C8106A2C302C3A71280B2A69B82E9B07036F8ED37962859D514DBF5C0C003EDB165691B4388DBA9F202231030BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 - -count = 52 -seed = 3D4607399F6FCBE074FD2BEAB1A7571239D6BE6308617866B65B892EE65399E14DC7FA612CDBC5F7E23116FA86C3133D -mlen = 1749 -msg = DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 -pk = 70B38D1D39B25486815C9832B21DB9B356A2FB0BE11D03C40078F21B9C219B1DF7A18B138B711B24C6FFD1BDB32F020310CEAAE0EDD865C249AE3BC51E49AD9A2D493BBD133CAA12B214A58D9CE8DF9DF94ED92B839A0AC2B73B2D3ACB7DE200 -sk = 70B38D1D39B25486815C9832B21DB9B356A2FB0BE11D03C40078F21B9C219B1DF7A18B138B711B24C6FFD1BDB32F020310CEAAE0EDD865C249AE3BC51E49AD9A2D493BBD133CAA12B214A58D9CE8DF9DF94ED92B839A0AC2B73B2D3ACB7DE2000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000333266B8041A74B14FA8215534E65D423096ECABA77ACC731ACC66F41BFC3D606C0E6946937C5F1E3680F3EEE65D08C2A966E9E599BD87D826EA9E4D8D89D9779CAED2FFFFFFFFFFFFFF5E5E07385FC5354FE99F381621643E6F26622C2FB6F1B673B1DB2C7C0F91CB9FD4921D190144DFB1141A4946C76391702614D523F90DD64CD552928D797741DCAECA0300000000000000FA84A933F9879C5E3209B608CBFE09F0AE29AA9767366E3929F23400D2C04E549A6E9A5BB5E3798D97D29AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC34C75C3986C1121F2FEDE4D3DB987D8E20B4DD2326FFFD218D7BE63319120B6735DBC457CDB56A02199E100000000000000000000000000000000000000000000000000000000000000172E864AD5E7FFBF0F2B8035D9D7F5768ABBE7B9F3E81E744D03B90C93FFDEBC810D324E65A24640B281449D4BD64D001A052F7C3B826DE934D7B4C9D924D1E49958DFE6E587D6E77ADEB189D7547068856A33FA5AA4EAA29DC511D47E8EBC00093F09CC8993CB6839A22960B9F38DC7ADB3D30CE29506F1B025F54A3AC5B254E6B2FF6E38BD9833256F5763FFDF6102197D508CEE4B6D9C799DA55472465F309BE4F172171F22C96D79AFE2A2E6BD0B211A9904301454CD615AF9B0349C8400111CFD2FC83C1D7A4D66C5EACB288FBF955D062165A5C47CE7D1A121F36A9CE56796C544A5AE27EE640F075C54CB9C02082F52D3B630A8726EAB315477AA2CEB692CED638A767863A2A17A4A4E0F174CF2EF7BAD4B7EF47518F12F31CF91C8006C7E2D7D57A30513B158D27C3771480421FBCACD9E975F1E0AF9DB804B2B52E16D047D78D5B4A6A51681A91A11A72200F43649C967D66426C856535CC0F0552C2CB180CAF38777BD9FA2E75DD82F61744DD593038869E7927C9556E7CF69AF0056DB551B65D2EF2C8DA7868A562B254ACDF9A0865579EE72901C6792985AB5A5E4F835A1248C4A3BD06BC433AE09F3028984C64C3EAC7057E1C101F49AF8A027905137046A65CAE8BD18F4F5E562DEF94E2494F667B22C5CF95100C54BDD4D01BF4DE9477E1B5CDD9AE99B85EE9E8B8CE47C19010E9D94617AB6F86BF891DBABDED77630ABA69C3A06C58C6F4D2A1002B8B1969C6A60AF5B92BB638D36EBB00F2D9B922E32BDA403BB09349BA28B9480167F676C0BE7566CD1FC731BA5EA61035ABCDFDA7C03D533DB125A52D0F188793EDAD9DFDDFA9D3A4358FD64CF0F9B5E63A7C6A1BAFD289E86A33371709BAC00A4AFF61662F4C4BD759BC0E91A0C057823E9218105E10AEB2A6CCA9278441762B91BAEDDFC8F21FDFFD8914C76E45D03 -smlen = 2012 -sm = B21F725DF226FFC3A6DBEC90008BD3DB7F86C6AECB3E29E89901732C8CD7FE1AE237A3C880B3006F174CC97CD0AECF9421E03401C20EA0C2AC57B631ECA773CD01DCAB760DA1255B47049CCE0000206C3C5CB8DCFF9E466BE933011BF9651E9C6BDABD194B306B018381E94AA33C6BCBF1011286002E8BF60EE0FEB12B1ED92B4F014327141291000AA099B1D08301C527E37BBBCC0886B2831E15008A2AE0190E2DE0E1B437283001EF88418757BECFCEEAC7ED5401E61B48996344E7F1B4CA2C350130C0F4B12B863A9F145AD2AB0000AB6881BD222E6EC94CD9407ABE8B1BBC9B51E3E3A0C448964A07037C87C3165DEEA52598FFF7950165BEA932AA78034347819981710CDBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 - -count = 53 -seed = 7031BA806F4D8BC28529163B239E0EE836871C51D2D62B601B71D6F2B69B203C81440F8FFC09C3AAD94DB1D880160671 -mlen = 1782 -msg = 6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A -pk = FFB4EA24E3E743581E84A1C31B3EC7177E1C5424168D84241AF68AFC49BEBD3042F4A9BFDD08CEA0157A250E4F10730189EE4E80C633DC34BB201A5D0E49008D6E558A7CA44D29D85B35CE06F8F3D4F6C427BD859FF91526E8E6C661B21F9003 -sk = FFB4EA24E3E743581E84A1C31B3EC7177E1C5424168D84241AF68AFC49BEBD3042F4A9BFDD08CEA0157A250E4F10730189EE4E80C633DC34BB201A5D0E49008D6E558A7CA44D29D85B35CE06F8F3D4F6C427BD859FF91526E8E6C661B21F90030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FA89D776AF830E0FFE8F39E6109C119F3C47698677C575954E4977CE460AF3A7DCC12931D3C3A62A327E316B62A68FA80307D8371CCB7D2054ADF62A0FAA29EFBF800F00000000000000C73F54B28437ACE7354F2C70AEE72AD80C6EA2E6F9F6C63E601CA445C3C4481705B1C030FB2F19975D12A86284F6CAC4D2855B0E72E1D685A0517CD3F0FB2AE8BBFFE7FFFFFFFFFFFFFF2793E51A98F76CBF16D761DCF605D919C7426F2CC8DD7CCAD68E9C4A8462F58D2B301EB8727996108BCC16FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA21031EEE3C55255676C483D6768AF89186DED03692F88361A3D3944F6989EC95EE4ADC7BACE4AA413C2A01000000000000000000000000000000000000000000000000000000000000CD08533A0EF010AD75F41BFAF9D4459EAB0F1868BD4DABA9895F888BCD655A719C05EE6177C2E0F4A46FC7AC7981100323106F06FA60FD5DB9884433E3A846B80692FE05C6C2215A8C459356616F277FC38B5FAE4379A9B749368430E7787300AC49CE0D37A88705620BEE2FB422DBC22D1F2664F87A7396C5190C7254CE00938EB2F40785DB2CECDC0AD3CBD6FEFB00EF05A5FE4CD75A670245236255757F1F0DFE904D6907081CC464151DFF2789C4039F33A47C3EB55139B8437E7846F502ECB4BA86E3068F548FE9E61BF57546500D0D671015BAEEFCE230E8489A0822D76EDBA0E4812D9AF88067E1B524A89C037CE382B198E34BD025CA1A59D3593918ED3DF01587C49D1435D99FD1F0AA7FCE10A5E461B1B327EB7B46AECCF10C40027C3E7461FD32BCF77D32D089A14EC4827D085ED75C8719350DCA98461AD8199AFE8BB827752607E8BA2B1629DA5D3503E719FBBBCFCAED325AA9C46C1DCF14D97E545CF9F288B9C9AB4E9FCC50E0BB88F65ED97AAC2EF45D306156FA5EC11903D807F4631F385FD768F168B8108E7CB88E667106C1C82160AAF091D4AAB0C24867864F15639030814CB7183D042BF5012370DEC7E9108DA37F0753F6D52FCC21A3E9491C617CFFB13E9705226642BE386DBB16329A0365D5D44805C082B190000BBC4727F2D3578D55F8AF7EB1DF34ACFD38D691CAFD2418B6AEFD8E412AB6558C4EDEAB6D665B69A759F406537D46032BBDD65B964E546C82F8904C6FB4FD3DC08D176C9BA1F98784040E5FA92BCA457903D7D9088CDEBF38E397C8DB3FE000F4722D6F78CC895E940AE149D886A619AFC1E363B5B3794ADA5189C94AADB639B76E943EF7393C5300834DD20D73A5002C9F3BA4DCC5FDD1A88AF123604DE6972FCE83C6F00B5A53E1256BC043DB9B9337888B6427B3B37847DF34AC8064E402 -smlen = 2045 -sm = 4179A2653654C1220962074900F0233DB38F3ADE1AAF1FDEE7004556FF3B6E43A5178EC50B3501081FEA662477A8EA9F42043501EEB1C3310D8A286259C6B3B1013C23479E339F4ED85DD1198A013A3366F308F0B0C95F700C9A01D1D85CB8F558C7A9C3D2934C01E620F4DCBFE5F4D3C89EF41D0132B8AD6644BCFDE060A65EAB016DE746C2D77069F86F8A8B6F01F5D74E99F438B9018338E67801A234A322C465F3A2D8CF9BCF01022C8E35703F9988376BB41C00468B477D47E3DFE40BBDDC7B00FA03698086364EBC9D31E1B4000175E9E924B415606977D37CD4E798D74AADA85451A4B0CCF2C604037BA07062106D09BD627F283C008E1691250292C7C1BB8760F6BF0B6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A - -count = 54 -seed = C8671A5D752CC6DDF075C899797603A625C142485EAC3D57CAF14F2244D7F84D116B28F959912A758E519D588A6A07EB -mlen = 1815 -msg = 3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 -pk = F652B3FE6D86C39D18397348BE8B83C257EB3037B9C6D4CECAF6845C6F88D21F39AB315C9B3A5EB8D80D7F197885A9016221C6F0E7850B526A4A2DAA3406D12580631D74CBDDEEFA9FCF6A4EF3FCB417A88F3AEE4FC0BB5FA0A5F143911F8400 -sk = F652B3FE6D86C39D18397348BE8B83C257EB3037B9C6D4CECAF6845C6F88D21F39AB315C9B3A5EB8D80D7F197885A9016221C6F0E7850B526A4A2DAA3406D12580631D74CBDDEEFA9FCF6A4EF3FCB417A88F3AEE4FC0BB5FA0A5F143911F84000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CB88DD90E881B4F8CD9C4A9BF3650A50384B96474DB292E52FFEC1AC02FE4F0B20980591F791A7F4BFDF2C4AE96507C10E5FE7CEC58FF4BFB3CBA1A384933AE199DEF3FFFFFFFFFFFFFF56F1BB3D81D127A60455F6AA7C2954CD0C000B3169E73DC3B8F09AD5F701C17FDB8D7FEF46BCAC71EF98BAB67558A771D21BAB66C5B6BE3B4ADCC69E5804723DF3BBD5FFFFFFFFFFFFFFCA8ACE57ADC73986D05B717A00AF3B0F05AE7A01F09913A142D2BCFB7C434BF262AA8C9513FC30AF1E8F82FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B8BF3DEED21CB807DE4F6327E6407AA2FA9904957A44283A71096490677A771F8E450ADE7E1EAA4CAFDD4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF704902571162B196A389FCF5AB3184FCF67BC95201C5BB7CA1EBD1D36D4BAB7FFE9C14D7B1159823CD2E8F46B44E6D033C7BE035CB4C2BE677EDEC10540BA0F76FDEB83DAB1FAE6A1D30C0C28784B30D8C5C14AF79F32D8D892D62CF3F3C8E00D80AE7FBA2FC34456F52952B02114AA2477AF195DDFEF68A44ABB602BB71FB3813C0EDC9DEC60897058CD7AD4C3BB902E2BA16E3B2BA832F24B0099451705E2DE14CDA6E16129471EA914A9A3B368684105F727EFF354F23215C688BB359710047C67667E94A8CB2E2C24E508A637F9D3BB1AE7E8B35B17114A01301C6498140EBEE692EA55CE4784FB6A9FCBA8B260224B74CB42D56EB7C7121269253D721B6C80C05A9C54945ABC4C423BF7F4FDC968200AD848AE0C8CE844F1D297A8ADB02BBEF48D9EB2ABEAD3654397587ACF77701E68EC49B375AA49FEA293D3F502848B62BE775583BFBB9C19FA6A9DAB5D40148E7E75AB18726FAE00130525871A222780AABE8664E5B34E2031BDF7958086B1EE26FE2A0826BF4306577A0FCB4E801A3700202F10EFEAED96284E2F9BDA523C01206C0CF565A9E68C00A33ABF94921A5FE3A91AF46D0968127798CC08D8B014205B3569AA1655BFA4B2C6A373298D8856F231DE36C0F0A6D6BBA5A16BA7229EAFAE7CCDD4804DC940DC001E23D740177FEFCCDF42C7C701B05512D5D622C3C29D873C2842EC3A601E333F2049CEA2DC35AB1278F0EF089DA0CC07C92DFDB03D9FF5782BBF7C4A8D8697CCA6FB35812A066EEA3580D81060258680DA23429A7EF8EF1B0FF5E2C0AE6CC67152463B900166E6A4B75F95E05FB97F5D14B8075E9C644245378AF1544644D735C4B1A1C68CE76F3335FB24C5BF9420273184D0302EDECF0071C58CDEBF292E8E89B9B25AC032DA7BAC76D52FBBEF0D70863B3B29AF05B1F149147C90493D0CBE4D0B80201 -smlen = 2078 -sm = 932D3B1AC4048E06F9596D28001DE0EEA24C150D334E1C496B01DFC3A57BF2108BD07BD428E00001D272389085A69229E1045200288BD87A5785A90E89AB5F0D017DAA9AEFFB9611698DD70EE50015FD3F3B5779E05D554F326701D66EA1B2FB5D6B8EAFF9FD5400A0C5C11A57CB7C96038E1F5B0031906BE452E050212BBF45DF0085623D60685B43EE68752BDE0183D27FD973488938A330F6CB0090658A25209519F5827D958001340A22B757A5CAB464163761002765693C6388591A0CCD4A99019808F0B34C342209FD85DB540101E9D4F1F5BEC5F5A955E7148A138AA6EF14AE5D804A0DB7E6FB120328F5B55BAFB10522EC8322AB004547841AF47E6BE95EF0543408013EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 - -count = 55 -seed = D780D7688AF364949A196657A066BD48FFA8DC45B4885279B6DEF362E5957F398CDCE1D20FC3F8F63A275C325FCCE654 -mlen = 1848 -msg = BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 -pk = 387DAACD7E0BC6BDC3CAF5EA420B9F075C69AD9D77E6D8B232E1F5EE74AA07383AFF1304EF38CECE90158F52065256007CC64AA054E899B89377F708A5AC98551969A4B82DABA0063F330CDF1A0BC1BD6A005F207A6586429C490AC70AC82B00 -sk = 387DAACD7E0BC6BDC3CAF5EA420B9F075C69AD9D77E6D8B232E1F5EE74AA07383AFF1304EF38CECE90158F52065256007CC64AA054E899B89377F708A5AC98551969A4B82DABA0063F330CDF1A0BC1BD6A005F207A6586429C490AC70AC82B0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002826F3AD9A5361F4416036009B156596A40602764280ACEDF1A0A4855BB9BBD3E203BE52C81B3150B7ACD5D4D200D90AA12FADDDE41E0818FAC3F6294C1A12F107F32B00000000000000CD088B4D99059FDB81D3905E70BA0FC4BD5535F1753D959BF53D11D6270AB2B3FCD296DED679E131A8EBE6FC41B4C7DF9F25622227530BBD37281D47E7F1EB5C89F30600000000000000331162691C286BE735E3C5109C4514FF6547A9A5A184FA978F47BFEDDBA0E3B769825EA1CEFAC5602CD4DD00000000000000000000000000000000000000000000000000000000000000987165E34049161713754A0D70D7B17C0E0D723D9F9C7B2353CEE479030CF7E519197DBB984F84A56E09D100000000000000000000000000000000000000000000000000000000000000AF53CA27DE116E0B91EAE5165BBC64146D4C72721FE23BB7B7AEF69CD03789D1C17D5CB64829CF6DF22F6586E17011003DCEBF65A48341E6F2BCE67E032297D6B68B3EF88B6C86C95B69AED66B364AB50BA6D488FA5F426FA8FF937BB0819101165919FC08B47123206689E832F44AEB528D79809E9020F5F54AFBEC223046BC0362AA8063986E7F3C7076709D18B401B86A414187F6928ACBF50B780A20952D086BD969C9553668750F3C4B0619D2714FA58F95AFBFBE093D682CC38CFBBD029926C29C6463AA6C5BE55716DD6502C3AE6F2EA6C1E91C177BC89035ED7AE3F915279C593FB7FF25800640865DED5500D6EAA12702149768B6676C5A399C411B04664E47968E9911EDCBB2331CD939739F8EF297C6EFEEB2E0536F254BF28D002EBC4B476A76FCCE6C4F661938A6465E6CF141F969CBDA7AAED36CC20B8C174E62C769FF447CABA292B0F206E44F68036506EB59739F455B4142E8A44185644A59F7A67DE2DF31632A962BF6CD91CCB7322A04EEB992C7F812E5F763834A5B0202FF3B9CAB62B198538AEDF6772A469F91574E9B571F699BFE48C5EFD1720309339A89329BE09B1BE4B7BD7A6F38A2003AC7ADE655E1D1C28F13DF289204DE443786C8E1DA0D91D66B09018AE6FFA8A2CBC4B2F703068454ED551B3A8E96EA02E8E3768F1C9944969B1964EE7E6E622123C4E7A05B4FFDA80483B3CB7ED35364F92B1D11193A6F9B33B131B5452EB60280DA27873A95E6D2D4C1D9C916F13A5212C7AF531B33D325623BBB364EECE5C961CC7802AD6683ECEBEFBB0BDE2831024EF2049177D9D53B581677CA8730C1DF54977741ED24B48EB2784116B99761EAE1F15978CF227C94D72DE4FCAC4A1C02BE864A2B9733D74BD3106E842765DA53DEA60946D034562D2EBC6CC1BAED8E7FFB2A6976E6E2FA21696DB9A5321C4800 -smlen = 2111 -sm = 62E67D00374813F952BEF43400AAE01E64695A7F659CBEBDDD00B08A39ED321E072D656A59650145F31BC4BC9DBC16338F122A0173155484CD0C41B12D5639B60002A905E63898CB6F8E35B7AE000A0AEAD196D3C384FFBC28A201A81997154AF21E8DE7FE1D7D00D507BB262914CD6D738A458401CCCD465942291C36F9CC9C4200B9865E350764BFD6D015AD2C0027805167ECBF318C3480A53D01D53002D7AF5995C77F53A48B017BD5640068F8581CB072665C00240FCC96ADA1ACAE1F43F0E8010EB9598D7369D9D89DD38714000173C3E0BF21C4C6A41CB8D82F8112D6A62C4322C5FE233F29D4120159D158779549537B0393316E0126D6C3D4A3A2DFBC45906D63E20ABAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 - -count = 56 -seed = 36AB8588F5233D15674677535A682382C29968FF824031AF646F58FCAF0E83C1C486B1E75479149FD6F4D9E8397CAF73 -mlen = 1881 -msg = 0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B -pk = 97C0698625F46BBA52F26098172DE7A1FCD20C7446B9EC5B8F3A936231B8D1DB1E07335B06C1E243D474A40D3E0ABC034F8C8F6751F474796FBDE25FA5D013701C5818EACC5CE6737C3E6B167EDDE45B43B1E917FB086A19B19121906E0FC803 -sk = 97C0698625F46BBA52F26098172DE7A1FCD20C7446B9EC5B8F3A936231B8D1DB1E07335B06C1E243D474A40D3E0ABC034F8C8F6751F474796FBDE25FA5D013701C5818EACC5CE6737C3E6B167EDDE45B43B1E917FB086A19B19121906E0FC80302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008D7B0C5937444ACAFFEE8591095DDC4C85FBCC45E91B2D9D4AB0DAB63C5512E0DD8617EFE4035E6FF75F0929A4BB29BFA4C6B39DFC6E6F46EC3E8266CCE7B21E51540F00000000000000BC9441BE8715328EEBEB047A78A5BE1A3B77E4AD769FFB53795FB4EA97750DFAFF16626496D64C432373F860B58391173E0CB53311974A9F2359FD45825186B16759DDFFFFFFFFFFFFFF401207DDB21AC5A21C2DE1DA8F005A7CED63AD26832CE033BFF778A0EA29DABFDEF778765E012AF37707B2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBF54B66A08BB669FF243C13B849ED1ACF1232B1B62BF5AE2588E8EA63361E7520755B8C67FBD8DA9F85CE000000000000000000000000000000000000000000000000000000000000000FBE51E7CF764C9141C5C07B3F512FDCF3EF11265C9C1983E72F6B3AE57E5F3F139B9856C4DF4621A0FBA90ED6192F0130F0172B91D3B023F46EC1D509B4E58B975E113369671EE9442FA81249F1072172F4AD010C0C7B29362B4BFB2B89D10194445B2B75B63FACF83EA9005EDED8346F09D5B4877DC7B8CB86B5D346D342BF06E4900C71F432D1B59617ADDCB2C50050AB05CF85228DE25DEC3AE01F3FC84F76B2E7A8BD6391E2BDDE0ED047ED6C435D23ADF69E61BC9DF663A00504C0980086C4ACBCA5F189877A69E47BCA9160A0ABE5E32CC04EB7BD78FBE9734693FE8589997742005F978420FE622C2C7BEA00D4B3F5F1A628F01798EDD0A48B91A057B94EDD79FFE4B5E89C03ADB5164F4EBFD902B58AF1A5B273659C004621C39C02CDE448746FB0016895A66B81FB16DA27B790074573EFBE98648327D051726768B4D8DA57AD05D89CCAD88AA9525BB602E57D50E8DD6E2970037C686F6F2673BFCA95349195A1C7A66534019575CBFDEAE022FE560590B43B598E349DBE695D01B63B868D34A719DB88E2687A88989829C8B554E1F49B12E08AF8D4A9DBC5733AD698716BD3B2BA1DED0CF7E4633175001804D59B719AA420CD4E26B607347D5D763E295228749466D01292F9627E0D25813F279FCBD4FA0C3801C4A3A4070D0271A4FF8EBC23C19E36D897BE07F61117D2E64132F012C25B80B647D611156B9DD7A628ECF3F79D5342C67D5A90F78C008216FEBC4AE7399DD4201347D8F0F8D90A6DA6942AE26B124ABC1FBBECC0041715D4A5C90BB4F63D6773D3DBA5A6D400405C64C808A868A5242F7A13F5CB214712D6A74DD86E643923C3B29113E2624EE8477A453ACE3739C5FBD4D25AE7CA01A3690238672DA7883EA09FCD75D75521DE50DC25768934F9438E6A55F663F71027C881BE3812B2DE90FD68509A34DE02 -smlen = 2144 -sm = 03DB9523FA93E62A96A74A8101211D029CB894B016A599C7930011AB8995523C28B9E051DD8901712189A56AB8177A7C291A37012C2EA12348C428E1F31826FD00ABFF892231B0B09D0384A2D401FD98C550FE696BC41C86D65B01DE588252295FF9F9A01A54C5002F4A5CE401273AB18820773F0129074A416B8324E2CBA7AD6000973B496DBEF51EEDBB3FEF360021AB500809E3BA886345B38600F73C87733A81ADAC7460A6F300CF3840E65EDCF83A1E8F7AA4013F4664F20C0F9EEC9537C56B016BE4D58026E6B62C2A33AFEA0001157EF9C7547873587DC6F320B1CCE1DF46FDABFC19677778740403E7C73DA7C69131007065A6D3002BF1501F0D1583ACCA97A72F89090707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B - -count = 57 -seed = 4E94DD734A371A7C6AD4A567038CF93BAACE2B9D30F3862198DC55D2F21F8FDC9A7AE5DCA1541712179E3AB1FFA3F792 -mlen = 1914 -msg = F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE -pk = AD5822D5BFA5BF6B2C416A8508CB38774726082BEB3503BCFB60288B7AA9733711AD8A1FD3DD5A0B86E01C485F9EE701267194F423129EBEE01A6AD37EF04862025D7CFAC368D7721F9A310618084A2CA3E67EE1903C2105846D386130600F02 -sk = AD5822D5BFA5BF6B2C416A8508CB38774726082BEB3503BCFB60288B7AA9733711AD8A1FD3DD5A0B86E01C485F9EE701267194F423129EBEE01A6AD37EF04862025D7CFAC368D7721F9A310618084A2CA3E67EE1903C2105846D386130600F0202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C0E83E77C2930A88227155D73529C2023AFEA36AD6EED2E799B1A8E2EBD1B8775DAF2B285CCD774A7672C123B3B46681FEA90C0EA0EFA31A9A8D28CEF8EE1BE19BAE8FFFFFFFFFFFFFF79264F323F87DFE35E6B806714857CD5F95AA24947A2B65D5DD3A106E7C06AB461DEA59BFAA05072644FB0AD1821C8CEBC436AC6B3442F00F301F2099E589CC5E47AE3FFFFFFFFFFFFFF01866AAEE38052DA3E9A26662744E4DF943881733804AB36023FD0D6409EBC5525F61D5E0677D66D3409D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF683A7AF3A70229F5AE676A26163A6FEF6856720BD006D0D455DC0A59BD9BA387E7128B294567E15A093AE70000000000000000000000000000000000000000000000000000000000000041EEB50620FA08267E14D5CB7B154FE7B6FA50CF89356B8966D2785A3A351C8139A0D1918855E07A7E5D2B0A0282AD0191CE2DC371C648EFEC150C6A1737D57891DE0038A2B426D7F4A780B7BE0DC952AF60F3B5B1D4B901CA48AA344CBD38014F56649114E27B9C5B2EB89C455CA4EBAC1168750C3AF37547C796027BD39E7AE5A6378FC271F3A81A30155D2816CD03F485739A812377F589D8184038C9FB7B8500F16E5C12892113FCCBDF185ADA154A1BA5929B196DF46E2469ECD7BF31011D181225349D3C2A8D5A33CB1D72D1FD932ACD54752E6A78559290A0D208FC42572196E520D34BF2411BA4D689E51601AE887FE5530641C1613620CF8FFDAAC7E2D3065579FF2399AD712617A756FAA7A3EECFF8D9202CB705CBF8147225FD0172FA72168F5D7D9ED92AD799A2D4F2D2F0F8EF31E72BDF42CEF4C18B6B8217F98706F079F8EE26015DB646C599C6E1018CDC1643F2C85CF814934B85229CC15E5ACEE23E1BC6855377A779D5996A6F7D21D7B997E0E4732FC3150FB4E76D9C000BD48B13C04C0DCB8A161EA14BEB74BDA66B39FA3424FE0B38DDA11D7D9A5F02740BC62C27B2E873D52E7621867A8301ADF0EDAA0AB0E55B480A6D3F90FF82D82C402ED514336FC4F65F53B36AE863644DFE2D12C9CE662AA1F6E4164D5C4E032F997CA102FFD08F14D5FAE01673A6B9A80321832F4290CAE3ABC3C82B2A805D2279EC6C44B6AB570FB7907BCF2E030298C7A631049F99F04127FD5784A1166C2E06B0C1257C56D88AAB108DE3DD7244358973616B7E18F255C35651191FBE00BCE5F36D4C1439B9FA727EF8C1B5C9A6BBEE2C7EAC0F45621D3CC5270B830AF157F29E68E46DDE2CD36AF1F2DE5C2601D428BAE85CDBA511C0D8C1CCFF27F56B08B02F8E260EFF715911DFF7995074042FFE610737039F203FA96D82F6C9EF00 -smlen = 2177 -sm = ACD4A1C2CDB46DABAD2BEDB300346FBD8E8986E55D9E10576000E306DD6B543A0AA56AB18E200124AEBA637D37C5A18CB96BBB0136BBFA7CF61E0548218ACFBB00C5F2C8A65FC0C3AAAF319F77004C0838B84265FAB37722048D0048EFD8E67E9066172A8EE465012FFC5BBD4DDF8930B8278ADE0112B512B3DDEE9BD5ADE79413007B090BC5BE0962CE7231DFD8016319CC313F0AA268F5FFD8CE01EC80532608A4A003425F403901C5C324595585BE2BA005885700617A9AC8D04946F53AACE86C006A057F7D67312B1FCC605E270000AD3AB4F7E9A8A3220D663FE040B29EEDAA5528FB341941B95816026E3DD3DA25AF2A549942999D00F1E310C723E2A6F41FFE88153105F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE - -count = 58 -seed = D9281003AC5F7673E0E9A7BC29C4ED75E6B0F228DF49D11A2599BFF2DA9E887163BB26DBA4F071FBCE02891540EC6F1C -mlen = 1947 -msg = 437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF -pk = A630FED8FA16996D686749A9DD68033E79533B743C026A2BC2FF14398895DB72CFD9B248CD7826CCCB6C55F417BA08030E82B20EB4B47799D30B94C00818C5D78B81B27D077AC50FFB12357765E89E5282E23DE235832D8EAB308516FCA89501 -sk = A630FED8FA16996D686749A9DD68033E79533B743C026A2BC2FF14398895DB72CFD9B248CD7826CCCB6C55F417BA08030E82B20EB4B47799D30B94C00818C5D78B81B27D077AC50FFB12357765E89E5282E23DE235832D8EAB308516FCA895010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC36C73259529EAA764B63C3A28EA53CA0E33C686AB400B5C4AE37972D91BAF1894BF9414A57A1C0EF765CBB10D95CA333676DA550AC83150D44E83CAB24B0BF6C36F3FFFFFFFFFFFFFFBB8BFA5B6B3B08EE7ED81C6DE5E7B14613A001C2A5BBFECB469353084468EB151200F4285C0928BD64F79A2C417643BFE928B2E3D1F50703289143D79F31D820113CF9FFFFFFFFFFFFFFB3B0730BBEC569BB6B99C4E9061C77FC95713D9BA1E86E86E263F56945D34E1B2FBC11C27FDE1693154CFBFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1068DC4608B8D435804350474A936EAC412A547A5DAB21773A1105D8249CE5F3700C05F8E9F4E00F966D13010000000000000000000000000000000000000000000000000000000000009F2CB9B6A8C607CD16CA94C7039BB6345913BB619F0F6AEE5317C34C04B0FF8F7DF4718750B3D19F45FDDAA0A1527200E1B0DAF211249ED1F32AF7B82D2F346ABE8D676D641DC76B8DB0E86F08B4FDC5B0ADC1E977D96843645E6C3BE9FD5E03648DD784D6F0C907272F713512CDBDA42EE6286C91BA5E7A3E698FBDF47E7E134DE882F70B0166777659ED101C8B7101B593C514ECB6EB5F4592CA6850FF1D3FB599AD0429F9CE691EF2B39C794D63A01572D15B16F5F4683650E3BB3BED3A0035BC718AE49662AD2FC52281DBF597DF7E8374B7C0874213760F1D73154061726BFE1A333279F37E5D89507A590E1202B853432BC4AFEC913E49B5DCA047CD0207067B5D5A044BFCB0E22465487471D518E02C58146B6351714F55C3F03826027DB527B6F0FE0B3D2BFB0E6A02CB05751DFF64AEF5D62507422DB7F41A70F94D500795832F9D9638E43C8F2F8119A6039E511C0B132C9A57732D34AA4CB81DF51B4F4F0E358ADC68A522AE60DBD14D28F9B06FABC39C39684F8EDC358DF13C03059F197A795CDD1451489577369C8C5333B4658CB024DC8E312EBD60D68687990F2E19FC7EEDCE77CDC45425EFA61600686F58954B7E22A9CD44112FECFE2287F68DCB61AE700CB826FE83884EEA08F7D1864F2359DDA9837C698A38ABBEF70267238D86D576586F3EDD7BE6C80397F73A88310FB37CC45A69CFCDDC2E04BBDAD131A1D16B74876B799A093075897601C5CE37C9256684330DAD76A1A36E077CEE56AE0A353217D32526CD14FA47D9197E43C7195982193212F922C7870AB8036C097F2197C8D89C4E32D9FD2A552C799D570CB7EA1C98C75ED9F0E9E4F969380D09A9D8F71C680096E069418570EB0220D4584E0EC50958285D70963F4A71B104F70A2EC56DBD2CA7E137304EB367A97CE97C99C5F99A70B33096185EB00101 -smlen = 2210 -sm = 64200E0738E87C11B78BCC1A0047FFAB21F6FDA6136836FA130174E1FF25F7A57C9E333FF1E300DDFB3702C75B2E419EA3C00800301A7EE527FFC66830BC27A200D0A86B11CE2B1BD3E327726301CFA9847C0EABCC0FB29EA8BC01DDD664307E646E5BC82CDAD2000FD22B5BDE11C9A72566C3EF009DFF2458E6F1007DA48779A701E9ADEF01267CA59F1E20FA7C00515196C1C61442ABD52280C901C8581951B0A9AF97E16D7D03010A2F132E52F39BA0DAB8EF1C01D6DD5570A1C2490A4B29BFC000EECB518A0450939024101FE001013F55A2DF7C4C7199BE80D64774342FB7F178B453A0F58EE6741603B89F26950F8A59975726BDC3014652593B0BEA919D8462ECC1C608437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF - -count = 59 -seed = 750A74866BE8DF4E60BC14BF36E6D83ABF6DCBB86792D125CF0980007C5435F40F87BA96498A88252D9C5C6710807652 -mlen = 1980 -msg = E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF -pk = 47E0A69A9AEE06526C78599479593479BA5D38319F3EBBDEE0B1BFC220AE8766D189CED9988CB0055DE3109769794D0145FF2BAB6D1FBB40DE6ACAE3E1EE6EB42DEB885959DF217B5A39AB9F1FA8C9B77477854F466355C89D82D7238546A901 -sk = 47E0A69A9AEE06526C78599479593479BA5D38319F3EBBDEE0B1BFC220AE8766D189CED9988CB0055DE3109769794D0145FF2BAB6D1FBB40DE6ACAE3E1EE6EB42DEB885959DF217B5A39AB9F1FA8C9B77477854F466355C89D82D7238546A901020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046F40C38B757C1D0BFB6B11F5E6B367A89C2745C71E35FD6459B9B25FE441DBA64248F1333C14A529D010BAD34353C1E6D363F353B0D07645196AB451859B66ABFF4F6FFFFFFFFFFFFFF7F228EFA99E1F97D267AE9CE9FBDA9B6C10AE5166DB6E4AD8FE2D99F8702F6A8FBD70E1EC612E63F787F1C3550690A2DDF8658D1C7C79376D35C8A820C2BD076AB0816000000000000002F576FABA07A9E0A950EA8E626FC538F50DDE915DDB3E8D8A0A6DB897D09A563E7CD70056A040BDD768C51FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1EE03E44ED618748775BE2E4034FB3565E5B617D169A8D9B7A19AEB972051236E74E1B08C29E1C618AC215010000000000000000000000000000000000000000000000000000000000008CD8632ADE02E44C4BF24C3329458E07DE02BA9EB45B8960C1B78C148F5C12681CCD57A4D48B2B0D5952F4E4583F910201FBEC041CB2D80B8E6DCCF3D2823B975FE46F2435F8BDE90F97BC86F41657BF63B7CFFCD81E90CB021720DD5165BE0321A78667D86D07E64A7D6E310AF2494A6AF225917573290992EEA11C3238015381A44A657048FA239F5FB4EB14D0C8019BCE09E1E33DF361011DD8AA5306E471F2F98CE4791D2CA57764237E98BA24A9B46675952254414EEC1D8A88753567039593D8A25C58CF0935FDFA93A6139E2CEAE978DA78644A176CB935148E457C65CE25EACC3BD8B4C74BE53DE9A6F1B1005662C8C44DEC16261C17C2D6F26AB9839533CEE3F442B14B492990E5AE38E1491F1008703DC19C3EEE728D8E2D0C0303D21BC40E08D77CF9D6910B0F386FD6E12E8B951ED94F31C7E38DBEE87249A94D579968A3475733700B81C30A0D5B01021159AC37DC5D3C046BF77834AA482F30771A96D12B7DC1E59423CC2FF3D9BC2120D0A156FD91353E239D386D4B6B79029A61F405E5568F495D0204138AF8665E1726A64088F824FDD0A5B87776E30B6305912F9F79EFAAB6E06ED5CDCBBD500092DC6C075EEE0861682124B9D67379A03696770B0205D3279F0C9F887BC2B503ACAA5391E69157A0C62D84DB068F9401100AD7F44E4A6C7FACFEF9AB343CE52D18B0EAE3088832DD428D1968920E029C1ACF3D20FDF152340B9FDFEAEC9EC8021FC42E7604982CB85BA7C9110F3578EFBD5C334D940387A70FC9ACDD1A38EA502C1D7D16E00F62BE15020EBD6EB16A008DF947DEC2BDF7E4F22D148800993A69C906AE24AB4DA16AD7C6B9DE49FB4D662BFCB6C9ABF48769A7CEB37A70C254008BE057EC6E6AEBC53117698692A90CEEA8AE291CF1A453B342F88D211F64339FD062037DD2C8CB6C9C30C014C467A201 -smlen = 2243 -sm = 96302992C2D1A8EF2E8F7C99004991FF9D50E8A0A7ADDC690200E51CB2E423E8E7F886DB9F9E005227CB7FA6A870AA0DEC32590129A946C2D594DCC201A736700106520E94945E7A042DF3D023002401F500A9030C28557BD9CE0057A8C2716813177B87F5542700E7BBA88FD3425536433DDC9501BE69A57104BEBC29A3CAF352010D6802A30089274565AA665900FF41A8DD40C202E53B75A0C90085105F1D95A7BFE98BD7B6A300A50D247ED6ACEF583FB6801D00A822984AC34B357903DBAAEF01F0D42B339F1DAA7B25B185010101DBF251B31D61130C062E70749A621530612E885D59207D5E7C1403251341D539EEC46FD17DEC69005BAB6A6980C28EA9128E467FE809E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF - -count = 60 -seed = A832D4AAE8076C4EFE8319A74CE315928AB765BB629075254CBC63EAAE691C220F4B5E1839E9A99D8747AACD7C2F1EE3 -mlen = 2013 -msg = 84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 -pk = CD5E25BEB137D08CD1DE5EB1161FF6C396DED42B91DFBC4CB150E96C84FEA80F376A067F272E27A4E30D6312A8CEEB00161DAC17DEAF6837D217C77F5576EB1B5934A3A679EC81943EBF5E3BC0EDAB2AC9CCA0870DF172BFF771D057F7CF7903 -sk = CD5E25BEB137D08CD1DE5EB1161FF6C396DED42B91DFBC4CB150E96C84FEA80F376A067F272E27A4E30D6312A8CEEB00161DAC17DEAF6837D217C77F5576EB1B5934A3A679EC81943EBF5E3BC0EDAB2AC9CCA0870DF172BFF771D057F7CF79030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CB5EB47FFCEB3D1C25B13820493AE1F321467E9A6325B1FFD7AAFB0A95CD37144D9AB59FC16A71EB08E6BB1ABD99393B8036D89342EE3EA9325823929999788FEC96140000000000000018920ABFA03A287B1C12FBA056C320927E92292B44516B0E6FBAC65F4145850A6A8F8C10F7621BA398DC44CFE4CC618F6584D462D1F460377CB8FC55466E74EE1AADFCFFFFFFFFFFFFFFC0A080ED3393B553DA0744C3249612FE1B835BE2FC3F6129ECFBC67725159615B88C1095234E07EF3F64CC010000000000000000000000000000000000000000000000000000000000002BC0F0D3690BD617DC8F15E052A020FA20E878640886FBA47D4DB0B495EEDF85D1EC35BE4B44383DC0EC4700000000000000000000000000000000000000000000000000000000000000285304E33DB164B0AD3B741BBBA6000F0CEED1E3B1200CE31F8B66558ADEC42F04416A1DBDFD6B91CD15397AD5BC4000DA30BEF168AD226EF451312C08966EC231CBBEFFA2E286024907F99E4939FDD2518DEE2F0461C1DD49DBC1645CD282036B8F5FC4A56375153B032D0E0E43A53936FE717EBF81F17DA73AA6352449C60003954EC086713B8820AF3C3A3EBCF8010512E6B8BA7445EA954D222D93782A4E79413BE84BCBA9DE1EAD1ABC859818863B8D14FFFE181B5A23A31F361C6125032750AC40BE24C6796C8E64DECFF114F81C38298C3618599A639CFAB17EC15F66DB93174CB8E894266E5A9F623435550261DB946912A0126A71A95520231124B200C18414D09AF6E48F9E7596206B7E9991BC709FB86DF2B155CB7F147A74FA0210345490472BCEEBE1F6ECC5F54D018A5BEAD49C0589E9243B5FC1A9B73E72B3884DA3BBA414C4C74FBABC0481368601AAF7260EFD57FB9EFDD482809447AC062A360F1EC2540274DA3479B4D108CABA0805869F6C331DF772A307296AB249021634A016C0CA29E55E64C83C84761C5DD4CD58154A551D00B871942C78DDD6C514DAC5B41EB7398789A365DDED05C603F148EBAE1AA3183904F7D8A91BB2A1903AC2D06E8D0FEDBBA3642D4ABB7E3638AFD14847ED4C20852D6C3C3990375302F827A1F293527E5983AB75F623E3631A7F3C02A0FCA893FCC480195AACFD201D9B2243C7B0D04A6273B493C23C36EF003AFE8B37988AC064FB6179D8DFD403B808BD64E608FB0E274F8776BD376AF34E0A33A227D678BE19339D38C4A71E760176B93AF2D4E9437E9A4EA14B7850D6770A7691329D6EEFA7B56F44E1F5C28EC746677E2171171C0242787F35452F08020C3BF86C3274241A188D8A60F1E39A0BD0D3BEE5DAF656E6F8C783947EE7A34B288F6553F933893B8A776C00F2AE6E01 -smlen = 2276 -sm = 624D522A9D1E7AC89BA060490064C412BEB25B372DA1322F0B01734957862695F942267E8C8C0075CE8530106D5029440FCC260023C171E891C897462EBBD6F400CCC171A0BDC6B7776308B50400C381FA84B8D2902B508B201700F20A82EBAD4FD5CF9B80CC7801B8FE47793954B2ABBF9EB5B4015EF48F04D6152F90D3246EF801C694B624DFE9980755F685E20162EDD4A5C23AA4535525DD3D011E8D4D7E201D923F5C3DE378004D1D2443A07692B0E73E765A00837A5D354D6B9DCEF5D7E8AC0106288A4BAF709CEA03F3757E0100E5AE212F4158E15BD92CB46F5C4407277F215847B37679A5220E02347115D3BCDC7CCBDAE2D3B901FD7038CACEE39001BC3F4271100784C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 - -count = 61 -seed = 09B8441F47235EFC82D71933A0037FA4F69124C3BAD4EF6A3A7178B417A3FDA874081B7EEFD7EF1BF234C752458FBBAD -mlen = 2046 -msg = 92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B -pk = 8F02808CB372947CEFA55D1A092D4D7E59DD4CE1A1397FE8BE0F86FAEAE3BD1A57F5594E940EBC5BF5C6D5B440547B0331E7AF1D93876991ED08B69395FD5429745B5C2EB9066964137668C187A57D19D689EF6476414D6F9CD71F414A32B103 -sk = 8F02808CB372947CEFA55D1A092D4D7E59DD4CE1A1397FE8BE0F86FAEAE3BD1A57F5594E940EBC5BF5C6D5B440547B0331E7AF1D93876991ED08B69395FD5429745B5C2EB9066964137668C187A57D19D689EF6476414D6F9CD71F414A32B103020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070150B199204C8491E74BC302C316A717AB2BE081092B827F6A93BDAEE97F0E6AB568AB8B9337A28A21DC26EB3AD8547A72F1BD15C2ADAB3FEF26B03D1959D49115B0D000000000000008B9DD2AB2ADA33C8E02135E23F074609196E4D21825672145AFD26D1314264A726C84615F0DA6970CC0BA4EE6592B31FF9DA9883465F800250D1A8629BB46713BB6A2000000000000000AB56A5C893A70F627E8F296F65EBF499D2DE08BC9E5668F0B7F66475F7BA0F7692EC1314F806815D1E34C7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB868CB004FD98F96B51DD381239D5414E5A4C8FCCBBB5CDC4A712825A40EC763AD185E62BC674FF200EE9A01000000000000000000000000000000000000000000000000000000000000EB666545D94829D5F7BB8D064211589B6DCEE5578A37D056D458FF8FB5C2016CB0109887BB84E778350D736C26CA6301DC4FEA60EA129EFE1CCC562BBF041BB933B773891AC9F5BB020447BF2323C8B6569CF4C7ED84BF5566860D15406E610038EEED942DFCAD84B4D84A4D1A21AFA45B4D1756B1700F8D0FF7B18B0F863ACB738CBC899CE8936A8FD87382E9EB390283785E25F4C39847ACC9A02EF100719AE387FE1DDDBCC7FBCC5F8EBC6813EC25FE19B9B1EA1DED80626ED52AB4A36B03FACF072B06CE4D11CC617F53561AF24C8EB460B49D95F05BF36AF5877B51A38D80FDE1CC63774C1609462D97A8346300153ADAD26AD2D3E0010A5652D437504ACD5A8E63D6F5F46F89D77FCDDF800FB37E2E321C79CC30AFF5F8B6D111AC4003454807B0A112A1EC19E4332ECA6471CAC9EA7E1F85130B200A07AAA0B9C0CE0B2B597EDAA94A59FB75C9B8D58EB40D00D8411B471ED816AE34C34D70FB1800D5F956692A343188AFCD01A5F468997F011665A4C94FD2393D2123EE667A80DD00AF5DA6C77260B80D0D7A8264AD896608B6B3F84F75F91D6F5611F47B8B81BEF03A1BF9D55DFB72B22602B6C49240DF0143DB4D348EF7305FBC31C3027A53B701D00A86F1B7D0A34FCA5B9C86B3A0C5AE41374CC2B3469723E553D6BFB7A3C00138FCA500E24252BB016EB3A2349181E0F898031B62C52B36153750D62F14287F31DFF28E11DBB46D19105BAF3BD39A032098DE8460498CC307F684845F4DC8755069E47BF29555022507C25A8755FA307834FBDA0B0A2A5EBBDB9E86DA95D4037FE28067EB3AAFFBA80ACC273963D6772056F5E1D48BB9D3C6219E20B6D6A18B8019ABFCB19EF37FCEFDA8ED171D5F0021D96467D857E1E7F265CA0CCCB09C5BF7935883AC3E264550FDB73ECFD3B0DF9C675195A10B1857C127C3C2A92F3702 -smlen = 2309 -sm = 622CD5E687CA1081BB34AA060063865A17CCC0408A5D28460501A9232127BED766B50C8BEB2901585E98F5CBC812188C580A2700FC8EBD6F8DACA619A55CE03400C48210728BFB46F09375B97F0189DE3A50A15215635D369E080194B6AB980DEE1BBE3584C5F0007E9204428D33B95094CF1CF50168C31101B46DE7D10CB313A3004BFE888DE409952A65D00C8D00951AA50B8D723D42CC1AC61501F4A284EDC84961C05BAF818C000FCCAF72E16301B1F4B01B9700D8BCCB0A27D5A7FBF1F3F5A500C75C28763043BA920687C2190100750D2E673896E26D813B1BE978850ED0655348E4BCD6D31930170250ACB89E6FBB1D1A1B9AF3D9012C2239AD3B1A8A6E4FB98161340C92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B - -count = 62 -seed = D2629CEEAE5C95D3C34C1FFCC2338B4A97782BDFCD39111E18540B69DB035B352D012857111F816F03550BFE5F56ABEE -mlen = 2079 -msg = 7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 -pk = 537162FECCFA8C01DA8CE49B7E89F9426849916AE83F6A9836ECBA7AB27C50B31444EE61649294841C7A8DE9F0881A00B30ED46B6CA7A6A1AC340DEA74820401D98546989662063D6799E91D9BBC755BD5F7B1EACFC342A7C017B65D760A5101 -sk = 537162FECCFA8C01DA8CE49B7E89F9426849916AE83F6A9836ECBA7AB27C50B31444EE61649294841C7A8DE9F0881A00B30ED46B6CA7A6A1AC340DEA74820401D98546989662063D6799E91D9BBC755BD5F7B1EACFC342A7C017B65D760A51010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0739F341ADD0CA3B7C845324E0DE50A4C8A4458DAA8CBEFDC942466636C643EBEAA2E3776D2A584D21F28162A66BE6204997E0CAD4410821395D1A1B226657FCF57F1FFFFFFFFFFFFFFCF90FDD7A5299FB0E5E9C8C5A63E527F5B3094D128D2F3F95816146257AB18CBA44D85F1ED74EC4A1EB57D2F57806FFDDDBE686524A7474141484582F6C2FD8FCA2918000000000000004999FD51A0A01E5A821389DAD1BCAB8B5FA69A029B72296ADB5A1208CBCEDB222167FFAE8D6BF4A57B58A90000000000000000000000000000000000000000000000000000000000000014DED39797ED6F1B37CB3E0FD7D01DE73A1C68F8C23C3454C9C1F1D948AE8254376DCB54EC869883742E1401000000000000000000000000000000000000000000000000000000000000EAE66BBF4DBC69257328F8F03B2A891CE07D2A1ADE5E9C7B851D30DB2F1C744AFF305866F35BF29030561FE7EB151E002E412DAE4D56B7ABFA61CCD6D8BCD17C3D297A67AF44413953CC2B47FB5339E4596734A304637AED78EA5E2B1DDB6F0347DED7458BC607CB98A2E03365A2CA7B59749F1A6F98C85C45F4DFA530B7EB6BED81E950E8AF4946A046B6DE1EF98503BAD6A353383F8CC6DCF7D525167717CA4982A6F90FA49826BAA2DBC8653CF203CCCEB443BE444E07609AED3D1183B7019AF078E84C8B67125147481B41CD6284C1BE055EDA6C569DDA154071D61AACA28C1566756CEBEAC523BD890C89001A01038DD8107351E491A49276F3C153225B1200550CE4F691CE32C62858681C199E02353D985B3D1FADBAE0D24249A649008FF1DC4108DC2A33AA9EDA9F1261E7970BEB6FAEAE657362AAF590D51DF4FA52A394818BF6923A6BF78CA9DED108D60212096EA887888504BE60CEF25187EA583261A15BFEEBD56E36366ABB53A7186C306470FC820C136EDAC54B0CD114CA00BB783CE80345294B9C8B493EAE4333C720FE49DC8AF2F380049C10F13FED08ACB579707809B613EA9C9F08057D99BB03276F1B09498A6AAB45AD3F0C2400C169D22F49567228217C224E27C6592CD799F3862F308A14313E1816EE3E32B57700D223DC71CA410BC783FED0D61F8604DF83E9CD7F7562E8CF3D1B74E1C8CEC475D2AD5AF0F1FF393C8F08D36EAF3ACA00CC77D1B1D4074499F38DEB92C0558331910E15ECE2828437D40D70E0B8855604AEB723D5A6C63B30F59AED0EFF5DEC029CF21F37F9CE4F6BEA8E01A7D73553DEB3AE2AF1D0A9A75617A1E7FBD692616AEACAB6C294A889DFADD588FCFBF2660195541D7AA6C715725D97D2E67957B8D9227FD2F22D9E04DA8857F290FE917A2EF5C3AB1CDAF37CBAFAEE94F2CA2F5B00 -smlen = 2342 -sm = 1B8B1190D71DC9923B59E7CC01D40D215E7737E5FD10EEB40000F7E8A62576B37757EA0A5EEF00FBBD027020A98C5889D9530F010DF2A25293F24946379C6E6A006A2032EA2C1FAFB39E35BD4F01DD9B0B0D45821D56D3917B870123F05B48ACCA69157D486E1C01224DA233CD6FD802B4108E2001F0EAA8E40594FD1E881CF917019263614AC537602ACD6E2A74010E23AE7F11836CB46CA045F601086DBA4DE317C033F26234620153BB5C17E2BFDD4BE60872C90065518FB03436719711DB6FB801B71CE17E34002C8C32E77706000111A6F89F944A3A38D067C27BF1AE732FFF05082CBA119697E619030CFA2E04B4D1B088A73C70BC0040D6ADCAB050DDF9B568C43D830C7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 - -count = 63 -seed = EAA4FB8EF0290A499A1D92EE398A8D7E71CD3CBF01A36750DA4B7EFF175DA26D17AC4ECE49A84C88D1D2C2493563C26D -mlen = 2112 -msg = 2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 -pk = 0104CD03949929068FF61AFE00ECBB6CF3D72A57047F71740F5AE3DB8126C7E3DB25BC88CD4762FD79647C08FD92240137CFC133C05CD7258964E8397F16302615FD76DA1FE7F6105E044BD76EDE8F611F3A506C1AFD7ED504AABF99C969C701 -sk = 0104CD03949929068FF61AFE00ECBB6CF3D72A57047F71740F5AE3DB8126C7E3DB25BC88CD4762FD79647C08FD92240137CFC133C05CD7258964E8397F16302615FD76DA1FE7F6105E044BD76EDE8F611F3A506C1AFD7ED504AABF99C969C70102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006CBBFB9DC0A54001BA194CF5C98B813FAC3717AFD32D1FDEB51883A519DB3CFAB5CCA939B1C51EEAB887854CF2F203DAA244F530BBA734DBC5A216EE6DD6E1B37A611C00000000000000759E35E9341B7096A967DE395A74ACC9F4284E6E35DFFFAC46E5C6838BD920B69C077E5BBAD878FF915DB1DE181CDB37B94F87155C43B61D1D09F8B40229C5B3B18EEEFFFFFFFFFFFFFFCB83D0A1D4DE5DCBD1EBBE6E36021AD4B8F8AE2BE8E756975870A9694F8267B722CA0B2514CA41471F6F48000000000000000000000000000000000000000000000000000000000000007CC10EC029F4947490B4743C08B02EE9F3BD7ECF5D381D328AC62AF625C1BD60A472B3BB1BDC8113E0F97D0100000000000000000000000000000000000000000000000000000000000083A2C094596FC42C06D794A3D26323BA80F36236FBB683182D52188B7B19A1B186DC437B104643034F454D1353ED40017E9B2F689A619A387CFAE81BB8D22812B2B012A4E993D7B5C9F34E5910BC6D8A3E53802A11C791B2A181DB14A90AFE01EA72FCA9C5C48EE584A63BF776986BF69FD45415EB1E4605EC57BBB29C0A5D0E6DF269E5899CC390A7724A1BEE7A72015FB7C05D9B5D4C4963211374C8F1D3CA42C4D33CA3F77CEB0490EAD24C3EA54BA2F5992B07413CD9621D7D7CF7730B03CFB5B4998A2FF9DD9BEC6D8E7697F6E2054BC4FAED46A0717AB00FD5C0309E1C1405FDEEEBE61DA7452FCDD9EB000D00784BF495756FC977CCDDFCB65CB80231D083DCDF0A5AEFF489F55C2AFD175B4FD719A551381061CD523C26CCF114E6002CED9AADF5357F82227CD1CCD50A405FFF11FD381F2CDED5E12B0E343822DFC0938434DC9163B48BE17D20AA13798801B59015FF077E3C8E4E598E3B21D871D79A89CF228E5DD57F63BD368BE6DBA52BA1BAAB83C4CCCE9F4B9DCAA8BFED1A004090A5B5903CD9B5C011F507F91D5CE4EE87C6BEF5AFAA77D24D29151E27FA0E662F74BD2729CA64726F5D3A0C0FFE02B9E35AEC17396788BBEBDAC73A3084DED19F131C92A6B9F893BF584D46D1C4BCB974E8AD479FC4521DF764DA3512850382FC41C28F7930CEEB6C429F8BA0D5C7825D6B89BDB8CDF74931CF9137BEEB65224818D102776B1EEBEDF072E2BABF03988E695E966B95BE8F287E22B9C4ECFD4D1DA8FDBC875B48A9355A178BBD6618C76C772124254E626B845510C919920198E1B1EA9CC1D3BEF5BEFB4A6E85068C264B2B875E66D5525515E4A66AD86587B6279FFEC7F494DF7F27EE678F01F500CE06DDC1F70337FEBE9C86399F36C972FEA80EFDD45DFD91639909AE32F04729F200224049EA377EE0B638E0E10A5303 -smlen = 2375 -sm = E6A0FC7525C07FC2D3A0D8590168692337C221019489DED31E00837A6466CE18058ADA22CA68002BEAC8E28FE084BD8D54C28500D0BB47FF4C7AC6B7026A2C9A01E5855CD8E6E6CC03AE5EF11901FD02A36552684C1DCD84F38100B8A5F73F0DD6AA78ED9A8DB601DDC5019842F2C182F0460558013622AF0B7982A95E8A722D180062DC895C53DE27EA90150FA2005CBFA098BAA9074891BDEC240093553011956C6E5AB88A86110058B99B613BB6AE19A038710B01B17F001CA6850CF17375EA0200B47AE6BB929970A9428213970100C58746AF50FF8F9D50815A28C192D452CE8BFBE520D50BFDF20100D42277FFC4BFF93576AA5110016F1BB3C6468F3A244F24017A45052E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 - -count = 64 -seed = 5909111F333F3E939105DFF8532548927EBF289F31A72F4C1B0C66816D8B68F64622F36A9BC85E63601BEE8EE7CB3DC5 -mlen = 2145 -msg = 5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 -pk = 747661D9A263C158D9FD1D4965BB543EEE35E63511996F86F96553B0AD22A1A2A778C67248DCA4EF4F7650B61CCFE6017CBD08B0A435C1800FCF2010B23D2DE93CE71D936339CF1517FE7C441111AD58C21A3A8F513ED33C856ADCB657AA4E03 -sk = 747661D9A263C158D9FD1D4965BB543EEE35E63511996F86F96553B0AD22A1A2A778C67248DCA4EF4F7650B61CCFE6017CBD08B0A435C1800FCF2010B23D2DE93CE71D936339CF1517FE7C441111AD58C21A3A8F513ED33C856ADCB657AA4E030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ED6000947E1A1A8A911C90295667C905E5548401A5FC82766B8EF1E62E7BBC0B02ADF5EEC91E6F69121479ABEB502386606BB3B59BBC9E25A1755C7271735EFE0ADB0D000000000000005A096A4B930281C9FC5051BFA6639B4E873581D589B5530B23A869D150BDD54B205BCFD05B95DCE654E7E0D233740E7486F1E63970ABB68C0D07C620A7875C3CDF83D2FFFFFFFFFFFFFF36D50A1DD871B87AC1634DED9A36A359A0A9A5789934A40170B0510971A5F934D02D86AE408FB329FE3712FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8DE1631C9336EE9197DF4E1E03CEEA80411B2C0448D9B28F5BB59312ABFC2E6A70A305B96580247CA83A02000000000000000000000000000000000000000000000000000000000000009100ECAA343212FB94AB5F8DE98D8CE79270AE0F68BE9B41B9E9641A2297C8D3455C51A5C3AB310C4C31345124DFB302A73CF2589C93A1F0CD195C2B1890C617FF22B2E769089D5D436EF132533C6B9B663141F3C78E9DF09F50E15877142201AC69D1F9FEF2668697AE6477B5882BC973C30A970BDC2D5FEB548441EADD238B0360316C11219F303B1110C07E052803A8681F17C922E1E3663907A1E98EBC0057D0A79851F24EFA8FCB611BE004A1D85EF44451D40F631A60CA5DB11E52B802929BC21CC5CB557BEC13D24E28A9DCCD31D01719AA2E2B754472CAEFF97CA24FB3EB04F9C7FFED6D74326BC92233BF03DA29C6056FE24420D5AA10FFD5912F17AED51A21237ECBDF3DE51D28040DDCB751D92798FEE130C822F7334CDD35F5029A3A230C19398FA8D618FFDCBE68C62E2B4571D5D8492D6372E231513EE983FF0D1281000E8B76E658A2E593375D2301AB57A038C9844C2C9429160546DEF5541975E3889895844B9FE792F2E0565602E7F4201403438220D49DD8AEE2AF9502DFA0C9E577810B988FB535BC0B9AC1E8CDB3D180B675903787FF95A41C86103BFC3B4348C6AA10DCE3B72E4B84C3A702DE2801B065959E014DEE795BD64B5F67102335921DDCCB5553F4F72F2A59DAB8844EBB6201FDA6F417431C555DEEEA01C18390EAA0C5F577BEA107DF29A993190EE559BF6F034A4989ACB84DC9E3D6536547333AA7C11960A3B6B86C0A60E000DFD967D3C26FD538F56AE8F53BE25B12910C3C8D8AD8B18AEA5983177AC29D54223C822009108C7A6FB4F479FEC9A2023F4871206DEEFAB09DC43315873D1B38AF61E0954E6ADEF844B655C3550AFA6095B386C7E9ECF809878AAE203AA7F90103723663E496577000FF4375B32A98BFF178F97738D8ACB797F3C6F57CC9B1FD46D475DE249B23DA2DAD78A234110900 -smlen = 2408 -sm = EFEDB1172299D95735774CC001ED411AF0245846AA7756F7E5011C6AD0931887ACD212E9817F00139AB7D9B6DADF60DEDA265500EA244225A03A7E2784E84B3B008BC90B9F1DA77BAA8D726BAC00687E5649FEFA13ECF11E88DC01031CF0D3D0FEFBDE1D84EA3001D10C975283A98CCCB9023FA501B76EC9D6CC6E87FE4FC2A22C0021440D16CAF003924399FE6100EB770D4863D79B9685154D6B004EB2D776D5BA56D050F179AB00F61F24ED1E9410617432A45801D69398575F28A2F79A88D13B009CE5C004E32FDD0C69DCD9E60101F5AA1590E4D79E2B0529199009764DB2C589155EFD38070D6B1401F8851B891B8C4FDD49592DFA0019B448F8304622F86085773D01035180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 - -count = 65 -seed = 238461A224ABEECCF709AB6CACF4EDD372D45E5F4274095273A49AFE614F2BF713134ABF68B4DD058E6D7B612C3658C3 -mlen = 2178 -msg = 99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C -pk = 6BE6ED176D4FD1653ADF2B637AD5F15FF7DA309326D7CFA1311F8DE51456642FCC389A8E3B22D62B4C70E9D8A0FB3002B9597B9AFED43348232B088873E77041D2F9309C86A24BA094AA003B6854D61DC140DC556B5DD6FDAB4EF2283718CA00 -sk = 6BE6ED176D4FD1653ADF2B637AD5F15FF7DA309326D7CFA1311F8DE51456642FCC389A8E3B22D62B4C70E9D8A0FB3002B9597B9AFED43348232B088873E77041D2F9309C86A24BA094AA003B6854D61DC140DC556B5DD6FDAB4EF2283718CA00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027ACD738E608DC27D8FDA48DD62E2D8765D34C5CC7E4BC4B50636526EC71A10A96EC0165EED4AB408D2BBBCCA069B0EB387F660DDE546363D5F2B44C7F2A8ACEFDDB24000000000000004019F59B7D6BE70C93BB1A9F640CFB86F21D10FE37B38B0AED6F282FEA123C75FDC740784FE089CE0EB3B4A7595DA4803BFF5C5CB286953F393EF0D3C283B2F1F89CE4FFFFFFFFFFFFFF042B095E8620B38E48624F8EC445E5AB97EA95D19E949FA46F0AB99834E4CCDF357C29418054F3194D1DC9000000000000000000000000000000000000000000000000000000000000008FA5A898CDB4E25CF21A405888776704C09FB550D3BBB6C460A8430D6642191057FA41A6A3FF334D982A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB18A30FD1CB678456DCE17CE3B69D5A5FD7D2010B4823985B854A7C35825625C1942AA3C2876C652AB777051055B51013A1B74519653D829627F0FE16CFA1FD7CF80300E28F9664BB82BB06E598D3BBE9E6DBBE215246475937668D1BE268C01271E1CD6CF6274BFB9C1B4A91C18DED38C109106FBD41612D49B61BD4707F31B442FDE9C41568DCF50041086FBFA940172F3666818270BE9C828CFB330657DBF799D1B0823ABD1EE693475BE203F6EA4F2C78A5409B64C934FC23AA0AD34C102582DE87241855FFAC5454A5B521442E663D1BC628E773D70864C87CE73E62B216100CC4A66DBB258ACE79600DAF7100295831C8ACE82E03FF3B711D291E78168BFE4B409BA1785F9BE1170322E23B168889963800C7261615C9067CEC70A7700CFDE6D1F861A58E192AEAB208180CDF9C82F0A91DF61C2F9FB14F8EA74828F8E401FCE2C5B0D65AF790A3BE0BE581B027756B2D52E3D6B92BCB82913AE371266362400C47EA9B912DB4F267E0E5486699F341009E88284A66BABB1989B570203C3A3E216D41A625095BDFA23DA1718C9570813705B84CD5D4C221AC71924A29DFF552FAB30B6D3232CC694A4E1116703F9540D62FF613C3A062E7F00D8857848BC33BC98483C1459DB793A50E893EB724A44F68A4DCFA567A613FC3AE613CB0086035DBBFC0E7C82E6ABB4788150A14FF97A708B70F1A0F0323FE4BBC2F78102E0E40296DCC849D317B345FEE58D6200DDCF0ECC642702F213C3F1849C18AABEB302D180C35EC08FAC0AEB3930DEBC1D5040C6A13CE0D5F43519A07E6063F402C316CAC072A09A75F5C0D1834545448E479807724FF44C7BC26B1B71C4627262A5294935F567C13B6E5E70D079C6DB036AAB480A00C5002651298ABE73EB41C57046EA72A8F881F330FC6B7E391FCA078F0AACE3AC2C6AED4702052A32971702 -smlen = 2441 -sm = 2ED0BAF86FBDCDB1439ADA26004ACA72C99916BFE2534F7AD001EDFF2C339DA8FA472DA460A800A99861E0569B6CBFB7AFE7E80140E0D1759E082F5BE16538EE000D5A706B99BEFE9926258E2D013277E330FAC639A83D077590019E0552A89BD6DD7DAF749EE801570F976BC642739E9A5D5B0B00586E7F617E8A7AEC7ABB2F050011AA8BA0D923239DECDCDDC800ECE939142C0CFA33D2FA89B101C5699C9E2BD28D9C8B5342E600DD9A6C8180B5AB4FA646498F00A534F0EA37EDA8ACEBCFD6C900A3319C8AC4D0CC50FEAF6F280101A1EB741B58EC5CCEBA8B7FCB0EDF8B8781EB5AFA68BB17D3271901FAFB1871E5DC9579FCD26E5A01A5C4EC2EDDE07B2397193ABF810699B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C - -count = 66 -seed = 83C653708FAF3E5F6FBC9DFBE6FB5E83E572A7688645D75D2C4835B28695DEA4BD7093740D0FF43237354EAD1C978BC2 -mlen = 2211 -msg = E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D -pk = DB7A37024D38DA0B7117D6773EF46F163C9566DA8EF6F8B37B8274746C76447096319BB5059124FF493DB450B547EF0029092ADF491E4A774F7126915E33F66D4097527C428B569D7CA734CE23AE338908E7267BF5D06B3A9FF10890761D2501 -sk = DB7A37024D38DA0B7117D6773EF46F163C9566DA8EF6F8B37B8274746C76447096319BB5059124FF493DB450B547EF0029092ADF491E4A774F7126915E33F66D4097527C428B569D7CA734CE23AE338908E7267BF5D06B3A9FF10890761D250102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E91827CE1253758A3FF9273E7B62817903F45A4B7DE4B0AF83A1AD17BA6CAE3183885CBBE2841B7394C2458DDDB6C5E33990E1FD87A3220843814748D53BE27CE141F00000000000000F544F12DEA2EB7A1D73CA05DC12C08BB18FAFC8638CE27DDB55E47F5D47425CF863B3AC15917C36BF1F8D27FE746DA44AA806FA425CA48E7277DD0053B819563B6F1D6FFFFFFFFFFFFFF75EB81E762A1C7B8BDD6A99682BDF0CFE256EC11E517930DE3202F39B4B1F9C1990125C5AE03BB301E9B89000000000000000000000000000000000000000000000000000000000000007EF95932EEE2E21AD002B8AF13FAB95780FECA70234FFD671F2CFE5C8F685BC296CB2E7F5213CBC31C020EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DB61738EE424BAB8BAEEDD66BADA9C2FB8A971B993D0010C86D77C2602E8709606244D838AB6D421B9FF071E90F30019596D6992459F39E4B9F48330EDDE5673A0561DF001B84A1AC4B0FAB51D0BF2AEF83A950FA64DDAE5883F4807A2EC0025EB602344DA35409519A1AF4F44564074B95E6F8C7441A548D949490BC6CE8AD7EDB748D69D230D8E1DAFF5D16548B011B4633C59289231D865FCEAA4EB40CAD2A1102D16A745A6F6904632263B472B969A311F6AA70391247715FFBD00072033132705CAA4D5D2738F6468FA6A526043355E9B52194637F456885C837EBF31D508EE4A472EEC46C018C52A66E123702F41E2762C75634513E4CC8870EDB25A2D0B7A172FE47EB4880703490FCD2D20057BCC7F3117E56855729F0F26B531D029D77101C1E8B1E3C7731463BFC5A8C1CEB49FC36B03014230E9ED551B721AE0DA675EA56802005049785B1232F07CF004D1348F1FA7479B78713F1557BC3B0B95761593E38DA21863D6EFB8DED561EED66BCAEE26BCDC15AB9EF63CDE2C6E80292BE409CA753D31327C3DF73612C537ABF778075F54D654513B537EC296E6C96E4F864975D87EAE5E24077B3E5DDC900785FD867CDAB9AB518A0B626903C2CF0288F2B1EED78B1662470CC8A3693AE8CCC8EF297E6DF8656FED64DD8BBC5E102456213237FE4FA974CBFD108C68A137BAA52206CDCF879A18B0A3AD1083F46F82EC92A1410F395008D4E33A02A86640254D8FDC225A4324E49CB0A65EE3B86ADBCDBAF9117A9E9C88B42D6901B6ACF3045C2CED896C7280D221779681026C102F8FC47AB42FFA220D0C837840291A8D84C7CC9328288C5CBCAB39F8B9E23D3A7046837C5AD490146B1EBF7994147130131EAEA3496DA7EBB306B70BEAE09E736AA18F7A53424954D126C5A64EFE11CF47CDB57C75620957EA5E34C2C2A995303 -smlen = 2474 -sm = 1E259A2F7ECA7ADC8D84365E00116E71026D7F81C5BF3A9C2B01471BBFDFBCE39E8211C2F8E40133CCFB21681F69646E5384BC01BBB071CB483BDEBD68F0E02D01E0C248C12269579D9AF507AD009F4C85A02373994D9824B26A0005080DBB9994021A20D7713B018EF404EC15A5A3051D4B7F3A010F88629521C31A94E645F1A600BE8B201BBB4177C6BB6D118300D6CCFC86FBF3879C518607A80085715B4241B5F2AC410227D800B483216F426663E7E9D648A30018F2E7A8CC8B61E68CF706550074AF40AE66089AAF8937654E00007380AB03948A99EA0385A44A00EB7114E6D837AAE298BB3E691202EAEB99B9B5C9C65EB79F678000DB348F84974B2452DE6D0F2B120DE3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D - -count = 67 -seed = BC81485EE93AAD8B464B5199FFEF9FEFC06EA97645BDFE0B4E915B812E606A77F93917ED925E882161CBB909747AC4C8 -mlen = 2244 -msg = 89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE -pk = 0CE381557946C538FF1C1489169AE1CC9250D02AF2F1F6EE3CEFCA0A2D24CDACB2AFF26BBD9E4E4D48A0AA62D4B44D00A62015B80DFDE6F700FAB47021C9EE7BD7865A01B36BDC5F7F083F81B2FA07D0114B1E62FD79EDE1E29B8DB5904BA401 -sk = 0CE381557946C538FF1C1489169AE1CC9250D02AF2F1F6EE3CEFCA0A2D24CDACB2AFF26BBD9E4E4D48A0AA62D4B44D00A62015B80DFDE6F700FAB47021C9EE7BD7865A01B36BDC5F7F083F81B2FA07D0114B1E62FD79EDE1E29B8DB5904BA40102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E73D943D22372D8EA0FEDAAF6A7C41A044CA37C8D2912ACEC05A19B82AA4271F4EFCBA1B43B758049B491F148205C120BA589D635524A1EAB9F252B86443F90938F1C00000000000000518C3BB356E03569D1EE7433A36824FC42029698ED6756D2774D129F3774A6A858FAD69662809205121446F6B65D0343850D3C929376392158209F441A7311254BA606000000000000005F3F11D39D68B3B7C8D065EF329CA454226052E5AEAB21F07AA9784C79DD335A03071098C6C34D5D415185FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36731FB253C5BBF93090838DC85167A11F811E21C67F70F4126198F07ED870471835BE292F70E25ED1308E01000000000000000000000000000000000000000000000000000000000000C3EDAE36CF903E8C58866A3001F8D534FD84AF75D587F9C156558666CD3FCE9C315EC7D4C0DFA5BAA7C6C2FC58836E00B195FE27BE602C3B45143800C1DA459AD8291EC03A69CA06651A980CCB16841884B8C6D41337F9403BE77416EF0F5900430F63FDE48E3EC1953E1ABBDAF5EF30666388A38D4E3EB4406B3EF5A8BC90A887DB5E453D2FCCD85CABAC48773DA8035092F8837B69C5CCB90708449A3A35073B3B928562E2B7D127F0F69B8DCF145E3745E0EAE43BF549434DEB2F0D3959036E99A8848EA1C51622334C99346FFC81C15C37857B3A1F75203A8A65EBDCC42FAD6B90C49B3A359800C120D75545610008E0E85C25CEAFD78E32DF1553F207A4DA6116C3FD483FCC6C176112CA6ECE33EF7A51AEB8FFD6BA3C8FE0D04A53600245D3A9CC2D4B217C34AB7F93BE16CCC8E36696584890FACE8999954DB684EF3DEC4B592D831C8A1C852F584397B241019B877901F660ED6A7074BB41931613BF5ABB57B0AC5B45A710B57A51BCF1CF76360E5F1ECFD2D287D2947AFD71F56C03B871F0FF8EA9322EA8FEA74B6950181F7850AC768D8542ED23AE77B1925F38DCA2B0BFB40102573E023DF882F776CB03F2CB64A8AF8569A262B49EFFC9DC9BADA3972A22AE2DE4D7BCB1F3075779EBF514B2EA3899FBAA6E8B18D41B66C15001EA46C509D0CA55D04CC1E23947B21DBA3EFE7A4A66BBC5F776E833314F0EDF8059917B75974F2D7C53ADD2EDCAF4A4012918D17961D01D4DC797102BDE1003CE88FBE8E5188855E2BFD81078A6932A8126E0980BF2EA502CA5F91268DF898903616BC02397380857E54B89505989967B36A98090A5DB1AC2DBC107B07328FA30BA99695F1E339C6B664FFC904282B30186A19B81762D2CAF6D79063A07D52B3FEAB21C8DCDDFE661E0D29A521AA98D5B553F1BC5A165F7C94F27D15244C48B02 -smlen = 2507 -sm = 745A95825B4C81D4F6A5D9A201B1676E3D790D9993CB1D6EF6019E1ABAD03AF9B9EEE604FE93008C07E7475A9C8C6F6D708C2D00C2A4E9BA1D75388E9254C08E00A5F1DD188FA81CC453008C9D003A1F892C10C0A3D5AC3F0999006DEB6846D00C70E3D9E10E8800C5E775150A29AC184FC117A300A9078CAA11C3B6D3100820B401961EBFAEE7DFAB52A5161BF70101C93695359F732C29CBA3690007B793F3326E39788559C0CA0047C7A06EEC165C73A27EEFC80143265D6B91754395873777F3014192D6084AD47BFA9CFCC5E5010159A6D1DB8C46461354677E9154F664E0EC0B466DFBAA5C30F91001217C95FA381D3E04E2E9790800F91B67C58F3C1EEE867092819D0089D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE - -count = 68 -seed = DE9E2742591A5AF6A6153DA85A510C39FD31A2ACD8A8511F190A9A5E5753E63D9801A8019508E67DEB1E9219CC18BA3A -mlen = 2277 -msg = 8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 -pk = 91DB9D6DD1FD35BC3786584BC0767ED0BAD4B4A9B280968D7AD0665710273EAC33B0B25A22C8AAF50CEB053FE6A27601017E56ABBEA7B8635DA5A08098DBD9456728E26E86C7FB3F3875F4EF438A4DDDE76D0F512359EC3FB0DB45619677E102 -sk = 91DB9D6DD1FD35BC3786584BC0767ED0BAD4B4A9B280968D7AD0665710273EAC33B0B25A22C8AAF50CEB053FE6A27601017E56ABBEA7B8635DA5A08098DBD9456728E26E86C7FB3F3875F4EF438A4DDDE76D0F512359EC3FB0DB45619677E102020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018E80D254B49F164B2E27BC5FF544EEC311F40FD97B55D94489267913E6A4B8924ED4293BCC73BF8C92C59944CF827548A4EB068E594307557ADE845E1A23A98FDB12B00000000000000438F625D1B28600D2C21E8E5CD6FB8743EB7D6B8E97B0B156DA6C2D8FF273FA71418F77AE12520BA9DC00319FCCD3C28592A887610BC45C08BC77A84CC3AA50F4A9BF4FFFFFFFFFFFFFFDDCF4834835EEE4C8C5A23DC57D1F115C88576B3128127EE3D8B5C92734CDC1C93742343916F2055280C9F000000000000000000000000000000000000000000000000000000000000003096C35462A0473A1E53B9D6C8DFDADE91D728B6C98B0386F3A93D1E816F07EFFF2E9EAE0BE39FD5662E80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6759CCBADE9E54476067086A65C80D7ECED365AD23B50A1D94E55E5F8D9F5AEDE0CD01C871C0353F2A29EF0D4F8886010ED616D025CC91E5E770B9E71F8221BC0331F3CEC9308905A4DC2BEF04EB713DDA5674DE23EC858E9B00532F14D42B03A95DACF7BBEDD20CC2736CFF699AAEF6715B83D58730BA3184D25DF984FA47D77B845EEC9EA30ACAC0E88D582F215700026FD143947DD712EDFC6085995594EDAC3C3AFF1D2D995531BA4B7B01774DCE45104EFA09757AD1DCC999A4EE13B1028467C4974EF47BF835D41AB5B211908650848685C2A1C356AA94C930ABD4169FE493FF2C32E22039E557CB748B427A0309109C2A6DD32E1C0B8A0C3A327AEC590170069B372FA6412B1DC42899BE822729F5FA909F01272AB9135C631446D101813E07EA38F70F2AD85DBD7E80B55EF142293D97D58BD517506214B7D62043F36A31CC1E2E02308A6DD3EB76EDF347033E380E22EDADDD82E7BE1E3D3FD152DCC299D84542C2EB4E7D591DF1AC0C6B36B13D27ADDECDE083421FE0E5B5206600C1BE53A5FE9767FC84F57EEA8641CFB19F0F85DE3ED09FE93EA3A2D649B1BB913838D55A14B51680E1F12DBA9F5A130036923D47C6802B15767585243F94A9656F96B221B086F76061DE7BFA496A0C2561DD2ED18AA6BBD20A74916FE33F5C0395F4B6A7D7FF790364C134206C01405DEFEF58FD07622636A018307269483548F69E8C52FA9BCE0B0D882E8998A5CD03B19A9AA51AC678303C17179B623A9A3D2155C0CA82A3F74F720D4FEC6459C8D9F3FC9569D058B3BC40366FD589AC6D00E627E5E2A8C2045D841EA5B780F5646C8F0FAB6C7FCFF190A0AD14EF53AB95E8FBF8D5AF9F5B88565E7B32B146EF67022D84DA0DDFF88661A8C800484D67AD4A75F52C45F6331457E0A0447916B4DC22A1E86C9EBD3A4A144672F54B8FC68203 -smlen = 2540 -sm = 4D0532D1AD2B6A6DA24798E40025F481A067967EB49F85695200F264B1B3EF5D838F3DCA76D500DA5F65C14BEEC616D959526D015D7B30C409D9EFBDF184FF9B009512513F0EF3CC6319718DCE00C9F99900F8D2E0082FF91580008C0FB2E6C3401AF5D6053E810023A059960C1989A33429001A003EA41F425A1B411B5BD7478100EFF959D20053E8715DED223300690160A8A363B96A2CAF075F002BB9909CB97AC8D83FDECC7B015F04B1EFCD3B53A71FBD856A001F5C2B2C7A59D85FC49B5A0400B9C975B33F61C7497594C87401017B8DDAED747A9BE6A0BDD8F3E2D6440A1CBF8963FA58E2732D1903FE40ECB0EB97F7163C6C65C3015F19762D66520F652521876EF5068337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 - -count = 69 -seed = 272E459EAB6A0BDF720E4C5B79E641C95BAB66C3CEE261D0E3596BB04D232ACE0A1CE24BACCAAE9037665A962C711B08 -mlen = 2310 -msg = 62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 -pk = BE8B21FA9B3886AF0FE48629AF70E574B3A4FF1BACCAD7CB0B58FC975520D8A42553380F4278A03B9298195BF9B1A2003D3F993D25FEBA60F04EB4C276ECDCCA0F78987C4DEB8C228D706EAAC4F482F419705AD08FC1B5D2A582E05369BB5C00 -sk = BE8B21FA9B3886AF0FE48629AF70E574B3A4FF1BACCAD7CB0B58FC975520D8A42553380F4278A03B9298195BF9B1A2003D3F993D25FEBA60F04EB4C276ECDCCA0F78987C4DEB8C228D706EAAC4F482F419705AD08FC1B5D2A582E05369BB5C0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001E4446F4B4F36EA3BD5268696050684DDD8518A2C07F7A258BE8E9FD90E40C6295A548D757574343C34F2953BFDD10E788E63B863A4AF57036C730A16D4D3EF91691FBFFFFFFFFFFFFFF076F7A81DD961C3EBDC540892B9C9982F9FF74E1516BF5FFD120E947C2BA4C49DD2888DFFD2D5F985E7177340CE65304E8D00A3783CB2D655ED7811DF83480AB168EDBFFFFFFFFFFFFFFC787FAC41F234DCD8A8F7E2DF3E8D48A6573F6A62AB480E8055C6FE47498873030F2850BA2589A3262EFABFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF421E06DD0C403AC6277F57D5F02C42AB528A43770C5F2FB847075D2A378430749388B947A9E1C24D53DA0B00000000000000000000000000000000000000000000000000000000000000C00F019B4B40429C6B371938B2D256D7DAE4DA8FB83B0D7903A6A1A737575174AB2B9FDBE0842237E2067234F78B2F01ECBC710B69C27725B54E127C5C8BF432B67A8D5D9A3AC6D390208EF8C53597F12E100BBA068B666915C92247DA994402F657425455F893A588D25CB79DB937AFECA3D928EA159D3CA7BD0EEF403A09713CD1D677908A41C8E583ECDBDF5B4E006C00A4CF5FA57CF2ADA9B5F549C55685745594068A1AEE1AA45E8D26E8992C1E95D811820D228FED6380BF392D2B640107484639F6291929DE7A4CBC5FC1F28B6AEFBFBA9BCD9DF06F81D9871D25FCCCF00AD8E06B188F21A035DDFB3CDFCB01E27636725227AD716558A61AE92C22C9AB901DA2851CAE17371BE292FB30CFB92C02A4518EE6AF3B5BA26ECBB4E65E01C14F7B07A3B1AFB526E776A8B4DA24F211307C9B9E39FCFFA95A6848B7FCCB1039FD703B4F6DC40330209E3048833800BCF997CAE0EFCF253747ABDDF7F897C76D323393398A440034DD306223D85E5CB38DA8B85D9ABDF018E53FFE0A803102AA83A0E29FE8F0DA873E46A8992EBCBEA7CBC7DA774DB2A4F77CB96AAB361362F500BF7096061927E01760D34AA25402EF65711CD19AEB075E3B42F70B185609C869C0669EBA6E0E6D7F70A7D016701DF64EEBD3AD6CBB7B9DCBA76A65A57C002A83AF35C7E650275E095B6CB9A15E376E7790892FC77F77F63EF3EFD57FE497A4809420F78694BBEC8759B6C7D4690063618FBEC84B6C37277360E74DC3DB5C480F21FF1F6A3E96BAE7B4CB8049F96ED8DD44E58EDD0FC80B34408F20B92B03ADA146F88E60B00BF015C90B235EE78AF47681B8401E07BE12FCE6C9D8061A5B36FDA9427D85D7243BF19FA1A0EF02007B5A4937790CFA1606E2694BEF710B2BBAAF673114CFD257DF27DD0B96A48E61F3E43A5349089880A2C94A2750901300 -smlen = 2573 -sm = 08DC78EAD31DDBA9CA21667D01B6727A5465109BFD9F54799B011914B464BF1058BB655AEBC400B03BEC4B1479A2408D5ACFF10012724E8111E0E1B29FDCAA8D0080231E8CBE34762E61C8E3900124BB6E33EB0D4506681A7D9701450447E7E3616AEC720C4CAB004146B7FA86B477960D7CAEAE01EB4786CA4119668DE2F5D3EE01C33733CE1405088ECCEC4CFF011B4F1A7193F07D6E39599373007FC215A40444C2898322D2080082079C63167668C4D640862D00278DEB75841215905B00707900C7BA7EAD878DC0A99C18AA84010115F2B17063BD44CD21972B1C696FCEA11828BBF868F79483641103BFB66C3E97B110A6A8A2F8D000105D8DEEAD1A85720B299366F70662215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 - -count = 70 -seed = DCC58DFC13B035323ED44BE50A7096F697C9C143518FED50A59181160960203831A9904847BA20B85E99FFA63E4AB0B2 -mlen = 2343 -msg = 954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA -pk = C9708A9945D339EF394C82025B54F802CC1BD07EF7B4FCA45AB1FA0DFE39E0F863B6EF6A72F600D7A5F16717674BD2002D44EA0CE612AB55660081FC3382E2E7161D276A7005E4B1476C14E3742096803BFB5942D52634784AD719E37B7F9303 -sk = C9708A9945D339EF394C82025B54F802CC1BD07EF7B4FCA45AB1FA0DFE39E0F863B6EF6A72F600D7A5F16717674BD2002D44EA0CE612AB55660081FC3382E2E7161D276A7005E4B1476C14E3742096803BFB5942D52634784AD719E37B7F930302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003B39F9620C3FEDAC58C8479E29A012EDA752B4245B03312C5E6AFE6336D400A5E84E22C0E3C0319E4C275B2D18899338507C9905326951C65E73F3CCA3DAC094555C1C000000000000000EB07723DC990BCCFF33D5B352C1A324EDB4FA9C9568502F27A957680870389153DECD4A74BBE8D75C2A39750FF039682F52D5A395686606632CD0A13EA1772E8E89DDFFFFFFFFFFFFFF2681E61098621CBA991113F21F5E8E66F349EA95397F8A2B41AF73576206FAB3C0A30EEF07941C929A92A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BE11A19B46770AD7B644227C90552B895AA994110F05674E00C3E6E89414646DB2B65AE2A91C3FA08D4EBFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989F3824DBF7A8A8AD2BA49AC4256EA448627E9A33FE06B602E264A825BD927DCE06321E7B9477E94E64AE679B4532022A7ED8A572166AFDDEA807C3388DBC9E3719630317F466E54C29140554EFF33A51B291AE473A7EB565DF73ECB468D9018E8236A341278BA5190C6090D587B58FA78BD4AFD201C4A46A0DF06CC6D654565D339E3D4BC8E911A283219C933CF30085493E80EAB7D03F743D52466F54D2DE3672184C4CF301972128C687FC4A7DEC59EA2385A2C94BC895E0DD2036A00301572E9755DCF928C105111A4870DF3C0F46773D562C1DB942A906B25701F47176C81A3A8BCD0609C174812E557E8A01008D26DB27475B25E1CC5911C97B712CF3A75489ADCF1932448CD36115F693D6E6E3CFA5716AD747FFFD763C89885A2A01945A0B094857628C3600792A50416676CC1A85C7698BA74E6528DD5315FE538ADEE10B46338779E0396DD15B25B58101A780FD17948D2A4D07819746A562B5337FDDD34546CA3B657C30153DE52E5A582B18661945A10B1C30467B8701783D021616FA4B4FB23CF9E1CF58C2558891BCAF7C32948413C0B911289B988367746D370E39582E0EAE3EE1B004748DC5190377E17BDAA1C0786961C9CBD0ECB5CAF3BAB1D2A2CD31BA5E0E0962DEAFA254F765A3294131E8A29B1D7EE81C266CD201401E09DD2A03BAE665EBA9F141A9D0E95BDE3EBBA7AF068BFEC36647240AEFE154CE7A6CE65FDEA804C6315D28827501EECCDC38A4DB443A9541FBD9F5415205D888C3B5CB620D607EC7C6232F3FA34112969433D4605EE322E4E830B36EB90377E6DEF75A881B4CA4DD4739BE8DDB59CBC49EBD260A8DD1C99F6200E04F1A8FD04CA6BB8D2971ADCC583CDABB0B96027C6AFC319A873212FD66B84E27AEA91FC8AC5997CFF1EE9FD9D52C7CEA23FA568D718C0AF048FFA893C37A126F7BB502 -smlen = 2606 -sm = D57B8EDD08554BF57E399AC9001AB94A94E80CEFE9E3D37A28008E4913489B790CA7CC8D470F0033DFD35AAC6C06CF1FA6CCD50173182EC9B44A7F300FCF3C9900F853F427BCB535DAAE087C0A01A07C37D3C004E4883B68B56400809DB8B9775297C6975598900080B0313F8E8DBAE91E6306F800C4126399F4095A89CF4A826D01EEF76DEBD1CBF8B14069987800B4FE3173873DD04F1C64886E00B3CFEA6A662EB2C3AABB2974008EA54F73A7E4D2C7B314751E0190B92AF3C9C99F885697E08A012A8A78866AA089C1DD6170840101FB6B541423B443BDE34074791F2E6B2498B14D501C7A87ADAF0A030BC795134BAB3EAAC28CF23C003BD4CBCB403811002709BE0F1308954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA - -count = 71 -seed = 270BEDAA7BCD43990FD8B4F44FFB63A3AE8E991BB2BF84DA7BC2CCD1A079C579AEBE2082ACBAB7FF286DE795F31973B4 -mlen = 2376 -msg = 326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B -pk = 9280D04578737565AD4B095ABBC81053777AB58128029C90950B7CDFE26769C56C22E5730D81B70DC8290F91E08F2703681E4393A5DE56012DB776B7FF1D650CFC78EAEC09132550A9C695CB6CC357FDE45C2BDE28F36A3B4AF94F905EA1F202 -sk = 9280D04578737565AD4B095ABBC81053777AB58128029C90950B7CDFE26769C56C22E5730D81B70DC8290F91E08F2703681E4393A5DE56012DB776B7FF1D650CFC78EAEC09132550A9C695CB6CC357FDE45C2BDE28F36A3B4AF94F905EA1F20202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005F456FD710023AADB58E6553A3692FED81D21174DD49E7F6182BD86236FC997EC4D13131433C9F8454DA00BEE882C9D22A7E1A48FEEF15B4352313FBD7AB0C4A837914000000000000003060CBF2038F6C68ED031EE148FAFA93FF9611980F4B755A8FC7DF5A7FB26EEFB89EAED87593D77A395B76595308E009F9619F9CFE7588B82610ED8119947DE5C9A10800000000000000F4368FE3814375C6665229CA4C0FF8FD0E711A0480F84188B3DF4DC1C757C4447F6728DB57F08A2974DF8900000000000000000000000000000000000000000000000000000000000000B912984CB0A57BE50447288A00F98A65E55EE57362352E2695B6D85A1C266063DB83A0087E65FB60122C6401000000000000000000000000000000000000000000000000000000000000AD57BD72D269A1C2C589FC07A1DEBA8DC5848F68620817D732C92D1C2450D0A1FA396212EB0DB22DD7426A58F5276902D809B8627F722AC2A2C7F5874461957D588E51FAC6F21917216FF25D2934831AEAF501905245BCCF91D47572E484490323E87DB1128169BFBAF21DEA62F28A92A13A3BB9EFD33B488BA82AFA1EBD97322FAD65E8046340DDEDFEA6606E2F3C00C4D7DAA0D8A6A38BB38F2900991FEB1DA4EFF7B078AAFF9A26D6160EC8174E0FAA8BB671E6AB12A58635B17775D90C039A50D7CD7F9E3045F090F198AC055C080ED77B344A06167381E1ED8F93EDB3C35B2661D08E032D221E8B64822CB73000EB14D81BF104BB02E5048A5ECD5E009C14DEA900EE42F8E5F4E0E040DD653350623BA891B9F19297CE85758E7D91BE0352B4A9950DC72DE63794A1E69B8205910A635F4C15C811E99D0185CFA7291D075D43E9EB6C3E52A982ABFD5CA7194403BDEF553952C4878262B55E03F1BE5CED490A25A65AAFAF51EE3AA41EFF8F07CEF8A141D826FC61A185EC272738CF270288CD545F53235596F497921C090476719F657E58748B65A675F28A72B4C0A6BD6ACBE50A87C895A981AC4F262F393003022AEDFF3C9BC71BC4F8B3EF25E4877105611D1FB416D07AE0F96C2D69E67031608DDC1198AF81E8CD9524CFE10E4C013ACF8EEA6B2AE47BD1DE7236DFDC05FFC2BD3152ED95CF8343F1A1F757DEA04AE54FB6956F40B26842DA3BCFA8BC8700FC8E758BC8DB035EB282FFFEDE2D0E9167DAE27695570A11DF696C1FE367512592914D8558E108F9D884F8A6483E0D037B50CEF5A775C4F942FE91D140E511BAEDC38E9A53854C7A12C8AD971AEEA38320B9810C2C6572D88994C809E46F7C0240E6EDA9AC3F70BD1E496055261BD2E54256281A725B724F69AC0ACFC0DB3323605CA2ED36A772A16F4F7DBDD99A5602 -smlen = 2639 -sm = 66BA5EB8B1248AA837C7C4C600D6E230F9636035BEAFBFBECE01E812991EC29BCCD2ECFA06D701F776B05738C318C0E5946FCE008A74382D4D25D911DA2C9E5801BAF2121D8B6E4AA975D3738601BBCE97B70DDAC6F5D8C34664011BCEC944C06F18255C1B7D0401DCB38729A36FA081E4DFD0B400FA9FB13634AA469385DAC0790074A72CC59BB8F4286B5DA2D500B07994DB874632D9A382A2190060759BE06E77045D5A1AE49A012971FF5BEA097D3E080AE35300FEEB307162AD4CE29344382C01062AB74AC34C44C1E756B1830000E72280F6C4E84B392FA72C2D8249EFD254BEEEB00915B0484B080222E6FB7381702C62CE9C8CA200325EA1020640340BEE4EA1EDCA0A326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B - -count = 72 -seed = F151196F55A9ED88F1663AF6BD24B2CB9DCAF3C9B313CD8F0A27639D3CDAE72EA90D60ED5C7C6AB697A06185E5A2E215 -mlen = 2409 -msg = EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 -pk = FA43DFE524EE3E4BF3435CBA4F130034B61E4965E1DFA7A3AFF9939C10E805ADBDCFB3B00C6C302EFEC195246F8CB101FD38D25A02C534C8E5CBD1B169BFFCAA9C06F222FDD46AA2444924167D1AE3A4CCF193335AD83BBE90F78C748639FF00 -sk = FA43DFE524EE3E4BF3435CBA4F130034B61E4965E1DFA7A3AFF9939C10E805ADBDCFB3B00C6C302EFEC195246F8CB101FD38D25A02C534C8E5CBD1B169BFFCAA9C06F222FDD46AA2444924167D1AE3A4CCF193335AD83BBE90F78C748639FF00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061695A316ED5E289FF31CDEC82D083EB3544A4D3B14DAE57D998592E6D519868607E2430DBD6573D338BA1DF3EE7E9DA94FD3383F47E38EB7A8E75210DD05D9FC2D21E00000000000000DAFC6246463E8C34FC069CE9524F38308EE632A4D930CD380CC9E9525BA065AA05D0D0793F33418807C336FC951E7F72E81E1D25092ACF84FE443F36361CBD5364F5DCFFFFFFFFFFFFFF92D6CEC9EC21D1FD76A673F04591623BE8AD89C21D36F70C7043C0D1E26E4FEE1ECA38E2AF182EC28F7ACAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF851428ECFAD08984AC2B67A3BE2CCA2ED5E7BFB92584DAD4B8CA348E07C2D7DA22863F2C110B9D093C7600000000000000000000000000000000000000000000000000000000000000F1F43C33DABBD78FDAF1380ADE7E021CB7F2C14FC6E790C4F7AF904210274FD218DDA4E39908F7F3FABACCA0F758A202C9F2305D28F3581CD0F9C4B275C455B48D41BAED48ED10C0A978C51E43D28C5844C81DFCF76F5744843BBDE6A37A9500E8E26D5B7D096BF420E10B076AD8B0032587BF2BD9D76FDA2A0A4A3BE95A3756483908D036A18FB06695922BB7A42603176A06251272631283A5532899273BEC9A225C2358A41F6BDE1B2FE01EFBC4920584A114F23C36F3081CB78705766303C08599F1D19A58ACBEC13F068119AF4289773A35D4552CC89D3B03BA3F98592FAD24D6F4D0647C3AD1C7AA1627034A0054A2EE0608FDF5FEF606712AA7E106AC43667C25097A0AE1AC956256FF426EA16BF7F9A19466842F28289CCB613C0902F5C515041B2D9CC50C202A7C5E45A81188B3447BD8D68B0EEE9D4784D9A48DFCC30BFA29508D5B82E1824BFD8830F100025A854C7A1D1F9B94B8293A4AF1F2E657BE38DD22CA4870E98AF078599581F21570AB43921F55CB803B9D4E259A5803C29E921B396643C20CDFE639BAED4A3CC027DD3AE77FE87025A3FA2D5452CFA00391DD99562F310B026746795B4050005F0CF0F1BFC68AD57D79D565A148A716A7E705EEF2FB454B0C077D079A5A8D2F432B8391D06E474199C80011E9D00D0132DF123FA520C5BDFA70E3B3F7157CB088BACAFAE6BF82B28667AA24089DD5B775282A47669D3A1C022664F5F6E39101B649546F30502C7ED298A8E8F297D68D5CB69EC9E52E0162338A6186504AD038D3C541D8F6BA39FD4B5A5C3546469B03280AD0589990A028B52698CF3782AA68B16CE97C796DCBA9D8ECB2498A206E179F5CB967B52AC719EE7C27F28B280A007E47343B8779EEF6A5C39EB57C36428C338C33CE6F0741650B17FFC7636785929959097AF3587AC707CA4635929AD902 -smlen = 2672 -sm = 5C6C73D632609A0482ECDEC8010ED3498413B15E15C024544B00F7CF36615F2070C6B30214310011D2C2D3B3E2A184D03E9577002AABAA01056ED30CD86AB45001A8EB40B625CBCF4ED6C765D50106910EC8277ED6564E9D6C3400728BFDAB4893CB77582FB6C801E37A324C0E25AD637C6BA42900A98EB5CC62F61F081C8E9E3400C90ADAE435D7D14814C5357400AF11B472C10E4E28CCE09D6B0146304A0A69C6764352F726130040A32367FC75916E756B824300B9826A7CCB2D69EF5FD1EAAF0122570F33769E4742AE4C7B1D000115B7409C33295708811CF0F3E24D0C63BA6C0824905E5FDC85130224CCB7A6F36F20D395A2DBBB01259915D3A72DDB102B9BB16FA60BEFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 - -count = 73 -seed = C7ECD1EC1A3D83F5116C0AA4345FB3ADB4D9F81BD79896BC4932EE2F9D2D1F179BAF7A002D88F4F69071A7931E7F7FAE -mlen = 2442 -msg = ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 -pk = A1E988E4673DE2133BFD383171B86A30FC1E6AB04A8237531EEB5407508FD0BBA87AD29421D089907D91660912FBC303DC91BD972ADE638FD68C728EDEA32CAA8AF5F62AE7E3B4D2284D0D9EE72BBB1F5189A6D2614D7C31DDD189261D7F5603 -sk = A1E988E4673DE2133BFD383171B86A30FC1E6AB04A8237531EEB5407508FD0BBA87AD29421D089907D91660912FBC303DC91BD972ADE638FD68C728EDEA32CAA8AF5F62AE7E3B4D2284D0D9EE72BBB1F5189A6D2614D7C31DDD189261D7F56030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B69D49C6DD30EF93D52B9289755252303EC87F5910391A614156C35FCC505857F8A16A2CDC2292F9AD9FBBADB84B2E3613303A337B21FE02C8A99CD780D418B1065FF8FFFFFFFFFFFFFFD528965AD4B614C414C05DA7EB7C5781B8C3537D6348A053205A9514FD817ED2B9572B066291EE911C879E536549C71DA0888519EDB65D8F8E9D9065427D6399FBF5D3FFFFFFFFFFFFFF1B4994B79623E8E0A81629726BBE66A1C68762ED77CA3CF35CA2D24A9FAF15B6CFB7BE5D39D3909376B4DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCEE4896AF87901939B5B08BCDAC4CD5ED73677244BC00F07AA93D67F14FFCE7AB1C3E1A6CB71D1FCD2C9C50000000000000000000000000000000000000000000000000000000000000090BE9598DD71358640D2633A11B25D0E95BB3998C0D8B005AC7171D552B9B7F7570DD7229C570BFD10A0869FE37E2A02DD618F843638BB9529A83E6920A09A837E244E31D946E334886C1B1DEE66916D7E3D090706F7CD907D44DCF87711AA03185A05AF63F06F2795291635CFD2FF0BC46C1CDF24E7D1E6A4B4ECE04844FF9D185CFA598599FAE5180E99A7B5EA9E00EA92C3CAD88B0B5C92FE4B1918BB2D9AC5C58FE54DD9025CA6874D14484E02EBB038BAD956FC5025911C5737E0848400B379578B468FDB4F34A10EC69431212E38B65A6E5411348B8FD724529633CB1FB3E945A172BB3B033FFC9F3CD1EAD202459DA7CDBC4BD71D6D2230F120B7583A7693652720EE5901F23BE660D7D5B0FD6B8FE44E7B53F71B3E3E9FDE840AD602466CB65F0DCEDB5CBC786334D9D2941FDE1BF410C75E6B627B22BF6066D15A956255559F0C79751FA1B3EB70D10E300230E20060AC715E7584A6B4C2B4A498291BF2136A0521587952904068B2B6EC169668C0F7810FABA857055F4AF4B44800978909E52AB8230D58845AC9B4383810FD9D5DFF0D235AE928278AC7C4B7C6C4F26A0807792ABEC7EE2245BC2CB09301E4C6540201902DDF52BEFBB6FE1F3221593124A844F4343D823C1F7C2464A17379C2316F342A9B57BC0D2111347C0B02E7E54FB67F65916FAFD36B420F20AA98DB7CBBA937B12EF50097604409FF00584CCB91ECD4CA0CEFC9E3E34BCEAAC201561714930DC7FE7B1780D023D4648CA08ACE15F82F4525E13ED3099D1B2AF418DF48DEE4E8A1F944DBFB6FDFA3EF8000BD26AFFEDC98E84A655D9CF3E0173218997646DAE44D592652F326D3F68990D52719F48F19BFD40EC480B65202A6BB000D7F2C2BD296477D343BF5779FC819E7A47D0757E7356B6FD6934F1D3E8030593F5FCBC8395A9E6F8910956878AE4802 -smlen = 2705 -sm = 6D7F44D08C074EC2275F8BA000B8EE974F2A3B1BFBB7BE75E50075EA04D0F03CFFB490236438003B40E0EB4D9257FF8A4F4F56011FAD35C3532E65CFB48D000C0088B0C3C6DB109D4A3EAAF3A900AB149CFCD7AE827E0893E96100FC4561FA03EBF782DE7BB2E600A644A5CAE864E593E88AF9AE0019D97A97AB94E304683043F90153B1D222657D2BFDEE64992C018311C7358C5C50DDB8CF34800026FB3BB7D4D856564199CF8C0018AE69BE9519829D223E56DC0047A882E3931627F4E7B44AB301BE6CF6463AC70D7EBFFF95840001392525828916594C94F7D5C9E9C13C1D740A43448AF4F062B6130392771A2BC021E799B79F097800BF611954E64B5E1AFBD2BAF58C0AACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 - -count = 74 -seed = 5DE03CAB3CBD81B8805A17E0FFC2105C3BCDC8D782EAAB161A15AAA543FED59353C1FBE03E7F36B955FC51C9B30F0C93 -mlen = 2475 -msg = 5F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 -pk = A4B3B5E3FEA20B590556C24CE33C32DC3BDC1742CC694B669F06CC291D1728914942230A62C8C933FE65B05FF735CD02BD38A378B1AC4C62FE62CDA9A5B1A524411BEFE0ADBE71651EBA9625258226FAFE4F37F47FC2E9BDC0E82364502BA501 -sk = A4B3B5E3FEA20B590556C24CE33C32DC3BDC1742CC694B669F06CC291D1728914942230A62C8C933FE65B05FF735CD02BD38A378B1AC4C62FE62CDA9A5B1A524411BEFE0ADBE71651EBA9625258226FAFE4F37F47FC2E9BDC0E82364502BA501020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ED6CE2FA42F41B2930CC1A47FF1843A15D0B40A0BE867D022EF22ED1E58A22AFE7DEDBE8F673354E8553A8A076272ED7298E986B4879DA0234A25B4320540AA5DBEBFFFFFFFFFFFFFF7CA54A172B8315672E6952A125B5B6C53507D4CC9946ACCFC3DA8C6B8247089B6D4DCA0792A1387A753E33D934550305C0A20BAF4ACCC71081F34047B6B6E83BC1C2FDFFFFFFFFFFFFFF2CFC05BDCAC7AC4466910F842FF278453CAC1A150144090FF13207A8DF854E98A42F86A5C449F81E0AD1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DAE194CC5874B15B23C5F43DB1CC7C4A9BD77A78C61E7DD6EE1A4D263A4121ED2EE9F806EBCC6299EAFD5010000000000000000000000000000000000000000000000000000000000004950C73E508D6C2AD19A4950C76A2D1FB0763ABB327647A94CB1E8AB90BDC8A8A8BFEEACF6128CF28C8B1E3F3EA5A603F0179BF211A2906FEA91A36FF866C0A46A2441E488B8F16F1BDD0E0A16E15903818083017726BD9BDCA1C6C0475DAE01716E7C9C00E33FCB08B9626CC19D83073C1F55DD95E19C5AC77B63BCE157D1C78C07610D219AC3A2A1D785CA6F99C1018D01257BFF2088F824C2DEE8FE19E6086252B1C090542CA1FAFBDDF044A4D94B0792E30699F8BBE7BB97F93989C34E0174BA768535CEA845E3C8E0C055D7F415613CCE5C62E8954D848485B9CDC84265F445DE1EF278A9A748E75FDB33A06403E54E13F29D045316AC2C2D5D79D4CCF399C06BCB380231814478120885EF99BD45F87B0CA82154001F81FC0C340AC303C0A405CAC9614696F95FF9DF2CA10D471FD4B4B04B5C71DB8A297063F60C5E3A71A9AA5B0DBA2D42E39478DAB0D0DD01CC167E27043D562E668FB92D2C462A5AAD691D02A6CA4E6E254ED25628F8F5F5FAD5B6FDBF344BDF117513AC74A5BF00A8332EA26B525BCA7DC53B9A03741B02352BCFD9BF7B701911FD75BC6A91C3ABC24E527922E4DD024FAF994A3FABDC026D09A2DF6AE8E0D05E980AF0888A178B637C30B4FF7C56901DAC42D1D9EA617A07AB8D6AA37CD6C1CDAD1DA97C20520216CBE1BD98567D96789219A7A46C13A2DC8268B77D843CECB689BE1545524DD38DEBDCB61CCC48740DA846919C921802DE10F105C0A9A981773B340654768E6FB241774C15CAE851014278BAC2EB49551C4051438439C493E0F1D0B53E06EE00DA4DF0970B9AFE5106FCBB260BE14C2C04C097A9A7B7C79420E2A51F714B5AC2A960D06111F52F6A94A215B7B496E10290E6BFBF7A20C7E294BE10EE2EAF507B2234EAF363384D2A945C9C8699A2F447613E452BDF4EB3081AA3BFD1E3579601 -smlen = 2738 -sm = 950B516F6EE4AE26B94C6F7601093F064CF76818C8F5FB31E20026893F9B6208D1CB9D04561B0072DC93A8BF6D6C97D71D8A0000F5E2E4B93D25DBFA46A1021E00F7F36AE7768D603FB44B157D01C8F73D7A3EC09927DE1B58020165FA387D5D11AE7E2116FB1B002DE6F012CF393734E4E19C8601836986F1B773AFABCAE3A61C01D48C654CAA0EB1AF5EBAB6C10029727168953628317805C4B10010CD37ED5C01C4CD3E0039260118EF5C5008C0CB3A90B733CE007D1AF51BCC47D8B36B66761C010BC2DA0EA2811DACD1B06AA80101258C1E8A2D1277E75E1CB356B35719A2BEF099FBA03BDD5577120327D523D0900063A3F691CE2601743C4DF50031CF81A86B7FDF9C075F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 - -count = 75 -seed = 63742CEFAE9868C3C0B31DDE0F9D378FD5D71BE7CC3F0B6ECD393DB55FB043CF00264852C45D1836CC12B9C872A20251 -mlen = 2508 -msg = 9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 -pk = 6D2AE9495216825DE7D5357CC3284A44A4C60D24DE77214A1419F07AF4B8C8A9738ECB6C2874EDAD5FD11767900A590095A38E1184542F3DE287306D62C07C544E75268D0A4EC4E52B491BBF27C8619169F3A85A6F1EA8195C0393D1C0FE8102 -sk = 6D2AE9495216825DE7D5357CC3284A44A4C60D24DE77214A1419F07AF4B8C8A9738ECB6C2874EDAD5FD11767900A590095A38E1184542F3DE287306D62C07C544E75268D0A4EC4E52B491BBF27C8619169F3A85A6F1EA8195C0393D1C0FE8102020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023F2F60E0995B3FF3FA59DDF01DCE94795845946FD2301CEFDEFDFA53FCF46DC94C193BEA64E9AD64EDB303A4B3291774903B7F65A1F795723E07A1CDFBDB843952DE2FFFFFFFFFFFFFF5E97E3E4D00D392E5F886E73E3092034515F3B1B78B4B5AF889FD92403B4F0108EA6E69558240912C5F94637F85DC8CED1430DAD1D3CC3EB3FA7F1609492F0E60883F8FFFFFFFFFFFFFF624C434C9F3B28E4989134567C833FEFD140DB4170BC35AD3B43FA0F5F195915DA2CED0D9F08068193522A000000000000000000000000000000000000000000000000000000000000005D6045B72A02BABBD25C97C9416F4B8E9172104FA12C9265E784186ABA8CF95AF03B95D8B35D31A5AF1B58010000000000000000000000000000000000000000000000000000000000008884A46686C5431C1598B13DFC6A4506FCDD99C4686514AB2C770B22959CBBE401B637CECE6132AC6D6CCA98388D130268ABF28D5C0154D42EC8F9C30E39232DCDA2ECB560E3CEF4269749D081025A6799B2883F7C5F77EFC464AC13363706025F8C9C246274B9D9E55A3D74400DF74342995A1FB97EAC7BA9D70AE1B6C53296F82932895236840162F3DF487ADD190040FEA8D052C7A9206D384CAC17FD00626380B096EEFA0C249ABEBC1BC956C969FC8A6BB89E902D21DFD2918C75E03F00FF394364EDE3302EEC707E67D8D36A5D9B5B677E29196E9D4E23C49E08742D514872C22CDE0FF058A976B65C9F5F2F020CDA3FE5FC54856F6BCAC5933DC7D2AB519CA7573C3F3181423B17657465D8CF0489469F510754CD0B7569304DB94F00AD593DA9686AB4F153EF2F543C537DD6FF6539E5AAD8B083A87474239BD365F01905934078E031B7CA15191BC03637035834418E016656212740D6A8731946776F2B71514A863839CBFB45B1700C1B1D5B80E1138DFFA027EBABDAEDD7A2DE02D83DD7C67C2C7E1A6C8CD935C8B66A7C5F99D2A0ED707B69D0982CCF3B74655E39FA32EC33DABD7A0B18C3C4480F180253679C0B16F3F45403916DD93874EB37342EB3B34FD7A99B73C10A45304405B62B1B0E81915CC4B150B7A9A37E182200C38655A76EF1D6999C763FB14813E29FD77ABB62F321ACEA620512A0A13A12EDDA18D84DED31BC19931DD9FD0D80E70288303A3D5CF596D01FE0F720435145A0BFAF075E5BB41C364864BB0B687E200AB5C711969ECBB7CD9F96F39AF9D015038C9EBBFF3883264B7AF6A92F41B53E3DACF7341EA3C60BC559FA6934160292F1F9938580B2E4E0E31C28C7FE7FDD120086247B835CD16BA5E4A23F45D15A47D4C882A6C5FFF2ED7CD0307945AFB420BD25B2101BF488749F5EF76122343B7002 -smlen = 2771 -sm = 9B3D3A2EF8C483E016F6A5D800268C29181932E5242B97C89F00CF4913D80B00ABFED15FA3360024975A0937ABE4BA9B5053900114CD22599E631EA36C340CEB0049106AAEFF49CCB6CFBE33FC013D05994D202D89606F9D37DE009E5277CF1AA7C2ECE716EFED0144DF761C79F09C5F2BD6863B01EE522CED980314DB3FC83ED301C93EF2BF0165F9AD237C188200ECC104E07D749E28F4AF704600301164CBD752B115E0AA423E00F9BD99CD3ED60D9A84B8DA4F0045B6B2C6D97DD1EB6C31FEA801BBE70B2F9BF9D402D25D37710101FDF5320E5062BF9465AA0C537A88E4EA2A460B132A29A5F26B1003C0EF008D849DD3E2BFF6AE970135D594E23107299698438E8217089FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 - -count = 76 -seed = B887F07DB5358C3FDC2402947BBC87ABD064B02A859FE8DB37B5BCBB916020443DABA5534A0778FD0B1C05EF3ABE6269 -mlen = 2541 -msg = E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 -pk = 079B7AF9264C7352ABE8F09C965FB85684A3EFF64963B093937A38AE5DE6B4B8389A2E7496BED9363D54954D159EDF0296D0D69ACB53D26DAE8BA33989A7A1CF3BFBD3198901B55F0E7B3EA985797D684EE87C54F354422821D7DC8BECCF0201 -sk = 079B7AF9264C7352ABE8F09C965FB85684A3EFF64963B093937A38AE5DE6B4B8389A2E7496BED9363D54954D159EDF0296D0D69ACB53D26DAE8BA33989A7A1CF3BFBD3198901B55F0E7B3EA985797D684EE87C54F354422821D7DC8BECCF020102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003B24F8E61142C7D58ECF12307EBB582069256A9765180339EE02C6800140A00E7EED224F96C3FDAA05026CFAE835CE5CB3836DF25E6A0295FA978F688E71267E355824000000000000004CFCAC0369A9C19BF967406208D774FB1A258151C41F026DB0A4C7E03790F507D113ED741FB0D06BE4659F00C91202AFF9D2FF4C15428150D49260B9C2760DAB952E0300000000000000441460EC469A6992B8951B0C4A603529292B0B1B721C0680E97042DD479FEA46780A94A1A9B5F274FFEC46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0511D9F523AFF9B058C953F1BB8B3E7091F751B6762907700694A98BE86AA7C570F202C541F3726768CF6F010000000000000000000000000000000000000000000000000000000000000EBB5E99678923ECDF5D340AD231BB71F6FB128464BBDC2395016128DC2F71CC411E3F927F653A8ECC388B552C1F3B02A34FB7BAB94612C5E38280328B5F99C52D3CFB05F59541D3F713B012D9F10EFCDFEC222852522299B74FCB8AE6C75F02F20EEBE5DB53BF3333A6DA16DF7137F246FFF4A2C587CA984807FCD38A361A1103E9F9F3F4D86B451B7893ADA606F30147644978B4C8F3242D215A96E8FDE9059264EFEA8494A77246AE22AD09B70F04B36CCF59D66D3C556F488E866B0C1701DD82BCDC9695DBA6BF24815F2D68ED36F1C58B0D4794F51A7EF6C9AF34A68B679F64DC3D57AA4A5BA46D0212F4D64F0027B3A341D5AD9D924A8205FBA9A95D119F1E76AECE2F0AC1F1D92EA81C4AD69B34C6122EEF61C40BFD2986513B9A1701BE115A42C0A2AAF4FD671F12B218139299E711572B42EF57B2182659C5D01199211C524E5FCC90F43D8E81778A5E2900EFD2504F4222F610B6687BF32E6259F93CC85CF0044881DAEC17CEDC1B3EDE7C96FB6149D4E7A999937608887F6A80014C36A353D2A5A85B08FCE41C271C5356D571DB4637B5CC6813E7583CA43FA92B03CB130FC8A663292C9981A34B020F03BE11F97602324582FF963B3470A8FE419F7FFBCF13ADEC367A5AEA8D2022C5FBC94FC5050CEEB704643E1D3931A3C900CEA5E15B59751A99BE95110250169CF73FB6E0DC7228D34D4C5D26EE810DE6979FBB67C4F481521D1126E2FC5CEA100249FB2400A44BDC13709659DF4DDCB0B30C3293E3EBE5410E08D65BF45F3045B9B345354974B876A023313E6AC3765203198CBE539B87E3DDCAA47085FB01A35A7EB2CB963090454D5C4250637FAC41A0024BEC6D7D6122E4C60E69660F2D8B025161CF04160C85FB35F6BCDAE128B6A04C8C882047F3DE4BFFCC460EB6953EA4F6E39E95B21B3D3C849D6E8FF169F501 -smlen = 2804 -sm = 70EA2F4F81BA2E2ECD861F3601FE875430CDDEF5A93F7EF225014312E90D4221F49E6A015958012B868ADE82A31AF78740540300090F17D7B0A85C832EEAF9340007F8BBC7F3717A249755CB5C015E6C7C216F02310EDF0BCADE018C0C42D76821245F77C171C501A9243B7876CE684D21B7CC8700CD9354A4AEDC40E05D4334F700CB5D3088ABA559B5F5BE8886001253EE242A2C7CE07F41008A00CC4FB5552E6091378EBAA4C0014BF040FA75BC420244E8F53B017DE050E62C59F8BCC1CB612300110A57237F237EADD496F5A601003121AE248DF91088F302EE652F35ACDE8E0A0FC68E8C4F706B0701E08D9705AA204B94F55B5F16013D11F47F19ED0B5947530F7BD105E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 - -count = 77 -seed = D08A139CC7147ECAF4B1D1E434EB2EFA2B2607B0033D8BA989133E496DC9F3654944C7AF91CBB79866443E8C4E8217ED -mlen = 2574 -msg = 34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA -pk = 96B823E823C1C2B1198ABB2290ECCFBB0BA4622BFED6EB06E9E31779B29FB3BC0726184701ACBA276F6AA8A3F169FB013F7DFCF1C2364364DF21AA16E9FDB0FF5E2DC8648B6EC1EC2D2D47849602B43F27EEAA98802EBB33FA5F98F9C60C6700 -sk = 96B823E823C1C2B1198ABB2290ECCFBB0BA4622BFED6EB06E9E31779B29FB3BC0726184701ACBA276F6AA8A3F169FB013F7DFCF1C2364364DF21AA16E9FDB0FF5E2DC8648B6EC1EC2D2D47849602B43F27EEAA98802EBB33FA5F98F9C60C67000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000776BBF388CBE8A1F0321669E26137613571814A4D87ACFFFDE98AA9B4962659CE45B3A2C51302821DD4D819EB2FA1987DB1B04DBD66F3002FBD50EAF3B4257B24E45D5FFFFFFFFFFFFFF064743D5799F5978931D809D71CCA4773AE369A86D6965BB1AD693EC94BDA359BBBF38B1EDEDCF51B5C5EEFA7BE755C438658D58E3EF9FC1BAD28F5219BB0ADC5F5A0000000000000000968BB472BCB8F867A16F8054962D8299C9CF30D86B20674D2672CEA9B1B0F9C15080ADD335D02DB080222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9655EF3FAD216F025A4C95AC10DC8689ABED3F69F71123162E21009C06F9AD9F6CEFB38D307900417D22E000000000000000000000000000000000000000000000000000000000000000B0240115A98B213EC1E0400B8B93EFEDB9FF3C111E57BF95435E84A51C226E9860CA26492E498951796A943241E0B032AB49844586739AC73EADD8206E824532A8967488185344B0BE14151BE54820819BB4C0FCF182CAEDEBFE40A857D35004545EC3EE936E47566BD06DD421D21B4FD4660E3D901252C2300B6F9E9CBBE337C0F0AF8657B57BD9D35BE0CB323130234D027BC3CA4BE84472C203EE837FB8BB18540F191BE8A42F982C6A0904BABAA776F29FB5CF7B686F2FF7F2E2D39FC000EFB66E1C9638D98C06E891D939970A8E80F8DDDBBF011E91CF9EFAFDF0374C3B76B67743EFEAEF927F07AE10E6C040292116131E5EA47DF6EF00DF1D214455C18FC6E1D7DA8D70BD67627CE0E536084DA2CE28C8C6A3BC6ABFEC824F8BDEA0134B12F6DABE1BA41D28FE612990A1AF037BCF08CA57D2F3EB9ECBD15D7CBE0FAB0708CF9578C70B5F8AA39E2C1418203E2B2B12D707B1A6F2C4E87A78B53CBCD3FE7D0F8271FA54A5F148BD9C9E8240BD00360CB78A158D88025AB7420AF2200E95FF65932D155A391114DE34A38E9BD9B82CD89FCA1EEACA12DDEE14CE68BB80CCD675AD0A6D7ACE2FF4E1F5BA5C702B46E10978CC6F932EFC3B19A6D6587C22B53AC7F425C4FCF7BE03D83FD97DBF856164382BC64A3FB51B827C4D3629E00413033FE166F6DD2B5AC36F36DB7E5A1D3A0DF3A7853405FAE64BC8E077FD7F5ED6901B3D20D04888FA6B0F0DFBD9001AC4E67B8461942F0A0B7492868F99A5B385753BE8576E0BFD015A1AFBF0A014D393DFB134178948DA3B160EF47234102C0F0C3CF3CE26F64FFD5D039C2365A989048FB8D0C67ABCD2EB448357AF125446C11BF6A25FBAAD2560058E093F8B403A2B4CDB45812F297EA40888D5D388172AD9CBA38A1249A8963138F34FFD206E7CD572BBB3795CF360F20F1242D7D1403 -smlen = 2837 -sm = BB9AE60380F1D98DA0075A4D016C19FD49DFC7EDD56822BFE30120D03166428342FC211138B30071C07B2B658BE727B5BDDE9901CC0A788FDB065BD4EEDEA33B011389A86CBF2D83550872EADB01C4E3FAE01F32C73D4F9ACDDD009A086FFFF41A62994A0AC41C00D839C511C47C4D16516ECE510071370F935731FD1731BB5A81008E7C134C46CED4C863C55D5800766E84860D8DFAE087C2538A01C7277FDDFA3EB40794F811C601912FE1D2A869C623210271BD01E505D4526DAC0EB8B09E45FF0129A8086EEF736CFD999DDD9C010161C6C74343CE086949ADC970A3254B37E3F9F771A8F1F98ABD13037DE0B5D7559A8A09F7B4FF3200C304B72E42A9F3F52616AE99E70C34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA - -count = 78 -seed = A315BCF0E6835892ADFA07C034BFCD39F80B62925A95490B20170BD29378E11559C7F1CD296377FF1E01284EC727FFCD -mlen = 2607 -msg = 96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 -pk = 4DDEA965AB7E52B78B02E2EECDB24BBA9BA085FE9C6F902644DDB8D0157439E04099F5969A7A1F343EE8428631C7A001F070F270EAF9DE4AB2A7280611EC06C820AB2E1BDBEFD40B7C3B3AFA40EF88C5DF2E22EC2A7DAB9D927856CCD4514302 -sk = 4DDEA965AB7E52B78B02E2EECDB24BBA9BA085FE9C6F902644DDB8D0157439E04099F5969A7A1F343EE8428631C7A001F070F270EAF9DE4AB2A7280611EC06C820AB2E1BDBEFD40B7C3B3AFA40EF88C5DF2E22EC2A7DAB9D927856CCD451430202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004102DBF80474A0BB39D8914DB2ED3476594D2E6EB5DAE7516D5953DE0D20FD57B8863759A2D495B7678DFCFBB95B5410BB394C1E36234969D577F787FB3F370ACF9C1100000000000000803A5906A6AE1BA67F63927749C556AAC3AE04220E31A6F9E4823D390409FAF7037EEB56FEED5D4B0D5B63713CFE92F73741840DFBE1F40C105DF851CFF1BD57AA40FDFFFFFFFFFFFFFF0449840CCD993339F1E07A58EE4CA9133BD08181E1BC3CA6A8750D5FCF17E8B9D867020F2CB68B2271BB5F01000000000000000000000000000000000000000000000000000000000000194D4FEC445F2748D802B26F60AE48A2A34A189BA3A6CF631CDDD5A5BD441364CAD0AC670D96A827D5366C00000000000000000000000000000000000000000000000000000000000000725A843A1A53DA7EF961C6FDD0826DCDE47C6F4D27FC4EA6C1ADEFDB45C26B854F2ECDE68D03DB7221DD0208788409014F36FDE39141202ACFFD3A1E48B96CCD36CC34F556812D5C38CE9BF715290097303A4E7821B4D6D2C4F7A86E2E808B037D434741E0E8C531F61A384007430C04305E17FCD78E6D2A4CA8B535BC84E80F4042B0A493286F64FBE35E3514DDD902A8C2291CEE1C64F80C655C98CEB10F4E4CA52466228D2C140301C998BFA82AE8842A4150BB07361EE8227FC36733C803E49610263643CE18E9A581A4A75943B6AA5B2F2C1C95BD1C57FF0234D99DACC41D14A16CDA3A17437399F3815DEFE30134BFFB0021A52EBC0DCED3982DB773B4D4026BC9F9E1F8130460F7C316EEA3FCC6714C026D637B3BC8B5878BC240830172909B18936A6ADC1013D467553A0720E984C4C79DB8C395F454026AEC282C9E9D71014BC25DC5A23CD3B36F1CDFB5039EC0519EB623A3F9BC43EC42DEEB7ED90DB315BE08811662CB409701C3E50D7A549A7F4D7726057A647B86C0069F7A023B4258891583707425392ED0B8959555935A31F234BE45B174BB90C1A40A9AE66617F7040B92AF7D0E199030C8655F0387D2D7FCAC577AB9380B120BA3AD282B66A3CA052171369C27006C45CBBD0B4A5499229FAE004FF41A9F70C4BE56D603A1BD36C436035AF49178AB3795EA2A8BAAA103B394841F03ED3F95AFB6DED938A2A90A8DC70AE4F603A62EDA4C3FF9015E3A062A38950C6400E39680594F4299407FEB81E03B1F16B295DC4AC46D516FDCFEE7E0D26F0ED58372D034CD4ACB014B5FD6E9177B40B28E12EEE57767F489482389D8418D9C9F9B5004DD006610854548BD1774192A8573179A40CC697B01258516584DDC08274E49DD3F9D44F0A901D0CEB44392F700D0D241D5A1B87C177D537292084F46CDCEF2586F22E8BA00 -smlen = 2870 -sm = 1127687445FE63F42B70316F0053C80F1909BDADBEE03374B500FB2BCCAE6CED0197F7FD31BB01C9093E6CE5DF2E790FCA3A72015CCB9898B16321C805A3132201BDC906DA610BC128374BCB6A0194E56FE7CD19DCA2786571C10098E227E69F29F9A92647052E005D54CB7E407762577250CFFF01F452C67AD4B5E00A32E90FAF01AE5906194E436867AE051881014288D57DC9FD595D2CFB0673019EA93272F677EFE2D70EDEE501C53D53058BE4819F34AB323900D9233A2E9FB6439C494B558C005B1068852B8999CD5A41476800014BE8C520F938A97344EF6CC64B7A140C09D9B9D97D22C6D0C00300F0AA76864EBE742ACA7277730015E08893650369917B1197ED280596AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 - -count = 79 -seed = 8B47E0EBE786914C9A52D547106CEB4A3D3DE938B3244E02E5F9660954C4C95A23F2476FCCB487673AAD0513820905DF -mlen = 2640 -msg = 2447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC -pk = 64E35410F8A8CBF85FF64038471B752DFB58C05BFBA5BFD8A11EEFA97EE86223849C818ECAC36653FEDF3B2A53FB6D0233CEBF66C12C96F000D770DEF3EA761856B76647E4872208A37A35CB43705F0831AD1649DF2E662F010C23B4B45DC102 -sk = 64E35410F8A8CBF85FF64038471B752DFB58C05BFBA5BFD8A11EEFA97EE86223849C818ECAC36653FEDF3B2A53FB6D0233CEBF66C12C96F000D770DEF3EA761856B76647E4872208A37A35CB43705F0831AD1649DF2E662F010C23B4B45DC1020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ED5FCEDF09BB8E756E1EFADDFF4C73EF908E63738EC443652D16A4873BE62D496E27B43E517C75455C033F6DA9E6417920D88D4A7B1AE6ACB335620A5FC31899C6EEF7FFFFFFFFFFFFFF5E9BD07227F707852DFA84A025CAD31D6D42BA35F74BF564474DB39F5145C0FB580D2BD7662724A5A37C38DD0F55FC06C76836613416E1199388D36037036B2D34C1CEFFFFFFFFFFFFFF960E68E03AB05206E4309DAA7F28AC700A13A06337FBA595F5588B5D1AF9E8F825C19DEE4A8EFFD78F66E3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03545B771D32038668C7AEADAE29A0F67D972ADAC752D00537E61DDF724135F083F636ACF4EF00AE2F0A3C000000000000000000000000000000000000000000000000000000000000004BFBC2EFD7E463D425F1A1E5E1797DC75645AC0AD404F564429AAD1662A40AA8FE2F6A65A57B5A8FCD37F77381C45C0184E1D232FE33160A13A68BA11D315A061C1BE19BE81E9FBB75DB62BB63B30CACCB544C55BF181EA8EE3DDC33AEE9E202F3364D739D0F44CEF99A9C9126D71DE76FDEF3B4E20C8769B4F11070C45090EAEADD65AA89F7E8BF79C5497FCB5E7F027C4044B61D9F3FA97482B4D53C638730EE5877751F0B3B5E3265DF2C5B6D4A799989FEFE8918896D0DD9FDDDC1627700BFA5E174203431A61803588210D0F0EB48477E22F3BB13DAA0254DA16BA27E373184814D183A3368FC7188B5CD9F8001E154D55376F7A25CB85F582008242F43D332FB46E67820B15F9447A73E1E639EFF365E2D615502439359F868F77F82033F665EF2CBEFBC7E9538723F1AA24C58FF89A14585E746318C425DEF524A51C00AD9918A53F4E2F682CDA02D6B36790199CBADB805889BDCD4665C9B700258C7F7D7DB315361587189C3485164BB53A53973439E8EDC43F47AFB4EE89C4A3101947405C58FFCD86CE325FDB1F217270E79299980AA6D27612F2E3792E1826842F7E69CC03E5C317BFFFE5ADDAF3D4B0045E21C2432190F0AEABF2A85F94919FEE66F7FDF87BEA0C4C9BA737B2C8A6C5552AA17956BCA1B0DEC4DBC49CEEA1E0336E47BC9E72B9BDBA229EF203902B1F79E9F31344D7BE485130BE429B1708CF2D066736573080CB6E6FE6C1D747BA10324FDD74EBA6D679386CBEA296966131A949B504BE361549CB6EEC81CDCF6945A2EA4CC5042EB12CD35D30B3F6F7B900192B5D115452E2DF273D4E13FC8FD60533DD78DD685047EFC9D49F098C73653EE290688E917C0C63AEFB57085ACEA75029FFC3627703110FFC3956AAE455E1CAFE104C0AD592070756271C65F2B7D830BCDA9B0EBF3400371F8FD1756D0DE5003 -smlen = 2903 -sm = BE40414D74E65FC36E2D1059018A62C802A2B64AD2A13A884000159240BE07F826D92DD6A0E400CF4EC882D22B380DEF5D5CB0008218CD21F1EFE3E3B3A5B951004307528712B4A5EC69629B2E01BF96FB89051033B38773D05600FA8D9218ED8E06C0B03D29AE01520CB8F860755D0A10BC822C0011E940421505FEE4242A191A00089A7EB85107ACFB0C56C59100D5DB466A1739F608B7005CC900E709C51E0D8B2D440858B96801A7FA37248CDA49108C3070ED00FF2A6250ACCAA475F77482E500C52EAF4FA115FA88CF5C665501010138023641C8A63E255859935C55B931F980BB62AD23349B4014036E532F8053AE943B85935200008B8535B898563AEE656E5C4C0D052447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC - -count = 80 -seed = 07CD8F8AB7CD12EA7CC94103B8623D6F0FEA2BAFD2325BF6089DF5351BDBB9A94525C3C6B72D3820F2E4D5F9E7C849F8 -mlen = 2673 -msg = AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 -pk = 7595615F9A2078251C2067BEFCD3EB8B1A31AAF506B8FF763398193FFBC20851C140F3EB1757473AF65A7CA1E08A34003B51E8F0858640F50F72820E91BA6E853BF648E9AC77B1E467165C5CAA0B841DDBA9279E391EE99B87A5B858C2ACEC00 -sk = 7595615F9A2078251C2067BEFCD3EB8B1A31AAF506B8FF763398193FFBC20851C140F3EB1757473AF65A7CA1E08A34003B51E8F0858640F50F72820E91BA6E853BF648E9AC77B1E467165C5CAA0B841DDBA9279E391EE99B87A5B858C2ACEC0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007B27C536D343FD8670541B4B196573F04CABA1AA770800B6FC78056B8EE334C3C99BF363BD8BCE32D385B509BA045785CED8CDCF7CB8793A06E9EDFA5F30FFFE2894FEFFFFFFFFFFFFFF345A739F9B65F05CD1B569CA79D9FA8AC1C42604CF88C91550D24491D3B7E5EDC15A852CF8A9D0DACD250B991805554582B48767EA4BE142FAACFAF0433B729CC562E9FFFFFFFFFFFFFF584627CFA86E77FF00FE6F1091510C0FDBB514B2DAA07066D6957DC85432F5E9A60B16CDBE2750F0F29AFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13589E8C482B494086ECD755BA8BA3022771D8E5724DF11CC0FEC03E4AB6C1717A3CFA4992A94BFFAF623E01000000000000000000000000000000000000000000000000000000000000839919AFC39C4D236B08CFBBCDF3AC0B6F0B4ECFA4DDF0AE03A09BB83E790115BAF17378B216B480FF048485A6EAEC01449CAFF1D45B0F2F51EF6BE43A82C8E6279FE7714EA552C673EF234CCEC3022D8DB4F36A9CBA1196E95256F15A267F02E46102468E673A5A33510307D839340231CFF0D2BA8AAA81BBF521A45F54DA721B6C739E783F37721DB91EB210654F01641E783D86930A3A3CB19046EEB76173CFAE26F5F2EFA1CA6082E5300564B732A1A7586452510343317F612FC3EBAA00F3A7D29A498F710EDD7CA7BE737E28D63704BCE825D0B847AD6D8D00DAEA5A06BE38AA7FE4F4236DBC0FFA7F1E78620364CF1FAF77FE54C32D169418357EA504ED20308DF0CAB6EAFFCBC6F7B3852E4804E6BF65AEF56AAA458BCFB1B83C0000FEDE20A28BC496B3D7C218B8C7D087547C99194A73FF96577253DB2532308183B58227AC6589100BA2B9587BB435D1029CBE5D3DFA0156B678737A2CFADF82F18100FA7FDF359D01DDB9C9CE63AC8105E84BA1EBDD943C10B0935984FB3365019D06739A1C113E3AD1B575958E231DD9498642DCA4DFE99772FD4283B88DDFDBCC857B92B3764EDC5470C2A1E0FF8B026DAA1BA07473B1EF6EA18B9AD43D8ECEF80E472A6CC5BB97BABB8C5192B6325153418267E5A1129829BF12799C5DD1033F6718486E9C8487F29FBB022FFB2AA9C5D30A848A84ACA837FE22615F685F718ED20EA02F8165557B0E47EFBA5CD7013B055246ECAECE19D7DD483943C0419513CB9816451F7BBA6A58167E0E61435F21B3DDE76241BE77E38B0B94344FA2019DC15468BF0EDC5BF39F2D98018654B23B1EEC541E4D935396FC0D652C34242B4014F04312A653A8FD1D764EA975AD03442E63BD61F29387F0D04331DE5E5B3F479215D5230E13FFE1AC141E9699023BE5E7B1342D703EC670B0B28F35D30802 -smlen = 2936 -sm = 26F4EF1EFAF94C0B11CEA7F101D3A1F6A9EEAD656201188ED8008BA489F75FFB768D03359A34017604757DC45668154BFF61D50109AF5E93BBB92868E4CF1BD50111AC45A2F625636BA70DA79200F539B3ABC09637EDE272BA1201411740ABFBA569F0DAECF72200EC1D89F93676DEFFF753997001AA93F95AED1FA5B62ACED30000C2914399D9466057095065C901D73282A971DE6FFA96B11B8C001185D5C521698FB094CF179E01D58F44B2B506464AF25B57CD0032CDBAF28FE19F4AC62EBE5B0080B93143049145D958F838250101A3BA2377A8973B45ED6D708F2A29A5207C17D3D0D2665A8D470E03B171796FB1FE1AF99B82975E016A2200F726277CC35C8871AC070CAAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 - -count = 81 -seed = 3D598F7C498D8A1095C40945975380554BEF6142578638A7627E2C0A21C59C579F8E8CDA309348FC54C764C899FB93E9 -mlen = 2706 -msg = 63EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B -pk = EFC3FBD30CEFDE08CFD4C66A8CE62D8A417601B5F0612AFAA356F04C1CE4AB862A845B247E86D287E0C7DF6374401000FFDD9C89C4C93068BA9620FB9230D6CC3C77CDF4822DBD33FAC617D7DCAC6DF6178A904D84F8E9F7FE2B11B6BDF7BC00 -sk = EFC3FBD30CEFDE08CFD4C66A8CE62D8A417601B5F0612AFAA356F04C1CE4AB862A845B247E86D287E0C7DF6374401000FFDD9C89C4C93068BA9620FB9230D6CC3C77CDF4822DBD33FAC617D7DCAC6DF6178A904D84F8E9F7FE2B11B6BDF7BC000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B3A161C03E2EE46D532955BF2276759EF05771A8A80158F75889DB04AA9012176068DF7D9AD640CAE664FBF486CBE97B2A652F1239A6CE552D9A6F9EACB891DB2AED0D000000000000009002307C1F078720185667BF39C0368B02A319097A800A81664FE98D17E521D2D7A3D5011F5ADBA5052FFA59725C7678E7AF0C58AC3D26B8FBCAAE4A6AB348D9706FDAFFFFFFFFFFFFFF40A114183D9D4C6B8873890350CB03343E34E4D29B9D355C225BF6B460064447442DF0E9A3FC6B51E91375FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD8098417D36E01971974A1E9539D0EC07D91B57F4F451D9C458111338BFCD22B836F775F536DCD0BCBBFE000000000000000000000000000000000000000000000000000000000000007E0AB3084DCB72B88153545368D4BFE19025C15F1C271D1EAF4B695FD3F919796661339970E1E87B716A8F40D9368002D7EB0D5569232A947B0261256F84E25E52E0E66FB330ADBDBD0F6243A47131A533DB55DB3E3542443B3DC3946F068500D42E8443FD8600A131D236EBFAE83AE149E0CBE408F181460FF2C65D94C885897713BA6F17574BD04D793F1D3BAA94010EE7B95E57B158C8DBA08057A5C6E3ADC2099513C581AD7C4419DCA9611958367479D83CEE8608B0F0C32D204A175C012047C2B5C469C83B681355A3E9BDA96F5EB69CED233A7B742F394256EDCBEF1404A8DC4FA8DCE89D99822528E3063103F9A4512AB4C8E11152C42FADB6943C8E1E8458C9559E5DB8D6E953EEF963A106AFA6774AB51382DE9DCB952B3667C1033B7322B7009088506308718FECC0A45D65A636713656D61A608AE996D340FB07189D412115B92CED2A5EB6244586040193103F3E6C3CC202B8BC8167E602B3B939FDAC93CFAA7E04860CBF81F94FEE7F61D2A8B9F3F25E960E023A667432AA03CE018F4222E5F4615C13207F1614E6036D350BD5C981795673BAB0297E94D251FBA5FB6369E87B919A02B57297CE1502A398B392EAE8B4482F307989FDDFF63B586F3E500AB33817DEDFEA13EF7625F6126B690696AB7F554FCBDECEE31C3D0268EC59B095CB9C9B9960387FE0560D705527A89B0187F3AAEC396A0D7D0FEC75FE1952E18C8FECCFCC1469ECFDD56701559FD38D7681B759CBEFD0F6E87C993B63D75CDD35BEE94A119B6D918A6DADBF995E3CC26CC2EF4E21B6E9F28B2C470342B0B04203C377F70EBB508E92FDF7F147BA4508AF2CB1FC1316F53A64F671ADE94DCB0395C993ACE7F8629C9DAFAC03658C74549F196E47B2915777217C0093A88114409FAA35965C3C0E34575AA2543A54BD83C70DAEE6A9235F35D2F4D001 -smlen = 2969 -sm = AA22D3FE0DC685162712FED201D5E0A3EBCB11721D7A49698600253CFCDC44FD732FB79F520C01690DB705829FF8C8C40518B2012823D089B2AFD3852AA9C40F00706A1D419F915D1C716521C101514DC47FC5D18C7BD46742F20198F5FA61D88D4E2129B2C5ED006BEF4503DADCB120C3BAA0F300664DB4AD011CD0FC6BF0E4DA01CFC05FCCD7239645313882A9015A4F9BF60D6E5AD4C44E8A8001CAA1F8467EE4AAA909F3DF1E01A8070CC2B91DABC5C6404A7B01A724AA4DA2440959673F02C00090F7C969C8F7FE09A790574301018787366731596084727EEB8012A90333B4418DDBFA33662B6E0E03B57D6A7CBCEED9D788E6BF050095E621488FF00F5E436038E82F0063EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B - -count = 82 -seed = 6CDB757AD36DF99E52F535C2680431D5FF36C812D8EA19399F666F2FDD66D3A842A7A5AE1038359AB618FA58A0A6E840 -mlen = 2739 -msg = 7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 -pk = 53CE819DEF4FC1F3031C464F9A23B6C0AE96CCA366E640D71CCBD866E2FC7A3EA8AF91A779EE3EDEA0572085B13F9001C935EE7648B65F90C1F4FA5D1D0E266DECF12DB6FFB78FD54AA650BE5C6766B45C3B7E5FD19DCB3623FB9E0B6D3FFA01 -sk = 53CE819DEF4FC1F3031C464F9A23B6C0AE96CCA366E640D71CCBD866E2FC7A3EA8AF91A779EE3EDEA0572085B13F9001C935EE7648B65F90C1F4FA5D1D0E266DECF12DB6FFB78FD54AA650BE5C6766B45C3B7E5FD19DCB3623FB9E0B6D3FFA0102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007EA0C46B7E1E73AC5165FE5DC7F6F52B59D6F3AEF8AC92CDB25937D41F2B31F852BD9EEA063BDB732E084CC36EE50677136FBED340546B8438F3599D6AA79C1AB89023000000000000007F2E2E33DD5CE4B4570E2DD5B97D23D9FE16C982AE3E2CCC5C0D9B71AF2236D4FCD3632F442D3DBD415C21EE4304AA8FB5DF6491E57DB9CC7D65D82934631CE7B61501000000000000002F0AA0DA0C4EBD06285192DBEEFE83D5B7B1B472F5EBCC25BAEE878FEA706D7CE8BAF49A808218B883F425FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0ABF7F0CE532D04F26CDF2C82D8EC6E5F48AA5669BFF562C15E5179B9DB0BF175386E6BF5FA6D19C17433E010000000000000000000000000000000000000000000000000000000000007AC68A0043BC7AB2A1C886B2AC5069181504FCBF0C1B13358187D1F3C3A697FD215D433C1F018ACA2E2C9FC9B7DB4D01A5AFB65413BB990D5B55D324B2F04EFC9CBFDE7A1ECED9285E338FEC0625E06D419300A335514BF2BE4A95D52D742202ED01806EA498DB7BBA6D1E861948DDDD773E24A8D92310DE019DCA22F80E7397B2219F561667893D4E12A3FF7118A000888C39FFBFE6EF0F9380AE957F9B7AA44BF5BA6B47648635B2C3F90190B845487598BB4728FB655707ACE6025F9222030A9ACEF0AC47C83096B350F9AF44AF622A69CC8CE21AC5302DE96D330C4B47A0E7D4E2919BDE95DDAFF6D117431BB7020F7B170F2214EF06D84071F1DEAE118201D4BA0F072AD9955840D6622B8EA55B732B83AD1CB634A2BF11E156A5FEA900AAE06A1413D95754AC16A636529208AFC3972FFA6AB9AEB0D031CB6EF1CB86AE95AA6D6761AFF4097EFB0D3592375303C7AE4DAD4EE624B929A487FB912A6CD70B7C82AC6A757FCA02F7A8B34BEC2C544723F2E8D93A4518FEC34C343300B7005221F8F6C5596F113DEF33FA4588504E0072E77D174745B9CCB8E0FE1BCA0507E94CBEEE40C44551C6A3811AF7F61B028B92C3DEDE29D79C5F3D6FB0FF8B24319993A65DB03344F3257F15DB17D904B402B63B62493F639A5C06090F94B18A039506BC8948313F2F3D7B3C6645F1DD1339A439393D52A02B557DA807D5CDD857BB58F3CB70AB4B3A656C86A68318C900E9C65A684A908325EE33C3FF83645B6532335987B9C15A46ABB5B5E42AAAA0B89D928836B4FB8279CF8CE7F73C8F2E0177CC580E2CBC802F112B9E25B3F6BDF32521D9EBDAFFA7F89E92CCBEF50767EA1E8119BA50C1ADB81414AAA3AE1305002F266468BA99A9D372F6125A4FE99C2B282FE18E988CC076828C1AA64A4B85E472D6EBE6556EE67399A6450C46BC3803 -smlen = 3002 -sm = 73D5489F627F4AC9C1285EF6000134AA911BEE5A1680FFAB90005F6F4F5834A64591DE807EA700089FB483042E4D4D2DE4876A01B23D496CEDDB8F65B42AC02000DC2F9FEEA26A1E5C41EA94B5016ABFBF867087B2A0C58906AA0113E008EF56D1FD86E019CE0200D5FAD4B6E5FE0CBB7824679A006DF4BF3FC307D90C1175F3790062D4B0EDB3851B290C0ABE90009903BE0728A2206722ACB5E20173C49683D7BB32BF79E2FDA10009C34FAE9C60DF0425508DD701EDD2C22BCAE3F81860BC0C9F015FADACF996A20EB6864450890001F52DC7D6AE226D042EFB714D8C315CBF72D118BC0D4D86BAE80701011C6B3D77A7C2DBF2E6424500BC9D87AFEABEFCE6FD0079164B0B7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 - -count = 83 -seed = A97269579EB70D268C58D94FF744329B197F722A8A407B788510DDCACA34C8CD4C72FFC14B76300C86AEA1E4CFA66BA4 -mlen = 2772 -msg = AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE -pk = D538EC7ECCE0781CDA6D6642FCF636E048CC56E638DA3A6FF00CF48B29E517F3DB7259FA5E3773F160DEA51C710F4C00E8695A9D017ED12F5DD0547256D25A0BFEEECA7C123FA2AD421D2FB8634E0EE2FEBA439AFE4C43C235C9AE3449615500 -sk = D538EC7ECCE0781CDA6D6642FCF636E048CC56E638DA3A6FF00CF48B29E517F3DB7259FA5E3773F160DEA51C710F4C00E8695A9D017ED12F5DD0547256D25A0BFEEECA7C123FA2AD421D2FB8634E0EE2FEBA439AFE4C43C235C9AE34496155000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A53621DC80E4EC816DD054AF0D9D9DF7C7E62FE3A12007AC81EE63DEA3182C16F401E50524FB6FDCEC5ED571C13D35989B03ECD3CBA9B16B10996F4DD80634B25D230B000000000000000EEF07EAAFABD7AC0A38E7777F940C39D23A62C6366D34D852088D4C88EB76A657A483D426E267FC70BCA2CDB7EB5442330A4E06D92E09B0BCEFC0181FDF01073DD01100000000000000DEDF55FF41CAB8DB742715C4AC7E367C4A2BFC8445B35F36ED470BDC7412017EFD3512D6E0952AD6C8258FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB3D309D056AB3A1DBB77E65924B72B1680A6DB7E0B911F9D45AD16B828F2473C3BCD8FE8AA45D59247239010000000000000000000000000000000000000000000000000000000000007683D6F8CD2AAE0DC812C3BD9246360CFA7E33B6F364A3D01BAC07E67D71DD2677AA610869BE07E0EDF7E47A02100E03ADF3E38AAD31025A5118391381423F5D9790D795D1842695F3DA5051591D42596D8608F7BC1783F1DF18550A5B4CB302247F732FB1BBC39A59FCE56D0352B644A4BC59DB3B02E15D45FBBD249810ACD2DA351853E5BC0E28D4E2156FC14004023562927E9A3DB64DA8ADAA8777AE3A3043E1E0E34A7315F29BB7B649B84910203749B2C492EA751915C7E72AF5DAAF00AA60B0115BF26B62A79C929F7E0ED34B16CCFA466E811CA7A704CF6BA6FDF0DA6FD147F5240D9BFFF2092D356FD6D50085E175C913EE7625E273F21379DCCAFDF4BA2602BEB6A2FD9CD21F0CC25744646E0F157909F9AA0B0FF299A483E0F00009C412E791B3F949367EB472153D38D71E5453A3EDE10A512D1741737AB7BF7E91CF0B910710D18E59491FC9C0595303FB3B46E94F4FE13FD2D3415643C50051735F21B25B865EE4A4F75D07A4DB83D73580DF0042C5E9A2862D2DF0190309014B826B827E9125D10798EE254EA79B0192A7CAD0D397B832383C7F8C50BE5FADFD26BAE7DC4A702EFFB1B3C6E34C49001D906E71D1C8BB6170906A421A4633A12C2C77E2E6C288BDB2694972D227F444903C79CAF155FCDEE453A74E028E1102447FFA1F1556FAF644093425060F30B0AF2499D2BA22C4D228B5DCFEF752324F52A9C4D1FC3471CB7328AB45386F9C01BB787D8662B5E9F2CF9EB881535BB6B7A0DFFB050B1EC549D3812D88BD48085BE2B10A006E12245A09CEE3B753FD6702294E543ADA841396DAE86C16D1C24211400043BA2C970952A8D8C176DA2B78328329A3660F346EE3CA52BE4631FD4B01F8E3C73ABCEC1C2F82CF11382F4F276BFF1AD2DA872A84B8DE8C69C3B571CCB20F7DC263185D3C8E6D84F6140EE91C00 -smlen = 3035 -sm = 4D30C9C108E99F47EA777D650124A0F129306D146017767B42010AB8A8157829666C696BB20200CDA26017A88FAD20592471D400C41BC386C996BB56789089350008AA6667FF06622B854669FE01CB03A4AB994CA3979AE11E8F00E6AC4F5FBD1BCC85F5AEBC86016A78DB46B3EB4EC0CE530A2E000F2906FC593C2603F70C40AC01D9762C510CCC7BEE2E57769F01738747F478C2065A4D2031760146A5F538BD12EB621242C6DB018B9439B7AB9E2E6BF6CD5BC001439D3A233596E88D26A4D806008233AD44566FE44D287DC91E0101F5F667AA94535B54871207C13F6442A81DCFFA5DE4074E70DA06004AAEBAAD56618B05393128D900ACE1890A0B98DDFDA4696449FF0CAE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE - -count = 84 -seed = 483A81716F91A43ACA6764C4BD2A57C9156B762E9174EA49730A6BEB9CB19A0B3755E37BA47EC524BBE2FA25B9FEF687 -mlen = 2805 -msg = A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F -pk = 060C57D12637D02EBBEEB4F31D48CCC5CBB17BEE8A6EEB34C00E9F348B1AFD2D38A1A6FED5705BFEB7F52CAEB4A9240332C8316C861E33F699ADEE5691A8D551657E2BEA87D597062499145D3F59CE25C1601C740D8797DE0A0B4B57B2C36400 -sk = 060C57D12637D02EBBEEB4F31D48CCC5CBB17BEE8A6EEB34C00E9F348B1AFD2D38A1A6FED5705BFEB7F52CAEB4A9240332C8316C861E33F699ADEE5691A8D551657E2BEA87D597062499145D3F59CE25C1601C740D8797DE0A0B4B57B2C3640002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008694FF8FF51E56AC0C06294F50BC4B32BD2831BCCC8D3C0FC8E1C3FF070E10E97D8F848D40E2A5DCDEF872CA278F3328D4F6DAA12488DCE2F747D39BA8791E4259AC2D000000000000002D5667077246AF8B1E677433F64F3441FD0DB41D9FD9A2EE2EE37A653C204FE5F80B7745CC7986D5D2A6637A68FDD5B48C0DD1083CE0380595B94B032D4869F27370F3FFFFFFFFFFFFFFED233C514F1F7666583CE8FD84A1CB418CD0AD27197ABEB0F98F562C1C5B908F07C63A1BC5143AB9DAAE2A000000000000000000000000000000000000000000000000000000000000009AD13E84B8B41BBAB3B635C127DBD623B24BE2B9642C750B362BDA050FF5AB7885F08E08893BEE2BEAC0B9000000000000000000000000000000000000000000000000000000000000009D65C30D2B67BE7F06E06FC641B60C4AB849F6471097B06ED922465049B489EFCDE5136CE2EDE58F5365E487EBDB4A00A396C02AE2C39612D72EE403356880127EFB04D2926472AFD03FBB17E895DB8363944ADD29D00E798B5F56DD1991FB00DE443CC17EA78747FDA05213D1AE4F399B98DB7BF3925B5CCE55F6AAF2681725142B4BAC8EEC28D824A77C5AD0C22603ED09ACEE866895C5685F7185CBDE980A088FC8672DCFF7791D77CA9B48712DE9BFC7C6275EDBE4468C28AA70C67BC3020E16005776D7A1DD993D7250C85568ED76D53D2FDC8489697E733DF40B088550D2B6117A3A30F7AEACECE89AB58F93022928A8ABA8E035045CA8B488DA65258BB0CD77809CA48C37098B0A3F00959A424FA05C7E483A71849733F1CB11383603AEACD50DA53FC34377D0436F9467F076CEDB0486BF87023DB6FC9146DE7251C9B32C2560BE007A2123F5EB9F80B89E017E8EB6B368A1EC8C06A6EB81A7ECC064FBFE8D8A7C46D0CFA377F296C95D577EFCBD13188367593D06E04721CBEF8D0359402316AE1DA6BC87F41F2304E635B04BFCA21BFD5993DBFA17229E9EF475CF5F5CB190CE1AD567AC2939DF4489B802FBE0EB3C5BDC590418B5C2FCEE2767F5F081319E1FF40E34C5954DEBA075D96F425BE4CA08E8F792033C8A431587AA039D89FA3425351E96752876A41274CD6FD65CEE82BFC181ACFD1D375D62D09A9AD1C8EE4B099C8F2F8622E1675417F4011A5947E5D2374DD7712EA78588154BB19F06F39E756E65F56C8D4BF6AF22552417074FA3E42A8AA3726CD2C3241A0700B84DD7C2A9A2B13AFFD3DB2F6E8EBAB669DAC32BA18071DF4E06352E8D4A99E4293A61CE67DBBBBA687E0666D2F2E101D290488F9C066C56CF24B03340D1C3DD08F2A74568E9CFD40E29795C79145FBCE0A696AA5CB99EBE49C28628834E6903 -smlen = 3068 -sm = EAF0CECFBF46A16F6EB79B50007959DCE485A961DB275A6494013D1AF3B47AB141E80FD01D7C000BB37FC432F3D458EDDA82BA00A7AEEB8578EDE4C4E409AB590038B8D2DA31AF7561484D8CE4016E8C02B76D180B6F2393A1D601E22AFAD5984F62F5E40F8D7201529A4896F64258D1ABFB4249018D62816592F00CCF38F674920008C4665EAAAA945C93EF2C30016853A3BB91FFC12A18B1E5590052EF14234B82FCA363B37E460069F05B25724387A0BDB3B054010EFD2DDC70578B7C92E68FF101D1CC8C17D09923648A2CD5BB00012F87E6CE7E96C17E3A24EB63A1F9439895F05EFDEAE5AAC24E120226CBE3F982A77BAF0FD460F7014DC18284C5E4852F7FDBFD91DB0CA7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F - -count = 85 -seed = 30F0E117513AAF27AB2516BCEADD1188B4BBDE76E57DFAF43CBF2D70723D941E8F875C5EBF02BD7D67AE81ABCC54440A -mlen = 2838 -msg = E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D -pk = 1DB16F301844F3A8C168520133D1482DB00987D9DA48759BE0D0BD4524DC8AE5FE4A040BD35FC3E8582DCEF01E754E0092BA08C0B951DDC8D841734027EE98BAC487F9FCA8D3F8EE02A5FDE1388838DA3AC9F034DDA7BB373762A5E375DC2A03 -sk = 1DB16F301844F3A8C168520133D1482DB00987D9DA48759BE0D0BD4524DC8AE5FE4A040BD35FC3E8582DCEF01E754E0092BA08C0B951DDC8D841734027EE98BAC487F9FCA8D3F8EE02A5FDE1388838DA3AC9F034DDA7BB373762A5E375DC2A030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000156B3C4BEA0C2F1443C69084B836D599DEE86B756B5B00B274B63C13D99B67926202129BAABB3019106D0E5EA9306F803410559A4A01129B4103AE4627E2F8FE87ECE7FFFFFFFFFFFFFF82FCE94F917715227BFA3AC864FBE68523F8A0BDB3F83AB43644ADC6AC1ECEC3DBD20E1F13631A0A845AA462CC7BEE7AEF339EF96BD3200860F2EFD3CEEBD1794B55ECFFFFFFFFFFFFFF767EC1A48B9C0E3ADA37B1D2B880D03B36988356FFFA2C6DB67935C189D640486171A22435B6F31E76CA69FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25430F39AA86985A8AFC2CAF9DFDE790A28BB9C2330D7617FC32DD834B5A565527AB680B4C57A2CE3E237A010000000000000000000000000000000000000000000000000000000000008F287C9B932502A13D4EC486B870E3D85E90F07E715B155CAA677B4D4C08292A6128C6BF9F1BA166D3DEDB3B4FD16D010B0ADDEADD687F002BAF0FE97435A8007B863B46F51FD06309B47C56AC988D155A4F4958AE75D111FE30F8371FCA2400F52E22AED276EDCCB3EEB4445D88C87FA6BAB188262C40967AFAF1D5B00B064AAC03BF9471A5467AE2F03B3138DFD9003A7315A2E00D6D391F5F2AA3FFE9309C82C3D25ADEAAE7E3266ED7ECAF1330ECFAD8AAE1B5CD50386D7983F33450760296F2319B3F0CEF38314689DAD4C5872B3D299DACA336D840F7290591246D7B7A8E39C98614E1E8C9B99C476D5A02CF022433EE54902830463711AE5917307D9FEBEF04B66C9CFE2386DF249F77D151EF773F5E0A5C2212504190D2DC4CB0C4029E94BA3491AA1512C6779796FD569DE6A131AB6A581DFE1D4478FB743BC0BE0A5D846BC71D4C300AF456EF7E1C70E102F6875D52669C96ABA24AB0E7AF58B5D4B498CAE030C57EF5D84A71C29E1BBE9BC30EED89977EA91B4AFD0F739C860902A29E4E3A443AD693ADA7499FC07F3C1BB49DD4BD8890229CF79C120ACE47057B864F293B3997E19CB161767392BBF202DD169E6CDA9A441FDAED92E70B51474444C2A230DB36816F9BD5740038A55C07BB29A6D36BB239D8605D2CFC2FF20302318C0BA10F3DEBD4EBFEA425127173215AC9D76A038B7C036F137291A88FF5A59D93549B4AA807C3F57C889064123F0090064AE505B26A2B067F29EF41B75CD84373834077A8401EEFEF83232BD7319C51A44182E5B3DF00E50D871C52CA4C02942BEFF0A50662A004707790E857FA727515ABD41A09E7F69BAB45CEE4D04618E38B637BFFEF87302D88FAE639AB7E02C5F73ABB7DAB8E37C475C9511DE676F38E72F562AB5F5E96C3F5552CED0C13F49FD22DFB9BAC088C00B570F24ADD3102 -smlen = 3101 -sm = 30E6B212880E9A75589766450087182339E4202E4AD27282DD01D664EBB8969F773B2802B6B6009EB8CB57E38FDD6E52DF85BA01CCCEBBF021CFF060F87CAD580145C50BDC7C6A7C90723DC53D00EC693F0CF57AFED7182D9F8000F2FBCDA92A044615F1BF286F013AFF92D667169912010AE35601A61662105120AD5D753AEAE800EF1E9D95E611DE7744BD1B6400C9B2B7BEBEFD53FB8A112DEC0180346B67DF343FCDF376CD7F016CA6ABC48C90D4C5D59F1FC600F90B848A18170B2B2E8A0968014FFB8F46BCA49E7C9AB3A1A20000E78276B13C0972F7B5818B72EAC62AE6AD50E1FBFA42164E6E18019C769D6881C9C70802867CA301546C4367DECFB3E8B722156FD70AE43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D - -count = 86 -seed = 070FFB907EE8AB7152A9D380DEA2C4C4796780FCFD80906C5E489B917A45D5E7EDFE6F37C4420E5480E8BB599FE36451 -mlen = 2871 -msg = C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 -pk = 0B5B56687B8784C46FCAC153EED52C24C2EB5E1BE45785154C158B7CDE8930A5DEEAF810BE9520988F7EF984817F39012FF7D3EEEB12CAC4AE875A84DF4C029B9D5FD7B2565D6340CE4C3EE6C55FF7ED3C33780863A8AB2485DBF64006D41103 -sk = 0B5B56687B8784C46FCAC153EED52C24C2EB5E1BE45785154C158B7CDE8930A5DEEAF810BE9520988F7EF984817F39012FF7D3EEEB12CAC4AE875A84DF4C029B9D5FD7B2565D6340CE4C3EE6C55FF7ED3C33780863A8AB2485DBF64006D41103020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093512DCD8FEFB7A22098DDED1B09131840EFAE0FB83E1D3A24867401C124E69E39D770045D075D7B0F9197CDE751680B658C84CA679C354727F4BD3A7B6A4C1D6698F1FFFFFFFFFFFFFF0AF02D92EE97AAF536FF235466082C8B1A354C7B8077346AC3B4226DE2B72D39A8B21CCF218540533E907ACD251FF4EF0A49494832B24EE20C8C8AD47B4E1528DD7DD4FFFFFFFFFFFFFF3A8ED11FF6C6EF9146F241C716353286B20484F963C576D5EF461BAF67BA9E83403FBE17734B10DC3B4D5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73FB1808B2E2ED8BAA9BDDDBE30DE359E4C235511CB91E02D242ACA269885037A69F729A882D48C3AC3C2E01000000000000000000000000000000000000000000000000000000000000893ABD2C0677C1FEC1215316724FDBB9C21C3A7419F5BD5314D6AD2B9D977DF134692139C16EA0DF3E2A1219C39CA4009710CDB0BE5221264DEA76ABC23D206F4236A9810F4F486818EE66D0476DE93D8D815A3CCF41AEE6D5C40230C64F2E01E0B2A2463E9B16050F322E9F68CE322469B7D5161DB5F24D58C1223E07BA4E73262C667508E54F290E3476877CC5240201D1F9B5BD335F2F64FF942C886F2ED3A96C3F95FEF580ED9369320908797BCB646E613AFD2DEA810E0D95F7DC6E9701572244BEF6642E7E6D6154C0264D2B5E03BAC6E4E93F1D8F32568B91B3B406D4DE0F5A24F4817D3F8A65B8D85A47D4011E2CD775E38B60F25F956B6826950A48BE2FC056F779CB77B5F356932E2A659A4BFA86DAE83F7B3CF5B0D29AD3089500F7ED4BBD36BFEAE6BEC06EB35AAAA6DDC06977482C07787A9E8825A5B34A6CB857940370C2F58AEEA5045C7E7EEBA8013A20686E410BD8E7577FFAE23D84501CB513F4DDC3FC33FD72062F9162729764ED305AA5C6C8BCFE7C3AE2257A3A7300328C612045F0643C6E574CB15F57844416E6AC2569322BEF4820A443514D7E9DD81640E098BBB51C2073F58304B9D40159503986E281F5D887B47F03B94CBC5FF33F797E4D60C812EAA7071676A0F9FAA9F408B523DC0F81867417AD87A06E002A9A7B9EFB668FFEE3A2CF36ABD845DE5A457D72D18088F5CD41E504B99A902A530CF24A73FA0CDC356F89294F295600F8A99AA9CEF6F4FD985037A348F2A15819140630663D4148F0B5BE67F79F5324ACDB6C6EDAA02CA9A240F89B96AEB6012F50533453268D9FAE81970D1A81E54F1C3A5895C0190F3CFD6349D60BAFF92C5C207F1CC2D63AC33228D49C58041002D058113038C94C9174098ECF64B33D1D49E9555018900E2A98DB7B27AD82DAA492582E05D7FC232BBEC1D09914229F01 -smlen = 3134 -sm = BE9B1FA253CE7240CB48596B00619973FC75B79C76F91F91F700CCB7804FC311AFEC988B059301FAFD649C7B1E476FEFA7637F016BC5363A860FA7686890F74700B5F3B0D4286D05609B74804701EEC0758373E9038A28DABD780064308E3F7215A3D3E55E851F01C9F3326240867EE1AA088A1300EBFAB97E70FECA9F91B3563001C500F9E26AB5D264E922D55E011458881B359CB66483E1C003006E3B42677B243787842C98B900764774B5049B8187C815719801471B3C544DD631C476EB3124008B2DF03C894644238F16AB82010163E8749022619808941A24E6904AE31FF69A6F2A9019C8C25D1203E3628DA2959D0AC65B70E694011BA5AA4A960829BD6608B1DFF906C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 - -count = 87 -seed = EDBCC4F6AD0F30066947D678A368B960CCD164889D77730516B444ED2DF10B49C101902F5FA227377C3163A0045B34E4 -mlen = 2904 -msg = 836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD -pk = 94DAA4DFA341BFBD62687428EC2741AE0899291D72A06927796E61EDB6DF9316D23F99F27723B8CF7D341617635B1A0160A4663FAF3F8D5B829E4984AC577907F2B5C180BC2F49C09FEF50BDD6F30A9B3D6819FF1611B4006EEFF115B72CCD02 -sk = 94DAA4DFA341BFBD62687428EC2741AE0899291D72A06927796E61EDB6DF9316D23F99F27723B8CF7D341617635B1A0160A4663FAF3F8D5B829E4984AC577907F2B5C180BC2F49C09FEF50BDD6F30A9B3D6819FF1611B4006EEFF115B72CCD0202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009D825B4C3AD2DC82C4B76990B1CBD962709683BC46261F16A67F9E5C76573317C7EBA264DB5A6410A273D49951124DF53634666422F8803846E14751AFB0DFBA771500000000000000008A7ECF0E797088185E22B3D0DFD8E75981AFC5AACE8D5CCD7CD3D22EE1BCE96201DA252794CB21FE2F5971745D6BF6CDB7693C83BF2E8CC8A4C46D3070525B9F907B14000000000000005A9139405E144B7396169A8583380B52F72466F61B5B980C0B88C55011E5634F324A7A13C5AAFA9BCF8793000000000000000000000000000000000000000000000000000000000000007D8FADAAAE74D0967DFDEE5096B85C5C4D1AC4094D5BBF1C89534A9AC57783AAF0961AEDB9C9A33CC2BEC1010000000000000000000000000000000000000000000000000000000000000464037CDD91C9CBABF777FA39D2773B3EB725E058CDC7E036D641DFC5B3641A4361512BD71B72EC63D97B67BF6D7903501B4894B3AB1361D3EDF5099D43336ED376139C96B9597036239A8D14C0269332CE5E3396149D1E85AB6D497140D50358BC6E21D26482D0392A10EC7468E66AFB0CDA3047E835B09C9626991DD72FBDDFD38ACE2F857477E49D10BD7C371F02359732D0EBB95E0F4E23932418D0451B73A2F2BB6D826041CA776211B5F72055B8A1226AB69FF83F6D2972C664E5EE00D7B947627327BEACBD11A9FB766A759EB8376758D3B81F4E189B12F486AC06267B9FCB4351520E57DEBAEFDF0CBAA5037C7A9A468A580D5581DEC9C23B02ABE57A28C80976881647BB101F7D8DDC2EC14C8EDE4CDBBD04E4E5E2A1323E0E4A01771DB50E9E57C7B850E712A56AA9DDF84339030FD6A79754C59B4CCB102409DA21790CEF49B1C49B5F02F0CCD742ED00F16FA1BF708EDAE18FBB31EEB3402731B14D3FF13F174109008F8537487F7CB6AC612249B946C03BDD72791B7E6C5601209033B1A9109C9A85C16FAE462F51A8676D08501EEFDA52C6A41C40416F502F83F26A3DD9265AC073B8E5F10EA29A0318D91B34D9DB298B9EA8986E05D4DC79BC497AAE04C43CCBBC585AE6ADB05127CD7E46180DAE1D09CE5C99A0BEC8AC0166819DBA1D9307BBC9805618757528B64BD1F21058A2F1EAF15A986205B8D1E4049B00737CCECF2758EB04185C4AB2036ED04B722142D18C10FF1B9B91EEBFFC63A5DDFB3DE7D7134F09C37DD31438197A1635FE49FCDFF02D77FD15830A2103172F0DFC06D4E9F4D61046F7B3C734115B1CB6F8EC457A1B8BA9B8FDEEA6864023465BCB33F1BFB3E4D1396BC3D5040137E9433FB2D4C6016EF1E749EBC9022F3E58D1973057429519703E6C6F9010B81503D5558D8E63395722B36992CEE101 -smlen = 3167 -sm = F69E599931054836A0C9857C01C3603DBCAC968C9F348180E101D5F8D3BBEDB3468E097167E2004F8C818E6820D3654CDBCABF014F9FFE4C65EF1A831FC4FFD6014F5036FDD19F799FFCAD70FD00BCBF49A178362C7037C4564C011817CCD62906B68614503DF7007D08573062750C8DE69EBCCE00F1396E0B70E1E2D3B29D114601D64A6122E63F7101B75C1D1000E610631FFEC59A3E32EDF62700980D70B42500A2D2977C39A5000F1E537E7AF46633AC1388E000F22C21DF78E98FF55C45871900048E2F8B152D7478D12FBD8E0100B36CC70E2D3AFB4CA5A54C2B5EC6053E4C80160BC869C509860A033CB9E3C07CF5E34D27398BAB00FF0F2304E4EC69D21035A9DC2C0C836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD - -count = 88 -seed = DEEE61A2FAC04E4D6B7A250124DFD91518D9B90A71FA02665E3088760BF69CB3CD7B6977F860A7026819D178623C9676 -mlen = 2937 -msg = BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C -pk = 06FDFD6A581CC61B0127DEB7DE51305056B8C6BDBC4B5E04B02F1E9EED271EDDA8D3A0A471F163691D3CCA33B9EB1302FF0D8B74F2ACC7C49F6FCDD4E74BE64FBF2B2A8FA921B3010BC1D8F37E83FB0D2E7D2456451AFB19FBFC99047E8BA401 -sk = 06FDFD6A581CC61B0127DEB7DE51305056B8C6BDBC4B5E04B02F1E9EED271EDDA8D3A0A471F163691D3CCA33B9EB1302FF0D8B74F2ACC7C49F6FCDD4E74BE64FBF2B2A8FA921B3010BC1D8F37E83FB0D2E7D2456451AFB19FBFC99047E8BA4010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DCF14A6DF49D3A2FBE2C7BD2B807EAF1DF608D3283DE20CA6A2D9EC703847DE77B7B25DA0FB529763AAABB10579817544FFBD5932E478F3A4C33B82B7A8578545F72F2FFFFFFFFFFFFFF01E9E83FE547670EFA77C26DD02F44A930E0BE8B0D0C73ED4FCA97E214226EC7AAA46A4F88D6734A2D1D6DC0DCB81EC84BE195F4E042C4DA75E68761DCADA4515FAAD2FFFFFFFFFFFFFF490A3D676E03794A592292B343ECF6378ECC53446D8CE7E00F65128217129E18DF39B5423152540FBC62CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58CA555386D28FDE1D7118E6AF43745FD148685FB263577B5413CAC4D9FFC9EDD7045A626A312F8C71C91B000000000000000000000000000000000000000000000000000000000000000D61B29802E69F3E8816B6CC41901EF0D567A554F2A8BBD6848C92B9B1FF3B1735126FEBF712C4B15C330B411D419A0196CCE8CE6655D4E00321F6F707AE79DD8B350BD2D355430CB615CF6C63086A9006C0487A5E00C6F6C3369A211911DD0256107C4373FB86FF4DCCAA5698B4BF97359AB73147DE20CE4F28F96AB567A8085AE05D0E9BF3CF41D3F25314EFD672003A3FC83C7A20454916B31D5BA67FC7540015D4A6DC14E7035201E1EB94BD6AFDB63494F6C076C130451AA93A85320202525CAE27AA9CDEA32C5181E90ABF980F932D5E4327ABA4365F6F6D45DEB53E98FC6748CCA851AD2E7DCB493B23868500DA71056AA1AEFE8D99655AB7AFD64BAC14691127C76E872C93FD17A4E88EFD6315CBC62E23E9B2FD67279AD70C8647007C9BA6E4CDBC69B6F24E2ED211F8F4F94BB6CC8B9087073B2C014F1949EF86EE1EECD621DBA48F89F91832119FE456032EFBC1ACC91CA98B2B2ED8EE10170C3B71C391B0B183EACA6B40F952202D540B33D02C2EECA548A944768E421AB6F501E4C9D5A76A5646FA712B304083D6284822BE38B84320286778D5E7A1A6AC1B6EC7813DA9455EA747101760DF29B1C4033E1EA0D7EDAD11960CBAAD483A48842D66AF6389CE7C2A23CF13CDC7713157DC09235D18B25D4333D3D6609E4C975C00FE0A5FB474231D3527576B2770ADCAECEEA5DD8258FFCFDD53764129BECB81ED9B2E59A1750C26BD7E1176C65B627D0176931C4D283EA8553BBE8D15A2828AED1919854A1A2F81E27F0BA4B1E037AE9AAD08871FA75EFC688BC624B60A6B7301DA7D8E8CD8E2C1DBAE8EECE7F610E622E2BBA944A31583A31ABB15072708D4865A808D1B99DB99E495E9506D15028F033C101C0C72F5E6730C34E9962A18C86728EC1AE28B368E82042BB0AF0B7AAA5AD908E11995893E5AF5400080D6C29501 -smlen = 3200 -sm = 548556A7CD9E61B80E4A89C8011C2D22B85ECCD0B6D8ECBEF4019C710CDEA96F5F434BDF32F9013CAA4327474DE2BCA116B0CA0123ACAE10F548E23E8820570500B60DD1661BFA209AE7D4F71F012527BBA0C788A17D196BD059014851D9E355C84A0AA3E03622014CBAC652375B84E707909CC5019340B0348258807ADFFBDC50016FECE26233588E73BB78C2DF008A117E30DB6B1A1F008F9D8900231772EC8B29E1A1B955B59B00554E14BA8B38CEAA83CCEB5000CBC329502D45F2FE7790816701DE906FCAD03B9EE58621B1A301011108CD452B8CCE8715C8A04AA76559B496F28E40B61260D3FB0103E4B9C331235193CBC5040F05013473137D3C422C1601B2CE82CE07BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C - -count = 89 -seed = DAB6C05E29342106CC34769BF419ADCC88010C05B57E673A503E63AE7A4EE55B72AB2CA86C4EF57FC8C02D2E0C8694A1 -mlen = 2970 -msg = 4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D -pk = 298EB6B3A76080CA040E723912BF691D65A8D5C22DD6268B62BA7670117E8B0C8C1A636904AA11B6183357B5AEF034004C44756F9FCCB76D9DC8ED0B833A48E5F5B5F14E0B35DE061B0BBFB22C72F9FB4DFADD422380CC9AC991E1AAEF968000 -sk = 298EB6B3A76080CA040E723912BF691D65A8D5C22DD6268B62BA7670117E8B0C8C1A636904AA11B6183357B5AEF034004C44756F9FCCB76D9DC8ED0B833A48E5F5B5F14E0B35DE061B0BBFB22C72F9FB4DFADD422380CC9AC991E1AAEF968000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023F43E01E6B443F188E309485C81F4D54BDBB6DEF0CBDA64E911BE7ED39BC63F9881BE65B92BBD7CA1D905C4DDD66B3C6F51F86BC3964C617D04D35CE3A3BF391886E9FFFFFFFFFFFFFFFEBA23B6AE25F0C17BA42E906704F59F45C485453EC42124428B78E931FBCCF73C84571FC7FA9A339F289BAC11D41D3140B20F3395F3BA8CF60EC742DD789C49297214000000000000001A8ADB57D5DE2142C03968844567DC9EBB717050993C0E83324F01F42B5875C5123F0CF4F08E9960B3CFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDD5AF05BFA9D6BEE024982DDF239DD3FDEEEB159257B3D1DCFE1FB48F3E39E7550E0933B0FCE15F09C396000000000000000000000000000000000000000000000000000000000000000F95B38D02D4C80D2265A8E2E58B5127A5DF45D44F8A2073F160DCA8D017C1D4F8D7FC5087CDEB6D8A02593F55B2C600E23ECDF8292B9777FEBEC48C9672EAE6C554390FFAB52E9793B783871E1A69711174A8CD64DB7BCA9BA4D09A176BC502302DC612718436B13C0BB653E976679D92478EE3774A537CA70147EC670A938CCED71D975D50041EA946E8E1A964FB025094B25C18F477E2D683399547091D420AB62B77D6BA7074270D2DDB595371D4E8A197FFD95B07747D463F1006787C03D5E9A7CFFE878595AE548FAB14070D78BB00AC252C5122A65D44EDF3FDCFF4F2446782F6C27C4A308CA05BD3B1DCFC0241D8ED890F1CAD6DB49A526422DB95104EA9ECFD7D32C5C90C577E013D363A4C9802294AF97EBDFA3840E29FE87CA8036E904B8011F2F481F194B1680C02CBCB20F40E3C3C48F2E1AFA805E35A3315012362F9B8C48CDE495FDDFBDC5DBE1801A59892AC585ED72E97FD1E076202D83F8F0670C884EB38E2BC62DD0657EB13547FC24E4EEBE47864AAADC284EF879C011F8122CBAECAD0E6D445A72B7857CAD2BCA2A9BA715F0C1DE685B14F72A8B541F7EA7062D7B7106F82CE0EB0F849410387DB6DFCC8A839E18DFEF4642772E5F5C825334A56C2DB88B3D37E0239EDF8F651E5FB3C28676A00E30D56469377420348A00081681E8CA4D0C09C87016014CD82667E13CF1D23D32D4BD9BA7C08868B4DBD7FAD8ECD1AD9EABDE82FF039D200FD7CECE4540FD609BC1884427ED13C52B3C27F08B50795350EEC054DFC89750CCD3AF9204DBE2001099D156ECF5F170247FDEA65F69D2F3580CA6EC3EE9F294BDCB288EE41ED7116122C00CDACD7FAC52940F462BB5823CD8DA3A2AC711B4801CE7B5AC1F07032ACA6E00534015DB3B94B123FBC915652FC0E14B4B2189658849A24C9FF068ABF6FEB2067CA9A032F02 -smlen = 3233 -sm = D821BB2570D729ABD5685BAB00B2BCBD426BB5748674522FC800C318C2458D16EF59E8AF410601762204A13AF0A350C2C59240004CC12656A2BD3C69DFBE45CB016039B13A38E2B4BD01039D0000DD01EC00175E48CA634E86CB00E8B9377C9FC547F0281E2C6A010C60F9B67D38E4E79B0E7452000DB2D283AAEE122B1ABDB6CD0111292B182A1122162B8C74B500AFF2D6685D0E9FE4F524D4130198DF37BE55B59BD0CBCF6C12019146CBD4ED7D3183CAAF5DB201ABE6C5EE9AE83F5CCC5221AF0173E436B2823534C1E916832F01013D2A15F3B17043F206921CD9891C51E437094073DD279F98FD1102F87C1678238774C438F785C101017A08F3A6E991D45C14F850920D4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D - -count = 90 -seed = 0CAF47BD9AABD7D09FFAD404449BBAB2E1D48E80AC78550831A365BED8765420DBBE9A566EFDF20D4E5233D7848582E4 -mlen = 3003 -msg = E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 -pk = CEF93868E9AD725E6467EEED9110B43B00A0759CF63928F155CB7B2E7AF72970434E41A47B5A6355DCBA1B097F228B02D3F37FEF517DD94B8E95E48091DE24786E39F8208E7949E6EAADAF54344CF25C59213E01C7875BD9959FB25CA8991C03 -sk = CEF93868E9AD725E6467EEED9110B43B00A0759CF63928F155CB7B2E7AF72970434E41A47B5A6355DCBA1B097F228B02D3F37FEF517DD94B8E95E48091DE24786E39F8208E7949E6EAADAF54344CF25C59213E01C7875BD9959FB25CA8991C030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DB504F28BDD2E0F87EACF3086CA67A5E7F8D88B770C0F9A5A75FCBB07CEA342D9D1BE553471B2941B3CD368F7D360A76086BD7D5B085E9A273A632F2204EA37B2AC222000000000000000864CDB4C13F986E9E33A5F8BACEF866335E2ED4F5EA24F87471050777B28FE2ACC25E334379682B79F8937AEF9923C1B032C76670987946460787677BCEE476F916F3FFFFFFFFFFFFFF2C981F7A517F827B9E9C821375CC16B57D7F979B3EB8CD961AF956D761F565DAAF104435E75FDAA2036AB200000000000000000000000000000000000000000000000000000000000000FD11A19FF55DE439AD2258CF4CD2CE8E5B4CB9DE06E453B9D23D148EB3BC6224C31E51F547D075023BF89700000000000000000000000000000000000000000000000000000000000000BB4282E9AAD1AEEAC30F862FE7591F36393A4D9A6DC55311A670E81D72CCE94CB75EC274CC56D8FE2A84EB65C8F1A7015CE38915EC1EDC636129746AB74B9BBEFFF40B558E9249B7E2F1508262A106AC26058F34CE018D8B26C7D317F69630002A91EB87107861E839681A9D2A3EDD7FFF52963DE317484B6C16E71FF63DB798EFE5DBF4D2F75BEF537B35A9FAC68D00A2474EED830F5D6BC9355BA73CA4D2A44CCA86D78563EA0AF97FC6F0100F184188D1473C9A8E8F89D67580A73B2C8403914BB58BABB4B5D0E95B4C0FCED97ECDE6415D03464AE303E8C5F8D8771EC3D571B94811D7CD8324DFF1FB6566362C03F6248DC175E3945825F7473FC7E4D2E37599C0B7AF846BA30D6DFF2DDF32A981AE78AB3E4581E54F75F5B83AD50ED500D501F304A5CD4F1B987229B4D0BCEA73E16BFC2C1015904D25B35D902476CB468301FD6281DA25D43368A76B197E330345C3C482FE050E021CE4214244047881E6D66AF9CE2AAF7E28C404C38D5284A191CE30B8AD3D1999EB19519E6590AC03ED55A27963B8234FB659084FE382C0B2C250F40EF6247B6AFCD1A0380CF709C042A6EB650AF06CB4C48A7528D4D76702E5A9B0D7F62214E63EB6EEBE7F776D196E6623F95A0FBC5C995FB77957248AA3307863FB23CD6EB7C8E251648698F502E7ABFF941EF5B90BD2D717B75FD06B3A92CD5037B216C21EC9575D8C07618767A563615A59C8109EB7C837891FD889008CED5E7F48E34C495E893B86B000A348B650C76514FE4C30935C01D89729BC4350BAD002712E14819078E29869865203154FA9F47623FAFEC6C99665FCC31E9A42A86733B82AD0D43367D064219CE14E6BC30D81D494EA1456644FC47941A600926A4B1F097D2675AB375FB14963931B23E698F2811F3DCD3F73BFA5EEBFFA3746C56ADD8E43C9B23AE8E405D553AD00 -smlen = 3266 -sm = 7E957E1209FDF6D15033562E00B7FD3C3CE0AF59B3D1554D3601A7338E2A0FB22046E980647900818C42C98A874D1D2A86FC3B00DB0AFA0915A52DC1D8604CAD00D253EE4C252A7F4523C1B58301DFE040A3CD101C509546217601DC5E706112411A11C2BF2CF800BF084C1BA0E974D813B4203C000DFD25E830A6099DE8E39BD6005250FED5127514931BAB8D9200606670C212B4C2EF5DC9A644002D7FB6E4F10AD5FFA78A3FBC01B4F2F5F1B212140CFCF03586009926ECE1A6172310BAB17B0201B4493A217B3CE1FF0BE4BFCD0100BD7B5B46FC3C18309E2D62544096E1661A2448E1F9CAD5F5680C036D6D4C66149B5D0FEEA4EFAA011E24B6B9834A70760B5AC29D3F09E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 - -count = 91 -seed = 9564E88F336C091EAD50C893F3EAA8351FA388682F433F7A72A34731020B9C96DFCF75EF5EAE47E12684AFA51EFB49B7 -mlen = 3036 -msg = 2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 -pk = 1F1CE030FB4616A7EF48EB9C2E6180B7354C3EBFFEC0E46D4A4CE381BF4C510E164679D017BF819E2589382C0AEE9F0298D4423DBABBFAE756E16D39B66BC734C4191780B44D8896BE908F984C9CD1AF14BC71BEC42E5C9FA0453100BE3CBB03 -sk = 1F1CE030FB4616A7EF48EB9C2E6180B7354C3EBFFEC0E46D4A4CE381BF4C510E164679D017BF819E2589382C0AEE9F0298D4423DBABBFAE756E16D39B66BC734C4191780B44D8896BE908F984C9CD1AF14BC71BEC42E5C9FA0453100BE3CBB030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C64B98B44E7A523F63B13DDE6054692D54E0124A31F60CCCEDD9B506AD404A73F5FC2CFA97F4B651826EDE0104B93A324C1E5880AA05C144E8C8250D889E8AADF956E3FFFFFFFFFFFFFF77EB4F1F38F559659F14E3FC2E950F7F975D99185F347C886F120C2073748C7E151B8D35202B6348EB78FA46C5AC3BF40ABC6F03AF8277417313A49F99C156C32F02DEFFFFFFFFFFFFFF47C5A140ED0EACE634D4ACB4C5915B26DBD7C3FDCE745539FAAE4D85B9E29745DC9AE81937D83B770E16B1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A4EEDA912380AED9EB8A8DBA530D8A04087923B6953A35ED4B67694BD1C7A0509236418E1376032C0B5DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24026A7BBE004AE469E330E431EE44D32E38F3E0BF61EAF121A11D6EBBF6AE9028E9589DE4FDE187D19889FFB8094600F58E9F9E734B089FC8DDAA84F121E0C8B9775FC626C9D1AFCF56606636E897B6BE7271CA3537991C90E269725332E500501FDEFCC2F28E52120EC9D43E35F6FB5DAB268D224ED9EA70EF8980F05CE1F0D86495FA342AC82A7D081AE5A4CA2503D89B8706E530371956BE23BEE0A3FAF3641CB1B2ABEE00AFAE245575AD8FBCBF77BCEE31685FA6E1147666D4201F3A020A04250EA0F89C87361B6EB07C26E4F013867F7CC8FFEE87C268E3E0DE806F8C9B77FAFD0E29276E0E75A453476A5F013A92E70F368FEA1F9050B3A5D6DA5D8004A42EB2D3EA470726448570CB11B3610B1E4F833B3875B96C6D4C8C3F9B0A039AEC7F3D51116B29104FC988387C92E7F37D85C400E9C772A2BD7D91FE6677E6D159E7C8E7F35442690329835F6D4D0033C426A37882D0ADE1DB77CC0F787D79DDA5C0ED85D77CFF41BA236A2A1FF63FC0C2C1EA3C55A61868F35382A37CAA00F326315166D92827D8CA2032D321F2E3398591B7807E8F08B30CEA8299C20978C41CBA1497F8D6E0935066213C997401D48D25F4E04131BFA0AEB92EC33AD240CE6BBA33CE6CF4A11C84FE7D52A35C3B0B04490988EC8D418D3055D2940222001C5D8FE16CA4D86A51E4289CBE7874D2C7B09F558FB859C6ABF93630FABF91A837738EE099935B32F5C8019D90BC520026E980879C3EA11DBFFA3D9C60D5194E72D7033235AE6FAB3EA0AC7BAA6F2FE88311D698DB0343245C3D41560DD2FA019DBE372C09D8769D0F4FD7F41B42AACCAC64539B6AE296097BBCE0E7301289914CFD0E2773EC3872D39A049CCA0B0800D0F82B637D2BC03C4A74C5E7974B304C475FB33FDA8B80FF0C14BF986DE60FF4CEC91E32D19A9594BA1543A9DC024C01 -smlen = 3299 -sm = C6D69895500E51BC0B9640F20120E9F51C98EFA7818219F9ED00CC66F7EC9D0F3FEAE6EC795B01D8BBE4E43F15A7AE4A435F9C0072187257ECC040E2CB446CE501F6A061E2EF19725B52EC209E017D6CA98CA3C0353E57E1539B01C541BD62F42D425A3C636932002028BC3E9735DD6E6001D44A0008D638A374AD41DC3ADDD0EE0150EAC5FC292EDD1BD661BD98007CE8CA4DF4C27FFF9284E57C014B1C0497357711431FF0F01400AFC287AFCD5C6715DD87CBE301694B208A0ABB04DC6A8F31AB006E952A10880EE099E166AE50000079D23C1BF40748B30D101ECF08E0C9812ABB19EC577490AF2E0D02AEAAA042998C8710A7DB6A40018F546416F1226B85ED723D4F41052601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 - -count = 92 -seed = 4D0788DE958A707899D5DCC02F756A10DEA2EFE0214F5E01B3281DF4E013CA75523ECEC64723D6C8BEC0B92C4F821D8F -mlen = 3069 -msg = 9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA -pk = 588BA34D7409A807E33E1107B9F2FEF6B5E8D093FD54FF3094F7222052EC66E230EB1D5E96EF7076EDE92752C0B94103BB4DDF4A69F7F8627AF44FDD0B37F7839D0AACA199C05E7F2AA950B8C0E3FDF33061D63872BFFE53DCEFF4A88A528400 -sk = 588BA34D7409A807E33E1107B9F2FEF6B5E8D093FD54FF3094F7222052EC66E230EB1D5E96EF7076EDE92752C0B94103BB4DDF4A69F7F8627AF44FDD0B37F7839D0AACA199C05E7F2AA950B8C0E3FDF33061D63872BFFE53DCEFF4A88A5284000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DD00BB5F3355AD5852352B2E4AEC71134F40103860A21BAD5232F23BE32CC1C013384F839E3177B3B984F935949DF4D4B7D3EC7D41283DC6522064E232EFE8734E2B2700000000000000B018C8319ED43741523440DD484C562F0D778305962CA6EB1B971DA8A8EC25E5738858CBB74DD5E19A14935F59B335CD3BE932CE17D680CB744AC99D0EF77272314AE9FFFFFFFFFFFFFF7C7892B93A2D64047A1F14F1170CEC3115748F7DB979040DDFEF05F4141DF1991984A336E4D11E65F4C93E0100000000000000000000000000000000000000000000000000000000000015293A66C5973CC91C2B7EFBF12DA7541E59F1AB9A16074EE322D2656F0939BC773A103246F031953C22C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD20E368D41E3F6CC9B9119C37B5D7F7C18AF8F61AAD82870E5F849A8946ED035EA9F3BDD2433F78A60C124DA34F70903D717A353B133C7070575F9BE901F26914762EEB42C5354AF139F2AAE976DC4452D568FC4EA6F2AE84260813B176B6E039C84A60CA2DAA8266DF46F8C3B260290CDC3659060628261BF25E91411E84AD91259E0774A2E44E01908B4FC13C99E0109AACED3AF8B525F98C12DBC33FFC729D861418E7023AF0121431B9DF1CBF6754508D5F4AA3B6642688AC95CCD9B6B0309F01F42BB612DD7ABED66C811FE0FD181A0B206839115324E5DA88443DFF5EDF74F839A701917D5C4615D94E57EF60184C885D2716D4542AD241B87BDDBFAF5C7E8D053BF18F26F58140FDECDB66DEE8BC19BF21B10CBFD9EE8D3261970D30229DFA414C688FAECE6CDEAAF3433CBAE865D8CB2FAA6F4305FE42101ACCA92DAC8E27B9AFD5183D8AE7859C1CE6BB5033B59E2360CA6194EB9AB3696BFFBC208E33CAF7871AA16A055439E59823B12E95C509AA61E9B8AA6D00F400E8307EF022DA910578F5FDF942E256FA1CF18DF3330C603C75461973DF4656CD95A02C01C1A2C63F5141BC6649B2CDD589E73780345DE2A060A59BF748EA3B40BB53D3987E1E694E217F6413F01C71809C6951AB251003ABF604ABDAF3D1FFC579EB69701A0EBAAEA7B6002E207CE6CF1C8E577BE186DB07568123A36E2AFA5FD30B1C3C66B605C14DF83B79F87B4609C3B4CD900CCAEC4B08BF45EB58A1B11E4BDE76442A86224B574D79F81A82A41830082C591C2EDFDFE2561A4CF2C0A05E85FDF550326A1E7574A6CB90761C93B243425988F1F2B3C5A2F84249A609180128B8FB885308362D6040B72EE594BEA5DEF54E802EE915E28E4F33A72A4B165FD32486A9F8FD68954AFC8A0025890720B0BD6C4D0476E9CA15B6CAB2E4AD02F09B71EE001 -smlen = 3332 -sm = 8E05405F7065DFC19D9C8B7D010EEFF04865AB941DF8C6F2F901AB196F5ADCECD8F1B65A7C1F00FBDE983BCDA3939D334C464200807ACB8444DFC8C1D7140CC6002D1279A0850DF777BEC6B11E00DA7F497C3B283F8047FB3C1C00BD15C8C487B4BA927BD3AEA5003732205FE8BCEE5C8C8172D900B05B80EC14134AABE191DE8F018EC491B62896B8A97251094F00FA0FB23C81655E070A42BBE101FCBAF0B825807F20D1BD0BD000650E6899A5D6B66773A17CAB01329D5B8A3965EDF182CD4700018F76D8F89A641284CFDD5FBC00003DF3EDCE87E951E15DD20B9667FD95A9E2CB6A34AE8C2201AF0403F242EE16D2AF5E434B18646D00FDCBFF6F604F63EFF5C8EE0DD9099163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA - -count = 93 -seed = 55A9C7A0B49706090BC0702ECFC070AB060427FFC820C3FE05B499B59AEB125F2DB4787A5910B88C6F8FAF0A69BE0AE5 -mlen = 3102 -msg = 02C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 -pk = 92BCD6D82BE9FA4E61086EAED913780135F1A52E51AF1796F5D3FD030F8815B454703566AE7AF4EEAF04866B73601D0081B3557E15569F9E0F27E113435CA1FC1E5371C592E98566443A3A3B558EBB19F1327A9EFD092B7FBAFC91A97599BB01 -sk = 92BCD6D82BE9FA4E61086EAED913780135F1A52E51AF1796F5D3FD030F8815B454703566AE7AF4EEAF04866B73601D0081B3557E15569F9E0F27E113435CA1FC1E5371C592E98566443A3A3B558EBB19F1327A9EFD092B7FBAFC91A97599BB01020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085976E0535BAE30A28CE6BDE626FB548941E6FEC8AC22DD4C4229207746D0FB27EDC3F5573D117F6504E8F642C4199ADC4BC2FED36E4296427DCF76A39F0659C11DDE8FFFFFFFFFFFFFFF6894B61FBF7C5690B85A27331B91819AE7079CE90F079AADCC9598B9575B0E891BC602E64DA46AA713BAB40BC1E3A7907A7442E8D56D984B4A367E5230D3120A78DEDFFFFFFFFFFFFFFC670223CFAE1D07669707BF0C040FA5C07EE4BD4C84C116EDEF4A0BF821C9CFC9F753ED48FAE41ACA3AC61FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA550C197F1D7233FDFC99AC18134C97813ED0D7721523B4A0E0E9F7AD5BD33ED3B63F07B36D25676834DE900000000000000000000000000000000000000000000000000000000000000E6E6ED6730CC3A38119094E172CBD4009BC7BBE32CAAD49AE64BDCC826467C62FBE87634CDFECFB85853BE9CD1DC7E029444F9F9C8EF89AB76102E432B136C6F6DE58461A46214623B8E6D04BF7A2A520490A6FEFFA8BEF3436DBC5905C93701B9CA4717F76ACF234212C77C9D68E3EFCBD6913A2034D534CE9941540462561ABA02B14B42DC652CE19D04F78313EA00F6EF43A6A51CE19B6D68C4440F095783C1B90ED2E0F29EB2E54BC4C657B341BA9315A7A61802BE7F9F4FD6B6DFDD3000799764E3C3A1DDA7C2CC4D058D832561673A6848B30BBE29061914B45830FF8310AAC878BAE54031EE56D42C65737D004921C1CFDB326279FA9273375A958B998D78B56D10E0AEC8CC4103494592B2F25C53BFCD39D2D78732F7A1F6536FB0011FB2FD90EB6BCEBE10AAA59213E78E8BD670D3428A66889A2E90F01911DA1D2B655D982025E288D86D59A0B7099C5A005A4DF5E4FDF8BED149D8AF804C7AC4EE6BC2FE932D4656FE4EA1BC8B46A1177A6157B116248B6F5E1C1B3FE6944887026F9CAA7D7CE7002D4FDC2D2EB39AB6E9B85535BEBB2E077F0EEF38F677E61DA83FC62639DA88484FBE098D7DFD9D6B00344BD9248B2D44698CB8CFAA3CE2217F1B9B1FF43CB61E9393016100F7B03AD867C774BD18F86EFDF8F6C7384BE8F800D3560CCD71017E7FF019B90025FE8C3F7C0B9D2BB14EA667B1F2929585DD7D93A12D7F4DC48069D2738D8F8ECB00AF03A5F1616721EE82C6FE68C1EEB043440037EAF6F47AA440F60A6FA6ADE1795F51DC1A8CC963E8A2637F31D5935135F701B91A4223E67E93699DAF18D8D00DB5FC77D13593E69117E072128DF1F51D2A55AE3AF6103CBAAD599362A6070BA5F601118CCF01956A8443C841BE8882FDFE63C7D8512254B9A8EDD47DC51EDB142E0F23D10C9F86AA9820DDBFEC23C7990E03 -smlen = 3365 -sm = 2C51F78473FAC6FE93F6DD14017D2E6740427B1CC83D87601F015314C1A1795EBE150D018D6700D3061020E0902460124234720171197371C1A31CC85CA6434A00C349253AF6F5F7D2C6DA870000F01D90CD050AC89C70592AD1018262CA5BBF7FF8A6AFA6947F01939DD7ECF224A11817490A8400911433376968EB184C99F6B901073FCD22B364FAB053E4CC8301742A3FB18951D0DB5737BE9C0173F6C92606F2E26ACDD2DF3F0050271286306A5680DA38B699000583BE633553425F476ACD78019F6E2465A4739F8A7BCEFA090101871BBAEB596AEE7DA4DD13F53C7822A887A0C64D89A10CBE0E1601E24D3D3E7BF7E69B4CDE216201D53A2D65BD6E05000E545649F30002C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 - -count = 94 -seed = CEECCCD3F7BB922650E3F6E8F20C47AF17C1C1053EA8FE08226F167D67C3B0781BD774C4C7AAD23C6AB0B9F3E3F96F97 -mlen = 3135 -msg = E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 -pk = 11A3A94CF121C765F3AB61BDAF9E53C73F68E613C8A3358103B29195072AB613FA267E430BF89E8F79CBE007B62EC30328DEED5A458E2154E608C45B37E58650C2A340A13764EEAEBA0AE39FC0B1A536FEA28959ED0F6B40A938ECA5693C3201 -sk = 11A3A94CF121C765F3AB61BDAF9E53C73F68E613C8A3358103B29195072AB613FA267E430BF89E8F79CBE007B62EC30328DEED5A458E2154E608C45B37E58650C2A340A13764EEAEBA0AE39FC0B1A536FEA28959ED0F6B40A938ECA5693C3201020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088F6CBDABB4A0B8B6AE25C302CCFC9B0ACD0491DD8CDF53FF862E6BE22AED96A7CB1BD7D6ACC33D342CA31EA7474D7D49BB35AEA71E1C8DCDF67E39E3E7E93C46A653500000000000000A1D84EC43B89004EB639478B138DC1381659C48D92AFD924B835412B1F6BBB76B4FEF45238F852F62122597596F3A6905336F522502757D8D5156C3C45EB1A4120E0DEFFFFFFFFFFFFFF99879BA863BF51E2F80FA0F5BDFF47583BD29863B0F367B7FB9B161F03A8B22CC82C00F68EF31B5325EE1F000000000000000000000000000000000000000000000000000000000000007C67AD516FDA68AF8B3DBCF5FD66B499DDC4FA42698F345B0FFE8FB111ECDE2B143CB9CA4DEA9ECE72130A00000000000000000000000000000000000000000000000000000000000000CFEDD5903300EBF0DC349651F961A4422327D9997D9388B2B0650D76362730E1C8339CA9AA530BD7A1144C13887C34024BC85092AC8A832831B0B6DCB0C5BADB11FDC7DA4F72C7B733110D5FF3D7D9577569980387A1A027B1DF980A1307CE0054143A628A2E0F6253074B0196C32D7973EFA1B3E6F047B327B7477CA5AAA70A1643DF3DDC0147F0C13A666ABD1C000187C8B72EBC8092CFA7D85E0775B1BFDBE2B74FA6572580A611FE005760663C8E9DCEC1714A4B6F95A46A8E17589123017DB8532C7FD99EE4EBC5C93492AAD1BB931909FC3EC436CAC977A9BA3FEDF38809BDE2AFDA140D8A292135D11C149003F357492C1A457BCD75318BEF36C8ECA1A56C8862067A5E5ECDE71DD13FE8A6CE437C708B8F5B25CB4D9205F43CB1D202F571316EA31063D09B0C5DEF55A3B46988313E11318593626136ED430BED4DA04817CB2488FAAA61C51AB557C8933E00F5AE69C3720F3D4EAD8D1D9965D186E95BC2817B1439A7D4EB7DFFC9A9106A4702B14774897A1E01665EBEA9BE0FEF0298B397E6DD32F444043226BFB61E58ACD968AD0DFB9FC885459E43BD0C67205768D82DB9C56BC289A7EFE71C76337302C2D8CA14AE1F6CF53BBDBA502F71C4253082A1B2845DB4DA8C3D8D75CBF3540183FAAB2E31131FB08AC30E2EA9A01602E1661C2887FF59E30C81C83224092B40137BDA11676A686E08ADA66161A77AABF56A9B69A680BAA3BF56437784ECB801C2C02424B08880F0FC89C378C278A835551058C8CDE4A17C8254938AC04C0401815E514FC010CB89654797611531E501EF7E27048D2262A8F0BC164DD69E5A437F8B006A019AFC8A76A244EF354FCE9D0E7DC5509DF53CA8D1C9BEBF4AB542003A089E096623C7F69FFA08C20F012B7E0D380A609B8F556A7536F261075BE4F37287BDFB917D3BE39FF5C3CE2D810E00 -smlen = 3398 -sm = 790561E5D9218032A6B565FB00F0877BC7AA6F45F09DDA4279019610C9A0AA69D3DE6C22537B0032B87D788BE3F16A9880ABF50083F9AF8ADB727273F1C11682018D2B39CDD04B4D3A6E1CB8F10189A7E06D91C8092EFFD54589008F4B0BE599956559ED81461B00784F45905A0D11485ABBF5DA01828A75F2F0915DA03193841A00805CB70CEF3B6E0828688D7D000E7CEB528D413A819EAF1EA9010DD5BEB338CC214E8E9996D700E2916DC38D73B4C3E857380A002B5D17E53DBACC4FF721F83E000ECA7A632E4A5EB4678946A600019599AC91D357DD96880E5C3513074D28E70BE551D0A4DA3C951503B4AC5F12CF164FE0661C64A0003EF66E6C8A59199233F930918901E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 - -count = 95 -seed = 2489C04BA57D149A60F446670C13C29998B52F3BAD548A751D7134B694DB25ABFA034FB4BA45E105AE27D575CBD02B99 -mlen = 3168 -msg = 1F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 -pk = 7D2B9922C7E1C05D88B3DCDF9DCD04992AD30EA67DED8BA1F865C17BB6033AF4681E1D81A5B0A7D56B4C74EF8410E90006EBAA2567859AAA535BBE7398C2A1F62CA4C880682307E070437B3138068560EAB720A391A1F0D1425605DECB95B701 -sk = 7D2B9922C7E1C05D88B3DCDF9DCD04992AD30EA67DED8BA1F865C17BB6033AF4681E1D81A5B0A7D56B4C74EF8410E90006EBAA2567859AAA535BBE7398C2A1F62CA4C880682307E070437B3138068560EAB720A391A1F0D1425605DECB95B7010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B4BDD512517C7695FF634CAE250C308E4DBF39B3DEC9A07BEF6F5D8389FC536F5367E9651E31DD26A6AA77BDED05D69D26F3F444A9A8FFFDD24265B46448C8EB833EF4FFFFFFFFFFFFFF85BA3CEBDD74A4F1A00C0E506CC8C05824D3DD49150C74D48F014B704887A116A49C6AF86C12B4A156D789AF31BBC67FB1ACC2FA3A49FC9FFB228195A7238657002C1500000000000000FB72D341214E20EF087ADEE23E934C96D70B79AACDC05843B2E5A204D9A6F6DD9A450EB6C894869823FB220000000000000000000000000000000000000000000000000000000000000094F36E280AF80ACF4ED01FC5184BB4F58F45DEC85FEF33D649D781A7F9BA391A652C14AB256184FBF4888601000000000000000000000000000000000000000000000000000000000000F2BCC8904AE91B65ADF88955B53A01027D273D4BE042CCB6B7C3FDA468F28A64516E2E3C2966B85947A6F26FD424BC02711FE5CE542307950C210B0A207B8B09C5C484A959AB2158087E02FCF3FFA99CCE73F4CF1C9C0B33395699A0B6073502C0062E4DEA7E8D14BBCD16405825DC6C7C8110DFB6EA111BC2EED630BD7D126407C111E8A34DC5CB7552C8C4E21A720311043E041D79B08D308D2A5FB73455C037913E11B64C83E3C01444445D4C823FA75D5081DACBCDA4008F1BF55D1219033CDA89F50AE8B48CE5B8EE006D00EAE8B09B81BD3D964CA8E005AF931006D05BC0A6CDCDD3832662FADA986585B41E00200F63D95E0C74A24058F26793A4351ED399EEBC4D2989C2411EDDCCC4BF40611DD7404D5DEC14F24478CC0F76DED402F33440A786C460C0D92963D521AB03864384B58001349B20B5AD6814E074EF1190EC88C5236174B8E36480B2192C50000A37D93CB43EF3ADD7C0E3100AFA4467BE0C3122454C1C4B0645AFDCABEAEB0C836279E332F393CAE027051E6798DE007A53F502E6C54715555B27FA06B115938DCF2B589582CA61C1512FC3BE504321DD992D6CA83680E14C8F5A4DC8794A03B3E73203E765E972CE3333DF06B74111DEFC9B7F16D5C0F46BDCF047B22B487F7CC4566845690E27BC40E9C06F92CA035375E4CDD6DDDFE20042440966E8B6274CDD8439542D1730A35F29A6B2EF9EF1D48D5CEF2635C9EBD3AE350AAF672F03EBECA7319ED388F4EC205494855CBE047D9DBADA97DC571260F38FD974E1CE72A4A4F6479016C7DA046817635CE2A40150D16171D09BBA28883286F8AE16F1A7A24C56A86B5A20F2825960466E8D96ECBBDBBBE813FD3E5ADE1A5A70EF4F9D028B171FDD46D2FE10F81EC206A95D4E4A3DDE9B072E16368831A6CD7C1C226A3CC652F86930B90026CCBE0C2786062502 -smlen = 3431 -sm = 1E77C78F840AEB7D5C10D72201AF6ED97EAB2B12F64FABEC2801DD181FBF75230ADCAE3B2F4D01D5AB6AABD2CB6D519389C5E2011179C50C55EAC64A4E846DE900479E1F246C7C34802BE48AEE0151E3A829E828E5FE1159EC7E009DE0B7B14F91805F1C71A33100F7B75D0B554C11BD9F19861C00B572B4981ECBE54EB2C9408F01AB13CB0EB060F7E74329057301791862AC803884B77883D4D3008CDDFBF2CC2091E1F122EA39007AE7B905E7CD33C3329F910A008DC50B49E17E13FA83CD209401B460B4A8DE03EE47D04872840001DBD52F9BFCE76AB9FBC59ABDA3F663C19025D3650E4863DCD9070365F72BC7D4D8FEA3D52D726E01F3D41ECABE4A44BE0BBF3A6372061F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 - -count = 96 -seed = 26CF860726D4DFA38AE07399838BB336F1BEE59E9F23AE4C81E73D49964997EF21CB5F5412F9A70A1EC39FC6228C36CA -mlen = 3201 -msg = DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 -pk = FD540FE437AE8C993BFDF90708C10196D98E2DAE97E3F6038811E958166C56103DC86A27DEF6FC7CC1B87F4391CCBA033D25BB00064D3B908C1695C04DF83928BF575A24DB8952970625E06A6428953020636E385CDFC19A16F5BA7FFB8F7D01 -sk = FD540FE437AE8C993BFDF90708C10196D98E2DAE97E3F6038811E958166C56103DC86A27DEF6FC7CC1B87F4391CCBA033D25BB00064D3B908C1695C04DF83928BF575A24DB8952970625E06A6428953020636E385CDFC19A16F5BA7FFB8F7D0102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002DF300967FDB4762BD34863315B53D2AB1B518F423761B52818328D5AE0B4064CD9C2BDDBE6CC999A28C5A32DE6BF4ADB2330E80BF3DA48C41B847950AC95CC1A02122000000000000009E739ED3FFAA9B9F0F48842AC5F1646FA09572D68C7068BCCAAB4CAA9F4D0A5C256E038A157EF5B1EDE8FD0E9D99ABB97BFD5D09F4665B6074244FFD871F691D351809000000000000001A9B9F3177EF9E2E4E93705B2CE8E608294D21BFA7259B34BA38F1CBBDAF8BA5A901787FB6B2A52664EE5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF230C3190B3F453787AC0DF952F4DC29E0668A20C9EC102A9EF6D63C2197055366433A778755E23F27F496401000000000000000000000000000000000000000000000000000000000000DDF3799A70C09B15E67A7FE4BD405BCF5E12E1AD9B20AF97279A1EF0AA1D2CF54DDAC2A61F787E5A3A15B044C78310002850441F92992D3C52D595EDF4B48918ABE07A3E34B9280ED5854F2DE932B2BF109424BEDFB405D49D5939CDC4DA2501FE428D90BC079434DA8C81862AEF7DC5427B78AD0ABBFA0D9D65BE7172658105ACD1827D987F1083F7D4FCBF04573B01ED46E22441F56202AE17AEAD0F2B79287485F24C8FF61C2F1FF76CDB29DD0DD1F0191598B8190F49379B4B0E20B83C026CC194245E7D1DDEFF0D261252E1A534A4BABB6F949FEDCDDA530ABCACC164C3E1B64DF9F0C40AE1C2B338E064180701441E6D92DE8F9EBF5AE22C524F5317B00F6B1BAB969A909F6AD7F915010B02AC9B0B02DF07F20574949EDA307FEC4C026721F87CC724824113073E0079963306B4C0F933278D82A146A14FC9919F300E5AD9BC93CE0BD3345FCA44895E5F110193BB5694AA588F35C892184EFBB608A1E0BFE8A5D3C62682223757B88D14A7CE98D253E64EFA786179A75188C6E21A00812B859FE02B6B7A2651C838136386F551305027CCA5E048F9C197FDB5B13237FB06343D1E1A732285D1D9CA107E3E014DAF4F7C2CD22710FCDC4264974B75EAEFC5931F04AE58C0AC9C579A6D843A78703436C06518B61283252DC5CF54AF01425D01A1B19C7A5525D608CCFEFD3DD539F548F6140EC42CFBEF4FAF9EF6D2C137DF80FADC9AA4228A83FF4818947402CAF7F6FE28CFC80CEF27E2EDEA512F6DB68280A454AFD22E5D6EDC43572E30DBC8B59445413818A15F995C1DCC15990305906A6CF370335977EECF48BEB631FB305A1ECA2CD9F9597D7B9D21D50B6DA4A779BD26029EF7136DB548A8F0FE180396808F7A885A2F55D110BDF51C38912F0600BCC9251D69BFD1226F06F6FE2AEA81745FA93C7BFD9FA3151B58B6FC4903 -smlen = 3464 -sm = 86F113FF242E05E99BB2FC8C01951653326414A9527360837401A2017919C629DFF8D53E414801A5819C463337D84BABD7F753000CF0EE8C1446964FD177DF8001D226B58ACDF4FCD21033F9D7011B0557FDBBFC760CB1B305B401E2D2DE48C729B85CB762541800EE92C9BA9D65AA900B57DBAD0068DF881572EF9AE5C31CFCF300361E0F0B7BEF32F3A0E7442E006BE64F1EB84392FC2DEA582301790286EABD489B93546F901001E475909AAB741A4F34ABA9FB011FEDE26290469EF3E738EDB100A5D161F902AA4944247A4CA400004F374481DAF87FF1A30FDFCD91375EBD30B7D55B0E1A41E3020502AED4AD90569DAB536600E19E011136C5B3D16405B99D17B23CE60CDE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 - -count = 97 -seed = 13F1F446D9AA5AC853278BF74C9E6447A6CE4294C037867F43DF554370EE261D05C7260EEBF46D6694D0850B8343FBE5 -mlen = 3234 -msg = 525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B -pk = D0CB95D90BFC82DDCBF726833F893DE1EE1BCFBEBE8335B80CDE0A0EA01489028C99088CA993F63F9B8928AED1A52801E48598551702D76016831B80052D52F040537D1C8BA86CAB0843D2E77E461C151286AF800409505692384A132952BE02 -sk = D0CB95D90BFC82DDCBF726833F893DE1EE1BCFBEBE8335B80CDE0A0EA01489028C99088CA993F63F9B8928AED1A52801E48598551702D76016831B80052D52F040537D1C8BA86CAB0843D2E77E461C151286AF800409505692384A132952BE020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D3D84D1C18B6C302653F9B595B3B105F699154FBC0C80C60D01E49687B4C611E2EBD6AD65206240B724202499A10EDBA9B1443DA92F9B89EEA64D4F20445FB23FC3F1700000000000000144C976F2B27DB4F1D08909DCBD2116728E09432B62F69D58263284CA073E6C87F44CCA17472B1FE07E6C422807964CF39854F3B05A2C96F0CD96860E27FBC89604D0400000000000000B8105F6412C1DED5E225727CC3BDBB329A38D948AAB66468056725B05CC1F7E2C8BAEE2CAADFC3A3C7F340010000000000000000000000000000000000000000000000000000000000002B9E99D3703826ADAFFCF02EC6F1C8349B46F9CD16E62A82E93DDA1FAB77651205E2C53EE5215BA6E577CA00000000000000000000000000000000000000000000000000000000000000A9EB86809CAF934B403895C8AEC933EED84F38F6528AFFD369DDFF99B5419B4C29E22E7D3BA22896035ADBC5809A4103EECC4107553075383A459225F81F6D5C278AF0414F6BF1E87BFA37CCBD57DAF0369EFF1BBBC412B80258D62D6A4B5803F9DD0EFA57841D05EB176BD0F8EDEA383A47DBCFF5B383AB77855E6703A6BBF2525FB3E9DD806E6F023CFB9208CED10052A9B590BC99D163382C7C8FFF75CE53271F593D42E4A8EC8EEB0DB494B2E2445137D0306BBF1E143D89B75C0BD2450313C0F4835A6B27CA7F86059FC16066C4B8C14CE68AC5B0451AC99F5E29DD486F5E8602ECF3D7D0EB1FBD46BFE22260017293F0B5967EADB40E309D2E5004A73D4FE0FA0C23E0F1C80B9B5FF6094C99E9F398F39BCF95AFC8B545CAA4FB837503FE58E0BC9E6F84E1FFFCFA5383AFD3D63D702CAFCA5BC37B15B83699097854EA56BCCC42012C933D177F60768A8239008FFA124987ADB7DBA40621C7E4560C4AE12923796005AF487A8291932276656F6A57951B63D46414BA596743E671BE035565757D52FF7263F240BF09BAB62FE3F2E8059E8F117AABF20D2753E8829E2ED2873E0CCB374DAAF61FF2BDD2B0E40221BE9E2E411F889C7E4DD7B3EAB27838F01E1AEC6FE2C30C92937B91929DA9DE76D11D20D2570C7F79EE1EB509079E02E25C52F0772D86441EBD9EAE22A84274CE893A682E1BB01E015F7AC8C527FD5724250BD6A438AAC20F554D0F3B0899035B8717F87FEE848BC4DD77C5C63CF280DDBEC17963C9965B3CD32E2CE7B2C4CB6D845A5B3DF40B1A67A0D9AA2A6A1F002950F57698FD5A0694BA43EC0BC656E70153C1661BB8AE5EFC9E5B28FD5FE437EFF13B18D02AE7576B6D150F0E900300E489D10A90675EFC4E1D5D72C39A2A553E74CE81B445D4A36DAFACE9CF080FDB65985EBC4B919B9A6906AC8D89EC7F03 -smlen = 3497 -sm = DC524CEB8022C804D9BE8E9F00621DB24A48AF34B10FF763C300808CD7133D52A3B9C4D1B7230162D5FC7E49A61D09ED9F5B4B0189764C902B30D4CB8D4CA3CD01A9CD1D534DD55EC81D5A3AFB0067FCD692C31FF7B397E9EF0100A3D3C373785C4D8D9FC413BA01B35C750D3547C50918E249E9018B15EBCE279CF588335DDE3E0178736AA2F6952EED0B610ECF00929D66D20E4E37AE514118030194A700CACCC06A88B902674D015A1B73918C436D363438FC31007D67D1CF8EEF74BA3CB74E1C0159FF86F72E3FAE861CC4A1E60100FD9CF4611B265B1C2F409FD79212623D8AF13452E51CAF7AD80A01358525D7F9E7007FD4F42F9001B29C831014021914EBB0348D760B525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B - -count = 98 -seed = 6F6E47E8336ADEE99B2C52CF2DC8D461E0A54C3DF2F08199A9F0816AF8455381054CE47A7766726D3AFC2E2F2BEAF8E8 -mlen = 3267 -msg = 00769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 -pk = 570B02C7931242B5754862B71EC1DE5648958C0F83FA2858A233FD3F1E0AAB815BA192E5BF332EB7248F5BF5F5197800E93939EEB2061AA0926F17CFC7D79567E6E96FC4982433B3E69A582700DEBD089C2E7C6A0B1BF3DBB11911116F7FE001 -sk = 570B02C7931242B5754862B71EC1DE5648958C0F83FA2858A233FD3F1E0AAB815BA192E5BF332EB7248F5BF5F5197800E93939EEB2061AA0926F17CFC7D79567E6E96FC4982433B3E69A582700DEBD089C2E7C6A0B1BF3DBB11911116F7FE00102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003652D8BC767C871F6C5EB3A89DB0AFCF5978C27EB5CE5AEDECB4021DF42AEB316AB4A3726993972B03B12D2EAE92FCF9E9A4F920D58D4AEA827B89E651B6D9E421E318000000000000005518BD5451A5B5E2E58177C164E71157E4883C88BACA906996B2E562A18BCBA33337AD65722406BA1A21D7A5FE69D1A77884E399B0ED298ECDCD1694CD7670C9E1DED7FFFFFFFFFFFFFF4BFC4007383CDA23F7240358C4A6A9CC5E87319BBD63944EAA70B3C2D17549E9972F133C45296AE8892E3100000000000000000000000000000000000000000000000000000000000000DA86D7F33CA200CD9B639F73A432853C76E25B5516BD6BE006EE58C1D0E6397D538372692C824C02346CA700000000000000000000000000000000000000000000000000000000000000A8501D2283BF92407175E9A4F4E82FE76F19C3B9CA5D9433B14C3EDD8BFE57D4D361E2D5741795A6329BE8A47AD34B0008FCA6E5BB3C567A8CCA81528E66FF57BC36C198B0C8E7E1C4972F3FAEE4580EDF3F45459E76F4859788963D1BCC8200D9C7377B59DFBBEE710DEAA530EB6981113C92A69DDC8A4909AE8C0F73B26E9D5548C398F13B3169EB336CEA30B06901FAEA8306746E66755909B4AC4CFF82904E236258F7569D8D86D0D7626F50C7015BD3BF9D3A933365FF000965D1846E030C3CA5AB04E9D69BAC38969A12CE6E91D10AF9B9D939D7E1E21D01601B897CBC58EE286CD3EB1BD7AF91662DC3EF0801E18C42881BB2262953DF8CBABB11876367DB5628D75FBA5D3F6DE05334E06595A596FAC71ACB7FF8AB956799A2B79702C4ABF395C6B092C2657F408A21DA013BFAEFF5D4E96E145388CEEA7C90D5F19FEF4769187986D5D35066C74025F652034DE57E9A509D70FD36F24D1CF7A4CEA3C18BD7DDF6772B312B713FC3EBF53740AE5E10B1A4BBE25665872BDA4D14EC025D155C2A79F82FEE1B4CBDCAA2FF349CBBAE85A695AF7180D9FD80D3067CB654A0F329CE96073A79F507D0CA8CDB1A0058FAAB92890EC5E4283F30137AE8E65F1953535807C654004DBEBF157EE9BA232171101DF2F70B88BE85C3A298C41002E329EBEA9D4D3EFB17DA8166B9B3D9B9B0E0E877AFE1FEDE76338357D064AD4A6ED3929C14A9E84D8583B9DD5B6E5E00FA6A8EEBD89BAE23D017C762233FF5C7D84107085E7877859BE16E9C6CBB25B22825269AF9B3B3AACD03DC1097866302A5E1E6307FD63AB30B36C83306647B3EC7A1383CA205B180DCC0310D6A62EAB5B313634EA1CCB4E5CF05F25509B83E0036CB05E25D58C59E99C0623315E800C922231964428EBF21F7F9296A395AFB4069371C908B0CCD3305E290F2B2D9FC01 -smlen = 3530 -sm = 86A4621E13DC4B34D539F12E0075FA6624C14A8D98642F040600A15AE5B57DCB1357C822612A01C64D7AAEA931EDCDB7A4F5F00053468A28A4DBF3EE3333393601FDDE829624EA10E98971C7BC01DB91813BDF6018A9C5CB13200024CAD9FA2B6C0BFA7987431001F207823712B27051B5182FC501585750AE36F418005DFBF85F009D0B604BBFA5FC6E78C247D7013B3464BC7EAEFC8E5998BCE900F18D2B0D07ADF32C243CF839003E3B2B80D13E0ADA21415B6300317C84E97BD36A08CD99CE8800337F530853007ACE84687E6B0101C57D803C04F4CB65914624929C844113A5E021AEA677A114610E024C9A2C4E0113E9165D657E820014B403AB13612B036794FE571C0700769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 - -count = 99 -seed = CB2E6226615393FC3BD4AB3A412AAA030AAD40E8648EE6B56D2C1591D8B97915D88F2D22F7221377B4B04CF2AE9ECC4E -mlen = 3300 -msg = D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C -pk = D6CC4AE84109C01AC07E756CB0CE40F7A26A9788F0350B2B2AC1F1B8F7CE1F05EACCD892C8CDF5CB57C64CBD6816AF03BD084EF6B470746172E119244B7AEB08CA9077E182C66777478ED464B2194C769A5EC19D8C53C216BA540AFFFC4DEB02 -sk = D6CC4AE84109C01AC07E756CB0CE40F7A26A9788F0350B2B2AC1F1B8F7CE1F05EACCD892C8CDF5CB57C64CBD6816AF03BD084EF6B470746172E119244B7AEB08CA9077E182C66777478ED464B2194C769A5EC19D8C53C216BA540AFFFC4DEB020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B053C735464ECE9BD2D81C84493F100FDC28D0E80E4E432587D618076E141B8B4D52620AB5203B27E0F9ABE2FBEA952624EEB0092152CDB486D30447BC42D017F0780F00000000000000B52F964C9C3C64E758CB6E7D128A05E47153B5148E344E62124E6E8CF7CA70F20F6791D8418ECB2C6CC4DECD6A5FB034F8D7F3CD3ED9F6D3142CEF49B388189855C3C3FFFFFFFFFFFFFF6BBDFE03BB5488281BB4AA5473719302EB2EF5FD3A09C855225FCBF103ED3F8E5C60A3CB7C70BB89545A2400000000000000000000000000000000000000000000000000000000000000480DC502D058531BF7F4CEBB9AD6DD4C4E7D47609B404F9C658E56F0A42548552C7C746C54839918E121EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E15DD28031CDBBC50DC7CE92C33D4F7F27AB8900E9F813488DF79DBD0B130800FF839F087A717265E9A60412CECB0029FD638CD381F0B62C47C627CA3320620868907061C37ED54232455030C250B622C61E9E387E9DB5B9E561D7CB6E28203D12ECDC5ADDD37909A50DFEE31423DEC726BFA03D49AE6618F202DC3E0598CC09FBF34AA21B6F517D0FF81144E077502AD752BBD433070DFC66A275737100DD5DE0CE5F63DB6CBF684FCFEA592524FE785017F5F5C5546E539EBB6E998602303E3CB28FD8B61A55383C4E3A43BBB5E9575AEBFB6EA14DDDABFAC61D332F221F7195FB608418F98EAB4CC216576533E02182194E4DBF21EF5D4A3F8E23D387DEFCE0CF6F65D0749641030B0E52070286DE91D92F3BD5233ABABAC217F780077039ABC0204E2EE881D3C55055343B45764C6E1790A989184DE4041E279F9D65DBEDDAB3353374C771D4180C8F8123AC00354E84D0DBBC5E23762EF6ADB50121A405A89B463FDBA203F014DB997621D93AD1A599B160AD92624A5B8EE799AA772003A2EB3D53A65C27CCB6DF875C0A66B19E63C923BA74A255D0ED24A19254482DFBC29117119926F4AAC8098766F5A7A010B262094E89288C3F06C72199A6497D0CEBE834D1985C1120C19FED9B5A8DBD2425B0F93D28FBC2C8E65F2213F3064029AA76990C6BE6AE2C77270F62C8DDFBA46254F293598B98349D3028167314BDDD69FBFD71D187C21058A5D74AFA1E9017845D004A711E763E7436E4E5C6EC1171F118C990F9524DB10DFC84DBBEB72D3842802C7340773CF8335A84DCC1BB903B97E09C53578FFCD88AFC7990C7EE3620C36707CCCA75E94BB79BA399F92E7844547D81818389F33AD0590AEE347A30271BFE09A44E1B9898A1ECF2245E8FF2D95B2842AC5BB688B1C07CD0F0497E98A4F660954453B69324DCDBA3FD04E9301 -smlen = 3563 -sm = E1607DBA0704212475339C4E01BDC42070F2213C5EEBBAC17900B546BC45E3098F859F76F80300B3760953D3CFE4F26E6C2BF0015F09DDE083021A63959319DD00593783F2F0EE9A5085FDB50301511FF9870C20ED143DE2E0000171F31C8E2E0D9F2ECA0057AE01A18C45114260DC30EF195A6B01920D75F80CC0281F63A040C101229985D905F7AD03AE3030E20015E7D5F3745F22B8C0A522BB00FA1B868F1C7F9CEB6A5B20CE01D5CFDCE7D8F5E1378B9D3BE401B8BDE4EA6EEFDC8D1A64F46700CD0DD2E44FD6897FF57C0ED2000177072C543790E11E66DCA9E0678E3F47702C6EB67B8C0A2B3C18029AB77EFB8B24B171D4346DD101D1B9E539DCE8C79E34861761B006D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C - diff --git a/KAT/PQCsignKAT_1509_lvl5.rsp b/KAT/PQCsignKAT_1509_lvl5.rsp deleted file mode 100644 index 1285f7f..0000000 --- a/KAT/PQCsignKAT_1509_lvl5.rsp +++ /dev/null @@ -1,902 +0,0 @@ -# lvl5 - -count = 0 -seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 -mlen = 33 -msg = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 -pk = 6A9302B51F65AC67C574A05E9598604D95AA6E3C61B93CBA98EEFE808905652D43933DC0ECEF7BE267373EB1AC61D4A91138D235F7BA19DD12E55F48D6FE1E000AACB90AB4FFC3D90D793F2A1291DC638F8028E31F7DA9FE497671DB2DBAC789486A61C94BCBE9A8DDD78670955CFC3A104D21411889125A9668591B16D40400 -sk = 6A9302B51F65AC67C574A05E9598604D95AA6E3C61B93CBA98EEFE808905652D43933DC0ECEF7BE267373EB1AC61D4A91138D235F7BA19DD12E55F48D6FE1E000AACB90AB4FFC3D90D793F2A1291DC638F8028E31F7DA9FE497671DB2DBAC789486A61C94BCBE9A8DDD78670955CFC3A104D21411889125A9668591B16D40400020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001CCB52B5612556F92A5E3D5DBF4DF33EA4B3785A6AA6F7DAF79F5C5FC863275D2FBCFE4A88323B0F24F8480C938FA7DD403FDA74F7864F3A3EE6F787051278B5FD7E2EF1A9C4D64C8B5F8A9A99096A1EF168326CE8E11221440500000000000000C339A9C83EB96D9CC2D77AE833B301267C3E8E592C1965923584F95004952E69D634305E4F50CE7FBD89E49318986B0F1FA1DBBAE17C59222987008A1F679427DA645BFCE9006C6815E19038E6103B8113C2587DD421153291E8FFFFFFFFFFFFFFDBE8B47EF04B4E0C6064914B858DAC4756AA2C89D628FD56AA84DDBBDD33B7A8485EAA436B201AFC1B9F8AEBDE42D3D89620B03DC4308191ED41000000000000000000000000000000000000000000000000000000000000000000000000000000989FA7FACEC98AC6FB9E4E6A3B49C44EB82929615CBA18D3EF3351E0DA720ECB376EE14A5E8688B5765E241DD1C08AC7608DCA19FBB26B589C42020000000000000000000000000000000000000000000000000000000000000000000000000000A78B0BD3AE6DBE9479687E496A2F8152791DFD834EE259EA6AE946FE372AD282A4CACF7B2213BC3D861D578E89E415FDF072420229472945F2036D0723E42300667E8AA1D76A14205AAA1D6218CC6CD6775092FB1366804284C115571EAD088EABC53FA7A805901F979D717F0DD8F3145BCBD1712DF5039EB4ED56CDBD53040045FC83049C31B1346A7FA54B2D8200E095AA80892FB9A397A6E21BCD3C6621331B7E560BA46F25B0B355697FF19902F1B6A19C3CC30E583A2115FB5B1CBC05009AB6215926F090695A9D14B0CC49538249CEF98A79471BA41DA045CAD27C88C8FD132516375FAFAD9113761175F50FA25E1A1C473CD33AC843268C515E25200011701B050A201A78629D4343BE8574326758072CBADA1714A21794502AE7846AF73F1C6BD7618189F68EBE5C602E4467DD19A77513019938103A9630BC0A17001EBA7417CC5E4FAC4A5DBD52AC5A2263BB5FF55FE2DA2F4E6DC4B3E924469F334563B24C5FF0C5207A57A6F26988469B09D4BD7583A3B13695B79ACC75DE0900C616AAC1532A88D961A17029E8D51EB66A6431411BA3836FF7752775F4CEB141AA990EDDA2CC8430165D27216A406248AA946A17DF8506DE49C4F61556D221007952C24E3FAC50CD5904366B4B6BA57E17C5F1CA5E313750CE091DF16BEE1C3CA5998BE1BD26E2687938312BCCD301FBA2716EB931715365199AA0E073B0040085F5A351DE09C6E474F31A90BB35E82AD3CB802C8630D874E0709DD663229CC66ECA497E332B56ABAA96B1D70264FFF1EC0AF6691E600BB61F756E78E0760D000E0E3604047C33898FC392EF550330F64C40085796EB6E8C942FDFBEC1EB867E4BCB3D65F792C4E50223BB3F55CE819AEDA97DC483B014A22EE5C76DA4B8130084AB87D6FFC59AA07A388EA4D0F8619DD1218AF2C3DDA9BF2F0C7047318B648EF0801C425D476CF3B57FE7D65D945DA1B44FC1E314C9FF1C429D643E2F23100057F112B3F5EC140F7D2E15086E81D08A1BD9956CCEEC69A4365DAF0A63A68077B4ECD911C0056510B4B2BC92459E77CF7DDD6322C0A91282AF309A1BE0E70E00A8D42294173634D069841408EE4C5C3B35BEE512BC56CF7C418CFF8617C84639B03D57D029C3E8D617CF198246E0F513DC5E667D9BCC90F20F9FB72141CC0C0090F24BD2A900D25D9013A370191FA88D18A13A90D1344688D3ABE45DE6A6C0647F92DE0EF04346000264A5463454F659CC41D8427823363726959A96D5911500 -smlen = 368 -sm = D33BF0F083FF80C0021EBB85F0AA034D1A5F00FDE6B7502C9B500015AD7D752B3E47D24A4501D4AC850BB43CA4A985766D48569DD2681C510009F573E2D46A8589E6069509799D16C2A4F101EE260B7BE55D111F7EA70875A91D05C48B130075E46177991D746C20C2FB27F899A9D4045A0164C7682B465F4A7B53ADF1F1F4BC919EF03E006254CCF41B5F6D678E17652CD63EA6C183F301BC58FC44C24A70799F3AFFF2F62970BA7E6F01D05A2A8583685B7CD7556E46C38993361EA20191787E26078105C0BD3B5409FFDA684240140197228958A0750009D5482159A45358594FFF01E92C17D5F647B3E270A3CD06CB0ECD2B53180086AEFA2B4541DADF7650D11745554B5EA22800011B9EFDCEAB9143F9F6279E01FF5417A47666857B9859D7316404C024BF268A880803415B4797E969088ED5B3465309BDA6DCBC5F007ED0A32BA43AFAB051472F3FF07903D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 - -count = 1 -seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 -mlen = 66 -msg = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 -pk = E10EC5470B88AB5C5D7778F980915BD43B877F30E021D8B2EB1EF82AC6E21A3270754D38680390AC7E1B2DE032C6697A4D704A1D5190BBBBA1DDCB0D82B822001CFED0BA7E97F163E52E95F49EC5BEDCAC5EC50CB27246753C86CA7B2C04D5A1A6E02ED57E61D48F7AF6937E2A131571D966217854EDCDC078C5E80ACCC00E00 -sk = E10EC5470B88AB5C5D7778F980915BD43B877F30E021D8B2EB1EF82AC6E21A3270754D38680390AC7E1B2DE032C6697A4D704A1D5190BBBBA1DDCB0D82B822001CFED0BA7E97F163E52E95F49EC5BEDCAC5EC50CB27246753C86CA7B2C04D5A1A6E02ED57E61D48F7AF6937E2A131571D966217854EDCDC078C5E80ACCC00E0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D0B13ECE8A8C4497F6062FDA312A8B6AD75F8F6506410F7F5E57E35895EE3387869F8F61A87B0E35A78420E56ECA1AA0F26A2FB251BC9638F39BE9320084D436EECA312C54A4ACFED7E96945A7507AFE2A5071DB48D0F277560B00000000000000357FDD497442CC58B3ED20B039CD160D257C8AC66B5B2171E8CF622C05E6A8D76C8B23C4909C3695CC9655C89002677F93B3F5DA8969D0099F9AFB2A78BCF9087B1A1B53138272A0A1B25E4F4EE2F591986705E6F862688300F4FFFFFFFFFFFFFFD38B40300380072289761FD52303C8079C9F45BC2F269704E1460AEE330669908DCF8121B3CD7586BF498EB51FE08CD63592411724E1634BE532FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCEE6165F0786718C084BFF2E8206A92634E6699BDBB48531736986268A42B006C55C7893F5AAFCA9E00055C4A9D5DC28BD1900FCE3B5F15ABFB0200000000000000000000000000000000000000000000000000000000000000000000000000006723BFBB9165B5A59578CD0692BCA9DAE7686D9AA8D6C21056FABAAF8B8CE008B6BE017DFDE21D1327ED7E54D0C9085634E0467F29268FC1203D5E8BFDA11E007D4702B7A95995E263DB86D87A1E9A4AEF73AB80AB5FCF17CB584CEFAFEEE1B03DBD6F850116142AE5520EE868E5DA10D445B92658AFBB4761801489A45D1E00CD6C8C16998696B6D634D1F60925F1B50CF4AC8E02B853900E24EA718181CB6416B6F2D6EA7A5EBD103F9FF126EF6725E328591A9A299286B9960CE36A8D0500215D5981732A57572C899F66AE7CC4BA062720D2029C85DB7F0E769BD92FA4FE1AE5C961E0E2BDF8FD7B9EE8E0F158EC76E54E208CB4C1CE571B7AC1505F15001F72908241E810256712CE2278613498B960E8FF2B06B729B7BCD5B26374CD1C87C725573F03EDC122F83ACBA5B8D6E90C495AA0B596EBF26CA747E24EAA1B00F0715697C5169C8AB76F006FF63FF4A001E608D92181CF053B5E4435BF63B4A4698D372732C249DC55A588621D07BB8C5D66D68667667070CBE11B07F3540A00176EAAA1A93D061AE2783784D41C1F948479F3CB727BDF228E5601F6DAADE8671DC99132DCE50453978E9D569D3F6ECA04A0DF9C71D4DD5022B8FA368DB21F007A583BEC30A64F33384208073B0E55E083370A1E0D3FE77B71CAB77877122E1FF7F5D2BD3DA3D5C2D162F3B144E889A9CA4C17681FABB98F061EB8028F7618007E985821935B820292A87B5780D39D553CC0B68BF7A9AFF97C0BFE05B10078E8A606B29EBD04570A49D6EB81A89E86C672D6A1C0AEF6F124E8D5F49AFB900600BFF667E56CE075EE49D2F305E9C20370A492BDCDD1C81043056E844BB465909EEC5EC401685B59A8042702E5258A9889701CE40C8088BC0CBE38921302B917008F496EA62B3814CB5C244E0ED800A4D09BC8B46027F6D84952C6C40DDEFF1059ECAF96F8F8EBE61CDB47FD5B7C231207C25A9F8EAD423650B518C7EB99EB160039686AF93E926F01873F2A9C76B812C19F16DBE0D2D8672B3965FDFCBFCC0F72F36F018BA570E6C070F64492B2A377386A408C16CC0E22BBCF1D524F902319006D6D8D976B3B275FD796BACAF8547EA9BC717D4B50BD266DBD3B5E511200D53A18F0A72922215E89AC4A4583961518F7E6B357823E2717F71101018795711000B714FC84A2247549390F907755679F9ED0287F8DF212140360775D1CC6138118D7BE1A13F5885627B511122A16B0F4EBE9DFD31374431DA6C14514631CE70B00 -smlen = 401 -sm = C951CA56DF48D7FECFC91E3288A06B3103D30186F90A03E742BD614050E2F5F0640E7449E0002EB79A404488B6FB7CCF54682E9039D1280901F3C18E916BC9A0C68331F9B0D05293E2A8EA00A50CBFAE4F7197F76BDB34464837B3F5630300A49CC35A7E9C95EFC915A484833350EEB25F01945CA6844DD042228E9A44B75FCFBD90F3FA0070F68875E3C866F92AD172DE9794EFB3B13C01A6C079C99D218C22E432947FAA57140631E101CAC72B9A3703BDFD06CAC77BFFD19D6AA46A01561B7AC0212689CB5656A9D7FDE69449DF0300B7FE9F9DD39480417511AE98318193C39D6D01407FC84C917EF55731D1517931666C43ACA100E86895C8F89AD09763C590530A6A5D8927850001B1F1BD9840EAA0D31BE940CF85F4C9F9C90127E2968EE21E877535997C4856310102342BF64838E5508C08A903BA7C71BEFC80900148B5E9FAECD8AC356596B0A735CE03225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 - -count = 2 -seed = BFF58FDA9DB4C2D8BD02E4647868D4A2FA12500A65CA4C9F918B505707FA775951018D9149C97D443EA16B07DD68435B -mlen = 99 -msg = 2B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF -pk = CFD509E83CF73F4EC30A272B62CF642740ED6241CEB6DA97179045905E82620BBBA9850BE884E6E4EF0840FDEA53A4FB11EA501D7CFD7F477A9847D613C81500BE80776C13A26B00FBC5ADDE619D938E8DA2CCF4B1D38B36BEF23373CFAC89E78CFCC7511CC61909A5AEC6B9C06B8B81130B3BE136802B0F11B1501A687D0200 -sk = CFD509E83CF73F4EC30A272B62CF642740ED6241CEB6DA97179045905E82620BBBA9850BE884E6E4EF0840FDEA53A4FB11EA501D7CFD7F477A9847D613C81500BE80776C13A26B00FBC5ADDE619D938E8DA2CCF4B1D38B36BEF23373CFAC89E78CFCC7511CC61909A5AEC6B9C06B8B81130B3BE136802B0F11B1501A687D020002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E313CFEE409891172FFD103080D6746B05E4F71C29AB74C373F42DF70E342853D46B76517C44A1A1EBF908880A017C7D81E694CC9A98EA096F9BCB9811904006591965A534808EAEF8B7A3EA8C34F13395BB969FD0AF7FE5C00300000000000000AAC2D2B9A5043941D21EE4681C6ABBA7DD644E9368B00CB8EA48D697B43B6C8BF1E0506A00A41898A055F64F0CAD07A4F4A84A5E275D4E9C9E510ACF1DF08FB73B3359862FA44D63F6F00D33C2112709C4D899154B05EA581BF8FFFFFFFFFFFFFF26A586B68A8080F7AF9CE03CBD53DFF34A830A7BDEF5FA539963320D82AA8B0FCCE9155A26BDEDEE816E7C353A18626007057ABE9B092BFF2A6AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DEAC330E69556CFA645615C40246B4CF463B08FA3BC5970B7F277CCA39AE2C92B66A4A2D3BDC7B3F2EE3FDB02C6E77B8B1A8F1BF9436D998DA4030000000000000000000000000000000000000000000000000000000000000000000000000000B3B550AFB5EBF33529402A39ADA5DB9308A23B695DFF514AD9FB70219389AFEA7A67A1C5B34D3584BDCB698118B18121DE1B61B43C921B62A084DE3AC78C0700FB256F38BECB4EFE4F9CBA22608B3AA877867281B2CF8FB5E75599ABF935811C2AECFC641969CDFAA1D37560F0D798081451AEA5CD58103D5B170E21C63A22006B612DABDDF202C0D539CA8F7DEEB2B7044448DEB8B9878D841710B495ED74B1CD1F2DE2AA028568F58F3F39C55DA096CB2A7B2B0DA3C0E87FB354E8C7C21B002B43131845112C340EE6BE83EFBB210DBBD9989AA2D34C4CFC6636BB462F28BF6DC4FBE5B25099F8E7CBDE569BBE8263E9BB592DACE0C2DDCFD1D54F4DA1040088CD142DA51C2D643898B315961889B8F44365363210C7663964F5FA0E706A3151A0EE8318BC54796CA3C4940F6DC58E04D47A9F20E71F8A9F18687362070D00DF3A0E4973189C8D6DD5BAB37D177CD889E3C16A754EFB63A64176CE2877296C72E2E71756074BA2D1057A366596A0A571A2313B06B2370E56FD5F248BCE13002D585D9F34447AFE4DBF58FF58BAD96D3637ADBF1297A256ACF16DFD062B222E8D5D9A1A280BE8F20D0005EE46AAA0B6B818ECA355E6F17AFD714294EF60030090F7DCC25A7687F046552C1ABD83AE6D139BA76324AAE48F2811A8F840AD969AA6D227DC7C44DE2AF0897A7DDCB40957C53429826905211B26C76C2996F805006E78C32FD80BCF60B16EFC1B816E9DE589BD4CBAE1F737A899C642117F5498D722081F3C61C02CE4E43F846617CCE5A308F045F31854770BF73450C4DBE30D00FF4696738E49594E9B6E7C0D6BD618B8859C5DA8CF3693CFBA1358304E205B4D135215B8C03EB4C54E2E7EA05ED950B57D1F8E25905A367521C8E8CE5FD01500D08FF9C6BA64160E879774355813124A7734DE82252D88372B0DD37E34FA36EB3BE7E9B4ADF2A2E980623ECFD704697820C610A40B371A32024F75D756EF1F008B9B4F7C1B7CA90CD45CD6704FDED57B3EF6E75402F934049FCD1D04C4F83B1274D754FAD2C6E93BDB6BDBE1D69D5F032B5DE4A43C759BD8A586F06CE7A91900479E2BDD1E6CA51618558548F12F7DC769CFB1009C58A3B3E6C909667C9741F0963B9E93952241C162D78ECE523BFC9C8B6EFEBB30159FEF4CAEEE6C413D2500A741151EF93FFE94A3868D82A423F9E500B91AD5C56F8AAEF5B799621DB81A675BA4527BEFA59056D19A7052B6A710C14ACE36597C67F4D1B5F6691B324A0A00 -smlen = 434 -sm = 2286C8BCF776051E9EED2F25D612F4C03DB90156AB04704FAD27111E588718F1BE330D9018008316CC3A3EB5E205FF8EF4B58035E7E684C9003A0C54EC53D751553B2E39820541021F4DA801BF490E058C4FCFFED0A898AE0E7AD9302EBE00797924D453A6348CF9540813976DF5DFBBFB01509A33D9087A0B262A7C424A02493DD2024600735BF0E0D9CF5AC43507F8A65EFEBF922B5700E0ED5B33236999349C581814C8F6B734AD4D0187A0389F6D790F55CEE0EC6C1B2311696A3700937CDBD8D76318E13C7D5F8004563D61E3FD00E453EDB1DCF84DD95FFA5347077F73C9D3C90146A02304D8DF4B37F9CD03676C4CA819A791005E10D46D906DC4C190ABE08F319EB490FD6B0100C56F6BFD2D9BD2337E976C725FBEE07954CBE15D218FF6C653448B20F166BCCC0403CD0DA972CF8628139702917CABEC6AD49C910026E29B582B56DF8BA7D38FFB78CA002B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF - -count = 3 -seed = 58C094D217BC13EDFDBEA57EDBF3A536F8F69FED1D54648CE3D0CCB4847A5C9917C2E2BC4D5F620E937F0D329FCF8A16 -mlen = 132 -msg = 2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE -pk = EABB48CEB9E94B18273D8286C54190CA47659A1ACFAD1C376A0576ED26A1DE406E610B4D43618C7FEC65B3ECEBA569678BC8F12842EC1F415902653E87BF0B00687EEE933B44C43DD4459736C7AA1A518CDAB95A01DB2EA7E3801C98C149F6382F7BE8A56FD75DDC132766C2507D0AF2648DA32859E29FBE66C4448ED2B61100 -sk = EABB48CEB9E94B18273D8286C54190CA47659A1ACFAD1C376A0576ED26A1DE406E610B4D43618C7FEC65B3ECEBA569678BC8F12842EC1F415902653E87BF0B00687EEE933B44C43DD4459736C7AA1A518CDAB95A01DB2EA7E3801C98C149F6382F7BE8A56FD75DDC132766C2507D0AF2648DA32859E29FBE66C4448ED2B6110002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B6E0248353018CACB913547611AC1835C8F5B2E1D45D9CA5A13DF2264E8BE137DC26881EF663A0DAE38145AF433DA15062DA07071D1D8CC838A071CF75EACF366E5C21BB5B75C98C12A85108836D83D1CD6250EB8C304FDE770D00000000000000D50BB58F25733F443BD7DB226C92452F8774BA3764059BDD42434B685D2466EB10DC108E8DA6D7535DDA7E4713659000DDD7B13BE777923DE453242A3E6BBB17BB686FE1E6E438A2C68AC262787503774C0731B67C9A438E3EFAFFFFFFFFFFFFFF4BA6EE96738F1608E594C94217E20FA80C87F1262ABFC069ACD7E6FC49CCFB14D8DB60EABF7FFF4D79B6FCC7630D3C0E6D01AD612A09DABCDEB0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6F2F502DC6A7E1AB90E16C52AC157567DBA6913CEEF405A14AA9FB3A998408EADFF518729CB0848E24DF3E24280A4FACAAC490F693851C252B30200000000000000000000000000000000000000000000000000000000000000000000000000005894417EDFDC007C3E5A0900F111CA91D7A5F9E231C9AA7B9D70F448ED4B47DC8A426B3BF0F69B9B3A17E3FC38F168A299AFDE86D85B5840B6D7065438250B00B77FDFB9250A3B12EE52BAA55737B45FD808845A19E30ECAB0976AEF2646C491798010FD47489392E41D9ECFFD286F73BEDF04C520F68DEB07C40A0B9F611100A6C0C88A0580B90C63AEEAEE2A6AFAE7FE6B215F9ABC2BB4E222D0F871D513D32F32F9E37B9592635E93079F73DDB91CF57DD0F4775ABAF875786ACD29DA0A00E1A10852430B11433C67E85C594DC5DE139836564F038ED1F95898BE83E89FEED0DDA8F4071E4A829D12E7044841F9995072BB99E076A79887859B8FC6920800DEF2BB1FB180C195EF8E4A81FB1BB8AEDE77FB3BEE151183818C924E09E448C9841E9B6B2B249BE368570105A0CA77B491B53C26AEF7B8BDE5EDE06009FD00006AAB63DBC90773EE284A3CEF577D409F273FA52798235D1EAF2A8AD044273636E29ED70B32207E6DF09C678FE69229E73AD212EF44EF2449B150235994A30F007A0C11481EB59DA00EB57898A8730F9B82764170268BF570F76F94EB53E42330934B1D7394D4D9DB2F1EA501BCD9528E7804D7BEDD41144F0FCC7A08EBAA13000A390F156CDE8740BCA882F15934613FD1CA4CC2C58742F058E9715C94A9EA57EF1B0DCE81569878C366408AA305336934594E42110A409B84259E851FC2140053426587EC01726EC91F30AD2792936C83B1D557D5B1C41024081BF40A9A908A2CA06A4412D91D1D0205D9654095123047F306B6155CD1617C7B96B1777B040056D08F84140A0E2D944EF3DC295433C0C70A8DA7308BD928537BCC4AB8B13CDA8265033D428C72C1502D312D1435E981DF3AC0FAA3535D31B208FB9BB76D0600DBA1A51FF07288D234E8B457193A56B7D7C13ECFEA1D61F1D38204C2C6AE8D7524579E2C12888C35D74012F3BF0518C49664AAF63BF8AD540C7EE07A24B10B007FD12E132D655EBDF8B514030215E6512F2FB6FA1104D8681E49A1D10F8F68FEF6635294E7E3AE0DAD8E8C2DC934750B1FBC95DBF2EC52920CCA9F6A32181C0094373797B69139926FAFD6682A8929E99A1D32053D31BC3CD178B0D2275CC6048BAE153CFD6DD67CC257BC4518B9D92F44949DC40EB213A5FE70125A80CF1D008881BD211C5F51586BFC3F5107DF7A568A2ECBF081137A93D15534D9D440FBCD207BF34232C7F1A3E91CDFF2EE549BC9A9A1CEF9322C06B5E4D561CD0D2A0600 -smlen = 467 -sm = EF0FDA9F8B290DA20564A981FD67C778BAB400FDAD3C5409581BB3108AE8A20CB6AD3CE44400C47F735E43AB9A9A75BAEFB133261CCB864001FF8D05F4D49B7CF74470B80639E50A9A1AFC00C9035AFE88F5CC1F60149D3A3D50EC4EA808014B7C21B81B0B0AE1E41D1B8809BD5296328E0089B5A54F8AB3500AF8AA640DB01DDDBFA9BA014E56DC3FC7D2B1FEC28E74412AD2E9D71A6F004C6F596290D59E02C69473B042C5A097A04B000196D485D8214A17A4D94FF7398EBCD27F8D0146FD81BFFEADB6428FABDDBB7E15DA7BD82101BD4CFFE8AE55999C6B29A47EC4E3C4B0165800102479113FC9E97D3791C5ECB94C63E7F79501D84C45D5CC9C69D15C5E28FF6CD8FC48564800015FBC2896F54F0DC598166D605CE19D6C87B53BB910F0E47FAB4420ACAAA2BD690203A14EF891578B1098C54CFF6978233BCD05AA0194B932C260B7332453771996931A012F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE - -count = 4 -seed = F1902A7815F37BC7F5802D8CBCE5B48D82EB85691718062BFB84D8C06AA41D6E9039B0A107245DAFA4EC109A57332914 -mlen = 165 -msg = 1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 -pk = B8988E7E23C2D2D7CA34B0EE0A12C3CAA2CEB92A7CAF04C44F2B5AA9F9B1C13C5E4E72B6AA635C59D34478616AFE23196A7AF617BF0B1B34D1319335AC7C1300AF52AA89E58A2EAA19DB49376781CA274D6B5096E6DA68B4752E01FE794C213A064EB83352A54F6931C848A4E64DD1C7AEC3C569E11512B27421C570E2E01100 -sk = B8988E7E23C2D2D7CA34B0EE0A12C3CAA2CEB92A7CAF04C44F2B5AA9F9B1C13C5E4E72B6AA635C59D34478616AFE23196A7AF617BF0B1B34D1319335AC7C1300AF52AA89E58A2EAA19DB49376781CA274D6B5096E6DA68B4752E01FE794C213A064EB83352A54F6931C848A4E64DD1C7AEC3C569E11512B27421C570E2E011000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066FB227ABB412C57B23696AD6E5811F2C2BDCD8F6C0F97AEF03D86A48E769D8348EF9180F55C1C11CA04663D937CD3FF7941C883D240A01AB861CDC41C9C4815F81252FE5286FE2A5287B9101CD5C8DFFF2E7CC5C0AA4FF9B2FBFFFFFFFFFFFFFFCB07467C849B38BC69799C53C726B73B4998168B23BC11B9F2C1010B119520CC92CF2973B1B49048CB165B1D4CE6AA6D5FE1582D466F570642C7901759399D095A6C6BB27BBB90EAFB272314202CA426FBF110B2C78AE4CBB0EFFFFFFFFFFFFFFF954D4B1C94FAF76B683F4C16CA0138ABB109073333F76C567900AB45546DAA0BA1375691E106ED0B10D4A2C15F5183AD43506776EE11C8E9E287FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2AD218829920419F47CB325DFA9712C51AEE15F5FFA1E7BE5E33518F4E50ED064094D4DA68A2247EFDBA76A2219897DBFC4B088F0943FC2231AF0300000000000000000000000000000000000000000000000000000000000000000000000000009F084D46CCEEC5AE68F427B92E2DA0206D599C8A04D62F0C3F451313C15E013684EE09A667E36BF2CCA70ACC2F6EA46C619BAD217C2C0B2525A517326FCE1B00A2C230AAF15C4FDECC195924DB7A0EAF6E57D62A6FEB23A4F47B5FD505D95B97F5E5EAF09732743347FD16FB459A9F44143F32428444016874A47276F98A12004A1E13CA6181199E316F0BAB18395958260B98FC7B5E3F44C1D7747C8D3C4562CB9D2292F5CF4CD624DF992BC9C6A753F21366E16D9572A16751F0199F2012008A60BB8148DD4E3755B220B9C6BA4D89294C72119227848A4CBACBDA46F65ED3D5803D20DCD1753F7EB32A1ECC86ED3785CACD23209BB3039D4E305CDECF1600B4FA380E25BADB2ACC2BB2D8B546CA84F3A4385DD5A4749435D84E19D18B2DDEDD8FA942776E755183BBEAE81867FFFCE0B9DF8FD5C95CDB224201B8BBFC0900DF7BD231AB6DCBAF70C45A8B3B588F72A2B3FA6E044AF6FC7E417EDD29F7A753F2E3ED7980FC07F80956172D4BFDF14AE9A385501D73F0693E0414AABA020800E801FEADAAFE75300282EA5B9A771568267AC55C503B67D36DE43DAE36469410FFEDC775FC9945A605549A3A54092422A188EC0465C08E0F5D3BFADF562B2100B8A2F598E49114E1F52439BEBC78605A8326FFC898E74CFBA24D5E9EE61940C9878E5C70990FE1A8A9E4EC2DAF8993AF39FF8FE0E6C68A68D539D9263442070023A2739642E22962A9F692D8B1D002AEA6683EE4FC03ADED11BEE630798050DFF626F0F2909993505F8612845838EA07DD576A1994E202C31110FCF3795A2200EB6381856E41A2DDF06D85076E0C856454D9829B2825B49638715C4AF61C0281BAC6957F3EFC4D8946C54EA45CC501F3B207330F83BF7AC13FF070CE49C80900E21FDD5EDA1A92BAB67DBE96A954B722947A921BF1347914896B8819ACE4FDEFC5B9BF173018B6876B8CDF653287DB100C408A1F6EEA3766F9C40DC64A652100E3F74F83019C84169B678467202F581E152704F0ACE681D40A000A2819B75C419F9C5768F7C216EE8BFB6B7849295C76C337070FBFAB902FFD21A43FBFB91400AD462762701248CD94C100CE10D87BC8D906EE05A2D9BB6779F06AF6817CFD9C4BF49D64873BF93BAAA621CB30D29C22ADE4E9DA63FF6612D0AA552686FB1900ABA37FA82271035295EAE1D12C6A10E2918B44F4222857D6EF85A0919A14CE60B42B9B1B81EFD487C86FC502045C87B78875664A08C2352528D7E54022BC1F00 -smlen = 500 -sm = CCE876AAC043A2F2EEFA2DA44CFBA7C3E3B9018319432D29B27DC061E22E5A96874AE6CCAF01428FA44B6583C35C575531BFD9A9FDC8AD4D01E5D220A7BCA06BD41F97C842D73F9C9CCBF101A2AFA117BC0D02F6EFE53DCF463D8FF522B0019BD65928761A9C52D44DE3A29927EA700C7900D99462C01531AAD5D745E5A4E7218D098B9A011E6860BBF278D0EEF073AF583DBD47006C4B0098F0D3D30A02869FA04E31D9B15199C2BEBF0038EB4365F93E23A689C8611C32E925402A0C011637EC0715722153894C989A7460D2885B600026DD36BDEE21EB3E617302F08ECD5B340A5B015DD3555B37313E55242B2C28E999D82C83BD0197045D9BC9516E38889588D232271B6A3B2B00019D30F71787CA8EEC7549C82612F5C58FA8EDC21CD2E1117FC60D6C598C0D58E801035C4EB7A037D117211AFF5F0110C852AD085600016C4D33AE940A2F5EFDFFB091A0001CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 - -count = 5 -seed = 75224ECC026C18159FF92256844D0ADF953F0A4DD8D74D4EBF1DC5EE8F5630B011A447FD4DC34A2404D620CA0E1F273E -mlen = 198 -msg = DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD -pk = 5AA59FC8BA10FCC87BA423DC70E262B528E1E556796D693BE5296360AC5FB9B7F10E83C29BCDE1ACFF40362FC5ED7AEF1589CDC903D932F6E1984474DF9C0600518369C9704D689F90C41AB8370DC2A3F35B1BFA25D6A366898AA367ED78EA199167E478C14947C82233745FEC93F5FAE19BF4074295918015D860CD0AAA0200 -sk = 5AA59FC8BA10FCC87BA423DC70E262B528E1E556796D693BE5296360AC5FB9B7F10E83C29BCDE1ACFF40362FC5ED7AEF1589CDC903D932F6E1984474DF9C0600518369C9704D689F90C41AB8370DC2A3F35B1BFA25D6A366898AA367ED78EA199167E478C14947C82233745FEC93F5FAE19BF4074295918015D860CD0AAA0200020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ED3D502EDD874EEAC1447A164DC6F4F443A6009C1ACF2827AC7B24E8DA3DE537F6ECF3938606056B189B376E473BA16070E121A4A1A332048869EEB7692BF5976753528E3BAFD0808831FD09A52FF0B5AF167C848C360294B0B00000000000000FB64738BA11BD00E2FF78B6E308FC21F112DE205BAF64CC394236892A1A2E21709CA4DA24CFE6F5CF8D498EBB59B9ACE597D94B38EC6BD99E0D17EA634C7BE312ABAF4FD824ABEC85AFE02975D61F9E9CF3CBFE8BF99003EBDF3FFFFFFFFFFFFFFDBB43B23587B212F79C11CF6ABABBBD2D36F28FB2C2A51A65E8FABE0D82E4CD01593F1CCCB7EBFBA0AFB49083D1E0294D5328F2D4FEFEBDC912B0000000000000000000000000000000000000000000000000000000000000000000000000000000E9539B3308A1F5397911DBF99ABBB82B71C482A7AA591888223D522AEE16C314F77216F3286CFA609FB4E1AE62C4541BA4A76CC86D9B3A3D8E702000000000000000000000000000000000000000000000000000000000000000000000000000013562C8A44D34ED726E1AC9B26D287A241BC23975744340A073917C7D9BF8DF4913986DC7773239EB7B875A22C3DC5E11A66BC64622A303B1D892D7163B11500C599113E25540882FF12B1272568C679264AC81B37C57C865E293EB96ECF7843EC5F6FE4DFA7AB67221D1489C1C7881BE6593CCB0667145C0EB2C84806362300D5F1917E633F0A6FD353B606E514D2A5C524D6CA2D83BEE76E2C42E9FB515C87B7FC14FD7DE6F69F8D17E159C29AE4CA1082F5FE53741AFB5901847D1733080043B5E7565601363733D4D4B73CF144F90878F8BB97FB010997A0DF3CD4A9F9CDED246F0F697389B8BCB015756CAC2023CE658B0B72280151BAE8BB66867C00003A1373C199E6F3E4BB7A01EEEA1E0C35CE5E42A7BE24A5DA78D2FCC4D286A179C44D3B50E8F5B126BDF00E15F15D41C2FB8C72C5AE633AF9D7E8713E3CB41500146CA33504F61932B3D5870E73E28F074D369EFD215FBBFCDAB53EC8569715D1F63873233FA2547162841307365F8FC022DC62B4135A1C659DFA6AF4A8820400DC63FE61B42D15E66A830CA45E189949876FE009AD1BE36F8AC56F3B365494A3FAA395C8F94066FC08A622CD7401D675F9FFCBBE71D6B0CB81A0B7EB20102500FBF5A464C0B2AD3CD4EA3B9A81A3B1C079CE8550E7983EA5E47F2671682E6D1D7F32D834A95DAF0AA6BA2C8A04E2340BEB54356834E3BFF438AC35FE57C6230059B6E8B456BF40F495774AE5733CD989C4D457AB4AB8259DDF6E0A5F6F08E04D7ADDB41163050BA975831B53A1F75C1FE49161BC9B623787568EA73D068B1A0038295EE28697F8974C555B59652B902502B903582473A845065202B799A53DB22001E7152093A1F7E247AF4E8CBFDE943A6DA6A867258C21E20DCA758B350500D6952B7CFBC41AC98489B18D8BD765644A72493F96E10CE9BAD462E6B16207CDADEA3E25B4387EDA24E60BD0B244874EEDBA88D37DD78352336EF9A892380C005F5F460DA468F676BA0E208EB5A2FDE74CDD9B3806BB625DB45EC67C341FDE28D98101AE2F52CA05D92D74658213262D44AB4D63FD17AB8B4EB0930D07EC0900D67CF8EF337C0BFC98BD067A116DE15F8DE193DF151131426B0FFA91F5D7BA94A0BEE05C60BD8EE7844074A125CD7E7303A5361BBE2A315D502FC6E6D37B1400CD057E522B3D39888EB3559BB955ECB90CE030600A4D59FA7AE1EFDA2DF565BB406F5EBD3ADDDA44B26E560B776086AD473C3AEE4682ED128DB2168D698F1A00 -smlen = 533 -sm = D2A4563BC4993CD3AEF877F2799C3FEA3D2300EE1AF401030E7FD6B6230809E527D035EC8200F903AF184DF5DAAB8D06B449F4588B9E2F1201EB69633D40E10798A82B2DE30915DDFA772D01B24096C22989D6FC573C30A42264E4D15308004570D19790D517329613C1DE261822C067BE00EF9C2FC57EFB7539858AEF6ED4D29D1B03AE019EE80259C1F38182FF09B65B2B8A7A12CC84001D530B47B1E6658EF3A971A231BFCA952162018F7DFB0C824BA11D1BE696A12C976B75952E012C5B671763B3ADB943CD8F4CAFC7C4FD070F01FB408507D150ADD6FFEEECF7205E2B0901C9003B059CB3BA450BF65F24F6D9AB5351F761B90120BA47A19DFB39009F126617766C5FE48B610100DB8984A08E2D54E219D481FF9655FAD228C83D26FFE7BBA774FB77852E8D7AC00503BF9C77B77E5E63034DC4B1B20E3DCDC43E9201438B64FDC96A45638B9838A88C0501DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD - -count = 6 -seed = 447F03C8CD27EDAA1FA0436DA492812F57AC946479A9F1F90EC4F5E913A05F8AB0DD7645026A96510F6D40AF05D85B07 -mlen = 231 -msg = 0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B -pk = DAE00C39B081E24C7F7E052E15683AFF4818601B161D3429B1650F4F23896A78309A4AD646FD3C5B3E052C0276F8F808F1CE4EE9817BF4104DC38AB2AD610F003EA4CE13814E648FD11DFB1B245FFBBF7826D1DA98E027649FCF708EF54AE3AEE57930E0EBBDC4668DB68BE9ACCBEB002270DE10F7B679EBDA873C377CAB0B00 -sk = DAE00C39B081E24C7F7E052E15683AFF4818601B161D3429B1650F4F23896A78309A4AD646FD3C5B3E052C0276F8F808F1CE4EE9817BF4104DC38AB2AD610F003EA4CE13814E648FD11DFB1B245FFBBF7826D1DA98E027649FCF708EF54AE3AEE57930E0EBBDC4668DB68BE9ACCBEB002270DE10F7B679EBDA873C377CAB0B0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EF7407258081C188FC55E8F27926BCE270FC14D4C41EF6CC6C8EC847CC68ED1680F69048C5FE4A58A60309C62D63F34F71119AA0006A9280D9BB98F4F5B8AB2F5AA20955627ED13D57D6C1144EBB78D4EE333484CC40BB846A09000000000000005646D233002C7E0963D501D638D972143747FF55CF24CC8EF26E7E190B5776B65690D0F0B961B67996CD9B0D48043DE68D5CFCCF7F71CD500A79EAC23F0CF6F33E3B75742B3C06C025D07B4BFD7766E0705482A495A1F7D068E8FFFFFFFFFFFFFFBAF1B39CCD1C2C3CFF18B018AA7E1690CCE7B542CD72AD32DF8F08C4ADD31390D646E1D2A83BB2E4C49FE0D33DC33F90FBCD2FE4A2B033DB5382FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16F8C07BFCA5EDBAFE48F83ACFBA9E7F2E6126C143328A791A3F1D693DEE926E26F33EAEC81AB6BBC57A07BC4B894575B7DD82353849AB1E8AF010000000000000000000000000000000000000000000000000000000000000000000000000000E4F24ABCD27FF8A72795828F8FE038910905AC0DBAF260044C560AAEBA541BCC3BB9D3F8A151C474933B4FBD6DDAB34F6288FD8FB65D2E5197114B6529F31F009EDC265F797BA062ED3A44EBB9FAB77C8CABF67F5EC234BD5DA315EC590E3F8F25B7CB7602D836CF5BB346E0673FCC5823799E7942149B927A25548C06010000E9FBF791E65D742B4BB319762DA93E69CF02BF2C532B3350D7857D6C8984AB165150A2C9AB3DAF15ACF468593ECB3467F9EDDEDDF085AB660D8E28823A891E00377B2BCE07534D6B94DE438A2242F9968F9CE725E4021828C3B66325AE99D8EB8198580D2608D64B18D60CDBE863A0E8E85440678C8792648AB3D05EC46E1F00EFE2BBFD42C7E90E4E4231C1F18E0C032D2DAC56C56019B1A450AAC1F67B55627A79C5AF2867B465C26C01BF09E6BF4EAF885BAAF3C742C234961F05B028150007555570999D4976E90F6A363420924C7005A579757FD7AD9BB171B12CB73C3D56EC75490B8FD9E8DF98C20AD0C2A96407849CA4629E767F4EF26A670586020028DFDBC210F86B4C38EC8575186AC2DD693E774133606E931281C290BE1155922346FC52C719E8901E17D9F3558FD31E746629033E25F54456EAF9FAEE111700ECAB61A69DCEB0F92E89096277C58334E1234AC38BF254C8E0C3FFC281A55D488BECBDC61C83DE3642CA18415B7B8BCD2503A83C2AF70F3FADC1E0D0D1811A00DC4D1C240FD8F804A9F06315FAA490C9F0849A393417A96D5C8069D54A542856D7EB6CE958EA90FE5FA61AAD2C7F456119D25574E3AF8FF238ABE70F44050400DA6329E82E3F951AC1E6110EC0277583105F77CE43920B2BE0C0262B34D4A578373E8B72D2D88EEA6FDE15610C3C8792FDE47590F7A4D166AB64D53878FF22007081A3E93D6CA6886FA73EA2CDCB179E65827C6AB41BE729B3FCF38B0076D8F47E087D7B472E24FEF7FD8EAB7084584AB78CE6D45C570C00002870735F340200AAAB00E0FE9C4A8698BE3E2F41BADC710AE8EF22607E80EE452FFC7716A92694416E1CF274BAF45B5579AA0144F2D50F5726CB9D69669DAF43E2D658D8842200CB9CA8676BA8DD7CBC1857B8C38C3B5E5ABE459375762FD1446DFD135B5F82232F9BE38BB0D99BA495367F88FF5A2DA6ACCA53A57DD4AE1EA82CA067AD0E0000165CC5DFD8CC2A83163744307DC579251699504CEBF4107E8B24E761A1080E567A5BD8339990351529B101AC45012FA1DE28FE768EBE3A24957C47DE45210500 -smlen = 566 -sm = D3C4683657D1068B2AEF462666A78E7431C7008C0D6013606A4E905ADEDF35721D730E95150125455E8FEF0EB0BD00F7986B06414BD9F1C901F2D6476252B274565E897CD9956BD66AF28600AB4B30836C107B7017BDA39A82AC8579036200E699425217B48FC0472A82702A08B180C4C700C917C54A5AC3370440FAD4551F755447BE0B00C31F88A4DBE2D5407594323F0A81469FC8850181764D034662ED791C73F1944A85CA5955B101B5E90E4D2B42169F98BD40A3724DF2CCC3110132C11B36F2A2DDA80516B58538E7E1133A88005A2562CEF8B58479C2B9EF4513D658A01906012961D68C946083B7FC1AA3DDC42C8CC5847E001DB522497F5B7DFFD949D995B29F6E85FAC80101276B2B6E95CDEBFB80B5E0F0DD95F6C30139DCC6E12D550724A3DD215C1207200503E8899C895A371BDFA7560FC5B7D093B8B87C009B21C660C20A4EA9E31ADB265876010073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B - -count = 7 -seed = 8C151C556DA912A82DEB32144C8A8C9090CFAF5C12AB822AC3C72618837A41C2453B715EEFF3724CAFE69B1ADCAE9DDA -mlen = 264 -msg = A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 -pk = CC7F9862656F5D6E45754EA02FCCC2AAC57598F3379D8BA6D0E202E44940BAEB6720DBF0A147F0B9A7B9976F517E85156A2EA29A3695CD26DD4C9DC77D0C1B00D590F5F2CBB9E6682AEB5F04AE62D486F921C9144D0F5A9ABE737D0B6A26A070E591C7DA03196D01C3F5AADE5DFCBC3EC3E03070A9EA8FB84A11A7F830720900 -sk = CC7F9862656F5D6E45754EA02FCCC2AAC57598F3379D8BA6D0E202E44940BAEB6720DBF0A147F0B9A7B9976F517E85156A2EA29A3695CD26DD4C9DC77D0C1B00D590F5F2CBB9E6682AEB5F04AE62D486F921C9144D0F5A9ABE737D0B6A26A070E591C7DA03196D01C3F5AADE5DFCBC3EC3E03070A9EA8FB84A11A7F830720900020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002843B06613884FA8C6BB113E20E2347D291E6E0AE9CD79D851B8A996948D33EAD7B6BA7636585DFD020B87345B7464615F260C839CD939C388A21C5E9653626677D9E5D7B75397EAEEDFBBBA3E7460CA479081C4932BC1D0CF150000000000000079A1105166410C5D3679123EE805E8015BDF6C44EA22DE16A264B30AF13B959C9F421C9DB64C0CA85DFF0DE2370C8248D720D0C361E6E4BF8D50BA06E930DF01C466744200C5A74CD30469988271CE76C4E1E39A2F585E2569F9FFFFFFFFFFFFFFE754C5476A5F3717050F9DC81D0C52F25D0F44F837AE0F43B82742C0ED73061DB6DAEB8A0E5E5B0A546C041423890D48B0CAF8CD330494042066FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF503309DBE374397468FF2BB93E89940A0726D1EDED275A8849B896341A83A2CE38282A07B152840E1A140A270E8B5E86AE348813B1F84BE63A870200000000000000000000000000000000000000000000000000000000000000000000000000003F53D3FB37C439C4F5BAE825C9F13DA39C350BB885B216DCF2AAB93C42474FBEF91B48A46E94BEBF219FA57DC8AE593D26FF2A9DB718BF8B94A032FE8E3B0E0010854F8F70B45CEB4066CF49D8CE19A8B34F64DF5C051A8E529841CBE3B13DB82500A5DC9A4CD3F366815851C40F1A8A6D6CF7AE56659C0DA4B2F5DE37740000EB250950AA2D29F566238C3125CB53A52B8B82572883BF7296F8ECC267BFD6FC5AC2DAC3ACAED43D57F3F8F24A0F1F1819C7C062BC9394BC8C3837531DA10B008C080B1CB390522174B6A372A24AD1828AA345C62A31382C021193A29BE072F16FED56193EC0AC1D4DCB49F57F2D00CD7EFAC0E78BDD1247C7C29E6A00A816003D8483640E65FF26FBEA0A54AF3F6D159ADD0318D588FE373369F878B24C7D256DC40C1C575A5FA374BC395A0D099A2A4DB8B7157932EEC633D194F597C709006541FE1FDBFF349D7660BC2CCA27B7533D81AC318D1B2CE1D15DCD5C6AAE83546AFEB8567CD40F1095A8A6E9AAF046566A79FA65D7E1B389F039358F6E101800F4CDA7E1AB98541311AA20A99F8FC8E102071BC55E2A18672166C0EFF5FE0F67A1EEF9AEB3C1F7E21887B7EDF56EEBDB1181090FF8414B85E5C7BEB4491F1000335CEEEB67321FD30BB64E37172FCF8A88B1218A8300FE11116DD4557FA3ACA92F597F2E64273228E1E93F709E3D9EBF5431D3EA5F8ADDF2B6E2ECEEE8801B0035A5C3ECBEB1632CF7BA53A041E1A56277AC1F73DCD7C6510B9A440A4CED8C392E4051790FAB2658A2D2BAEDDF4C0D0D17A5395C5767E41A1CF4AAC04ADE08004C3B700CA6627627793306925574E9CF0ED44AC1961046FD1AA7B1C1A3792DE8BF8BC7E296013560275301C4B78F36B40B8C5179F9E3C57EA76B2CF3DA501000AFFDA99662075453389767F7857333B5C9641A78F298053AA6CCE54CD727CB8596AD93E83B12CE42B7701299AD268843F54FE8E88541D2FE0B5F9A78492B000030F426074B7866B2E16694EC5C6A8B8B7833FE98BB9A7452B01A1A9BD27D8B3E1EE35946D5E16A53DE9F3E280E37EECE254CA5095BA8782D1FE0F00EC85C0F0022F1CD5E855BAABB0090122C46CA2FE3510CE4FE2FE0B8AB74BFEE2CF24CB5D4A4EC3537C8C1B1E0D794FF9DE841C166F8EB17B6E0D2D089623CA07B88661A005469F0DBED5C4B8B4A624858DD347DF68D92C5E8F8A67600151E953E9FB072128F4C7332ACF07EBE4D1824FFCD2206C6AD03E90BA10C4ED20FF699D7BB1E1600 -smlen = 599 -sm = 2673F12DC4FFBFD66832E0A002A72C53017300C419A137AD6964773936046D8776132F03C70113160EF5C5036AEA777BE0DE3792078997BB0163F8A54E2EC2650C8CCF7A4B78C09E13EAF801B596F83F416551ADEDA407DCBC53CC8DB5C501AD3DF80356E087D7C194EF6B157142DE1CA200EDC291669A62304EF65BE694C4DEDDE5C3070140F1B364428E06D0A9FDB7B2704D37C63DD901BA4450619F7D01FE9DE7D4DFDB2E22814295006622CB593C63B7CD5354A49D1C8C027D9DCD01EA150F0C694B01AB5EB7D336A6CCBD2D41CE00CA340ABFD248B637CBAB91968F88391B516100319B9F125F72C8DF384BA332DBC7E732E899019BC0CFC7ED6FDBCD82943FEDC70007E712B400010D87275681938676E05419590CBA57D26E155E9A30BE62C79B3811F300620C5D0803F3A41D6973C0A5EACD488D01EC92B0AF778D01A38EAB7208805E2258CAEB7C94E803A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 - -count = 8 -seed = 9B42F41492530EAC81992F17613EFDF155F407D7E67F18AE193EDCE714D65D1031E7AD10839AAB46D0850EAF5997AB4D -mlen = 297 -msg = 9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 -pk = F83A20AF1AB09481FA54FED078B34A2E3017071BF6CF7BE425BD2F1035CC55E09DA8855B2D27C87AF0DAA175367297B083116B4F329DFFFF03A1330D76D40400E7468C7F2FB12450F8F31B6E827B2DDCCD5DE7272DAFE7AA6006FD50DE7A0325039C0C80939D4B5B0663A95FCB6018A40E7CCEC1008AE79C86B2BFE51C671D00 -sk = F83A20AF1AB09481FA54FED078B34A2E3017071BF6CF7BE425BD2F1035CC55E09DA8855B2D27C87AF0DAA175367297B083116B4F329DFFFF03A1330D76D40400E7468C7F2FB12450F8F31B6E827B2DDCCD5DE7272DAFE7AA6006FD50DE7A0325039C0C80939D4B5B0663A95FCB6018A40E7CCEC1008AE79C86B2BFE51C671D0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F25680BEDB989EC1192C4702A0DED41C9A56A7E93A97E832FAFC2951E192CA0A964F76D7652E9CDF4192F54B46A4D2DB246E9885F45777509FEAFF542743030CCB55F7F03BF64918727150A5131DA7AD8E17F520C42715EBE807000000000000001F3A6718F80C489D9FA73D26B1481AA26D33E2557B75AB24167A0DC7340DF1253C53A5C34686DD38DB4B1FC92EBFF34C5223E909489F9C23331BD6098BA517D76F17797484B2BC3ABBEF18C5896190C3129EA5F1B38C3D5C3AFFFFFFFFFFFFFFFF91466FEE5D42CB2C028863252AF92557052946DC39C840A11328F410C2F9EBE3E88F32206001F77BCDCA5B60EE0454D50C376C3F527B63F437F5FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A95A89F91C7B6611678E8E528BBCAEFAE6C619F71672103AE08D935C5AB4B201DC1215B5B2BBD0323CE22A17BDD5CA710213ACF353255626C2000000000000000000000000000000000000000000000000000000000000000000000000000000028342D0E78B594B844E27DF50189BEE713CD3F512EFAA4F75FF1AEC8077F23C5887CE7DC008636567C5DDA5434DE227E9C6898D698D50B0BE1D9CB0C62061400C8458B6356BC687BFD80DC698563977DB74AE2F6BF65B3D32625A2D397B68579CF88CE37CC76A62E029F1E6CB65CD258A7561D6475C52EEC44CAC319C4591F00ADA9A709B7A011F5403B3B2C83F65E74C94335BDC34792D19B7D0B7ECEFCCEE94B80CDC65FD075572647A2B2E28F4375ED45779CA9BD382792D29B18DDB110003CEF6CEE9EA870577F28B1B1D6F8F8ECB2C1A2615824E9E09EE48B65456461C8142972CD512651A3DBAEA3D1C832EE10DE44B165A6D32EE8176A50749E4714007F45F68C05151DA29410DBA3F7E62C568119C8AEB686E0A5838FE0EFD806A19BCCF2500FD3552B61C65D6B95432BF295C0D77EA13BAC7DD630CB3A59C7680100B04FBE4F589AEC5327B78772C6A36459E0B3484FA2F4BC00657B49C7677037A1D6E2F4017789079B6D898FAE0DECB5D3897EF97E0B6914236415D8E932212100564DE494A4FBE1B384E3F1337D4970D9B8CBE30788CA83EC60988008FCCDF3DE65FD2C502A79AD3645E78564D181C188B1CFE6009E3152F53F2B47065C6F23000954C0207B479CFC08C723AC5B558DD0D4727B769DF9EFAEA8D0E5BA1FDCA6F6C46BB18CAABD1EA4B27F4DEE479BF8E3656C8ECD899122FA3E2CDD11C85D1100980AF3ED6879E16A3B3246C9AF8F8E973A8DE0A8B7A1EFE688296A0180E5A251BBB3E41F8903D2B4BE9A2D6AF66D979C228D99B820E82596F5AC19A6A8B705008D56BFC2BE0C3CA8CCE62FAD8AB27F3703127C9738AE590572DFD5A2FB338FE06C516FD4D9DC4DF6A5F8D51CCEB976F52D49527CB7120D6321FD8B24DDEB05003560F1FB10A201B9D06E849904F3C92BDEE94FF0BDA1C3DBEDAF89275513CF8B0F96CA652643479D1876E63EA9557719A9DB3E39F353E20E5A9F772B78A72400B6D554967FE794EA66E6D339FF42D953EA4248ED2A2B8E956AF1299954217B72CB3E35D2BA97C9F6F652832D57EF9182C19538F757BBF0AEB5E12BBE3E930D00E2E08B354975E2BD597FB7CB4C284B9E6A1AD6C9F1BD408E368645B5A248237C4DBF1AD96E6335FD778B77D6E961CD83AB3DD08477B84DAFFA5AA1E4EE990F00BEC844149196ECF42CA9A5BBE4CD9D21D71BEBF96DFD1D0382D76D76DB7DBDBBD2603FD32D884D540410C645EDDDFDCD057380181ABA2EBF0E4295BEBA020300 -smlen = 632 -sm = 700566F705BD3BCDF0AC83922A728E4FFECB01BCE6A3FA2339BF8629669267612123E70EB5005A8A55D44F761017B4F0ED97DE2E8AEF5841017BCEA65E74CDCC25B7B6CFCF61E8CCDE2D5601134944A2909ADF1CDF40932A6C06C71B65F000A71A4C41DDF2DA229A953D123512B9D248ED0198E456FE79A31BCBE18F29D5AE613EF08E1501E299FC3CB1275F83B88C93E6690EDEF33E7D00D6D863AC47C6A6DB2E45D202B5E17FACF9A300A7622070DFB20EB230572D8D53BA077D364E0071A4C9ABBDBCE65ED919FB0E703A9442A186018492184F18095A29C7E8A236A4D2C35ED849009BA03BEC04B8771EB123C5AB695B4D0D83DE016C11105C04FB2ED2471A9482E854A86A586C0001A99F1524C340165F574ADEDE4FE033BBDAEB34A9B8801E5EA7841A4586E5F9F4010346E0C17A4D249843723CFAC06E08465B354800008C9EA7381CB417DABE69B3A5B0019366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 - -count = 9 -seed = 11134936880F5A11ED3504CF7B273E55A351FCCB10943BBBD186623EE6C7A13A6565C3080D1F536BFDB018F99C4E46CD -mlen = 330 -msg = 0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 -pk = 4BDDE3279CC7F7CE33A0F66CCBE897156E18028F13CE5FE7D5CB5679F20C13EA74E1578FFDF3F780816366B1DF6D9D95AD65935AF372A759EEAA7C085A150D0084664E66C9B378140C98C0DA787737379B522D498F393F1F3B26DF21C1B47C9ABC8B5784ED5AEC9F2F4727F11AF4C52CB2AA9E4B5BC480D3759609843CC80400 -sk = 4BDDE3279CC7F7CE33A0F66CCBE897156E18028F13CE5FE7D5CB5679F20C13EA74E1578FFDF3F780816366B1DF6D9D95AD65935AF372A759EEAA7C085A150D0084664E66C9B378140C98C0DA787737379B522D498F393F1F3B26DF21C1B47C9ABC8B5784ED5AEC9F2F4727F11AF4C52CB2AA9E4B5BC480D3759609843CC80400020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007784F25DC1C98756741962371A03B1D5A0EAF43C6567E4FF5480F9DC6B57FBF5BD2ECC6E50D6AE530FBCCA30FDF2E35711EDC33C1600BD0ED95D810215544F70788802B0212802FE375BC26D7427328185C49100619B9C21561200000000000000E00F6E58AB410F8F398E3B8DDAC26D2661F3C708DF014C81786413466F0EE4B658F3495831A28E7911F0DEFE07641AF453B9D61A6246400504E20C17B3221A7444AB67974340AFE0DC60543C65C1ED220AAFA6D1521D0EFB87F9FFFFFFFFFFFFFF78AA5684F11181FF4E8AD8B6E72CC2415F910248E49EE33778D23916956CEDEEA446A8BFE87F68075F8CA7E3FEED5FB20C407495D583CBE32E53FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69D85FB94D2BCFF234CB303D36BD21F7011FF5E16FF95C31ADA907A599AFA4F942C0A673BD358EEFA2D63B307C40671DA79CABF9E634B5A40A1F0200000000000000000000000000000000000000000000000000000000000000000000000000009CCFF8A5FA24E0D01F7DE4DE55B65A945FB4F3FD9F1607D69F3042E3B3B74292129DE081101784B844FABA0FA83DACBCD76269AF9F5C18C487C383211E2E11007BB6F4C57655E6A827F9CF1DDD669F3760DB59DE96E9B47316B87749EAD17D01B12A94EE6C1D8C4A46FCFB61C32F748B643A68ED76A2FB4149A505E4502B2000398723106F026FB92E29A40C2E7947E6C4C51F04C72B38A5A2096C7CBA3EA9C5712BC7D1D27520205B6162786AED62D0343B22EAC5AC931312DB93AFC09507001B8F6E2F8E82BF134601EFB4A1235364EAE8A937E5E5F84F80A18BC5A948CB7E4E07D385308009F880E7CAEE5596FBD403324A96259430F4C89268BB82D40F00EEFCD8DEC1B34265BC2A2B0FD6078191F46E2E40FD2FEF12111E585621933568A3BF27108A604B363AE540DD1DA73B17FA991DFB71A342F0E960E6582A3D1600130FFF1C3A945ABDC50B4D7642ABD2C07E1420E11E6B2BFAFC249BFD60CA340DA106CD5C56ADA843A378FA12DFC59598352B85308F047584382C5B4A035A0300676C425ED99A4812B81EAAFAB6D87170558D37A36F910EF80F7CF49417C5BB954D94035828512E243986580E9952CDF20777F847682B86F6DB7153137AB507005FFA3E75725E5ADCFA18B533D2B85FF18DD3B672DA8B482549A9B22317552CD9B1516AC1F6A9868A20A60A091418A5484C65F790F475DAFC6A4B447350801300292594DDA0F9E05C0D10282E93402A2C69C851D5A31BDB6CAF7675AA9B9025822936CBDEF5C77752ED04BE54521C8F302D88DCDDFF000A2975A7071F56590500BB4BE26FF06737D9EF8615A63DE3C568CB85DE2BED30E2C93437CB1528BACB504620E54326D74556CDB22EADD6EB19D998ACF674064F380AA4A7B59ACD6C07003715FD1C2AA0C9F8804738B32ADFC5B415ADB9F20C72B6F1662750D95B8F2F632F149CCA3E3E128CE5AA0A7CCC60235C6985AFAEF0AC4F3BF2C9262D3A6002004B9DEA3425BEA0EE43936EBB74EC57022D8E83E06C8723D1A105318F036902F1A91813F1D51D3D673D02B22F3908987D387C22BB72B1D6AA2AFB565FF1431F0047AF7044CBFD385C57D1ACDC336787D401D451B8B7CCA5644DBF0041F4B02BC47E1DB42DE33310BD7942E6DB9F14ACF40072AD9D86DDF554CDF2D8CFE2FB210003C81FFA6CF9AF7659C8C0F72F45A39EF30F854F52064B31E69DCB8978E343B2E7D9AF81C27DCF90B87EBD2AD691B938C67CAE18D002612BCFDF6107BD6C0700 -smlen = 665 -sm = 500A21F1A3B808B6D08826350D13F79F44AE002A124BC5579F445986EA90F46C9D019CE8C6002FB1B2C124F5D805C3BE8E75E120B3B9445C017BCD6059EDAFEA6322E77ED573950AB1A08E00FC984733C0C3101682C251983D619D71A5E2014451D6F59792A3D50BB37DF9E36C657A9D3B01C9DB102BAA5B715EAEF86D800B996E14AF7201AE59D6B2E022EAA7D2CA66DE67C86B016ECE00006D474C680B0DC41A9CC7E32D5B3480FC160057EBC39482D15A1D65DCC459187DD568E8DB002699EAA8F0CE5EA6546C80BC6ECA7B55DDEC015CCE6E1B45E378B746BA54ACAEEC6542F5C600DF386CE8EEC5076F5A2BFC17E62316DA64B201791959945D07D9CF63AA8EF9DB95ECED4767000181CBBD3D960B684CB78F47EF5057530555285C5923AA3637D0A7227FC3B3737C0303D2B7CF5EADAEC8AA50E852AD9761777EEA670131899F519321260016091AD12762030998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 - -count = 10 -seed = 98DDA6B97E89A479D5EE214E660DD6B5D8F6CC638A1CD4F462A0EC545F5B0B0A1A403AADF566F7B1C0C5FFCA29B36FCB -mlen = 363 -msg = 4CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C -pk = 3A08B58A901AEEBB7AE011FADBD44AA73B9C6398C1F20336C261C42C420D2B4EB43B5FC8F09B64C82B0291EF462E0794C81C4612961E9A040748CC0FF33408000A8E163462D16786B1E2D1A3CE7A8BD7C70B260D51BD47B263EF3A8F9EBFC20C6AFD18619324DAE928F542B8834A7AC8E68B9EA6DA7600EEF4C8256D2FF20400 -sk = 3A08B58A901AEEBB7AE011FADBD44AA73B9C6398C1F20336C261C42C420D2B4EB43B5FC8F09B64C82B0291EF462E0794C81C4612961E9A040748CC0FF33408000A8E163462D16786B1E2D1A3CE7A8BD7C70B260D51BD47B263EF3A8F9EBFC20C6AFD18619324DAE928F542B8834A7AC8E68B9EA6DA7600EEF4C8256D2FF2040002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E172728529FBDFDAF8964ED1EF08E4BB150535FCC7537028BD51A1E345C01DD12BAAFA82B272FBC26A0FB72357C5FEDC7FDC8F41865C777FE41A0E19D263A9EEB8341BCB540CB24F08C6252CA86850E7D18070EFB556206B22000000000000000050BED70192D9FE333AB2657EE7DEDC8C06AE764C6AEE8F6BE7BF09A9DF7A3F8ED37114455CADC885B0360975333686DE2722461216BB24846DEEACC8EAFA258EC7C9E1EC5B1D1B07E4E3A359A7D332C626A2E561F435473ADEF8FFFFFFFFFFFFFF904847D27775973004CB3150A0B111F594AE6AE62D6ACDBF782C0A86F0A9C97520A5FC60A30E67F046F9FDD5D4BE0AFAABDCBF905E8C6A5F5AB70100000000000000000000000000000000000000000000000000000000000000000000000000001F4944EE85F46A36227FA677CB6CCA31080E2F7D7FB06E5FFB465F5B6EAB1062F4B64045794CF26030F3D9554B8BFF2EFF2D313E65614D904E32030000000000000000000000000000000000000000000000000000000000000000000000000000253A8F12DC2FEE2968C77244E5871585A7FCEF9A1F486762F1E2AEA80ACFFA31BC5D432CE2D27EBD849A747B5FD2E85BEFAFA4E39403DA30A1A683AD18BB18004B9381B8ABC13728D81F745598F0F76D4812576268B27D479A378597D172D7ABCF3F8A0687FA4DC1C0E9430057CF2E05CC16093140365A7A1E5FA02A79FC1C00089FACF149A5F336190704138FA44A4D4D4ADF8B59D9F886DBE249A89DE0A283A7F4DE827A79EA852CDAB5CC6ED577CDE2793FD542817F11C47C39FFA25E0500655B9BD32CD6A1FBBD21C0D8C03C553440C80025E57A48BA9F667CC33249DCCEC6ED545BB93603A251A35442CD0511915B949CBDEC6D9D0610FF2A216FB618004A84112CC978930336CD66B13AA4300D3BE66F74C3D3AAA2C152013E11DA0AD1D99F2FD6F144B69A5F924AFFB5570E66187E4D24D3DC3F6234C47DDEF38C1100C270CE3899BFF48314401226A5EFD336EE8F3820A2620FF9CC09D6F9A004C18118BF6C0AC07DE1687B794E956CAB2D7C629194F033D68ABEAF0B2FE107261800FE163847372873A634B97CD2B79D425BB9E09E5EBBFA53A8ECC7B52E8871F0CD6B07223B7F1C5A1E02A0BB3D580C71983AAC9BE67DD091FBC906D2DBA0D11A00960A0050026D5CA3B9CE0018C2F631EB3E3B6F1B78D9874722F0590637AF53F352E380DA78FBFF973DD6E54F4DDF99897D15D08126FC578555E5A02C73900F0058F91486F2110F37109EA10B38F13F47EB1B731DB16C9883A4B41F52F78A5C1794DE2BEFAA3F684408EC04E79289EDB66AB553BC95F70D370B29C1FC218618002E3BDA29FA16FEC13C757DD86224E76AD5482B4AAAF7FE67163F39D1181378D583F44E22CE07F99101323697F2549A9BE8FF5F7931DF70E866A4FDD82FB51100CB63A3D5A497CBC24B8B28FDAEBF165A6A19FD619E419558B0D51DF458ACA6E98C6DBC63F21C93F0AF443D98B802A16BE7EB98BC8EBC5D3EE7FA5F7DD2410600B98C3577BE808E3E695A07A754EEEA682BECE0EE378CD6863CB9FDB69C5CA0120EC8B781F595012D378145E93254678FCD14DFB88DFF1FDBB0A9097EDCDE0500DE7B4C75FFCB54135062F6F5EB6113B4069175A08795DF6DE1E20F7E1593F270F39FBCF38C422477997C169983A028A3CCA2FBCD86210F6E7828E86A4CEB1F00C408950B96A9E0DF76C2A6DC38646218469E1B767E3B2C3B14C312A4E5478D8CCEF71131B585FF79FCE927C4DA4549ACFAD443ABE59EB048C5B461B525A70000 -smlen = 698 -sm = 598E12478755F04053D91A32CDAA28A679DD017EDEBFA3C4782100E153851193AB41D5678C001E5F35383C332C66A8DEDC9FC02150A36C7A018B43038B752AD1CC711B7931A6FDC2E212DF0184F2F106A01426791AD03C8526046D5B409800ACEA34355C0BEF3C87F568852FB7B9BF3C4201AAEC5F0F94A522617D59FDE14E7828BC47E00067578924373BA48CFFC23EE9377AA94B1937008C9BFDDEBB48041519F33298D95377006EAB008862AFE515799AAA7DE0066D741C0651D1D8017FE3350F8D3FAFB842F378514AB59D43B44D01ACF4E1C2AA6051B7A15747D4B4DD29F7E633017EE6CD42122AC0FA41F6C302C96998B03F2C0045FB66EEC71BF8C7D2F41AAB6DEFBE4E9C3B0101D5A9ED7C0B86C2D874AD969517AFD3714B29E63F71FBF1A3D4A150136409249804036C546B1A90730D847AC57955F7EB1582A8AB01BD2733CD92A44E1ADC3546E110C6024CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C - -count = 11 -seed = D34A0AAD27ECAD31A5E08E9A2D7901A9B85F864D9B1B46F40CDCA0B3615B2CBA04EF82AD7BD8CF627C3E861477030BE2 -mlen = 396 -msg = 5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 -pk = C23D4F837F2B3EC5205107362FF1319FE2322030148DDCDBB6397BD334D20FB83494B447D50FDB22EB9B8D0E276A3CD6AC762414AABEB637BE78F3C514691300511D48218C0F656248FBF72D026BF376B142720498181C81E70CF7AEFE99446A63FEFCC64AC194AE65FC4496280D0FC84AC9C34C41166742FADFDFCC45D91400 -sk = C23D4F837F2B3EC5205107362FF1319FE2322030148DDCDBB6397BD334D20FB83494B447D50FDB22EB9B8D0E276A3CD6AC762414AABEB637BE78F3C514691300511D48218C0F656248FBF72D026BF376B142720498181C81E70CF7AEFE99446A63FEFCC64AC194AE65FC4496280D0FC84AC9C34C41166742FADFDFCC45D9140002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ABDC46F358B172CB3721FCBCAEC3FA2414D559561EAE16994088C991CA76B64742B64CAF32F4235597F93CE4536B34259D683F62C7F94A4F6307BB5834753A7A8A7308E4635A484D0C7F756C81FBA1F7DC9555BB52F36A7AE60800000000000000A07E108E1D3EBA58A210F8FBCD5806D21727598C8D39BEB8B29128F5DC140BB3F198BFC0944585919508434C20E58B848658B559A16E894DAA6795A1266BD056714733D58B95FBCF764174A675DEFF946E71526417CCDD6747E3FFFFFFFFFFFFFFC8A12219704629B30DF267BCD3E176DA7ECA7B24F65C5D3F7C0EB4DF11CD7DE9DBB9EF0F101A6F4091062F00A88794A74D98D3AC0DDC0E50DEC10000000000000000000000000000000000000000000000000000000000000000000000000000004BBAC5CBA80A8282F9CDEB66B77F7535DB31E7EDD25C2D8F96F6329981E33A98C517F10DE78D4B60E5CFBE405E374D351E927C286DB68858666E010000000000000000000000000000000000000000000000000000000000000000000000000000BF719DE3C13368C49BBD1057611D595CADBBA47CAFE589B6ED5C84D80DFC10DAE52643F40DBCD086469947CD18A3BD4F9D6A28236E57C083AAB26D129FBA1F0089CCE4F3631B0C2FB16E5D28E66A88FB4A707C11C6F87EC39825A1EEFF655C0E835EAA4C71C7C5063853DE42EEE22D1F845F87C4D5FEDDC6E49187A5C75C230096826BF3B7FBE121F018300787BDA4BF2701959BEA6747822F8268E8EF1DC43C9D9963D8D7B0A4F2A84F50412AE332CDE21D9DD727E0801693D6D740FCE7180003DCB3A297FDFDAF92B55FE082A11898D6C568212E150100F48A2B9DBD75ADDAD4D897A1B735FC121BD4CAC8631BEFA66610E3CD43655D31464019EC33DB070023F4459C4ADE2361C7F309DD4B234A3C972E0BD89797E51AE1AAF920B4E9B2D6E8FF39E6BCAA45D67D31BEB0DF55CC7D48F85B7D42D1154F3718C9F9DBF11D0052B871B0DDDD236DA5104BD64DFAF4D6A1317BFB251431440AF7FF7B8A19995BAA4517E3B08F117AF29413859544C3B995469C6ED7FF091B70939386D89C05003A1C5398825CEA58F20DFB517D8EA008D18282EA05FD061D13F5130D2C88E233D5DD6AE90D110B765D4485B5B8636137376EF16F8DC4C24E4533010BDB521B00AB6659FD0E23C4EF9CCE876AC7DDE1C8B11117A75B89C343F75E56A3AAFF660C1BA06EE982C3FC23192DE677EC5C898A78E6E7C12BE3DAFA5072CBCF63432200A2DF1D1D8233F087B3307E9E57553546773C04CE692FE146E271C2A0D6B6B054F65E980DBA95617661129768B6997FD4495C339B7736A48C0DB754BD9F100200D5DC688E684FE8837CF60F8BD5CFBB5CE36A87CEC1D1B59E1BD30673FE4913B05DF62343CEF0A8F439B8F157476D88C918F515BA50F6515D0385E25408611C002D290F673EA79F1138DBAE33C2968A07262A5F813C18B232CF16EA5DF7CAB70EFCAD9D4F92E1D5B16A000346E4D231333E163270B5AE3450D8F0F78029051A00BDB9DE46A0EA2DA1B1F09E988542BBBE7A988941380FD29966369B24E61E98E3F1E67EF61CB718ED96025063692D90D9B0A7500D2F3CD83A86E5786399D2160058AF9CF14FDC6DC62EBE9D93CB9E431776F343902B7ED735B879C328B2C3E5493690927AE215C450733738980DA0CAAD1BAFA6A5D8C0F1B5E3934B937CD90E00C7469E7C4FBA23B1D753D51E5D11965C390CA61EF2B5376E491B891366B3F9F87B69601B782F660D331F8C1E47B4B0C16FD8951EEB20A24878D1817CA7B41A00 -smlen = 731 -sm = DE38EC0EBDAB6B6C1DACFD76568E57E1C81C00F1290CF78979D774E186F50D56673E001B3B00AD7D5D6971114CA5879823D1C5FEC76630F400AF3B97474D6B2E864578FEF4B3EA14B332C1017DA446C7AAE52B9A0144F05109D36A7D62F50183CDFF757685324823D3F538FEFACA9D7032014CB94C171EE91F77A303AE0B53929FE5AFDB01B648AF8C489A459F37A3519640D22E15ADF6018B3BF60FF7A9BFD358107999D25083F4C8F200BBFD2ACF86F61358A8C61D25A56AD51368BB0166D8C131D50C52A69E7F835321880B9421AE011F9C2236F610527FE0A1D444CB6678C52BCE003496C7E446200B403419DCAAEE18C1B5853800F56C39EB25EEA43400542BE193A2622F142F00005791D417BA81C227E168B5D9A2C75FB91EE02F0D055B79EA66582CDE69E440D30203CD0226C6A49ED87F4D3D0DD509503FA5EC1300C2AA90566AC486853E6CA293BF4B045C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 - -count = 12 -seed = 4FDA9FB6929E3F391901D69FA0AA2F25A9657D249A620F1B9E305A5965676BA76794CAD3355EB632579C3958CA7D443D -mlen = 429 -msg = 49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D -pk = E3DD4AAC88D86BAAFAAF8E306BC242450543FC7BA4ED87B503BBE47EB6903A4232D3A78A8B469184F7D8C4F5A115C3AFA6189CF129F309E4BB3167FDFDC41500DC06F60DABC89016C7BEE867A2C700A2044E2A5861B2EE05FBBFC7FB9024E5149FE0B5D8EC1DFFBEE2CF693EF6DF63ECE14D8E3396416D146AB3AEE039130300 -sk = E3DD4AAC88D86BAAFAAF8E306BC242450543FC7BA4ED87B503BBE47EB6903A4232D3A78A8B469184F7D8C4F5A115C3AFA6189CF129F309E4BB3167FDFDC41500DC06F60DABC89016C7BEE867A2C700A2044E2A5861B2EE05FBBFC7FB9024E5149FE0B5D8EC1DFFBEE2CF693EF6DF63ECE14D8E3396416D146AB3AEE039130300020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002DDC963632518D1822E91B82552D067B805E77CDB39F3EE6D05AF601328A0C3A368013E59E61C886FC14497BAEF42463C68AA75DC50EC7CE203E6F042B7209C4DECD045B4638C2B6A7D1F3414EC12C2CB6329777758010C6E80D000000000000004050A725B384CEE8004896DB6329F6D62D7AB4C9EDEEF80D224EEE1CA22EC0841FA8357F8EC4F6FC80D4C4F0CE272C06661BB14BF43F3D1283A7E3ED8D892BF51F6C69AA32E0430B8E8455756A0D0B7837AA60481859DFD879E9FFFFFFFFFFFFFF201717C514D3FEB88FAE22163CBB65926AC3A22F7CE419B4A567BEFE4D0714B7C8CA2DE5AE653C36EE05B55E5421A9637F7E88026EF4C24DD714FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3256E1F88ACD80412BF2849DD4189B592BCCF9E16024584FA374B542A3B0BCFB598717BF3204EDEDD1D22D2BCE349010096FCE3FECECD3133A20200000000000000000000000000000000000000000000000000000000000000000000000000002C033FE6378330B42E1985AC7E187A1ED81B846DDC336366B685FADFD8DE458DEA0BC9610D8A37177666F5AB381B3F7B86DBA3A4C55B7E13199AA9ED13B52200D034DC485BC7B1D4345842766FE1B603A7F8B3E696590DF1F2DC32AC90011A6BC26EDB583348C0F4A71023E96886D31B4BA5526E3C895093D1BC22A8155B070006DDB9B15AF3FC6860B4679553D8A9072B0E3A7207D6200D9E1FFCABD1EEF128189749C6EEB13E829319B19B0FD58ADC5F4148A856613E49BA7F679B90B81200E776A9E340CA2B913CE2AAA3D21BB1FA4CD6D43470DFCEAF620B1D042238560899806045B61B66360D9E34A1AF6AD2B022F3B0836C0E7254D43630C91EDE1100CBA735550BBA70A021BE5AEAE72DB20CC14FE031A473329CED080B7603E50BA3CD1B60E37914E7A163F6D8BA0463A3B5C878F448D2042AD8DE6D37DA6E170B0019091EF1F1FB06186BD7751A64B4080C44D0B78230C172D1E992764C7505667ED0DE575A755DA607BBFB201F18E1816615D820DD7F53CCE205F68BDD11EE2300440925335EF38190BC5A603311716221BE2ABC2CFB3DA75223DEE53425937BB51EC84136C2BF983B1703F024666D98BF4018345B9E4F32EC131A6B7D92360400D24F40978B10CC0265E8FB858E3E2D82EC423425D04952F5FD80DBC92791128448C70735765408517E11008121B6A248DE0FF378C2E1883006308C086A8B0F0022B0F7FC407CA205A99DCF114578B97175848CADF02243443BA194797024107EF53AC21D3BD7F81C7A6887CCCCBEEE03F4EA9BE5B62EE02E1557BF43BA0A060000F70EDDCA719845F15FA3614F370F3684FE453CDE48BD535BA4ED88591CCA973EA4D56541CC91903C6420D16CAD1CD5DEB0884D1772E5828CF94E3B9A2B000010CDDE668E8B5B0FE713BAF570C8724EA511132F04C571731AAE3E5AE7BC274CAEF35253AF705717F16BCE41702A4DB44BE58C07AAEC3126C2A69A74980C14008B28CD23E6401FCEC8871EC2047C09170D8BB6D2E8781426FD4108518797FFC4BDC91CAF04947DF21442E81644D14AB9E7C7C93BC34F81BA410F04EC90A41B00119CAEE75727772AE928111031317A0FE268C53759C8D498E10B1727FE8B292B132AD5C4227C3A6696270BDA5B86040585D7D1E2CF0A5A28349266DA58F5060000FD42DA0DBE4734ECD0C9A3C2B8824CC80AD37E7C11890F8A0431579896D7E92FBCEAA52F6E57D3F7FAD3EE2727DB4910B06A013F8AEE9B159BDBF6C3282000 -smlen = 764 -sm = D2854AB237A1145D0608CB0CFD6494F2CFD601727658DF10085B913A5C73B6475B2292F0680111109E8480AEC26551FA0C27891268EC3152003218284AD308A66BADA8AC31BF8665D6A77E010A7B30F22E6E58EFBE4E551B4130BC701F4701C54BD502687B21CB38CE4E7DBCCEE9DDFC7F00745DAAFE6B5A2435BA9764FF3AEB1D6E0DB20050F3CA8B88367B22DFCCEE21A6B8AF0EDEF701DA4FE13A613907CE177973F2C4960E15660E0180AE4C5FFD407A4451A8B286D5E7863D7D9300630238A7CC499DDC299B0806A4DFE12FAB9E01B2A3678DF16F06AA3E9F638A4A1AE0EA3ED5016689E2D7EA0FBE833B1546A71EDD08D5452B0091E291ED480896EDFE50D55DF29AB87632F70001C56AB6B8B7508E23554A97DEEE58A2FC51CCFED9BD55F0D30024C5B716A34BF2030319AC4133945F06EFB844FFF6C3C30EBEC80B011207D14C52D276B8CFF81E88AD4A0449755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D - -count = 13 -seed = B0E6A23FAB10A7A333E3720BE00D31507917F39C5EFE1C98CA18BEB5C3101FB4479B478A1558C4C00398C55C9822FC44 -mlen = 462 -msg = 439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 -pk = B6ADCE342D2017A36DAA6C1A6A38B19106C938B111B2F7F607C05FBB5557CDD59F25E9057AD64B0CC9A17AB398C9EEF77DFD966FBD05D058A88A5FDB10C30400B36C5568A1C5E6E71521C12A1794FE8C17E47C27C6FC9D69AF1150948B0A309C83347D6AFC0E0A0E01159B1C322539559EA0ED3222ED48259AB753728EC10B00 -sk = B6ADCE342D2017A36DAA6C1A6A38B19106C938B111B2F7F607C05FBB5557CDD59F25E9057AD64B0CC9A17AB398C9EEF77DFD966FBD05D058A88A5FDB10C30400B36C5568A1C5E6E71521C12A1794FE8C17E47C27C6FC9D69AF1150948B0A309C83347D6AFC0E0A0E01159B1C322539559EA0ED3222ED48259AB753728EC10B00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005A671D33969A1DD3F4CAACFF7B0DD98551721831BBCAEBB3EEB71B0A8C5B0467806A071BBC1C6C1DD5753DB9D85218E619A6C722EE59BAEEAF1DE6FC3C8689C62A0D6C16B79C3889CB66956163FF1F9BCEABBD37C6AF4364890600000000000000D38EBFE0FDDB0FDFB28FD39C356E280AB3757747DF188ADB1BB5442D2B5811FEDA7BF183CB9E4E76669E7F928E97C77D84A68F1C5956F45488DFA61A4E01E63AEABBD24AE4243E4470559DC71C8D21A536290EA8E7FE2B5325F1FFFFFFFFFFFFFF3D18129CD9E910A267999A6A7BBC3C83EBFA5B78A32C44E96735A3CA7B55E4B5FD4566AE00ACDF5DE5BC5A73C997637C22A94A6BD283A303A805FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2AFA705BB520AE82DCF533AF8A50BC1223D62E882D580CEE968432F09A1BCF336F82547B29F3F2DE2E91092839D697751E60D6C21EE6E82B6E102000000000000000000000000000000000000000000000000000000000000000000000000000069A1048724935BDE089B8ACA902AD8694969A009030D15AC3C210DA06B487E2B19C1922C5C3948B539A25967B97EB294262FAD0EB464228D2C8A99D257C00100BC21AFDEE6D73E1F443578F1189E8E05EC3A3A940D04EA10A307AD792E2C5A32E3F3119BB2F25B59C782B4F4ADF4FB2DA43119E229A6D209FD5963936E28070099540031A2279F3DBBC4B329FAB27D1E9BC2740D9EB0E5E8E4A98DEF6FA4CF657C552A3BF79ED0AFF763AD29A12CF4E2FDC401D83502E667A740F4BFA5E107007E516F4175D741DCFEAFA3F20000C60D5F6861965B7DBEBB41C3126A2157E8F7A7C589F06A2229A69983A75BCA2F8767A2F93F1699F35CD9F3A2BFC80E0316007935EBBAC2167A27C8B4765F5751B9E419C11C05490E36ECAA9F8D22EB74D2408801F0E0D9FD1CBFFA65FD2FCA314091357A902FE3446E13CE6A02CEBBF80C0069E34E48486502F3E30C80DF5E8119D977211631D1C01BEF91D83C5889FC11EAD310E9961071ED3F7557438E0CFB6A2D70E518B8D79F17C0C2919712292C2000AC37755E398E1168D081978643149A3DD198B4220D339A9BE8E98151AD979C6766C09AC55C19811242DA3DE812275F8D0111D10D6D240751EAC7F1ED8C2A0700C6E78DBD632232235DA9E011E42EA457C3C7B25CB46E70E2E5F820F40D053F150E0FD5C4CCB519804E839C938182383BB064CD9268065EBBAC107D81F5AE170036DF0F8C30646945DE25AC26F6639145C9D2B93E52DF07807ED311777045AD87D6DF1ED99EC299FA7E53D1DCB01705DA627353B30BFD1258F2FB26E921731900575BCF60A4A18FF2C5BC079092EF08DFA48A9631329AD9367FF2A0EDF0C75528129AE0246F1C9637E04E7C668110E1944C04E6744949A59FCF5F53DD338D120093E34F5B787CF86FBBFD26C64E495C2BADA6461CC41673C64AFEFE55E1DADB31686CC6B7A9CDD71AF2917A5858347438469A536FCCDA4C9F49FD6279FA6C0F0024894839DCCF80211AB7C47C8C18D35C85D344254DB17EA443AFEBE48AEE67C834722B2813BE15E825DFF70CF933090DBDBE7EFCA0B66DA7CD3CC98954DF17003C1017ADFAACD2D8DEAD19E7D6F6F82D46A61C92C84F5E1B193B6F5E7C2B0FDE1A8BD4CBDE7B30ACA416DB598BA1B67ED9BE03479E34AAB2ECFCA7CFA81F1C002265B320D2AF14A04577C634AE3154EFEE014B88673D2A153AF07C9670C1A3A108E623EC7F2EB35E17E2DC74A951DD0C227D14D26E7664959E469542B4C42200 -smlen = 797 -sm = A61A657A91D5065AD495A97832E4A31E618F00527997047FB60DA77578621CA12A5467348400926B590977266F98EC467116476F9F3C7E2E01ABD8978406A0A7328F7220EC8F58E207F4B0018BFCC2EAB1752A529F49AF3156C1C978C4100162072F4C0538E18D7CB94812651A5B92008F00987BA696D184C7839DB68BFCC631CDB9A26600CAA52866B51E55891273C2730C6E5794CC3F01EE9C3198A57C80D416810DFD70FE296FE61A012C1C618D2786F7FBFC659DC0E99CBA73D663000B01214E0B636897592B371F8F676642AA50014E9BB518F8740628363BCE7E45304FA7F82500F6BAD1FCB7F4498E4CAB8FCD1850DFF5D76B012D990FD80DEAC8BAE8D0376640F11E0A6BAC0101BF8585F27203F79486E4066CB9FFEF436682AC261A040BC9D8731F1306B7823103007EBE4093EDD79DD5FEB9F45D271041B25B4500E5E05BAF8E5D1A53DC6D0449672202439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 - -count = 14 -seed = 0A98A2BD2B9FF42CFC18D3396BAD052E1D0F3372854DA69A318B142F7A1AAC609C3861263BD8FB0549DA7266784DB8B4 -mlen = 495 -msg = 8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A -pk = 16ACC114F7509229E491D320B9CE8097AB5797B34F632195DDB6CBBC9E0123317781BF638739BFD66D3A852E82B4D62350793C1CE46945F44364E0C887F7220043C6D31B6051ABBCE0BB23A6CEEA602A3879206C5CE2D615D21FA6F7D8E8DE7A091346C2C140BC552306179087B8270436664C5F7560B8480B20DB571BD01600 -sk = 16ACC114F7509229E491D320B9CE8097AB5797B34F632195DDB6CBBC9E0123317781BF638739BFD66D3A852E82B4D62350793C1CE46945F44364E0C887F7220043C6D31B6051ABBCE0BB23A6CEEA602A3879206C5CE2D615D21FA6F7D8E8DE7A091346C2C140BC552306179087B8270436664C5F7560B8480B20DB571BD0160002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4B6AB16D60B9E85EF3BB7BD191DA4C322D0400F5645662760D9C4003E877E677BF7A96DDDAF9D656F6529F1A57091BB57B8710AB28FDACA2ABC333A9FCCC0BC419FC2A89D97B70A298588EF38650950E84523D5611D5421E202000000000000005FC180D91E1F6BFCA68EFD37AAA228DF5D7C100FC830AF06B88A50433652B629C3A6C7E28A4E7D5A277C9FE8CE5C63D48A4186346C2BEAF3FE840BBE4CAC51091CF688C89D67EA482AEB1EFEF769D1FB6BA8D4F6A7DF16458BEEFFFFFFFFFFFFFFF7F81D8F9CF312BF4A4DD924845FE5491A80A08DA9BB293BC9E404D44B75C807E7B2D872575BE13A77900CDAF65FB52CBC4EC59FC9023055ADB0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30639D9E6EC417C264805BE49604C5B2AD8F1415067883E298DD07C15C4130E416490E05DDF8CADA8AF32FD44FE12AFDFE4C14E6B50F80375A2C030000000000000000000000000000000000000000000000000000000000000000000000000000BB0684403EB66859B4000F1D56A89112793C0833AB524C91909D5DF0EB19DA42BA6F50F5F5003FE5A36667727C7E6422821B5C183E1E53C9D0311AF8BD0A1F00FC00FCE8C5C119D88D01228D30B7C9F15088C2ADE5A84E235519039E839410F15D6E1C633E1CC6C4216B14685567A5E5329453798DD66DB4813BA68B729E1E000BB01E8A26B10A01AD36E19C533BBD98230C26AC513F3B55BE676A8E1A7F15105BD8750E7F594DE7E01E3D425E04C4D2106C23CBB327B344970FA7E5DEB81E00F038D35CC1A7921C38571C5841929F882E1203B0466E23256118FF7178C89921262020B460EAA947FFE29D043170DE4AD00059E4EEDFD3E7CB8B589867F60E00E081C5F5B7A9341019191AAC93F0C90D3AF922B2954A085635EEFA23519CEB2A72C5F71F9BCA6AA12D1EF1D242388B96C2E0696EB252048D57520F74E51403003C82A0A715420880F88F20595C52EBC2CFAD4DABF89CB962BA70D527CEBFE8FA747E12D314170F84D7F1398F3F4B972FD268C05F662EB848D4D56DC5A230240015243AE4C3C60426568D2D69250B4A4946BBADC6E3AE65B246A745DFB0BDBCBB79EDD382D4487C398D9CAE491161B27CB73C6BC130C3C801907FCF7BC8E219001BCE31900E0812C8E927A25FE1DE6CD012ED0E251C5BA76633C5F7526819F04327CDD08E1FF9141CEDA7EFB7AD6F6FE20A212FFAF0B53658CE36ACFD70F81D00DB60DC2DA1FD80266CBD7DFA90BF27E5BB4229350740803F60E149F96155D93D857938CFCB4AD3C5158FD2CC5F2FD2D69CD7E2DB2CC58AF443545E7BF9941A00F3F9E0B1D20A9FB588CEC7E8D170A62FA6A894A1CE8C1143DCEB4E6AD5A471716CBEE39B37A174E8EC5498A302A32261C077215ED8BF24C66AF9667B00AE0A000BC51E12195EDDE3F37FDCDE5B8066B98F60C4B09964267B18BD371201DAA948E65C3B8AD60B91249F399320D54ED6DA09D04763557964399B50CCC1D88E0F00D8D2A172FA702008EC1266474ECFA2ECC73C1957E4876B2A641431C3F0B2359BA2E658AB225102854BC4194F038CF47A64BBA9B27F40ABFFBAD8F8652C470200CCDBAE5936204705E47786F9693EA4E306BFFA51C9378A85B4D84CB814A292B635E1B7CC6D5041877E8E18FAFD0E275D6EDF00BCA6DA8E433A84D84BB30E1B00FB7907F0B7B600F2740C48D1402F2BDB3F80B22F4ABCFC17E843789BBBD668081B747AB2740B6BE5F1AFBDCF76FAC8609D95BC0AD91B1845FEFC97F58DF41B00 -smlen = 830 -sm = 30E8E6D9393BB4DD341CFA43D830E8FFBF990044C4D90CB50C4F69BF9361D66ACEF3E4FD61005A95AD107E9F2445F11C4DF3703B4ABF672900313069DA90B58DC017E4F0E55294A83BEEE4006FAE2E73E06B59E9CA998D74C30CB01C33CD015C015E3AB9BB64C9C3892BE78B5FCC23D6920186359F487AF62786C8A0DCFF06234DF5059E01D2A7E295E4A0C223136A7D975AACEE36F85C014C4F34BC51AB562E8B64E68145C7DAE23EF500DBF9DFD410442998306F7C4FCAFAAD349C2B01D872CB47A942F7334263BC9042468A99E7EB010F78C0DED13B2647AE66B4B32D608B52BE310015F57EA75CCB76351FBEB045C7CF5897D81701E539FA05A2594EECE55CF8548155DC11247901007B2A11F3A16AD63D70C57FD811C33FED547F88F9A495C4CEEC18FE8199B2E5AD0101C118DDD9EEE4FCB03172A011F5A061B1ABEA007059D595CF526E2330FF1AA7E725008CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A - -count = 15 -seed = 9887F1FD854241A301EE0120645CD8E119B43F7BEE11F77A835E9ADF518C3A51CB76D86653FBE73AA716264C146797EE -mlen = 528 -msg = 9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 -pk = BD1C424B5DB5A5C593B8B8652CD7354BFECC87C6A791C267999CB062F29180D93CDD86E1F2424247195987EC4975F73250CAE5567DD9993EABD9F758624B0700F9DBEEE34444A7E5D5D6EEC65D9205DB34A121EFE6AD82D4C2A2D897127D4126FB886F61AAA37137D287EFE40BE0FB71A4DC379A041FAA232797648BAC891B00 -sk = BD1C424B5DB5A5C593B8B8652CD7354BFECC87C6A791C267999CB062F29180D93CDD86E1F2424247195987EC4975F73250CAE5567DD9993EABD9F758624B0700F9DBEEE34444A7E5D5D6EEC65D9205DB34A121EFE6AD82D4C2A2D897127D4126FB886F61AAA37137D287EFE40BE0FB71A4DC379A041FAA232797648BAC891B0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F89AB8DFC4EBC7F43CE0CF4CFD06CACDAD46C2014E248CCF38DBC3236BE5F549353447E10F966CF0E82469E496F80B7F5BC0311448E713D62AEBA5B17E197B25161D309905D3C6059BCB313FFB895E991FF920E5B5AF4726080D00000000000000C90E42E06868DCE88EE717F193012D0FCA792C2CF13330E100B33E7503247F2AC21B41531365C8CFEA1EF64B7F37C4DD0BC27DB05D0D00E408FE8266D912AA190379F42DD1827A9DF2BC3FB589E7106A64E7DF2B01396CC747F6FFFFFFFFFFFFFF7F18CA483332C87B6727227D79959BC584728EB44FCD49E5B027032676B5EB9ADBB5EE956906DD82E63DDD6AE034CE6137ABD746BB5BFE9AED4EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4B2E943369E9F02BD30EF4D28EA80E64F80178D0AE1EB999320283F94E8184A7C099DB34BD71303BA5D7D6890D1EC38B2AF3A8D12E56C959514030000000000000000000000000000000000000000000000000000000000000000000000000000DE912A599A5CB50541569FBCF26ACC7169ED0DDDED538D24739E15DAA900D279A811131C0B72E0F3A5C81BF6747F05A3E23FE1A161E03A40D6F7BB89B061200026E016CA71E5E861F704F5F2A51B884A0FDA4E4745AA50BD777EB8CBC5A5CB328BFCBA64A2EA66B2061F4EFBC5F9CA3FBC4565F21726B13D9D4993CC93322300E82986FB23ABB651C557C9B4427908562F27ED297CB22309FE5A30888BC3011BCB2A960159876E6C530F5E8322A62B582BC24C0218BC0DA84A378358781901006F78032B027770B1B52A5728D62BE0A6F3403953731C03621FB80C8C8D3C02FD2BCFA7F9C0BF7152610A98AA9DB8BC18CDA3D4834B28273F35DFFCA6E53314006C9E4288E8B7D3E488F3149E68CF9A9A07AA443A165176498B7BA1A0B41EA40FADB6D73F818E0AC28DB8B5367008855A3BAECF5D1F85E500D1ECD272F0902300E941A3C7825B93B1E5546E8E94F88ABD1BC9F080240625A64CC5419239DBF8E1048F1EE3377113A631E92A870C368782EFF589EA965687B94D3205E42B7C0D00A95F0392BDAA5A054833FE4FD4FF2E348AEE29A94461027422803B15378A6038B0673F2C7850A71A3553190A5DBDA07D668C56233CCBA44A158B743A59F6010037DE53FE687DE298C375656C722B23E83D2F51F51E0C1E2872A4BFE8619F14B8849F16786AEAB572F006017911CAF5D26961FC5917AB640C52C897962C7C1100D442248906E93994B09468B0FABF2BF5E2B2BFA293DE5818369D1B629E3EEAABB7AED0846407734D9FD9E21D9B3D6F613B99F6C70117F984BCA900E231652200295064E551F3902774138B3A7B94F01F74863EA3700F02E29376F568B7963BF462982CFA0A15150F2B786790C098A7FE9DDAAB33BD9B1CE15B6C79FB5FE5010000E4932618C498131EE7AE12BD2621D61A3F1600476EE0F1DC3AD47308A6B77CE5476BD8C2810926882EA36B5BBDF361940FEF41CFF4D2867E3DD269A4E801006B900EA2A89BC813BFF84A3DE35A3FC55A568DEB1F8B4C6798BDFFA76EA2A8B99085743E5FCCF7C2941688816ACE0CFAF621F41098613AF0C560F2290DFA1C009E246ABD0F24C2612F732B2E9958AE4D5410C5B553CA6423F85838CC39634D2D3367EB8E74C1126776CA75516D9719774FFFED74FF7C54643AF81DCC17282500EAC1240DDCF81B6A79689739B426C8DA804E4041C5E94FA82BCA53787F4341E890834C8469E24EFF3E0503F4B12AC26FE88E6252442BC1ECEF9194AA12E72300 -smlen = 863 -sm = 583EB8A22C9AD869FE7E7CD022D50451813F0001254CFF426FF8BCF7F586F1B36C954A52D8011D91CA4AB9E28EEDC2610D5A5C9E4D03EEDD000A6C78E2342F3F50497C0E878B4011C3E54B00C8C6EDDACD16AD129DEBBE9B0F6B546198BC00182D7565B7F97A0850872604957C3D5AE0CF0197E98A05CC1F24892EB326BBD635E23829B8012AC05D272C532F944304A2DDD12F01A2FDC0010AA4FB03C0EE40F510D9A06E5D7CE158704100A0F1A2CB9E23CB3A5F8216DEC12AC31834FA01601A2221ED2EFEBD47C3BD40CD28F2FD10A6009C69C6BB659F4279FBE87FB865B3C2E3F47E01B324C67ED776796A5B13F8813EA7C7C5596401E053685CF36C51982D8A42C692DEF0C0815C0101B143929F0FD3BF0CE8F45574A66271FBA390FDAD149EE283F9D87348B1DAD8D205014EF27C0094C7E7D26FBEC5DC3DD8205C602100519AB5EF882A2907A6A76252B2B5029B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 - -count = 16 -seed = 5B485527C3B9A5E5B7579950049CD357975D4BCFEF83FE33C087ACBFCC10A0BE4225E7F8A5F77203B5FC7C0B5FC0E78B -mlen = 561 -msg = 922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 -pk = 451F33E8C64198D6941BF55E46CE0C01AE0439401ECDFB52946961EF9E3982AF5DDA3968AC44EB0DEB1C8431FB70DE51538EAC729C97A2E81A16FE4E83490700FE6A434725C4C844D25B342A14016E128BC16E24C34EDCB490B3C5DDBB2323ABE34B52C1872175D48B160E860064575E77DBB6D37E9DD3D544998E50ACDF0000 -sk = 451F33E8C64198D6941BF55E46CE0C01AE0439401ECDFB52946961EF9E3982AF5DDA3968AC44EB0DEB1C8431FB70DE51538EAC729C97A2E81A16FE4E83490700FE6A434725C4C844D25B342A14016E128BC16E24C34EDCB490B3C5DDBB2323ABE34B52C1872175D48B160E860064575E77DBB6D37E9DD3D544998E50ACDF0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008EAE54136690A9C4A0282DD8670764D9A5B41155719112E6D427E2B2596BB378E9BB0E1DC2C7B855FD2B9710B91597219E8E6034B9790E0E0F73550073240E113EF778BC2D6BC5F76B193E2385022290A2F779A079D14030AB1400000000000000C513DCACF6FFB919E9F18AC70842A4710FA36A00764B24A4DADDF62622247B8E57E00BA107C101C1AC655CE9AAB174B6D4B66B8CE9D693EC870253871B128C2F8172F4ADBC990C790EF40B14EFF16C88CBB80AA61B2E5B55E6F3FFFFFFFFFFFFFFF599857355666E05EB47968B564E6934B78DBFA56357312D914A39C2DDB6F8F399ECFAAE2264567C75A9E5C5FF79084572F7671ADCFEBFE667580000000000000000000000000000000000000000000000000000000000000000000000000000006A339E5E9C8959A9CD812857C390F1FB0098D8EC33740993E98700DC714F094FD977336F45F58B57501682B42667F06AC112BED3FBA45F623109010000000000000000000000000000000000000000000000000000000000000000000000000000E45241C74B7C341AC6C3D06ED5A38556B7A0F02731FA40A56C3D14BDBEFAF41261E486986390A12DFF9A6CC6337A01F49A26EFC1E0C42BBAFC519F27527F2300EBC0D73DEEEADA749A51E9D3724B4A79A9120D27C1752C9A6AE9EF2BFDFDFD7D92507F8DF8B44943C675471BBA436851A0DE080799DD2A708EA499788CA52400CD1DF4F96ADAB94CBE4321E55B541DE100A8E7147C9642A794109370693B5FBDD712E3BB81EC4DF2ADB7811A2861085AC54387DB1C55D0944CAFA417FD882100920B85F550D45785BAE8F2565589BF5226B2FECDF95F0E0A7D8FBCD35F861C082745AEACCBD5DF95D3AA884498114FF938D7A1570DD93D31D8E7801832AD13007E270BA423FB09886C1F549BD7680AAF5CE04026F42AE99ABEEF4065055979A2BD466F7DDB461C9EBDE070AB3325C4A5187D4484A08BDF6816D242C85C671C00656DCF3B1BA269A4986BC3E71BBB600009D01F3BAD35AABBC2A2321A48552D8A7D0B4A75F2FFB93A7875E45D60BF9F79229E8F417C367C3468F6FBF2AF572300C9278498E96C1C9283EB01FACA04C1D8570EA207477D06F7F1A0AB90DC46BAFA4559E468BFE5FFD7B7E61AF78E06144A0C3DD9917D2212D36E496E2B695D2400C87B79AF2BB0B9F2368C7069414668A5A166252BE5CB60F16819E9941DBE8669F791779E4D3B0B6C6A411642116F0BA64CDF51BF3B856F53F0094645DF4A08001ADF35DBFB0BEC0BFF1D35BBDDE4DFAEF4C67FCE5A5CB189F5CF18AF6B9F544291D33A057E41F7F4CC071B6E0F4B6C2090EAD18024726F8E43586A344D442300864045F894AE44BEBD4DC15B46F6230B9BCBA5E90DE543907C40A06A92B9C065EA1F3AA17294790A5C94433AC78C9385B5C6F2745675ECC4D2568E9DDB9703003F9F305684AE30E65B26D572BBEC3C27149BB3B87160003782DF16F74E8AA82E9611CE83DB723BEB5BFA30F2325107F3F6F176634BB143428D7FFEFE5E460D0070A15509E56E231186EC8CE6F28F4BAB93F51F085F3DFC7D242FCBEE749E73FC2A75A15F5B9EAA2A1DB64667476319C1AE61C2BBC3BA4128D4C86EF74F390500487F90DFBB7FA9BE270E06A188E91F98E0476BB5ED3FD901141E8CB64BFE01E089322B0BC4F7EB42AF02204FFF3219A2B6EC046B95260B3826AB839C860722004FDDE9AEF92D7FE249D125C73155FAC4C9637459C231C6B373D6D095BE1BF28945FBB24ED8254A4E2F3017C756EB4CD8985436E0EBF717F8463BC18F37271500 -smlen = 896 -sm = 2A793A92386A2E6CC54A7139711994D93B7101B2EDC6BDEDD806390D4AA3B14B5FD4AD60BF004F329BD26411DD13D4F013785E22EC2C649E00E1D908ED9FB97E91F62375166D64F1F5A8F800124A4A40EBC168EB3A4A557A4AFA55D30BB50071D5A65C7BE9F9B42A95806770A4ADF17D9601D9E85AA32B1A3E8E8CB4119B06480D471F4C01319CF3E51912EF75ECC7E3D2F2A6F55BF755010710D39B34D1EA5BEA2BB6161ACF1A383A420175937DC1D4386B6399CB745E79CD34FCD8A100D9D412AC9928A522349DB08E6FDD9564401A00483E0A77CDF7F21D92C0B00C6BECD2F34CAA0132EC8533F5DB3C78546984A956DDAB6C14C901C5DB9D9B6B9195ADFA056ADBA6C1C02695B801007DD17C38CE4F5A22C5C579AAE617027DB792420F0F58EBFF08C47C0B309DCB890503BBB16C1B71431AB2EB9C834B740BD0D243250054519D0C4FC45DB09498D79E9AD602922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 - -count = 17 -seed = 327CE565CFF6CD9A25EDD84F482FA0758B78CBC246567DAE98B818314AE28CD438E339043EB3FF16E1C2B4B104A717B8 -mlen = 594 -msg = 576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC -pk = E5A998CBB287669EC9F02BE65B99816F370017F1A22782A2F14A417393DB5752ECA233DE0D1F54F89F43F01350DC02A3DDE603B4084F216D4F74FBE5E1D51F00F944A4D27D6BEAA78090EE66A123C8A2713174FB279C4218A1F0EE0EE14C08313447F4562582AB8E1046D1F6282D0E5F0B44E991605A5A904546F7D4474E2200 -sk = E5A998CBB287669EC9F02BE65B99816F370017F1A22782A2F14A417393DB5752ECA233DE0D1F54F89F43F01350DC02A3DDE603B4084F216D4F74FBE5E1D51F00F944A4D27D6BEAA78090EE66A123C8A2713174FB279C4218A1F0EE0EE14C08313447F4562582AB8E1046D1F6282D0E5F0B44E991605A5A904546F7D4474E220002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B68DEF4B4AAE56FCC90345EC39C7C7A03C90656EEEA15FD3A04491C20360DC6DAE4F6D4DDF6068484DC231313F0FD6EE5F973FF4DA278571A85F5B382379C577628B03712446193CAB43B60EA86015DAADB54CC8A6BA560C2E0500000000000000E9784F53810EEF83011BD1A52B8A13FF08C81FA4F313C4D19CC2272890D68482EB072AAE6A6FD62D3A1D5F7456F892B775C3D63CB1C74251415F0B1444D70102A42B1DAB8A0B6343D3C75C23386C9B49507602080EAA31318AE9FFFFFFFFFFFFFF799D2B3A478CC4D17AA535D48A64EE8AD4F7DAB70AC6DB5B24B871C5F1F107BD2DA1B9C53B648B5F9D062A9BF5119FAD4119D5529E01E5A2849B000000000000000000000000000000000000000000000000000000000000000000000000000000AE46065991182D1DEC8BBEC699DBEA267EBF429A7DA0F03A3BC62819623A82031067CA62E010952A65F5D8A325083A1F12C5D4959D72BDD96DB5000000000000000000000000000000000000000000000000000000000000000000000000000000A77D42AD8288A8EE4902A1B3891B7D200C7132F9E55369214885C5E6B244738EBBDBC32DC42108637FFB1C4777240808F73B78C80BC920456062EE96AFE4000088346E081D7C67502747CE3E6725C66165BECCBCD1D537E14AFE63FEC45AB757C0789B0423304E409B885FE540B670777BDC9E704E1E15E023F68522AD3E11002A484A40013F464EA9ED8E582E7DDBC9481FC53FBC15FBE9E8B43118932AA36AE3F8D45346B378D860476B1F60FBA1301633EBD9BC5502379E5EE3C3B5DD1700D83B78B3E35F66B763247C915840C5A829726556A9EE55DE0E125E94AF0CC8B099F344940CEBEF7522FB030FC0E5CF27D7968ADB045D210BA845E032F6FD1B006F55F30245810EECDAE679E3908A8CDB4D02B679A4D1550B628108AE86B4F28C2F12D03EF7C83888B98BB719597088B9CB312098233EE6EEA1E1C716A6981A008AC499666DFDAC310C8766FBDF693EAA35CEE9D69B54A50AE99B697CFAF03C0EC89C9EDC8CF4DD1D76E1A3633DDC803B6B63BD894D9ADF82092F88359C3825008871027DF24D674D8C1D774BBE9DA0FE5FD3849990F51603228213F91B1E884B74BF85B18A7C862BA3100E727B61888A5B0D481C85B33CE06816C8188A530700245CA807FCAB67A60649479F309180F299407BF79BEC60E7B37768EBCD942A287CFDC3487297643E462AD4738D01B13F7BF2370F588E2A32D8483F3002590A003AD2A680D36A7D9C3519E17A6D8E21E6CCB1C7E1CB740B56FE37048FFE7C1CDA3D59EDC43F6E270A4A79F7FD8A35F0053BC34E2C80A5D123179C3231E1A10A00AD35763C1DB0675A2C75366D5C3C693A5E27B316F530447C921FC9E35C875C66EA3B032C5A36D1256D1109151B5FC29B66236D5D101876F09504E843D7FF0F008240A496E6EC5484C67D2ABA0774A5C4808FA23052808CEC55C3E452BE55A1F3DB7EBB2C56E2EC1C6CF323905BFA0E4D11970CF3EDB7DCBC0C6DFBC56D8D04005B729E1123014CAB6C4EBCBB73AB1C7ED4979D8C408F961E2D562F10A05EA2FF6FA48BF4E3D2C17C017B785B8F28FCEFF2EF42D1384BEAA1ADAE79BA88351A0091871366FA715E6CA47489EBB195723FD1BFF6841B567AF2503F7CC0030DA3A5D31DFDB364709AD9AF9E17B9BE7F3ED5FD0C4D42F5565837241E910437651F003284C0D78B33E937C9BB6790C8BFC0E603417BF7A0D58FC47C8AD1959D891A41F5FF212DDEC220233A59AD740C63211CC1315AD777417F464FAAD56BE5380C00 -smlen = 929 -sm = 6E25C1EE4DE83B5E3812E45394BCB959322C00005E867D065731D7111E5651C1E358AF960A01E127FF7E01C149778B2AA72AB76709A4410E0128115CAD244381CF7419B3B47D8CF5E5F485012159E4A4305268DD402D01AB49A87F63EA05004E85EB57B8D4048CD6A5C67EA8973CBDDB66008382B680C1497BB86B202BCBD458B6861A9301A41DC2C1A41E4163EEE1DAD7B0C1E7FCD73601E71EA0B7586B887398825198CFD9795A84A0018E5DEDC8AC371D515B0A9012AFA796BEA50101407615F6F96B7DC9CAA68D1F6CEE1232CFBF007C9F6A29254944DC729D2DB1AFFA5F53028C00F98C25F3A821F1C02FEFEFA12B49DC6A128701F28B51E9D7434DF0BE4F389DB2FFDAAC877701007F12BF79A632B084D4032173B5144D5BAC3EE3C36574DBFD97F875F1D49561B1070232F296C945AB85BE7B95C511864905C6251900C8070A8D90136BDCE4488363178D03576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC - -count = 18 -seed = 790FC03F956D1301A735504075B67A05944A762E0A4BDA77BB8C036C5CF911E2B561EC1CA6AA355D5CEC919AED42A1D2 -mlen = 627 -msg = 021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 -pk = 040814457ACBEF3277E74DD676EBB3A80230A7B7E984987EE29BDBD88CB0B4AD9D791250744AC8428F3F0C3DF20E65769A22E754E40D29028EE72B58D02320003ED3F9C7A4CC459C4E735637F35FD8A3AF629C2ADF3AC6AA63BBBBF64860C7CA495D0ADE9E206055183C247ED4076408779B7391E7C588976E2213C377332300 -sk = 040814457ACBEF3277E74DD676EBB3A80230A7B7E984987EE29BDBD88CB0B4AD9D791250744AC8428F3F0C3DF20E65769A22E754E40D29028EE72B58D02320003ED3F9C7A4CC459C4E735637F35FD8A3AF629C2ADF3AC6AA63BBBBF64860C7CA495D0ADE9E206055183C247ED4076408779B7391E7C588976E2213C37733230002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FE9A7ED4709EEB7D16D99573F34C0FA50740DC4D6192F4B83147098BF0FC356D7A95383118587E907EBC8F15C01ED36A1558224E276A156724D8DB42C36CFE3FB7B15A61BE43A8B124D1D136688865EA9CA71FB7BE62940FB7FFFFFFFFFFFFFFFF6DCC28CFA1728A766B1EA47463EAA199A417D53DB1912CAABD26C644A958D08BE8359595E7911AFB0A8630D639FE1DD1E88EA3C099C5F088901F3326538EA62B2CDA795AFE8F57BC9E759C1B3D79E44EC41DF872769C1F2A70EFFFFFFFFFFFFFFF43B1536F3066552E588AF8A650693198811C68FB9117379EA0A5D932F7FAF50EB49312DAAAD3F0F259630D0A8ABDAB7E0C5A267DED22ED41CC55020000000000000000000000000000000000000000000000000000000000000000000000000000D60CC254C941E0FC0571AE9A31F88C94F2CA6EB004AF5E55D0557188B3D73D1A9A7EADB72E7F00860413A0C06163122D191127914A6BAF2BFAA201000000000000000000000000000000000000000000000000000000000000000000000000000098A7ECE0AAF716834D6C690FFFFD22484EF2880486DC7485AC172939831C3A2A9C742F2E54EFF23A98E5F5FBD73CD57DB99995588EC5A594E4D528DF9FFE24005A571D84DCACD86C460339191579B1A34C88044C357026EEB7317218459F3199A66CAA2220F81E25F513D7B6E7057AD369A3AA7F3D41E92207EFA04B06C517003D117A89DE6AC96FF1CC4801C42263B2EB184BB523CA185CBB89E9B886B40208A5901311D196CB92882DBFEA5A5FB95B77A5FC740E22C46DD90D73CF79DB1C0029393549BEB186B3EFB8DF3C45B4C2F1E9D3B04133F6151A7838591F94A53C587EE464C79EAF2DFA15B215A9EC08CFBB31DFC863E4BEAD828DE05CB734100000F0C5A62645C6B27B1EAF288C0DA6871CA2AA3BDFE92B21F87D00DF607C61ED3D36539C08390146E4B130606611F3EFA75352DBA194AE3E6D3AB2F4650BC40B007CAE64F67D3EA87983D789E99E821982B4301F3420B5B0308AAC3D8F7242F67A0D6C44977379AFA5C7F3C2B0D3A5B4EC0A4A219B794663EECDD350DCD7210A00E9B224058178D09D911138E05B996B39BB2E03FF23D827F03C024F01A4881E019CF267913EED5EDEE7E57038D1B7085D5893BDA464D571C45D3B38798E550200CCE08BFAD742B654C92AA010C3EE6196F7424F3CA31CE5083E9A3FAFE1E1B41B65B5C0A70F5431429CFB1C7B29112E1CBF229655778D8D6BF7BABECCA1671B00D3FF38937EDF5B52CCE518B6E2B70FED6AD7EC468CF9A781E05088F2304F4D976A76A4D7594F6BBB52048B2D88CB5DC3445C1D50D53231341F0F03402A1108003EC682BFE6AF74AC047D89300D079932E453D8B45F138DDD3D00E1771BCD3448C43DCD45FE7FC660854E8AB3EF1A07F2D08554CAF83C77EC10859168F51B21005708F71E264915848850B743B4184B642E37B1D5DC22CA92AC7029A2A917272ED89F93B4B2661304B695E1B48AAD65C53EA0A3A5804537C9ED94354D861210000D384074F6358C8730D769F66852715E40926C95A4423C9C68AE87D66B832608FCA380946EFE79627E75E3A689FF532ADD4C23CD3604B683915464952EAD100039C4432631228CC201D480688C6CC7301ACB79D42E25AF4DD97B72D8A04F02D7130DB9298C9B143CF9C6BA785EF1188D06C3AD6F13AB726CDE2F5BDB4C21050036D395BDD04979948EC4FE55B9528F0DEEE9E4967BBDD070B5082599F9E00A05E6FD9F6FBA7BEE1A19BAE4F287E100D1D4C5C163575460B4DF6BE1001D900E00 -smlen = 962 -sm = 5FC725F4C88F030711DF8C384DD04AD5745F002E5852D4ABF42271FB4281B2FF1B21F7132300C8DA7B54968D2DD369987E742FF5862F29F8015A22DE66F1FBEB0D79CF6B291A4F40FB0E8E00BD7B331A96EF2224CFA25BD3BF849855CF4D014983671BB3B755BA0B7BE421459FCAF0DC79011B330C6042D0675B38E1BE96BA7F2561825100952592D69D14C0FE7C6569E16603075604E000458896F9A2270A0392286BDE03D8A19E6FF300BC5E605D6CBB6B997CB229EDF85F5BB4C6DE01F9ABF795731E07ADD184C6D61B0411D9BD3101F18C598E467CA83EFB6905CFCB766896D47A004FD20B8BB1C3568224460FC5312C0C610A6B01971981E525BF11D1F829D6FCFA7D35D110D000010BB11897BDAAC21CF95AB9139D5E60C01D8FF641291CD0B584474C56401E0B0C0002B42EFF1F4E2F7CC893963D49A5683AA8DB9C012D347472D2FA6D2F8441DB28CCAB00021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 - -count = 19 -seed = 716354F7DEAE272CD26929C0932CA257AED1DD23D67260726B5213D82E61466FA99BB6A7D81DEE9D0EBE03DEEE4DBFC7 -mlen = 660 -msg = 7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D -pk = 94A8683E4B8CD154A4D7523AA2369DF5D28650F98295AD6014DDCA0F417EAE139DEB2B436BCC67B6400A37E4387ECD6A75D266785FADD6BBAC8C81F761210B0064B338934D261DB8AE9136A4C5284CA1DF7DA6727794B1CC322087F628C899467BED467C07C5BB2C056659F74EE71D094E14BFB0B77AD350A6BE395F90650800 -sk = 94A8683E4B8CD154A4D7523AA2369DF5D28650F98295AD6014DDCA0F417EAE139DEB2B436BCC67B6400A37E4387ECD6A75D266785FADD6BBAC8C81F761210B0064B338934D261DB8AE9136A4C5284CA1DF7DA6727794B1CC322087F628C899467BED467C07C5BB2C056659F74EE71D094E14BFB0B77AD350A6BE395F90650800020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004D8513D905EC0605AD0B2891CE383CFCE0831DF66D37F2C7C482B43430F6393B64EF23EFD9581D27DB99ABFE47253716435ECA77A736FDBCFAF0C200BBC23DEB1EFFEFC4E53427294D7DE282DD30CA851E6B4A1D2EEDBF7A610D00000000000000547CEC9EB33BCB2ECBB052DA580460F56C758BF452C5C86D1525BAC7B19A500E8B2D57634336F85681EFE53C9BFAA247BADDFDAE7071F591407C3B1944C49D0D1B53CC3D55245070B9801CC6022BEB872CFC8F6D07FADEDA2DFAFFFFFFFFFFFFFFC8B3A19A2BD3029E69EC928FF5353B43EEA6DCDECF1A03788351E8FFBD7DD092A2FD2CD94070EBB389B4E885B6D489A517C056371ACD7B8E1F75FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B6C65BB775BF06E14E4B44D47BF63C42927AC5C002B34A428DB0AFBFEB1070E74D7D95C55131FF70EE8EDB2389BAC0CEC00FF21DE30C33458C601000000000000000000000000000000000000000000000000000000000000000000000000000053D29CE400AA7F89036B32D36C7FFCA1A822C7F45C218924869678ECD4DB9D852609454B3ACFC7E5356A3F552F7AFBB2B8E7996A87E4079B67616A4826412100BD07D241AE728FA1B6CC470D4DC38E691D1F70F760DE2D9B670FBE696074B21C24A131ABF512E92EEA6A48611A0C585F48D9AAA34F25A51D649B78F13D0A22009E184CBF99E918B1BE9F22E0D91A42D4F7F1EFBE0CF0640C9A76CDC763B60DA4F74B4C5A7125596096A5FA06CD9503CA2F1F68DA2B96AEFD2F093F375B8405006D8DAFF349973037571BD378429A8DD2427967D5C5E01ECD47408B93404D09716C979D42D7C4FB0061E8DEB06BF775369519EA7FFFF7297CC3329D026B3316004B0ABE05B58B928C5AF2E154167F89DA6E0425154552A996D815CFA9A61617426F149105114D190ED172A0674169723FE86701545D4A628286A145469131170017D119557E164C6043B032CC3C1193DC40D3FCED26344BD5B00D6AA58E87B92755937B0A684907D0F8F1B02007F5C93528789FF5C2747DE74530CA77B08800008061AE7C1627D0DD56A2DAB83F397FFC421045DEECBEF2F4A362E75BFD7CF759BA10C10D0EDE548E5E4C77EFC10210A4FC27F6AA5AA35681FA30B7042EBF180001861960E244538CA30D56A6E72C9FCA5DE7CE8CF4F5CC68A5C7232A0E09421D3ACD5E35E2189AEBB139F9C68ADAEBEB065CEC5EF048D291D0484148E4CC0C00738A54359FD59F5E3AB5F15236582A2A1807437C1E05F56E6900C4875323E476169A77CA210CC950C1B19C0E1059A3048954EF07CB8C5DDD5AF817555FC70F00937C4B9DE8333C9D05E93AB2541BF05EC58B4B2ED29637F672EE123A7DAA11A3969334EB490CB503BE0AC0738E897477BF64FAC19E755D8C63FF6DEBF1162000B48D18E1A1AD180128FAA3E38FEA3CE5D037C7D6886836112FD18A521DD2D6BAD2357650F470F2426A32BCD8A68AE0F65EBB8DFE81455E6BDA12E32849420800EF456E993C0755EB4784E97598C2C876B40D550542A405F461497616A3C4F9FDB9EC745FD215D02C6750D91B3C016F27CD934C771E06280E1CA59070B1AD1F005A0F39A2FC86C0A8A08E4409CB66D00405BDB9DCB66F394743A07E1131140E5F787533F124302A80859754ADF92CE0EE8970D5529499661B98DADBFD272C1B008B58D11A7CAF73FFB7066ADFA8BF621D5EFACF2A703F65ED63CDC8D574F683FB388D67FF04E48EEACDEAC517BB1A0BCD5F375292184D41E7DBED5A10BF570400 -smlen = 995 -sm = 50FFF3F223B5CE4A6E47F128DEF6B311B67C01899B244F1DB0BC9F563C0F4AA7715549FF9000217586AE1B9BCCFE372F50D7898DE8F08C3001459F4D66097E50E8637A7BC50F1F84BAF745004A413E7109CE8CC155E8A422FD431C745B7C01FE4055A308DC331F9771C6E1AC2DF77128B6001364D2BCD773CD0A463F4265B7A98AC19D6A004651F2B9EC3524F384457827D7ED365B5F18003CBFF5E83A7E52D75E3A4899A19B3A9740BF0143222E54125F5F39706F46A2740F4C93008200712D7875D4DE37433F4CA1DBDB7B225292B2017969DD5DBE8FD6125DBC299A472553BD1AB500827CEAA6EAE58A132725FA55D42BF2A2E917013ECDE9B19799BD10D156234F9623F3D459FE01004F64451828BEF9BBC1A4CDBD113D030762295DA7253B6572603868D72026744702039DCC24788609F00797F5490018757DFB9F7A002C3D047979105838BF97E0415A3D007BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D - -count = 20 -seed = A32E6FF879EC8866A5F5E4F6318DA8FE6743812ED2CF5FB94F5C3AA3EDF953CBC32665810B71B2CFEBF343A571CBC570 -mlen = 693 -msg = A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 -pk = 40D2770253FA5B04249234638CC7F3B66B2FCE2CD2068BFCDDAB35E340498A5F031D25DC5CE0EF0D6845A89E2282C2F1D467471632573D0F3EB53BA7D4C90F00EACECBC85E276BB3E66310B654FA2CDF3F2C76179DDA38E13882DA1DDC622CB0B0E41387ECE0F741C27ECA070553078A48F4778382E65F06020F03FD70A50C00 -sk = 40D2770253FA5B04249234638CC7F3B66B2FCE2CD2068BFCDDAB35E340498A5F031D25DC5CE0EF0D6845A89E2282C2F1D467471632573D0F3EB53BA7D4C90F00EACECBC85E276BB3E66310B654FA2CDF3F2C76179DDA38E13882DA1DDC622CB0B0E41387ECE0F741C27ECA070553078A48F4778382E65F06020F03FD70A50C0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EF6CC4ACD79B20B33E2B91D1A034D219AD544CDDB0E735FB5C3451C173F22A1EEF9269AF55BB660426489B4CEECA24B61D8D84C60EF658D4C2F98574ABE7E19AB3763FCD171247B803A7933C2D2845ACC1425E1FE1257EE4EB0A0000000000000028D66B16C847F18537D84B4ED0E07A80DF8A45CFC1506564489E0768246D376FC9C79801E0D28EE46EF1EEC56A387320569E13BF9DEA11770DE607FC2E60908F820C36E2389E567227A01C3496F0065FD8A0356F6280720408FBFFFFFFFFFFFFFF205A8C996A7C011230206A47539164197C6F5D4AB1BA5A99FEED955A1BC18A575F29E5881CAAD27A9F305E5FBE276BAAB125220324691A5507F4FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF317022466ECD30EC1852F5C370271BE5E7F53EB51AE228F9F6BEEF4453EFC678B6E1F92F66C03443A7C6192D53FC70A4AC77BA5A6E19B0990E18040000000000000000000000000000000000000000000000000000000000000000000000000000C55EA3CC8EEB6D0A31A3C1A68027DD35480B999D469B6A2C48F7D10CEBF5BE77454521E7515A342B7B9485FD823DD34489D63F1ED6664F6210E6BB0FD15C2100697AD2830783E690796A3568964BD123BF0C831E1D59F7BB5EAACC597D6D1E7516F7633ECC81839495B50EC44AEF6E69E5FAAF07BDC03B57728A8BD3498F14001729AA834AB1EF34205E45F273448790829FAC160C039F6475C5B15221DA789B76BDC7B3BD8549A8D45E215ED6D4AEF17F31602968A545DEAC7E7B32460317006C4B0C8BC105C6EB747174A41433CC6E767BA7E27AA01ABCA789C094DFD82B2F16011376C74CA59EBF68C9D97B65754F4A1CBE2E40568F67A384B70451081000B42D950326FE7555C62326CC855391B04464DC025207DE535F786AAEA82BA010072D8DE165749C5FA69BDEB96C6C032D3FCB6653BF59B893F0E2A6BFAB1F1D00C968395A274368585142D4168001F84137A16E208B0C64E531C84319927D0735F32AC07E86F489ED40BB486FB3928F51FF92A9EC43B73D83A5C77097CFA60E0028292BC12B9373DFC463D1E03F378B2B1C050362D276608A130FC6BEBA3895100CCA8C8C401FDCEDE7350A8B6678169FE40AF7C6B46C9FC178BF608AEA4107003FF3118DC33043B1CB29E3F15CEF6EA05E847AE5195756BB842690DDF0694E8B6DD062313D3156CE224921FEB6D8A081404CB8852482605018202A94C9261C0063D27C1C1F941A5FDD7C8BECCA47807210021D450848AF38E9879BE4CD233790F9655375EA97F54338972EF237C05B8079B69185D73F0C6B4D2D532818AC2000513FAE7CCAADF0DDDD92496E09119C3EAB76067046EFA36EE0A960E2727D55BFE51662E07F02FB57B24952FF1339215756EB5CD5A36AD20D9564AE48646B130020068756B51D0FBFF069EE6528582BC717A1369E13F6B5D47A5E06157E1668B6E5B01488EC8B0F81A175C5CCAF2698B3FFB33DE4DA4DAD148ADE93451EE4060061452F62B306462148922285C01759D0A50163ADF9C1ED61B69EAAFBF5BC370E3F0FBF1647E5504DF535EA94857DEBA1EA32071FCCA3F89556066E719F4C18004DCDDFA8C69C5A46C77F733B5FA5F5DF6F19423CD1FEAD8657E5FB0889151B6B60506CA21908BA04F37BB69082DC253615DCBEF5B1FED9B7CE5E94A1AF192400FCF4C2CA6C94316E1FA63DC5563D73D0251711469FB01090CB8AAAA636B5DB2978D533FFF84A73E63FBA5A8A520312521A227EA06DBD45157589CF1940E31700 -smlen = 1028 -sm = 33508E5AA243705B35F49A8ADD7DECDF5CDB0032E4E40E5E408C1122AAFB5064FB09353F32014CEA58F1F41AB9A6C9582855DD000F751D1B018A2AD676C69A6B836B1BA85A2E108E92BEF4002D23819BDA454F6F38D91E45D2D157E080B901BB4F5592E9AB128CCBBE7E1FF9A5767D70FF00C6FF525E09BDAB07AF42EAEE0B7E12658E6B01B657BCF2D90BF7F9AE6F7196FC162AB3A57800DE7B9DAC23A4E60F76F2AB4BE51CFADCAC4501A37471458EAEC4ADADAB61AE793DFFB9F0B5019F82D40F83AF20C517F4955EE01B06F484FC00CAA52F3FDC8D6BA74929C6F14F1AE19B6EC601907963A0AE68220AEAF028D7EB5BB56DAA1300CFFA1B81B3D865517B6F1D518FDD97FA4B8200015B263888746B1E752A16CBEC814016F593EC09F1653325F6698C0479701A60FD0403A2E38489B017AD1F6BB5F24072B1FB69B73701B5D1E54A502A439F898A16FF900804A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 - -count = 21 -seed = 5A64401EF8E63AEE18E8CC0162845DC7AF388230E86728ECB330007F2546F949764273EA05B397FE71F567E1527FA445 -mlen = 726 -msg = F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 -pk = A697D28B65AC8C8E8678685BA7081EB9BFDA2CB2B1D95B0F39AD23DCCD838192328E5543E16DBD9CF4669CC0D63C4F0089FE74D99EED6CE8948904A466441E00A21F0F624B84F927340623B343ED348D8EA537D81C1D193CA336105A4A85D4428B96FB5BEDE7DF93E6C46F5610D3D5B6D4C6B633857FD59CA979D8539DD40E00 -sk = A697D28B65AC8C8E8678685BA7081EB9BFDA2CB2B1D95B0F39AD23DCCD838192328E5543E16DBD9CF4669CC0D63C4F0089FE74D99EED6CE8948904A466441E00A21F0F624B84F927340623B343ED348D8EA537D81C1D193CA336105A4A85D4428B96FB5BEDE7DF93E6C46F5610D3D5B6D4C6B633857FD59CA979D8539DD40E0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000232249EA9C1C5BB42E5830192DBBB8F02F1B9CD7340BBC8412E56F01272336C5A8E6B9F70D9EACB76DC9CBEC472C63FE271A7B2F8875989C95F1EDDEC327B85CD0E4F60E8191FA6CF55D9198ADEE370F38EDE3714D5070C8FE0E00000000000000BAED301CCD95F18A2C7564B4DB69F3688E0F8B9C0000D900986B55CB520400A645A1B324211315EB66E2E0374B35815FEFC12C14A795635D01D839F366AABF3F2707BC8E47EA352931A9AAA52954F2EBD80F5E1AFF2B9FB202F3FFFFFFFFFFFFFFEEEE8F765BCF11BC0C77D3C244CE6B7238EE8988F1E9FAEACFF752BC0862B0E6187E023460128E644D27EB4BF6770900D495A2FD3153899BA8BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D57544C977A12AFC28ADEBFC42058A71818085AF537857CF336DCEB3E6A20FCEAD9685C5D351E1B670A03AD1019F4B78F035ABC3B7C561AC0CD030000000000000000000000000000000000000000000000000000000000000000000000000000D37A3AFF73943EA2448880DA88D784868D1A951A65835877BCFA463520A97C1FD3414931D2F1524FA1FE694BA556EDFE48B04CB74845CA6CB1E5AB4D763403002894D5C7A0FAA9C748BC0BF4E0983C242CDD9A75991352735511929C33023757BDA68318A78ECA6A33AD4C78DF99B4D3FB91DEFD7BB36194C227435E3CA51000AFABD76711A16DC5E2E4FE8F507F5F26ABA645505772021D553AE9B2B3A56A1156B8D1A757930C6CCBDFC18BC4942EF73253172B29095C30466553FB08E61200C72782A7E39FC0009011554DA67E2E55FD87992C63BC09DDB9F3CB4BA0B8CAF3DC068ADCCF3E5AA24B6618FF0B22A2ED23490B470F8C285FDFF92CC5B20C1800C3EFCC5E393CABA841638A54C67E77600D205777D0BBB05D15AC4A79A329A733B57608147B818F520A6C9F6FDF7217AE4D272712E67C703246EF7DEAD5302100BF6D01882DBDD1C72C7A3F2F470AC331F4A863E216BA2B5E4F3B95620B025F7D748F7FB44C33CE7E0A1601A6445229F3316658A4B6D1858585CDEE095CF6110042231FA12ED602DBB631B068AA2CB5DA613D15CBA1B444AC23F82FEE19FCE04998B862FC6FEDC5B81C5D370B48F9B8592FAF75115EF2E358A59E33D902BB1A0083571A91CC0E3C59C6AEF3AA7246C79A2403F2B933D1AAF11B9367FF48A1ADFF4B8C2C4D84989C6C7D672525B9C96DA3E314E1426E4E8A71FD18EB84D469140035EF6F884D299823F2AE9DBA3BE6681E507871B1DC7F3E5AEEA78747CC5ECD6BE916776A48DE405383019140DBED9ACE45C3818147356FBC5900D2EA89CA1300C9D0F4A415CCE8C71F8FB3220F62827F470C9AA68EADC37261B2EE0D84BAE1AEF1E65EC7B6E6358A6C438C2F2F75E49872F0D1ABDE95D6F19CBB03A6C69C0800CFF8FF7B3A4CC3D311AE7E3A360AA2B142CF15C78C715B3926AEF8B34CDE186AA90B8F94DEDCF968732DB9E7983FEC2339BAA02F2C04BDC5397DDF0969710200C268816CE9A6569222CEEB07C5820A8255038A4EFA3B9A92AA04CDE4D6E7940D062D51C550F0E58B807B90A134EAAD73122AF65C3D664B8E8489DF4AF0E217003C42D566C9B29EF95DD49757BFF24CF8D0E1FDB00EBB8555B65A2733E98C0DC78EDE85FACB49B2BCB4849E00F140CB6BC94250E238DFD645A60119B0EF74000063FD3E63D110FA45F254A859D58CF7AEA478E8EBF2070F4BE1CECAEABF14CBA519D74F4CF70269152822B1C59E4092B269EED920059432F937CEF2D22A651B00 -smlen = 1061 -sm = 6DED0B073F8C0BC2DE56AA255818736D5FBC01B81EA0F55C6CA606DDB9A94199EDDFAAB07800620DDD2A9B12E68E56E1746EA0AAEC89F6EE00AEE9049EF233A86D0915FD2E4FBE583BC31401FFBF81591F0788898584705A8143405F3BE10191763267606808C35C700AC26199BB07BB3401ED0B119CE7AF81925E4F1295C814FDEA6EF10082CEF86CC14185E5CE511E79AFD1FBC94FB70182F1C2F8D012EB50E880F691469D63595595008D16DCBBD69A4683EF7103D5A34F2D55D002017D05C49B1BEB65E59CBB413BC51DCF63AD6700E5BEE0E53409F8CA8F8CECC943B90082540400E6DD3FE435E1BA2E3EBBD28B50244AD1AC6900DF3DCD23383A3C299A6FEF08443E63EF9D280101FD13BF9739F20201D13738ADB7739AD2A537E7EBE8CAF930E27715793854E0690703F02013C700EDCECF20F37D5824B7E6F6235E0051ACEFE8DB22D04725B85F74A2B801F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 - -count = 22 -seed = 3222E4B55D6767E300FDE03DB3D8227E19FB8B08EA9B923FEDE18D699DC3694EFFA7C4DAE2AF57E4A0162B7C564199BD -mlen = 759 -msg = 4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D -pk = F6C8385D095898D2ED4A5588A5B00C73E47D5D9741BC09879B4C38D57E26647ACE68E777490BDA78E65D10C2C1A68840C570C1F66567770B2F4DE95C04AF2100E5FCA2FB99615842A494F232100E71F194A957B07C72D42C0C0E9F32B4F108E6DCF922D33C17CDC64AA2D90C69DC2AF8FBD552325D1588D676EE5D6079132000 -sk = F6C8385D095898D2ED4A5588A5B00C73E47D5D9741BC09879B4C38D57E26647ACE68E777490BDA78E65D10C2C1A68840C570C1F66567770B2F4DE95C04AF2100E5FCA2FB99615842A494F232100E71F194A957B07C72D42C0C0E9F32B4F108E6DCF922D33C17CDC64AA2D90C69DC2AF8FBD552325D1588D676EE5D6079132000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001AACDDD6FD090A2B12AE175181E23874597B4DDF94DAD3027C697D235D9B3AA12C0C8D25C03DAD23B40F48A1DB1FB7F2B24B86406F5946CC1BAD5FC6E491DEEA1A3BA79255BBF9E0F2D8358A439DEC9E8C53C59D58D9D1748D0C00000000000000072B560959A7013B156D6F3DFC4EBE36865A7B8B55F666CF1E4D4D9A33F4EDC959CFF1103CFEB7FAC483EC7D10AD2A98B8E4EA289E824EA19573965D26577686928B209149003EA364FE2091932BA28837329765C352143E4BEEFFFFFFFFFFFFFFB9AEBC4346EB3C5DAE265A96C88DE9221F8A7BC608A38E379254EFD3D47F2FA4115E695015148032620A4979E940EE584184E2B0CC3DBE511DF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF461A5D0AFD85FABB1BD91F7DD7DF3ADB0F2A9081EA32BE28B3DC6F3DB67B08E43C29420CFAC555E5D61A729EA15D5131EF26A793521F8B949299010000000000000000000000000000000000000000000000000000000000000000000000000000BF2079E87478FC5089EB9F386A6FF3553C613CAF4D245D69970BFEF874CCCC5DC9363BFE39F2DAC5B116D193BCA2F7EB9478CCB23239571DF0EB555B02E21500057A7E34D97211CA7E9E627E2DEB5F6C02061A13BBE2C544A9656388FC0C672FE1331D9B7DD019BA5E22A8897881C30C7936AA1C47DC4F435C0A44B598900300EE927C89A59BB85F2F24B94B8446E1F2E5734046FAF108BC2699E1075190BD2DA5577177C0850FA67794E9F790CA85F1410582C0E66BC17BF8923324ABB20500B4BBBB2BA4250F6F49E0E476C4C8363F3460AD2F063B4A86EEC48F0115A1E8CB4D2FAD78CD7BE5A60F6386F6C012963A87BF66829EDC206FC9B86247712E1600D4A72A9B12FF14509FD62D4E69DC9F518903167AA51A9817F8635338D6D56ED91798A2D828FFDF83376E840E578263B92DFE306A605ADFFB576020999C9A13007927DDB194AAB7A486DDE90EF82AF3647017460C950949500C9282ED7C4D13B7FE9BF8EC9C3D3973E631E9CAE5D2EECC5BAE5BFF78FE62D846DCF196FB140C0011F19389595D202184777B6D7E92EC203AA3E018B02BBA94016D69829D10ECFA3471E84B98ED65793C3D31423454EC91A5E6C8F333D79DFE523AD65D7736080050D311359C18CF536101D172544FF1BB348D485F4BA473193607702AF228C0CDEB68C510304A0A4629D7CEB81AAA9A1D00D183C86FCE3C72A6B14BDC725D1B009013DB4129CFE1CA1479A0CB0A5BB33E39DDA225293AE922751E86086C5FD275D723209EC5B619E0D770255A95413C062820D85F4CA0F2E135415CC572072000D066FF8EAE7F2593FDBFE050C13EDFC810FE25A44B5812E568AB58A19E88FB5FD8044DC743FBD94E196E986500EBF3917BAD6F661E61DDF4CABB14BD467020000575EFC5FFF4C20B21A12B79C06DB33B92EDB5E2967B0B1C53887B3C4A339BF9CC408D61BDF72F9D8C012623F06042AE3A8F1F5F03FFBD1C8ECDACE72A9D1E009FA74F4A9D116A90922E16BEBC81E7B4859F93FD91E3664AA741792DA91BB9A668A7413E0B7E5151C3E2B2CD73BC31EFDCA9FC16EE1D8FC9C057AF6D5C0E0500C566420D076B5D93EF070728A087155EF06998558B937BF80A2A2E54E81141A40299EF73C8F6BAC07885DF050DA101760E4DFA510CD7B383138AAA9BB14B1500E362B825AE881F91FB71DE412F6C5AE23E02E662681DC1A61CD7AA4C608661B30DA30EF2AB7656694F92C54D3DE38E5F1A49E98BEA697674BEC16E0DB2660500 -smlen = 1094 -sm = BAA3F3CD79293A433F8289116DC22543948201FFB94B4CD7F540C419226E93394A08EE10B200D71CBE5798959E391992A066368A0CA24CAA0081F8CE8B679E8D1DC8BB39A4F3329B22D5C5003FF55E4F24709C4226D28DFCFD155D5F8E4700BDBBCFA12027DDA88DBD873434BA4BC6E41401A869A0F68FAC716303EE4C47C3546223F11B01EFFEB76E242206C6457B607F19B0E006814F008A4014DE5A5966E04F0237F3E8ECC40E1D9001BFC36C6A40A56E2F59D151BC537BC7AC8DC10134BDFE49FCBBD258E17FD7BE672C12A312F6005DE44B3EEF290B50B2310BE2FD4E77D8DE940028B422B9A0AA20AC7B331364F36FFBEB045000FB9876EB7A065D11CC91CD2D676C52ABA151000189EE96FCFE73AA4E99B08FD871B6112F8CA79056182F99739D10286B10D9EC490703B95EF35A04D9907355B169B603BB06B70DA40020631507B1474E82ACBAFF11BB44024C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D - -count = 23 -seed = F41B3C6225245C06455272A6A073F363E5F19F09A0B146AFCDFC2B3B0EA64BAA3F90359F32B2D1017608B03064E90AB2 -mlen = 792 -msg = 72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF -pk = 915807DF84B64B55099B63FAE160B9ED1BFC32D8B1A193133394C910BA44EB8E266110B7A1827946D0430BD8C015C755895E013783B3A673697AF69F85371300BBB544A9EAE860C11344A439B53C50D5C22BEAB694D4A94D57B66144F86C56C1AD7AF7D65F636C46FA0CF68151B2057C5E8E835EE65FCF27293731EF7EC80400 -sk = 915807DF84B64B55099B63FAE160B9ED1BFC32D8B1A193133394C910BA44EB8E266110B7A1827946D0430BD8C015C755895E013783B3A673697AF69F85371300BBB544A9EAE860C11344A439B53C50D5C22BEAB694D4A94D57B66144F86C56C1AD7AF7D65F636C46FA0CF68151B2057C5E8E835EE65FCF27293731EF7EC8040002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C08F117FCF0B2D44765CE9691F89D94DB69829FB5447D901D0512E19ACFBB001508A9C02A607FC7E4FB52CBDD50839DEB67AD2866D23A15AAA7B464205431775EFDF754CC2188AA994BCEA0B48CB10BD0A67B16E2B9A990A60FCFFFFFFFFFFFFFFE5C48FB7ABD1F95A7ACE0457E3F394213C8226C39185FDFE34FB8CFDFE7B5B01D2CF161E44C3B59BF80D9FA32D630A10EF2340DC4A15A12897891BDD8E92C9EA2E2978DA77BCC7069FA1C9885B7B107D14BF6CFE17ECBCE1A4EDFFFFFFFFFFFFFFA3815B1ABC52CFD8BB5BE7F264750FEEFAC34CFB7DCEC96E1F9B6760759A52CBE092E9972FC289D7DFD11362F0D2D701523D1BE30B8F1BA5525FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C59B5D06909A08CAD7B1404B846A1697128C6DE144727240C4C901EDD752323C2C1F38E8D6F45ED9F9211A6328683163EBE10F2ED20F2229AE802000000000000000000000000000000000000000000000000000000000000000000000000000043FC75856E29FBFB6FF6FD11926F1FFCC7F4F7575C2AA5EEA58E34A38FDE233D24BEEF376C5E77DD4A9B60EC1224143454FD98FA2EB700715A1FA8B0240A1D00B44AE741C77412411F966188A8D1E3637ADFCEB16B5D3A60B3E42AE3853968FFF63E0DA05C13870D3352BE5A72DEA71B1A4256F1893F55EC9980249BBCDF090084463975DC41416353F4AAA8049CEE5C27F15DFB848F39FFA30460CD1A021FAF07A841C93C67115E513C9DEC41A5E64016414AA0A41C548527D591D0DDE20F00649C4A58E62DEA7C0D4DEAD7AF15D0E06BAF1C66B20BA50E1AFAC28F6371EB605A6A78D09BAEB8CEDCA5F5FD63BEC229EF64639705AC2F2C20853154DE890A0022E37971A452B2855555AD4518C9E115CE91B16021384E7F8DD1D81BEBFBD519767A1EF3071E765E5816BA04F8DCB865759C35770A69191F857F85CB5483170049474A9BA8CD14C6BD5BD405C8E9B33474D830F5D9E2FBE0545DE13C4AB9E59D8AE6BA137C0977A9F357E4822032CA24F3B952376F05AB0F3144AA81AD6903001FCF6FC0553D697258E8AB5BC4782262DDF4F085A36C48264EFEAEC3FEECAE01877A0D1CF55E47EC6FB11FF61F11694DCAB43B663A2F5D8A2279E05C74C91B005D6C2C3707EB9DE63C8AB094C1926E1E181385FCFF3EC5A3BFCD7B61CCA16E28161E1CF0F9A0CFD458E8FBBD0B6D72B1DE3408BEB4CBE69C335E71DD6B4F0C0053C5B62BF77D4FA0BE429E79D6BA7C873F0A29ABF7A4895114D8910103BA642758E1A4385614D1C932F81F8F150DF61E31A4BA3C9D27BB4DA0FBC2F99050160047011EDE609A540B19A9C473A8962C57721A32976DAF9D324D13AFC85D36514E0FE0D2508F5852C133329A2B9FBDE79186C5E1CA9E44133B9551980E74FD0F00240D4A589152C5284D1AD1AE2FB4807308E205A85AD7B0F285D78D0D49B3F3F860620F22652062B0AF9087D563F0D73AFCDD92025CC0C0C3083D28D87C32040028FA8E4AC27A8F470B43A8F43738550D4E797B81A18312C4D03E18045134BA622F530BC5D05BE94628D5F296473DBC497FE5802EA2F8FEF0040E49C4DB811400841D9852318B5666AE8521EB6D32B8C4D7923EB16A681911DEFB79BE7283A49EFF7552F31A1555D148BEB0D35325C640C55DD8C840354E38A9FE480437A80F005B53A25223E319B5A5E247CF03257123E36EB91171739E88CD8B5A9B67A18B905AFED19B38085BE89A6017BB412F085BC725E47D5B6303D3B5B12E0C75F00D00 -smlen = 1127 -sm = E3871E411536CAC52229A7047554E5246629009B0A2287BA8BBE6BC2F43AB056AA530A11CF0043637ECC6E9F64382D9FF214208ABEAEC20901269ADBEAF5AE4F936A5B099A4408D8F417070157D77AA1F01017EB18A93BFC52363EDAD80B014690071EB84C3049533592157485478D1C55003EE7A9AE7F8C1540C19998935BDA173B6D99002C00F4BE8EE3CAADA8BE71FEEDB2843BB566009123C3361E9D922641FB6406A86D4C071087013EC9918F0E1EFAF343A15EAC52C50B55AE6301FE5125CEC9C22A830C301C07571F83A70B8600A409F5158BBE00937EA591941A73E98FA6350051A65419FC272A348927D30475D687E82C2E00E6D612BC7EDACE8826886CCC2DC503AD38120001A5C0001C4547822C738B38A90EE8760F0B0E41C31B105DD0DA70ECB62BBF15BC02035F5C3DB7D54405B1E179746F23B6AAFCFABD00B925D4A1833AB445086FFB43DE2C0272713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF - -count = 24 -seed = A08AD391E0FC57A83B74CA8CF44DB67F8178262ED9B20AA0163CDD8274AC2BE05F558B112B094244370C1AAAB75077E6 -mlen = 825 -msg = 209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E -pk = C182CD2D327D8EFAA71678CC86CCF150DC5CE36F3D4C38C301BC3D560A653936848DA87B16A78BF3549F36D7696DD480D70826F1F4A4EBA690D778EF2B440800C29E6E841067C69400C229BB072BAD862C687CAB1BA94103CD829BF9940EB290291942636C9762455AF7C27962A202DFDED8EC19097C3C90248FD5332C6E2300 -sk = C182CD2D327D8EFAA71678CC86CCF150DC5CE36F3D4C38C301BC3D560A653936848DA87B16A78BF3549F36D7696DD480D70826F1F4A4EBA690D778EF2B440800C29E6E841067C69400C229BB072BAD862C687CAB1BA94103CD829BF9940EB290291942636C9762455AF7C27962A202DFDED8EC19097C3C90248FD5332C6E230002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B10111B233C0F6FB8BC3B414752427D8EBD9BA62D5FBE171ACFA512246AA5BE6EFF02DFD6421B51B5ABAF616F6087806F368738633396366A2C5CBC4FAC460CC2C7FF639119E8C6B8FD1A1D5AA2CF69D35F5E6162221B3BF931100000000000000B6B99534A3A842980DE11B154D616DD9805D66FC0A4866724DBFD7E23734118D677A57693659B6DAE456299D28979857C9CFECEB6A19A39317B9930D746FB66C83C41BFDD44889834CA09F04B6701BEF1900F67D6FF018CC0CF2FFFFFFFFFFFFFF6A8D2B8252F738E75CBAA2668B1E7B061EC2C082A2DAFA84D8625777FC5D854F50E47D2C1B7BC12065A0824F68BEA38EEF2C526DD398052E9FF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71E4F308CB625529B5FE8CA438048E583C37F8055ECE41ECE6F0F0616A34E308C9E59E8EA7F446B80716CB371B0B5CE211FB86BDC6F8605EC255010000000000000000000000000000000000000000000000000000000000000000000000000000D31CD69F96FEE325BFDC2EBF782C076AF68F9E278D4098DD2BB12E103A0F243A385F33F9406BA9CFAC637BEC13BA4441F7B936956978A24B225E2641D3BE0700F6CB37AD38162335CC7D7371080678DE7824F92FE6D297CE363147B0B3CC8D1A8BEFBF6DB699885137D916DFAA20D6F002FE2F108A43F873C5908C4BCB1B1700A28A70F1934833A167FC42A6F17166F94808352EAAF17C9E9AD26F6BAA9BF69ED7E2A1E6839CEF21817187F0680A8E621879D22B417910F3763BE58FA1D901009742974C672A1AB9EA7B574FD347EF21420F7E42F01727FE2C43E539A729EE0BA8C29B681246E978FB4F1F53BECA0BC0C788A8FA400E37597A87059454B70A00915C3118997DAAC6AD38486AE67A6FF7D229B9A1B771F2B699DE4268ED43586F5D19BC0D7205B9E9D75713C05B5BB8285771045933B59CF699A4EDD4AC332500894E5C8C0964244EAF2534E153193CD3BD9A3951330780D9A0A923259891338B5734563C6DF3AB4F753DCB2904BFE36333DC6D10F08055238504934A23D2230090A928BD9FE7E62AE8B7226A99442E6EB005949D53587D70F72721552953BE60C03F97136A90DFD35DF73C1158CA3999E5673970D2AB6B2ED6103E8C43F30E0030B321C3912B36C8462C095BC099750CB297E9DD7AC9BE867EC71CC97CBAD66F367AC03F1116967F6D33B56AD5FE49CAF4017C7CC0CD4E7FFD63629AB7090D005AB9BF40A652287DBE9BF720AA933165F598B7C4952FBE9FBC4939DDB0158D8F9D50B3F673A4635A4657DD289AE3B34A2F5A5D3DF792267C1C534D51E4E01D00636939A4C96E99FEF9E1A647F2F3D3D5F3C6C2F3397C8607EEDF782CC04073233AFC3269C0A9C76C1C69AF6D9C21C6063D64881EC74D042A930C8D2783AD1C009DCDCE118428BB8D69CA63A2ABB428BD3A736F916688FAB5671111ED88486F2D5C861C7BDE4F037A923C6AACE0134B0132A402A1EE33BF9BEA45A5C7EC771C009DE6D9D456A3B722AF308B769AEE636EF836C4BAF5673FC1AD3DA7F311DF39677C9C9D425E211FE98536CC3ED447DA74174A3E6A885F09E67AA5FD0148DE1300A326E5F4EC285D474B8DF040CB8A090A3F95389AAB0E96DD4119F81771D8AA3AC791B7F3D584C2327DABD64BC2D35B95BA6E9FB4502EBCF6D941C1DBF82817004EF53A882842C2E23C58329B43CCC4624EB3F45886A80C4108ABDE26A2EFB65F0F5C9B0EA28EA8678CBC12B7C81B18D82E55A205E7F89173FD2757604DE80E00 -smlen = 1160 -sm = 7E3B61900E5CC0499F5FB60EFB397CA2CCE800613F07A32F90273714BDE5EA92F2FEF9CEC3007673ACF4E97AEEC7B3326EAA0555AD23566E0153DA4D8D060661EBCD191AC7E3BDAAB48EF400575E7DC749160A44815E29FBEBF477DE90C001980483BF2A5A48B42392030222B9365E30CC0089337157567D014843078D9762D7F9477126007498AD731773D271E2A84CD8F46B71EE653900E5CF3FE18C3EA2C17478CD2A424D9FE9A63B00708EE68179236CDE42FC7F8901329DC4956D00C7C63930B93268D7DB9E10D41251B2DD1DA70001125EEF2BFEEA6AC35A63811921CF64084A00C17BE147CFED70931968404C70408F60E0A901AEFD747DA08D94036D14F052F8872797C8BB0000D923AD54217FF6AAF605A3CA86B6969A73B70B9DB7F8C7F5E8D4B14BF73D2AB002021C7DB87B2E65AC810764BF9CFD5C3DA5E9F30121D6DD031EBA3AC6965E5D3C543700209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E - -count = 25 -seed = 6E0A8EF5156D693FD0140BC4A31084E79773A83F42C8D133AC8A9D62DE3CD74511F893DCB26041E6B35E2B175408FCE7 -mlen = 858 -msg = 8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A -pk = E1B10708F7CB0B566F7A2B73C514D89313F2A23BC3AC034BF53CD0237130B94C888B55200E32B37680A7E2B68BDC0EAB554DE0FA66D651D76F1016D4B0AB01006FD12DDCB304364C3ED3F571A93DD3AD7997075BE4ADB37134687D627CA0A04CC4D237FC5FCED327178A1C3C99F09BA9D0416D3ED54DF85CC50C8574DB7B0F00 -sk = E1B10708F7CB0B566F7A2B73C514D89313F2A23BC3AC034BF53CD0237130B94C888B55200E32B37680A7E2B68BDC0EAB554DE0FA66D651D76F1016D4B0AB01006FD12DDCB304364C3ED3F571A93DD3AD7997075BE4ADB37134687D627CA0A04CC4D237FC5FCED327178A1C3C99F09BA9D0416D3ED54DF85CC50C8574DB7B0F00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008A91A98CD3B9425C73B222E52BF08BC0F2A16F4C12AD1877A54277C820987EFACE9B45812385C6C8E390012450DD7BE2E25ED0C5F8883E8115EE209CFDCCCED413B58A3DFE6C8BF2F8A329C56E37A96A93B033E3E15D85D51C060000000000000089FE2F5C0B5AE9519856B0A873EC963EAD5AB27D213DC676913A816CEB1C4BC8FC2F8FED2E8C9A3ACC697DFF99AA74404DFA3C8655EE2D516C3332472497244D36FDC94B2C69083E9F125C2A2376F5AD6B780022C94F8A0977F0FFFFFFFFFFFFFF19B2104745E5EDDDDEE40765A347331A755200CDEDC5F3EF33C7396B57007930FC16F8D4039198FEE8E265CD3C48F969EA0521E5C97265F8CCE9FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12C7A00289B20AACF1C96FB1F61134FD3EF2C3DF9244BCA16373CD90F21C90599E49778F82E42CE2D372FB46B0DB8F06E5973DBC14AED14614D60300000000000000000000000000000000000000000000000000000000000000000000000000005FA71477CBF1795001FD571F559FD8EC2E247D46D9661A5699B1AD32BAF63E027E25E1A9547C63467C1425CD53EBFAE0B888401660251F51483536B928550100AFD6FA00A9737A1789A0A2F9669B996ECB81F18421375F0B0E375CFE7B09194D54052413030119B9D710ECADB81EC5C15CB8B0215D84D6896FBDBE2555A10F00B60ED309CA16FDBC564DF280B8EA4C5E1E7317A6270F10CE9C57D7B9A820E84EC0241F34E5DBE3F527CA70E668958CB49347E2170CBC44460DBE46419A510600A7E2139A46E250129E622F92A2605BD30B285913A9E6930F988FB6AA9534D31BF598A8CA4EF888B0425B2ACE89E0D7CC4BF94C4BDF788379E2BD6E0998511400FDE542D0BE8446249C1A97EACCFB8652FBB846D0F1E108E2CFDCA00ECB8BDD5BE9124B70E19D42C01E4F9AE7E6F3128379B49A09D03B5FC76BA480EF60070200C6959751BF2AAE856AE97388A6B5E0D5651C4FE0AA99C6EB0B8BB472F12317EDAE8BB50FD5420A67DD7E7BD16E5B0126947D7089BEA3A6E22E027BE0B3EA07009EDD44A42E7B99945D86CEF529BB1646E103164AD18E33BC302840581A6B8608DEDADC14A6886F7F5639E1BAEA6F071F1CDF5D208FC6C37B7583BBC402271B008E4DB1F9669B0122404DE912A1559E82D7433FDB8C5B454B2E732E5A3277FBB49F1BC7535FA1DBCCE419E048C0A9943222CF9C8CA1EAA8A475859608B6722400DFFE1BE045EF7FD41D676A62A18DA1EED42B74EEB44725C76CE5177109AD4DEB19CE85514241A8DCE04D012BBDCD41F376EBF1EFFAE6CFE82A6EFF11B4F80600A2C2653769F43B5BA08CE1CE84515AA43323DFEEB6638A56575416BE759295E99DC628E2F9469E305563EC1320C7553E580F0516C02137B78DE083E3EF1E0E0002C1AD135A82E8B1F681D1E156C5F371CEA98C5B7EC08DE1E1256B5747163A11D75B957D5A59AC3E43EABD99D0FF93A2F4CDFF9472C6626F9D3C9FB0632724002B01C50386993A52BD4B64EF2990CA663009CF0E461E384433F09FDBC6718AB592FB9E6F222CF5F03B2AB6D907C8A6672DC5FF1B9063DEC2D9E69A1B52FE050023761C506FD622D0BEA5B7A90633A9C630646A83C0B41DE345FE25317D1B17E4E7A4A8AAEE35C2008E9A17C0EEF50C5BA4CB66CEAB09F64AB1AF59701BEB19003BA36A447ADF678D1F0961897726F8EC0F2DEE7314CAF8209396986AD3FE9FAD33F4CB8DE954453BFA5180FA0DB143BA61F0BB9DF34022779E7414F166AB2000 -smlen = 1193 -sm = 0FB551F2B18342D5C3636BCAC3DBC6CDF4030150E44C554B5E492F24EEF19CAC1DFD0DAA7F00CD23BFA5370EF1F7892DF61D239BEF5FE1E600550647F682157737F56DB6623B03CDC9EADF019A1DA65DC79CB7AC3F7F672FF8D2FB40C08F00683ED19C7DF5BA27B19E2E1964466AE2939700A7815B92CE880E82EEA40290A83A7F33B82C00EFA3FD3B3A59DCBA6EDCB3BE9806B22B0D7F00903957C71F4A35045502A57B6EAE1F789912002DAEA468E0D68748A8C4EE19537E31FCD920004A9CE6BD43DBFC5431625C293F647CDF3B03003975DE145B2BFC729A2BCC839D2CA160B6A50034A5A90406E5C0E54BA39311FDE1CA9E47D2004B087732227563C7B2CC5AF72FCE1414D1620001C930B1F0BF1B93581594270992AFB755979B6C7984F17470968681511AD7F36403032442E84CD20D7482158612612F89156089B50117AEC3DC3CC1EF232C0A2705E15A038F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A - -count = 26 -seed = 49CC05312D1DBE216FF03B60575017A6A1464C06D2C5A4A6F973AD9F275F7C66163A29A803BE759B117043862D277C27 -mlen = 891 -msg = 30D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 -pk = 8B1EB9AFD25FECFCABCC5CAC544B2DF5C780FBC0557037E02239EE781A6DD9A560119FAD18A5A3888284B170E618D0734EDAC1BCBB0E04480DFCD4C7C2120300BF9E72E9A80BB9C4A467562B028F1E6CB58B87C27F0FD63DC37555AF028CFD8828BE94F9827C3B47A998BEB8E92D62FF53CDF8FFDD4B1D1F533A9E83FEC81300 -sk = 8B1EB9AFD25FECFCABCC5CAC544B2DF5C780FBC0557037E02239EE781A6DD9A560119FAD18A5A3888284B170E618D0734EDAC1BCBB0E04480DFCD4C7C2120300BF9E72E9A80BB9C4A467562B028F1E6CB58B87C27F0FD63DC37555AF028CFD8828BE94F9827C3B47A998BEB8E92D62FF53CDF8FFDD4B1D1F533A9E83FEC8130002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E2203BC814603607D7D36D9C7597DA4CD4CA48B3A089B8D73BA6525D3BBAADA84F40FCFD48D73B54CBCF46452B3DF9ACC76F4B38F2C5AF99FD40109E1F15D6E1039A857C3AE7806638A6021A0A07FA7DAFF2CFE2C8CDA4266B04000000000000000F5CE6824EB9EBB6810EB7911786ACE51C8F8184AD95F06A66079E2426C739EBFD209E4A7B3F087F4DE989EC1F656157043E046F5E5C253C558E03E7B0A053A84078BD73B0AC59DA7A62A77772483E483CAEC86C2920442090FBFFFFFFFFFFFFFFFF8F296BA306E75C3FDB55A936033D8A723D18B73E38059B19B112D66D7D9AB0F48792FD1B1A5C9049AE34C142175A1FD522CCD3B0075652811FFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A3C316DD3DBFC24289CFA95BED8163946703445D209DDB955ED5E15CE43D54F81A2E0FE9CB26C8592D9D93B758260A1DFEE24EF459F21CC197010000000000000000000000000000000000000000000000000000000000000000000000000000C494C32C5056AB27F46E028AA62D5C30DD5F81CD93C9017CFC46A005FED869A3648328BFFE3F82037B260D1E258E36E2F793488098DE3AFCA996F4D0312924007723AF0B3CCB6843E8D1E28F7C9625B12CBF00EF888893E915B27DA9C42453203AAF23C1E3E6AFD4FAEB690B6D4285EE9CDA84C1AB4D1B5EA4F113AFD29A2000B262000314D9F7C9BC88CBA8922010CB60C2FC99224798F162B22DFF680626AB5464A894510214FABC3896B3252EBF04F59F44FCF14E9A562840F677BF201A004D22EFE99366D982066072529A778DD25E580BD32AEA36718D9AA791730397CE62275122188A47DB10EB74A335EF365F32173B84A92B29926EEEEA1F150B1000A32852F74AD63609C6925BBA528CBB7CD56877ACA3ED60871C9D708FDBDFC56BD892A4BFCC9635CA20C9D47178327AC471BFEF46E8177A6467ED52508CF82000DA29B273DBCDFFC42A231DE75AB5CAE19A926D4C90050350F0282CF17A3EC4DA318E8138A45951FCA7131EADF938CC08F2426F562FC45C850ABA56C1A4551300BECCB69CAA4A7AB5B2F0E261BF5D31F3B0E83762F9A534094111CCAF2618A2B546684F169A0B07D2B41F1EE1B05D57C1DDF3D8B9AB9EED5A475562A3E28C110022CB9D06A16BF217BF734CE0BB4411BDEFE5B40A1ADCC756DB78BBBF310FA0B77DA626B8D2B98AEE6C7F4D8E8E49C0E1BD905C9272DAA5E3FDDD3BDE089D11005ADC7DB91D63E1A7DDE849487EA5F39588D1B61B4A345644DAC932202F87F733F9F0ADC10BD50D154C5A0F78FEFEBDEF18ECD844981317F7C52C9F7E6AA40600AFDE3AFB92AC4860C6963B62A1032586478E9A0B56A003965B4D54CB245FD882AB757B7EDC21E97E6E4590983FAD78D6B32B486C0A109DD2187217770B9C0E008B76582C3B6B67E8B502E119390453CB50F711FA7F4C8EC8C1319EB09A31315E6834701A74AC16C7D3B6D323AD377392A3D0107AA0266E8C2D588DE8E48410007DBB0EE2D95B813216C1BED42A5C699533D744CA8A0A62AF146F24ED1D56E6894D5180B278ADF09D35036D318DA1DA2206397B26D3FB172B9731A3571A06180091814C1BAD9327F9E5F745903D470C32FCD7BB03E611B3373D0CB46CB4F49DB6EDE46CC6F835663B5C55A974CA4C0BEF4F6892B9444FB6A0D800C65843970900753F5AC23C7BBE2A80B5D742F92FDBA04FA7C1BCB35CBBDB7B08B5B02802ED689F7A92A7A84AD40F8E3C989171A358425D53C1AD08E4C11691F707F48E401900 -smlen = 1226 -sm = 027C4399995C2ED95200924183C66ABC973400350BF597B84D612797221558D610B57741E300D112F0705A5A9AE89EF16ECD695E6246F33A007052D04623C6E187AA96C7F3E7DB5D5600E901B439FADC40A1AD22372BE97D65FA8B8434B0009FF2940847736DE791CE5A248F037515600C0133EB447550D7FA6FD589DFC5ADC6ACE3D593006BB243477DA8DA4BB6EE198BE3AF9F72A71A0016C47B56CCB93047D5B4EA240916A783A52300AF744CEB712F2A67364EFA169CD449AF425200B0BE805CE97044A28BB30833727C4BD1EF0401ECB4111E15E6E5F7113228DD2C42D3986C7100F8AE872D8220219F8A1907B8CF2108B0CCC70116498DF01D006BF4589CD599FB6D9593E5D001015F30C46C04AA0CEC1C8644CD334A30205C12BB1F2D463DA6A2B5C1B57281B39D0403CF2809FD36661FEB0CAA28C4043E1C908E680189F1B154685E3EDD28FFC9B1025B0030D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 - -count = 27 -seed = C33EE43A9CBB4347BFAF71147B7FBDD88D212462CB06FBE695A35402C503CD15732B7D0E8BF829A555B9167BCFA2F2BF -mlen = 924 -msg = C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 -pk = F44A657B5F1C7D297F8C59D5BEC38AC2B738F6ECC07D521892D45CB3387A2AD628936BD3B81BB3B4162E756A54774F463960D585B19D644C3E8B8876DDC71800E1E1A6DE442D44DA6C92F06F78F5B3CF614B35E05BE7B02B28B96E1F9B224C5D02EBEAF21EFFA9C59B3035CA437C24C806D3B01CA4169BB5CF747B7B18C21700 -sk = F44A657B5F1C7D297F8C59D5BEC38AC2B738F6ECC07D521892D45CB3387A2AD628936BD3B81BB3B4162E756A54774F463960D585B19D644C3E8B8876DDC71800E1E1A6DE442D44DA6C92F06F78F5B3CF614B35E05BE7B02B28B96E1F9B224C5D02EBEAF21EFFA9C59B3035CA437C24C806D3B01CA4169BB5CF747B7B18C2170002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000194B83D94B0D4EEDFC4334768832459FCD0A0ACCAA25397D07A092EA85A173E5F4393969DB4E1EDEAAE58F649F0FBC27B486CD28739A421AB85D34E7D14EC417779EF79933E8EDD73FABC26014D979DC8CF086F13D28ABC51401000000000000001C4533A33E21C0CEAE524FE46036581ADA7AE0319B03E1C8EA55EA0E2B11C4EBAEE03FC8041DC5A69C4D36D59858FD9C26898F42924EAF2BD05FB9E6396F5EC7095FCB94938C5F3FAA2DB14D8A14931F9D80148113D301601CFFFFFFFFFFFFFFFFBCF646994A82F7969B0F3760BABDB45B3A4A4D623004B97573123395C2DACEDCD6664306F7C2798DE86D2C4071FFEE184E96E64DAC58228317CCFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99DF127F7EEC53DEA1BA13F087C04FC8B5026DC6797066E75A458DD88E9DF8E5D211B05CF639599E62CE6F33A5F14E8841D0B0BB2CD99CA4B7CA000000000000000000000000000000000000000000000000000000000000000000000000000000884F82ACCF0F5794CB10EC72681D34D45D6DDCD56762454B5E78A13E473621DE8146312D23DBD172B0DE9601EF34098FBF3A23A60018A499A4C913EA41790C00CA980662C06A466A458AB85F33EBD76D61BD223B5B0F0F7DEC274639C6B8BE9841DA61D122B2931C21B79334EB2BC07EE51084098F8D8BE5AD63BAF20FBE1D00CB97C065AABB110C8F267C6EF78F67791F6755A8C1328CEBA0F925F39FB2066B100881E5B5C2538499C23F15AF27CEAF94D084E3F5F30EB1B8DF116252B200004377C45EDFD31AF8AEC3B4EA67059FD2A7456C63A382278727C8E8A9A8A2E30F6C3B125B8E0B3FA6E47AC590FCE2E80ED9FB21A9492C7924ECC2F099D64A0D003C2045F45D3248737604302F2BFE8AA55DA3A0CE22C750FB167CF56B25F3019870FD40C2BBB81BF9D02F7F63DFDCB479FF32F783EECF370FA50A569C14CB0800F4FDC24453325B624B9E8BA423FE53E778C39F51A20C72A482A965975E64E64DEF60D95AF67024060688DC305A190AF388F1C6F7874C31EA3437324D1A3F140028086BC0448BE3CB31DF812796261EE8E411E5391DCCB5B93BC1B13F33718B50674967EB4A914CED27EA869A8B55514AAE55A8558BF64CE1BE2C6C0E3E9F11000A0ED9A23B89D0A80C0953D3F47143B7B271EA9B7850B4E7B94D8B23247D4D93280B148CE43AAC917782C54DC464825680F22D55CCCF1A5D59E3F54F74261F00C5E8D6B69FBE0B43FE6F99DCBA7E8E061ABB8143DD5C6A8C7C0D50280EE0D6439F6C026FAD6A07066D51AE5FA76B940CE86231BAD06FA070C4A5532195140A005E4EA3DA96B40F0B40C9BEA67C26F0F8B14C280E513C0EB011AE3FB73232402F0C1D0B4F0D9E26500AE61ABEFC2D87C97D28F0AA4D45B73A19C8EEE42C871B006B0A5D45DF19AF39141E384A824ED15EF93C63A9DAA9D0D1EF3AAF5D26E0F3224D0359388EE91CF42F725C2B2998339BEE8DE8FD6615007A5F93990C21601B0003751EF79E1F684878338A7268DAFF1C734F2653B972A4092F2FD35E3AE0EDA877F2D24EBB99375D181070F2C05545A76B5D32A577B4FA1475F73CA2619C1F0025E52C85A843C9F17612E5BFE4A1EF2D4F950D1B6BCE5578934DFA4995DDDCA368E1C27A76B539F3125CE05550E64ED02CAA8367C97129C1FEA36E497B8709000BEBA760AE98A3DC6C3FE584BBF90AF520BD857516DE19322488EB7BC37B528D814AF96B9670B9049018195102C210C21AD1E466903F945600A54C00AA220000 -smlen = 1259 -sm = 6C37F62EB8EE8B0396C20A7BD034B5C5C61801AE869C7B5A3105E2FC24F6AE0D6E3D1E27FE01DE266C3417E7FA9316B0C7DD67C8A635A5C001FBC5D577FE59F9B51D35DC9A4E1AA436A7E801DFE08782B319DFE7933E730DBC48904073DA018D4CBBA38A330154D1D6B3CC1795E0D4BC0801FE14AC58A47D62738B70589BAF0A32C88ABA00F0FFA466799A8BC03659632CD8C54B56063100134DA2E62C277869182E14123800C2F1073E00FCBFED6801721A54731F9835EB1BA44BB9380179FAD193C391B0634759E580CFC516D1F40800D8C13FFA12FAB2CB2516A217FAD50609036D0163C5E7F15D9212D6568E03193CA820481F14011D91A22D8A96E31ECF9E62D61B2A0D138E4B01010DDB2C37B0172DB5FB6B80CD60EC7AB0DD95B9BDC6976B2B60207E5F1DDDEF61070214D85309A255F6BC1FD924DD4C7E9DB1184901D492C47A8D9FDD21664732E1EB1201C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 - -count = 28 -seed = 19CB4BE2332F7FF0C078BC001FAB3C5FD8569A76EBCE373D1ED4FC8EB5D744C6464E2B5EECB9EE836CD5D87BEDA78BA7 -mlen = 957 -msg = 86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 -pk = 8D5C1AFCCD8858ADBBAA524CC68781E4DE053EEF19C7218EF2AEBECCA2BBD51EFA25C2199F8426F12BF4B5B7C77BA5C215772A04C8055663B6A526EAE024210084A65932B08096D0E54D8859D6D314AEA2C5539C3C602A5898602375B647F71B891FEBB8FE5C4957DBF14D7B83997BC083BCD1A37969767436411A019D541900 -sk = 8D5C1AFCCD8858ADBBAA524CC68781E4DE053EEF19C7218EF2AEBECCA2BBD51EFA25C2199F8426F12BF4B5B7C77BA5C215772A04C8055663B6A526EAE024210084A65932B08096D0E54D8859D6D314AEA2C5539C3C602A5898602375B647F71B891FEBB8FE5C4957DBF14D7B83997BC083BCD1A37969767436411A019D54190002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BA953F4F1720EC869D43F90242B45A11D639A926CE7911E27F4BB443D57DBF80768EEFBD087FFFC8CEC2091CFFC32746C85B6B3A02FCD04AE40688CEE7E56B6160C84CC514FC7D2CCA3BE3FE7AC5079ECAB37D389709B59DB11100000000000000BBEEA636EA319E164449E8ADF61B8D7CC3C1D78E71F67ED181F07AEC9A2E17E96551D02F8622F0E5D25A8559D590D8B130E20B6A563D0CCF8986218964F26DCB1D5A390EEB97856BB37A1DDF41845C6DE51FD7554E2FBEB542F1FFFFFFFFFFFFFF5BFF4760D8249F35F894F0F16A2E07EC50039A5505875926B8EF166AA4D2AEB3B152C7F047B04A0C225403D385774DC0F31F80F7D278BBA1C006000000000000000000000000000000000000000000000000000000000000000000000000000000B6F51D2A1212581598CD8C88B47AB3410CEEA8F7FEB171D7B681DBE72944F0CA0CD0BB9859F82AD4D0EF75896445761BF0D55EEF917A108BFE1E000000000000000000000000000000000000000000000000000000000000000000000000000000A33602BF0668787F551D4EADC3229F9BE4E9FE56DD91C4D252551E466B88329407355EA0A00EFC520215F175900ECAF51021A5B1C26CBC8C96456926506F2300FEF9F93E5F27A7CF3ACD77F2AFD581780400A79E4369BAFD36C038B01F0A4301B536F9B0A43A2F7DBD8BC72BFB41BF8B55847E03E6C27EA31BE78A44D89724000EF0566E1D52C9287518CBA4E2F166158A44AD75A4A6FDC4F9F92167F29D05A0D6701667824814C8295ECE544F3317C3CCB1964B92564824235F80146F7C1A006C8994F6D4B256EC697D896467483E8C8DE899C923F9C4B0B8D9EFEEAF7567E103BC8D8276772F68997E0AB114951E2FA61B2AB5DFBFAD9B625F9AD926370D00164E364868112B51FECF43E22539542AD9D19961134909285C0A4ECE0C555400C913AD68B9DABEB3D937ED51E886BD917372CADEB2CAD3F20023F6491B6E0A0001C03FC6937E854E6E38A31DD63CEDC93AB16D2E695AFB57B06916410C23675E264F2F2F6993D12A9C731CE8CF5F4DD04FBCCE8E6E7B053AAB5717398B840000628F5F0797EB0BF56814AB0D4E0E4BB5EF4FA46A268A934ED517EB5701823926866B81320CD9672517A810A485B56A8EC6779AD66F311E210FE0320A40F70B001283ABB8A5DFD72AB5288DC74835E3E1B7C0CF05AF01C218216996A017A1A177C95DF202EBBCB483A878C2C561C11EC8B67C60E8723D582D5B28F6295C9901002FBF4E0EC9CB80A6417C77302A6FAFE4CFE854E94975FDB5DE8E17CD3AAAF35E73E998FAA825A36E41CC2A295FD65146A5A264A09A8DD109790BB8DCBB05230045C4D7D874A931530A47D22220747A6BDEA368A89F169DD31BB3833629ED64FA5A91C935335DCCDB4B949A32102405464E833D5848FC24C5400771536D5C0600868FDACA6AE5A91436A9A7766D2BC432263F32EA2FBAC78E58E3D134392B9FF23357E265CEE5F82F0CE177250569884E91D2771C40AB8BE3264E04DD539B0500469B1E910F510E80ECE21290B05B22D03BAB4D843D761C4B6BBB9EA519C7FF17DDE6CF54881BC10A558FED0C278B85C85FE8374A257223664A70DCC87C090B007B554C545DAB645B0F88F0B251896D2567E8A3361937F56E97EFB10CF392E5568FA5B7D8006E91800A21D410B214892A599718961E7A527CFEC126EFF01F2000BC4523F44C77639F38910852E12111EC801C21307B26CC4420184AC6FDF70D068AB304452BECD0858F2DF0D65F6884B7E799495017019FA3587A5A4302862300 -smlen = 1292 -sm = 5BB44A3A1F40DC6A2A8FDEF37039581F371B0171E2EA3B45B4240E10A39B45404DC3E2AA1500352FC679F1D4E83EB8E30A30C866D275999700ACE7A3B94E7F62E186E187B842B8B743AD3300E0CEACC5E9B1227CFE234292E9B8F59A0793013C10F3FB1E87CB66CA3466310954C1DC2F4600FCDE1D4084D4ACD264E5422E0652DF645B9C012A32FEB712128D92CE5C141704C5CD6F64A30038C646C7378AEC99157CC6673BA77660AB5600398C550A6903848C3D3FE29239553BAACA6900330D311E751C86F6A345ABCDDF3DEEE5F0C501C3987CE3D810A26F9B1C96A5567309265D8E00A244B5E68CBF469A21B35ACA732840F95CED00E983CFB82E5C7073153ECBA0213AC08FF28E0101F54B4A7E254E90788B8079F0BA990F491A83BEC4600CD579E671ECC3DB57C4300203230570690A5237BC43444FFF3D063CC8704501340088C9C95DAD59E332817F24EE0286D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 - -count = 29 -seed = 6BD93FD13C0299B3EC7403638673F3DBC449F3A617B691DDF73C072B62BF028913375D7460BED2CF9FDCA517690CBAC3 -mlen = 990 -msg = 56ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED -pk = 5F7CD48DFFFDF4C439C65EFF89B606CFF6DC78F96A0BE43E4FC89D9185F88908421173820CD475E69CCB40D167405FD15D0301403703A9C599A3D5C81B4C25001FDBB4EC873C98AA77C72DA8C1A1A38199017C90312A4E664BFFFB4143C00E6D8F8E4E88F3217E9DFB658F1E41E497813F2CC2E4BCA435DC2BA8B617F7C50A00 -sk = 5F7CD48DFFFDF4C439C65EFF89B606CFF6DC78F96A0BE43E4FC89D9185F88908421173820CD475E69CCB40D167405FD15D0301403703A9C599A3D5C81B4C25001FDBB4EC873C98AA77C72DA8C1A1A38199017C90312A4E664BFFFB4143C00E6D8F8E4E88F3217E9DFB658F1E41E497813F2CC2E4BCA435DC2BA8B617F7C50A000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092C87D546227B7BC54C068FEC23B6E790E2CBDFE15704C3BFC30122D564318F07F51C691043156114D3544F923E603C974FDCFC8B8DADA4545798F1B8A7E52301118E74DCBB6A9D849968089F75203D67372F37D5B3422C1EB0500000000000000FF091F63CB4D021E60052825868B044D346D05ECC0A66C04682AE16E9D8B74E3F4069C99631F4B28678312E25D57568078CE8C275123A2351620A2DDBA757890D8823B9C0B6EB252EDB486CBF9384A1CB0EF2DBD3854389006FFFFFFFFFFFFFFFF81AC7B1512C6E2315D4134C87FB46FEF611D768D4FF39B2A9A1C2528FEEB7F9907E2C2D79F9359D0A6C2A79FC6D3E51B0402F873DD8301CFFF97FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52733E6005D84F60462452C7D63A626CE469384D32E32F9161A8216C6362D5F35722E5D3419BF02165645AE3CF4F9744307E9A02A7D69AD4C46D03000000000000000000000000000000000000000000000000000000000000000000000000000086448F9BF45E928652477CF1E792455B53C5FE2BEF68F035CED46DF7F531FE373F2EFC49016BFD70C3DF64BF7A2122A3F802D9D8A92293642CC9AEC522131900658BA4E4FA1746A91B6797B09FAEA7EC8136CB7FC4D9DF8246CD777AB9D13674D93F34B3B348328D817870044E1882E7A81A26AD9EAB062E52C277037F5B0F008323F605C27675CEAF34A2E9A8B93183187B22B4F69355915109871C91162E3DF6C26ADDE38085029D8509142714BDA404FDBB79BFC730E48E95F3ABBB1D0A0090B5614005C12EEB2E3DA97F83640D6BF14EC36825BAC115C7638E336840097DDF553CE9A9EBD976608F1F4EF84D677BDCDA5EB8B1226E8B462718317DA11600C21FFB03A12B4C4090D232EFB3304617334008FAC4075293D0DEBCD3E360426419C50A92FB16F08F2A179A671115666AB8C783C8BCD39CED2E91787A8B48040041AB11B1D241364847E698BF6A6D41DF1882E18685B368F3B3961436ED250E8D77EC8808707E3BAA6D7ACE41858EDCD4327BBC8A3C7170B242DCA9A286931F000AA2BDBECFAF3962A2F93F70ECEE2E7450FC94D2323296BA03F857F0FBFE99563A897D53B3D3C20ADB1A71AA69384CDC25A394569D6E9CD04E8C563060191900DA28325CAE49F5CE1BA0BCE397EF75566D2DA7B52B29CCAD669B6195AE84FE3D1C949D659FA22C4D29585543EF4277197E04B035D9C9DA51E2DF90DE9A051E00E0A1CCE88F063F47E971C05C2E32315131D2A85FF26A6DD8ADD664D970DF074763C062BBE71E8374910036FE3AFE842190351F34A837383399333D4DD72409000FD0D757DC4292D950139270A8B0DA24884F087369771CDB045EB65876E1C60AD9CB35D1955953F732CFE5876B78F865331A57BD5469E1DF33773C7E69220F0031F1949396B8C34D6542BB2A60E89B034F3F2A5787043D405F3E30FDABC7BF153B24AF3FEF3847546B07819ED4828FD959A8863FC3D4248B37F34C9474A5070001B14CA2D9419F240D3D839CEE58EB66CCD95482B321E40FD942B3DFDDEBC71807810832B51F3DA4FF6045D1899A634A081717D51C1B2D38DC33696D742F00008712E5EA1364C9D295DB9819697D51718CF4E276C455ECC1626DC06F83E50622B1720B4889CEE2ED1240037B4ED8D21D534D78D93B22798A3481C0500ED611001FABF652956FC6C6EB3F38753919B3E9379D8289A1A6C6C90A4E169E15BA672960B67C24E38C3C3770473823BBC1379B3174B831E4AE5A6B510F1D8C15351400 -smlen = 1325 -sm = 11F2F8917D464539A64E4D73A84DB4BFC01800ED5D74E0D29A9E3551E709AD43D0E0AC98B50056F70194DE4AEFF0EEF9763F2A88EBBACC9801F3F3123FEAA4A581DF9A482C7E125BE105EF00BD2D0BF50D9F495C9E046D34B1ECCECE4BF70191C84F46247C4906FB73D60409616A2D5DC001E9D80F8A777146C895728798605BD9EB9BD000F6E2B4A9153A0FAFB0D2728210424AD753CB01F688B4CFD6D39F23BD5C1CBE3EE74F01A4BA01810836CE8AE1579A49D751E7BF4A4AD62839014645F4D4064886E1F9F4E81638B8B62AED0A013A7C13CD97859BF629C89C17D0AB95968AD60116972727C1F29A66F019317CBF4C2063DC350101DAE6626AA0981E13B2557930063714F28D0001F7DEF3D411981A7F021810924EB655156AFCC633955AFD69651ECE7B203766A30201B052EF93C757703B639F747997C9711E4A6E00CFC126B65C528EB364C8912BE5A00056ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED - -count = 30 -seed = 1787C82DA9F2E6CA9ACF7D6CCA70116A1724902C81EDC1439F332C74807AF2BCCCCDC7AC1788BA798520B2999F39DC3B -mlen = 1023 -msg = E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 -pk = D9D14C9A1418099536B1B02966F242B647CF7FD112470397C63EA945FA38F03EE49FA57F8842F303B8DA8E68910D6322DE6942372BC8A85A26E878141B761500CD88A672B79BF72338D5C5D471E5B449FFF4E701B07F809C48ED915621A786CB5DA6573FFA77854CC2A3BE57708ACCFC7BCA49795B4062BE96624E95319E1D00 -sk = D9D14C9A1418099536B1B02966F242B647CF7FD112470397C63EA945FA38F03EE49FA57F8842F303B8DA8E68910D6322DE6942372BC8A85A26E878141B761500CD88A672B79BF72338D5C5D471E5B449FFF4E701B07F809C48ED915621A786CB5DA6573FFA77854CC2A3BE57708ACCFC7BCA49795B4062BE96624E95319E1D00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008930A7F5A536A36DB37FCE4C3021D98F09B040B64FA7035F2AABBAC6BB8B17A9C208BF557D1D9AF135FBD766DD11DCEDE5F4178C9000C23DB5422CA93EA221F340CAC955939DC12FBBAD44F12274144E052A7CC1677639945C0A00000000000000BE40B8D906D1FF9A09CF9EC7933C8F120CB29B491E4E48766B1250D02AA0347B84BAE8C4A998E3AC37E9A00D4D8BE50972D8FC197CC52D20DBAC74092441A91227F71F3EB35444F971C079D94971DA2B345D9B87725B2E0917FBFFFFFFFFFFFFFFFE78AEBE535E5CAA8A9F07BFEBFDC39E2EFE09CB16F100CC31AD939A7CB5032443E2B91C8ADA882D69A99663156587F1108872592B0C8C0B0609FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF096565BCCAC7E286BF3B501DE1835EB66C43B9E7966990452430EF95F19DDC35FAEE48E8CA77DC2637D963938E9C3C6F49769C4CBF5C146F93060200000000000000000000000000000000000000000000000000000000000000000000000000005271CA8F4ABBAAD90343A2E50B6B87A12514F6042B462E548B1E69E4274D9798F20F16A7F45CAC53B959774D99F100C174C99BF44F8576D10D32735F50230500BE5ACD145411E46FECE87783E72DBF4ACC287E7464FEF0C6F19F7943501122E2F5ED26CE182E792C32BAD41F87F13EA4F020F9E0BF0B63EC172E89E56B6E0300ECB20EE1F807F64DFA367F1F8DBF4C73A0112A9E850E4BC566C2F4586DA3FB43EC165C30B6E9160C3107D681BEFEED13BE7904DF6F32D1DA8A68DA1001AC1A00E354EF943367F825488196CD1F6C279A3A66C738984725B7B25E3BF0DEECD515A6FDB90B605DAFBC6ECA57CDFE6555767C47CF8EC568C1BF2451D55D00CC0B009316C09AD2EDF1CE5E977D740315DC795888F39DBEB3842D178B51AEA139B3425B29E4C8D88A79C210B99E1BFCC3DBC2AE4F2D415CD6CF62A3CF9AA76BD300009E9E2E971E1AA621CDDB54CDBCC373E636CDBB6BB1EA67B07B3DE3EEFE1EF45AA6207C242E0D2A7B74E687FB1F9ECD8F8836185D3BE2D737A661285D12B800008372753F5644A0DC759F51C7F288089FC7EE33DE753D3148E5459010003066EBCC05C3015A668089127FB79D97D07DD261A68695441D8927CD52887717190500647A65FBB9AAC733EA313F1E5174740D8EE6BDD41E58C3C38C794B0153A6E8F67DE57EE56A34D5128E25813040F5FBFDD5DFA8FFE9CA502FBF20C40A3E610F0058506FBFD17B2518C026E4B96201C91BCF7DCAD7C871DFA4EC0C884B4D1C671656DEC8A5EA8EDD0D1563994230103D7B3417F17FB50B17EDE288A3E6D2EB1300E40CCECDA3F4B5D9FDD747BB2B77ED5165F16FA54E28D442813441EDCEBB7E50E150975F5658902C134B0CB308099329022AA7A2F354C361EDA1FBB0948100000C3317A7C1DBF81C790C4EAA20F826273F75D578669C8646F0E82A01B8B421CFB5B0D7C81B005F7FB63B91A3D3AF4A15DD94B33E5F14F4D6EEE8B93151491000E4B2D0900860B06E1C393FDDC40CDFC0766AB43FF72A03A9A2FC8CC12B1DE43F214242494193D01DE583819F184AF3E7499BAC9F95A2BD5C3BFD53CD73130D0073F656EE1494ACAB26C07F441060F305B34120BB4D4DE6CAA06CA085E07367097BF51520082790E979C75F684B5DF439DCCCE1E83324E4460302C9F7CE1304003274948576731887CEF929B1F804EF08AB33764B8328486D5ABE7E2BD139448174BF38BE26C6E181618AEF7CF8636E73EF66E8778CADEF4D0B24152E47B80E00 -smlen = 1358 -sm = 3AABBF5E1233CA9D39D625057F32956D92CC00F70C80F2C04CF8467512F87A8A32866F7F0E00A9CB5F9FF793C9DE540968D9C4E5B9EBA58801A91310BD1FC300FE1EC33D146B806280C24D00F001970F2FDF6942F17D0C7D0538C332208A018D1194F1570CD5DD291FAB008CCFFF488BA3002D1562F25E5CFCB744602F233FEB1E79EC20012ADA2F38D67E94120574D4894BB38F8F5EFD01EABBCAD19A10D8124FE86E55344CACC8FCEE005A4A1B0F9DFA1BDAD31B14AD8026738C3C5101340E7270BEDB6E0E34D966B077A096AED5ED01B55E368781EB9238245706637FD0F42D3C19016CAC7F5348FAE2B010C2165576AE1A1EEFA200935FD925E2A8875BB6AFE3132E25256F575A0000B59C9DA73B1E502D7FF1351AE8881B78B4B0CFCFF0C10C0A85344B7285209C5C0103533351832800786F35158FC9BBF695B12DEC01837CC7C5011E63003E7C0EB1463404E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 - -count = 31 -seed = 9E6E12F025B2A57B0F5A3A9FA70396FC332E1802608E5CA07CC4FBA922F1FE5DEA6721B96F1BA2BFB97825A19F08FF2F -mlen = 1056 -msg = 9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC -pk = 1D49A0A7BC794AB647657D16C0A72053B98957E478FA2D445B03B7624C0A8B134DEB40D961B2880815C8310ED85B9253D6AC9E37BE7D55EA713546AAC3370E0064BB832AD3E3A914BD9C3634E8F3E754D790235D1613661DC82488CEB0C140D041EEE826E9005A5C8D2B9F902C184F378E8DE00CE718B34F503C83FA0B4C1300 -sk = 1D49A0A7BC794AB647657D16C0A72053B98957E478FA2D445B03B7624C0A8B134DEB40D961B2880815C8310ED85B9253D6AC9E37BE7D55EA713546AAC3370E0064BB832AD3E3A914BD9C3634E8F3E754D790235D1613661DC82488CEB0C140D041EEE826E9005A5C8D2B9F902C184F378E8DE00CE718B34F503C83FA0B4C13000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092D530A11722DD507496B5E0873C3220047D12381ED5C48F960DB7825AE8F03AAFB5F93A57150D36DAC27267EBAE8BBB0527B916C6D06AB3289EF73C04214701B291041385CB8B1DCF47188972DEA67134334D95D002FCF7910100000000000000C18C814F20B378FB27B69C6AB8376E84818719220F5B2CC018AE7A8D40906A9C1D60E150CEC46AA88624EF1FBE2DDF0C833FD3E7321B63B802885381123D24DBD359E0861A1C037B255131492A351D9A1910EAEBA0F50256A6E9FFFFFFFFFFFFFF6FD0AF1637E5AA8F11F960BE2EBCF2E6F0DE8DB4EA285F055E14F73B66AA4505BB4F3ED7F7272F8CFDBCDC8EBC845A4B0892BC3888CC6619ED400000000000000000000000000000000000000000000000000000000000000000000000000000009A058B6204B7B58E29CCBF5B217476DF90820BAE07D1BF5CF32331382C7349D50F7A217D6AE576B94DCE7C1D6EE3BF51483C2AE8F2237DE2F0820100000000000000000000000000000000000000000000000000000000000000000000000000002B08CFAE45024134230DAFDFEF306B257AD246AB8574574D1474CF398FA86B5A64F661177405EFEE198F95D120B3297B351FA7FC46F67066761789BB98921500FBD3D4F83B435F1357439FD1E29477CBE3984961A7B457FCFC46688D4B35E21FB2C9377B481AE00C971E4EC3092FC1577A068F3BDB683D5BDC2346702AE41100BEEE83E1F53EF02C1E1CBA0C397EDE27475D2323DB20B6B7EF89B8E8CAC1C12FE36C7DB38CD16AAFC793E7205ABE952B56A65E0337991E0D1E33DE102BDB0F0054332D34593242E581F1464DF6BA51AE4EECAB67E8334B7F128979E8E62F25183AD1B43F666DB5ADD2C1B9E771B42EDF9AB64F101D85256EA09DFC4FDA491000B5A2B006EF11605A60A4F3426E3B97A2B2FE5FD11DE97DB5F032175CBDEF6692BBC62927DAFE86C4DDBB66018CB591B87923370269563D6A78CAF60A3AAE0200E6A15B6FBAA3E6DBB43EF656F08B871A1F2304818047BF0C61D93DEAE1C39625635E1EDB076627F8045B6E5067D1F8D309E60876CC1A5CBEACE1E8FFA9D41C0020547F7AFA3D0B411981D55E0B3B37B86A877AC411D1B8CBE12DD33F52A7C5C0AA0AA44772E3BBBEAC5C908B43B631761B8E5B0219BEA50309BD5BEA770917002719FE9EE21383DEB20F626793C50FF9025CBB6086BF102B171D0830DA311976ECCB61C7E0DD079D27EBA7BA5A33291C3A914DD3A1B82D456FAE783F0B210400D08CBA43ED30B24954E467DC0160CFC540C14C088A3323D8AB3BF5E07F9F6D881E7EB56BCDEF30F5E4CBE34F0FD855BF3D8CE15B29343052E05BE0E9197716003E16E699501D2106DA4693B3FBE7B58467B31EF690677FEC4B1FA275518BE60F735050C1188DE4D19311C04A40DA64F4D2A3E312A0A11453714C99A762A4020007376CB58E5E129ED657FDB78A6AFC771B07709936B913F5ADC5A5148E17DC3BA32C14A4D54BAF61237111F9B94825CA069AB851C44BEF714FAC748C9A201B00B3E3967AC486D139D851B765963ED737482D600E8BB64271D35EB94396E5EFECE1FF1BCE00407C48C5BD40D8D63E403506039F75917222F44A954933D5750D00468FBE308E3BE3F0653B015F81404862727B028F6A15FE7E69D57C04CF36DF9E2863937F74ADBD92D60F2E81254D2BE3EFCCC373909B1851951F594498D11300C19AA3FFBD3393C1FA9DF4E6822DEA0E49BE82A6BA1E13B187D957FCA3FC0848A5011F678D402D70257777756996CE60071E13136CA9ED9CC4BCE4A418D41100 -smlen = 1391 -sm = 95CE29A8F31228EA9902D523E62FEB3ACE8B0034F48870DB5B3E83356BD645385DEDFA20A4004B8102714D4365FE0E442FC2F614828F335201D047376A0C21FB86AF1D741BBF17EF301DF9008E76263462EAA2BFC9D383AF0AE2C862391F009725650F6DFCA22D0884E11B8B0E53A82F5E010C946015D2972E49B5813B997DA352B450A6001C08D02ABF55E507BCF86BE9DD3EF4D513E4001824DD203F1E8C0C15A8BC9F41CDE6EAC209009A1EF8C8A998B95284DA59486B73CA05C9FF00ADFF016501F14ABBD26975530B9CA9481FD700FF6D957EC4B34F3DCAFC55A4BAEB6973094A013F50531E83B98F06555E887E64BC655C090B01D3B40846C9374CA0A96508E9B85218874D210001070163F6F79282A3148F3ACD74976A1371F18F44CE340191D88C18415B1D0D320103C1A534DD5944ABE0FE2E6B3E29551E44028101D70D405AA027670BE9ADF2F32DCF019C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC - -count = 32 -seed = 569B8B9BDB707B19CD6F9BEB29F304D603C1509B9CF25987C280C342E870B1E13EFC7DD7E41DC85BF4F42D0493B84B0F -mlen = 1089 -msg = 7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 -pk = 339212069C1024FFE8266EF734D3916A728201F574C4A0DA3734E9EDE1031FDEF6EDF7F263724332537A2D6DE8E613667159844011559CA521C24EE63C9F1D00501CB86E17B7CCD079CAB8820B2BE1BFBEEDEC93B8F134E934A2799C89FF641017AB8BFDA3EBED92FA78F300F32F6F08F3CCAD2DE47DA4FD853E9DCE02811200 -sk = 339212069C1024FFE8266EF734D3916A728201F574C4A0DA3734E9EDE1031FDEF6EDF7F263724332537A2D6DE8E613667159844011559CA521C24EE63C9F1D00501CB86E17B7CCD079CAB8820B2BE1BFBEEDEC93B8F134E934A2799C89FF641017AB8BFDA3EBED92FA78F300F32F6F08F3CCAD2DE47DA4FD853E9DCE02811200020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F8DD8E54A3538180272A781452C0C97802F46D8A0A88B3679D6BBA88F4FE6200CB0691297BD1CD677CD5BA0E7CB83644708BD36A3B788010BCFEE920509B584414CCCE8826D8891B4F7CFC008CD0B3B05854C49541D19D43AF3FFFFFFFFFFFFFF16EF90C0F0574369AC1150B6733696ABD90F285731B6C76A1F0D82561642F091B32EC585B5A24C09FF1103675E8DF00568E16C137B9FAC1FFD8B26DE33EB3D6858C63480DF05CD398E47520134930B408FDBD50F231A7BB9C4F3FFFFFFFFFFFFFFBE5E29C6CC83A6425CE291BD2988529867E9713FD8F48DF67498A1161787557EAFCEE2CE86FD0CE557DF0DCC132D76089407BA7CD914BE57AE2E0200000000000000000000000000000000000000000000000000000000000000000000000000007F64716EA9FCCDB66892E5F5B9D9BD3282D8FFD82F7C7B5D645D5EC06F7FFF078B574CC71BEA905F51C62D12B22FFC86DB6A2A44789E98F77CCC0000000000000000000000000000000000000000000000000000000000000000000000000000007E4E074C00F83267A17F6D0637F7D4CA99ED77F6A1A28C6E2EC665ABE790E153DFFB49BC0F093D1328E91025522FF5F261CF55837B0F296FF032F4324BB020000777DFF64DC696AA19BBCB4C7CF8E99F4632289988D8CA0341A1B6AD9DF464DD470767A18BAD2A8369F79252FBA7ACFF35C07E7E29D43889F5F34CC31AD30800D23156CAACFF24DF988223B284171584BFA7D658CCE3A9CE247A8CA97E1031D9D8B97361340FE35883198828A3CD00253C0C1A09E2FF1C57A4DBED6280BC1A00B3E7A5BD72A7EA1221A5D3A2625DFE6476BED85CC00A66261575F06854E24B281902E19181F5C0F1AEF29EF1D8596870A745CC3A5391C9E6E96CED9CDFAD00006471DD7F33822154149CDAEED3180A19CB2547C1B49A477B32079E84C069D3A91AC933BB2765621B84B58863AE8C5A6B200AB58723D9C4A1A03D35B7EC5408006665C47A07AA977F6FD28209DD7BDDC74A35B344399471E52D6DDDBD9DE353D35F5111B9080FC5A58B3783872519B68781758911EC3018483EE76CDAE1000B00CD375FE06EF78DA91CE61C38A89AC417966C6DB8FCBAC9106A9269FD980B82B8CF21C072C69464862C1B0BCD8088DB2FF74FD583A14DF4723DDDF59176DB0900E282993ADFDB32A3E9B885291C1FDA3A6E624C6DF6968C02A4D853B899E8CFC64C097488A49022160987D7674925A7512FDB3FE5C90E4C2366E459EC2ED023009F0E067DE0C3CA1138D6B4A730EAF50CCFDCC7CB49C2F7ABFF3313CD8BE3A7D0B1544CD62C630B76CD16AC4FECF6BB275A6A418F4F06F3AACFD63E7408591D00D730340891FB6C5590027D5932DCF6D66FEF9CDBC83AF68DF607FA6B12999DA774075F1F040B9611DFD70EB33EEF6BC0344A58060728269E47209DE5F23C13008A0B007CADBD7C1CC39A5CF6DE3B1B5E56AEA6B32BD5EFB2931D0F93F41105F873BE2142A5C9F297844C85E73D1D2E1F73CD2F85C3370C532F5286485B092200980365E9E7628D3AA8CC9291EBB09F2E6FCCFCDA091B692B798795CB428808EE443A08AA88173D6B9DDA49159A5FC416432F69E377F6155EAFA694732FA91400B99CAEA056B15D0570F2668C2F9B8C50A77E1CCA315ADE1FB4735DF9EE690ED35979FC1E1F82D9205D404C5C4E2073E0D35DEAD355A55B4BFA90B99B735D1300550A032F36363FCDF29E07753A6371A4B7CF46C7F203FDC32028FF4BC7459537EF862A576159D7040CD92CDE43936A649FB8C10411209C1FA7CF60D91A682100 -smlen = 1424 -sm = 5C4E53D03F1FCBF5F1D2307C8D57D39227E6006658BA5BFBCD77D261936DF0D0E848F6E041004D0E5039109F5FFE1DE801A4E5FB0F5901B8013F82FA2A1A7389794D0E9D4B041390D2A8690174DED886614D6867E719C55D1C5F2147810200CD6B849F167D7337A142B3CBFE11625D5C8001908C48C1D954008216C6E999B4F5A68F5A030072311D88DB39A6556E4A1BE456AC85F4A30A0002E664CBBD8AE8A44DA572B73C9313CF05A3010085CDB61D41F609D660183D74CAE8F12BEE00C2067D7DC2188C3414D3510E523061DFE4DE01F81ED159606953F6C812D7D8FEE2B64D32DD00ED39A9274479BCDE20077B8FB327974EECA100E8B97141BF7B9A6C4DC4551F41B380395FBE00006F7B2B4ADDF14F082B8DF8676FF60C7476F2567076C61FBE490459A1BE3269F80503532B8C9EC48E3C0EDB4337C0D147664EEEDE00A5BC4F63A74A2F6D2FBD27C1274E027FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 - -count = 33 -seed = F32C3715B0BA8C1D0BD59F0645E9697DFCF9AEAF761A71ECDF9672215B9F138C0502D7214F6B1BB4D6612432F9FBED5E -mlen = 1122 -msg = 789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F -pk = 4F45C443BC27B51BA26F58F26290D64BF293DE271F9C823A10B8D998443BEEF556C92B8ACBA4F8EEC3D82982D69AF0C564DF728B6B647C40B1B3073BA4201A007D9B160929620DD072465943BF0EA2BA13421960037BD8A0870F3105E1F34A7F480D5E8891EEDF3EAF60E65696671026F3FE0B280A2D8FBCC035D800725E1800 -sk = 4F45C443BC27B51BA26F58F26290D64BF293DE271F9C823A10B8D998443BEEF556C92B8ACBA4F8EEC3D82982D69AF0C564DF728B6B647C40B1B3073BA4201A007D9B160929620DD072465943BF0EA2BA13421960037BD8A0870F3105E1F34A7F480D5E8891EEDF3EAF60E65696671026F3FE0B280A2D8FBCC035D800725E18000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069EA6A1FADE0B50B677DAC681489AC7DFB89BFEE8540BCDE1A7A87DBFEF72A149C46BB14180BB6989BB0127FF6AF79A28F99E02D1870F7C2F96FCEA745C18F530C69D71183C77548749880FF07B9E23CA300C1E0F1F5AE126CF9FFFFFFFFFFFFFFF6EDD4EE5EEFA55023ACC337C3A68B5EB2265C129CCD9A63E75CFB70C73F429DC254A962782AF6C153388E7E28599869136EC907F2EA9445399840085AD15F48FC29B13066346CFB86638174398C8C574723F87B50BB4711E9EFFFFFFFFFFFFFFFF6E07E8499ACCA013F4B4E3A1D5F383C92830539FC09962F9336FF3687DF7CABB580B5ED6E799C10A2FC9B2D3927A5BF6E0193216D8B81DA11FB01000000000000000000000000000000000000000000000000000000000000000000000000000097C71535BEF292F35E6F7092856A8649D5D724357B6224506EE304F84A4C87A507510C1F48DE1CE9F1C1ACC26673DF13835D033AEF64665CE10D0300000000000000000000000000000000000000000000000000000000000000000000000000001B68FAF48375C85C2BA545E81A17F53F75B970DFF82DED13FA868594925996E49E5A2A6CCEE6261EE3E65CC5ABBE191AA08FA0F8005DA9004786E34B8DCC18005DCAD8251B804F9761235F78171246B598757ED7FFFAE1DB9E028D877BB33038CE87DF2F5F51EE53AC3E0B9561C836D56A7AAE47967B3201ACB4D3C97BEB0300F5423E012567F99901EE9E73E96DD9F7DD30F63F403ABCAE9C1F84FA63CCC08BAC316B8E54E0EB0E73F3219E5551AE99AE1F81746BC5BDA1DE9B902A3A820E004FF422935987053E3DAC0E9950E21E27171E886E308E6644DE0D40C19A61DCCCF85AABCB09E0AD8F390288BC8D6C31EC4FA854F2A7E5E59D02AF12872EB321007F2F41767E5D43C3537DB6D43C5774FCD3EBEF81CD862738E905688FE1222A8B99FFAA1CA24451961206F0040F4121A0149210ACEC33F6F78AEF74560F3C0E00B74EB19DA29F6F0684DD1C2F7AC24B52E476DE342C8A86D7D91A4FB7EB582821702E3B0909B2C9E308D5F70BF57E6D0E7E6170853BC9694FAA2E5C2B7BF10400E8BD6CF855FE71FBDC2E45CCEED9A4F657387390C12B5DC9D949FDDC3C56D28EF78D7578070984C025FC6AE14930B68CAC94F3946CE607EF1494B39B44310B00FDD3C75710E118F986D7EB7FF3D5E74A4F81F5B8C00EED59676995FE9E7277FA3B16042429ED762A8309C23A7EE154431F0613E2A93EF32D186C8A5922D41200548D12142F5EF6776077E0C5EACB527D53E69F985DAB4EE3E7A410AE632AE4FC58A49C6B26643C6A111080A93F45BA64438F1605C89892574C1DD3B2BBAA22005F466F91E3B39CB3248AC03C0EB7D10EB784045D9AE2079DEDA876D6ABBB059FC2F748113E8671C0C174B796216820A3E496C3649905C06D6092FBF2BEFE14003A060CE6A2405218F6689A0C6310ECAA185C193A96E0A019028A744B2039A59C4EFFB9F1CF2D06C3BD1D6E45674C6308B1785AFAE1C87DF18E00C16D3F620F005EE2C5D4148B2D6DACF97F65393BA765DEC570C35CE79834ACFB42C0576AE15DDDA3841AF3083BAD8FB1D2886007BE0617F70CD081152F744A140F43B5341700E627C80CF6CAF69B912FA11FE71F448F0F676DF45E98B5B90EDC9A990D789D719F2DC28F50ECD7ACF82242AB2FA1DC46A7A2D73BB12C6F06DFE1B0187A8B02005B3C8D96CA93075B63104C4CEC0993AD3786B2B263F0B7DA948D1B21D816B89D52842C0B05F819B7C2D545356EB9B663E02A59DDD46523D6FD1AD1F33AF61500 -smlen = 1457 -sm = 84C2CD20B431DFB09DE4B00E17279CE0093E0128EA024DB6638AA1414941ACE71B8FE991C9013E90623D3D9FA4A0E18F35D875AB1A23004A010DF1C02858040C627BB0DD662F88D14D69F800008CCE1F62D3870535A82B2A96401DC8361401B1C855A9A8868B8B135D2BAB3D7A7E9E12EE0128CEA7776DFC1E81F0D6123ABAEC0B7BE0DD0086FB2FD4EF805A9A7EB1CCD63B2D05AD441C01480FBEDE1744A59F6DC2D4D1AB9D8D5B788D0057EE0D6B030004EE5F48E12B90257C65D82601AA07C5F0476CFBECE26098E03AE4B24C931501E3697891B8CF7FDD1A11F9FFEA8A0418EDF10060881A3226D670B57ECA125B9F722B05E647013471E85223B527187B96B75886BDA2F6AAB401017949A42E3E5258EEF1D67A597518FC690D94906BA32319FA0F9D5D1BC70AC103020082AA1B70B67D08EE46E98B9271C19BD4259801E9B3E31F7FD64E7F21F32F03C86700789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F - -count = 34 -seed = B0C7530A52AC9F561C2C14548D3A5F5053396B738EA1C7A5190F5AB01C9C38719C4DBE856E42D37A114FA24FD5DF5081 -mlen = 1155 -msg = A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B -pk = 91AA9FF551B7DD26FD1C90DC1705F2B6FE581511237F12FA5B0945AAD69438FE3A4600A2D620573CAC1BFB7F19D4B81EE763AD26007909B70FA68D4BBB772200BB98EA483AD7721CAF8645D022E2C9F95DE6CD60457B1A2514F5E8DE21F263E467D4F156162F85DED0A90735E4EBEB5991C537CEC8181CC53F4FA33B2D5E1100 -sk = 91AA9FF551B7DD26FD1C90DC1705F2B6FE581511237F12FA5B0945AAD69438FE3A4600A2D620573CAC1BFB7F19D4B81EE763AD26007909B70FA68D4BBB772200BB98EA483AD7721CAF8645D022E2C9F95DE6CD60457B1A2514F5E8DE21F263E467D4F156162F85DED0A90735E4EBEB5991C537CEC8181CC53F4FA33B2D5E11000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083FCB9A16A1D66A5DDDDFE943DDF65D2C517C2AE38BB51CF9D0447A1FC244FE76DBBC332CD72802CEB0023B81D5FAD8960F5877076106D1667885BB6DDB340B7016911C91F227AAE8720C8EB3FE0C2EE7FE0462B00219E89D70F000000000000009CE1CB95B99193B93CAD39F0F0DEC4FC710A97529930D03426F127B2C82F66E194F50E1580425B264F71BBDEBF017031DACB356EB72D2452D40017F1B43A814C8B4C5C5F563AF2444E503F03C8145C2B1DAD5CA883A54956F8F3FFFFFFFFFFFFFF3C380B8A7EEC347F3DE97527F10C6C7A5D66F1449D785133736E82A85892A6D93C0AF7DB175F9FD3D90B7C770B96C674E7A023F5729849403753000000000000000000000000000000000000000000000000000000000000000000000000000000FDC1A58E2C2D3A79FBACF3618DA1ADA513E84332EA2C5DA788D0C0CB0CE0DF0075E5370294D5EBC8C5CB36EB99B24C42CA8ED8D2E61C32372157020000000000000000000000000000000000000000000000000000000000000000000000000000A42F2035D5C93B8BA2D310F45390128843952CC235ADD06ABB742970B7BDFC3EA91B0890F204ED7D42F1F35ADC7B054437294046046ADC1C223FB3A585F20F00228E464520267E2002C3D86B160825D3C68B063A50ADA20C894279A5F8E7B5ED3CCA9488C47B9B574FBC9E890C840AA38C801D3E9BE262CAE682B51CCD441F00BCE14482CC29E9773ED629465CFE56C67B3B9E31C61988FF7D060F6E8EADAAA0E76B7C0D74B0CCAAF067EF263C4D4A0CFC7A4144791149DA06DEE707BC9F1400340D435DE49D88AFDFE1FD929BCFE279E00B8BCC01E11C0FE52E09132904C742E35BDAE78783CF8E2646F2D3995499292D7B5E60122738E4B6236F402C390100920DA80B9A84F93445C94D0E7A4125FDD34C802B6B236FDEB70C9D62AF4B9CC2AEEBC91E4B7C4A92336EE18F488621E3F0107D1A0F6899BBE54A0F4E19C31400E643E8269E058D991425D30A14981CCEE9969399798AFE09E610F119831489DD6EBB15EFF52F184FA4DD465FFC6E5FA60FA78A4B06DFFF211E6CBFFE07EA0D00A4D988A3E8017D47FF65B83B7193502AE9EE692413D784BC2863DC90BCE87715CE71A4614A3367C0F860F03F144DF4E6CD562BA3411CE457AF7B7356E3D510004BB85D5F348DA25BA39E26D777C9191647B91E6B7973BD315F9AF84732B6DC5686459A961C0C2075E5AC8632E0EDB51AACB23CBAB978D997AEB4DE4DF863030055AFB3FB8368C2941AA85C8D6D965151B0BF1AA1C99659BBD89F77590BAF7FA683C3B13F2762ED13461F66D482A4D04EF7431397EDF4D15EE70CCE6D288D2400FC851F4145124E89C55A419B220E213EAB6C3ED265553BD563596E043F61D1618A8BB077B8056748A7A4BFA57A0C08A6C5661E059A31696CE00DCF956DDD190010CC1A2EB72EDE10A173DE8E7406F1B7953AE0AE6BC1DEB8706963EF669FCFFA7644F4032133692A12234FFC83554725279763AEAE5371C05334531A58B303000EC727B6B0325C09F81CCB2C0F499F045C83C62DEFD45F74C8BEF5E4FFC0C433C8B8004AF2A6FF980D2668519F010E16066801EE7354FA20DD920C07B2D11D00C72F414916D029305969BACCDDA353149ABF04AC5FF5ABBB7ADAB8EE0D9803AC48EAE131CBA2302EDED36378D68A384DCD520D2011811E22FC90888CC2F319009B9175328AAE42962A269AA95E86C15E71166B6B036547A94D29FA86AAC51B24DA5CA84A2342E6A64A21867E45B8683BB4F49FA3ADA2084EC122385C941F1600 -smlen = 1490 -sm = 4268D15938C0FDDEBADAE556BF64843EB9A5009076446076D2422CEAD0813EFA60CCC639E701D35D8508ECCE02B19483F771396B2D79709C006B9BFE163B7C05F2269F106294E6E52EFAF00044CC93CF18F51E844D6B665DF8F90AE90EDB007C7283637F89DDCC77D05553E7274194366801444FB241E398901581FDEB60E74661EF4ED901E6DEFC4D6A73D562348C4573D9FEA4FC750300D0471B670C5FFF9785309633DEB0409A6B7101513C5BC369B934BDC001ACF8F3ED91FB834500F359AA41238B1723824CEACB990999373690019F51202FCBAA526C994F3D9808A8A836F9A3015F23D18EC55925867407F1E7A18535F1E294012AD4C12B2F1A69FD8143D6A83787500F77430001C30E11CE4CD7B5AAF98F71F8EEFB752335273D09782B8A4300EDE9E4488682C80603DE64A3A48222D8F15C06A2BCC7DAE195835100B6DEF1BC2ADD358C5A21298C6D0F00A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B - -count = 35 -seed = B2FD7BFAAFB667C9DABE5915C3BC271EF41F18588666A6F4990C09D098E62DB590110DF6A56F08C5E0DE65B00F91D60F -mlen = 1188 -msg = E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED -pk = A108B59E7561437F7ADCD284AFCB9FBC7EA28E78773FBE22F329670F23DE30158EDC25160E50614DE652E2C2807C0912509622C1F241ECD782A0BDB68A210E0065EC73AB310BEE3B0871D9EBDDEF24583C91DBBE9563AFA585EEBCD4A6EF50F69A9872719A37DCF30697B10C12F1073420A58BE9E361F2497C07B9814CBE0000 -sk = A108B59E7561437F7ADCD284AFCB9FBC7EA28E78773FBE22F329670F23DE30158EDC25160E50614DE652E2C2807C0912509622C1F241ECD782A0BDB68A210E0065EC73AB310BEE3B0871D9EBDDEF24583C91DBBE9563AFA585EEBCD4A6EF50F69A9872719A37DCF30697B10C12F1073420A58BE9E361F2497C07B9814CBE0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002A458D653F60B90F9596D7D3EB45BE737D0BC15B04815BD546E2B0A643EE0782E60116E3DA4FC2DFD7D0BDC957CED197858D62DCD5655D907E0704D17904AEF116CCA6C57DF5286B788BD687D07791F4452C65C237ABC980CF110000000000000075FC553E7D3CFD74DB0BA2872F9317896FD9CF32E2237AFDD740BCAD834F7C2650BC67038CE6FBEA6521B782CE0AF380E34397A6B3F3706D81F34637C671443AEEBA372373349465C2217B469815DDEEE6DBA864D032119C39E8FFFFFFFFFFFFFF65683375B1D62198EA817653FA420805441B6922579DE08B2E28494F9D1C4E4E0CEBBAA634DD08515523328BA2DDE677930C08729E8E690A6A37FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE30028C902AD021B5D047210210D3CE25F4E9773F96644E173F898FE6470B382C07C883E935180522C271413AC94BBFEF9DABC5711FCF314B600100000000000000000000000000000000000000000000000000000000000000000000000000002C89FD2C776522C9FC100864873793E033E0F52874E6D88EB2CBEB252B5EF1E246BF64065D8C5844590848ED6ACA77144EABA9165049BDA98C658D7E4C841B00F68424F4E178DB4A5617D8EF0ADA11FAE0915FA16B513B08B415CF35076A712E021F2EDCDE5DE65D608823EFE1ED99C51BDE55FAC2493AE943A68CD028391D0075B05249C45940894D305EA91023168A4E684AA4CAD3B4237993444BD008289257BEE589B9BB16D9E5B008D9E77F24E0B83BA3BC445F73FBAA2F69DCB7981600BC920E115B4D8DF4FCA09869C36C0338D1EA9A1B1EADF274649BE754DB711D87838F2742F949FD9769DDF95750C838624AA9BF193F584778DD7E26CCF9AC21002BE073538FFE27F9A229173869E6F1F313AD16F0597A7B530A601160C05740C368B6BBB7059548DD05B2082335523197D09863001A5D7B412CF0B40BC40816008DCDC27E8DBE53734E16B60BF05BC8896056672BF10865EEA91FCB6CBB73035FA630A1167F26EFC4EA48C07434E6C5F83E66EBE7C17060D7DAE37D1CE0E50700CFC2C568AAE92314524FA9439BA0ABF246DF8CED98936F708C5D7E71FF8263BFA341FAB4186361D8FDEA51B4777245F01DA8ED1322012DA2B471F6B7ED2D2500509288DCCB7389F04D8F886BD921C9D55FA3E648294C653204ACC5AF12E5048FB2F5A42F799805FFD87A870895260DFC545135496FC3478A126D759A1ECB1A00F7C7F4FC215986F5977722C4B6657D7B3F391A61C88C494BF52C37002DEB7E9B60D9D2B7B23277AEB3CC295D12312D95C9A0A34A37176FCA94271DC85B07230051BEDC281EDAA1BF35FE59556B43D8742A29DCF49AB95D70321648BF24A856F93C35972A1D0D616D6C90A7207189CB4B5622C6C31CBEAF8068B5652495311D00DDBB611BE5068A7BAF40859CAAD0FBB7B1AFA8742AF1049AC63F773C97E0ACFC8F4C0AD83506B6D6B68DFB815FA880D8F425402914394C8F3572A851095C0E00DC040716B403B33BFD2C5BC7E862F86C00F7C22F10D21C86B7CB50BA9346875C5E4799AFECD67A71B843809778C796B827EA7471545D715AAFD2A5D4F3B00F001E5CE4C80BAA8118AC584A16B97FE8100319DC2E92FE6387D319FF4576D89225DEDC8BC883D9226C7AF3A5AD3878997BE0A3EDDB445443BDD56AB3B4F5AC1A003CA2F706978D91990696659EC899BF9F9E8220E17FE5EE3E6D29A02E5763A8DC8E96AEB5B9EDE0DCC0B668BD5A88A687FAA64CF91FF04DFDB8AF1A1315211100 -smlen = 1523 -sm = 4F5228F009D11395B23FD453715EC6A12B6401136C9BD309358831ADD830316CBE147120B700696579C481E892DD7620D9E6ABF202B3ADD200A6279CFB44306EA86718A11CFD0AF64FD44301141B4E8686AFDD93CD08336A55E282B775CE01A1FEEA159F6EA37D034BDDC272F36BA5D72300FA8A9EEADFB0152CDBE4B62A332CA0511801002D76D992AF95F1B4DA5D38180B2750FC203900248FF739AE94DE403D7F4631541DC0329DC70089FF78A88922E6415D3A53C83C3AFE4783B301336F64AAFD3BF6403B7704B105EDADD5EF5E01B1C30607AAC51BDA6982EE444019DFB88D0000A506C09580CC70020D3D5C4EF3CC5229C11F00F3F4E3BD4D0877C64B4B6F9D4314009E5DAA000107D538457778F730F417A6300AD42D8E3A28911401E45D30AC7E240F237B140F03018B52B6E3F938A712E138B0C050B2A3CB6F8A0087FDA55670F8CE91AEC9B1D0D11500E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED - -count = 36 -seed = C08E846A8E039C8655651919A8433D475F494899FB617DC3B4715DEF0C992C195CE38158B7FF40E0684B30FD7E623265 -mlen = 1221 -msg = 743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 -pk = 2535ACE85C6A60B4C002EA148EC67C3448037A9DE6C5973933E10BD29614F8C840A6512654DC0E58C71EE51A72685A55C66B71955C58CEDD139D7086199100003A33C65A1E7508F7DF473E15F95C8867BEC2FAE0F54AF53A51A051A0A816F5AF5B24B5A2F7744884D3EC6D00D061CCE71F9D5CC0A7AFE769930FA16EEBA00300 -sk = 2535ACE85C6A60B4C002EA148EC67C3448037A9DE6C5973933E10BD29614F8C840A6512654DC0E58C71EE51A72685A55C66B71955C58CEDD139D7086199100003A33C65A1E7508F7DF473E15F95C8867BEC2FAE0F54AF53A51A051A0A816F5AF5B24B5A2F7744884D3EC6D00D061CCE71F9D5CC0A7AFE769930FA16EEBA0030002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DF0EF0C0F6F9CFE1235F8AAD8B06499FA9FB7A17893FA8077BFAF02D9197A20F0D01CCC6890ECCC128C5175162C98AC7A97232DA7917126D8FED05AC04FE22249041C97BC9535367B5B532779A60DE259FD5DA3225918428DA060000000000000052BBF6117F8C7236D57BF62934A90658FF2CE6D8E31238A9070C587E02144DCEF0ACA80C3749B29179B6453A3162ADACC73240211C73D6392374F17647875B8448D1F3B9FF2B96A3D8ED7C01F0B7369088E66A16B63E402A00F1FFFFFFFFFFFFFF3A2E6BDEEA41FF1D72FA2F0204EC6EA908719C385D6777A6366E5A1D8C271E9A5A4748DF4FA4CB14B53862E6FBB77081243AC1BE929AA2E33174FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF313F5C5953F9F604E109D831E9CF9521F8A1BD6B498D7C1FFF3CC9FD341F630D3BBE8AF99765E5459936EB9525A7E8E4A14AF44EECBEAA64690E02000000000000000000000000000000000000000000000000000000000000000000000000000065FFBE6B24AEB98ED2CA38A97B7220B37E6F1FF4A48E840538C60935C1B8DE7EAC696BCC69B0B999E288CB40DA6B54E61EC6E5175D2CBEDC9C279C0B9BD11400CE4912862BC28394E4174C88AE88299655B30CCB42C47B42BB0719C3EF8DB78FD97C6E0F6960D532E9957013AB809BABCE120331E132EE6E5CEE68FE68E51F00BCB2063008B0FB07AF0E6E9752150F4DAF702A7978D1E69F433F4F7A02A4F98FED923EEBD9F1D4E09D1E11A16288909190DADEFFBA69410CAAF8C48C61EE1A00AA0DAD570B8B8A7952FD2164DCF8147E80F7F73D9B35E9A2C0A2909F4A75F352D33D33F32C4A9793011079C745E55866E6CA2C11AFB0DD0200A4F482FE8921004FA120F6EB49F0DAE4B61F869AAFAFC68AF5AC98482AD7D2D86507231DFD28B95F6316193DA698F64573218FC6385E4BA075413C09F3DEE1A8BCC31B96BB0300695A11D799BA5B27821407A0426EA7AD368F26E449878D524BC5D0EC22464840FD2658BA374E3FD8D4B40E9987680A8BD01922D22F09994CF1CB14D0F9200F000B055B198F2B480E18449795F96631744031491F8EB6D8DA961F70B6FCCC077E1AD84A7E987E87E0753E5FC9DECE7550E421E97F6A54123B06C067C254921B0069047CE70FB0D5F01FC18C9D42C209CE790E7F5F62B88E17E30413D4F28D8E6015FED857C0065EBC854E113704CF5E62C09D6E1A91D4A67AB37E6CC267180600D1194A5AA1E258085EE291B62E31383607122036736F41EE5016E3133B0BA9929DA40ED3E1981E9EBB2976BC07A78CE1BB0139ED61C913853C5BC94B7FE30900269AFCA09375BB4E79C0BC24B217238263043F697B664A40C021DEE28561704402E633BABE515840B3B57888B9BD4F287B1A87FCCDFB37E7E3C35FB32E231F007479014E0BF0B24BAD1B45AC6CC34ABEDC81F325514E9408151FA96C50E5A76B406881E085874BB2EF91970265D1EC5ACB3CBF6BAD25D441D1E2F6F871F21C00A8392357D3F6E9D76851047AA74F6FCF62434F59EF05FF5B791A382C638298E221AEA48592229E506ED9B8FC58BD446AE4CD1A085A1C1C87BA12AE1B3F2D1E00E2C3D9770E2B0717CCC71B3157ADEF7CE4CE0B8547BB002668408F78C93214FA84D6AB341D2CE8F76EF7515A42B8328392512D6B674D80A73652A2E6B91C0F00952D6F3ABDF5FCBACDBF3F5BFC6D30C855E2F447575740389CB0FC7C1CF3E0E4DD4F033A69B0BE0D9071F20E7E1748534F0EC2268B1ED61006FC1239AA591C00 -smlen = 1556 -sm = CB91BAE2C9E7A46FB8DCA30A6F800001E29C00DBFEC2239B3784E4C3D17A326C926CF1CACA01A9C12B3EEE31EA2529DF79B06E0258C1F0FF0050B144BFC5C4D8921144F6A6121433BC509800542A1D420D8F3053E88B846CD3C8BD7A6C5401518FBE2070F49412769C5BDD872FFAEFF4DC0068F5B52A5222EDB2A006F83EFC8B033A1E7801587FA308048135201F533E0A74F5BC1E63ED01BF80FE093718E41770004F17B68ACE2554D400416F75904F503ACE2185A320416213565E06016FEDE4DF4C3518A08F09B754BFF14C9F7591002B79AFA106573633762B29184D304A17DFD4003B297EB2F1C6FA95A798F42E6B1B900A654E00D27C56DBF922F7B4629157570BFDD731F57B000193D77795D208AD49E39EFC92F2D92BD38D93314157DE6E27140CFCA774740D960503442B8265B4138107B3ADDA69FA0D69A88CF201B1768E50107F749AD6B6D75C299103743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 - -count = 37 -seed = 1D9C060EA0408A068BD982D9694D39D02BA5A473378F6F9F09349F686566F331E767263FAFF5DC0E823BB6F648843876 -mlen = 1254 -msg = 3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 -pk = 28031C0C23372536F4699B6CFEB1D56C63FCE3E876A2205DACF8185F66B00B8F2B740AC6FD469ABAF405638F0F6D56BE67444EF92DAEFEF782FAEE06FD682400A6B42FE94379CD86EE46DEF2CC04D6A90134663C4E9AB715A47EEC82745430FDDE4107493DA9BDA315B8CAE1C5E02B669CD9D7A6A659BBCD07365C190E542400 -sk = 28031C0C23372536F4699B6CFEB1D56C63FCE3E876A2205DACF8185F66B00B8F2B740AC6FD469ABAF405638F0F6D56BE67444EF92DAEFEF782FAEE06FD682400A6B42FE94379CD86EE46DEF2CC04D6A90134663C4E9AB715A47EEC82745430FDDE4107493DA9BDA315B8CAE1C5E02B669CD9D7A6A659BBCD07365C190E5424000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ADF5C08A76B7B2BEACB09DC3D79ECB9A1B800650B5847B27DAA931A2A1AE0893836C7A02E94D321EADE5963F57957578570B3D68C6B45E7E4578EDBC9C91778421ED8B750020567BEFE7AD88D9AB320CD060117E80643112FFFFFFFFFFFFFFFFE8795EE6B38FA9E901519A8A302C864E8DB28B8ECB06F2D83E725B2C21A075F4B90273E303DDF27C2296EEDE65F783BB83578F526C698E63980FAF5E6121C4F79B198F88B4E943F45130DDC5E31C01D8CF54694414076F662DFEFFFFFFFFFFFFFF84D81B24AF9916C577F3FD2AD5D5F7335C4130309DA114F10D51569185158DBFB61E6D25356FE47507F068D09072568D5996904D65C98D9FC140010000000000000000000000000000000000000000000000000000000000000000000000000000556896CEB244E5B9EDB109674B9B02FAB95273057B0C758E9170F13E2C90BFA3122C97EDC9A07B44E5850A7D625D2AB9EED4420AEAE17EEAFF910400000000000000000000000000000000000000000000000000000000000000000000000000008DA430C5F633724E8122DA2C914E33003ED1AB9E58D31D5655F1E072C36A00D130524803ECEC8DE390CCD412C22CBCA3B08E2A3A178AEEAFE7A6CEF9255B0800898FAFA882EE426FDC490222317160AFFBB7956B72E7B8DD5B2B858CF0047CB991DA066044F41326F57E59FFDD1980A14FF5E4B8E780701AE24D2D94CA4115005D8F9B16F7C18AE2213208FAD896D46A2BB0184C34BB9CB09482D6DAC13B6F26B525AE8E754D2C6CEDFFE98167318D47E5CB6FA520EC230D83CF7BD92DF10F009B5048C61071AF4EC9E4347C5BCC4B0C1357D2B5F6265E2E500C0EB13916CDEBA586BAC51E090103615FED3ACFB9BD90FD20E4CAF74B7B87AB8CB9F9C3100100E01A1595BCEDC7773891E79B16CC2DE132C765572396BD27B998AA9FE65B70FB707EAD8E63A8E4C36F2E8277E122ED375EA7A80DCBCB14342C237016B5DB0500F6B616C08E310C3778B662E4A6112B8567E4C41BE8250B306D8E33912FD379059E459674F42E18C58E3ED0AFE70835E59B37A6EDF0B85CCABE1119F264A221009C66DD15C42E5226119B1B8F6A71EC4CDB5419B9190E171F1850F59B2E5C1CD4821EB226DC5F92AD1A4C6F77BA7C992AF03E9372AF9A3A1AA6F2E1DAB6550A00CEA195D575E585CCCA038D6D0F6350EDAA815AE4719D64F4A41920C23C62961AB8906C35942A8D6710A0237B521972CB06FF1ACFA73AEB8BFC29347F814604007CC6D66CB6CDE173755B45CADE2EDBE594AD64B8C772C6184789219D791BC767E094BDDE2D6AC7C851C39193EF620BA5BB1FE0FB48090E9E0C3662640C7E1C005936C310D155FA3CC18C1EF81006D01B8672121813BBE1700DBBC4D837D92B270F9547F16ACD42DB130D1255D561C8653FF37D69FA9871010685D92E680E17000F40CA59692C6DF69453F9ACCC3740B06761706B9769CE0B42AEBA0A85A8E6F0D922874333D55B04675700474F4B86FCB7195A9D3B8489A07C77542C64B40E00F6483005F332130C473F02CFBBB6EEA8F740BE9D0BCA64F7242EAB7EDD8152B7DB3F55B59FF429E50E1A4D6016CFC3721E55D34F30A4523F92C3FAE2F0E922006C99230102B3B9687B0D7AF1866190C64A63D959DD24D70169913EFC85DB6D98C4938D3A885246FCFD27030AED628EE24B68A447E6C7EC67F4031D057A842300F874498BA2FB425B673A827926398E2E5999D8534A5569A4515D3B448ED58215AAFF9A12E262207C3A93C7C0EC47753933D8F0A0236E24BF0A3025F780580000 -smlen = 1589 -sm = 8652F16E9B95850A07F3DDC478C0A676BA1F00A17ADD8501F60B240F69C9E904D88BE0BD3C01D3DEADF45720D0241A4ADF7423E6818CDE6C011CE8E0AAFF1BE1E3874B6023A285DB37B49C0107A5D8B8B40CE5B754CB19BE604CE3E200D6017F831F40C889F489FECDCEF34588CBA6754701271AA0B215E5E28A7F31B733599F3228275301E53F4D53D37DC37A3B41EF70E7597DCED52E00AD0CD7673FEDFC2D4D39609D58FC2A5E1B5100692DC801AF162F7832F03385D8988377640D0198C35DC62DDEE6F467A9EBBFA49789244E7E015FFAD7084816B1CB20B653E5A4ED3C90EDE3004C1AC7182D7F37B752B9A9131C95508A99DF0084FA106446C58D8225AA121DD538DFA4215A0101EBB1874E20DB04E2A2A70E638B577A550AADA67712FD1D4BB844DB061C1ABE7505038F4DBE5CE7EBE44284368BEC1A59C064E3CB0186D8DE11432DD5D2A922409FFD95003382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 - -count = 38 -seed = A4563D09AD21D3916BF4636301F2E64183A8F003DA186753D7F2DC3BE0089BA09C62B8A52B72C2C8451213606801FB29 -mlen = 1287 -msg = 67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 -pk = 5175D4A1943E2365719DC6B897602DE01D33CAE4EEB54F956036AE07EE9BC1A04A1BDA68723BCE67C2505A31DBE7BD39D495F65381F6B579448FC2502D0614005FA0081ED1620DF40A060D07D75BC57BFF0B57D13B565D7EDABDD80070CCA46C84E9E17977987E5A953B4C45D1EBEFC3597D11B157CEA8B8A4AB2A6A94892300 -sk = 5175D4A1943E2365719DC6B897602DE01D33CAE4EEB54F956036AE07EE9BC1A04A1BDA68723BCE67C2505A31DBE7BD39D495F65381F6B579448FC2502D0614005FA0081ED1620DF40A060D07D75BC57BFF0B57D13B565D7EDABDD80070CCA46C84E9E17977987E5A953B4C45D1EBEFC3597D11B157CEA8B8A4AB2A6A94892300020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007C893ACE9A42C756608C533D8809844A71539F069C4BAE5FC49262B651DD55581872F9FBEDB2E86068CA1100575DB6D0DCFDF9BC0C3B27AFF73236D6313EFB803504B5CE508BF0A37EBF6784953AEF33E9E0118D19D510FDBC0B00000000000000533A421C3E31C143380CBE137264D9EC61599393CA824CD41F20261D4F0CCD9801E0F061D8201B98FB23122E3D922E2F459DA4B598860386264EDBF5126FEC92CC93CC48AB2202FB1D1C80C520D4F26608BD15F666960C2564EEFFFFFFFFFFFFFFAD1676E59C0714B8875500A6B0DA7E559E7CB8CCD6B44D605D7C46F7D846221B75C1A9C1B847977F16518113CA1F6AA170E21BF901C351348427FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44BDF647A8DD665E970458344F4BD784E00D13C20EE0A0683DEC94FD68A69A9BF5A0453046233C1621A86C6FD9AC9042F8DAE227FA4F407FC91303000000000000000000000000000000000000000000000000000000000000000000000000000036521FD9AB0B150DB7EA3F30B48C28442DF73B3513B318B073CB044F9EB3909D9D571A36196402C4BF53254AF2E10F60BC08F47EEF758B10879FD0049FB51E0013716A9E1BDB6BB10F2ED8A7C2FE35868302B840D6E5DD37AAE02E4D364C077394B821B4ABE955FC37F24E17FABD53E964A3D2F7E42C2C66DAE47BF63A510300E054CF5436D3C3AFBEFB0B43A50BC4E9CB1C416938F6445544B24017E30B28BFB638F3A27543DDA8DC124F97E1322EEE66B87FE574092569C3CC3E9B5B0A2400DC7C6F690FBCBBE36D33DBDCA016E7539E7DA4A0F31A33650D13A09AFF953B7422BE0274D87BB40D87F276E2716C32DE88FA7604238501E6B90D04DE5E8D0700BC0EB21493F5A10C106C2AFA6566582E9292FDCEDD46B965BDEA41D2B1E67BBE2659CF8819431D7A8F08CE6B62E7C147FD15F71DD22A10DAFC0FD127EC6C1A006FFCD005B3309925842BEE7206F84AE4D838179801D994045B9518A2C7D8DFC262755749F681C6C8F7FEB405346D7ED4B02AD419F43A1E460AA25E23C11B150042D1F247B5613BFBDF47009FC918336E4EBA174D563DE9AC46F642383689768405EC422E533177E591252AA436F594D3B7C4D66760832DB1CF371FEA15DA200065FA3326C73D2C2190827E7C8B55DA716ABDD65221C51AE5BAEF8356D6EB384E8C4A4CD0F13D5B7411BD7866F0D78513B0DC97F883F6238C1DDAD688C1810C006F963746E8514EC6A7F2375DCE7C0A387468F453D547625B2472EADC117359B4F3379CAB702160DA8C136B05D9A20A6D5F4FA9CC21FB97A2CFFCB7F9A6660700DA638564BC519F7F2597B6AE5AFFF3B0111A3374825FC1274FDA9F068A4D06C6AAEF8F8671FE252A58A4219ECDA21D939858835A30C1D2449AABD5E8E98217008A0077E6CD1B6150229FD0EE43FE48D0E520E42BDA477736BB61E7DB5D072D3E1C7C690BF5ED70D7CDEA1E74825A4DA7096B8D56D1B7F894CF179194DEE70F003F06D470712E4E0ACE9ADDBC42B3F5B91208571B4B9360A20DED83068076A53EA935B2BCD813C5726C49B9A932A842A34721E29077BAE64F653BF349063A020003C39E9B469AFAD01A708CD2BB2D559CB91642E8AEE90C41664882139498F6F4222F2D8712BF9B2821CCE2F512790CDAC32AC50FE83B8AA82011488182EA150011A96687324C39C6B6550A72CCD05BD967FCF19E4928D903FD4AD16397EA723736A8D06D5E002CBB1E9A413A966E63BA46CC84F36ECB7FCADFAB1BA7F9F40400 -smlen = 1622 -sm = 8E883401C839C477A7863AF81D3F2924D996001971F77D0234E6C66030C3D33D2A3BC03F5500A86B84162648FFCF12F785E2B66840CCEE4C005DD536160BEBDB63D07681FEF28E5F80FEFB001550E92D907F2DCF9B80103EDA6FF02949DB0030604305618CCB31C18CBF999B284EB46CF7013911310396B7BA622AA6460BBD4D86874AFC008397A2312448CC1269B61BE06D1C0401B912018FA69283246DCF97754FF791E3B515D535FE0072E2A92ABA9E21F0DE19EB71213814BD3AFA000B4F72D602F104B5E3A9EC8E8B0E71364AEC00AD8809ABF64CD517D7EB303903A465CFCCE400BD1AAB5549210088B9C85A4AB85DD534974500F188553CA9F29C347B5CD216C8523FBE9D2200006DBE10096312CCD2C4F4C457703605DC0A5007D55C54499853AD38360F37D68302016B0D44FD6558589E0249A978C95D814C3F4601D8ADA0EEA702A6F632447F79188A0367109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 - -count = 39 -seed = 811A8A2ED2917CC616FAF246C5F9BB902E5FBF5430AB078AD6CE871CF8C160512A748216EFAB3A4CE1271AAFEA12C11B -mlen = 1320 -msg = 061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 -pk = 407CF02AA07BD0A196B4B2D50C981261D7A567765AF61F28687611BC009F571538069DFE80E24BDF7C9052B50C2DCA45B3D093CC2026D45A457CC0490AAB0B00EEEBB555BC94443BC2BF005B0FF8BFE14112D6EF2E0BFC0DE00F160E7E53D6CC6250AED8ABDB9A1C4B5237CE995BE0DCFD0F69E40BD7D0A577CE051DD7170C00 -sk = 407CF02AA07BD0A196B4B2D50C981261D7A567765AF61F28687611BC009F571538069DFE80E24BDF7C9052B50C2DCA45B3D093CC2026D45A457CC0490AAB0B00EEEBB555BC94443BC2BF005B0FF8BFE14112D6EF2E0BFC0DE00F160E7E53D6CC6250AED8ABDB9A1C4B5237CE995BE0DCFD0F69E40BD7D0A577CE051DD7170C0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FBCCBF872BD02FCEE76AF722AEA378B4879FCE3F9E1C2C4211F645A9BCACE973F37A866D8A996BEE45E44623E329948C373952E115BBF0F721AD2767BDF061843CE57D55BEB475ED1405514B617889EB0C7339F97FFA0D94240700000000000000483906EC748FD7ADB16E0E8802F6E86870D5345B635C773FCCECE5EF86EA70C9EA0AD563A9B1263EFD89019C645239B424D1FD2903B7F041673AD8AECB5862F526E395EE2F46C1C8AAEC3836B429524C24354F8416D5F7D839F8FFFFFFFFFFFFFFBC7C7F81A5238FAD8550E4454345D8ECF91A631481DC5D7F4861DE48986807C07BF5E049EE8BEF72E193FC986CCAE0565465564563519A3C63CEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DFC74513BD3A6F91AC1D88242DA9EF77F96343960C1604BC82AF64972D24F11EB9A1074F08C9D27FA972644CA405D993B5347EE3F2EF71379D9030000000000000000000000000000000000000000000000000000000000000000000000000000EA29EDDC243D6AF6E996FF4013B541B87454B8637CAB9C7C44D71C59624046CBCA2BB54B9DDF90965E043DADD67D3E0393F86100BAC214D3A1D2C28FFBB11C009AAFEAD31CFE041B8B35F024B88F25CCD640C579BAF4F678E826DC72F5FDFB2C4C029119437B33083B4978F41A06C7ACDBFBCBA458ECABB0F4500675A38E18004FDE359C1C2B764A466D1F71B8D0C0A34CAADBABD13A0E0213DD9210E74D570B5ABA1A3C0636DDF0FB29BFF6B133E3004393813A64DD43A36BF69AA2E73F23007015B3B2F477DB2F321EF459776C00B9212317C1DF5BB4190425DAAC60DCFF902096ED4FFB9C3804FBE45BECDC10CABA424A5A9EE67F66C48762C06F80D20600BCA7ED81F9EA888185B1822270A2A66C428AABCAD4703D599EA94215D0AA1D7D4649D45BC1693B2F953F9F7734F3759C2030BE7FD2D2D9181E5F84301CFA2100459DBC2106B87514F199D43017E4BAC9C999524AF5FBFE8FA0987DBAD3EE12BDEC7A8662A5FE51F2A672FFA657D340DF078E390440CE6E8A117AF85DA8901E000A45BA05E5F26FDEEDDECCB6B5DD948A2BC9B73EA841F0DFF55AE95389761909AB24CC1B2C6308E427DAD0704DA5D62279C3B2D117468680686147448F6B1B00FA50EDB4678E93977ED43CEABACDFBBEB5E25F4F3DF0CB2EB0A705124470294591D49D6DF2F59E198C0C8537531BF6E24291B995977BE62F1BF297BEF27A07004A2DA673C20C6EAAAFAB5269D2E215EF3132D1811A2565A80D5736D54C2019D9877F9C36F106780E955F048BFCD8A7EB9F44133A232F8B9B2B2C4EF33BD41B00E37C1EBB88735A7A68AC1F705F53986D4146C9D26BD858B065B91B79616AFD57403BE1E7E5958974A77001661A8465CBAC386EF024192C5E713E4C77E229050063A3FD37588A970D2FAFA21EDE82D357A7EEA5CEBE8EF2F48AE9D5FFAAECCC842A7A7FABDB52E324BB5E7BF6B96C7C9408CBD956EFCB94EDC220142DF9650100B6AC0FB48DC492F1C5A527FF35F272C0CC6A71C118E0BD6009E8E306C524AA0D9BFC5A353DA1968F810338AB21FEEAAF1971A6E91FA57CA6301B07A4AC8123005B1F71DDE5AF6C2B152E201F136570FB039A5F56F616D9555C3CB92C9B854DC7A19A8603771341B6E41D25B7DEA10871E849302A377182BA8035780D83F80100F3F2AC8DC48CC36F591FD15C590F93319CAE97BF1A93925C955951F3A1FFFE48C38DBCB42A86ED1588ED0D4023E66C84D814B61B253011ED8FE4297B51DE0C00 -smlen = 1655 -sm = EC122EF098F5A1219BD149A59AF853BE31B9005BE1568872BC4FB7EB361E81B1B94E1E2B7F0137523167BD007CCAE53298B8888187D6A8A70099DDEFE8880F674062C20EDD8990A2D3EFC3009BE9CC96FD26C97A4B9C9B847E6B532B676E016F9CAC81667FDBE06A0D1F9DD224D806BE10001561285B1ECD78E7E4914CC1E473DD280E08001C0F430501BFA116852A43214EDDEEE7B787019BD01275B53A5A64CE8A0E4D23BBB3171D6401FA3390E0E71B6028519650F1FA79AACDFD9500E0C156239EAFDB064B71243511326C82637C0166A89E60563D9A317DFC8C1CBD53761ECC12012B57F756FB8002F2D330CC40164D0D0D7F0701591D8F6A9BA7C677831D1164FE8A2B5994640100F7C6EA5D8860973B38F9D422679F1B5345BE07E265FEEFE69A870808EDF81EC907030198213F1B0CAE528053DAB1CBD1401A31C60035516976A788E7F21F836321C12104061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 - -count = 40 -seed = 41CC9DB2E90239AB5158A2628E7478D0B3512FDF84CD27A4CA5FE3119A455C22045F198C3C5C39F491FB975BD1CFF7F8 -mlen = 1353 -msg = AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 -pk = 1B6C5D65999073EFD8D2DB2922255D81934CAE1C9325ED4C68D8D80FFB2BBD3CE3767A764A7BDA6D7B9459222345906394D40D82DDBC4E7911716F049B671C00060A66F4CD43621D2F881351F54C4F4A1FF3F1BC52E9E1ADA7347D8803F521BE94AA8B9774016D0FD7C2173666A7FC269F5AF1D23D5B1336D11218EACE671C00 -sk = 1B6C5D65999073EFD8D2DB2922255D81934CAE1C9325ED4C68D8D80FFB2BBD3CE3767A764A7BDA6D7B9459222345906394D40D82DDBC4E7911716F049B671C00060A66F4CD43621D2F881351F54C4F4A1FF3F1BC52E9E1ADA7347D8803F521BE94AA8B9774016D0FD7C2173666A7FC269F5AF1D23D5B1336D11218EACE671C000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042A3A59F66C74B80776E4C081BD0181E80141599CA71FD581306BAA214A5C6A0C85DFC611EE9DC2262DBC5536F69ABF985191DCCBE44F53993641660BECFD7CABC5876DE2A36FC3EE157F8CF7C6F435FF6F10FB8B704D03600020000000000000099411D6782D6C9CE3491322B073375C2C175F578E4DBFD3E598EB2C6047A5E565BB21081D48C0857763B514AC57137D46F18949D2436E354286CC691489E7CB08DE56D7F078FAFCE79846BB3E124E8373115FE710686BC168FE8FFFFFFFFFFFFFFA9FDEC35D4923E7A181678D6883149586376DA05BD03CC83AC7132A4C9857B5DA644B0C89FC15ABFD769B0208BC2F109472070F9391933188E79FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA50C488E045F7AEFC15E8C5A62CECD267BA5AF7B20559BF204D3BF1C83830FCF5B030CC76F40EC1483EC928FCB7C8E877F594EAFFA3A6822FED020000000000000000000000000000000000000000000000000000000000000000000000000000C8BAFF25443AA95BFD8E5C0A21EBB247A73615ABF634BA17A29A7CDA2673739CD3C5F01AB1CCEB218A96F72FD8D56509D7F6C60F0AA5C539E14C4BD882A817004F7F9A7652EC4D4D56D726795AC4158DAE98505BB0C924A24AECA6BD6544932D055362F66B760C844919BEA802E8CF4A7A2849DCA1411932FDB2FEB513330F005C87AE535936D3E64E0D3A7B594DE846B1ABF9F38F5F767AB7C535DF3AD160CDB0A89EFE266D668ADD7D82032E19908D4AF67195C6C1EF637230BC18CA2807004FF00B5DA03858E1D83F70416CDDDE767522B151288C6FAA5818BFA939C832BF13E166FE8ACDDBD4C9DB8E74E5DC2F67B2F6FE50C8D6A985D9D111AC2AC82400FFA4F8CBEB9A312BF9F18669DA4D85770DDF74D447466F5C8314A6BCA12B981FFA52BDFC5FB73A529DA185B560ABB82842CED721E59D6B2CCE4F403463840C0023039F04C72B7AEEB1457C90E16A2980C1EAC3EDB2CE8B1A159BACBA85D7608E5A682C7D0EFDFF886B423C7E3C735D602459D2A8DA59CDDC3F41F719E27206003B5B5913E06BE2D33925AB1DCD5A5546BF0D3A394B90D5C7A4D72F30EC2DBB8A65E6B691199790A4087891CA7DFA2E0077E813C8B79DA6985D0E665527220E00F9F99BA3AB261ACCDBDAE619C1B9AA85A91E090C4EDFF004B6D4BD9F9DCDBCD8F69D772E204A9029E3DF05F5306C0B32A7146ED15D491F00A022BC6B22370B00EAF7DF587856BD63CBC8F1BAFCEF58EF572B2CD70FBA00BFB1F488DC6A4031FCDEDD0E1F0F6AF276BC3BD59FCF0989A1FB3C467CF30DC2B0FC9E1952E84C2500D2F96F85F99D275EAB330BDAD370FD4E3597A7C1B3C3F123E10E87C28B4DDE979C566C79486E84D66E952C5771842C8DEE00A7DE0698DBD1C7DE7D4D69A1200035930EFF0FEA16B3A0AC3B706EE08C45BC6B52CE68A54AB7AFFCB424894F07E4EE28B7EDD7F4B95C76500CCC7841D3F47C43852C8EAEA2C7AE4E37EE1C6C1F00816FAB84804CB1E53AD6F9B5E9C6024651C17C3AE921C2A89975E7064ABFAAABA6A73B372946F50DFF49635DED47C135E50BB168B2D10547AB0E37E4172F0B0025417888D0CC229C4B9CF2868F44B1EF9675564E4A037C39C1EE4543B43CB61817D59C12EF371F98C85559C5A83B0F8D9492E4EDEC0F1BF6F09FD862C969220011DC4EB8AEBE0A8722D8319753A63C636B02519973A70C64398C7F4669BF23CCB3F85D899C11417C196822449F25CBE3148F6323E656EFF222051F0438861800 -smlen = 1688 -sm = 3CA50A27CA025D25E3081D25A769E763AA1D0026CAA3815153155A5AC9425115818A65611000EDC2F166DA24DF48F0C026C47E408A46B3BF00C57E35ED7958781B985001A0698B248E030600C99534BD58D0280B08262DBDE603D061381A0050A1E453FA82B96902F6040E2AE0BF80892E0143C04F9C537B0FAF590395C4DF782C30E2400040942EC8D7A3F2556A84B46638D66038DE320089510B770188F7811DCE9DFCD901CC309B2901D3C50B451B501202420F3A5AD9438907820300FD595B358C69E1B25D94B8B033D8B8167D55010E0D2229AD5197F35F047D9CA13567B69C7E019627F3195048965B4E235E0E030FDD9D4C51015657C1FF4B65138EBC8422E3422A36D5C1050001FDE4AF43C5698BB689CD5E5FD31C067356953ADE6A35678CB164ACD75E90447A0701771DF4ACEB97E29360458EE892D57A0AD04000551B5F791A89E3453AF42131287801AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 - -count = 41 -seed = 1C13369824A3FDD41B1065E17297574715D9BD9CE5BB733D36D22C31B62BB1033989A604D78BFB1A0746BD4A2271FC0C -mlen = 1386 -msg = 9D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 -pk = F0704B19D91C4EE75C530998CE886D73A3379D865DA4B068D2FD0325D240E31640B11718338EC84ECAC8613A8AC4F0ED4060560167BC8D07C75070A1EEEE030084B31DB091CC684A3DD29B25BA67C93DBFDADC676F954236B595641C9F13C29DD3C0AF08AF8F04835D096C6AC2B7FE60B373ECC74E94025D3B2BE675C9700200 -sk = F0704B19D91C4EE75C530998CE886D73A3379D865DA4B068D2FD0325D240E31640B11718338EC84ECAC8613A8AC4F0ED4060560167BC8D07C75070A1EEEE030084B31DB091CC684A3DD29B25BA67C93DBFDADC676F954236B595641C9F13C29DD3C0AF08AF8F04835D096C6AC2B7FE60B373ECC74E94025D3B2BE675C97002000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000051AE6AFC6C534C9EA0086F212AAA91BACD4436A3127B0024E6DAADDCDF204438CBD065DCAD187E2113802BF1183820024C9E632AA4B9315C64D1D842E4275ABFB48F8E734FD30CE9E39B0020A42C14FDE158B7CA90A0F237730A00000000000000B464D2DF7C6704BCF4133E6AD877E3A9AA9D109866970F637D00E6662B0343F12C947770FDCBF2BDFF54C57E311A32596704B1CFA00AB9E1E298A6E0135BB735A638CEC874A03CDD80B7A55760B457D5B2F4ED54398198F251EFFFFFFFFFFFFFFF5CD7D890CD9847E0F4888A6CAF344D2E4E2FEE19E8B7E59BC5D98D4F651245EE4A892A425E61191CD8156EEBD27ADF92CB836928F0ECF8845389FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1105A7E2B1730031675F5DA9E27BFD1F98988DEF14A596E4B4295F349CCC8AB1FBA3C1E0A1A4934C82B4A55C2DC75E5D8B789B2415B7E7E0F470020000000000000000000000000000000000000000000000000000000000000000000000000000E96F1B27310B17E4581B5F0D789F95337F1D1871E46E89DC5B0EE5D0DF0192D502C9C8C8AF90051BF1C65451BD1BA232FC9840A74E59817DA2D40189AA5E0600AE30453606E9D176C589D624555AEC637EB3B55579357BA791D1D9B76DC4191EBB7DA750F2543F5495AEA10430127432754E3BE3A4EED05188DF283229FC0E008658BB56254C35A4DF22376A92634CE9C4C1772C804C808967CAD2BE8412C0685330B1F616087EDF45627D70DA6AB47F7DEE681E94648F2507AD56E369E40C00EAFD2B38DD6BD78364D097B8ABBE45F1726595D0EA4A836D79A29F82F5C965D531E5BD20D31A381E9D00DAEE1DA157240B43E01E53E9A83D7B8D6DBD06570900BEA2E15087B3946735F8CA452E228EF25712CDD60C3C0ED50AF03D79AFF1E10B4A720FEC8AAF7B0B4B76C42D6FDC8757CBBBDDF905A07069C74967870B6512000247FE99D4F16FB32FC5BC988AAF753AED03A182C356FFB1E6C0FD07E22C472E958108D3B38860191EE532BC993E3A1FFBB3788FC43C204F025FCDEDE10420004BBD4BF7BB1A5D8ED9A221EEC972A9B62686845DA6763FE3D036FE7E4E2EEF66F8E0E0CE1A72F89132BD0F713CCE46A6497DC54AB5F06D692DE91BA3A2DE0E0074694A98CAC5AD35FC8E1925C67934FE800BB69431D731860E516E540587AF3803C9AB354C54D3B36A5362EB77C156ED623D2A71203E37AF33FFAEB1CD612400F43DBC1525D69FD170A2AF5DC491386CC8FD12F5B289E1403017674D31CE6430BF2379AB712B72CD9BF752C26755350DA30421F99228C63691239966A8530E005362EE327CFAA9BB0DDE5E5BED934667DAA1BD3001D6FAE4393EA539D9E19434ED2E5E52ECCEBB26EBA7383D9E522D66DA8D94523258FD134A36FFFFEDEC1500C824AD10EEB954D88F5E432540262FD7274A71C1D21B56941F22C39BEBCB2144817EC7B3FEEE5FE39EE8031220913766551F7973CC6C4DC20215FE6B3DC61000CA111E5B0DE531FB40ED55D6EE97089E892BFEA4B5507DAB88CB671F0EAD42606258C2B4E88474D9C867E9902EB98ECFA62113F01D8BE977ADCC1E11B020250030C4A540F2157B42A1A611C3F18D7E064DEF31682C9E52B6B1C35CDF6E2A08359618E89BA42A8002705A21EA44665D6EC671B7FAA9C86576B4CB9A69A6A201004E58E802862F7522D9608E078D9A00DD2D5C99845CF333A2A42BBA6E3019F71C47F02D299927FC5288CFEFE0CEEC1AAD094B3F60024C0D6AEF5DB3D0C8092200 -smlen = 1721 -sm = 2BBF95DA19B72C87C310F63B6C2D31E6966300286F092CFD5AC98ABFEB03EAB6540CAD868C0136BF91E7A0664CA5F4762E86A8D534F2760301F24F31AAC2DA66BA4663A748BCF804570018017931881C2CA62417392872B1C0AD0DA46B9100391FE69DA1A3BE3692EBED707A8DEE2E3DAB004833283A1FB99DDBD83C26EC4F7978FC39840155BF1086BEE3DD4AA2A98EB15AFD8F0646FE0080AD7800A69D6E785F748F42E9F2EE6615990124996290421E1A03709808E927647F9DF418016FBD3F7EA3852745E3A4869096491BB1897100BE09EEAC0922A28821631753ED7D9F8ACF620127408E741B42BE8DC543BBEAE9BF082E9D0B0083F10EC29ECC7D3EC9E9A19527C06B30428401018B1CF41E2762174F3443E4EB21E74BA85E14F89D9AEA71448A63722540274C640002F29299B021BC993A33277225417FF43274A7004D4CB57D9A97F2EBE7EC311D2EB8039D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 - -count = 42 -seed = 7AD6C7DF00C9E52A75290D28DA946305D83CCF6DE2515C19A8E26850C34C8C2E545E2E32108F13B9C97F87AB68D10131 -mlen = 1419 -msg = AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA -pk = 6BFA73968FCEC52FF93BC22BAB4E0D7FB90B6881436D2A964E2DD304448ED4D318099B45698ED83BA33E3806A2DF9E83C5C64B8A136BFB789F1E5797D667160001078528623F395824352AB39BA3EF251DF3B341BAFCBD4486D2911BC157E4E8F77C684B8DE2E723DB7CC3B51B71DC22C1CF8970B16DD957586F9948C6032400 -sk = 6BFA73968FCEC52FF93BC22BAB4E0D7FB90B6881436D2A964E2DD304448ED4D318099B45698ED83BA33E3806A2DF9E83C5C64B8A136BFB789F1E5797D667160001078528623F395824352AB39BA3EF251DF3B341BAFCBD4486D2911BC157E4E8F77C684B8DE2E723DB7CC3B51B71DC22C1CF8970B16DD957586F9948C603240002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A64C762B82C604ED61239C23942B6DBF62441C36324E9A89A0F499E65C013E82A17A64482EBA3575EA84828FEA26AC46091251ABB5F674333F2ACD3353FFE30047F7EC3F5619E25553B636B350C218835447B552D2E8B6AB840900000000000000AB4B87EAB23ECC75ACA17376379190709205124FC33284AD2DA07EC09D2DAB9A444ED2ED7F0C8E9D6E7FB207FFBE71D0CD965C7C455CE76C32BAE300C893B1EF4968843FC2425EE1F740A5A0B44BF2984494F0306D3919C844EAFFFFFFFFFFFFFFABD43191E280D05895021159B06C7367825697A6AB723F8F8BA9433FFD1488C8427C2BB2276AE7CDFC3248F455B6435F98BFCC475719DBD92268FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26541EC87681E386192C85F2929C2D1500C080476FE0CDC56C17D79CCB3A8190D83B42A660276028E87FF20A7EC15B30C3A41F5D5AFDB49B64BF020000000000000000000000000000000000000000000000000000000000000000000000000000F018FFC7A3E570E53A26B01924A5303D31EF20422142895954FA382EFC90FFC521F4AB1A54430C6E9544B3F7DD63D6556A113AD8467BB82C6C7CDD5D05A00E00F0BC00978073CAE4C5350C21FAA64EF8C05EB7A46A65D719086CBB7092CA170D281F3A73D749E63D4383BE3F16FA0905816B150F91EE98E047A6A54825331C0096D7C0BA5027C7DC30BC14D0115FA09CC3585D7918CDF3737B5871A0DEE4887DA830937AD0515F6CF6921F5441CC5F3607DA43F26582F59CE3008479133B0E000DC07BBD9EFBFF9EA4C67059AF9D4DDCFA972C959F2F1326E0672E6F1372275AEAD55F7B58C28CA775328D8D4D51567D0ADD3BCAA5A84310EEFD5AFB7EB408005F3DEFE195A8FFD9B8167305988C32F2A11BA6C19796CA982A2376D8A286BAAE9BEA7263FF2226B8FD95E77CEACD67F815551FD6D68FCC40F4A9387ECD9F2100112AC493509A9D5592A1BC24DC7C5F23BFD3E478404E1D5E85B59AC6CCD30D3DB6A776DCB0860F8C6F350E5F359E7683766DDB7D728A3492718119BA053C1200D752DF7EFD570224731BA948E40DF02FE29F03985EF0C1771C525749AD5DBD38692220B3688F85A2EF940CA7DD26245DAB41BD18DF00CEFF13A04A0C4A120700980B3A997107648CDA7742F3DF97AD0DA6B051E0A723425F22A28217F5AD24D04C503BDDB007EB94B1061062BB222DECA7BC49C2E7D1A7BD29607B9B5F000300A2CF29D0A5A6036CA2C0CFF1A6350D7D814E9010CA62346B3B67697C62FBBFB65BA7F36011E7A319AF4FBAB98AA19D446940D045BC90E6AA472161BD2F2A01008C095ADE90AD2C812A7C836E6873313B67140CA6A09660D0BDF31F8233B48B5082D19CF83E7CD582D158B3E100E1ACFB7FCA289DBF2219A2BF737BD372022000F9C5FC7ABC59993D3AE21F01C7B689DECDB1C10B0F8A7C317E4B558D2DB31EB9CE5B8477A5C35AED3A877E65D6B7A63CAF60981E2791F0EE7407617FDA282300B7E3C20F0E6E3AC5EFACD677D85F296E64177243D59612BEE6A40743454E33614DCF446E52D4620DD186C9B169E722C9159FC7B719CE55AEED5F27A1B5460E004DB5D22FECD0B8A69EE3349F11FAC4EBC8E750427C597F5E058A41D0C4AF233AC343D8EFB3BAEB50D01485C0B01B488FB90AB02EEEDEFC9C8154FB3885F30D007D57988C9FB869CFEC1109EC1FF6958E0B73555D07195973AA4F6B9940EDC4C21AD596C49E2737A643A8666C53C4E675A1BF9EFFAF7F1F78A64FD46D5AA70900 -smlen = 1754 -sm = BC0CFA84196B1CDFAE21B4FC3D575FE9C9A80027746048224CC2FE6C94256828138E101B520077F5649FE7FE8761F2F6B2D003728676A72301D00E55A93A998CAB12A0C4FE1FDB484F30750148DA0E4C92B07CB4A98CF94961CD2798BA2F01F2F86B0FE6FB0383328056FCDB1172F47731003C33841D8D35D3A9EFE81119D755B506A66A012851C91EEF88AAFCF7BC171AAEBFFF524BF10088FED8CA2853F0332CF0A72C9408ED5C6F09010067F2446E77904EA9DCDF403541E4C98A24007141740612BC302C2AA180C841778E9BD19401968D4082457CE19557035D24F0AB9FD29DD10071D62E4E50BDDC92EB4207F31CB05B431F8D01B7113A74284E740B454517FD0F4F7C590B38000091353911F87EAA35F984E3BF71F9EF09915174366068EE1640531E0FC7B2A1300202A475053782891BE2EC1DB0BBF9DFA446E01D00E77C488960EA06668092AAA586F801AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA - -count = 43 -seed = 38FFDE9B60DEDB5BBFAD6C52AA02EF6D49369BF276C99E588D796A4F260E0FF0A65C96C35863BAACFFD9B212EC305E7F -mlen = 1452 -msg = ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C -pk = 00DEDB0011FF6A090E27C88AA863BAD2BB5C805C21CC8C7F162CD5E81FA9DD6346D37B11464DE1AC425360C9989A64B5999E865F29762ACEF17AE1860F2E0B00E5A78A1418E64B228843AA16521156D7D8095AD6DFCEC1C03F75D6F62938901EB36A4F79A916A93FBFD80B25235C6FD3A71996589310B906595F3FE74B451000 -sk = 00DEDB0011FF6A090E27C88AA863BAD2BB5C805C21CC8C7F162CD5E81FA9DD6346D37B11464DE1AC425360C9989A64B5999E865F29762ACEF17AE1860F2E0B00E5A78A1418E64B228843AA16521156D7D8095AD6DFCEC1C03F75D6F62938901EB36A4F79A916A93FBFD80B25235C6FD3A71996589310B906595F3FE74B45100002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F3DAE8EE3DF5E216BFFD9F26F63D83DE179C04FD74FB72ADDFAF55AAFBBCA4B7C3A491226CB933A6F17D0354FB2B487F74D0FDEEEC212889321E0275406F575C6E6F39D6701F49DCA9A5D8B18F62C73F35569C48538BD00B8103000000000000004E37384BD05975301B1AB8795398C3EFB6B6660299E479C08E0393F90FDD7D9C7E1898557FCADEBF86EE4E96086E78247D16739C48DFE61D099CDDF616F084325725BA99E8E1820886496D927791E697CC4F5D831E1F674927F9FFFFFFFFFFFFFF72DD5DA735087984AB99507FD0A18F5FEDAAB736889060C920A244102F4A35FEC4C14FF091D97A334280A68966AFFE4ECF6C5C1B5CA42E759318FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73A6D7941897A70D48D8CC00B3DA6ACEB29E24107C9D028C5E49A97CA1FB981A188F9ED6B39D6E50003F7AF103BF142CA761F9DD9C46209DB678040000000000000000000000000000000000000000000000000000000000000000000000000000D05AEA48033BED0A7DCAA83185E4E43A582E9D7A49528BF374CAD0D4BC018C494FAF3B413EB75B3CA183B6ADBBFB21CEA71C0D5F3C97F757AC3812453B561C00DAD746A0EA3E3785DFE4645307835FE3B302F080BDBC9CEDBF59EAC5F44BE48058329C098EBC0E08859ADC171473A26B23931C2462AE99BCEB86B136EF4201003BBFE5CC21124F31C63CD7D94B0C35C8228D297B7F73DFF5B0C6DDF801BDBAB7B1F0E1CEE44465A9F31F4C68C0163C36FF86ABECF0C5ED67A5AA4BB89DC021001DA8672F1D7A53481FBA4600FBFA104BC6A386E798A369608E45A14656EF71902A8AEE096FB2E954D127991E7745AD3EF56451A9DB9BF571F520E625FEC306004265061FF196308BD404C34D56BB4EA94716630D9C0B3F1772EACE0E1DEAD578067268546DE3673200D3E11097BF14192BAAA0FA282570A4C4F3D03B9D5F1E00971432176DB53F145F55D68671F4771E81ADFEF61E1B9A88CE880EA8C29C60FC3B2260DC54B6010AC524A3D4CA04FB464F537351B95EF6CE35C21D9550530F006474052DD831FE649CE144138BC66EA9BDAB285570627969ACC519720DFC0C97D7294AF52F2B515BBC31195EEFB18A3987E22BA0FDE9602674A9A118CDDB0900C8565DF1DCA8BCFDFEB323D0BAA9525A504E655634DE53109E5729FCD893BC2643625B78D643BA145342CC360F2ED343E4C4DC252BD542B9EFF485F71C0D1100FB3C740055BA85BD29FDBC3A2662C534764E7A5DEA920AF57C54722D6F136A4C8EF0BA2ADE41033988AE943E18F6323C5A1D529B2DCF453F0A575916E2391D0021A23D2313139338415B86FC9FB50BC0451838B4FD39C067C622C39304C74A9D7D736DF4802702D98E9D6F2E57625E4812735EF6BE1CE3BC46730910C8FD1D000D4C8DC132E78FFFBDB00CA85C520E44455BEA01757AE309BD9274354C08AFB1C024504FF1BA247AF1B18714FB177861E7C13ABBF3B66C7FE9581DF46F2C240090169EB448F35F764415EFC60D27705B6D44C56BA03077209531C5231F53068806BBABC1D369079F6555989E25273CEB85D532857B8C9807EDBF7A2C71660300F752A095C77A07E6000652C6CC89E2C59691B868D338D80C777AC633699B738F7AADEBC60C2921FE3FBFFDD046A4D6AF3DB75E24145BB3ACF0F435EF944E0D00EF5158705EFE8E1DE220F77B3FB2479C0F0ABF48904AF7E0586CAAC134CE70A13F2649C630798DBDADEF4C12FF612B076E17F6E71EBD8F9087ED60746B2E2400 -smlen = 1787 -sm = 5E1A7BE10E33C9ABF3500D6FF4F9229A744D018BE937A67929E5715E55309DBEEFDDB2A76000E87DFFE8C091F0FA91A9FC35D7DEA0192C7601BE0F543FF456E9ECA19625AC643130504E7D00087F43DBB607C72900B252A141FFA3ABB73E00BC01DF187D7791B49D78F6A8BBB12A33308300C648034AC6D913216DD17AA5D81C3C058630000D60251D236A37437A8E541B43E93AAB5D32019B3A5879F82E5A0162C0EB9C2238E6D1617101CA778C4098B2BFEA5C6B3B79CE039A844822003FB2662E35B97120683C769CE3FCE2AB2F720168B2C609EDD126F2CA6BFFD5ABB4E7DA029B00E0253838B16A8F7630DA7C9B834002E94B4001A19DC94B867849B1115470C9B4D4C87AD94600012F16083DC7665474F67B82E2675B31804C7D3758D4FD8C51D5FAA2CCAD7945FA060062947C506DCA3C049EE53701349462D4C760000E2DF6DEC7DFAEBA05F45909ED3F03ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C - -count = 44 -seed = ACC98B16DCC9A50EF57F332D66255CA56C2BB679CAE705B4297F1418DA845861448DA6CC5CC458DE6C6E96128EEB2898 -mlen = 1485 -msg = 96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 -pk = 1F63D654B926E4EA1889E2FFFC19A3150D460039C321A22FDFE970678101F6027BCACAAF6DEE6FBAB4DB80C2EB340EB7B7B42FAF69C3000FC1D026267C3007005457C677F025B9FF6B86EFD7C79085915C7A04AB660BCC758D9A396EB11963CC644CBB82AA7925DE0675CC76FA5A848DC535F7D9F215C1A204403E709ABA1E00 -sk = 1F63D654B926E4EA1889E2FFFC19A3150D460039C321A22FDFE970678101F6027BCACAAF6DEE6FBAB4DB80C2EB340EB7B7B42FAF69C3000FC1D026267C3007005457C677F025B9FF6B86EFD7C79085915C7A04AB660BCC758D9A396EB11963CC644CBB82AA7925DE0675CC76FA5A848DC535F7D9F215C1A204403E709ABA1E0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D5034CE3092C5283B1D5859B84CC9B26115B2F01E20DCEC48BC66EC713536357CC8C8A378BFC0E737CFE58D4842884696AABF16764C3DD1DBCD451D28625E646A5D5269AC4C1191EC3DEC201DDA0ADF40AD487AFC80CE819360200000000000000ACFC0C45FFF776ABD02D34BBEC2DDE5B77DFA52F4E885B45FBB6F53580D161C5F65ACECC8140D1D32B7C775415120C4672C51386D895F9A4EEF6541F7E609B4D37F8010E4A669A29A889AD6899DE18BAD27670130C1BC4D8F2FBFFFFFFFFFFFFFFA020786D2AC667AC12C2C326C7B91BFA63CFF370543CE0778179773191503B4B73182AEDBE05BF7CEA2F49DA276E1902E769BFAB660E1925CF80FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD9084E7451C3C331FA44F03D4796904E88670ADD1A7B0A572EC68BE0B52DA1A6614CED73742184F48ECCCB5E1301C3424F720DD616294A2320C02000000000000000000000000000000000000000000000000000000000000000000000000000088DA364B80D714ADD1B82DA6F07946DB1CC507CCD2E7BFFA7889D9687696C58B6CC2D8390E837CCB6EBAE2E277D8F08332A2F2E3EEEC4E13C1089BFF02990200E43BB1F1199C682F5ABF05D0525DCDC745827D3D97EFA7E157A1689E27720F9929A7165B64AF58F5E57D4F02ECE09498B2311F5F6035DD5C00B12BD03B070A002D29F1AE1E534128BABF928CF52AF06163B851FB180516F9E79424A6598E67C98F198282406DA86A21C7C3BD7E75751953CF35A7DCFDDF2EF8CB2D07E230100029836E48C07F313B54F6E045BC9DD284BBFC6AA4E25E6313E693719CF00F0E61B85525BB136EC70753F6A48BE1D7C485A292F6A3624DA0BA22734E1BFD7E1B00D3582A0254EDA3E73EE13B96A078CD9BBFDDA9A66BD3D81C2365EF2D3854AFDA7961F927D97375C7812E87FBCE4FEBEF3E3F18250D68A0FE3B7819DD86C61600E87C8D0525053317F00DC66CD3BDCF37ADE98362DD010E98F22C4DEDC6BA00D1ADD305329480D6FAB1277BAE8CA838D3D4D7AF27A174A4535079DEFF38DE1600651AFC2F9BB91A34C370A4DC8893A694B60882DB9912E277FDF96DB54483C20358594656E02E55890A646B4D2013192C90169652D0D8589C5014BADD54471D00A0A4DA2B77CB2876F5B6F97761FBCB558892FD4F0592BF9C378E132D84E452E8922BB4C5A637EE200C0D2BBC2176C0ACB35699190BC86E7D0BC46910E468070054FBA5E96B8D22262FF419B5779F20E85D878696ED37278EA7BAA2967601F723422697F47B3528466158C23509076C536EA47F34FE7477F6A4E0C037D7FB0F007657976DBC3F6CA0B4381CD1084472603729BFACCA065C4C5602CA2B09F3C0A47EE1FF441D4AFB1BA5267A85DA0DE62DD412F6E41D52AC700F054A0B7E3B0200CF9DECDD846F8B9D6C87EADA1CDDE248AE59C2CF6A3F106385C94446CE573FC1853C9D54671DCBDA85E53A3B5792F887EF99BC46948579AB6EAD9C7E12E30200F8F5A7BC03519DEAFA6D79A6F980239C32CDE968913D46A99FFA4853FDB945B5223354A347425EF532C7DA09A49CF1AAE573A0FF0B109DB2006665C175341D00E988BCA82C3B63987C61B6BE65534C941F0B0F2EE7BD85B806B756439862665F835DA80BB997BC6FBE4380E34B60A4A4F12EAE1D5D0C3FA110CAD68637862000A1CBB9B815E6F432199D93A2E0422817D5BB3D19E02BB9CA5EA9C4315ACB5A2FE2456521B5F3B78C1B8098ECBECF959CCF789F031B93F0DD92682A8516971700 -smlen = 1820 -sm = 05045297EEDD9F03B860EAD91AA18F1AB5A00107F4D61C8D9CBFF396CB28647ED7E6F8F0D3001CA16D445F4194CDED4919E23D232990080D007678D79C95A4B1D635D300DF74A9A4BCCD79008D22DA30F3AC582DB31EEBA50B938841064201E05245BBE0E9CB3BBB2112E39766C073B1AF002842DC4E1AC6EAE2C61B3721DE92C7EBEA7F01B488B9F43F36FA698ECA889B7005490EC39D0110F5A6F29C87DF88013393340081C71146E50159DF305905213EE6FB5EC3C1CD0EDFBE24ED01505BA4C3C28C28F673C67353BEB5E30CE94700DA1AEBA8874912E125270E12EAD1D93D647701FA0EF134053E431E4C75137F0CF67FBC9A000188B3E738716EDF5FC964A2C1F20B7398282E01019395C8B39B69BA2E5D3652235DC55C6489D01F2A946D6D098C72765CF44B57A307038E8D74982B276A32442A6FF3C24BDC8B8852010525BAA5DA7C8569F63053FE24A50396E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 - -count = 45 -seed = 8BEA4E384E73C7E0B47381B3063334291A0F06D28DB61B5BF65B01D0A747722E0AA62B81AD46C00C8A5C31494E513836 -mlen = 1518 -msg = 047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 -pk = 7EC78915374C5B370160465CB20A0EA936BD8DF6B6F26DBE5C24498CD0E196B2EFA9F9F524B7CF4B76FC4F59A07CBD1B1A829B991A45BA08EC16246B9F602100254FBD968AF90CB78F29327A938F7C780080098CCB5CD5F2FDA79D8D05C4ECC26B341FF20B47CB29AF45080719A60D1C7908F505046946015636A32B536F1C00 -sk = 7EC78915374C5B370160465CB20A0EA936BD8DF6B6F26DBE5C24498CD0E196B2EFA9F9F524B7CF4B76FC4F59A07CBD1B1A829B991A45BA08EC16246B9F602100254FBD968AF90CB78F29327A938F7C780080098CCB5CD5F2FDA79D8D05C4ECC26B341FF20B47CB29AF45080719A60D1C7908F505046946015636A32B536F1C00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007F75515816F19AD676CA0F2D81E096BD1FE75E2920618C310E01195A0CBA3FB320F4F9CF27B9FD3DF9280B336AA9413ECC7D16CFD27FB76BE7EE8F38D9E88266154DC85A223B12ED35BF571A2B4CB5E533E9B443B30FA854630000000000000000365E3CAD44A68F821A1D0D361CADF8CD7E51ACB48F88C87A603C8CB11CD24CF3B28B875DDCB5E9DF3E7239E1D7698865A24643A382F4E3E07137ABF4CB0B0710AAE3FED9D08951DAF60A29E4270F0C081EA6824B4DEFE0E402FFFFFFFFFFFFFFFF9685A8E52AD8B756707E98669ADB1C1DA817EDC0FFB56026D00E86725EFCC1F25868F2028F1F39E74D093DCAF69861679AA415B293F8F6949C2FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41627E2A80E5F0C929788EE23C6849E1BFFDC97139055268BDE1A6144F94BD523D2D3D0A5AB84CAC6EEE2E85C805966247BB63B2FC1738ACC125040000000000000000000000000000000000000000000000000000000000000000000000000000D9BF064094D67F13999836953D43FFDE9371AAA0D7FD27B76B02FCE32BA7CC890FC60BE0C9BDBEA381EDF9B4AB90FED057949EAC7E455B4ED5E269AE02CC1200D57D6274DEC4B1BAA85478924BDB8DBBD8EE542EC52327E598700EC67472929FBB62F9AD1C0D1A3F16644DAA6674D69A526913383B5B58C9634C7867CF831D009BB675F1328AAF1BB79A4C24A179508EF80E7BAFEB06EFCF175003A1CD7214290EC3C7CBB7A6C86266C9451A213BCF69D6649B84CC2C4E360F6CFC6DA1E41E00AECBE4D095C0E016F87AD916143686669C669F2FD5424A4EDE21F5A1D3A5E649D88BE83E1BF5623C3A3C6BC0A64512359A9C76C48FE00D54223DD7E188C32100FE70BBF8E9C3E04F510D9E16844649DFE31E7CE3E5F71DD4221039B239F0E29D2774098964DAEF942CC3FB76840FCACB7789692866A9C7216BA8A15AB982120043B54215A968BA83F87AEF86AC667F6A12B79C85FCD74B380CE293E582E1B47F712A282E07A56BFA36098AC55FCA4EAA8D285DE9C02CE3D60E850C1BEA6B11009EFEEEBA9DE7EF1FDC438F3C60DBECC0910B182A1B8473D63C4421AC4E40707BB7E5BAF14B260DF3A8164B11F27B4B520C006079645B019259B187E36462020051607DD9944DBDF95DFD3FFE96141FDDDBAC07D502927E924944F3C041FD99646B30A87054E83A941DCC234753F2DF17CB2FD69C08E5644E4C08802DD2771A0033815EF769414D488762CE04C14AA46E65BDC1B12F14E80D638DF54E8F70F08340759DC6019069113C5BF6013919B634F8E07380E1AB71524CC56AAEEEDC070079237191876D3991EF8D20F21B7F57C640A34959B046361279E2D1F566BFC290CE79E09DA6E1CCAE57FD090D505544288780A99DBBBA013A44590DE5EE1B240073268BB443D8BB86970829E200CF6E7FBB888DA677323505BA9E8885F03D780D948C366A8E4C841D541028E85361EAB624848AC378E62ABFCB40E16AC4F81F00C198625E939773E1B9DD442FBBDC9027743533C9EC8A383D21A190DB2F0A6DD092BF6EB4CB337147564AE8EEDC952D06D99D0B91AF66DAA4371994888A731A00DEB78E107A63D62037A1C579B00FEFE3A60CE7CDE0D5D3349BCE9179C01E8283A5074D9474465291B8F1732B09194E22C8276DB62621E63480899F67EE9223002D8C7B4BE1E5EADFC73EE36F6940D05445ACCCCBFEA5BF52428C5980C36AAF3939BA0FB230572A7FCF02C83CDB7844E6AA686AB2AE18BBBB29B9F4BF3C6F0200 -smlen = 1853 -sm = DDDD4D46ABE7F476F4D9C0CAA068C86052EF017C958300DF0D92C4906BDCBBCCEC8A0E772F00B5FE4CE1F9C967A1F76D67179653F2B39A320161DD3BAB993CBC4A5D51D5ED7D3E7DF0C95701D6867B23799AE4EA2C66EF4428E082D617B401B74753428C61117831E5D1DD73EED986A59801E377D121A86D5426ACF0FA8EA49440BC8FED01028E256F5C01540320E6A6920679DCCF7EEA0123279FA2D13D7857A7052DA91D7EF44EBA8F01D8A20631D0A30397FEF2BC8A1564AD30D5470046FBF9BAFE2D0A01E7BC3938CE5DE3352FBF014C4E62DD60D9FE99AF8A51501CEA7022D15800DAD2DDEE358A3253D3E465F7872D7DDF29CB004A741FB576F62A062B89C03E19D498F11F9A01011FC5685FFFF9F650BBF579A5507F765796A603DBA9F51C15AF25D6EF44AD52CE03016BD70D72971FAE46EEB8A87857C886BD78F100D9D39FDE6E2E0B64B39EF24A99EC03047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 - -count = 46 -seed = CFA713E4A63A6FFBA43BFB898956DC400507F68AD164C3D24A67B5F8D7548C9DB44DAA43E5E4A0990325A4233089318A -mlen = 1551 -msg = 6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 -pk = B05D2D5C96290FFD0B06D213D2479945354C2564BB1EA5AF3E763570A922BD678F924248F5C13517B89E81B90743F9F0E62CAE3DB6E5C82E474E1767167A0E007826C0F7921124AC835C4FF4D41A9829B4C9D28A7AB4398B5DB263B86C6989947E17EE8FEE8D80395621E94EE2BE3C058FE6A6A9782A7BD1E00FE5724C570100 -sk = B05D2D5C96290FFD0B06D213D2479945354C2564BB1EA5AF3E763570A922BD678F924248F5C13517B89E81B90743F9F0E62CAE3DB6E5C82E474E1767167A0E007826C0F7921124AC835C4FF4D41A9829B4C9D28A7AB4398B5DB263B86C6989947E17EE8FEE8D80395621E94EE2BE3C058FE6A6A9782A7BD1E00FE5724C570100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009CE48047E93010843D5C8F9EDF5DC001EC5B6C306AA16DA195F9ED71552962C0AC145106297583A908977F3632D21293505D8393E5392AAB89C0B3B200D980C626F5AE804727B5CB99AA366F651105EE9B20506986EC6391CD0F00000000000000E1CC927420BF6AA45691F422BB4AC09817745F9EDDDCE169F08C116C4868120B3E89DFEA9369E37529636BE80A3D8035B9120E1DC278A24F2CA77106A28FB2CEBF3D7C5D1D91A64DD742F61ABFC3898714D1F7C93C4977A95EF0FFFFFFFFFFFFFF296103F7D13891189D85D906E43558CA891972BC8726EC9EE9F5C92C11FFDBB51D2221FE827F9B208D976CD2CBC4CF809BF1996C5186346FC7DEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8D054E01923C6EC8320A07E8FEC5B5D5A6DCB79FEE8C4229BB32A9D955ACA95F7D9DECB6E06CC35CB4AB3D97C0D062B3AD537DF6AE69DF37F570200000000000000000000000000000000000000000000000000000000000000000000000000001BE75A88A83EC8CF20AF3293B2FE6AF0B2D7E7679CCB48DFA058F94922D7098355555503B564D40F39915D37E7C677772FD0BDDEBE2F7DC7E9556012B7570900DECA2C321785F15A825DF46CF959CDE8D1CB9DB1A3B333C89AFFA4017D65CE536F2828EF6C464DB7F702193D7B36C5A218BEF521796A2E8DA0E1307498200800E841348095FAB5EEF58A175F5B03B8C84FAB8A2775CE7B75CF0EAC6DD2DBAC7893690283809E0D54216C7874F61A52277C43B956B0E34A6B347D1D3FD61E1F00CC9FC6496707916919549267FC8A960ACDA8157E64D7DEC5AE94891E8516D8A9373CBF8D745C47A174FABC58CC0730F27D940A1F7B1D1857DABBCF71CDDB1200A5A93285A7409713AC7626121FC5785EEBA9994C88500B7FF01F574B0FF4BAD8B26C135992AF5B3A3C0C93EDDBA189E0D529EF43FA651D325B8631B3DF6A0300927150E830750DF643DC237A251014E59B4B8E08AAFD2C90A2D71126312375205738A8C3788632F7AB6F4C3D9F2E50F96B9A2A15D97F790D5A5F3435CC112100B35A66141194CF8C54BD8D0D4B92584DACCF2A7FD364516FDC848B18B6EBE9F5186AA2799136F31832B4CF6E3ADF1B36DD7E429688126D1611BC52FEFDBE090059E0DDC0CCE8B08A27DB71F66F276D741D55802E8CA675118B851B5737212D30503DBA4F87F0DDE6FBA6698951799301CC9F0CA7AC22F6FE45A11619957602006D5F654622FD3DDB61BA5BD403909D5EB46CADA2CA3297F619DA9CA1FA9BAEAC966C75766118BB52D52680CFF7720CE516C249D70E1CE86F271C1AE32C47130047F0530B81E78D6AE24740E39521BFE114D686B348CF0FEA54BBFD0009628DCC3ECF7E8222630602A2698969B0C739DCD0FB4B227D076E803CEC74AC533F2500DD26FE522F53D2EC4A9FFD6E3AB84860409169342F4450BF3E587F5C5BD78147F15ED833E8F4302A5A924E0D81F2A5523A7635B898C8929D5A9458EEC30D20005DD12E9025408F5C769AA826D307EEF56E6C3703C34F421DEF73C9EF9EA55FCAD95CA5B6D008E935FDCA48A0142DA75ABA762A6FE83578A25A7BD1BC4C1E1B00C4EB610AE822212559FCCFEFE6F28DD9CA95AC12A10AAA697C6E430135E7A83D3C77BC334971A9872F3C7AD2F167EDDE01E833545D3FF680054C5043E8E20F0004BAE7D10FA3457CD1433C6410BBF3FCA77A54CB4F0A6CBFAB9A84C157363C6DAD63E68666301A00117C404E6034398C3CCA55225B38F32B4C87DE9ECB541E00 -smlen = 1886 -sm = 1A94CAFEC95B679AE38504E5E3764CCFB81701D78B4893E71D905C5F44617501F0F4EB9E9800870F896606586B92DCE024E46D4FBCAB899901E1FA0C87635EA932F219A3E54AC84857FB8D00804D9F63FA12193664322F7307192BF5E19100F89CC26B626FD06B467BF8E10C669A02B5F301C75BD3109518C541C65D3C27DF88435C364A0031D9567C5F762FC8359C08E3F8DADCD8030F01FC551799FD7FAB734FD7BE75D9893A4F9275012940F9096968AA3FE0D62611BEA0281F7AAB01868A1AA2CDD2732DD557C394D51352521E16014C1DCF3C1F7D577065095BD5E2F80DA8EA2A01C6174B44706C3E847B9FA66D371F0AB21A5701FC8BE696590A9C5054FB8820C335A936E6F80101B9299F9013E49F6AC6332FC48BE5C12F05D33B366B5101EF70D72D9EB2BCA01E0401B81E21EC1FDBAA28F1277926AE619921234D005078552E2BB3E44F1098EE9E5C93026A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 - -count = 47 -seed = 1F3193EBC58EF65E9E396D69220ADB8ADC729BB388A72CEC9028A094F1CBDED21CFB0C41356AF31E0CF66A3B0D843666 -mlen = 1584 -msg = 139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA -pk = D1FBCC00E54D2DF926CBC94499FA57744B3A052EE5E212255E6C051889C83C8F321CE6A05A2952D46BA8C99662E4BFA622648DAF8E86D33B15383F2D52F523009FAA03188BC28878F72571696B3EC6E507705757B851CF35470DF90E7B29A4EBD67E3B31EB79CF23549B8E4E4C557AAE0B58D0FDA42CE73F29BE0DEFA3550A00 -sk = D1FBCC00E54D2DF926CBC94499FA57744B3A052EE5E212255E6C051889C83C8F321CE6A05A2952D46BA8C99662E4BFA622648DAF8E86D33B15383F2D52F523009FAA03188BC28878F72571696B3EC6E507705757B851CF35470DF90E7B29A4EBD67E3B31EB79CF23549B8E4E4C557AAE0B58D0FDA42CE73F29BE0DEFA3550A00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005BD52AB210ACB538D07DE80FCC29BD48F4127726AA2C6084FD6C2878A75DE563ECC06E391AF41F1A89000FC2D0A17EB55E7F0F5B2A9C25FB397B0EB026FD284A27F4C6A96D7ED415346E284F8C3D995C84B2D27593B1E50B0E07000000000000007851C59F12E93A1E8A63CBF7021965B106DB9C6E19E32FE5A88180B281150888B01A39BA5B30B076ACF4B0171FB1F6AD9370628B2DA96CB0F1FB0D8F07FE93A46C0E7114889B7D42831E9C5B0CBC2F9D13B03F29990BE58D5AFAFFFFFFFFFFFFFFB4ED27CDF48FA2FB69DE068BA39288973101ACE2AB612D34D0819BE781697E9EC256E3D74EA2F92B38D725555ACC36E8170C9759A77D5C970832FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0328BF401A488BC32F3AA8B53C9ECB9E6472C9FCBC2D5BE3E523D347DFC555311B251ECBB86CAE41AB101A00B4918EA9FB18523F1184394A7E4A0200000000000000000000000000000000000000000000000000000000000000000000000000003452563FF9116B15AB4E0C751388F270C9AC2211FB936DF89C7CFF2D52DC00773344CDF2066F093465063CBD1D46D227F5C9B470062955E244AC586B44831D00468942794D502A267779B4DCB7A801416B8C722A94B62C9A687116B4FA3B4545058C2378ACE35E1B6B76548C35669B55E074540D246BB1DC6B6C4E946BCF1E009D8CBFAF56A3C64A5CA24F6A1ED52B7794D4B146F8B273B1CB9F39D4E7165636B5F106279A8AC998127725B7C254387E2375E70501E0655EC8818F146A3F0800D5E154748396E98B667B2A4E8A5A4BD12B4E1D54DEB23241BC4EF9EAFA055D5D66F93250B31F27DC3BA03C57F4B64E4462C5E32921ED4D5B53FB073673941700E8485D6B45C72568B1BFB8D8EAA34952104B1850440C252B3395BDA5620B3D79659D87E42652051B2FF14789DFF175A5AB98AD69A7F5A3CF8D5721BD61360F002E553CA41C646E7E070AB3ED4388751427FFC5AAA0BD5882A90050F2EDB6DA8CAE503FABEFFF1A922905056E9171FAF5518CD9253AFCC4A6B6B75B9355820E009569F13299818FC53CE57A03DD9EC78813AE064220CA7916BEB1AEBD80F118801B61CFE095C24E3168B2293990106D037E3376444227C8D7812D6789DC2910007F8BA9BD820CA2114AC1DDA7B082A586F3F678FE056AFE8407F75B85BD96C915E19D7C6DE6EE0A010BE8BFAD59611732A7C5365C49F7EB3AC11BE38C92051E00FF09BCC48E4D20B9847FC217D3F3D696F3048A059EA255D05DE15F3AE84C6957CBD41F1B465B0CCF59BA7392443EDF9B7DCA7F3D383C470CFA716BDFECC70A004C0A024D4A787234F20736C6C345BF99846014F2E4F5514F29C5E190F08E9ED21E8A99BDE970DFFB62D94D153F5262636F061646D554EBE831349A7EBE9E18003A423A7CB91279359B497783ED896069A4E6982895541A053CAF264DB87BD220CFCB6376440F54B77D509F54F1142D0DD3B549416872C3B0F6D2CCD2D9DA04003F739ADDC42015B0F47C0E194841396D89827FC85FC335215D97CB09BB92F0977EA3DDA666B38C74144995CEA206E48F9FFE3D27792ABC2E6DA9C2832429000028ABA67C9E209501354D1B6D0FE85BB56102EF2DD9FF479F6E32614F3D153DBDCDBEFFA98DD928FDFDC7E64E4A56960E5002FA84E1BCF9BA61C90A46072B0F00E17C472BC225AE4A53958BADD60A8D5A541986CC275B55FAEB17497FDB45D8DA3607B160CA8EF7940ED100514A85DD560AC1F63C219D4EB82D4DCE5C1A821400 -smlen = 1919 -sm = 011683724D73A04B56FF0F4F06C3BDC3146900A1114058A26322696B7C0F02369BF4707C72009AE37C88D178633664B4D6D9348E991CFD1E006EA86B99C497E091F13FBFDCA72FA736367E0110F3BD932751DA24F365F9306D9A89B165BB0185F0C53D9EDD0F521BBBD1FABBB5903E716300A0447BD5960F83426BF4394EFDBE8D069C4B01E5BD68D163D8FD04C74A925492E8DE0FD5F9009D97591A344EE65744422DF33EED303F10D401BDF367028330A6B4312F2159724B379943BC0051D98F8F8A58EEC754304021348484B377DE01039D0B6CBDCFBCB0B12BAB867C4326DBB5AA00757CF7446C0FB74A74887A663A2AE3DF909D01E9829D4B086FE1F2767F4A8203DC474E1AEF010123A59B23D2F3CA6AAD957FD799C108268CF0F9E59318443E7B34A8FE5E246B8405025CC49EF89E58C13203F3330B4E9F469A8CAB018205268DE1B868C13A76101D161704139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA - -count = 48 -seed = CF5A04DDB5EBC45328F703D486D24443A7692D65AA55F054E3078DB76A7939590A3F35CF1A21E82A845445DD1B64A85A -mlen = 1617 -msg = EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 -pk = 78CDBE37228CAC078CE12F74EE6EF1A1C569D31624B580BEEEF71953AAC5B3DFCA5F63B922FD6522B5E3281059D90FD38EAA742BF4E896CF20B2A57DE6DD08007E6E3B57F3E2459557336D937D2BD4543923E76370762951CBDC257BBC39FB98F045BE4FF024D9F2B1C4CB072061BBE2EAA3A6535DC95EEE9033841160F30100 -sk = 78CDBE37228CAC078CE12F74EE6EF1A1C569D31624B580BEEEF71953AAC5B3DFCA5F63B922FD6522B5E3281059D90FD38EAA742BF4E896CF20B2A57DE6DD08007E6E3B57F3E2459557336D937D2BD4543923E76370762951CBDC257BBC39FB98F045BE4FF024D9F2B1C4CB072061BBE2EAA3A6535DC95EEE9033841160F30100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005CE5A1997D6CACFA8785444B3A622DF2D3841A6983A51B56513B4D8E7AC5A4298832629720C7F8937E3D083DCD1068ED1417AA9DDB8513163269809341DC4D51170015B4E5DF8A5A98614442FE0EB4E01707A2B8A1F53673D313000000000000006794B99405B54AFE2C988D57953C0C24DDD2E69424105148B55863DAA1A98C3B00B2086ED8B02C2908BF54EFAD54A6A8F98E9CCDB418B1358C37BFD1EAAE8D18FC13D0DE5CFDD66D4D9F522E723A7C6BA7B1D71137B3CF7572F1FFFFFFFFFFFFFFDF9475190637ABF6920FB92AE628CF7A087D598E2FE0AB341E50F2EA0376A26BB67CB080E4FCB322DD33DF53D84F3157ACF89311549EEC58F1DAFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08E670C2E941C92610927929016ADFF2E464AA35DF016798A702826A42D85E86F9A27C2DB508E466CA6999BE7BAE170D8DD0739816216BB9D889020000000000000000000000000000000000000000000000000000000000000000000000000000BC19FB04A810C094E22F9066F53B543882E9FB73DECE76C5E8EF1C80E347AE025AE6630DD39964845388DA875D97EF904CE60153EB92A435F192394F7DD81C00DB5996793AC5EA7E4002B8943A980E8F7B823879F360ED45EB739997F11CBFD1C5CB616026BD6C9A1ADAFF1DB2FEF5E6D7804C60672FC797A9BABA366FF305001A0BA394FE0EDED60A3DEC9D7F4F5B7D095F70DE3B4369EDBABE9FDEBC4E44505F78437D0989C85119DD9DEE782426367A494826E80B198B76C9BC470BA009002B657628D2DA7A15716892E10A1FC50859F8D25D4B7304E22F3C901671EAAF4A23ACC5E06DF330D5DADC9AAA9BDC93EB47CD2C0FE6D547F1701B379D253E2000E9B13741B46A1AE07942A2AC7F9FF57ECDC79629AF0009A06CFAC36B46F9AF010CDEC52B5454D1CD3FE549B9447336E143807C3217D6D05ECFFA5ACF04AF0100FCBAD408BE9591E86152B0B4EE647016CB1B1E4F892A04697DDDA11F901F80C22BED51620090149D135C4223202A29F8D7F86BD3BD002B1A1F8674ADED0108001E62ECF464C6B8E73501A5DE6EDCDBCD5D238E9E202697EB412AC0DD4D34C3CA9251A693D481FC6B0E197C3E857E19FDF2B6AE3653EBED3E4E1FF185F57A1A000E16998A2AD43D1B49C487751B3878C49FF3D536AD7B3CC31B5E4FC3CEA60EAACA979252DDE95E751EB91C147740998FD70893BD03BED10A71A06D043B091600C2FE0F225EB09531E3CC6F6844829432C81CCA7B58B21958A71E2F6C6DB9CFEF3323780AC4843A4A1EC4BB5744F0EAAE40B60333E610131E987209F3DF9E1C00C204C76721B72029FBED9B1BEB5A37ACB95F358922FC2F8687F0DE2243A0454259C0FD7221D1F34F125C3154A1E343E9E11762BC0E4AAA7FF5F02706DC030A000924FF08CC6E5D426B34FE38A95999F05AC7C45093E8AF985EBA63ACFB085B82F51C3FEB363987648283CBA8689D76524B8AB04D3A24D409BF0FC830D2430D00E08DB87244810921ED67E18D5E06164E2C97E4F1D5E1AA9F188685A74AC357F6418D5FD5CD1685A5CF2FB0A161B5B086FE9BFEF560FD403259A407CACC43230097CC43C2A13053FF14DA7B16B6428889B73339BAB3F78884E4A7E294AA87C1DA48DEC64EAC51AD4C3134165D645C095A1A495F18EE1F65E70732FD0A988C12009706955E69EA9A6626F5E91BECAF9E4F4B5398FFBEF155075F1C210305794342F995DDAE9B747B132D4B90FDF7F9EF3B0FA91050CA1974BDCEF1354E6CBC1500 -smlen = 1952 -sm = 11E5D764283162B1612C57657050FDA0C23D012AF4ABB0965718AC2D8E5F06622FBD9ECB3C00F7FBB9DAE69D5A7CFE3C7B1450AC391684A900BD36F9DE95BD9AF649A080397CC9163F919B00F5F6C2683C53E9DD03A0F7CF8BC3A0075DB300D8FE5631DF0C593C92E04EC60420680DB57100D86588C58FEDB7F198EEC0751D7E0D0C9665016ACC87478726792855B7BB088D406B47867B015078222997D46CA7C966944586F9B14590F300831C47BC17618BB902D2C67272EC83E21CF001015B46B0BED705916648BA42FCFA4CE0809101E7824F4604C4100F680DE63689150C870BF8005EA42E140FF79F60FF7D6C031551CAB76EEB018C76AFDC7E7357BF039068E306EC8A462BAF0101A9BD03AFEFEC7CD1E0908FFE1CD5DFA6F8D0E369A36904D82D0A3F63A17EC5AA0302E04809F08B05C4EB27A49990027C7499286F01D01A66003E9F22088CE5B27B3D7C03EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 - -count = 49 -seed = 8C3D2FBBE0D39E293AF2D2CC5A9BEDEAAE3752DFD19CDC1E186D41E717A0412AA429CBDF005445AFDE684656B5D17690 -mlen = 1650 -msg = D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 -pk = 35F4809BE314F83D3A9AE22AAF7AAF8FA2F886D7AD7129FA324A6697179B0D380EAEEA89D90F4557B7E4A36A18EF50A52D2F81730A7111C7CA6DF9DF1B98010020DDC6BFE16DCBDBDB8A095930ABF46F2F04BF7605A20C26EA2D93D7FFC6B4DAA5E470F52F5BF8B4133D63ED7015940547967903F08EC4897DAEB9F7F1952200 -sk = 35F4809BE314F83D3A9AE22AAF7AAF8FA2F886D7AD7129FA324A6697179B0D380EAEEA89D90F4557B7E4A36A18EF50A52D2F81730A7111C7CA6DF9DF1B98010020DDC6BFE16DCBDBDB8A095930ABF46F2F04BF7605A20C26EA2D93D7FFC6B4DAA5E470F52F5BF8B4133D63ED7015940547967903F08EC4897DAEB9F7F19522000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012197129727D08CB9AC68B2FE715618CC008E05DCF0E25D25F109B07DC1E73A27C1724E499471F8FCE75CACD5960A2E175FFC68D927AA0E2461AE1F59E89C3F9406C1C8C8455F4F3D0E28E95FC982E4720C37FE18C91250EE600000000000000005F995BD8C0C758321D2BD2A6C06682CB3FD70C779EB5D4A6B2E7E975D2D340B78EFDB3C8144CF380CC3C8C03E3833341A4108AF4D5D3B67668FA3FCE408922B99ABA4BE13E504447F6ECFA91676D2C29B847D3D06AFA9AEC53E5FFFFFFFFFFFFFF713A965CB51A0D656CE2F4FC441DF10D7BFF07F5F59E82313E5A1AE82CD8A3D84F2D0B5C7B546F3BD631C7AB4904BDCEE994146D8D9EF57D7DB0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66EE80C21E17CF8902A197B7764E782FCACD25F8DEC741C52AFDB055A16DCA0FE771E259DE14FAAF4278A793D7D67A4AD1B2B8CE389E9A857418020000000000000000000000000000000000000000000000000000000000000000000000000000A8F6C7DFEC181DDBAEEF9982068D3175195DEB723956D9CA0B10424D9F910DD6B37834D68726B890946973C445B743742F0F62578A6137ED1997B78110940300D602B47D7D477268DAC24DE457E2B6A142580DE460FE2F1A49916DE3A16B7E2FA3BAAF4C180E0F84F80A2D618B03A5F2BA991F04F92BB9EC96EC0134B56122003D4BFA0FFB7E93B1EC1DAAD3AC083714FCCC381E5DAAE3E3B5CEC7561CF575FC3CAADF1FA0DC2392E26D0D9820A5C02460E0B857D760F868F7D19C23B26A0F0007B5A9FB02C8572127F499F43B38959B94E552205E34081EA43A02E1E403C1362FE2586784F827594E43D636CF6C239995EA7B9907E2187B1ADF8A459FC9190052443F2C3E358B9D283B9CF185EB9983F666861A9ED74E444F73CBF2AE5A2A41F18EB5F816F0F857F68A49277CF3C231D5641873E156BAB1FE140BD41EF40E006716CC10FBB90BE8EE08704A890E8E62C46CE76B16079AEA7123019AD6B7903B28964159BBA3DA72B656C5819C0337D089750BCC81ECAEF6628DF497C5300200F6DAB32C90CF622C7FBA8546B879DA32E0B4524682DBC4563119CBB416903C298FA412F2BB93793E248826D671B039E17EE8608C3BD5DAA951B5069196D01C0094B35B5141FDE6403470F5B651CC3BB1E341295AEE8AEC2D08BEEB89A77AC8DAFFB6F21B76EA874D97BC128FA23A679E488ACE94E32770DCA0E761D81F602300AE3BA322F4908367013D119603A6D7FF48EC7B7EBD291EC588E25A063CB6C66669FD1A579188DBB138C003012ED3CD470619FE92F3EB83FF9B7CC0FA861F1000407F8B2B2870902893054A62EB42FCC33465A231B3F6188604F495BBF93CE0BA7A861E9D6935AEFEEBDACF9259BD3BACE3179C85A7E59C358C57C223A60A1E00C2563F9D81132E16573060A3F1770E9AA0B91DE2655A6A3073FB624F1B66A5A03070BA44F6FBA98CA54665F123111B484B5F076908F27D1BF2804F915D7A2000678E40AAED74B218E55164D6125C34C0046125A8412B7823AC7827B9ED4B95976A33C16FCF65EF0C27123649E0D1AE19746187BCC14CFCF37EB5B0B2A5672400A22586588D532FFD14A8B34DAB1BB11A70C69A0814C87A825F3AD3E8206A3001A1FE03D745EE3B5CDFDCB6349EA9967C49B2621B4CEF84C7895F43ED20871B0035FABE9757D728C37739D00FAC7844666908378684A1E1A502BD55A286F12A6E4D56F9F1A06AEED699A775B8632304C97BDD5ACEEF5B5B9C71F0F5D914240800 -smlen = 1985 -sm = D5A2FC17F2F7721B8A0AC060C545D530FE3D015083BBF258AFA455DA924F70DDA93B663C740169AFD3D3BCA5FBBE86D3A64C748D0FA59CD300AA4195FAA74D8DD5CFA5F6E2E64DC6A4B83A009FE80FE9B752B60AFD0624772A82EC123ADF0148601AD6B995FF6F11B08B71AF2DDF14240101313BCAA47F044AF47532B792D5F137F467E100570C3B0AF92E5426BAA8D2943FF5AD0BDF8D0008DBBC472735506658AD97395B0175148A6C005DCFDE1AA3488CB21975BBB2EA19588E946D01D3D23224117356A2207606A6608499B3B0100185E3821E50BA188E53BF81CCA5D1DF767B8000A0728BB087AC6D13EC1786F744A1E7BF5C5C00D45F700F2F4168309D82EB829681D0DF1CAB01013D1CDD1E92B92691A2FC67EFEFC4B8530BA240765D3CAA0D89A67976D11197CF0403E49B220C77BAF73832651EDDD4E3FAF25C51001E163C7A9650518B5216C30D092B00D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 - -count = 50 -seed = C10427EF0B26328163F85D45E22EC5215415326F013FF31EDD58BD3E97B1A72FF07D275D4C1B517F4661B0638F75640C -mlen = 1683 -msg = 4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 -pk = 0F35D50B6D7E29FE3CEB22FEC8957136CBC6B7FF37EA74B4A03E9941E5C2AAEED1DEA36AB555E10822F46EB51EA08E5B98208DCE5EBA05F78FE20D539DE91D0059EB7176840C698C355A7C6D52592A7A3971945313CF1EB666F53C79881D0D9DBD6071428912D8AE9FC347F47AB03A948B96FD97A31D7093AFFADEFD40401B00 -sk = 0F35D50B6D7E29FE3CEB22FEC8957136CBC6B7FF37EA74B4A03E9941E5C2AAEED1DEA36AB555E10822F46EB51EA08E5B98208DCE5EBA05F78FE20D539DE91D0059EB7176840C698C355A7C6D52592A7A3971945313CF1EB666F53C79881D0D9DBD6071428912D8AE9FC347F47AB03A948B96FD97A31D7093AFFADEFD40401B00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008BB817AE6474DFE96682D688655DDA79B8550816A3264A4F4E72BDFAF8A9DAC47A7DFB2355109AC7B9748A35B9A9CC820715F20B32F8EB4EAED51E4A1064DC099671AAB6661CF3F333EB17A11354205C91F0E5C169AAC30D4E0E0000000000000040F582F4E54C005FB7DDF9894CE287C93D3EBAD1AC8C04B81EA63739626D9B7050948FF7029CC21A592D4C4883425B4394E933D743DE8280B6309F2DA3DD6956086B3CCE97FECD44F03101E66A9067CC356151FED3B0DE795DEBFFFFFFFFFFFFFF189CEEFB00D5495735B7090B0710E0A7E02B9683A8A1DD2CA855E3B0F6239AC9C43594198473DA5FD0BA0BFD1776916CB38E6073DFC1DC16DC14FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD56C2A659D7393E4EB06BC5FCEABA3609A8CD98F3AEE796766605473D907126BE53E41BF1FF1774D5F72207DE99DC9DAFDD496DC00C4FB64730B0200000000000000000000000000000000000000000000000000000000000000000000000000002B66189B37756F193C33CA686A19F757831A8B1ACE94AEDC7FEAD9CBA78A2EE2DA830EF5A312482360CF18C4F17B40D024B58BB039A66EA147BFE0D3798F2100D346F545C5A196F46D48304D2CB5477E3D0E27B44F75B9978D05FF15765F1B3D839A618059F79A8560548A7200CA144817BF83139EA4115F0DD623A16926220040EFB29CE09F5667BC9F362BDBBE8EA0C8B43E25E75807F25A2FA08883BC25110F46AE12959144D126C02E6A0D02FFFBBA6E11D8C806DAB0C69DDFA93689220047887655DCBE435AB45008EF1940DD679C90C0DB166D8E81CD887F8D5D64AF9F5D3AF5C12AB887671D4F7538D79B9BBAA3692A2EB4DB9AE76446622F90520B00C23324CCFB4D7F2000A2B3A5E0E94700E78CEBAC0C198C810CF7681C9973795BE2195F80E8A9E03C64D9552FC063230B3422EA5463FC600246B75B1CD8B30E0010D8A5FAF3C942FD87D3564210137501A1DC075D90CBA073CF3906BC043E6F2B658A52E15F5DF54A6BBB3126DADC11550FA9127219922A7A393B794DA34108007D93338F02AFFD1269DB1481E4302E882379E13FB864314D1A90024341E6CA611DD094A454C43FDC950480143F587B078E94D172F41E7F87822419B24470110071F2E80EAEF343567E5FB67B53A5DC42697D7F1F6EEFEC9CC0B17D3A3C1D1B8DCE7D2092CFD4230553A65A1D687E0A2AF2118315A3910F6D6A34421954860A00E9E401704771E80E6541FE4E0BE8D59EFB5186913FFC0A63B548E4D72012F4D30A16523489FEF10838D03CA9D5DD788305EC866AB24F0B8C82EAA64DF9E32000AA0C43D26FF6A9A6037D3F86702B69AFF4CD5D9C3BEBF5EE881E52E20D065B7F35FE23A1BFEE95689830173D33FEEF2D5700E6D5D85C752491409625B2A00B00FE10AF5FB2CA0D31163A4DFB4C23DE394C8CF1A578C4F6A6C9F1C1866C29BA1FE4847F0C320617C19ADF82082B6BB42F1766849521AC82621F8F7D880F261900A5EF1B2144B744EF5B33C5396446DA496415831132A6ACA449F1D2DD83E1D5B6EE368F2A66D5C9E6F9F34DAF2D3DB23410C68CA8FAF27FE005C949C4CEDF0D000F74586F4B7F5EDD0EBB72BF6DEB00DA39E0F58A00BAD93B461D4613BB89BD3EE97893B1AB97B727B268C423C369FA569CDDE33731B5C48DC3F5EBC5CBD60A00CE9A05A071FD51AC39583B30206AD116B2FA36CA65838FAAE1A07826961711CFC4AD8705D12A7E929AB9B45D7B6C4AE2C4A580CA0AB497BCD4BC482253131800 -smlen = 2018 -sm = 6B4CE29DDFAFA246132712E7965F4E8066FD00D3E4CB36B115BA06C354A0F3091C5246CF9B000C635D3B72BE1A8BBBA947FDD985D8E0C49C007768FF801044DE8F23D39757DD50EE4B44AC0138A544A7D824A74FA2B8A24F65992F22341501DD51F0C4918C1A86710074DEFE23F227726A004F9F3FCB3B4CC3513B418E93946F0FCC685D0063138C599A73B0AA48350E68AA0D611BDFC6005C4E0CBC90E4371ABF9DD59BBC1EA2F5B2930001B2E2BADAC2EF71E5EFA65DE44195679395015777A63676BD4D1763FB1504DAA09AE565A1018BF01B34D026F97D7523BBC36CA4981A6A5100D509DC97E1BC31B7E51F64415E8CB74AA84C01EA36086ED2A33145167CB73C8D3D178B1A6D000149EBB3382986B2B52DEDBEA0A236674C341F97B35D8CFBA8B5F0E03216FA3AA108016884A3307F33520AC695017AAFF528B7FFF60186E14FF636031E040082ED46DB9C004BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 - -count = 51 -seed = 4B6B73E042CE76DBE39535E45D3BB2F3B9F8B2BDA170E76CC88666844703E32B2367460A0F6A0A2E3F4E7A6CD32BE998 -mlen = 1716 -msg = 0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 -pk = DADB2B8DAA791E9AA845311FBF05C8FA95A0A916A76992165B101C9D92F10BACDCC6F829864EAB95841FF3618FC2B9CD5E31C6F981E2E3AD58A89FC1BCF50700716E96AD2F8D681D27576AC2F895910F1BE9B63CD15DEF616EEFA3F464B77FF34BE2D49044E1B97E96947F4E693932C915F11D86AA80AB55E636D9D3069B2200 -sk = DADB2B8DAA791E9AA845311FBF05C8FA95A0A916A76992165B101C9D92F10BACDCC6F829864EAB95841FF3618FC2B9CD5E31C6F981E2E3AD58A89FC1BCF50700716E96AD2F8D681D27576AC2F895910F1BE9B63CD15DEF616EEFA3F464B77FF34BE2D49044E1B97E96947F4E693932C915F11D86AA80AB55E636D9D3069B220002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D1A0954603A4ECA90FC7E3B7436677A599B98BB7DEAA34954A0DCBED85B423B7D8C3F09055EBF2511B9E24535EC077062AF46BF16BB16B7C239C2184E3C06793A0761A02541BDCE700DD67BCDEE16A06DE00186A6BFB85B5ACFEFFFFFFFFFFFFFFA2BB54B8F73418BE872529CB0F012DCA356296D83419EBF01EE4D9C7D7364EEDC00D25C7601C30FA683935A24C73049AC145F8043D56539EEB5D5D742AAE3B972BA5D0CA9A1D158147AED3AAFCB23E03C2B3AC6049CEE69FCEE8FFFFFFFFFFFFFFBEF2ED7738063C059CA7A71AD0B73B06D7057120D6DECDA3314BCFCEF254725F06FB75DF2C808D07B51C83A240C2EDF71CBD4DCEBC32F25386460100000000000000000000000000000000000000000000000000000000000000000000000000006F3CDBF1CA575BE5E1EEC9E7C62794FA9F025A3DB1617A44FDF136D2BD852C628C64B95146E19201DF1FF6AE6CE6F6552BB6372AF8A2B93990CD010000000000000000000000000000000000000000000000000000000000000000000000000000B0EF5F552DAE107C033D778D973268B5C421759D2A7321EABFD7A7DB878C666547E4F2707DD73AC485A26577BC8451D6F0412D312E2D1E000E8FEA6783CF0800C92252C47E97DCE56C3BCA017778C4874A493463B321CD834D4311FDEB5B7A5E983045B0545706B0B3D47BCAFAB2CE3F08D6FE0BAB6E58983B8E20D77CE21E006888B8C505088613B6BD72CAB1AB676F940CAF493C699382FE0DDFDCE4416972C2C8783D4900FFBB817025DA891C7988D2BF5C5592B10E0C6D5EE6AA16250900C630CCB841FB18522290AA00E187CB9A97BB7C6E225BF7427A8443907363C98EFAC68069BFE2506739BE733F91AA114676FBA55327F138F91A3CD44AC80C1200B6D01556AA187FA05F1C2336984C31E12BDC7F91DF564FDD03D4B37CAD4536BF67EFBFB22F403A2C323BCD35612CB4996F0CBE3CCD5763CA708219A968D809004013AA919FE9765C51821E1D3537197F960CAC035DBAFF3DC910C0C3A42D162A39609EC0D4F8C6643E60898474258D2186DD4EC5BAC932EC546DD04FA37506001C6E18A73B99DF53D743D553A9E327CCC8E3A322F4F84614C924B0C006871D70FB5D5C58C920E60D57E6494A5FA583188A1B0BDDBF72FFAB6EAF5FF4AEC019004C175811828A00667A64BC8A45ACA4BED143216F5F7A7FFB3AD3C2D38C6E71CA958D021E86B4E02A21665FC4C58C722695B33599FD0E6B3AC814D31C96360400876C120CA50851BD74CB9CFAD844519228E013EBB5B29F655D3B94CE1D9FD7104CA428895C05E8E8E930F4790E7F9853395FEFEBBFC1DE70EB3F9353849719009D9B8F55C624A8620E978F5D5CCE0F2FAE45ABDACCB393F8C93627BA7B67903628658098DE155BAF317F72AC2AB2CCC61C5D59E13A7B16DA4A0719D2FC481E00BFE02CD51C0CA76CA3D6BB8F87B178002D65A02639C88D9A7F8441117EE80022684F36D62FD30A541B6AD145C2469A0639A437486C774D3F2A7FCD8EA77C0100B013B77013D600901E4ECB7BA2CEEE008FB476CEF8BFA3D6FD9089B758D1257C02E73DCCA8F046498E3D704C397B121FD7148D09339EE06B2CDB99E02BC21C008F991C0D75CDFC74E5EA105A9E4890BE28C4B9A1CDF6A3205F70532573B4ADE0A3C10E572238E0D035428F699848B7AFB34C33AE50254A486A77D31F27BA040059C55D74967817885866551D4F4680E2ED34608804524CBC2C6E117A8B20BD8859E29E35C7FA70894F45061F3F51E0F8C97B0EB7472B83BEEA0ACCB567DC1100 -smlen = 2051 -sm = E676E9DFAA9A9F9A4BA58B09208B42F85F9C0103994DE0A4116EE0CAA7708AF3FE0C15671C01A81A619F2381329A4F3DCFEEABC2153BC83B00DAC5922CD2562BFD1ED0940DE51B2E40541801E9F94E60F8583726F88506EF49521C38E8D001287144CCA813FFB9AEDA9850DC767A90CC760181B0FF30DDA0D107B6E37F55649C8BD71B610021352E64990AC03BFE779E481945A2ECC2B3016C8CF47B1AC05E134D6100ADEA9300B91F3F015B93BC9FA73BA829C9D15ABB78A67E175216016410A1B9BE775A8541C1B2B170BA29EF7B7E005A5AA24CE2CE8F6A063F4A8225F46872B16C015D8E5C97C924A7C363B40407B2D2F653D66701CEA22F32926FDDDD3D55F27D49F009AD74070101EF757BF2833E4A447134BCE91B1DFA47BB7BEB077CFB4932F266E6B9A2139CD407017181233CFC9FF3DF5108D9569D6152E2B9F30074F2134DE0B12B886E7531131152000BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 - -count = 52 -seed = 3D4607399F6FCBE074FD2BEAB1A7571239D6BE6308617866B65B892EE65399E14DC7FA612CDBC5F7E23116FA86C3133D -mlen = 1749 -msg = DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 -pk = 60AF9A07BAF1F9783C5EB51EF97609E76F5D7A8D56D971E190B1FE4D8DEA3C7EF429A336231518F59B7B264676271DE9803EDFD7CD3111233B3633C3139C1E00C9EC6962027A0F2C34B9C4F4B26439519B7CF8C424C264BE40214714072AD0A22147E8EDBFF5A382909235FFEFE40420B4CE0035B3A5B349CBBA308E78151300 -sk = 60AF9A07BAF1F9783C5EB51EF97609E76F5D7A8D56D971E190B1FE4D8DEA3C7EF429A336231518F59B7B264676271DE9803EDFD7CD3111233B3633C3139C1E00C9EC6962027A0F2C34B9C4F4B26439519B7CF8C424C264BE40214714072AD0A22147E8EDBFF5A382909235FFEFE40420B4CE0035B3A5B349CBBA308E78151300020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006DD39B399FE1083BBA5D7DF491E995DE71D4E3A5C4540C6E88C65E09A251D524A3A1F1149F610D3BBECD33FDD84BDB4F80F6971F36D2BF0ED3DAFE3CC8BB41F0423B8C69840FAF6B98F33E052A69A7955BE476DEFAD92429C5FEFFFFFFFFFFFFFF24CF42445AB093BC6555E024E5E01E1EE0C6B6888D021384D492E72A13A7B108C2BA99DE5410880AB29895A85904E08E80B2E216111119EC452D777F0947D653FFF38E5B0BD04E6D1CFFEC4CE631BE839ABC04E1FBB9318206EAFFFFFFFFFFFFFFC0B12EFABDC18E14A13F2486266B0C214B78F44AAD568A1312B7008CB1F8BEBF21386292F7326DD01B6267A4D4C4E1CA37A7BDA2584C52E5B704000000000000000000000000000000000000000000000000000000000000000000000000000000758230F13868414A0C20EA0E5F77D9DAA5B90C1AD749E226F0EBB2E6F33CE27AC7D7838E941BF884404B5B538748747BB5BF8C20B3D2FA604EFF020000000000000000000000000000000000000000000000000000000000000000000000000000B5E0B566CBA3C7794C2BA7099BEE4D8D97C8530326CC68385EFD5D13EA74635E86EE3CCF380CB05EAECDF8F981CD4A8F01FECCD57D0CF3D3B1058107471722000027C1D212751D97747C68E6330A3ED57515338A16CC6279667A33481827E69BC744C75B94D078A9490A6DEAFC09AD8941E200B3AB76CA52AEEA5F91C38E010019F2BD10A258E7F8FE4C853A022CF4854F354CC8767054F372D4B3AF246ABBBF17023E2C02019D47DF2C03EDCD4B80A848D38267D943193A8A24665FF0052000518FAE1C6BD73F2A417C4DFB7F4B87D3E40287535D6CFEF7BAA0B9DCA3C2803305BDF27C7E4CEC46A27B81B0BB63ACF684BCD810C0236202AC72ECBC9BFC140079659F50462E127ED114B867D36FD3042E43F81868C8B2AD810BEF4578D601FAEE78EAB0457BEFFAC3597A06F5804EEFAEE60A54CEADC0B2907EFD3470A91E0037B6B866A3F1546D1920D774047B15D8FB59524EC037BEEDB6A3669D67CA0446BF95FD60FE3884759943425539564B8BF4D183A27B2A4E270675A0E6000C2300F4C486919AF43F3760FA1D42B48E2B9705537898724EE995873A17B7BA6B04236AF883CA65345A8CDB5B379327903955D8AA0E2E5DA94630552941E4EBE8110026855BF3E51D8DB6FC706D24687DD1755F4CD93EA7AFDF406C0F155C9747C81BCC3C7FEBB1E9E7A9016E1C3A2DC3CFBB6CC83C5AC1EF09003B0D85255B830F00D61EBD0379DC2DEF8F51433D1CF32FF19BC03A61FDD049B7D6E1F91D430A7E2CDCF66A6058E2C0118DB2E81D2A919E054811871876D052FEDF4D77A03E8614008BB560B7F9C444B06EB84841FAE64F2CD8197603980964F9A09A0448E1DE3EF945A262CEB084AE9F2DEB33760C8A120704DCEAA0CFC92A7FF5B0B1314E890D0067634DE93C7955C713137AA4ECCF6934C30BE984B3B5399A596695D186F596297734FDAE73543B5A155AB8C2A26FDA1E2718B7F76FDAF152D7A16A59AD6F170032856B1FC77205C61DEE361FBF59CC9855DFEC830CDA7F325E511AAA6904536E3226E5A0620EC21F3BA7FE74FB00789D99573B8CD2F1DA05D37BE20450560000412BE05468BE696A2A1DABDF1E072F484B7F0241301F567EE2664850D880745DED101D0B29BF1FC65E6B1A09497DF5D97A4EF732174375328832C25C6C65060090D55A6AA59EE6E466BAECFD9A426938E9881F4144B601F16C513788794505672D288A57740A4BABA3CCD84AB553B5B97F639D9103D27D80367ACE6B520D1D00 -smlen = 2084 -sm = 276100EEE218AFC5D0495EA850C41A6DA8840160CB528F598BEC36F9C5A39DEF99E1CEC4EF00D23192E02D13988063D8A78309DE22BFE70A0061EBEBE12773465F57EA1E84B82A2765429200B34078899A338EBD6A6A82D5F68D37BA5A6001470F63D3AD078E1B3ECAA0939DC2424CB78301F003F6D532CDB9A069B95984F30A1B1A5FF70094162F4BC688667335D555F91CD416BD043701F34BDAB8111E915664B4518C169617A8DA6B01ABCE3EE2C5B51D8851A6FF4FFAA745EF248300F871E74DD1F959DFF416123344F6D00EAE64006067F11E03D98B05191747EF4919B53983360140CEB5D2311202BBC9ED70BE09761529A37500DAEFC909EF83C4BC4C172C2BA799369597B2010155613E79563953D7A0E7F9AB1B0497BDA90889C0CF8CA27BFFD0C7C1719666AE06030D948FF505EB26F122E55C8224692A221DA301E9C1ACB9192ECA16780AAF7AEB5C03DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 - -count = 53 -seed = 7031BA806F4D8BC28529163B239E0EE836871C51D2D62B601B71D6F2B69B203C81440F8FFC09C3AAD94DB1D880160671 -mlen = 1782 -msg = 6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A -pk = 23F1399E1CE83A2B8BE9BD31CF322358745E04F1C0BF79F6191C7BF178A7F3E85782C452FAC683CAF7D336C10C366D7016CE7ABF6626E785C94036F9563D10003065643548ABDD4D0B3CB378D4C0352FA4DC4C4B2170E1C9198E37A3CE3D80FEA697D6454465021088E11CAF8A635AF7677E8BA8901EEA506217993BAFA10400 -sk = 23F1399E1CE83A2B8BE9BD31CF322358745E04F1C0BF79F6191C7BF178A7F3E85782C452FAC683CAF7D336C10C366D7016CE7ABF6626E785C94036F9563D10003065643548ABDD4D0B3CB378D4C0352FA4DC4C4B2170E1C9198E37A3CE3D80FEA697D6454465021088E11CAF8A635AF7677E8BA8901EEA506217993BAFA1040002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C8CB9A4751E4499BB1AD1F3D89F5E6D2EB41582BC09DEDA736E1466AF36BF855081ECBE8857E989BE862F1C15F4548C98C37AA44AEBCE5F6BF8946A39AD40609E589083E570A3A2EFEC1DA4933987825D5720FB56F9112D932FEFFFFFFFFFFFFFF8BA9D0181D87638D75C9379297B837D2359FCDEAE74E4171D9FC7974624ED0DB5B8AC658812AEDE714E69AF1AC028D81372E96ED4236420D9E5FB9850B080C30A27EC8C57A90BA007D770B9ED7407BE6358FACEB3E9B10612AF3FFFFFFFFFFFFFF8D28DA25D3037699E5B7D737B8A9706874393740F1962CF6451360ACA0F8C21AC162BD91E97FE1B7C764C0B49001BF8E75BFD2382C16EFE5738FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04E8C50070D63A4B9B04F57F9190E20CD3855183D6F11AEAFD5BC1AB972B025263500EEA686E161B0040BB6A6C9BB2EB5A382D0923204AE71C8C0400000000000000000000000000000000000000000000000000000000000000000000000000009C0A214BC905058D852E2B0A3A1EA3670CBF13902DF5DA0E0DEBD97CD934ED35A55859DE5BFB5C523DA58917396D65D27F6497ABA6986E28700DF36AB9120800C9E88CEB90221FBB92A0A1D52AF658D4B9630B3B0619395B516DC5C900F901AEA9513A7C16B7DE5FEC1EE70AB0E3B68448FE7356EB08BA75D5AE6400FB281400F751B4139814009B7D0B851C0CD5A7C269BB7EE3C89311194B411C6986E5291FD5C2C9B4287E15FDDBEF7E0BBCC774038C5AD1884A4A6BD3F6D16D9D6C101F00A1D4B924DCCFB42BD695D1338F47EC41AFD48684B98F9B268A57AF0A8E947D4DC70FACAE55DD7D5C6253686477E092376820EB9C2EB49D47DBDD14A4D2B50E004FC224CBF5AA4F9EB87A63BE4F0A7D371B04E8D7539A2ACE994197719EF49A05CC695DF72111FE71F628F17E7334D08C7FB03D8B5E71DFA3F043CE80EB221900ACA2B4F2E2735B341AA5D0A4C5F1469C63A3E3C8FB978681319D82E3BA496A517491604871893B3DF511DAB343536A4EDBE8111F1EBD772CDC5EC2C5498817003461ED39557D4E009B197F11DD549BFCC7EA9818D0BE3201682F60810A50BEFE8FAAAF4F92CCBF247C6CF10A78FD7E23FE066F0A1AE1415A8AD068604557210057622A9C7D8AA708034113F0801EFE1CD24814B6086CBDBF5D5BF814B36A07E53EE2BC73320FC097A3B790ED7878B6465AE6D3D07D1A4DB2AAFF5B545299020047C45F6DFB4243C4600EA7179235010FBF8DA18880EEE41FB34B064C3695AE016382639ECA996D8A62EBAAFB7B1F219AE2B19CE8DBD9994F6FAEAA29EC452000C5A1B7EE7D24ABB0D23B3E18B4208C72D681C5E323B87F37DBDC98C8A5143732134C107D072B152DB41889B2776BB7BB0147F7F5AF6270324322E31E853B0C00C01B1F5F1B68926436CE55BE607074319D94251C9864CE49FC4ACDED7EC3E449E999A162FEBFDA063A0D55FD572404F8769E8A35B14B96582E6E1F2106551F000481A1CA66F490B827EDD969D2A73C322BA514DAFA637AC988C9770729ED8C1B21F11F1118397E2507975D89C4542287E50AB0ED2629A0AD65257B69B8F31A009110BA8A7E507597EC99962A7536ECE56A04473645B112F9CE8567346D4E25DF55BCB9E9431AAB6C7146E3EF807DAE724A179E5EF3135DC451D0ECD63D570F000FB2BFD1054AB65E137B9E06B3CDBBAF9260CEC445C0A230E45293E5958CB536969AE9D107876D83075E99F4975FDB617884962F46CCFEC1C66D7A37316D1000 -smlen = 2117 -sm = 90C34E45CB138356085D6E7EE197CBA0A8C7000697A6CA16153939645A6CD85CC8B778882300C577B82996C444C74A2AE3A0ECA5B4CD55DF00101857676673A6C39C6125A9AC88354459E50104E7C25B93D387DAC26E5154799E1FDA96A5019D4D377F086F5E4A96FB7168EDB1516303E900640F7FA5981796ECA0E4B98DF8AD80503EC001E011D334673D41765B4A252CAA15A23D155101999B4868D7F3E9C8452F9EF928E54900B7CC01E2DCCCC30B16B6239634E2408667D9ED9E1B00C07583AFB995C63CCE536B71F6F5FC1A390D01FE17FB21E41DDA3598997E472072F874AB7501C1625E45B2F2499D870FF6951E6FAEB8663800034D6D735B3AB9A65F713398B29826642F110001A9F25D2DC8EAEB4FA1AE3A658A52D52E0DC6410A49383732A50A0515EEC809AB080200FED3FFABE5A5E9990AC553AD5B7C10BB9F004AC25F9D2B11CC01B60FE880D849026103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A - -count = 54 -seed = C8671A5D752CC6DDF075C899797603A625C142485EAC3D57CAF14F2244D7F84D116B28F959912A758E519D588A6A07EB -mlen = 1815 -msg = 3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 -pk = 0C83C22FE9AA7EAF2CFF9938D79768E64E9CCDAC21467B677532218A08AE5BE9EDF42162768BCF1D0868A05727B43FF4AA5327E9316EA59C93A8C704A7E41E00958CE49E351D24224279E50FE1FF996A8A6D5CA8896438BDCA4021B9572B69D27FFAF4BE7286C50651C22DC154DD9A177950FE7DE0ACFF757FE637DC00BD1C00 -sk = 0C83C22FE9AA7EAF2CFF9938D79768E64E9CCDAC21467B677532218A08AE5BE9EDF42162768BCF1D0868A05727B43FF4AA5327E9316EA59C93A8C704A7E41E00958CE49E351D24224279E50FE1FF996A8A6D5CA8896438BDCA4021B9572B69D27FFAF4BE7286C50651C22DC154DD9A177950FE7DE0ACFF757FE637DC00BD1C00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004291022CC47B83545C7AF5C1FCFD09A05986A374AFB1D87DAA9E26FDE1DBE63C20346412AF4A8CC46F07FAF0B20B388E4E005E1739C09B53BF691EDD60AE1E8549835D79D738CCEE3254DC4879D9BA0239A1A67BC3F17A331F010000000000000061B0F5BE9CB4B6E2B544707148B08E99FC9DDEE059BCB4E56F5A63C71C7251F29A4580D1F18A8A70AD07451381B6E4B3B3C96D8D71A9CD096E822D03703502C82DD026A56165A72A75818440B7ADA9C3EA90120B161FA19DBCF2FFFFFFFFFFFFFFF1D30ACB46037B8B6F54C20CDE3C9EF8FD3980BCF96BBCE3B750AE44D85BAB4A216C2AFA823DC2021B441403A597D10AC82345665DB54B431E19FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56CFD1048647271C54724945B9A3E6519E345762F41A2C2649D8BEEA84CFA54C3892C53FD238943BB9166B7BF466E2E569606FDE028761813B5A0300000000000000000000000000000000000000000000000000000000000000000000000000001D3A6B5ACEEC7186786CC7CDBA4814ED752EDF61A0DCB14E6A411F239BD7CDE17939208D4DDCDB8D36D0252F9B9AD64A2A24F5FFCB6E62B728C24E776EC917006DD0C1DB696596C59443F8011BB3728F189BD86A5511F7E7E3072689E0511EF9C66C7DF9DF8678586A59E042CC4C4DE7536425EF10375CD7B12D2E4CE1E60500FD72894252ED436B29E608A58329E078F1D4F2B65E004ECD648134EFE044762053028927F5E096D3E5D1D204478C4C5EA3B56C9C73006C2B6BA521538FEA14004F91128DC5C5C0BBF139394A3DBBA2CA4BB0352E65857C4B013FEA9BA0B93712753180B86839AF0A92E054B58D3C08F88210C155F666D2952F6E9CC26A8304006CA4A96DBCE7A37EAAFBB6F9DCA29616CDDA3F4D8676BEAE9D1C4515CDD30C28A3C158EF27EB8755F0784F91F3682EA8F7DA4B37C7C59FDFB33761B62F8C1B006CD629D42C8B829B3C8049E1F858EEC62247294BE35F47085C30D0FD0265E402F83D56ECD72AAAEDF5BC8E3FFEEA7331EA5B19B2C5EFE789A8E2B5187FC31F000832C1F8E99D8931FBB194127A196A25F6E5DE6AFDD4C07CE8D54295DFEF2EEA4DE8E6C049A5747541EA2D2D9B82465E382303AB9E18FEE29D293B08A6AE24003E744F886EF2C972D8F8ABD0CC4FF0187B9AFD0FCED4EC4227C973E0CF90A345D2F96EE0411494506669217FD8BD07D2450640F1E702B310780D6F66615E20000B4E482819ADB76D58CA414C93B0A958C64E4CA77506366538D491C51AA329BBA9DD4763C20B16A7A3A49BAC790C82AC3EEFBF2FFC78A31E97B18CFF859E1D00A4E51654F171D674A0BC5A962697C2CD7F8417A0D251954FCDC6522F87CE3ED1B550406C3AE67D6AD1424685F69CB7B5C7FD5D5DCDD2A57727463350DCBD0000DBC06EF5913ABD1DE13E50262FD9CF48868C00AF1911F7653DE640CB91D3C388A6C6293246F62CE6B866CF48E90F5B50CF49E7EB1869EF37EC9234FC6A901000094A5EA482368A37F6E54BD3AD3CF7988D2BBFC599E19B291CCEE311C55353EC76989E25B25FDE47F8D93EB14B9A643231B960573E8978576276D387E8EB1F0076DC0D1407FB5D0000B538869402594596AEAD524019FC0ACDE85837D1529105ACA8980E649E218ACD01A5C296635A938EC532C12A646F4854CDD620B133070047B0D07DF8B80154BE5DAAEE34375712F55852F71602BC4444D142068F0301CA95597706F95648136CD0933AB8C0691EBA6B076E4DDBC5C6E9B5E40DDFC51800 -smlen = 2150 -sm = 9C224E1FE094568A647FA27366135948EB5D01EB45E2902820950B6FE0D2D07779C3835268004A037EF54B4259C52FF0ED3193117F59678201B512DBFC846F9738942E1D33EAD391D9063C01C8DE2F9B63C8EB4795BBAF1A15BEC27D7D55010DE2B87C3BAD998E1E85E513A2CAE32F3678003EE8026CD4E1F4E35AA41039CC73C1CD7ED9013A41D265A3E383371B5B4879E67E935213790116035C1FAF4EB74E13C219314853DE11F8FB012FCB64CEE02107C68B1E4625B87D030B57C200C59B7379868BC3A949CD8BE8FC1CABC3196701805BFAB5017E59CF9D8471F3F172B4066E10017BBA302E59F11471B71AD8477F12AAA94E4300AF8949E41818689223DED6FFF6DE3553E86700007584A99F6FEE6595210232A8B60E50A48F6529D5607A00EEF39F7DBC0AF47D9A0703188A2CADADD3DF2B725148B6D1DDBE4D2F9C006CA7774283F0FB7BA9D7C65B22BD023EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 - -count = 55 -seed = D780D7688AF364949A196657A066BD48FFA8DC45B4885279B6DEF362E5957F398CDCE1D20FC3F8F63A275C325FCCE654 -mlen = 1848 -msg = BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 -pk = 9979BDB30D80FBECFA167FB94C7DA613B369D1758C3486F6779351FEF0F3DCB5D13278F4E0506DD4447D99E9A619E561A804E4D3D22AA5018ED16B25518A0800096DA3270C08C5E9CC249EA3C09A967189DD6BCFDC227768048F67D24C9491F441EA621FC59F705E501F4B2DCC1D8BE57AED1A8ED990563F39DFD090342A0900 -sk = 9979BDB30D80FBECFA167FB94C7DA613B369D1758C3486F6779351FEF0F3DCB5D13278F4E0506DD4447D99E9A619E561A804E4D3D22AA5018ED16B25518A0800096DA3270C08C5E9CC249EA3C09A967189DD6BCFDC227768048F67D24C9491F441EA621FC59F705E501F4B2DCC1D8BE57AED1A8ED990563F39DFD090342A0900020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004F9941B207D006A8284785C598E01C6DFA47B572FDECA422A0E595DCA51E1B8FC45BA77FD2074D992E3BDD3E23380E65107E303CB9234CCE1FC2C02D90D947ED983D46F19DB1527DA104144F175699F8DBDD7CBBDACB7FB020150000000000000086E87424ABFBD4378A890F9291711429AC05687966491AAE4D36E8E6769687D4057F1A193B0965020F45E8B1F629081203A9E6EFDA08A13502E3243620234BBA04563E2B3DA1746600D6620E2D8C885447643D6789C8BBF51EECFFFFFFFFFFFFFF1E9F6ADF08B749364BBEFE73E625A6AE12CC5B56345BABBA66E80E35BA2A10FF63E05CDFA8DF1A5C3696DFB084B6ABA9280F7A4A54FCB5DDB18BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FED414A53B4D96249B73A2F53E1C22196FB02E356E9389A729F4CC1B570090A5EEE71EE68601833F88ED3A5D713A3FD6920F1A41C533EF2D73E010000000000000000000000000000000000000000000000000000000000000000000000000000F78885F1DA67C9D6226287A6D45696E976180A8833CB57A99DA3CB881EBBDC6A828E073375AF7AABE07E3970B07187A8B8749C1E719DD1E3EEB3BD7056191A001E3767F79634BC9D024A94E936B3EC6373FA9BA8B9DB375775FC6942198955D573B172DAEDE07204AA120503F9BF602746DE39943FEC3FA6E6B1C0CFB5661100E488FE0BBECE06B336F905F4C66A44DC428AB6FA7752F752B7890CFBC42D6EB1AC94F8B8838413E8D50902B2C8C357B4EC17139F2C8A2C268FBE483B295D0900E8E0056BB4F2C389190F409D51B31F4BE2B1FB04E519CF99DE3B500D81173293A7B3BA8E4F8B5D14A9D9DD1EAFD628D6A8A5F3CDFBF78F9B8F350EE5BD43020099069615CE7A3C58778AB1EA07D94B166935CEA7D301F2776C86B331C9340E58DCDAA4E3C28FC1BD1DBD02E7B8728B02EFB5B9AECF799BEDC9635D97F0C11D00D950665DB3FEB6B2E0E204CEF8356250335E655E4602D1375709B140B99B212017D144E05B37561F9AF3EB9623A26AA3B6ADB255BF87DA1D42D4A522B99401002608B5BCD79D1F12354FE188F88594E3777AB9E5F5AE8BF38F2D05A3046FDB740B3213F90FB0A2BDCF2D21668F90190EFFD6C8B4D58A75EECED1E8D8C7A420001DFA85777E454ADE509C864C49B99ACF6233BB0485204412EBF98E627B3D6B10CB5D701A8A34B21505C2F6E32438EFD951AEB91431F559F0D97D53042CC008005F50CF8D2CC335514262A37DD4DBF11D38C14AF3EA665B9440B55F5C9E6AAE6623DF2495FE400C395BD1DC8448C6C7E30D7652F795F606675799D1DB45F6190025904FE994F884679976BC10102A90A52D247B508AEA9A46D0AD1E0C16311F8B1CCCD19AC9C02C0DF1B3D36FAEF6F93A75D5335840D775D7CEA4049A43170C00707C75767EEF100C2011DDE7A783D0AC65A44C6AE0379F42C2687D9D200B606D649C03E1F0B1B7B5F0240EDD24FD394494FC51E3A08CB03594E0CD4CE3E01A002FED7301BE546B8C907E8203E9919E744705AF3E057A6C32A7874DCC9629BCFE1E278AD431044A1A8B1D55DD6AEDDAB2901C852A7E6D38D9019446D8197706008B58949B8543FD628AC0283442C54CFE9C2255B153CA67EF6B00E7175FADD23E85FEE8F00AEFBA976DD4871A0B1ED5CB0C94AA9394BBA9E8F479F3E65DB10B002970CBF99902DFB8705BAFDFFCEBF4F32183245FA7225EF5AEEA515F73E13AE5AD24AD016B30AE53E1CEA73F7CDB9565A5A674F3C780E480A7AB18F0FC681900 -smlen = 2183 -sm = F1FE784A96F7BFE26EADECDD7639F1B5D4A9005DCB1D5BE5C1AF8417BB2CD8356733B8EF6200C20F18CE5B64B78B3EB0F1738958348C4F75003F2054DF2AA49397C6DA7EF974FA73A5128801F81DB2312020A3BB5AE0DAC6B0430354033601DD4534CEE1F3596089236477D54680F5FB5900041DF6124F06B73BFBFF159BE26358E535F8009924A90B0ADCD05404042AAD3AF651A379770050844BB82C6DD6FC82792DFB67CFCF715E7D01F6874008639A294431C9AE90AFA30F5E8A1A00790AA7E2DE6BB2DC4C997E11711EA1244CDE0141EDE4C24A0A59F57A63B2CAC95FF6F8477D016A4A3ABF9E100F8191309C7C0F81CA2C2886008109FEEBFEF5A26EE5FCA28A9840FCBC4434000171DF8AD61EF370C9F12B3CC14DB32D8B756C533C6E8BC8E1CBB021F03346A85B0603CB5F4BBE19FD21F59041E64FEE812D44CF9400E7EA374913AFD2E221B9AFC67F0C00BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 - -count = 56 -seed = 36AB8588F5233D15674677535A682382C29968FF824031AF646F58FCAF0E83C1C486B1E75479149FD6F4D9E8397CAF73 -mlen = 1881 -msg = 0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B -pk = 5591015C4B5769501D5124D6F6CF7A52241818CF407C2565CDB832289682D192E5B200E12AD810818CF52C3479511A1C55EA5EE8D99A94CF03112DE844D410005D6AFC440FB68EB4F75024524D067C98B23B70E3221F37AC3526B301355982DC7D6563F4240956C9060FE34FD173210D9AB3095BB59242BAC0C345CC5BBC1300 -sk = 5591015C4B5769501D5124D6F6CF7A52241818CF407C2565CDB832289682D192E5B200E12AD810818CF52C3479511A1C55EA5EE8D99A94CF03112DE844D410005D6AFC440FB68EB4F75024524D067C98B23B70E3221F37AC3526B301355982DC7D6563F4240956C9060FE34FD173210D9AB3095BB59242BAC0C345CC5BBC13000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066F7881031111C312C799DBD94BBE5F2F047FF9EE7F6837BB7351D40620E3AB48D5708588546E61FF0E45D31BCA59B5C6FFCA098E2EDCDF03992D9538A58F4D3531A2604E1F568000A9BEF12933CAFDF13EF4C124CF5EFB65306000000000000008B7482AEF4F51DE0969932862FE082CD0DF773EF1D15379B19BC4ABF257B5E6A314507BB7EC858E3272D33FBE2ED1BD4DBA0799411C88A18B2B5276B2802E46236BCD9CEDA1C9108EBD17AFF0AB79A3FCA84D429C59B5EFFD9F5FFFFFFFFFFFFFFD57EA7DE7BA0F34C366F845C79AE8836E366BBDA22B930DEC593B64D4609BC7BEC526272B2E7A6190DD055CFFEA5CF486C75415BF400D268EC73FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD664AD1DF246775B557C34729B21639CAEEE285D0066666486A277688504FD5B53958BB0FA15C8E00D0DA235F67F3B7F10109F6FB63E83A9074104000000000000000000000000000000000000000000000000000000000000000000000000000000ECE70E21B3EE6BAF14AB39D1E97CC2F25867ACBE4D5167207F7B8D4157891B1E4C2CF93085AFB52966C4E0FC18559F007A16BBB6CADAB84467AC4487500900166B67435A50FA3AF13D06E7D44E910AE885C31C999BE48B191451570304FE621B3C8FE8AE8FB16E8DDD3C896D05FFF9368F6F1F8E40BD2DC443CC7B98041D009D61107722B3B0E936785B381CA9D679D2804396AE3247DA38C28BE1F619F509F884C6C5D1BEB0C70BAB4F23A98DE07D7B1D27AB3598440B30259AFAEE4608004B371F471470083D84BCB2B07E3450E4C6C1AC7D30902CA093A97105E8780ABCC89DB7AF12D288CA547522DFA6CDB58C6709369F25288037C9F99D4E3AAC1C00F280477B720CE689EF3E9F0F030A1EAE1B6D802BCF68E4A0E75635A8D8B075326C386C9F3BFDE41965E06C220C5C4D0E4D55218B5226FCC3466A12489358030089A6F26AA30E6994F8848488F98E7D331DF5CFB68BF841C4B8AC942FB3E8D720C02F9402C2C184574E7A6D14643FF183C63F1C1D0C65DB6B340E83C2121002009C1E940607CBA468D350F4F65F520EA3E743EEFA789862C7E4A91F0A7E658045F5ECE08F5421134A54A01D553BB55CBD4BCD69D08E64A868588F2ED3D56E0A0056816248EF91DE24928879B453DC1B5BF2E840E905AF72E660DAE87AA1D33CA356B59C3DA322C1CCFB62E3574CF6A0F2B06B86C7B49624BD6252BC28D3150B00C37752285494760EF55C7C27232434F85DC6316BD669D38CD0E4B36CCAC7251E9553C68CDB4E9C9C031EA90BA533C1E1F50D1EBC31F9B7992C8F29CA586E1300DA21EBB2BC935C4BDFA3C416B66303C59BEBDCC3CC75D6D917D406E67A34CCB44E8FE714845D702BE0897233D30D6AEA9EAE03B4D9F5BFBE8CAA89B3E03A170038F4831545F0AD12A10D0F0BEADCD2D71C91385E30B26E30EA58EC09C891E1FA443CC2719844236922BC5E2E7F5C490924041A9CC8D506D867BFFF6687790F002D8057C557C3DBAD58BBFEFE98CC96DBACF7C054260EA172BFB13D25CFB11ABD07851173A00D29D81884AD552FFC02FF8819958645E2A25846EA348745902300819CC8033305D57C6D408327EAB4D23E23235E55F16A6FE53973E52C67DDEAF1E4630F8EBE1047EF373A78AB30079FEA3A48C07AB9BDF55A4CB935913B5D2000B3A480E6BCA4F8ADB2D91ABDA922C19DAECEEBD47512BB28E02398A7DFA049615F8253473DC058586E427FFF3C8627071808258AB0D4FBFD4F9EBD9EB4FD2100 -smlen = 2216 -sm = D356C219D12993C612B28BB7EB752F9506940099072169EC8B9B60BC863C624537006BA08F0006EB5620732C907A079378924988C0972C120040B45ACDDE46C3B6314AC32620F72E01812E01C3E2ADB82CC7761FC89E7C04527CFF7E292B014833DEA5B4CDC0D4C9D1FF63A8E1B060E2F201EAC44EFD8AC4D511ECBC524B37F18F076644009C5EBA5623BF48810F4025F0345A7F6335B4008FF0D314B0295A5DF5F83224913251BDE5A40017DA628DCCD3BD53D9547AAD0FEE06E80D68000D762956B85012BF9F7BD5B6E2D417D4289A005356EEBA7FEB699682E3A490996E96C4B9E101F6FEF2BB8BF1A5F887B3A3C9EFE63801558701D30D48FC413DD42CC528370042F3A476268A0101936EA6422CB82D477FD5A6181D860760FDC054127C223C1FB40A740191594BEF0702D0E454CBD16072B9BAA9598E60DDADDBE36700DE27C649DB6FADEE5C3B98606809020707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B - -count = 57 -seed = 4E94DD734A371A7C6AD4A567038CF93BAACE2B9D30F3862198DC55D2F21F8FDC9A7AE5DCA1541712179E3AB1FFA3F792 -mlen = 1914 -msg = F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE -pk = 188B48710643B87D27BA4AE9567957A03B0AB418D6A3AD1B62148574574F984A8393242E3FA4BC1CB4AFAD81F9F56BF61DA4A90D1ACB175987D550DC2FE41B0026E1689AEF55B7F175DE0ACE0902DCA07476FC7E030ADB4ACFC212257FCF169D666C52C6762744AD9C3DEA71398AD136015746C7FB80AD28B88623E31E411F00 -sk = 188B48710643B87D27BA4AE9567957A03B0AB418D6A3AD1B62148574574F984A8393242E3FA4BC1CB4AFAD81F9F56BF61DA4A90D1ACB175987D550DC2FE41B0026E1689AEF55B7F175DE0ACE0902DCA07476FC7E030ADB4ACFC212257FCF169D666C52C6762744AD9C3DEA71398AD136015746C7FB80AD28B88623E31E411F000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057BD4DDADE23115C8B743A8C5CDADFE7EF412DEE26BC7B04395C7D3C03478CA8F0350581C246F3FF51E838BCFA8B76F4C4561EC86EF0C3B43520A99ED4159C69039BBADB8C38492DC6D4B0CA25F4A08EBD0728DB8AF92DDE14FFFFFFFFFFFFFFFF14ADEAA650D19FCE2B752385B787768AF0507D9CF9C5BEAEFCEACB3F5BB1CF284D438FE4055086D89B402F774BA852971014629ED7697D30832FAB502A68382D73F29F659B9279CCCF6A80A406C52FBCB3DD48877BB6C74CEEFDFFFFFFFFFFFFFFC0065A486058E054DD14088760DE2FBA9A64970F57F4B40BB65AA6A6C30A1336076A98DA53E63D2C1B49B55480F8CF555D166EC915EB7A5F463C000000000000000000000000000000000000000000000000000000000000000000000000000000EF59D9A57FF336093292E36A20E4FC618F4E4B3312E0517D2A0D7FEBB3B175BDC780C029DA4C92563A8B6E8F4174F5FA2677F502E966C5EBD691040000000000000000000000000000000000000000000000000000000000000000000000000000E8D43A6FD76D8E3FC989B8180F49C2A1DB63743F89869B5BDE965D70F5686B419C8957AF03E0E24AECEA6E3E2A600D0D5D2767A09A7F0C6D5B66B4AB7D261600996BD533E09E1ADD1F8042DBE145B59BCB5C634CABCC8345A5B3E1AC4CEEACE8B88582CA1865571A0880D86928B03E4676AA8198964A25B08400FCB89EAD10004CFFCB7C318D797BB0CF803AE74EFB6E4ABDAFFFC508C95926E4387665A75F138A64AAA1EBC03FE52EF5BAA2D591FF9549D714625CB71B293AC7DFC14B250F00BFE4B9FAFDDE724ABBFA09F7B810B9FA40A0EF4F5A4E07C3B7C7DAC0F2439C2CE7BA44A366A8ED4AE5A5E73BF6704CDBCC36D863848950B57D97F526E0800C00E600BBD71CCE5A4B153A2AB7BC2AA493C86A272DB130E5A673F081C462114E955F278B2DC81BF40B1C95A39B41D82346DD7D9FB001599BFB411E76E99AFB1600AA810C2484ECDF06A81CD1F54921907B494974A7100058D94E46AAE15A9DF221A2A8A2EB61993C69AF168F63BFE674E99B614BDF5CFC13660EE4C510ED6B1C001B2AB87FE60C1B8D76F0451CA00C0E83D7D8248D9D98A190412F889199D0A625EEBE78D8CB5E1DFFFAA4705631249743C1AA8B8163E905062AF943DB7AE61D00429235F3B24F1017B6CBFA05926F172950E58A237F4EDE70E1D29113FD65F17315E5350804E44AC923073595156B769E8BA16695F950530D857495EB387E0700974B73A682DF8464BCDD3037A21F8403911695ADEB3B874BFC8683C56FE8209155DBF04C1D3A0E3C75B4E5C9621F70BCC579407D62DDE0D7E502DF38A31E15009AF349A1B9F6B7A596F177B71B6A1E50C042F2502AB3157D67C8D7040E3296C1F43C8651140452F0649064E0D5F03464780E599FE6361B61572771757E020600688E6E5174BD9A5EB8C07B975A10D5F33904A8842F57417FD4183300788D7961BED56B83C486126C04DA255E0D65E05D1FBFE08DF3B8E049947B2576E7841B00B331A2F73AD5B16B5D8B5D37EF19475DB77F80A296386BCFB7906EB0D817BC3AD6A4A5EFE1AF8D5BF6EB69AD96FED1D7954CA54F300B4CA238DDA87B001F03004CCA81BC1106696E5D7F274F7B306CF3123A5544377D9D3BCAA1017B96A99D9C8D8073FACE14BB6293220AA58C2120FCB28F0FE9CFF639E44EC79245D3621A005240DFB4A1C45CDC51F40FE01A5A89E66E72E359D493DF4C982774AD9C2B0966F259364720BD6B0885D5A1CC108B64C00E1A259F525247E1F68D5684AFE10E00 -smlen = 2249 -sm = C3BC8DD5596A1796B989B741662741F682350098FC094610EB08E0D3A853D786AF4D995F690185B5372EC2B5E86DD6159870CBE73DF54EFD0176E5484FD95342B19DE36FD472730AF063CB019621D68B1D3FF813A4B7B6A135275A0C1A2D0091CA650956C665D32EEB92C896D3A8D765BA00A1B38F07E37E49F05ED6C0E67AA7313EA4790181B62954FBFA94B4A84F6154EE6610BCBC0301B0DB67460E3A4A663A4C4D61C46D9902FB0800C54EB71A3B3430234553B5F1E828A840374900EEB6ACFF51B770971CDDD07A5E1FD4282B0401044E982FCD12B98BFDCDF237EFB64D63C5B200C2362DF67565441F5C70F4D2D7DB8742748D0058E02273FCD263103E7AD7F70F065037271B000119AD4A404214BF2E99FFE470D1CB4B61D05A792C6DA58628AD3EE3E1BB02869E03021821F128611B3DA641DAEBCB6C98DC9AE12701F90732785DD35B2D7E235E3C208801F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE - -count = 58 -seed = D9281003AC5F7673E0E9A7BC29C4ED75E6B0F228DF49D11A2599BFF2DA9E887163BB26DBA4F071FBCE02891540EC6F1C -mlen = 1947 -msg = 437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF -pk = F054FA9E146BEDC60CE3D70DA25016EE59D985F76C9487D7C166E12B3014E4DB385DD882FB38168A6F0AEB977DDAAE12497A07F40B4CFA422591C9B7C8422000D362EA742C9F641ED634530C2B51BD03B013E448BB2AC5D84038FA442E3B22D6082341D07B65EF0AA013A6049F600295E570D32AC038C69A8F456CAA69460E00 -sk = F054FA9E146BEDC60CE3D70DA25016EE59D985F76C9487D7C166E12B3014E4DB385DD882FB38168A6F0AEB977DDAAE12497A07F40B4CFA422591C9B7C8422000D362EA742C9F641ED634530C2B51BD03B013E448BB2AC5D84038FA442E3B22D6082341D07B65EF0AA013A6049F600295E570D32AC038C69A8F456CAA69460E0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCD6595B81F53D1C10D80E7B45B47846941FB130E9206AF988135E7258E663C337AFB8053B2A6EF75154DF47FF400B481498A5E1880929EC4DEF731C7F8E355D24FE03ACE43F8183E1809508D2007DD9A210CCA73495478CBF010000000000000011540EC44AA211F617A3540CA7B30DA4317DED2576C06B0D0674BF24A017FB4F3BF7219492D10E984F8877AFAE064E31C7D381AC546389B2D7E4D55C470A6A7C1AFCA2221ADDE1DD801D38E01728F947A9C11B38486E22FDBEFDFFFFFFFFFFFFFF2F07E12EF6694352A3A819B9D39D71E0CD9AF13B4562DEEA6A704A465E952BCA2067D6C9C9FD3C6820991C71958BF15A63FA87A225041AD6DD4FFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CCF6B485A1F0958B82A5EBDBA64A863EB8802EE267ED934F6D97E1428BCA6C46B8EF1469BCF04826867A2FB5DD09FAA5E78EB90C6507EC2CA6A0300000000000000000000000000000000000000000000000000000000000000000000000000008C53A49E49A256F7D1E84B50CEF805D919156A9E7FB51881501EEAA5049F1F9ED3975944762352202CA9D9B8F25BF89B924ABA597F0824D4B22A1E2E45881A00957E197C5437B7D7355D7A78DA02444C05FFE130EA856858EB67B59B6C3DADF2C4AA6D8E5E8CD9C94DB09F26AF3F3E40061C18E510BF364EFD3321BE24701100B61B1F5F171340E592B398306E4600648B70F17445BEDD1FEFF44869BB1AD1BD67A2C5D0DB6F49AFD3E5944196ED511F09F8ED3A102968A93BDDF64C4EE810005456B9D89B49BDEBFA8930DD9D9B8BFA7CE5423CAEFBDFED216A26C6BAAA56CBC929A30FD7C60BBBC05CB21E38C1B87A871324835096DB12F69A97E973C513000BC2BFE1444D3DDFFE84E916E04A3FEE7AF8654E581E8FC0743CE0241379BEFF30A7A26943B081A19C4D114515619E8DACDBD4B327BA11C61D99D2D6334B070098021A2404675FE529A9C980A377693CF4824C46C56EF3BC2BB7C4E71E0F126F2E1D1D84045DFC265086EAF93E753DFFF113DA33D9D2122683D033D7FB9C0300E594BAF8311656B7527177680B3F3E0D1E6E4245825A9559D79292918AAC6F70E1CD0129D52B134C745FD691793F2886B0AB996A91790E5FCE7873486AB50B00E2D6FEEA19CBD848095FD7289439A8C6455455EE3670F815FB5C5D3663422C9393548F91786976CA1C4A1F16B8480290510525594D91AB5CC1C11A1B92851000DC61D2B9A43FC6186402916C53F6985231A394A4CCAAA4A76AA3B86FA59667CC4C75B9253633BF1346B14423FE0E2EBAE65FD63DDA00301BF949D42AB6A2180026E5E0BCF3171E6DF87C037405505DEB64F2A5D3B14B3F753D0880EA409993132A5A008D2CEDC3B296D434BC96CEFC6FB87EEA73421AEA2FCA2F4B074AF40D00DD6D1A754F96E69E1E70723EECEE2F387E1CE8AE99F6948E3E4E0385507E09A39D8E83F353A208681E5AE4CA8FB048A2D984F3DE5BE48719F2A075AB26DC1D00DE8C8F26A7A0F646C715505F935536DC2BD057196D1FB72ABC229769D33CE4572BBEA720FA0479EF78EA84FA59F070862B8A504CD28DF82FB6D07C539C5D0600A0EE57F452FCDCE51CE5FAA31AF297940F846D7C544D7C6E403B4143C92D6F095CF574A64FAF8C306074F8EF9BB3F5C60E3A62B4185D38BB42DCCFBB4DBB2000480AA014B0FA5CD040D7A13E759B36810CBA38AB791D1F63FFF3A2E79579D0219F6AC91B7BB7BF397347BA2E1A30FBC6B41867943C01476A27C3C77C33B91000 -smlen = 2282 -sm = E2192C5700B47534B9F50050FFB5B2B6955500D89A6D62B68B7D99B86A059A616119F1DFA9006B9ADDABDE30A3C4E40E095B1A7340331D8800BB2A5C40858059EC43A97419B0C1A0B01606003A32DDA5585FCA3B45AB65310A6F1435678101ADC40C1C237C4CFD98B4D2F865A6F41AA7F8018F970BC2320CE5C4A3AAE5935C09D8A15DB901C7702CB17EE719581112A1BD1491B04E650F01209A50968B477DE538761608F1169DF04877005B8228741FC895055E3E9B9AE25895F200350157ED0B7DDE4867A28D8FF8EA1C124A79460D0194E2CE6A2C015681435584C84C79CC3CA8C8008890475E46E41D7BFD7AEB51EB2286CFD8860029939E0C39C9187CA8B1CE0FE691E6C2A71301000520CD3AACA7463150D5EF5DA7717A97808498329EEA6597AD8E15C23537B9FD030327CBF085208E01F6F13EF1AB50FE72660EAA0002A2F0E793EA10F62D3B7B115DCE00437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF - -count = 59 -seed = 750A74866BE8DF4E60BC14BF36E6D83ABF6DCBB86792D125CF0980007C5435F40F87BA96498A88252D9C5C6710807652 -mlen = 1980 -msg = E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF -pk = 6DD692D98F6CF7528765591AB1E486C95D9A932CA23561538BBAF8CA2A36C552D602B564CD98B8E08A9B110FA9FC90A2C12BB1ED8CF5D1798BC88F9E203802001292889586EBE9F094D1623F5BD889BE174CE2F68B69746F2EBB2321F9F7B4A946710B75989D0121A6DE898ACEB88D6B6AC0967C8A2DC94268DF26BDBA350600 -sk = 6DD692D98F6CF7528765591AB1E486C95D9A932CA23561538BBAF8CA2A36C552D602B564CD98B8E08A9B110FA9FC90A2C12BB1ED8CF5D1798BC88F9E203802001292889586EBE9F094D1623F5BD889BE174CE2F68B69746F2EBB2321F9F7B4A946710B75989D0121A6DE898ACEB88D6B6AC0967C8A2DC94268DF26BDBA35060002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000951508536230B599CD8439AA187629ED75B6EDBDEE482C8A5682A01E99B4370D62E2711A393D75F90E83C90859E842EFBD0E892A0DCA27C141EE3D508091F8233DC06BCD2C43D5D375D5BF1206E303E15969C237A125968BDB1300000000000000D44F4DF59F1C30D085C37330CB5917C9B59B456D4B0E7AED6406A676236A113AE59EF68CD00F5AEDB604F1ACC18564F847065899F3051A4EEB629B115BE67D7B7C7DA4163CC9717B743D081518D8B3A08686C695CABEC2CD7AF2FFFFFFFFFFFFFF5C7A81737013FCD62D1A514A95B143A5BC537B841535D6081E7DF593F2382344D1221D37628F392195E1B3F96FBB65980FBFE3E49A8A70ED5B040100000000000000000000000000000000000000000000000000000000000000000000000000002BB4D50DCEE1530AC5F1F684BF34DDE1BB54B23A0E7C270497C0B7F550A9647F14FEE36F45F14BBD316CA74213656B439B69AF3D92E3673DDA19030000000000000000000000000000000000000000000000000000000000000000000000000000F8FE83F629CAF9938532A3C433452F91663D92034AFB15951D4106A9049D7EC7A4FEA188E1368C1EBCB7F2A014C0155B17283AD1C9035B701657DD83AEC40E00C1DCDFF4F19700DBA701BB5755756BBAD76CA648077B78198764E24796B3EC194FBB7058A66F263F3C6A0EC229085D0A13BB102401467AECB6F195B7BBC11800B121590D090CAA343E33A60EAB19F2A423E3A232E2A3D27E757F4BD18C9DE86D8AFE1922D6DA144F690DB7F8549A74539DB6744534C7BE5F249B3AED85260D00CDB5C70C4B07C329BD9B3BB79187B0140C33DC2A2539CFD8FE826CA91A05DCA64E86895DD791796F0FD0AC49C72F7DDBBD3D0EFD0225D24B1D49CC89AACB1C00B6E642920FE501CE8CB1DBB9BCDB7932DE2605B3225D8091A78CDDB20B233586A71BB622F2E24A560ABDE627949C5D7E9D352EB8EAA30E20F2A24F3AD4A01300405A96B230754F43B338FEC5B395665A8C6B49DD5494AE4DA015A67755FA3EDC1E51359ACB65CA1F2259E67F6D3C1D4FAD569BE5B4C1B1F876B588518B3D010026099FD2330EF392F49C28A431DB08A5A04AC20550724500D29C678BFCC180E2D077B2F378F4A56581694A2A2C44629AAF73E94853DC0C45EA69D65A3A8424007B5228031F756848B2E3BD30B967F0A65A83C728DB94DFAFA8DD24DB84EC584BCEAA3954D3EC56B274C363F1D442ADD022A35D58C1FDB9570EE2216FDB410600F5915C584BED71E0EF93D6FF5D294F894F6EDFAEE1A32C293395169EA819385EB4A377F0D72FF97D404C097818E9876087F3B43B62D44382B25105DF8B1711001C68B8D25FFB3E007EC0D755A29DFC0A2FFE9F2EE5910C9789F5BB6FE713DD56712ED1E200726C018FC5DDE27A7F50B63743F737F093020970E874D390B1110041336B0CB085E4E36E2B206C80A1A5254A04C77D98B4A00ED8C2C799A211E909D5859FC2FB0F66C2D9DD5B9FBBDB278F3A2CB0BCD195CC42AF3F946ABC8112006CDC8B83C8A4187B74C5ABC90BB749352F6CB1B142C8322EE020CA823156F3A413774B611FF838FBED14F8DA099CFCC8073000256DDF9E60672CE7F7BD250500142CE4204558AE1930F29058EC38B737B7ADFD08BB47DC66557F564B2F93924B2144A15233885BF80FC78B98F0DE533A9E5ED2AE0DB06B9B6D539D2B74DF2000A171F90C3DEBD6142C47563068F0EB43343D952F8951A7BE3E0FBF59CDAF1C778726FF7F3F32CE88E762779968574C3585501A14E2C0426E3741415BE7391D00 -smlen = 2315 -sm = EE5482E4C409BCD582BF5240F74E7B9777FA013ECAF0DBCDC657C1E4EB6B2D388BD4B4A104015AC95C6A52C66A69FF96B827D1EE7F98A6390101165CA45D992EE583DAD5C57EBB2B18497000C5BB5D9EE826F4551300E0A0CE2FE4C7DF7701C0B115A3AED53B847E383AC86895F99F6412000D407805C2FD7F6F1144C72F74CDE53DA7B001E99E5874618486E1E3BFD3BD567B7AB7136D0014BE36DE20449C02D25439C9801B670379F50018B9F0193AE8BF41E3795D3E523318DC935C014BFFD14473DF34AB3936797C23E615C4E78700749D0880B92B6FB6C7A481EC1A5BE15834A80136C326577EB770CFE0FCC4960C55985741D3009522BFE010865E511A7FA4F330FAA3829DE701012BF95C603F13C0391AA4B4BA20120D0AE89D20FC4DEE1D6A5F16FDE07F5D4B810802F2EA30807C00C8F6CB8A9E96FBAAA5811F8401101153F41BF23969E1993BF1295702E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF - -count = 60 -seed = A832D4AAE8076C4EFE8319A74CE315928AB765BB629075254CBC63EAAE691C220F4B5E1839E9A99D8747AACD7C2F1EE3 -mlen = 2013 -msg = 84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 -pk = 1DC3B0AF072A2B7537F0050AF9A4353DABA82DF1A370545242DBBF5919250750CC6709402109FAD5BD9D008F8DFE382468605941C39630A59E71ED7BB2281000DDDBDEBC1D2DEC7B65C7D33E8ED6348E7806E06778992E9E869DE34C96884EA906FF5A1C611464B0653CF43FD7B847F2A50B143F875501881922C263D9881700 -sk = 1DC3B0AF072A2B7537F0050AF9A4353DABA82DF1A370545242DBBF5919250750CC6709402109FAD5BD9D008F8DFE382468605941C39630A59E71ED7BB2281000DDDBDEBC1D2DEC7B65C7D33E8ED6348E7806E06778992E9E869DE34C96884EA906FF5A1C611464B0653CF43FD7B847F2A50B143F875501881922C263D98817000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019F6E848B421548882A9C919C34BD0783E101FFA42F59320746923EB6CB5236D37383540F4CFDFE30F22431D15BC99C0233E3C9D162C302076693502BDB9FA45DC46726BC1A16807402EA8C02F89EEB4E5BFDEEDF6B6EF477EF6FFFFFFFFFFFFFFC2282D90FDC7EA63DADC6E73D5DA6BBDA009B43EDED8D18ECD4A185D5250475DC1FD7FBDF4D6A0DC3F8090A7BEAAA00CA8D97536DCA103D02EF99B64C82B2D9072B870A06FEEEE9A51EBEDD090045E2650E5DB06C425AA3569E7FFFFFFFFFFFFFF364E57F30F137CC51344FB8197BE2CD110A8A1EFC89EC8A8DA9ED4704711923CA36DBB55F46CF9A8BE6E049A5787E4C488B50251D00586038D5801000000000000000000000000000000000000000000000000000000000000000000000000000017CAD67701F7993449CB3AA689353F91411D4F5EFC15F940EC15B44A6029B85AE688068B99D26A4AA8A5DA5941276C53F8928EBF82D7D542845100000000000000000000000000000000000000000000000000000000000000000000000000000040C6FD27A194D97C725AB1B2099DD02E98C60DC71486B46B3492193D6920F5397625ADC1CB38C95525BEB48B02BCFC4676D73F117A60725834B9C587B89E0E00D6A4D963111C8B7D8F8695746A71009EF882360EE0B547FB445C1D00BD13F25317F99FB999D08D3D53BFB23D71FFC66D37A37703FECF1F5AD5D2BB1DC7600D0067D8DFD7F8693B43FE079B080AC4F9122279336E3E09F3067F5FB900578C8689F2B9E7A25F1318AAEB0B95E3CD08A625D9206910CC2514732110A6B0271C17003FC6AEC8FA1C8E6931DC041B0AEA1C7FF620E99B968D7F34966020C6847785DCCA8C91B0CF33737822E38008E2B26F5B0358BBCF35FF1E194F7FFDCDA8E109001065CF4149EDD0C4EC4D323B5101D89951D94C8FF86D792FF07D8D636511BF17532509CD9FB48C724C06BD8FEA00B7BA3DFA37BDBF9AE72E46BA91FC4ECF19001BF4AAEB4CAA019F4B4CECE3B3279FF6B9AB83A8A8668A1DFEB9F244E51E3498E4B660BD4FFF0A5339F4E7E136DD6F930EF381511EAA28F99D1D6171C7721B00639BD57E1EBFAF8BAEEC3BBA730042B388EC5EED0C58E3583005C4AA061E41D23C4EAED9CAFF0D540B92FE8022BB841FECACAE093DEAA56FE00FA7811C692300D062565DC506ED0D1F775E04A899DC34D0397DD1707692F06BBCF2248EFC0B70530A588BD34637D8B339378EDF943403DD86D3D70DCED5317A3E70A7534E01006D9812FBE28CA9F01D4616C641978D3B2085C01D177D5CAED31CD6204263FDB44661CD414EC3A8331703367372325FFB3B87F2A58C6E8EEAE47E600D0D301100E76E106FDF3E7489B5C02BB6D314A42B7B5792018AFA10AEC0F57C4429B94A57109E3486AFF9C7E4ACEF9A86B738C7DB43CED0ADB27E5452FED52A8BA2A92000AA3B18A891D90FB53E0350F7A02805A8B747812A2B85484E9138967486D47FC3259F3E67B0171A2FEA655CEC59CADC887135060D41113FE79B19B44423AF22006F58C94A92E6CF147FE0A47BD6545B341243BA9598B415A273C1C954F7EA0EE745BFE5814F90D9EBF416C338A0C6B50DF2BDFD26D6625A88D69A3E2263AC0700BFBD3538B005F01CBF5BB698D6411BB8D8787ED36B8982F0769F90128DF76966C536307EE88D509B0D0AE0211DDC6BC8013ECC9DC0F47B1BD0E54390DAD21500D7E5516570B451DBD2290E53D905B511EE0ADF0F9D2D108C594D89B38AB84317F7A10648D6CE4C1046EFD1252BBCC4C67BC4282E3F81AC9E0E552AC6E7372500 -smlen = 2348 -sm = 1271FFA06A33B31C1A2142DC91A3992E506900BF979C5F73D6E7877489F14128BF086CDFC801C80CC76CD2B16412DAD1CE0EDAD1F5E572B7013DAA7E06DD0CB6C4436C941939915136DC7C00345C293709FFBA4BDFCE122A71F0874E9E51014002DC08B5A766AD3C96E1852563D405F64101FC8C9FBF84C7F77DD2F8105DC4EAA16395880155929D5E4AA56669022B5BE7F9F57A255BCB0178F018CC17223C9EF8F49C703FBEC34721D101E18A125DE49CB2A8EF618A0236F88DECCC2D00EB8E752A1A4E8D8105D29981215129796A4500D76BB6D43312059FFE576F1ECD1F868A4B27012CE473AA7E3C07F2CFE51C191D4E45E899FA002BCB319752734E59DC4346F2DE6E1D082C96010059A7B4B21B2E83B07A7F489494E39C7D6E06F7CC9708CC67ADE0A1CF830D48BB01008C80ABD57C967A53B5C99917D1385BC7A0E8012C70D1C487AE4248B71B9CB18F610384C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 - -count = 61 -seed = 09B8441F47235EFC82D71933A0037FA4F69124C3BAD4EF6A3A7178B417A3FDA874081B7EEFD7EF1BF234C752458FBBAD -mlen = 2046 -msg = 92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B -pk = E34370A65C54BBB75DB1809EB8FDA4D074C2EC831B71C5E60C3E0CDB6B1627250ED7CCC951F1048BF0F93B0670844DB6AC20760058670D962A6ECD5C4FDD0300244EDA86F2429C887963C6B8B3445114C53F48CA5EFFED8E812640328830280A1D663AFDCCB785E516B4BD05F77ED6230C674C7C6E04159BD850F87EC3571300 -sk = E34370A65C54BBB75DB1809EB8FDA4D074C2EC831B71C5E60C3E0CDB6B1627250ED7CCC951F1048BF0F93B0670844DB6AC20760058670D962A6ECD5C4FDD0300244EDA86F2429C887963C6B8B3445114C53F48CA5EFFED8E812640328830280A1D663AFDCCB785E516B4BD05F77ED6230C674C7C6E04159BD850F87EC357130002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CD60D34E82F394237B886888776418A4CC347BFC8E622C381C6142402C55731B30D67F3AFDA1F1AF58ACF5D87C5727EE0869A57F639FEE33771B11827CD7479946287E73C99E6282C5EE3C0265A192B62DE97D3ACFA4977CAF04000000000000008C21498FD4C91A5A02562C42249DD21BEDCDA979C202DCB4FD1ABE7958B9F13A0470CA475D38E5296360C2B36D813F506BF07907E563025A05B6A6ACA8E62090F7DE48B178022A79B527C0FAE6EC9320154A6B54E2A450DA84ECFFFFFFFFFFFFFFC8E4AFB146B19E77DFEAC482E4A9960CDFFB81600BDAC768F216BE48DF382F329A84BC1FB5F8EA0906536E9FF9C0BD9364F4715FEA8A421E50B6FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B22A72A242E81294EDB7B88366D77A84C0773929578F3BC458BCAD53F5E874B3839069D9BB169F145C35D3AEB3CACF535C064086D6AB1F8FEBF010000000000000000000000000000000000000000000000000000000000000000000000000000991EC14CB81DDB0BCECB58AE04BAE9AEF02B327BDF1D3D4EB17E7A0BBCA742B11C007290853C99F736A43B814A95681AB3D96E8B5837725F582325A92DE80A00F64C6E4F984A467E5A72B4E853B13E44843A13D6C7783C825F97E70137B71958CAA35E7812B73EE3F0F9C50155000290A23DB2928F7A46D360B06F5148D824004DA49E0FC654B65B545CDD028EA777D2D02E9C3B7FB76E54C9C8A41EB855A521D6EEBE97B8E6329505E3B196B166D24DB457469F0501DB9CB94E3A62525016006965BEBF89C834CAE67A13A55091877177A0678F9843C78DF58AF7F54CCFAAFA4BBFFCA47842295574513576B1B5DD7C041CC52FF071E817158458378D0514004B96958C1EE92EE50C870FBB9342F8BFC4A424149F0644E39D5BE69EEE2EFBBB646A5AC7561F46A968E856D53734CF5FB437C8EE11D05747DBC1E4103A451A006BB4D8B1D23836E79CAAFD9199BB79C5BDFF3C0A22C3DE798CEA4AF606E132C4B7B027D9F2B7999D1EF10C76D95FCBAF087F39432694ED84A5D2D80008170800086571FC96CE74866FCAF991DD061F06F8B2D9500447E5B3B00C719DA6245007D6BE03D6A759885233DADB2AE83CD028A1C3D42A316C4166461C4F8B38610C0022A6FEBFE97808DCF16CAB9D2D477157DF3C25E885E4F17A9F58E771308F3C7C2B15064221B0BBE2E003852E68722B1936D7CDCD4BF16A3728CD6354BC8E1F0091D1BD47D8D574673B9B4F3192D84FB5D64507AC4F0CDA3EC841E95AD08926968C89036C5D64487B384179806EED6CD07444EDB95CDE3DCF74B36267EF2A1F00146188BF3C9458B9F0A449108D3024D259CBD2AE35243664EB3593E3DC9283E1121969AF7CE885AF015045604DF448736909BB9628FAE1F22CE33712CCAC1900E50E15E2B37B464ACC213293B390D41CB18E80FBFA6438510F3BF87550DB4AB4292303CE48A1EEF8BB3812AE07AE48FFE8714BAD9FE9E4ABA7C7EB47663D18005336C3DE52F994487CF90745AA65C8BBC34A0E9FAEA854477A2370F1963242465D50B2166044027CDF973C482635DA5229457F876CDA45128B82A14636E817003E442EDAD9138F353ADC29889B59D7711A88F0B9E0B02B54FEA3072B29BA0EB3511159F82B17F0B642DBA80D5E220D2E0602C53BBA8376EC830F2F24C23C1600EB53FE9296B5B22B39C59EF75B7A771E84523071751D5806C13B67841DCFB91D39C024CD5028E21D8FA017C5C82A462561DF11FAF32C4F534EB3259001521D00 -smlen = 2381 -sm = 449EBF0841847F017A3380F5CC1B25FAFAA20014EDD5842896E823C14B8DEA39A6416B2AA701D02798AD890168508464F960B95C48CF29EB01F56D1A9D97A26F6900637F2E71EC640D6E5F01A48D2B0405AEDF89D5DA73A9FE8B8DADC69600828D3FDB63DD51C39393CF6606B87C65824701C5D5B6DA89E6F248D5DC1CCF6D5618BB47C400FD6611F6AB2C768C290CDEEF4B4917AF51D701118D71EB7D3D7524B3E0EB9C380F3B6A3D2F0173A9A3723C5563D5256C5ADFAE407046915201DF58A7180ACC189F33FD0E7ABB602C60AFA301B7A01BB6470AC8A37C9C304B647623DAB85A010C054E94605C116FE35988522DA8F934EBD701047B7858973EBE1C2F95A0662F4A77A18665000103D06AFE1BDE80F1B1D43870C7025F97624759B6D883B307F7191B467D3FC42A03025205EF2FD29AA2C983521B9F3AE7401899BC012E1CE93413769780E98569B22FD90092D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B - -count = 62 -seed = D2629CEEAE5C95D3C34C1FFCC2338B4A97782BDFCD39111E18540B69DB035B352D012857111F816F03550BFE5F56ABEE -mlen = 2079 -msg = 7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 -pk = DFA1BDA5513F4156D00EE88F569BBA05125779A3625ED6E0BE3BA7A17973903981BCC4577D905EBBC55B7A90DC2F650EEACF5A74606DD49E06A6FF08EEC21300834B7160380A07B0571B65AA5859FD70FB7B2F727CFB3B9B0397E0E7AAA07648436B6A4A281ED5ED221D633DF4623092D535481269239AF0975F117FC4E52200 -sk = DFA1BDA5513F4156D00EE88F569BBA05125779A3625ED6E0BE3BA7A17973903981BCC4577D905EBBC55B7A90DC2F650EEACF5A74606DD49E06A6FF08EEC21300834B7160380A07B0571B65AA5859FD70FB7B2F727CFB3B9B0397E0E7AAA07648436B6A4A281ED5ED221D633DF4623092D535481269239AF0975F117FC4E522000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006B099B0A5E7F428D37EEDA26F49D49DFCABC130AA62DAC94A9D68D113D521D45EF418A5A21020BD04B0CE113BCD42D9130FEF46D91B5710F680CC5FFEF49150B82CBF94A097372A060B85D2CD37ADF8DAF542B0ECCA6DEDF90C00000000000000017E9CB99ABD7CC7E644F9A6A0A7FF1A100E9BEA08FC91AA69F50FC730A516AD06FD9AF9DC8465841E83FF3A5E580124652E229285E282804042907F17AEB4825E2046EAD810A15F712CF2819E2467D22FC77DF933C59244DFEAFFFFFFFFFFFFFFC17C4F06FD22FEFEE9E3C89B0D3F906B40E4105C80F0CD6A1803703A1682672F434EEC2FCB58A91431D3437001031932EFB44C82D488D998A2D6FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A9C6E39E1EA0EC5C9DE9B19CA16B2F09FFDBF0FB8D925665F3CFDC7523A3BA3A19165A36A13F61A935FFDCDBBF7E7BFCF1D80CF23712779147500000000000000000000000000000000000000000000000000000000000000000000000000000058D60BDB6BC1C29AD20CEEF0DA48E1EC0D964AD745A79AB5ED8210FF62EFF1744F682B104467482F54BC8F9D159D8C440F9450551617D50B97E2404598F81A00ACD6B5F3CBAE008A8E76F9657AA7793B02C784529FE8A1CB3241EC8EDAC41A9E758C44CC9784B8183B275CDAFDF04722192449B9C8B3913B8CE85288CEE7150056045D3FD7652FB0813976E2801DFDB5FC437D76BD2FCA9D3E1F6BC138D3B0072E7F14B17B8DB808EE1FD9BEC22744E28527361FEA6D3DDB70342D8D751C080086926448C02A37167D0A7F2466D024DFD766BFAA97877F04AA2523AB2EC159F16A657E1CCC99B10E8335C45E9C6915CB7828E0A52EF53A9C25D0324D9E820E00CEAAB96A4C65F98306343794A84FF142F2B39CB3154F3C164D5361CAE1C766B5973B99BB125774ED88726DE112D2AE8E36588E787CAFBEF43DA9228A569B04001C49D700F51CA53A4A401A0230BBA72CF17E7EF87C8A74CF2C42066F9FA0E14E2549BEB655224056E158843E41DFC94E6F412EE0CDDAA5E35EA6F5F19CD321008BA3A5EBEDA0B6824929474A0C3843EA12DF20A932C7F126F24DE06E6095F3BA4448F2521004A06D16FEBD0DFA96586B45A65CE0FDD730F02C5A862C62E513003A7D7E40E502E3475BB58BD644A4E5F3D477C1338DC16EB4637161F14F5B35C608A1E6DC66F489FEB0C1AFF0CEC4404A1AE0571395178E1E9A8ED20C8EB50500B00EE56FE69C899133EE1A5943354712DEBFE67911A5EE6A26631ADCA3565E2F6C7110AACA9E8DFD311AA0FAD413FB104F4262586C18413BC0EC8FEC5D270600CB3CAC1339570605F41A91DBC76FF6BB87026F1BEFE87D4AF1FA83878B3157C9D0DB6EA56AF6C6324E6D0BC1121E2C7D2B9B9F354F31CCC039912A00D68820003C2508C3C27BC9E5BB2C57A6042E2AB94B2DF8F7896A882697DF285EA059FE5C50791187D195B4D9507324F6AEB105E7E5C3A5D254E8FED2E92468D886EF08001020F43C1FE165713B9DBECFD3BB8D9767B79AE9A9D969212BDEF9CCB97E8BD7505B5C1BC08353133683F2EBEA73EA25F107474DF394D5CBA492B8011EC606009CE72A84A33A87E4C4EF1F437B36E52AF1F6F2009B9836E614E0CAC72028000B48C2ADDFA564A86137ACDDB89AD855AC8073BACD1B700ACDD5D73D6C739E01005BB0F9D17E0DDF458C8D3E18D9A13FB94570E9ADD74EC282439892E9F70FC050E39E37E5CB0D93B04919EC2F688474747B74CA96C8C97D9EEDE04E996BA71D00 -smlen = 2414 -sm = 8E5BC83A768BB3B79730F74B3AF79FEC7420017625CBA8824F7F9F9428D1B22701D6AA6132009258C747D068A1942B79BDFE25972073EE0A01A2EE31CD7293F729C1C7CDBBFD080E7F43DC002A66B27320434D3E75691F9AE8349A02622600591E377503C00E13BA075E96AC5A5CA3CE4A00D3017EB845F266EFB859E683374D6E39B4A101C8232FDA6E640230F07F648F6755F61A61AD013B4B4CF4C88B3E3E8EAD2553F0EAED761C9F007A79D511760DFE526ECA33D21A72E2D01F2F00489291CF44B271A5FAF76BE26A11549E5E7C011599C4D5952CF3B2266AAB3C54E49428F2B201242A707E0059496791C9248FD5B624C182E60040393DFB426623BF1215435470A4ADA4BB680000A3344CE904403401A56CC6F23818A6E75C2E323A9CADDBF1A3A09F96E891DB9E0603455EA1ECFCB743516CB172FB09708DA5801E00F398C50C7FE2A7FCF2BDE9F5AD79007F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 - -count = 63 -seed = EAA4FB8EF0290A499A1D92EE398A8D7E71CD3CBF01A36750DA4B7EFF175DA26D17AC4ECE49A84C88D1D2C2493563C26D -mlen = 2112 -msg = 2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 -pk = 3E9DB72094094B0307C38E733621BFA7D8DF20644ECEC2EB86C89385239DDE53C8B3E274AC9D3170B8288B47F313A4F0C28002027DB26B6487CBE8E9BADD1E00E276E59CA9E38C609E337F83A3994731190D0650B5E459E7A5F98439A48E68275CE6B2C377514983B339F4C02294122DFFCDE469404ED9A1270DC1D328791000 -sk = 3E9DB72094094B0307C38E733621BFA7D8DF20644ECEC2EB86C89385239DDE53C8B3E274AC9D3170B8288B47F313A4F0C28002027DB26B6487CBE8E9BADD1E00E276E59CA9E38C609E337F83A3994731190D0650B5E459E7A5F98439A48E68275CE6B2C377514983B339F4C02294122DFFCDE469404ED9A1270DC1D3287910000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072B6A0ADFAC74FE36D82AD406D89159CCAD3EF3CA9E342776BFF471670E5AF591BC73B9A356DF819AEFD63D52D0C0A7DA3B42872E9E0AE64F8DAD746983601BDBF9F47CF635AA175079029096A8EA2682F4E85C559F05EDCF107000000000000000938AB314178242B12EF17543BA45FE2B9B30EC80879A3EA4A0CE54B8E34718F12877BE6AB918DBA931BB918002513B7AA2E238563AC13C0161BB1C2550B4A0FB2E6D9241C29CCD2C36EB61CF1F8E0EDD284D3158092C2A813FBFFFFFFFFFFFFFF47C5153A2E0A5511CE780852795A352607D412F7C0D2E1F4CB963D6D07B264364D9DBC4E6F3A3813BBCC29C55EC92E3D9FD559C4C12D5ED809A1FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF77D6C6A6C77A0513F0AAA4651049F67FC8D771B38D8D474CD09397FE01A360C0C589043CB2597F65DDD28DA978FE70C9311ED7FFD25DF411002000000000000000000000000000000000000000000000000000000000000000000000000000057A11344528E44F1413C08F565CE60AA52384EFE00E3B074F94FAB7DDF2098AB8E7F5DC2A2E9B825410BF19F8CE19A252CAF663AF0B74A0406A048B53D8F0E006EDD789340115468F48310025155902DC402D7E2E207F72209A5B575D699CAC8530D52174183AF4EB26252DAE8F5018A8673921898FB8CE5B63A7F5B6EE50900DD31553C177E507A48A3DF2DAF2A54FA6F07D762D7832DF040BD46C9081B0E643FEFFEF0B005289862B551E2A2D34AE6D39E192FD38648C759D0BAFA436F1D004A8459ECE5EB71C78B00C1ADA5FDA56D21EB9FD0EF833D6A801CAD9535DB7E7696FAA26CBFE4B257E726DC22E1379DDDF81CF1EE42ADAB77A43ABEE6914E0100C0183EAB8D9AB49034AEEE7C7B12E11EB248BA5CB129512E2A8E2A2F2BF13903CC3E4121BB0C2AEB9345D46BF1A973516AB9EE6F3F00827A89ED84641598170062925519DF2D629A1CD0C9BDBA7E937C76F8EA37233A0D28A9231CFB5CFEC482FA71C7D00B49127E4A4153DC13BB85E65324E8BDA036E3064968B1C34C660000AAACD79FA270F9C25A2C44E49CCED6E86156659FF570F4EE6B0FA50B97A5B60950B77FB57538494C9742D278F4FCDA681E3FAF94285C04E1F71B72929AEA1100A31E394BC458D337C8B379B44F47A009D1D6D4E65D08673AA1C4C43D0122B79A46C4E4637F24DDEB0E9857B39CB454B1302AF660A6861AA3C3285D079324210077B8F49CF217751B58A768468C8DAF109E28461055469D923DDDF7596E7AE671C1F3CF0826008AC6629D1D1D1188BDA09AF42D098E65007BB32E1ECD31381600AEA38820AD10385B1EA3B76E938F71C2D7CD469FEC9C3BA6AAA5A9B3A47E81E0081686D227A829CF9CF24BB411CD37366C29622E567A39B45D90E00FEF1F0E00EB9606F58FFD8E88C77A8DA91C3B07E1A89000E674ACC10D688CB870306C2E8EE010A0A5537224EF6CAA96E74FB60411D9E9853D4A48EB753CCB1A4031ED0D00E4F01796E71C3AACE861660E144EE6BE6A8B410710AFDDC5661A68B8BC8AB22A8F4CA9DAED742D86BB86A8363E85ED542A2589110301EEA6F7DD8328CD11180083D468F86AF90E56A909D73A5532913108A7D5552DE9B55328301738910281D0C1EBD65FE579E83C6C1AA06E4C79274CC21955855FAAD9B6FBFF98ACB8621C00DE80FD743653DA928D426F439641862F000376F81E1E31C2DBB0C1D5E0ED410B72B4C20CA83D379F73819E6D19DA594C600E1A0E0CB206D54B326169C5EC0C00 -smlen = 2447 -sm = DB59FEB80FAAE0F0971EB39B0976C725DF1200C15B9B0E94D789913B397F7828A9EB46509601C1733334A3F9497409251EC7584A419E47C1011285AEEA622752F756ECF1D5A8724B1CA3A501893C4EDFC66E7A9307EA74DA11DB786C04EC0067E24D3858CC3AA376F1FF24B77BC207A46C00C1C1DE0FE3E6858C223CDCAD554241424D4C008F6985907CA8A5B73C07CA6B39D6CDDE2F770081FD04AFAE260A98D19090A9D566423A54F4015173FEB786660C615BEB3809A31CA492377F01BEE6ECDA019649B5E05AFC18A724CA567B3800E4A8B527D244C1893453B4F01E10266609A10072CAB8C0DFA3FDC47209C808E3146D5624D300F8606106ADF2E89BBAA3A2797C91531BB18700017D85B80D1D88A53C5AAD14ECD830AC6C85D4742E8D8CEB9971C72EEE3A8888340202143AC1F4176A7D88C47DE2B8CD74F4A8501B0182BC710BC382D71DCDA71DA459CD002E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 - -count = 64 -seed = 5909111F333F3E939105DFF8532548927EBF289F31A72F4C1B0C66816D8B68F64622F36A9BC85E63601BEE8EE7CB3DC5 -mlen = 2145 -msg = 5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 -pk = 7742A9641E22F7A1361F5C7BA840DF31B741ECFED23A5FED2F184AA8F6EA73FD2CCC5D2D6A9E420F5814C4F6E5685927D28564ECF2A99B36706BD0E9122215000D1734C426C484017D354A1FC7AF26BCE7240E8E99E32368217CF2C625688D246F18C548DD50413575BE930DD40549AADEC3DFC0DE6280664038A1B5427B1300 -sk = 7742A9641E22F7A1361F5C7BA840DF31B741ECFED23A5FED2F184AA8F6EA73FD2CCC5D2D6A9E420F5814C4F6E5685927D28564ECF2A99B36706BD0E9122215000D1734C426C484017D354A1FC7AF26BCE7240E8E99E32368217CF2C625688D246F18C548DD50413575BE930DD40549AADEC3DFC0DE6280664038A1B5427B13000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001505311D5ADB5ADC4F39949A2C8B8E5934DDCBEEA7F30F5332E19D2C097682637726FD2E3B65F76435C50F65BC40465596064BD9029AEFAF5653B968799F73FE8FE3B32910DF10DAD0FEC5573CC219E2643A3EEFB63DE1F731500000000000000040BE5EDC075FABFD1D37C99F2E747798D04AC946D5592E2DF573DB17AB11725DCF830A1B6BD7AD3DB370AA7103432B3F6653E8441B1FC14794991D4B875F22E1A7FC1BF33E7187F653E2799A53E1A46B4C7DE5766B65D5D94F7FFFFFFFFFFFFFF98FE03A0BD52CA1FDC6B90B555D33ED6D27558704CE37195D44A69199B2EABD3F5555A481995F653A6511F6FE36E012CFDD485A57ED7D00F06A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37CFCA1B1B1826D256A99A5D0AB31AE22FCD7B1BE38FBA31DA3E5C6A413FB7DD444F1966F5DDF4D80CA12F6BC8E298C153821448BEF4F219210D0100000000000000000000000000000000000000000000000000000000000000000000000000000A67F34F7B9261CA5C61DA1EA8E7E6642C2CC71112EDD75393478A4ED4B1551B532192FA0738B6D03E6B446EFC3B9EF6086AD0A988950D929CAD265AF92804009395A5A7BDDFF10C34C955FDBAFC03F6675975C726ECF625E97F03960B398A76A4C0882EE7490FC3CED567A43A25EC7E7A4A60CDA7CE3E3F9744F4880D501C0034089248F20C45DB831267682BD7CFA59A920DF1BAEF7DD61BA4A675B8AB83A64EDA36D09EB9701D53960A3E72AFA3B4C161C697B4340DDD6F25EA694A37180066E812843E28769B156407024A5C09A84280CC2B0636A51E8BBC21F52D6F43425135CDFB69256F7F6587A97A33CFDF82839FB458186BE06A57A4FA9426CC0D00815DE5737F06E6A9EC0D7825C1811292345F25C83C7E0DBF84915D285788D51211D302806CC0E99819B02CA364B00E3A910D42AC4F3AFA4D6E8C91AEFB8F23003A0627AB92FEFAA4E4A96EC5426EDA05F2E6B738BD7AC7E3D35CBB80F941512B74519FBEE3E79FB16EEDD6B3F5A8FE52E6C18B2DD8745C6E95075C2534180B0056246599E97E04F0C0985A9F95C440BCB45077A19D9C63729C4E716D44FD755EB2CBC4130F9758A0785908E3E1118BFA05F05B9C9687DBFA769ABEA85A980200DD9D273EA458788C1A57F57B23EC91ECAD229A2202C1B928F6047A11ADF31E0C75503DFD08EEA6CF5D7FCCF70FB6265B1C059034F1C6EE896F181020D8220D00D0DF1EFEED7BBED24A243DB05BA6957CBA83664935DD3A4539CF348941324CA938178D71E8103609EBF640B0F891B4E4B2133BAC1E1AD60D5D4928E9D2A81100A82CB0676FF3437B03B485BA0EFE82F4E4A7BDC4F98A59BAA18B9019F1F51F7FBEFC0C67642D8D32911360B8B3CC7208BCBDECACB69F12D8A0273F98AAD71F008B5D3111BD94F57781AB852EC8294EFD1D62D151B1329F007AFB1E3943B057D7449195C5054B431DEEE20589CF9BC3F18043B345FA8D8FA8A994561426B122009F898A2383A7A6DF0AEBCB379BE3EDE71F70C8F2A6620B5D455E16EBE82E2FC11DD41D42065ECD6811DF5A6D9EB1CEFC65772E0952C8F2EE594ACA24BF5D0C002BC9724114D2AD634BB93C3E2A4B5E456BE1269C561CCEE944A78C7295CAAC841A0B7A4CE0E55D123A4A18B678929C89EC739D06A0A52E238A214103C54805007B2229ACD7D9ACD5661D3747538F524257916A515C0B19415EFDFB2670A61889ECD47C6337FAA954A5FF237FE57BC9F4340B74E56B262E8EB1B8C400F29D0400 -smlen = 2480 -sm = EB757C3B5C9714E670C0E499C8E3483A58BA00695BF829E179EA326870721C291290418A14019D9955A6434A6B65720E524753FBFC39468700649EBE523F0FEDDE31CA1BFDAD61610199E600A7785CC79F03D1E2D08BD109A82D0DEB16FD002B37E3E016D03C68FFEA6C88BFA630AB2EE300946A9BB23610C0BE6F739A04B72DE45CEFCC01F7D74C18B7F693CD039D2E48C869F44AA2950114890C804135ECB2348533A6A8ABEE34D9CD01D85D04CF9807B5322FAD1C88B8283C2DFFFD0114E19C75D5516330145ED72D32E86A7B7881005B3EBC4A8C83E086A073F10D6528DCB5F34A014CC0ABF6FADD0BC897EF3331AC7683E071EE01D8CECEE88F732E99A23F90C273DE2E0F400800011779C08BAA609379BB4B6DEABAA008B887A3570EF8904C554EF24CF9355F696C0103E566ABE17FBA677D01C77913614CB685E5E00143AC279E883E4F126ECD28E7DE0A045180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 - -count = 65 -seed = 238461A224ABEECCF709AB6CACF4EDD372D45E5F4274095273A49AFE614F2BF713134ABF68B4DD058E6D7B612C3658C3 -mlen = 2178 -msg = 99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C -pk = B5B0B37334064C65FBBD052EBA2A12ECE07E396154F1FB7405D9CC13E463152DB2B58D51BC992D7829AAB97A48EAC4E45660463E16625822119996A600460D006A190E7CA063AAF1B4172300A88E16A18FAAB587BDC1C51A12DE3690CAC846A6C4ED863533BDA2F1C943AD47F7E20C8D3E33FEB0697F30CE30A124B192612200 -sk = B5B0B37334064C65FBBD052EBA2A12ECE07E396154F1FB7405D9CC13E463152DB2B58D51BC992D7829AAB97A48EAC4E45660463E16625822119996A600460D006A190E7CA063AAF1B4172300A88E16A18FAAB587BDC1C51A12DE3690CAC846A6C4ED863533BDA2F1C943AD47F7E20C8D3E33FEB0697F30CE30A124B192612200020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002AEDFE37D72BB9133C277ECA4BFE80A5CFC4DFBF9419E813E7990C90B6D315BE414E22DEDD399506516541581BC8289F588D2D3974B8A3E2F2E6C1ACC92673D0528E7EC78C23083E3C15634C0BA1C57BB0D240BB63D38D6AA204000000000000007516A4FCA4D6C8427D069F16EBBCC5AC2F1ED405EE1799B80C94908848BA67111A2D94A43C041415ABD0699719D737A73B824F2A862D2DD287115FDB2B64AB3864A883F07839F4CE622D392DEEDE96B21A6E58A84E4A831349F1FFFFFFFFFFFFFFF580FB19CD49A750620DFF6A716D4529FC8A3C39D6809369BD0C714664B469C3550FEB4B3B07A843CB0DCF40B63FCEF5D6EA55AB680688C75B79FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1BA08D746C4B657FB526D8A1E79A91144168E6AF2BC7AC5861C9234001E82276CF430CA68A417CDFB9D36C08941DC3A6EC9DA761BD043CB43F030000000000000000000000000000000000000000000000000000000000000000000000000000989010D674A616C2FD92CDB646F70BA065891DC57A83D1E1516D533E90A12495BC6E1ABE2F8AB6222E68406E5ED0477BB8169DC8AF3A00C2E43EFD169F9F0900B3EA6FF9DA35B614DA9AECEF21C55671BA7BB0749FC90B37BEB836A70958B5254F722E58017C5132597361CF5EBD65399E4C125B5B450094CBC7475A22A10300EAADF57F845BD285B9A02B0DA7879E79861742CBEBE393169C9FCAD3113F4F7394D40C0073FB26E875B7E572197A137BB6B51B0FEDDE972BD90F21A9EEC307009AED30BCB84DC2AAAB0BA8BCE878A210AD9A7BD82A3DFBCD4548B1AA2D5C9F5256033D3AEE24FA1B522238D4D3B44B61DF56B87A75D30A19EB407BB6B7D60200251864BAFF945D3CC46914D84CEF81AF725B34A358CFBB79D5025C208704AE0DB6FF4F70B43C9B4D4E576CBBF042C9F18571A52247091F88B868EB2876D10800844FEDA7A661803190A24887ACF0D88E2B4E6D3B855E5A7F1064F5763C05CFA6F612FE1CA792AFF90C3F7D1030A69CEA0F991187757F0E10B7B1B64ED6771A001F22EEB88595C2C2DD2CC438C4D4A12775E978CB66AEF4DAD9AE6F6CE455F47BDE9DA8F93A5AB2FA03F03F79D3D245E8E11CB12436D3F2E88AAFC4113A091B00C05CF3CA3CD57D9C1AE8B2861660A2EE802B41F4A30AB2554D386D1B7DCAB407464439F6A41A4BDA1AAE7E313DA070E115AA8EA4ADEB1F30108658631CB70400942CFCA844E72E1DEB51C508EFCB5126532E92ECF2D67A2058F04AABBC33AAA9FA3E34D3BABBA2B7A1181BC7DFEB1BC5C742A1C7A9A2EFD46DE50AC4BBA709009D02666A4A2929239529AC9F2F24A3D9F0043E899E26E524030A19C6067D3718B579739E343625A8CF88492B308D291F3ECDA56BB5AAECC2C5B7DF703D741E0092B3C6D20C201151FFB69A6E72437EAE6B4B8DB63FFB28EC71D8C9D965B59F8B6486167D6D2F15BD32847B8930592C448670163B4456C4B8E0C1CB657EEB11002DC0046705DE15092C0AA92FF8BD2418AEC61946272F374E0FC5F511A79D7E60CA1062CE2E63AD9F1E6F401C46CD89EE642DB20B0FD68B906419979CB08B0D00CC74078C10380CB60B364F2B6E6E287CE42DF1CF04FD7FA689A2D9F225122251EA1AB56351AAA8948204B8549E6BC98E0D03A7E97298E46CBA73C7B268D71100ABAFB8EB07F90D9D10B244A065697C5D6058C7CD07793B0CAA9FCE8EAD529525452D79117A2234E0796B92338D0260912E7448C6D6BE26B320C804E779BE0200 -smlen = 2513 -sm = CC63E139B8F993726EEAF2CE7789EDEC7D53001F47C7E098BAEB8B15BCC353D2042F391CE80005C50F1A5A8F1F8B56C3F124001EEAA82722013E04A117AB188C5191195722EEA8B0301CC401D1308EE4CB1FFDD8A91C2E15AC5FDA31898800A9E2D6278DDE627EC07EDCC9D5D5B6A58BCE017BDFE48D89FF383B3EB662AAB14106CB0A2A01AB906C1011E21DC24D3F4CD6672D0B4AD013001AC9898D28234CA8144CA37D61FE00C757E900297050934DEC685CABE59A62E1BDDC7D88E201D366CA4608B18690C0C6DD1930FFB9FF139A0091888FE756BF2F83C86811A8BC5B80BA2C27003D2410A0934D97597D3353151374E6F203150121ADD298AD078021176ED918FA8191FB2D9C0101579F63054E2CC813D9AFC4E6257D5DE7E4D408817017B0AC8045D92A4ADE51360103469BED5FC5E31E7A4F2C0B7C17E70D6925F001CF097119BD976C59686BA24FE1290099B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C - -count = 66 -seed = 83C653708FAF3E5F6FBC9DFBE6FB5E83E572A7688645D75D2C4835B28695DEA4BD7093740D0FF43237354EAD1C978BC2 -mlen = 2211 -msg = E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D -pk = EB6B6BE1CC87DB911C39D3228F174E79A90EB90FAA01E07F4834018333996CAFD947ACBF55296A7756E906C86E3CC50ECEAD262EF93F4E76EC002A2DF627180032E3E6F81A2B8F54A49533D3D0011BC2369E358A8911B97222C9C426BCC53F47DB576A3D9574FC9E4330DE1D98DC654C76506DA4024C02B7F9A59B96F4590000 -sk = EB6B6BE1CC87DB911C39D3228F174E79A90EB90FAA01E07F4834018333996CAFD947ACBF55296A7756E906C86E3CC50ECEAD262EF93F4E76EC002A2DF627180032E3E6F81A2B8F54A49533D3D0011BC2369E358A8911B97222C9C426BCC53F47DB576A3D9574FC9E4330DE1D98DC654C76506DA4024C02B7F9A59B96F459000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BDC6F3705EE5597FC779C014C7CD7BBADF0C96E9780D40A1AA558A77BEB8259D38E925062EA1FFED5F424B45743F87010FB9496AB2C01C9314C24536A4425F82C613D5A6A3D6C3E70A559522A4CF5AE1AE0FCC5ED3A86E36AE0300000000000000D8CE7D34E94A21A36B325ADD14DAE869DE5725E257B8FAEC758E236480B709F051DEDE2FD47E3B93E68F0A880801EE3FA859D6DC0567F9AA106D3FA4093D3DD502FA70F7A48F3AD0D12680C229947243A49BE923CD5484497EEEFFFFFFFFFFFFFFE88F1E179D9A3407272FE00F97113491329A974C3A8D89DEA2690932EF6E953AD5E7DA21BD9A3B305220E91636A95877C4ECBCCD66E564BE43DCFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDB87D95AA822AE117D940D4AB333E1F29B515FB8CB0A90C9C4D5329E7D6F7075A1E72A0D2DDBCFB6B4DDAA367EC543A9D5E45C42D00D24B021F030000000000000000000000000000000000000000000000000000000000000000000000000000578E738AFFE481CF95FD0EF7A5EB34E3AA825CFA804BDE3D69370AC3245D567281FACFA4CACC06378253BEED857EE0D4F5C6746503A88AEA267567827BAE190040088A14B3C157BBDCBAE0285D5E3DAF351EAE31AD5794BD635D0C18F7EFEA5C091237E0286FB34800133507E894F09E94D1A7C2BCA6F67EBF2C9255418C240075EC27F0C8092F98B0150EBB25CAC1A4B0E660C0DBB47CF1071D4E2880CCFE4F765012654851FD3D1FF93EACD5BBD3FE38F1D13769491631BB48B3BE25560D002393A2FDAFC6C7CDAC0D0D8CDE95F72176DC5EC11EC2CACC0CD0C744BA33111E92EF23F942F4DDA7DC9DB298D6457CE4F5D6DFE3568407D0DFF0AC94DE0F1A008D7954DE04068311CEAA95E3E95214F4AA22190B595787647118BA63262CD93E0AE04A35476E962B4EDCA15A86FA43BDB312D911FEAA546D1936BB5A3A0C2200B3A9F140695511B04E25D69DD2520B1E79AF8021EEA7CA82FCA147ABCBE1474E170F89A5322B0B85F6366C3E663144BA639331C58C29379549E330D2975B23001DBA842BC6A611826BCA1E0F45C8CB1A2DDE9C02B9202EDE46FCDEBC9FD3FBAC19DC1200B24E9A5423A1F1AEAEA502B868EF117EAC47F08066C9C2ED2B562200C55B0506E4762970F3EAE7ED01E7A17AB05C17CAFEC62D2E6C75DCF695E443837DD1A23400D462664A299D1294CBB3890735B45D2DE915ADF6B64714064D110056947CAD29A508351962B49CEC00A6B37BA51AAF6997C3B43A1C85EDC7790691ED936FA6FB673B7B17B139109D594A3ED2A06A68D0FD0D22A11235D387E4120083A1ADF53EFD85A160032B86C3BDFB4100FEC9F90877B75B9FBB2C290A8486DF2730824D9EF6E2E3098A6E6CCB7ACE91FB2B482FEB9E839B489C6349E5BC0600A8D124360F29BF390D3443A797C6DC533AD97D32E7B3EA978D699B43AA7F7A1D6553053F81672E55427BD391254F3F4FE2D63F1A2288093AF4B193B4BEE60D0055402B73F85998EFEE99AAAE8C70013C864DE343B464D5844D9973B12BC18A9044F31B118FCD7FD6C26CE67B2E964CDA22571A3DC2FE30C9A27DD292F8F00B00FD0C7B78DB15E13E334BEF521AB8B4D59241C06FE93591015B99FF5660B30FDD0336F89626A2BCD5FE610590E4798D013A0F2C38024561AF8F3231CD043A14007E5436D6F2C2589BFBBF73B6943F6928D7C2ACF392A4747A3E30E873F76C973935EE2B14DE594DD92BB71A9D96329770C45D565368A9369FCC04E7C2D4C81E00 -smlen = 2546 -sm = 5A00C501E0C97A173036F63CEEC76B439CDA00366DC67BECBF49F8AFB026305590CCB8B28900FD8C004C68031C338402119D558A8B241DE301B54B265E04892E9B8C23C50DD9DB44CB5FE601BF2814F4FAE35A7D61C6E15D3E45FA06A3A4013A191934C53670F982198582B7A7437EF54200CD98E94DC287CE55EA6A459FF3F2AF3771620063E2EC415CECE89A2EA0E5ACD939369D95EC0019CE602252223C986EF11419CAA45B192CEB0116A43A7DEAC7350AE8BF58F6F246A312108C01D7142A202B8AECB9FFBE55D0038B4D988B0701D120E361D677EA892B33C587063841F07ECE00C24899AAA9155EF3D1A1A35B8412A7E94C9201915E8C16852A51311D2D1F1D51F5B76F32C60100CD49441F41D14961DA9DE1CF187A628F83F354C6B90BC07ADBD9ABC0EC60D8ED0400E277EE224FFDF6C7D9FA4F843AF17709148C0182019E5B10B8EAC011792E89A66103E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D - -count = 67 -seed = BC81485EE93AAD8B464B5199FFEF9FEFC06EA97645BDFE0B4E915B812E606A77F93917ED925E882161CBB909747AC4C8 -mlen = 2244 -msg = 89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE -pk = 894A7F8FD52824472365038B4ACC5964A06BDB9D4ECD4613A00F35D3A7AC68506124F4319C822AD756EB7F0D7C46980F71A47A2BA35EDB37F95821AC4A691C00C9F92FE6C15B94D0A4EE70986B0EDF81ED6304D241F7C48E44CA521858ECA56EE9E18F10C25389B33621B47F5D18D0762A3B97983CCC139D7977FEF830E51700 -sk = 894A7F8FD52824472365038B4ACC5964A06BDB9D4ECD4613A00F35D3A7AC68506124F4319C822AD756EB7F0D7C46980F71A47A2BA35EDB37F95821AC4A691C00C9F92FE6C15B94D0A4EE70986B0EDF81ED6304D241F7C48E44CA521858ECA56EE9E18F10C25389B33621B47F5D18D0762A3B97983CCC139D7977FEF830E51700020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003F4F42AB018A43A8818F8E053C2319C89B13EBEF64D42F8469D6C9D716A7734C3CD558FA0B19FC70492B06CD5AD1F222486E0B0D1E8882C57FB6C9475A50A5971F7B7EE0527F89EA1244725C62430160786B8868AD385C81F20F00000000000000908D429BD8604F3FE08560D4EA40D291A80FA7AA963F42B694DDC0E8C4DEB120DD14D4262A40C71B00ECC01F72EBE3EF1A98B30C3BD3655F1FC295676EEB7A7EC6F95E5E1757C50507FD869944BA779691C1AEE4F2F88E4B58FEFFFFFFFFFFFFFF8CEF0FDE0EF77D1AAE8C55D6FDE12B842399C21A38318F4690513535A3E7519B73B7A0C4F78924A71151C9453CE3CF7C026AA6F1D4EF97143C0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF274C5D1999225A4C986B66871F5A67C06E5202EC00B434229B6D5F3DE914E47B72B632EB431D5B836ED9E6C32E9D4FF22031D7B3C7850BE108F5020000000000000000000000000000000000000000000000000000000000000000000000000000FF8509B570D35BC3C6565725847B6C2BB9CC998CE680F75B0AAA3293392103AC16850ECE035831C866802E26877793F76851C7C1DF00FA58EB42D88DD4831F00945856D8E43DC68813AC37AE74BB308F0121F1862468E65C0DB02E59A974266B63FE14516B7DF5388E93A8646B9FBE5B5F4C399A3BFE40F5C77D328AE78F07004EF8B7590CD1EAB14D28B68BE33EDEDD832F1075C8F1008100F32A0D17F58C24D7E03BEE595F2F84DA5A96DA30671DFB95A78B80F4C159E8AFD383A602041C0030144F5489099A45CB6F19A192B702A5863A10813AB1F2940307BA20302FC5D233FE4A8D6E604398A4B73B91A7A7A22154A17B65FE3E2AA5F4702F3FCAF70700A9D4F4F7EDFB851860FAEA8BFDD9B84E270E0037EC7A933A111DC071E5C2D8A2503A31343E0B9861130E82E6F6018F937078AAC85D28A871963A7E91A003050065F28A6E188B97A74FDC5D73F97464075278F1C9050D961FB780B05DCB91814BD126CF38BB986203A3053F8D1039D65458136E6C261E169B47A20E3386201600F3A8209FEF1CD7FC8DEDBF9A785ADDB3ACA21593B70C611441984C7B8D95A7FCA9FAE22D8D3C5212877BA789C6785433B6317C1DDFB09686C9358E14464C0800C15D0E18D7A090A933D0B512DA92EF52714339566D36127DFCA628C591B7DE06C7522C942683E0EC1463E57B8FA5B16FD5DC20E4630D4385D4036549FCC51E00FE56247275591EE0095561BD545EE6F04234E2BF2EA39C24F7EC0656CDE95A804C566AB6E15ADF0BB7F40943097DC073505E3ED7A37FADA7DE63D24308FF18006B615E735BE0DF2C5535AB73EF6BA6FDC76E39FFEF7866EF7CA969077D8AB2BB928EA6EA2D8436F6B40C8FA7ECFFF2123E235567F89431820BD8766F74CC0100B41D3EC06F85D40BCA23FD6E3728766DC831729BC3E66CC85E8E701B3D39163FDA003555A3E913EBF216F438515220D0BC8CC80275C05B215773F2EDA1030F004011898AAF941C1B0F7DD43B6CEE350218C59BEA45DD0CF09169F975056B6A3FE34D9125F6A253658849AFC9BEB51496883E4D7EA30EE4082C4456186FA603002783E8B13495938E5AED47910D142197E2C4167461F511F46B7D2FAB01868639374D7355E70031087797CCB72BFB2935B64A26E492B057B418E0E4498C2E150012550903CB6833534EAA1723CF088D2FB128C84D776F5B67736C6539952A6C9D7673A4AC21C8E05E9E043E920BC2014F2583969AF093818080EAF0F85D781100 -smlen = 2579 -sm = 9EBFD924F911C60831B01D8DAD380F603E640131F576A743D90CB55311653AD4E348297C1201F6C84831CD0387B96BAF5F4A996781491D070035D7ABCD8495AF5C87630B20DD7E09663050003C559207B5B196FC752E689A0BC10A821D88017DAA03D897743953812CE08EC52477BEDA7300F9B13A8553DC8565B804D97DC8E9696873F901412A1B033397AF8EC365736BC53553E2DF1E006A5A4AE54392B98F3BA1BE89433B88DE0B6801672E544603E1982BFB11B33FB4B68E38887600646EB990374E44D818B4594CDC5C406071940089ACBBB28EFE084809CFCFA0B19FBFB55F1F013327EF33905290198182E8EC9AA765C7DA0A01BE3D0A3FCC7199B4BF65B62AB31E6031B39C0000CB992E150725061602E3CC7C729358FBA57FCE751EE52C502B463B705ECD77CD0203341E319DA08B4CAC24762B8C50B3712E501901F1357F34E3969EF0737AE0F96F0C0489D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE - -count = 68 -seed = DE9E2742591A5AF6A6153DA85A510C39FD31A2ACD8A8511F190A9A5E5753E63D9801A8019508E67DEB1E9219CC18BA3A -mlen = 2277 -msg = 8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 -pk = 51E39013E965C64520412297DBAFE0B37F094D1AFF09AC98CEC2F483EE4906F244E604E7DFE9082B860D9908FF1FBFBA87C609139CA24906B7B7C211A027220054392EBEE1C0788F3C0D8A85E0D9FA5F6C283099480B3FD3617E5E85FB39852AA68E96639378E73F47E2EDE8E34A0129C2A55C88401E0AC82415FF45E79E0E00 -sk = 51E39013E965C64520412297DBAFE0B37F094D1AFF09AC98CEC2F483EE4906F244E604E7DFE9082B860D9908FF1FBFBA87C609139CA24906B7B7C211A027220054392EBEE1C0788F3C0D8A85E0D9FA5F6C283099480B3FD3617E5E85FB39852AA68E96639378E73F47E2EDE8E34A0129C2A55C88401E0AC82415FF45E79E0E00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006A9A87DF6D66BCF8A512AF601A1551F44DA92527361D14F693A5909CBD185318586CA095F203183841519BD770B1252AB2129B2C60CED4824DCECAD3015F8B69F17E76B36576D6BB1C9C0EE5F0873B70F3C8D1BA5289BA85CC08000000000000007383FC07E21762A1A24E79EE8AF5F2934BBC30CAFD6B3539C153DF641C3777B44E9D5612204088EFFF88B7EC65A37E51A5DBB64C9999E403A59E507E18BD57D7CD0CA1A086587FFC669DE041E653CF6A1D1FD823D648E9D55FEDFFFFFFFFFFFFFF93AA6F64ECB9174C76A9F318F81F4684D7DCCB1E143A7BACE663A41AE326AF73E56F548F667D6DC18906A3F4604666D992567FEE2710888AE385FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3ACB78987EF7AA4024D501E3541B343E17CCFB7BFCF9AD1354AF8A9099473D082CC5BBB02B00FF98F17294535996649F07AC2811ECF05A043B7D020000000000000000000000000000000000000000000000000000000000000000000000000000B1536BBD802AFBF9BBAAAFF06FD261FD667FA7CFBF7C9C14BBB439F249113F74E3E2981C5ACCE78895827069CE9A29EC3574AEA26E59F84A30F9D33ED65703000C5680DA5282962FD762845DBFF599D2296EE4A8D0A9E8E17CB18E55AF0AB2EB30C70204639F3F651C04BFA4AE8B9B4E4450298DBF7956CC8970A9A5F9120D00B381E7CD3008EB04DB218818B7625F37198D4816FB545F03B2E7F5BE1B89F6D2A53D2F2170ADC1341E7935A766CC7AB84112A75138A5EF38619F35C629A4060003BD5328AD389DA36A618794AD5EE86826DFFEFDDEDBD872E48B868C16FAEEE57F97FFE742A1DBE4846F41680BAB6117DB4EA300ACE445EE747BEF2FA8CD0E00FFA757BAF66442BD3101EDCEAA4BAF9C1C1408D4199819BF60325BE028EE5E625158263BFFADEB41F96B50D6DAF12BFDB97F4F936A736785FCE47566F7501900B043C72D8764B2069C96C3DCE9471C2F13D685EB52588C5E7782FAEA3EEE1702E936DF2C0C4686C654576F5A4D2A29014D1B2C01D747E371A3AA18DF63A71F002BE5B8B1C585AB4403AD6E7F18AAAD3660256361D57BC2AD8919C898C6591FCE55B8B8C03B44A03F07F00977D1A54E9A3AAB710F90761F6C082251E3BB540500EFD095347A5776222E7987A76CFA2CBEF105BACF338C7ED34DB1833D1EE5DE764F836D9D68695BD72C1A16FB134312A2FFD4739426AD255A0AA9607290B71300B7D9A585544AC7B390BED4DD4DD4A4A6084145A717F3CE156AEBE359BCB8671E1CC64FCEE2489AEADA5D83D2E36E37B17A821849E16C961E6393C08B7067000032563C99F56AEA0B64888FA724422515AD61DADB71EC86FCE0166CEBD4E9AFD4F5E79994903CEF1BB32762750F8874EC9D5255B79307846A2A11440C6FD60D0036C90AFB202A6BFFCE9D715FE7C4E7725E6898D8AE4DCC19430067E95031B09FBFDCD82A66E6C61581693C2F15D0AD4D3391AA1A68E4ADAC714017087BA80A003BF81D8B5ED1E90B9CAE56AB1C08F6CE378EF9A10BACD6930FE198DD09CC81F1B56823C68ED5A9E95848283EAB9446BE5682BB40A0A83EA69A8953A964301E0097A030EF43CD19E0280F9E20B89AC01791C33F244459B5547ADDBCA8A71A71A22F8A8EA284B7E30048170FDB136917989C048ECB83C89BDAAC90F30251991A002A2C50F6B861D39257BE55EDB53D4106854582DF28A217E0659EE023F45582AD489C0A8BB68C9BED377F64ED9AC6BF7CC2187A1FEE3C86E709A4270803D30900 -smlen = 2612 -sm = 9D4A3CE2566D1BE19633C4EC666F9C1D8C0A00EF951DDD8E877EE376336B0452ACCAD3F74C01536C5028BF056E5266EB2EEBF01456DC218E0134AE467BED17CE0108B9595597CA18CEA0B101E2C0DFB78A573E126BB3A8A648E93B80FD1E0055DA04F62F57D471B800303569707E80EDF900FD16C169A6271B3141898993340D0B05EDC901BEF40F7ED7013EF616897B2826D420AE588900D447FA25382EB934FD0B4AE0C585B812CE9201E64BD37BA70EBEEBE172E3CAB1B659065C590053833FA732A50E09985AE3C768D01631C07101773740D9BC7C2185AC1F5ADF4A98D8E2F726013A5605BC2D1E729BCBB9FCEBE10C5CC145D7015DBB99C9C6705FDBFBD5E649E40FD28008F901018B3194F63BF62A8703D6691A217D66F7063F7084554D40D0EDE2172EA1581D7C050334981FD2FFBC5780DAC44DD44ECC3F5EB4B1003856D1FE45BB95AFA4FF511C14B8038337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 - -count = 69 -seed = 272E459EAB6A0BDF720E4C5B79E641C95BAB66C3CEE261D0E3596BB04D232ACE0A1CE24BACCAAE9037665A962C711B08 -mlen = 2310 -msg = 62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 -pk = BD163E842724B156F6BAFB3BB7A83F107D84ADB4CC528E1B6E50F7A2F74013835D67697EBEDAC4E34243A322A90F0B377758EA146CA0FE69DA192B13745B1A000B1A8971AD3A96D0F6632491356570F543C0BE265C7F5892BDCBDA9F0899F2BA9373DEBCC45913F6257442E2B26D93097CDF38E93989067B51F79FCB35872300 -sk = BD163E842724B156F6BAFB3BB7A83F107D84ADB4CC528E1B6E50F7A2F74013835D67697EBEDAC4E34243A322A90F0B377758EA146CA0FE69DA192B13745B1A000B1A8971AD3A96D0F6632491356570F543C0BE265C7F5892BDCBDA9F0899F2BA9373DEBCC45913F6257442E2B26D93097CDF38E93989067B51F79FCB358723000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090B19F671FD91BA6934C41D906112B196A9AFF3BC187D29945F32CE67FB0E3812769DB00DF5B5DFB7F87C98E0E01D523C3AA6C1D08C176377F1B23C0B923494C6DD80AAEB8908273D562C12DB9408F244C45BA8C1903BF061D0C00000000000000C568C1AD60F5AE5F20EBC5F46DE764C9B188DFBCB5C658A408FEE44768A3A2F67DAA3156D920641BE5356A57E96F427EC349AAECD3F87EC07833873888D891C5183B2FFD8F56EB3D8069068333952A4E4FED6CA062D51EE66CEFFFFFFFFFFFFFFFBDE090563096301E880A6AE032D9346EF50F0442D0D29E81B7DD0565CAB1F899F2E81AA7293A87D6FB41F63879D35DD00BD97D011E08DCE8A2DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2451FA1DE38DE6DD8B8DB3FB008AB850005175217536DB696C4209E488DDF2DD302A7EBCECC7A9EB52AD04955DAA691BFA324FD4CAA03E2DC1F3010000000000000000000000000000000000000000000000000000000000000000000000000000A60CDB9E923AFD979592ED754FFA278116F89E631E190AA531E69C3036F46EB0E982A65FE14D081D88DE8847F86288C932EC01685825A9814675DC89AA822100F3BBEF6D9F7F6D6BFB6057BF2AB9CCB274019612C0F5FBB798D5675B5914C35DE762F3CB9687D6731CA772A93F7C5B11905B3FE6D20C904135FF3F06671D1500C63F8340F5B0C6DD9951C51FC37F50675A19A2A7BE4B3C7C16B7D93DC1D5E125E3F8C395004B9D3DEF509D7A6D982AC967FCCD0CFA7739C9DE12BE81864E0E001638CD89AA68E7AB01751A9F4EAFCDB9B55AF121C21780D0A8F9F1BA759C8781E04C08CFD8EB666DECFE818430D9038C9AFF4631D2A361A721A353CA3A6E2100DFDF581CA7503B2F6400AB94C755ED5E5795BB4189B0D5131B1626A06C1B27503AFDF44BE05FAA7BDF2EF3FD9AB9C8908655B6720DAF57EA52433B7CA17922007AA971E2EBD7D18A5E69A6BE8AA1A3468A24DAED817D94593A4BACD94CFF95F006A30BACA947C9D69F187BD9BBDD64CF7A48F042CC020977C5D0F610868822000B1752745A83E25E4F614D53F087F516AEC5D1606F3C7BD8369BD6FFEA6421FC249CDB18FAB5CEC01F43C636F5EF8C856D058E2056FBC9C2A51ACA46077F06008DB8D8327B7BF856FBDA94445CC77FE911D09BFD5AE007AB328DEE801F12A01F5083993CB25AB1FA828E11F2DE7182E6A41E87DF2AE1F39903D00A51777910001A3181AD414AF4480DDAFC88B437632624564738CBFC785024F1D076C9B02E3CDFA0A43C9B537FF785C751975AECC68AA9A8358833BA1FCAEA2207ECEF111E0004CC91606A4E188A114B32D64AB62FCF138E4EA57DA6EE13762D98C4E55478F4AEDDDA73E833AFBFAF321D0BC33FC497562309329E9433877154C3FB5EDE0500E0671F70933ABC0F6DB6EECAF8CE8A2E5803A5F698A1B372E83F535A9F8AA53A619E27004FF7F79E2B238057327937C9AB557DB7CD4EA1C0F23B7C0EAB1E08002C79CB92BE85AC9AECA58774AC1A0E1DAA518BCB373F0A38508C2AB888D39DEBCC73D1E5EBABAF7A446B40E4EE66B949A1B7CB4A2A5DD04B99BCAB748E440900414FD55A288B3216316D410B2600F9BD065DA29541C34364186142573E022377B70AC142012E02C2843AD36F2545FE673F78ED07852221B134599A2944990E006D949261F7E12D18F98D18B74A0761E99C91139A7E45A07862B9C98F5ABB7D37303F30BDE123CA67086A80AD919BF2D85E5E73C2990305ACD83E535911FF0800 -smlen = 2645 -sm = 762DC626A92C49057B3A2B9120C38907FC9A0017FAD2EE8AA26C648215D434430B4A9C00640017C3391D8290C1D7331E1A357731DAA77C5A012E6ACF05075C7149FB93F0602CB775DA201C012FE936276C4D1DC91AF9AF753049D7364D0E0114968AD980E63B22B79EB854DEE9AB1B195B0018C7454BF74E661E50FA0F0FC360E428C7B0008E31383EE368CA264045082C34E126D790BF00D2882BDD86C523CB8550A55359815C4BE70B013035A1DB8AC5F42263E4DF675579E8A03FE10090A3A832154C0D73A19D932D261E83A93BBA00182E991E5213ED59D1FA17808B181A26382101BF96705494B92751D9F1945E4D331AB0B82A01ED9A5004C18F26C6629B7D3A8532ECB6339B00015D74F8039E34E125EAEFF26ED215BE33CCD28E5117C6F331C336039CDE3490B70501462A742E18A230BB371EA908CCDB39239F5F0068B670D9783342698AE77459892D0362215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 - -count = 70 -seed = DCC58DFC13B035323ED44BE50A7096F697C9C143518FED50A59181160960203831A9904847BA20B85E99FFA63E4AB0B2 -mlen = 2343 -msg = 954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA -pk = 9400934FEE279129315336ABB36F0010EFCE7346B7C558D3B09158D2E17D15C5B4C0F2B0F5515E099CCE27817F5D6F995C7F4050493EC534A5B484343CE10200994D7683425A1150927BB525B17F0D2ACDB701A01432D8CC2D137016C4FF3407D422D991063F373C7CB493E47D2FD5C45405134EF1E9EAC2643526CCAB5C1700 -sk = 9400934FEE279129315336ABB36F0010EFCE7346B7C558D3B09158D2E17D15C5B4C0F2B0F5515E099CCE27817F5D6F995C7F4050493EC534A5B484343CE10200994D7683425A1150927BB525B17F0D2ACDB701A01432D8CC2D137016C4FF3407D422D991063F373C7CB493E47D2FD5C45405134EF1E9EAC2643526CCAB5C170002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2676689E280D3758C37DD93EB2C374A57351B4A07DC1919610E9C567D9403FA22DF3F215204ACFC7782AAAAB136922905B5C7D968F613F928AAA4D16037B6CFD66D99B54673545881BAE7E3635D41C2619533864F68A9C187FCFFFFFFFFFFFFFF9902D1C6EE6F3D73AC8ECBC4A4B6D84DE8A4ED54C5E924E276355D4411AB55515153775910BE9CA20C3B1E76564349659F7710E7B7555909A3F4ECC4E97BEF8CFE28E74852813D0D6F285DF73E4FF852463B3937CFC64E025EFCFFFFFFFFFFFFFFB7CCC68B71A7BEA10DCC1D083E94493EDC48F6EA8EAA0C2EBFAB96C278E072DE826CB05C4A3D108BBA1E6FD3719410D0B887095FA8FCC438380D040000000000000000000000000000000000000000000000000000000000000000000000000000BA84EF77599729C82BF9429EE05F4A91519E2BD7B0BF8E4E90659359C12E65DC7AD0BBC8BEE81D219F725546B3B0EA88A8824A3567ADBFDC5E3F02000000000000000000000000000000000000000000000000000000000000000000000000000056E85F238D338F0CB5148248789C23D7E298B10BC1AA3C2DF7398A3AA657FD7ABA410E1CBAB3F499BA8770D5847EBC5E84D623503BB0D71D948D70C9A9B71D00D455882CCA95AA760DE3130CF8D3E4A919C6870040AB5F362F9A7858ABBD0841F0C7DE4C37BED9A14D2AACC232FADDAAB3B703CD72CE14270CD5D4843A6924001C89FE927ABE32A5D863C6F1B46C5AF31166A1F85328F0834A47B3CBA69F4F17BF72E5913541F6DD3BC2F9A4CB5AA1309CA5010C16EB44C7ABE73EA68338050074554E26E737C6405073A25614B1688B42F5F576830562ECDE35BB3DA2ECB31B420A4B27D438DA3ED1DEEBDFA79543C1FD6D1E5A8C3EDC41583F844B366C1C0054FD30BB8E71EB511E1A43920551C623A3F7CBCB5DCC80709027F9E610F3750FC11CB7496C4C4FDEE26D7570504E6435DB22812D68D3C993A512AB310A1B1500C890FF480713C642ED602D4C33F6B406C39B6DC4F8E90361F4FA492EBABB103D1DC50B8E9811A907A5C6DE546A854F6462C5FBE6C923D08399060FB527430C00D23BCE7CF4C2447406FDD4388E07544CB18E78427342B4CF1B319DBFACA3FA2CE357720D21D2A73E115ECD0C7CA711D1A1C2D0F7AA1ECE61A2B3E817F0850600B5510AFF56ACABB608FBE3986E579B5D9CD2021C75CD6DBE046E4E229A48906104D7D7EA32B5A14D2DABE090E15EC417429B360453A784EA82C452E6BE200B005943594DE4C1E8C3942A7B029DECDC4D38D2618123F25E6D27C97C86A929C9B194AA4A841EA19025631DD849ED672DC902C965817894C0677CF1992FD90411003BB61BAFAD73C5E60E9090E627C1AFC225377E532B29D8871D1E965E07587FEF565482F982118A413F7D8719596A93F4221CE9A180A7A362205CB06005672000FD71F795ADB0E010E815A8158785CE3483F21B41DAD3BA773D16891CEB3CE098480B7A261FE136FD9BBBEF7C8960664A53D8B3710C9146D86D7DC21B34FF0E00F8308116B3BFD06754B0AD89C18215015E72AEB0876ADBB46D39241D9449A2F1071BB2819B4E59844F394A0D8253F6B598344430A10113FECEC497A5B8A10D00575713BA2BFE59113B14DE00BDA012445A2C84C90DE4C154292B84113271C410AC5D1B00DAE54CB534D88AC49DC96EB7C79A387ED163F94DFF7AE3F6B09D1D007CC17626729CDDAAF9371E31AE0EB9D3BB6F192217688A24DA09AB21EA7262623D131824BEDB8184D6813CDBF5110E65569BCC2D3A63BD5ABBD54F026E631A00 -smlen = 2678 -sm = D01B47F3A4C304536DD5F6236EECCAD248B701667391B887D2F77C60C9863985CB3C044B23002BC179F762732D1F0D163ED7FB88C629FE4900A1D91CE9B257EFCFD9A99CB89B4A30E633E301FB463C494D09FA1D155AC6F0885374185E5E01AA3C1D497333FE72461309C4B6DA91A3067C017F655E160063517BE622059337A27DB2EF2E0020223E0FE1C99DEAAE9F0441E081BB3041C400B042E0CDDE7DB42D264A04900430DAF436BE01E39B79A84BD3CA55AAC31B5787761C18815000AB899FBE2F57B22506B041B02CBA73243E2F007086CD8C8A2B68FF5DCE2E74FA10267B6D5200337E8D62FD2B7E246DDA614BC3526336BD1401CB76A8AD7A7D5DA5DFF260017FD6111A16C701014FC6666F64C3E861CD41F48C320D0F626D2F5825EF8D66D5F752FEC251FDCD7103034D069AAFAA6A0F8219358E05C3382667FC2A019E5A5E998AC71CC3A278CF9D2F1C00954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA - -count = 71 -seed = 270BEDAA7BCD43990FD8B4F44FFB63A3AE8E991BB2BF84DA7BC2CCD1A079C579AEBE2082ACBAB7FF286DE795F31973B4 -mlen = 2376 -msg = 326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B -pk = 5C5FCE5184FD9D42E4FB89516861EBB05714379C6BB818507B158BE409DD32CFE42743C0183BFB3D3436A884AFDE62FEA56402BD97867CEDE7162775050725008555CF0ACBF80A3FF9AA4DE16B64EC034484669694976D7625E6C5E91CCB9F6BE40DE797C29E442710FFA860D535903AEE26F64C44EE2816BB2A29FC7F510C00 -sk = 5C5FCE5184FD9D42E4FB89516861EBB05714379C6BB818507B158BE409DD32CFE42743C0183BFB3D3436A884AFDE62FEA56402BD97867CEDE7162775050725008555CF0ACBF80A3FF9AA4DE16B64EC034484669694976D7625E6C5E91CCB9F6BE40DE797C29E442710FFA860D535903AEE26F64C44EE2816BB2A29FC7F510C00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001FED926CD614BD528E8BE9BBA1E6A8D58465FE32050922B160077B87B88666868E91BA5138877E5E444F930AEC7738A4E2C717C461D39FC8E04F11AD1D7B00E9E038EE4F991404580ACC7731E381D5EDF74D10AD913ECF38390F00000000000000A20943D1DFF617153E78EFCB75CBDAE64BFB42194D3D1C14388C6ED1F8ABD21596F867800DDC300BB67AD946B1B4FD0D3A79C6878C1D356212BA3F5C0D3B6E6D7C3CD44D5A98FF26867E7D3082E252E65414158DD183C1BADAF8FFFFFFFFFFFFFF622EAF3F52EA9ED60977AACAA41756889FBA6A4B358A2230D88AF0C9B450240FD5F9524C2023462EF7CA77AD17F0C3C8415496F9C20A0E1C104F0000000000000000000000000000000000000000000000000000000000000000000000000000009F06B43A2C166A4B1B84F625E3E65E3303AAE94A88BD2723DA925574BD36813F1D89AA23D57BFBCB552AC2DA3C1AE3A88056C50F76C756EF00D70300000000000000000000000000000000000000000000000000000000000000000000000000009E37D2D478DCFF0D573A6E5A898FE3ED89A5F93D055BC0621E5C40960B25D238097F9E479A1709279D1759F10D500F8B8AB4C1CF45DC61650BEB22612CA11400584EC01C8A956BFA0992EF1DD1E21EC051CB57BED771167A8EF0728D22509251BE7E114E9BFE3F867A8904681D5903AE738D106A8CE1AA6D8005DB87BE6B0A001D250616B33686E25E283F4C02BFAB5F69BA90A9F98F851F8B7A2D1697A32857AA466EC9256DA2777D7B3EE16CE908780327E99DAD0BB8D4519529F6CD991F006D8F0B2CF1AE68BE0883B3E90A9FDC7F2473EC78AA228AE79129D9877EB74799ABBC93ED4903C425A36A8EA7733F011EC2FBE894952BF17F022BDDBB76CA11008FAADCC422EF2DA2DFC8E8D40A873193AC4FF9F1AE70A26AB98C66901BF78B26DE77087321B936D7E7611D69259969FFA8237026A70C4044CAF265CF7547170039C974D2D3319C3697D044C16BFF02C8DCF0219CFEAB44BF5513CE5F33DA9061C7BD2069A79F8AC44BC2C3F93862D2A2791FA4305A7EB8A0F28FDE8FB8551E009CC594FAF66D429C1CE1728C11516E6CBCF2FA32931C6A3B0DF4E0E1E1A805F974F34636B1EBD0C5DACBFD9E7D89300EB95C2C607D549D2063B8A9BFE82F170068B6B74F5C0F929EB055CEA49B5FF24F9DDD39A1950CD953980AF4AFEE29FABB816606FB47395C3B6548B3D6B8CB64D71E70463BC903CCE84D056696F3981800793B990ED6D34099F6D7DCE14382228F426F658B8F8FED5B9DC093415E0EACE8F13B440A71AC2BD886F91F74D6708A8DC2EC222E15E6DEA8902D220168B51F00F2576C3ED97F2411BA3A4630012E59B4695D67076DFD08E786166A4834D6D759D2C630DAC7B2055C36C51A849A908ACE057C83A39E493A6BF251D4A4AAB00D00D07CDB9B27E229D0875322382BEDA084BEAEEC60BE2BC2633C362AE39DAF634C9ED90AC2268561D804AADC239BF63E773EAC3A9702E4BE31E9AC06EBC16A060091D0265E210C676A8F426D7F7781ACED6DCC98062D12EBA7A6E379940331BD20EEF0BFFC246ECCCE3529C061AE4EB37319820BD4F41580CFC448F769AE7602008A2EB4D3DDA27A22FC314254B06748AB4E2AF608FCF7EAA4CC8E9AB8E0356979C2F1641084B6DB8A7294AB854E584DD14FA78F00D384EE7292C1B171D2F720000032DFF7738FE9F11A43F6742EB6D90A5CFD82EC5D6004AC9F7F2150AD511BBEFCA541FCDE2BCF0149757BE056CBA336DD81236722D174E498F5AA297CC80400 -smlen = 2711 -sm = 2ADC90E5AC32AF84A88D25E823A5AC6082B700CE5E7C2A86F68D08F53AA462842AE001E4B10160BFDF787490A4311FFF364FBB65B27C76E101012975B165753B530E2287110584B45EBC6F00AD650598082D3A1CD52EE66414C3817B58DE0025FB49E553610B248718445E89431D1D171601A9B24BC3A8AAE397859FFDF8B3C7CEB0534E01F82117DE34A4FBB791703D4F38942732E39B01FA4BD15C11F353F1151F11F9B68C81001498007F461D2BD2DE9C3A44CD83B350E362D20BA40101DD6E2E632C79B9D5331F45162D00EA3AD801D1E5B896B5EAB448D098A04A904DDD1C2A7D012A52D8CA33FEDC856B91D865E84BF991DCC4013FCF43808AA5951EAE440B6FD40DDB0E57F001000D77F86210AA66FCCBCF58C0E3B049EC9D9E7592EF66CA3959A6F33C01CE23FF0503CB6688BDF1D631854846AC14CC299B66103E0031510979AE233537A9EB7EC70F7301326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B - -count = 72 -seed = F151196F55A9ED88F1663AF6BD24B2CB9DCAF3C9B313CD8F0A27639D3CDAE72EA90D60ED5C7C6AB697A06185E5A2E215 -mlen = 2409 -msg = EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 -pk = 4738716D72674A529356CB8311FB7D8F8D44958A95BF99DE435253F1882038981F6541F2DAD1D5526632C775B05206DDFF580DBD9DB8721BE490620C432A0C00AA81A58478ADA1230B66196409B1F3BA00E149E07C426BAF73471925CC85A8894F6C6A17DBFB9AABB083AD437BAC19D2FC6F344886F68AE17C7AA6C65FCD1000 -sk = 4738716D72674A529356CB8311FB7D8F8D44958A95BF99DE435253F1882038981F6541F2DAD1D5526632C775B05206DDFF580DBD9DB8721BE490620C432A0C00AA81A58478ADA1230B66196409B1F3BA00E149E07C426BAF73471925CC85A8894F6C6A17DBFB9AABB083AD437BAC19D2FC6F344886F68AE17C7AA6C65FCD100002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000864C120E7DEEDA0A6B8233E0840220ADA38445113C913A336C9FCA3D269C711733B4CB7F014527840799955AED49677AA0E395982499C6FF5D89D16F0A1BC50A213472C8044CC0B8B1A81ABA0AE5FBAF990739250AD160D8980400000000000000A9D747270F96714C3CBD29D4FBC1352B086036F6513EF44AE3380873AE964F389B45682E28FA2C133C78733B319E14AD84D21269F8336C454F888668C6CEF883029807A91AFE14581BE9FE9CCDC07BCAFE3CF83D036F10A4E7F2FFFFFFFFFFFFFFC9BF98FCA06CB724B717779F43B22B3F06D19998BE4E3F3985A1045969528FE3D64841050E4F4649561B4BE22DE40DBEED935E357E1D2AB15EBDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96F0A1DCD981C091F30B8566EE1EA5E75B3CCA61612D744D52AE3FAD662A7BA81C0C0D0CC5AACAAC2E35B34A177FB45BD255A8BE043125D3FEF70300000000000000000000000000000000000000000000000000000000000000000000000000001A995566FF57535E1ADF2CD184F951AEEE84A220C355995CCF41E0B26E26BA9C33A2BC7A9505FE945F8BED20C190A2B4EBD53846B0F89DD6455E6A8D40E10700BDA94D807028FBE40681481629AC7E9F5B7B3B7FDC13A92E0D06870A770EB3DD3AB9C828964A9010703AA78FE9A46BF29DA93E96DF886612C9A935785185180028C5A1E26C0E882A04EB646BE75915BD4FCF2691658B7B7ACF9DD3915FBD1858A5EFC734825C74BF71DCA37AFAAE65C4896F2B1868E3ECC6BE90C80A62601E0077C502FC82878300B54A127D06A7058BE01630F6CF5A7C79F89B8DFC4B589FCAC2C77EF0B029835CBDCA3EB36CFA6A9478BCAACAF4BE7C83472F3C46162A2300D6F37AF2E1701A8371AD8877608981CC55CD317CB260362BC84000A4D297BCDBB9B755ABB26087B3817B3198949B58547D461A1E04A51146F92664BBEEAB0F00CE1B25AC1C80DBDC426BE9431A327092A8EF3B82778CCF1B02AEDCF36BDE6FBACDC6397AB239672EDED09811659948A26E18B7008CF86AC45FD4335EF9E71F00A4AC315DBCF4AF1CA3AB3A0BFC76EC8F1F686C58903997CB712044205953EA00DFCF56B735766A5BE27FB50654EF217A792E8E6F9090CC953DE09F559C2D1600B199202C994EC4E6ABFF955E12ACEA13F1749EE21DB1A5B6B3ED8FC6064DF30C359D673C1542653AD4078B708BD0D9073636E622EE0ABD2B5163696FDD251D00E3A3FA04875DF6A634ABC60D078A18452EA49C21962F239F3C5BCE1122A67037DAB5ABB3907BB979B8DCEC486A937EEDF4A68B91FADD1090DD907844BFC70500F590C8F34715FD0E5D9E7D2FAC128A67161B953CA0D15833E769DBE3074158DC693919AB208899CB7A48A005255E2CAEEDE4DE8BC568BA29AEEB14217A2F010079BCA69BBE0A0407BCCD23E59ADFFD48EB94A92876E8BB65EA3005CE2DCADDFFE82FDD7A1084B00A031EA9CEE0B9FEE7D2E1089C6AA37B32D10701CBB7AD0D000EFF8F48D8219B44EA03B666BFB52C545C8FF73054B144FF8264D24F975E7C997A1CF68C77DB41DC1BF58346D21B6FDDB9DD89567660F1E309805D8B218D1D00D907623D3DB62E0CB20D7FE75481C081EDCF5A83CDD70C6D84C2DCAF2F23DD7FD8D6D2D1B06B322B54FFA671E51641DCCE5053C7AC8FC5FA84A8BEC7C1A7110066F2F41C663A52374AF0AF3A6E3F922F9A4E78A78150452742EAFD2F9DF62DFFDF02B178811D88A4533CFC434BDD55CEB98939D4C8EA9EEFD04AD860A7E80800 -smlen = 2744 -sm = 674A35D11598308E2ABAA605BF264287A16D019D72DD49D8E4A5462E5D450C88EA28A744DE00B9C0E50ABD9B9D00B31DE9332EF7B3E631E800490E845D0F54A70FF865D2546948822B7AE201269A1EB393F0DD80C088141AC83515DB37D201F40941C3E5E8FAE7845078BA3FB3257E6FB401A38AEC63BF27B35682C0DFF82C09F560128B00C2EEA1C122FC1E6F9AE277A8C4983BC078ED010D65629AFF371E0E82C44C65687FC335B7C10075A1B3C370C40DB868C63A0D5E380C5C068400C2D6578BDBA5E9CD4133E1A1411D2E9AB2840100086BEEF95AEFA46625EF29DCEFEB003577010FECE3DA0E39B91ACEF22D50B9D0CE14B4C0000E3F0341DA0078EBDA1D8292732872FE4C3101012753B376E40A12DC67B96B84C1362326E103C9491E5A14E8315A0786DAD27A2604035F09B0DE3330B5500798A1674B03229E55B10192756BF90AA0291A29282D0884FE01EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 - -count = 73 -seed = C7ECD1EC1A3D83F5116C0AA4345FB3ADB4D9F81BD79896BC4932EE2F9D2D1F179BAF7A002D88F4F69071A7931E7F7FAE -mlen = 2442 -msg = ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 -pk = 55AAF0E8B1AD76BB35F8B5AD40EBF47A800A51B708DE7F1FD4D3210A20037DFB341385E4EECAF7881C3A0B2D1BDBAF1F4C0F4D5E1D1FA0B02CB96D7F4E0E1000C8187A22D9DD509D9B50D6E72C89EAE48F414C731F94F090C56147C0C0AA6EEF3F7C09BA767C7F55C8D9735C55953ED9EF9568D78ED8954F105823ED057E2000 -sk = 55AAF0E8B1AD76BB35F8B5AD40EBF47A800A51B708DE7F1FD4D3210A20037DFB341385E4EECAF7881C3A0B2D1BDBAF1F4C0F4D5E1D1FA0B02CB96D7F4E0E1000C8187A22D9DD509D9B50D6E72C89EAE48F414C731F94F090C56147C0C0AA6EEF3F7C09BA767C7F55C8D9735C55953ED9EF9568D78ED8954F105823ED057E20000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044C54F9D2699E57F8A9C8146B1FFA3653EF02AFDFD24532962E7985C5665B3FDFFFDEBAAB2A178457FD65639F784B77BEE77C0AF2822691E655D76E55644AC88D5EFA47D66EEB4A9215A6FD78DB727B563D9DA56AF98DB2DCD0300000000000000212F5544850AB8AA19DC44333D842398731EC1CC41626715CAF9BCADD7826FB4495E6CC61C0D78D552079AABECDCA960F017451044285FBA6B99B5A7BCE03D326915882C678A6A77E25C70BD91CDD25A0D9C0B46169B18F958FCFFFFFFFFFFFFFF1FEE4D58AA6206DC48F04E67B553418FE011539481045670A10310C0364C838E5C2AD01351421165F9C416234CF82658F856EE33107769EC83E3FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8CDF6D563D50F240E30128B2E94DC54FCAF60C9BC033A5A035B883D2302A69790E83A3BA66FBF279924A2BAFC8DDE179A4CAF9BE660330FACFEC010000000000000000000000000000000000000000000000000000000000000000000000000000D1B87424D6395BE1E8FC60F94ACDF1C94F1917D950DE9960E6E21CC70711232C9467202B2F6D600862CA13F607F262909BEF45568177C90EA6CC4BD4A087030075E8465A77BCF02D5A6060CBC05F30727C56EDD1000C07D1D08340A1AA1648569F861C98C6FAC0369A3C5A98DC60D13A16C05E300D4E83FE9B2E11BF28971A0053C5951994112A2A3E447752A4507DE7F22A81AE84662E9B67B32FC074BBB593A49C69FC0FF7279477F524C3C3939B15D2BFAE0AACAC474F89C2BDBB22B11400C39432079A2B12A10B87EA14B2568BF5356E5CBF30EAE498A3D08E4DB0AF34E342C3AC10A4861323EF8D2CBEA70F617DC4564638896258CDFEAB122F2AFB1E00B21FBFEA4C6FD5B080093604C3F47D4160A474DD11905038B7AF70AD6363C52DBEF1E77701CEAC9EA56201E10A1C5FBE4B7C7EC24C4915930FD96C0603590400E54CD19D18DEBB07AB19D175C2A80F0BEC5DF37A521FACF5101B937651FE7D391328E1EE45BF821428DBDF837911B54CFA46046F7DA98364B825135FCA951E00415E26FFB02C2F1776059005E8DFC376B296B0D77E3255FBAC029D6A0144F3E09E8D6A286B58DF012E6C0886C32E792254C0FDB90F128F5380E09187E9292500881ED025310BF594F9B7B51E18C73C138D055E3225907C98BDD0EA413074788F13BD06D1D0F0F4B706DF39BA63F4982BE6EF1E57FC8AA097AF443048E8F71E004B5F6A541367C5B7430FF1D37E5C291083EB139F6428E1400FF07C5CFB6CE202E9927BC9817479814A6D415BA13A8751108182B6588D32DE01EEF56700910C0085347F2F786F544F6A81FEBA01DBF05423882DCEA19A9A2ED146D498ABFFEE7600F34E7A6C6099794D408E4BBFACEAD54010234920F4ADD336DC3A2142D5080070D4AB7A8B2B78141F713B971CC76530F4C05B11B5228A9CD0DA91BE138DD2339B1C390F92DE1D66D5680C0ADB644620318DB58DB1397F80DFFE72BE15720500FAB37312F8E6B38EA8956E6415A1E67170AC986011DFB2D154C34C8EC6FBE79F79322CD9D53846CED56A22CEAABCAE07F1561FBA27FB7A490949E13F8F431200FA5BC38B7655AFB3EE793CE1073A85D1A93FADF93BB75EA4A734861ABF8AC188A925AF1EC902C71DD13BBAE3EB5C337889D65D95DF5FFFCC5C3FF146282515005FD1A513689BAC2CA5703FB05D1F9B97364F1F8A55BAE86A002DE9338875BEA41249BF07C902D3ABDD0688EEDD9A72DC28E6DEC9869E4B91FC2D41EE30390900 -smlen = 2777 -sm = 2AFF218718A060DD28D94BBF805129C5342D01A374B41BCADC377B0DD0D1560BBF50ED1A1401D3B0B31776F1BB6D6E0987A9D461BA918F59010734C85BEE8C6F6D64F305BDECF08BF6D71200BA781E27949DA59A14F93682149254DF8671017526EED080457801FFFFE1F15A1151EA0FEC01BB8B453CC1E98ACF8F6E44D5849930105F4B00D00F19590B4E3BBCFF9DA6CFF2457C238F5201C1963C4D8DE2313785C85441F4E65BDE675800361267B800EA43CC6418E431CC406AA5DB34006A2C1344B85B5D3E41454D382A77E498694101EFD55604A727DBF92534E07F6A31B002ECD401FBD62610D7000102FFC6C8EDE83EB1A1ECE800ED72C72A8C65A8FF766873090CB7E3B7F4ED01004DE61F07614F2337DC51A0C46C1A61030AB58B7DCF193D177452725B2A9220550200B64DB4300E510CF6478A94CC6A6D93F048BA0176609D9ABD61712E532DA739344401ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 - -count = 74 -seed = 5DE03CAB3CBD81B8805A17E0FFC2105C3BCDC8D782EAAB161A15AAA543FED59353C1FBE03E7F36B955FC51C9B30F0C93 -mlen = 2475 -msg = 5F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 -pk = F5E4D845B336F77B25987EA4301AE66D6C9F643740630520DCD5423A794560777D2F4A32E20B6E29FD1618B58CD9012121F90A61286047B507DBB65D10D601009B92E77DEAD2B15C2907743299CDA3DB44EBD03EABF9DAD031CECF12A65316C4BE5D248F44D5CD9D3907D7486EC2073146918B43C9FC17F96AB5C3B40A250A00 -sk = F5E4D845B336F77B25987EA4301AE66D6C9F643740630520DCD5423A794560777D2F4A32E20B6E29FD1618B58CD9012121F90A61286047B507DBB65D10D601009B92E77DEAD2B15C2907743299CDA3DB44EBD03EABF9DAD031CECF12A65316C4BE5D248F44D5CD9D3907D7486EC2073146918B43C9FC17F96AB5C3B40A250A0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EB7E379E0B14373D30D8CD5898EC4E44942A06E6BC3FD66BF2EB5A2167C3A10841438EF93C2F01A1CA4B1F4556308875A9E68C8D2F9E1A03E616F2A5AA4462F038720FDA1B64F9044D05E1FC39CF0C01839DF8F2F1C2ED6A5E0E00000000000000BAD6D2B608CA88CAB3C4D53291D0625C3C5610E1477CA683AC547D5DE1ECC550534C2380C70505331B8C9F58C9DD220119A308964375919073C977E8CEB5477D556C576B02C6A4BDDA5EDDCE3C1D8FE4ED231915FA9A1979EBE5FFFFFFFFFFFFFFB2075937332B8CEE5D6E0386D795FBF84D0D88E6762840EE009CB87B5CD41E88EBBDCCEFFB129418BF788C66B8F1C654C11B0D1CD611ACAF1350FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF856B4D100B3C613263A4F41CF424D0D4112704CFFBC1CFB239AA709F8032C900003549B1FB23A91C20E959BBE07FB26731E526FA8BB83BAC75080100000000000000000000000000000000000000000000000000000000000000000000000000001B4A96B462E41B99354AA692CB4C3F5F890FAF14EE87FAD31732A1B069001C4F7D327F9D6B080436DE9E0C2B534AA3EE9E4EE8D58A6BEF965C43382689601600D8509076D0AF4BCD4EBB64DABE483408CD6A3C0B3D6C3CF0CECA73090EEDDD0EA8825B0FB60067E28DD963FEE242078AEB7472BE49D6E42F98B821C04E1D1A006F8DDF1730A14F8B0B92022854D7206C7CEE3D5003EEF39D02CBAD48405666FEADD7AF51C416A32FC909799A41A61EECAE449FF3174FA59D34CF8B55997008007F3A1ECD229F5649D1F6A2EC865A51930B9B74D801378B3CCEA573DAEC6704FFDE3D4A71AF44925AF159EF1216E1873588D586310924365EA9F69D0FF53D21001740B83207DD536672FC25036A740BE014DD46529FD15D7035DF7DC759D4CF7D46813819398132077D60FA7DBB802A4469B78506CA46B494FC93828808001E00A8A290876EA548FA806787708A1E49D9108FCAFB0810849E9181E2AE0DBBDA3A359B8F6E572E5756006F554F533C213A1BB3EB2F3C900859B345C32C278D0A000EE544A715D7F5CA4B49AEF2D1AFE97338830461B5B6842B472DB7B6112887606EAD0C49FEF8270768428DC97EEF3B4727C27AC4D042F57C5286F0B89A0800007577F3EF62EE555B761DCA2AB73A3CB57993A70AECE278505235BF23037BD6E35540D7E6962233EE7300E41E8F091C632BB583C521CD9BB3306DFACA277905008B2D80A794402709C050C5CAF1F8E9281140D3FB6C901D0B1B4136080881C663F996BF77D3AD40FA43773AF82479BC09F002BAACA36D94658688378A1C400B000B248EFC2A45447ED04BE1118C1A1413C755DC6942305CEAA1BD3783BAB0F41255D5EE83A690C28DDEEF76865760F1FD8CDE37515DE13E5CECA2A58F6E02210091480476C01E0A516062872B941FA81C5D97E8E4315B38A1DD683DBE8F7974FF84AEFD575C3B72D824EFD3333E3754E7CD4BB5EE08FABEEC9AD2234B59AF0D004D9FD5B3BF2D70F128AE61FC3AA0091471484B3D81A00FA6823954C825938196D5D70537CD4E92F6309E1326D23E3BB8D88E7775C43E10B986121550B94808008454F68F552CAEB31625E027AA0F29EAAB352DF7448D9545DCAEC3BC0BFB4ECCD3C06E3321D6214F18AE570CE4E52A656E7521F0AB49E43D9BFBB7040E0C0500A1556AFE9B9A9A6C3B8030A29C0072139A17205E706F42E74E1F8FD5217AC3EC606FD6D365324A915B13BCFA7B07AC6D00036B55242DEE1CC5FCF162AC602100 -smlen = 2810 -sm = 440AD712BDF1BBD3E5B6F54A7E2B93574D8D019A49976CD42D056A57F9171B722031A5880500287451211BD679F6540D93EDA55F788D03E7008B076F1A9660811AFA533A77221D92E3E3EF01114BAA3EB312F73DE5697381990982C700420130DDC98D7AB6314EDC29A55382940E13415301EF0C73FD1C84C391D8F6686531A6D823E067007753BA91A25AC35D6A7DC6E26D3A881AD0DC0134722F2E89643B95EF20143394E0B16F5FB2009E07231E90292B1CC1DB58219AD227679A9101A400EDF29354DFCB212A2BAC12011F12B3BD0014FB71E4F1D385E1226BDD36172BCCE2ACA801715560BE3DA252E5A460A2395EBABC794C75015075436B6C629B570930479CCA6C25CCBAF20000C15EBE089C5E9ABC0FA82ABD587CBF14A60B104B06BE362DFD93FDB3002D39390703CE65C8A8C2948A379AC84E71A48AB756E9DD01F3B96C59BB03AD73DFC369EF1F7F005F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 - -count = 75 -seed = 63742CEFAE9868C3C0B31DDE0F9D378FD5D71BE7CC3F0B6ECD393DB55FB043CF00264852C45D1836CC12B9C872A20251 -mlen = 2508 -msg = 9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 -pk = 864407156D0092C68EDE2BFF4A065BE853898E85FA86904594472AEB943A2FFFFB574B6C556A23EBDFF07CE16CE0CF48F5637BBC636A3F9800A6C59B8F571A00F9B7949B186734C6A1A96A705C13A76247F37025BCC9BB8AD8A6F7AEA673D43918FE5BD530D59C89F8A68D32FA3234F3A0CE9A27C9A056F8EEE69B5C4D9C0800 -sk = 864407156D0092C68EDE2BFF4A065BE853898E85FA86904594472AEB943A2FFFFB574B6C556A23EBDFF07CE16CE0CF48F5637BBC636A3F9800A6C59B8F571A00F9B7949B186734C6A1A96A705C13A76247F37025BCC9BB8AD8A6F7AEA673D43918FE5BD530D59C89F8A68D32FA3234F3A0CE9A27C9A056F8EEE69B5C4D9C080002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C948E5DC6269AFCC84524288999519A8F3D8CF639C7C39A38DDE232FF745EA868AEC0D2EDEB59CB175603798C92FFC947E26B1ED819E78F6116E5B70CF5854DC60A0F5CF3363968AB0D26D31F4478279FFB31BC94CC0AD5BBBFBFFFFFFFFFFFFFF060AD033FDFFC36702A12BB17CD0BED8A61AA86D2536A8544430C495FE52D479E8B7DC2D38D0F6E11EABA95C4D9D9B5F54335F000AD81DF268ABD78AC75CD2D76D8F21A43DFA06A146537E3BA2EA831330F4F21B8CEF54B7DDFAFFFFFFFFFFFFFFE20F744A8AA8E9EE32428A13C1410EF16C55A864C75134F40433C222684E8136F63C022A3BE7BD4706E14A0D25128850F89B542CD5FFF9F953550100000000000000000000000000000000000000000000000000000000000000000000000000001970DF141B7892A05CA95E3E3BC0081785CD8DAD4DAF218355EFBE9151AE455685520B9363AF82DEA9708BE532414DBC7A58A936891CEE9BEE65030000000000000000000000000000000000000000000000000000000000000000000000000000483FA2EF78061174949950401593791EF5E0BBF62F2D7A9934E69CC8853F27BC8F441B4F1B0E84E3CF3CE87C8A65E7BC2CD0CEDBFBCC94AB41A19A348DDD21003F0EFA0F4A8C2FA8AEC5A54BEFC5BFBFC6BE6E74A571D616A20983D9AD907C0B7DD4783A67DF6A6809DA1ED15AE7C544711E513EF40F3215A34DF5B132981B00D09BBA0306E9C3E09A15A4D6DC8D6EBCAE43AA16253B63D0E0AF07CDAD5C05981A173E1EEB81B2236F3C34A621A9854C38038F3082E56BFCD19686B447A416006BE6F8EA41F0D97CB037F5B0B781D80A8C78BDE05D9F6ADDFC23B3E7C6061D9EBAEF5575899D3F762FCC41357A2064E9EBA89F5B37224E243BEB3B8E4FB1050072B51756854D2369D3E83AF78E11DA75EFABD25F28A386444F3490AC610046A4ED37163C9E9E41C509987CA6F4718C9391F89A6571B77C3F305A520036BE1600444CA0977013837B9AAF38DE66F4DA29A77A73028096D3B186DB7E594B8D64CFC47306DEB4D7995A727CCA317ED410AB41E3FA1320DA22E1425A7EBC7C470400BC22A880D58A3A95C7263F33FF1B77989AC71EF2F71299DAB287764BC15D44CBA16998C1ADAC57F2FADBBC85682B88337C7F4C30BE3134BAB51DED207FFB1F001DEE7DA9BE377A0A805AEBCBF183FAE263DB24EBF1B38421A71F321DBBF88F308D44C960CCB6F16CBFBAA6AAFCAE915D619AB8701BF25361FC8C9EA9947213005B949784D35850DCD1D5659D4B408B12BA6DCA0B8D5807484F069889449711ADE261409FC08E287030649522AE96FBC6E15549CADD3AC8A1CF4B33E630592500A959CDA64814AE3C1427D00DEEB778CC2322AB6FE69AA9BF3044CF62AE4D8C840C65A03166FF9845C2B611F9D32AFAFA205E2A8DD715E85EC4D1A9BD6EF60300C4C0238D6800D6F81C4F8281FE5E1B8829F73065D5E4CC053B3722657ADFD915CC5670ED540803872B6D8D5E7F2FF953953E46566F7BF4980EA9CF2534C003002FAA64BD09FBFBE2BFADC85B128E1A08C79195AA7CF28F92CA4CBB0613BCFD15DA17C899D5BFAE98E2AD2329CBD8894D2C97BED60C55C8ECCCED51FFC8D109002DDF8F9489EC9323E96F20C89C2F12126E5D3D9D9F4C1824C6C7A39D74E28E77D9291C13D687296F96E31F4655A88A587AF944514EF2683C26347C9D37D80C00D8F3E7DA399BD96A95C531D35031782A8935727D8EBAFFFE08D36757FFE8DCC7D2B422F795778036B38C5250912B8AD25F91C04D5D2344E5FEB09829598C1000 -smlen = 2843 -sm = D6263FF65176384A6827337F80E15022B4C70149AB477CB2321584F42CEEB1BE00197C2BDD00894A702A41F5EBF882392F243F9DC21CE70101FA79D663CF4DF3A9161A6169C52E84F2FBE50114A8E6CE89E94C7B617C793F0EBBE75DB9D400EE54F0EB8257BA80CB8E1788636DFEAB9208016F9E9651B29DBFC2EC7526C61931B291569B014845142DB81E52BE291253145DB0959644EA00752D972D02979A17D99986FD736C2357261301846D753461C4DA89455797E972C6F76090F4013CF3B76658AF95A3C5D61BA2524E08FD065C00C9C31E2FD1A9C186B01CBB29F27D7589249300B3EE71421E03FD60E22CAE8013CB0B04C8D400E025BD08FF13B92AFCC791A18BB5B879CD7B000177C689B103AEEB04AD500413DEE8D0301FE1C9676419F9BCB3BF3E40062E4EE30403CE320179F8894136B6EC86A98C759387925A003D28B85038DD3099F0803B066DBB009FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 - -count = 76 -seed = B887F07DB5358C3FDC2402947BBC87ABD064B02A859FE8DB37B5BCBB916020443DABA5534A0778FD0B1C05EF3ABE6269 -mlen = 2541 -msg = E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 -pk = 16E7B06A3D992713CEF14F558C78B913452E11256093C40EE13C821D324079737CC7B3ED024EE0DF154062162907F40087786C2B0CFDC67A26C56CB23FA622005C6192D5234F9462B6BEE76762A94A757B954D5539B1B7891F2AD8243E2507B6D849F1AFCE2C44D77AB819A84E61E5CDB2E3CBFF48FAB58A46108F229C500200 -sk = 16E7B06A3D992713CEF14F558C78B913452E11256093C40EE13C821D324079737CC7B3ED024EE0DF154062162907F40087786C2B0CFDC67A26C56CB23FA622005C6192D5234F9462B6BEE76762A94A757B954D5539B1B7891F2AD8243E2507B6D849F1AFCE2C44D77AB819A84E61E5CDB2E3CBFF48FAB58A46108F229C500200020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009086F4910D52133D0232B76655D2853059D76E61793732603EA4CECA179D27FE27A4C5A7B7EBE442C787ACF33E53A91CC6696D12D17070ABD88A8769D42ACEC8D7B148A91256C292503EBBA12BCBC90F06656B3D2DA8E2EA5F0800000000000000819F39763E8EA7299A51DDFA69109CDDF2A03B465385FD50999113F9C4D06FF2B085FC45DBDE282D4C723FB023D18D3848F254B4EF9976FF2CB9B3A1A66C2CF2BA50D285729C7AEC219F30BDC470F4926E121AE42D849B6693FDFFFFFFFFFFFFFF27A845DDFD5A1A8A600CFC41AF7432EE649F590F4514559657E855D30EDF01767EDC17EF3FB025A5C6AE5651E457B2E33FB6C15013F34680F374FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44F9BC895FAE33D7BC24BD0215B2AE0D6685B781C47053B8C7D3A4B89F5E9E19CE61D2F1594EEAE9DAB39BA84C103625B45F813D306909E89CB902000000000000000000000000000000000000000000000000000000000000000000000000000008A6B5DB1615E92E307C4132C7ECA6977544F364843C1D6B5B6DBB7D3759A3A4D286EFBCCBE420276648830FDB7A5167F3F8AE94FE387490F4F6F9317DAA12002A102A0D5F028082DEEE0D7CCCF97D30980D6D1655D19550E1F928535810EE9D2BC6D14FEE09624F3C08B74C6E4B14E88535E06ACB1C18EB66777018AE9C080005AD682D89E10A3E89AF9C46F79EEA92FEFE98F8322108320176566CD6457499402C48B3A527B896384A161BB7D343541945A633E451B0BA7B136AA834461400813AA20106940B511DB6DE5F8E2A71DCA339BB32CE12E5330DB1E3A8358FE0BF0B788AA0C5C27A3AF365BC2692C053EF043EBC897AD2CC37CFEF28D0386E1D001EDC8CA34FF5D9BBB98614500C6300D974F93992FC4FE4E7C34FFD1C1EFCAAD5E9C8583DF1B697E4C4396F75EA115C8AD1ECB3C1B1F93D0C90DABF5D88B301001DABD780C8D3609390F565F644A9ABEE474ED106DC59FA1FC51CF7172399BC0EDDC428DD4B6C79040CDF43EB462DB213C457D58F54865CB60B1E8FA0C3EE1600501691F6357D896A44CD3B1CE413FA31AA770BD8C918353063B7189BF9298C659EA6B07F9E37D37362A4E5B81CF89C80C89126A6F324EFBB24CBE514F3CF1D0066CE214ACCE5DB0E81F376221C66FBE748DB0114B9DAD7F103B238218906C35FC258E74F7604B462214B8C083123937DA0B3E23A1B8DF20AC52429F9B74F07001FD451256A8DC9C2B05929D5B14141637B1CCF95EEEE468C9BFA0CF54E3714B1C13DB8FA1629CCFB71D65265B888454AFBB9DFD386137F1BF7F618486010030081692EA72D4B4C9102024E3105266DCBC8C8459B2955DC9CB5F95D7F5489C92DD45CDBD25F3DD4F2C7DBF5915CB277548F0DA0E78A0B1C017989EC04917C1500324697A173DAAB263117EA06263040DC331C72A4AB33CCAF90469096C04ACD99D7B30252B08D18D91A102E06B169567D1F9CFE1376F8F8862DC8F1B30CDB00005BBD12136A74F489C643CFA8C7335215E6335EAF16274D9B6A82B7A54A4FDD7963084B7677B32A530CA88498E1C0C2816E13DA43C7C586F24136FE60A81B2400DAFC12A48FB83A00ECE1CE17692EF37442B9B9FB7B7700910B2A3666090500B4320685B14192FDEDB6EB32F20D374392CEB74A56207A39C83110F3521FC603008F27CD5632645EE2981797CC4C3303E3D20A8BC482A53BA26B47F15A589EF64D376C10B46156E0DDA2FBA9561F151C9473C1303494359D5C4A02B99DBDC70C00 -smlen = 2876 -sm = 14D383126D1C5ECD96CE469A916E7E0042C90143F43025FD87524283DCE877DFD22EC0533D017766405E1BE8CFDBDA5A80949F3FD5915E270066443A12BE14DFF149174410D40F205646F3006A6C446F1952CC713765E81CD0B882B04AAC008A3E0DC3916AA0D1AACB86A1D39836B2A4DB0018BD0533646324AF289716CE8A6C77716F140149013DAEB803C052AF170913893E79E7E8CD0191F8273130533B92C2F43F4930599585C1FA01916F89C3E1D182353F60754F593875AA0653014B06943763A47635B342B12C81DD07EDD6000013BE84AFE740AA563CA3462CB6C0D89A7D3C00444BD9FE08FFB1C9660399D5B627102472AB00B0B5A030201B8055F54D5968C4C98C19714E010031F92E13CFB7A4C85C5C099B9B789E8F0770E1C70A12A49905A158BF002F4EC40500E46FC982A199177595AC7B386350453116BA00965DA8A443DC5F9F6723C77A5C8A01E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 - -count = 77 -seed = D08A139CC7147ECAF4B1D1E434EB2EFA2B2607B0033D8BA989133E496DC9F3654944C7AF91CBB79866443E8C4E8217ED -mlen = 2574 -msg = 34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA -pk = 73E482DE3EC9DFD49A6131CC3FE5BD41BE43C4750BAC057B16C9269AACAA35647608A90643D7139F7512832D609A77B4DE91E031724D06467FBDF6B3724A0D006AD25D86A8722E7B84AB167F91C42E5F8D9C51D0396911E0016141E32C1361D0DFA4D100927B17FB6D1EA40BCEA9C08D7111682012B5D9AE460CBA5B927B1C00 -sk = 73E482DE3EC9DFD49A6131CC3FE5BD41BE43C4750BAC057B16C9269AACAA35647608A90643D7139F7512832D609A77B4DE91E031724D06467FBDF6B3724A0D006AD25D86A8722E7B84AB167F91C42E5F8D9C51D0396911E0016141E32C1361D0DFA4D100927B17FB6D1EA40BCEA9C08D7111682012B5D9AE460CBA5B927B1C00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005BE6F0B034DC3EBCF1765F6EB08A2CE8A6C8D7FF65BA9A2CB62B654063E15585C7E2464A8F3A048E3F98AFDB0EEC750D6B9BA6F037F396EB93C1656575BAA026C92592F88705D350F77AF7428041C844BE255FE981C042A897000000000000000096459FA9D608808C64A12A33516176CC87EB13372989FA972A711A1F4CE93181381CED374B9FBA5C892A3515FA6A7D6F98F04D0788055D9FCC2EE7AC149B52DD67FD2AC3D084669F1D7F49C3FACBFD0D02942D54433022ACEBF1FFFFFFFFFFFFFFAA0A59FE6817E25091566F91F6D76ACD7EF8FACE1D95F939AB25AE87E6469FA0477509ECFB125B6E6907D68B2D661E3F97597187C7AC7F5CD111000000000000000000000000000000000000000000000000000000000000000000000000000000DBB676AB05B952B52ECC8A6D414DF2EEF9E3A0F25977C3461F342C8C389B41D765DD01DD3E1973EFDF0537C61DD004ACE3C3654485D833339F220300000000000000000000000000000000000000000000000000000000000000000000000000001F50BE5F935A4082551476B621C67D0C8421F8515A295511A0F9E7BF6C67AF0CE37C922150D8CB4716DA148F8E24BF782D4E289BF45CB6177463810DD649230031A0DB0E82EEC36F45A9E8014197BE3D8168E739B3EC7DDF8C4F91343AA235C72001DE025A89D4C07C83A7462AD368BC6C3E5CDFA6539FD0D38EF3E6A1990A00CC0589A8C9A4032F74B4970C89BF3FBA3DB6EA92BFF9CF21AA6723128409398CE491784BA385E63C36352347D87C1C0242797652D76EDE8EDC5B7EF7BD2D22000D5EF14B07AA447827FCABF4C8BB45246419F7ACA683EB8E64B76113A48F1A2E6AEEFB2C86F6EC41FB25BA4C1F70B8FFE0BC9F5A18CA4B0A50E621E4F6FC0A008ADDC70EA589491BBCA303DAD102F03EC05B22FDB062A3966F11FD337F907F194583081F0B510147EB0143D5FF36287EEEF217C467A077C866A1F7E05CEA1B00958C9ECA7325BA3339C878F4F91003647E9B5C21950A866A6B7882F4FE496444ACDF07863F528ABABB6008D82F61D1810DEBEDF9F9461A5F4E7018E6495922006C42C4A839A136C257800A48A269B88AF7563931A3E92604EA7FD32E3539079E08682F1D91694A4F8142D8CEC2B0E314AAB6DF936277306CA8B8DC7EA0E21A00562DA39CD2F2F38EE22CD72403BB96D4B84D97C25370364B0468AEE36F9E04E2966C4DD4D899AC5FBF2C60E7FBB101B2CFCB2A6723A9ACE724682FAB4F7E13007BE10B70C4EFB4A9E83E9AC778BF56C864D2B0F3F746A685CC2AA4868908115AB08A90945DCC43919ADCBBD4AE843501D1A0F09B09D63DDD8E4D90DF4B270300EFB3987978268D626C803562EC4E512CBC53AA33FF3CF578610F1A2975D7711CB47A1EFDD545AB7300622D6353E51B63B3E706AFE869D355B2CBB441C10B1A00A3E6CE70A88F9211B92D5E439009D93D975B141019ABE0C0A3A29DE0639D20828FA47BB9BB87EFE0822F51C5249BCA81517A780AC684DA980EDEE98C92180700A1FB82DED9104EB9AF1F346D821D09BEBED4EC7CD531FD1C08C788783F9BD089C241EA446564B06CBE958096AD2EFECD0C5603A5630CFCBD1415049047091F002A7F6A3F286393F0A26E6EF4C9E21C36C97B3292927C1B03BB6DD06222940EB975222316F5085141E254A70A3FD145D97A50551A92DC7BE99E8289EAD3E401006B65E0E4CAB1332A465F57B227D44B36310DFC36E4893B04928DA9724CF867F2E0188088DC9F3812B00960F5188190CD91AAE24BDAD146F40BAF0FF675B61F00 -smlen = 2909 -sm = C652A08632D74CAFF5700A672D8A6B830FE401CD0BA2DDA94FE4156F811E4F5F5D6716734D0057373B7859A6A1771C89DC68284E1F60325F0131EB51800D27882C1A77E27B5FA26A18244E015B7B80E598CE6DED7B187680BB3AE728478D0151896CD9A27D330B8544E9C17D86495EC6C501E2F0D660EE0F197A3DC398D9AAA01518798001FBABB2CBC140E3A0882EE98E24704D77019801ECEF037FB31C1E47CCF0C48B5C8FF17C7488016EF41EFF552BCAE6A4A3161DF1C1F53CCF6701AE011EAE26DB436AC958E3CA1DF9A3E0384F005F201F172BD2C13012A72382DCD6C12374670145FBA74134B200D2C40EFF44AEAC09F1D24501209ACD24D8B99D2D88881124321F45E36356000109B6A2E84645957C7ADD5E3BC15E0E90E559EE2C01E1E40886DC51DB38C13757030214ABB0FFFBA795D3F5246696981229297B42016132912D98B0CF955F73DF1F13C30134FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA - -count = 78 -seed = A315BCF0E6835892ADFA07C034BFCD39F80B62925A95490B20170BD29378E11559C7F1CD296377FF1E01284EC727FFCD -mlen = 2607 -msg = 96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 -pk = 104ECCA7FE32B5DF736A7283790A34BF41B62EF014521431D112ACE2394DF09EBAE4C04ADEA29C88A7FEF6D7A2FC3E24F60950E5A49EB1A0F676766EAD73020003C344D2C559AE276AEF878542842778F09D3E57FCED8FDFBA808BEB843FA527445854BD46ECBFF06379782214D34F41F391C9840F2C435CD4C8EA2E47840C00 -sk = 104ECCA7FE32B5DF736A7283790A34BF41B62EF014521431D112ACE2394DF09EBAE4C04ADEA29C88A7FEF6D7A2FC3E24F60950E5A49EB1A0F676766EAD73020003C344D2C559AE276AEF878542842778F09D3E57FCED8FDFBA808BEB843FA527445854BD46ECBFF06379782214D34F41F391C9840F2C435CD4C8EA2E47840C00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002F7CC2B5463BFE9D584C138298D26547E925CFF4F2B76E22CB988494D68F7C8A5B37B51D301CA5BF72CF83E0CF070C1963CFB38F7F69675F7415896DAB0E38779060B2D86D3E583E23D1610956E3B5161943D5ED80EFF954B30000000000000000E2AA6DD8C44D15A8B950114990ED5ECED1179F14AB09232734FC961AF43D9EB9B0233C1E076232A2484410CF239834073A3D3A3882C09F208CDC684E55A6779BCB158CD2D965098D7A1836F1C5DA252BD2D15F9226104474F9E3FFFFFFFFFFFFFF222D1ABF5CDDF43D5E1BEFAF0BCAF4C2B79730CC223957615E4B2BD5E3BD77009B3DC34614E4C28E4D43DEAC96A0C55189D4D602FFC17487A5F3000000000000000000000000000000000000000000000000000000000000000000000000000000510796AFEA9E60D2B1F5CF5CCCB97D03700B1196794F831066DEE6DA20EA7B03358C2E60074C077B9574D39614277FEB450FF248777CF1D45F0E010000000000000000000000000000000000000000000000000000000000000000000000000000B3A9B64389445CC69D1250685B8BFA40BD53B816B573BDB02AE1ED70D2D39A9CC52D5DDAF3FBA37EAB4E11BE577A57026B02C96E0EB343C1F658AB8BAF6622003C97AEDAFCBB09B5DE4BD689863F17B343E44993DA82995DC7BF78FB3FC473EFBDAE24D1EAA0C1C6E968A46E82C2DED2C47C15328A3FAC3D6A535DB5FC551500CD7EF765502201DD005C37759BB3E18A7E807D662BBBBAE2B76A6B66F02F546CFB7F713AFB801B4C8F0226E5D2A9805A2BC99E61535C1B0ACB7F5A2BD52418007C6DECF892075740AE25BA997FE085DEC738C4573CCED99D7DA63EB3F391F83319AC52C27CC5CFBFC98C0AFD116A771BCFDDBB2FEA00AF363D3FF72097F114003B573C7E615EAB42F80AED693D9491DBE1003907A5C782EA6F7B589D372CDA27F579FF9B3FAC829CA69BFD4DB330E19C7BFB432C62345C15E5666543AF56070099E131C44176A26186C2E0D6333EEF3156A6B9616798405360761A7784F12486E99876EA6B948C30C62110D6F288160801EED392BDC67904B6B20F4A54D81A00972C2E407E4D62E0E9D6522CD1C03FAA5C1E3F7A6F01F651677E6D41ECEA5B61AAE36FE9CEDD1243D0828C4295E74AB72E7285781482EBB96F7161B228A10B00F127C3254509E81D5F90415CDC50D1D6C6325C38E86F5B80D125AAD6D6CA775CB9EC8674C350C01B3FFFF017BEF3D683D00D73261C9431661F3731C1B8622000A181101A6D15244583580E52D77A69AE17C5D644C994D52694DF7C381B221005485B273E0F188F7AC2D6B50E211A97DD356FFE1261E3B69A605C33D91BF223002689AE082DC0ADF8F1B3BAE02B8C4BF472F100F6C13A03B2EDE43C087B905DD45924FC7F71EAB7AA38CA32CD9AB429E107C50C824D4446D74AC5E16B9AE30200DF8AE3EFBA4112E8D865746F0ABCC642C1944CB7008DCFCFB8B80AA901AEAA5E5D82FDA42A2B6F13E2C2F9462AFB0D3153E3D4569F7C1D65653D31E80589020023B65C2E80A4C180E145BE09B5FBD6EDE50665F2485B7914DC3D81C29E279E09583A9682334B8DD41D9A7089FB3B6D2CEADE59C51710799FEF141DA7AF5A02009D8E1149FF1DC0CC3DE5B464EC1A243EECF00BE049EEF84B54F4F2FB34441238CEDFAA352AC912DA0B93B8FB658E47983344E3F0EB66DF202C6D089340191E0017AA7A9AB6FDE114E9D7A4B707EFDA30B2847B410092F7D4937D2B468BD44E36B9ACB24CF87DA214078424CA44F8BB66ABC6E7EC36A627595740442D70092100 -smlen = 2942 -sm = 1516C1CF5582CFABAC0977EE5CCFC861D50200BDCF27760DA7E6AD4D97B857C554FCD2FFB200BD9FBD7F2125A762A20F08E0D74D6C55AB6001B1617333087488139F5324234F7F3DD799B301EBC544A53FC1F883A0D43DB959DBEE04641701AC2A68F1075F7883F76C3703BB573362D2FB01C350D62EEC0EBB09F6B4FA78E73EEC69744F008FD545298EBCB04DC3B8D6E805BCCD613C37009CA482A9F248B1BBDDA48FC51AEA0538344C008CEF27F3E7429E900C79A59397B6A607C95F019B93226F1B3F8D9B473B93E6BB7D8E2C26A70063C568EED57BA7960975A0ED7A5184096CCD01CBE47F09375FB2F831D0D5D96AEFA961775400C482EF55636D42527194A7BA5A9387B8FF9900016BD4D04256637AD80467D67B0CE3DFBDB0557F9D31A34B769438993395CA00AD0403FA959D73EB4D5AF4BDD6958F6270EB91131901A47E49732C5457BB6B00888F75A60196AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 - -count = 79 -seed = 8B47E0EBE786914C9A52D547106CEB4A3D3DE938B3244E02E5F9660954C4C95A23F2476FCCB487673AAD0513820905DF -mlen = 2640 -msg = 2447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC -pk = D6A15A60ADCF505919B41E3FAE64146734E72F34F1259C32AFBABF88F934A2028F9AACB146A353A778AAD3F5EB607B03B295A1B4231A0C358A12D2350C2F1F0054ACADEF94D808498AF8C827685BE99FBF4849736BA5EC36261142C06E2B1BA98CF37D5FC5B422765F48702728CB0C4F2573939DCDAE70E365C8581630420A00 -sk = D6A15A60ADCF505919B41E3FAE64146734E72F34F1259C32AFBABF88F934A2028F9AACB146A353A778AAD3F5EB607B03B295A1B4231A0C358A12D2350C2F1F0054ACADEF94D808498AF8C827685BE99FBF4849736BA5EC36261142C06E2B1BA98CF37D5FC5B422765F48702728CB0C4F2573939DCDAE70E365C8581630420A0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CE4D508EF05DA176101556455FEA873CACE726B9AC3394065FA74718B55C824D342FA0ED868F0CB9D4C9CEE13BDB53F0460CA70E963D890F9C90C53A21D48FBE64793E29E33D5F924BA3ABD9A665611C11F7298E37ACC4EBF00600000000000000AB9179C0A555049642796D6F210D90CC8D2A23D3FCEDFD730799B3974F996D615BAF9DD9349F136A88C7AFEDC4449B5213FD2B43510F46E01A4F71262DB98FFD3A4E0604A106828FB779B4660EB609012EE580000D2716D363FBFFFFFFFFFFFFFFCBC2BB36C7472F95151C5A3AC1C452F64CC879689FAFF1E6D138321E32B2D7181C0446FA153F5B6F4493F4393B9CD7C160A32E895BE88BF89441FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42F7B51AF75709B8FDB004F33EC856FE2DE9999BFD8D8DBD38C24A6B9A12063493404B320FA7D62600AB2A86FD6DAF90B233B7FF5E4D1ADF64F1020000000000000000000000000000000000000000000000000000000000000000000000000000C6D9BB60D703C833F7C9A538EA3EF7365A767F316DC948EE36ADFD6EFA40BE4E8790FBC44AA50BE9D87AA3EC1EA675F86BBC6A91B403B53B5275976316C91D00AF2434BE22B49408DDB9B69B7F4C2367EA086B2387F728110D37F9FD03E9A7005A7D76FE51EEF3AF6781721F445CB450C461C93AB8F1F6B3A46D33C75F230200AA24903774E0C9A6F456BA4AA0998F5416351C9EF44E52A5B4DBE82C7091E5ACC4A3CDB255675D2A080C41D78E35BD371111C432C114F9845308E6499DA62200ACBBF1D3221342CF2B93E529D7A9039819C6BE811FB903F5F1827EA1F04AAEAD4AA9A92702060C457D255079A9F4883A5034A89978A506194E4D50A9E111180079840256E0BA397FD6E6134F574BDF4A11B1DBCEEEBE2D5EBC5786F7FEFC499011D94F03A127767A0E75FEA7562EF14674620DDB70CB2987F7CE3A0D93850C0051965FDE24656AC460DBA0F84900DAD98F1043AAA5EDC3CE12D6CFC15CE392E9CD2E7E1C20BF852CB13A294494AFEB8BFB3F2820B2EFC8FAE4D086B335D102004DA326BB02C6367854D7D89E33633B3D9C82CCD0CD0578F956D47DC390E7D4B3343971391D13A5D92FCEF257BD8158146D9F6F086790B32FC171BB95219000001EA1ABB24ACEA26DCC0A004F744D3C64D89BAF3B08C88A9693E3A828537A80EFD2C2B843B94DE8E93073DC4F708F17D5F8F81D238A4441BEF598967A1FBB160049D4947EE1CE66EC1C86E5B3A819A0ADB57F457383C5D99D7BE6AFD29BBB3AD01764AB2529E7EC4F6A074C743E249654B4687F6817F2C98086E8335563AE2400A055786E68036B060A7B5F0DA9B3D05584388A742A92C9269E5CE16B0A25E91D0E2B36E1C5F463D53B57A4590CA2407FBD71A5B04E9F305E382CE80CEB4B0C00A352FEBAD25F0A384660C1775F76091E463772FF6C526B61029537C84E56A2BBA145296699661A4F5E472188E5114C496B875167193ED5057850A559DF8E190058200F016D486D04A3B35DB8205FD73C0F4112D64FD69B3D62C2EEB8878B73077D21C2A03DD3C259EC992644C84FCD10D31FD7B3C8EB488CFFA2DEE160871200086F5B0C053DC1C875B0032508FC7F5B87EA730ED316CD615671D56ADBE64F15F21FADD2CCA7A0426E72EBACFD0E08413015A34EF473EBDF50693F56517A1F0058566C2A6691E79C66D2E3A7DC59E9D0711A879811299EF4CBA1E1B7CD0173DCD80C4E5B30EFCD394BFE96276A27FB0A4093D859583716919F93D96B60641000 -smlen = 2975 -sm = E7303D48E34D48E351A6E1E307A224A86B2401AA41A0ACFE453F53080E9F2D2026B0527F9300003EA17249781C9030F63947D39E33D586A00084B11B4EFEE3CC25AC5F60D6128A1919BA2200518601E1C55DF50DE9660F6BA8FE1175A99000D65F45391D4AA056AA24A7CFB68285BBB34701B6E0895C99D821105CF80CDB22EEC4F51175000C512E66669529D84E048A5A4C12364658DA0162A2D14EDA0617A753F3FE37800B3B0E9D6E00878F6A09B2174906FD217B9D5580FDB9B03500CE18A168F8960580466FF37014D865146BE101359043946B6859767C9CA45EFC178353EC0B01219A316DA8326C63059EBE8759E01D9333E000976FDE047D367BD295BB952C2B2FADF162A601011F8066698F3CF75E18844126459D11A241538E2FC3EACF2888E49CB44F04453808030176477311A5549D8949E4D0E6D787583D4201D68C96B31F29AEF65B9069F5CEE9022447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC - -count = 80 -seed = 07CD8F8AB7CD12EA7CC94103B8623D6F0FEA2BAFD2325BF6089DF5351BDBB9A94525C3C6B72D3820F2E4D5F9E7C849F8 -mlen = 2673 -msg = AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 -pk = 73CF795D3A6651C299BD434F3665AF6DFD31A7F68BEE70FD8E7692F04C73A1161D1440AAE16A265800909D19C64CF410566910D3A1659F1C6DF3BF11B0B60B0064886F70E63080B25D5067320EE2D526CB1A918C6CD865212ABBA41CE5CF56FA2032B0D4229B4EBF63C62F8F612A4B87FD3F65423A75E825F1C470E9AD3C1300 -sk = 73CF795D3A6651C299BD434F3665AF6DFD31A7F68BEE70FD8E7692F04C73A1161D1440AAE16A265800909D19C64CF410566910D3A1659F1C6DF3BF11B0B60B0064886F70E63080B25D5067320EE2D526CB1A918C6CD865212ABBA41CE5CF56FA2032B0D4229B4EBF63C62F8F612A4B87FD3F65423A75E825F1C470E9AD3C130002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C86CDEB4E0A9D228017948740CC35F486A47CA94A9AA25A7B00B9BA2F0179ECAF3396117EB19D96BEBA63221435D4196B8F8BC44228F5B69F0B5B80A0C917C81B914F01E255E522EE2CB93300F4B0A5F05DC07F344132E4DD20D00000000000000EDF1CD6BB81C89237172DABDCA905D35363FE8CE2A543B38AAC3C647251646C761E2A1E0505E18C526159ABFDEDE9DBA6DE2CFAA6C7AC5528E909AA87685DD5E3E71AE687ED88BF73D58F5D2F5B5A7221E3D8C539EB785B36BFEFFFFFFFFFFFFFFC5C1A1E9682B46D5026250A16F1350A23EA8C77FC3CFF9F258C650921AB4EF42F91C3DAE533958D8C4A6E4B88CB231ABC632B90778B929AB9B3C000000000000000000000000000000000000000000000000000000000000000000000000000000FCA599C5BB8D106FA8F2CAE5AC1AE8459C4366B93BCB12376639B978EEFB02BFEC0A276C953A264A0CBF2507B415198D823AD32B5B81888D40670400000000000000000000000000000000000000000000000000000000000000000000000000003D2E6B470BFFC87246F7A563B1AACB4B228B311824D4D3956D4D03A8786F0F6F1A35AADEC81F3D01B74639BC8A04EAEE41440BE22BEC2248A7EB195331380B004A4D1D0FDCE8B93B95E3216F0722C3BD315E170F6B0F768DCF1B2C12659C9AAF9E792147DF0125D1B0436B5105A999AF217E5A20F4C8B426330AD897BD0D180069D52F8EDE28BA794CB767C646223B682AA85AD0091E995835D6B44E9AC658F9F6B99B19CCCCB419FB8C513C89D9DF1C50466CDD82DFF27F2BD4FE95F2750000C9A4045EA4CAEEAFA2B475069FE8FA9CD066C084CBA8EC182E7A4A5C3F401ECA916C93279BC392A672F0625037D20AE63FD718FF95A3E3B1A35ACBF772A41200E90869994A1B8FC4D8093EC85E07A83C7A7DEC8A4686B57570FBA162BF15F721F014B54B5FC5B45782CC661AC4ABC4CD214E6AE3AE375589A95961060FA002000A167281A3592A71052ACA83292F2904DD5C2268CFC199592E968B504E6F286A165A09F971935987DB5E2D1B60F1AA5744A22A6DC8EEF30F8526ABEEEF06070098244E1BD01CA848C1A264A6DCDB2704969609C2EEDD6153C60850E3269E8197E865D7304CD9792E97A995C74F3DF89CFD07B7F272FB08E0301AD28904991100AA6834462730E7D0AD150D12CDBD443030E7E441CD20C4DB78DA147DF802A072F44550A620E83B8E79F6B47371E462EF786791954C5527572D52AF3BEDED1300011EE4FC855172AC22CFF90A8C82C0B125BA06A93AF364EC7D9FAEC34BE39702668A89FBADEAF0D38E2982EA4A6E2E5A0B24BFAC3C301E26D54C689B5A322500F6F395258A7F3B9908566A1C7DBA5CF7F5A220789E55B9C184F9FE0AE4CC21E20EC1BD749D7082438299B894452B5D409D18FEB417AAD43802009F288BD620002336BDBEE799EF49CAD6D4310B53F2D9C2B2AEAACC7F95925CAA56F50EB0208F2B0279B2738BCAD6C2426217BA84EF0C556DFE7071790EB550C1779C1F7208001B4011F4862D04E2E68D7B252AF42D61B08DD01611C93FE0B8E7F56E14E1E9EA95C3C03AD138AC0684967FA6DFD79B256203DAEE52302B6B3B1C9169C48B1B00A8806E582D9920198C21CA8A9B4F7D008977017D7A3164D8D954390289D5D023ED543088A8DAD6328C49DD96C5D2608101B0E15BB4C5B8C4766CBEB36F8E2400E875A84E0672D920E5C3C1A33420568BB68A68D8F3491B24843315007A29EC54399E3C82DDD0E1812C9ACB300C66EE8DCF1767C5997A90595A5BBA9EC5EE0B00 -smlen = 3008 -sm = 53372BC60B620DC158AD8BF4EF8FF6E885910127B321DC21408CF69EE5A0F8802689BF5BEF013AFA61EF4EE73731D2E8C9C102701D439D1B001C6C39D6D194983D009A5627F550A0C1F61E00081E49E8605A69BF292A82383C5D2EE3297D00EC5EC1539B59728983AB764C2CED11014D0C008024A858E2D9D0312A79CA87FBA1259E82C201701C0C64B73228D1A345EFEC91E8FCD85DE701A782D88AD19024B1A871A057E935744DEF79013563F752C1E89D7F3B58790BA3568A52D61C018572BB280C648106A94C373F449FFD32CE650166DB26E802E9E0912816BCCFE3A5E05352FC01DD5A77722DB24E350213A3CC02E91CD737C5001B58CD76802B5AEE3617564E19EC9A443A6A0101A1FA986C17BF52B5E5ED14FCE4A3AC0783A0B77AB14F5012CB750765E54DE9780302F250E3517E3F6F0CD04B27D4B2D71AD6C3DB0108D97B113186FD99F88D377609D703AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 - -count = 81 -seed = 3D598F7C498D8A1095C40945975380554BEF6142578638A7627E2C0A21C59C579F8E8CDA309348FC54C764C899FB93E9 -mlen = 2706 -msg = 63EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B -pk = B7B5B82CB9BBC97346FF6A22F50C9F8AEB366F067626E57E8D60C09B703F0C3782D1192AF0BB0BFA8CA36BB2C254AEA654BFC35E34145EC575C7A1A15C7D17007849B9A532964B6A8296AF206E6F056E5BF093D9814F5A91AB0F85E87EB7A22367BC232D4B5E2E2FE85CA03E8BAC905830AB4AA70F2321000564FE2E95930600 -sk = B7B5B82CB9BBC97346FF6A22F50C9F8AEB366F067626E57E8D60C09B703F0C3782D1192AF0BB0BFA8CA36BB2C254AEA654BFC35E34145EC575C7A1A15C7D17007849B9A532964B6A8296AF206E6F056E5BF093D9814F5A91AB0F85E87EB7A22367BC232D4B5E2E2FE85CA03E8BAC905830AB4AA70F2321000564FE2E959306000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071BC22CFD3403D59412B0B14C65721710E600596C463D2E0998A837EE79908578AEA4847101AF45065FC27956FF3757BD2D41299A98B6F2CA1D6EC6162E310B104F840901A1A5805BE8E1B5837A41A2BCEA8051B7F2F39F120010000000000000054A886BA90DB528900C38FAF85B01F675705DD1D4F83DCAA62D3C0AABA20128FFA9ACE6B611DE7A35DFA96707FE2C1C98C08D8913DC57C61C7AF6EFD772EA82C0BE8DABA38C875A46F2CE053FF8A1579EC405070C79CC25C05F7FFFFFFFFFFFFFFC8BC6B1ECE945178B413B3588B4825145DEADA884D81E761A5472E0B1C686EDA4497CE11B6EFB819FC83E961B709A0F796DD0045B0122A8B68A8FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87476D7DD6073BEDA9BB9608BD5026B0C6A68F87879A218505EB28C3054D4249FD1064838EC5406A036ABD450D887327F17AC301CCE85658F8AE0200000000000000000000000000000000000000000000000000000000000000000000000000008B1C93B05E6829A2882E47280CBE8AF276FEBDF641322126C8DA90AB5D3B2C564D7FFC771F81C1CBAF441C5B4F51202CD7F751A46947AE8B74C4F59F79B302004D543244E7CE3232765C088D93D09487640554028895DC3C55143109883898561B84569DBF831626107CBF8E28921852C96E33EC707A5711564F0B063D7514009BA72E6D4A9664C0B3DAF6B0506F6F2FC94E3249FE90A185B1293DDDB4A822257B7E6D86C7672AA2383EF6BF1F9FD3B887D40778B5311344809D0294C85D1000383E1FA25FA154660C2C162C72A333BB7E1D5D1F0E7CAFE2CC7D2FF8C4BFB640353678E541D0D0FF5852AB9E88F7DE7002D11DF01E1EB009DED3F0A4467F0D007C52C4FB1D82CBA9780379728A136466287792F8A226A7FF633CBCD0F2987AAE1ADF89F31A2EF5F7C241FED319F45DA9EA9CCBC65A1ED93B3FB5C92D65DD0600943BAA503116A3E64E23AA255A620CFD6A1143F6D1A8E46F64454D9E8E255707B5C4ACB301D2CDC2D641771466670AA79AE83C672E28E3123B8829465142100021D8093C9EC93D642DFC59DE7F9F6A63C38C102B559CD6F916B7A294BB925B930002830DF56C6A4D4FA3EF125637A145AB2EF6159ECDC0F3FFFA2853771509008FBD6EA011F5D64A7FEE0C92D897334E14BE99BE724E6661BF05A8921D825165EAE1476BFB6B94905CE655A88F7FC0DFFE14DE2466AB6E99B34B662ED17106003F73A010772E8ACC29054330A7D5EFFE07E2996D2E2EA702CB2120C3875750085FA50F03459F4BA4B60A7F399580F21C7782674667A1ED6E20A3CC6877830900988CA6DDFA45F2A586AC7E3A6C2AA44AE3054237FA0852778F6EAE0812A4910557F4A50C07990CF54BD5CF609C99A71EDF0B5AE8C69ADA76CF16A5F429FA1A00FAF69BC72958A3D2406C86985893E3984E1E4396AEDE088F5D90A8D601B7D1D9135D876F41C280619E2DEE553F5679D6203F5725B686EB8830047B358236010097DDAB79FF9F5427595EF70AF0060A0BA2C625ECB1FDCE59F5C6FE1FDE0333D4ABDF7D68C17B72F7B773444C83A5B4684B0BAF9FA048312BFD4AE73744D708009712D107A337DA810CDC7B877451A30BFF6FF80C2D54B6D3DEA5DC84394DCC4F6026B949E7B78ED97870257DDB2D491E95A9E4D6AC0C9B956410D47007D52100636E6E68552F371E6A23AB877E9CF4BDD55784F7C0AF6462D6E011AB818E3F1C1450D6C3052CB34AFC9CA4B6E7E7955A2FEE36913A577B8086DAF77487CD1000 -smlen = 3041 -sm = F5AF168F1A7C3E8686EB4A6630A7107C077B0071CD740111D86CCBB97652A148BE80FFA861015281449086BAD5B45C928CA61B1BCF688D990117AF48CC9B575955FC7E2F1A6090DFCD119E00C7A2FDDE7D5196DAEABF63CCB3114320438B00EE4DC798BA65443CEB4135E1198D0FEB9E690096DC014E9F560415ED175AC8E21C27D2A86100A04B65337BA0DEFB8D1B0C17BF8D86879A7901762B2E1D1E76A2ADC75FA2D328CC7FE23E6601E3822CE99896BD88A0766CE4EE8627827E4701489A219DB7A287D6255960C714C30E86960C00ED14927BC2C4A31864658C08AD05A49AB6C2006035EA4D0865E73A26F64900FE841DF85228001C70C34A3458930BAA66EFDCB2C9F18482CC0001239D12D54431876E1209E6C77C26892E359838F45589D2D23C930B32835395CB02030698616D2134C6637A7EFF410AAC4B1087E4004BC28F28CE2AAFD44398806D0C560063EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B - -count = 82 -seed = 6CDB757AD36DF99E52F535C2680431D5FF36C812D8EA19399F666F2FDD66D3A842A7A5AE1038359AB618FA58A0A6E840 -mlen = 2739 -msg = 7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 -pk = 3FB1CA61164F8D7615B64536975D5B0FDEA8702BB68DF9FDFC42FD545579D52D46619F10A2C095128129C42F4F5DD61EC0C9BF039EC4B9B19C69D47A80C80E00EF06997575AC4906A993081CE246564FCEB590FA1F8F0A61A12D2BD3DFB33251ABCF8472C358B852CA4A037A71EDF42E2EEAD527AD372B35E566749023F01C00 -sk = 3FB1CA61164F8D7615B64536975D5B0FDEA8702BB68DF9FDFC42FD545579D52D46619F10A2C095128129C42F4F5DD61EC0C9BF039EC4B9B19C69D47A80C80E00EF06997575AC4906A993081CE246564FCEB590FA1F8F0A61A12D2BD3DFB33251ABCF8472C358B852CA4A037A71EDF42E2EEAD527AD372B35E566749023F01C0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E8EFB4E236129FC4D8B1F8DB1C93CA708C2173A1E3B81380D7EB50999DB101A92E2058A2EBBFB6948BE6D3CF7AEF020D2997825D5A65D9F960194AA4324B082235F7A942169C111D6BE9215D3F243CFDA41DA3B1834F70F9260B00000000000000A10056B570506C6AB7F96321E3805DE2295182BB861C2DD0F9BC318EE22E49011875241B75A57C44306018434AFA611DE6DC0530A854117154D087D4FDFEF62B0D8B1F610050AEC3F090E9EE91486D0925864B840871A724B8FDFFFFFFFFFFFFFF5F5921357069B061E7B5ED5F56CFAF8FF0A7C765356962CEB4CAA26206194B37EB83D58E24FF47DB7BB39C19234C159E37851963827B42CCFAB6FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8083CBF8CC5F132081AFF8BE7E1CE4933476BDF49E4D34C7339BEF79E27BF967EC07BB73428E06E0C35FA401F052E797895746F3D834D4804BF010000000000000000000000000000000000000000000000000000000000000000000000000000D1F854666A8BEFDE403BA67DB3E28CEEAFF0936B6B7A88EC14F50365161F692AEBB73D023D508C9D59D5376BBE261925197BC73FAE0DB5F213EDE798553E2300C3B2DAA57E68D05AC991295DE83027FDCA11B3F1D3A09C3B02393E5E21D1187C180755B13757E8C9161A6A178A941DC82495F948E575F1668037CF29F23A0D00A40CC57D5750653FD2CC967A5E1606D95A12DC62389081EB63BF0D5DCE6DCE4C0C56FABA8A7FFA79E173EAAB306EF4E4F04061CD8CCEDD77365264CD4CB31E00CBA8E4A4D8D4B051AAF552825A9CEB1A85EFEDD1D3A062D287C57B3E3A58E143B8869CBFE7250FF900293540DE0495731980CA5B7F01F7277D8A66C733481900E50388143565DE47D948335DE66D6960F3FDE17700124AF4BE3BD8D1EA4C82A6EA93C8A70665307A3634F3AEFD23E92A48634F2CBDAD9FF74CC1B47558E904008E1B7C3F7D45DBA6CDB2D950D125A718F876BEC884C2B4373519AB25364FF8ACA416017513DD6E31B0C9550F5F129A6FD67F38D7BB6C9CFAFCE78E3D9015170075D60EF14F1380EE87919FE3BEB62657BC0E738547C44F2F95BEB59A2145242386500070567FB4F4E18E6BB117022AD91D11E7CF2127199BB180001EBD4A0100FCCA3DE311C7035755AE7F16FFCD75DBDBB8E9E8EAB327C4B7F11DAA1CF44F65485B36F3222E3B0C6953AC370D63704009101A871347AF27F7C690E88B3D1E00116914E2999DAB528DA69837A5A6F08CC90BFC0A7562BFBB4335E5574D0785F5B9472DE8884E3063A1A203D674A9D2F8DFFAB7E0EFFFC44F86139E8F84BD2100F59A842558681B6FB41CCD49F0871A292FB2D7F4063B928D736BDB2A6F9D90956E100BC5D1FCC2ECCFD153C46D76B552115204DD0C8AC25F18500620084C0800A5A8CE0DFA67E0B6D1879A0523BD6E8C9A891CE563DEFA12C405FC0CF0744AE442C9FB7DCF268891A748F1EC974BFF488EB770DBAC5002EC78B4FF1C87011B00097238897E9A0783A7E0AB319B0CF6D7BA9C3EE4EF54E8299919C674B398AA61A7705B32551FBDC56771BD5FCDCE2E91EE5FC06C4EC2B10735EA8817D3ED1E00D1DBCADAD90BD08DE06AC09F1385C2A31529822D840371823D218203BD333E67B8AFD3771FA420B195D635ACA448BA89A8D29013616102CCE100F126F00013001A706A000225FE0626FC6446EF591EBDA79E9D6ECF08FF28CA21DA4AEADECD6C3EDA3FB7156B62F66DF219C028FFFD8F79F1DABC65BAE54BF2AC89C387E02100 -smlen = 3074 -sm = 0B1D50AC8BA2C49B4E0D2EFFD8A20ACD1ACB009D7AC42A2CF0304381EE528354C1AFB26FD000436EB478D9B4913C7C5711E03D510454ADE4017A4F23C363573AB1F72AA44B85A23224F8A501AF287CF2A597F4B7763AE957132E5BEF186F007EB9158C9BE201E349346AACF0E7DC0C3E0200DE92169194587DACB375D575634CE1FCA52D010E1ED1400B48CFE32F75A5FD9229663A013C01E91D31190447C7A03C3D82F0A8FE5CE3EA490100B5060D4913A45A07F96E3BAC655EA056A101E3F5348B97814D85AADF764F5EE9BB7101AB013539AC36100880D6F14685FA162225EC8FA800ADD35AA9018AC7642BDCD9F7E32DBE7DE6DB0164565F96E5F7ABD6903BE40AE273C5BD3D830101F949EB9259FCE73EF9F1276B2AE0A71DEAE1041E76FBC833949DF8928E198A29040206A9A91857CBD5E3F0777AF6F01D79AA553001071535FA2EA765EA9331554F912A047785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 - -count = 83 -seed = A97269579EB70D268C58D94FF744329B197F722A8A407B788510DDCACA34C8CD4C72FFC14B76300C86AEA1E4CFA66BA4 -mlen = 2772 -msg = AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE -pk = 5F33C770A74A92C811B6586D77DAE889483D1011ECEDC70D1454C73BF6E21ED15E77DBE7D337E180BB094442EF2901A11CFE36124435D490D58BCC3A9EB707003B930C6D23C11369D5D06F4756D839D3BFDA72BAAD5756A3C814DB240123C960A3F4748CB05B00784D77FE64A0F31C6A45F79F40DC164C630FEA086DAC951500 -sk = 5F33C770A74A92C811B6586D77DAE889483D1011ECEDC70D1454C73BF6E21ED15E77DBE7D337E180BB094442EF2901A11CFE36124435D490D58BCC3A9EB707003B930C6D23C11369D5D06F4756D839D3BFDA72BAAD5756A3C814DB240123C960A3F4748CB05B00784D77FE64A0F31C6A45F79F40DC164C630FEA086DAC9515000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061A110E587BCB41D67B933E38D668EB3D4B58A1DE1A1386AC2EAAE49D58E7D1C8FCF66D8BE368B6A73B3C313BA62B7EDD141AB9A366F3CBE7666DD98E986E562C1AEFDB69577AB3BB1198A0FE6BA31846ADD1D606581AFCDE8020000000000000002D6A6DF9D5D840AD3672AD954AD945FC8B77128E603B09D3BFF06BC0A3F4B2DC7FF468E4A660D8C01006E7BEE7904249B77020842B0E297FFD1DC253569896AD7120CAC2231F4981DBC02B19EB2AF7302308E43765810B384F6FFFFFFFFFFFFFFC26F5EB6BAC58F2ADCFD86DA256E1B2BCF8B57B77E33D1F912E323E6C2FFE61D7A294882A92D3AA1CB5FEBA7637E81BD1E138233320127AC40990000000000000000000000000000000000000000000000000000000000000000000000000000001FEA422A4BB1E67E56C9DF3EC50D2B2B0D4A7DE03843108A4B6C2F481965680781E33644C4CE95EE93B49D13DEE38CC78AB4A819814DAB81166A0300000000000000000000000000000000000000000000000000000000000000000000000000007EDBCC8A388329CCC2A402AB396BBE6FD54A954A72B6020AE2777655DE71A05FB3B38FBA0DCDED70C86D644C852933FB09EFAFAFDE64EBEC615D51CF501D0C00674746819EB5EA8BE118CF4EA01A8C691AAAB2AD990D758D832239B9DEA2AD6D8D12006F8E464BAE270A1BA9E8315BC5A0AEFE8D342E05B9644FCA87EFE904000F9A0C2FEF8B46EFAB98AD1B13D031CEBE5E4246F329EF5BEC59259F9B8649276B612ADAB6E38516E9BC0D3C5CE3D638F8BA6FE82231EA89D3C59A1CCC951C008FE0B64AC5F535C92D35404D7A25829F66B0A4FEC8DD62E38A6330308C1FF217A0A08141ABAB3DB21DDFBFA26E7E01DCD3F6EDE0CD2DC305FB92973BA96404005FBAA2D1FAFEC8268632E010DA8EB01A91D2E2C79436FBA39D3A32FD1DDA531F37798CBA3D970F195DD516B01748B906ECECDCA222858331C8DDE9AF5FE322002D786453DF1E1235B925D7A5D6791AA44D41DAA46007A60CDC14337982ED80F084619AD4561EED3D734AE2375F6267928B710BE393FB32CA1BD2270C5D381600E9030C2FB71A3A1AC65A1674A976427B5D29CC6250600518E3FE93E9BB55E3379B437039ACC90D6775A942A1BC5F8C371A749642BDFCC5EE07FED72C029A2300156B6563DBDBA4C8D1BFFDCBB4B00FDA2C764BCBD3F555B916E4A612DBEB00B2A9492C02C7745F60D7446AAA437BCBA37412A71ED6F8DE1BED70B7CAF1110200F650E0E1EB3046FC2B9C30929B03F7DF1E7BC5673CC4F1DE96F6967CE98951D755725E07511A053EC2BE492B522FD4B1D7FB3047353159A2BD46B851DC7E0C00EB41D20373FD3D78B396D9E4658D6E7381D3A7AF57F2AF44BE11B2A4F8E5D08547113E2903C2D599A60B4D9A9B2E8F14A93510ADB011DE34448B227940381F004984190BC537F65DD82B65F48725BC3A1D357EF7D90ACAF959D8584526EBD7FA8A6AC437AE0455BA78BEBABDFF9B9EF11C62A1F2FC16F6BB2BC98C95FE420A00B5C08A09CCDC7C4B9E262EED41445930B8D96E65A21814E794B874BF7F8E53F732FF1C5A207BF78671D72BBC6910D19125EBF2E737306A89EF1D09E23D77110078B849564F87B5014FEF9C8FDF2BFCA54C817819A9B2DEB2232B5C31847F2B0876648E46A8924A1EAAEF39C744E0AD84DAC0BB57B4C7526118522D5E34D119002C95302E3C395574FF7A00F1496BACE4E64EC00E899ED8DB0A5EFABCABA2306236FFE463B15458AF39F3ECAEFB648C08C16AEE419A4718BB070BCE5CA6781F00 -smlen = 3107 -sm = DADBDA7727763291D8A8BF8050687A308CB8004E9AF3BD76D317E57B135A9F2390BA2BC87A00D29BAD392EDB033D319CD525C96CE56D37F6018CAD07C08AD3D6EABB6E092974ACD06BFE9400B7F1D80C1A62413C63040B14EA7158B935BB00D1E6A495F5BA29772C6BE4B108EEE6C8A8AF00FAE8D37D2E7C7728DBD0327899422BE2D63D0134993C615F4868C247779588BE977718A10D018C35258EDADF99C0551D54FA94A27E2C7D3D00031BBAAAE23F5176CD118F8DF77BC63700F50168C1725909B7B5FCB5FE36B20CD683E740B601B94D832EB031017B6658B1D5801E6C1841E2003268D5FC7345010240CB6C4B0871AF7CB6A60083CB38C8AE2B2E6A75C65C7BBE7B1B3AE88801016B66912110B0681C0A43BC25BE50B6E1139735290B4DFF7D894EF0C00C16149904030C73114AD15BA0DAAADA532F386008E69BA3015C98892BD1417AFA3EE14D29BCE603AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE - -count = 84 -seed = 483A81716F91A43ACA6764C4BD2A57C9156B762E9174EA49730A6BEB9CB19A0B3755E37BA47EC524BBE2FA25B9FEF687 -mlen = 2805 -msg = A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F -pk = 9AE0691595EA64C576C9CE0B508D670E359F4C3FF84D3265513F60DF6F148377BB7890275252E30F21438CEC2C7A3EB1830CC1EB7AA0DB627F8B63DE692620009B6CB304FFBAD6991C87041A4F0F66D23C097571712E127CFB7A1FFF39A3AF130AB36DB0D0436F3D8C8D90A2F24A8A99859EBD3475AEF547DD525FEFCDEA1600 -sk = 9AE0691595EA64C576C9CE0B508D670E359F4C3FF84D3265513F60DF6F148377BB7890275252E30F21438CEC2C7A3EB1830CC1EB7AA0DB627F8B63DE692620009B6CB304FFBAD6991C87041A4F0F66D23C097571712E127CFB7A1FFF39A3AF130AB36DB0D0436F3D8C8D90A2F24A8A99859EBD3475AEF547DD525FEFCDEA1600020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FA288B7456F999984F3A6637072EBA5B85B391607098C859DDD30D6FC2254EA4732879817E92AE1E3DAB081FFF81B0C233DE1D53CFA42E1459735DE994CBC0EDE64C50495D07348008F85BCF31FDD7D38CC2DFE5FC38ACF1B0400000000000000F6A7D9886AC8FB300272194F64A7703801FF9CC6F3010148DC966D21F8E7DF7BC9158DBEB0A8704515B6B495CDFCBF81F393B59B466FD34BFD77EDD292C4C35AEAE20A08013EFC1C3478CFF3E6F2711F89A45610A1C1BE3D5AF2FFFFFFFFFFFFFFFEF02C37B102806049868760306239F89D9A76D2FC3F6B59EFE9E35297F6666DAE2E9423DCC7A43E72942FB03EE9EEE2FA45A3BEBA802167CEE1010000000000000000000000000000000000000000000000000000000000000000000000000000A15EEF321DE921F33ACA63FC4727CB3D4E88BFBA0183C2C06498C4CCEF114133634FA2DCC81E3A4A02F018CD7E38B964F5ED121112386DB7853D0400000000000000000000000000000000000000000000000000000000000000000000000000009616E6A4CF40222D523582F0B957C59CC3D91F885AC898FECAD4D8685E11758E6B5586E1047A8273E596C5499AB6A7C043FD489B2318A7D860C69A06C1D307002D7EE555325EA7E29AFF6A73D96A93F196EA91AADF13EF6B91485EAFBAFB21201D6311C1CDF0F10E1ED73FA2CBFB96F2A2B2E8556BDC27800D8CF2B2A0BC1C003B82042E4B97CD517F0D430C19B1215EC8A211EF9237B1411E3CA0C57ACA04860809FAAA41EC960C28BCC5129D3BA125511B9CF748B19B3692A8B2D37F740C00098D3E20A574C7D684ED99280D9B1BCC9657C5D480151DE2FF053262381DAB9843B8A7B8CD5E2EB676A1FEC1FB431CBF80EADCD3978405BB82D4207E26881000B7141509CF2B3F718EE3D7ACDF74F8B40B2F24874627E1EDDD0B28E7240E9BD3040E92CADAD2E9216D486AB883BFFAD458E600959FFF96F27C3F0C75DC2112007CB506C2767AA50C8409EE0D6375367685F2135644A64D5CC76C3BB8C95CCB09265B7B83C6E6F453118169C84F08F2833D5F5C240E59FF77469443E0F0240C00A7557D657EBD9002195338EA78D181A288157F3F9E096E8A7EF8E1132078C9F7EE7A4254711F24FA3047ED3E5BF619329FD7278ED8B4BE88FC40205C21A31F007D6FD5EBB7A732D9C125BCCB06BF5A696633BA486C7945FC15346F7480AD6803BD18E0250C08F33256867FDE5A37D4A451E82A2AF495694A575C41AB28A51800465FB24D823846CE945115DCA61556F0601C4084C970C7C183A99857B327DA502C76DB19A5CECED3FAE492E9EB02AA21C8B69FE92E4208B047BF49A80BB41D00F50C25766E1D862546B09B67A5602E3276330A64BCCFD120126F43C4155B2D463DD0E8586B53527F1FC66F14B7D09FB93C948A56BEB94FAA43C3410FA2E8120083413FAC634CD9BE85B976273D1381F138CD690A83ABC74652CEFA3B06C2A60302DFFE3733859AD74BD4913BB18691D573071C8672697FD0717D56AC3ADC09004C4D470B2248EE1CF4DDC3FF9A5CB74E8F5AE82471B55F17CE50D13573EEE8949D173983E9D3CE4AFF10F8D4D0B267A5398E90E2219702F2AB55E906FC3A08002B76BAF7F1D6A1FB956868D5890E94C83BF269DD8E5DCB059B6E0B08C9B35B44D75C7BE9A14535E6FE14E8FBC1BAB331B890CAC708C19E2A5351380EEE250800AD8A8136AA3403173B8D26B0FAB934AF0848256473F7963AD3ED2D4FF668B4B4CA764BE2BA7855483DD6F67B0B88D9503B9AC6A47853F9C3C5068F7EEC1C1C00 -smlen = 3140 -sm = 6059221548F001ABF3D78EC4088AD1DCF7C9018F832C36B1AD854A9D52288CEECB0813F96600427A15599FD10E3586735D0DA7349710CA0500B4E9A064FA4251467D1F79F403712166933101375AD0FD5D784D6E9B1FF2F474E915CBA71A000B8EA27B9C30D20F041E7DA1FD86FA10AF2A01AF404AC952F0F05AFE3027836D685C110E3000C787B49A44323567915A8A02A3DA5F63F213016EF4958AFC863B22F5B2F91718402947655101F4241930EEA5BC59C352129E4DD1A98EFEB3011A8880DE7AA32A701C7640778925C1EDAF2000FA17D693F71C04E47A78C89D8FF6456301640137058169FFDFD66A10556B9ADBFF715B99A4008372FA4B215B2BAAC25F84E2D7289859D8330101ABD27C3BAC1BD18CF974793E4835C6A9FD3CC8B7A8455FD48A2E81C5B6C895670803455F6B7010DA8A4B06C587C7AF43E1A4831A00B91A9462EE153E3D98ACE8E5C04400A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F - -count = 85 -seed = 30F0E117513AAF27AB2516BCEADD1188B4BBDE76E57DFAF43CBF2D70723D941E8F875C5EBF02BD7D67AE81ABCC54440A -mlen = 2838 -msg = E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D -pk = 5674CF815AA2B5F434D759DFDA004F69D7D140D7583B9816DF783B45C039AC7E03BD1BE5B8CB3C06DFFEAA49EA463B78110AA6E453BA19E9A9F8A14F725221002661872066FAD4B22B21F3DA46486110C1D0D476FB6A9F6197FB5C2440A0910363BF63438FC005C971470EBF02564B75F629C771E4235BC79F82C3D9140C1800 -sk = 5674CF815AA2B5F434D759DFDA004F69D7D140D7583B9816DF783B45C039AC7E03BD1BE5B8CB3C06DFFEAA49EA463B78110AA6E453BA19E9A9F8A14F725221002661872066FAD4B22B21F3DA46486110C1D0D476FB6A9F6197FB5C2440A0910363BF63438FC005C971470EBF02564B75F629C771E4235BC79F82C3D9140C180002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F82C78E2B95D0E44188882E09387129264AF3657E6928546FF4B097DA763755ABF10992763D9084F790C61018C99F75246504803B05F460CFA94D657D827C385EA623E3F0CE9A94F133727B9708AD5BAB8F86E9C35D3F0688BFEFFFFFFFFFFFFFF6F18DD2994A7614A19D541129A8EC6C50A87EC808E0A00095BD9DC6A6D2A359D6FED2E101D488FEF3F419795A7C386793519E59695E460402F76C33B94FFCD5D7C212AE90CB70539E67CBE35F95801149860B57BC1CD4D699CECFFFFFFFFFFFFFFB1C9A119869249C066FF6B4E8A520D2430ABEAE8435D13C992A07FAA3156BC09E6C2A2CF6075C880822CB44D877408CAA2528DCEEEC2DE269147FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0044D14EEC013B563D3DCD8B31259F5CD4B061A7FEC3E059BF60765D4FBFF831D823C3747900B5C9B21033620BB800F02FF12B51FF38FAB72A6020000000000000000000000000000000000000000000000000000000000000000000000000000D190AB715F22781190D753A173C01BDFC0083C09FBA1F102C259408B21688454B44FA3060490BCC6CF1BEBD1E9DA6E2760D7222916729FD143226EA02CB01100E4D33D3CC96CBB781B55329251EE14865CF6A959D968CA64704A1DF48DF7630240F398E8C5C5064DD2A3DA4B737D6884CAB132BF498232AA8B1E50F66BB80E00E27973A7CD4739B8FDB9AA66FC65045E65EC791019BF540124118F928F98E5D16148650521031357B65205CA7D2D650034FF08965041204AA6BAB7ADA8AF0100F287A3E1AC1FD9D72E9E2C005CCC1C3E96A5434A85A4C4E1E49A81C0A7EBFD78AF65A745235111BE1DC902A19937F66AD656A6CFFCD7803B17501D567F2C120010E5A02B00B1FDE81B8BF611AE8760CE884102433B7BA22E9326123D4E636405837893FE988FB22BD25251F6C45015879AC4D77954E5B8D1CD0A9834815B0D00D0796AB66934546B5B6AD42772E6B924DD22475E117C6BC6D737DB5A793A2025CAADDE39339861A74583A06615CCF928BE507B76DE442F4FF659B765E9E1070026C4B351F2939E73E314A20B4597A772141B0C133082E35E8B9A7F33951C8459BFB5046115E4E80ED65DCBEDF3A9909886DB33D1A42FC28AD96039B72D2E1D009A2073F7BF7FEF3EB64280B74A07A1D19E169A7569CDEC015AC51B475D858A17AD772048A1DFD33C5C87964A5C2BD8C8E5764AC16E05AEC061BA1998FEC21E000573E9D2EA4F7AC52E9EA1E7999A1FD00672EBDB08E4ADD912268E284C3C39FBB29D6564F971809DEE3DA2C9BA4D8AA38438085D85300AB529F5FD7EA96A1800EBC0C9200524FB15664AEF2E7100720D6CC39B08CD80DE91F0352010868A9D682127BA87047544798E1F55B927DDEA718EB35B63C991B3CF9824C40C90EA0100A498D9ACD2DB74EEFE969A1AD97DF93E596328E4FAF4234A5F32B5B95139AE01DD8994001C7C412A9E40F5A346EA5C7FCB6FBA5D20FBCD60A05D2DAA558B220076854B3137B1B4A9FCBC2BE8CC536C4985FFE844ACB9091B7980A4AB4F939B1C25066F6F1C42BBBE761133A0B5B9AAD65B7E89C9FE1DDCB6DE695AFE1C781C002AA54C52A2A7E3C34A8AFE10C7CFB542DCC0FFB55A6EB82C222168CA6A56176463E928D1935D312AA015494E9D9481EB093111A8CAD79616CA680EF71EF80A0093597AF795F436C2EABF692E91E41BF7D856366B586D11FD9E7C6D3759B36C8F5D4DD995F1D4F6E439FD9E71C563910FF7131D7478745024780D74E780860900 -smlen = 3173 -sm = 68B0F1BDC79928E7BF68885826AE51737DB500C08A68C93B5E1CD6BF306D5311A48E6CC4A90079038D7072F2CE0C8D1316E2CA726DF67EC50150E7F1FF8E46757C9F7715E4E7988D9FCAF10146713273DF9B1F898C9A7F63238F0D99028201754C53F46CCBBCAB849B883FD512E2EBB4B401DB1B71EA718610DECE157A34424BC69F60520140A3923216F504CA3D0EE8A813F87446FF9701AAEFAECE4D5348DCABCA61E208058C5EFC3C0031F7886D9886E36B424CC386C7DBCE51CFFA009F270DC00C7CD74EDE1E41123C9CA28FAD3A004913246659070CD38A948C4E8C9B72D6BACB00B0F0429E660D39DCD92D8D8E0A6C628FF9DE0103036F284FB550C2DE75BD781DC8757C68F80100B7175C52F30C94CEBD7B2CFFD54CD14311AC0200381A574CBBACC475ABBF248E0503E2902151132B464BB04BD2E4C750E1E0A83601E69A932C76B551F49E097D94AE7701E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D - -count = 86 -seed = 070FFB907EE8AB7152A9D380DEA2C4C4796780FCFD80906C5E489B917A45D5E7EDFE6F37C4420E5480E8BB599FE36451 -mlen = 2871 -msg = C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 -pk = 161A45152D8C06BFAA0464F03EB69CF3F9C5A4B728EE5DB0E716E8AC99814301E4AB367426A69686C34209D0C30BF41A02B6B881760FC7E850B6B63C73E00B006CBE4B6BCBD126FBFDE362F07BEF35E450926547A0B10797481EA16132ADF3C33E9B9EE884E40C916DBF25D9818AB3341B3C5942B3F1AFF1C5C0DD0DA8632300 -sk = 161A45152D8C06BFAA0464F03EB69CF3F9C5A4B728EE5DB0E716E8AC99814301E4AB367426A69686C34209D0C30BF41A02B6B881760FC7E850B6B63C73E00B006CBE4B6BCBD126FBFDE362F07BEF35E450926547A0B10797481EA16132ADF3C33E9B9EE884E40C916DBF25D9818AB3341B3C5942B3F1AFF1C5C0DD0DA863230002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AFE1D7E9F093F0649B248C9BC10D5CA82E876B620D2C6E34723E876305F82C3AAF89F8FA03838B8F9AEC92637B104406A3D90240025F115E3C18DBF56725737BE05483A43842F9CBFB49B918EBE3A7127C6F91A138CF247621F1FFFFFFFFFFFFFFD4F1F4959B7FC2F86C43F730D36CDF65C9CF96F9F3CAB8ED411E2A75CAA536333B2D41D256F3EDD06B4949FDF841925A7FB58E063C00BC53D4EC2F819640B973FAAB8D559A65FB415A0825FFAFDD9C904502D2FAD3AA86D817ECFFFFFFFFFFFFFFD467E3EA72B6AA616EEEB6F9DB7E47D4DF07762E62A08FD972B89326143140BFC5F81654309FA6402993072768E4891726BDB270D037178F0731000000000000000000000000000000000000000000000000000000000000000000000000000000AF19181F350EA5EFD018B0479B0C32A5D8CE7BA130CF2868F4EDE8A3E53AB570AA5D1E0DF4350C7EC9C1D53451C2BA89B6C4B41273CAC38F3E8A0100000000000000000000000000000000000000000000000000000000000000000000000000007399891BCA209F84DD2C6328D6061140557AE86541B4388B9ACBF9AF82B75E5B560A8CFC53953A791A8176A25C4D2A9FDC5EB080BE4DB1C6A42A6AC838800700866D31B329C78DDFA5EEF50EFE63AA8323DC040BCD911F97C0650F6E4FD74F13247E938640AC81A86E515E7483D7665757A57285834023CA10490315D9BC0300E76B4C3BBF5741789170F83FEEA32D754DBBA12DDF1BB1BF548020D1C5C3106697C499699D37709B040CB36EBF097C772A0F4B1C1A26D0301F9A4D1716F709003C36437AD5910F70FEED6E19851137078A4FAE14EF79525D829E7FED8C164A8697C37757E3F18BE6E6D92F45276767D84343637CB5DAD80973BACB86656D0B00F759E6655817463541B475802FCC828EA3E2D1D04960BB71AB1DC6C1606A4CE5D6F60E460EF4DDAD69956425B0BF7A184281147A985822BA150ED056050B1200DD916ACF36C1C389BDA3810D5A815A7922BF391D1C0A0FCFB01203DD612325224DA7B6850A0A29DCEA8768AD7A9C206A5D9621B99568BC84F78C6219D1770C0006F1C41F4E667B5E94AFEFFA7DA9C34EFDE02EE88BD6FE9F9768D2319C83BC934D8F0E80D4856EB71A3C9CE6ACD20C34DC2444AA011471DD95D5987A1FC01300A569B452A22E1AB0C8C38EC5443513DB327768178126DA85F4B4508D57F3E9786646B743399A88B79D3343F7BC0D43066D19C369441C3D749BA4E276476B0E00EF6D88C0786A3C939A5605EE4B4A2FF99388AE25EAD8350E1467944E372293562981ACE8C9B9328B99BC68A3478CAE789C83C2BA2290617286639D0DEBDA1B0036272BBFB0166DD2739D21D76649D30EB024908CDF174DD97513E0026B9451786139D8EE766ED3D7D333C3CC501EC9D9529F0BD4174AAA1F28C72624CA831800171BFF0FEDEA84C62124269344406E014545A4CD6FB9C8D967CCDAF4E98C133B651227E15290C35B70092689AC08EAF0FB049F9287E328B06ABE34E119A7140022D2A63F95583A67042BE3F28B9B9C1B9CD30950A4E44866F15847D1730FAD36BADE3E15B83E6DEFA1173248C4F2C685E8AE8E3AC8E26736299BD40AA0041400E9821D9E7BC4ED8D590217A6EEE6676585B4CA662775D23DDD61F9D7E0EC570B26D8300221F85B4869563EA389371297078FCC60AC00EBE23FA6540B451709007F699736624EBA905A240A54807A01829F1055187F32F789FB600DC915C3AB5DCF665A84F1DE8C713CAE79527C913CC02D0088C6D806865E3295AB0E33D10200 -smlen = 3206 -sm = 26C2A4EFBAD72B8B46B0588E512113431FE80076338A990F2181E4C16EE75FDF33E34ED9D400D4A764F00966BD15B7E8D506DAFEDAB45CAE014E06F984232E90003FE2498EF2EEE4D76E0A01E56F5049E683444A979B9DF8679A110DF8FB00ABA9E36693210F8CFE33B91AD16BCE68FDD70101D3E4A025203DFE6AD8849DAEE7B3D77EDE01C66DE60F310586ACF9C327F7F9A9845E5304019EC9FC7DBBCD032379B6A5CBA748ABC8B83C011F1E6266E9BBEF08CC3CFC669BDE5407C64C011B91DEAD4AF8A2F8E6DD1B64E8D61C12D02E0115B421A793CF71FA25D3BD5DC1F41EC5E6AC006EA6516AAF4FE81CD5B919C78DD6E66C3832017CC404CCFF99503427A813A0FDFA428D06A20100C1D43A59A6303C5E5C23CAF8D46B31986FED374969ABC42F47C01104F972F1D801035A200372BDD56FB93F4947C45BF9DAE47D4B0093CA51899CEB4F79B2536D40098903C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 - -count = 87 -seed = EDBCC4F6AD0F30066947D678A368B960CCD164889D77730516B444ED2DF10B49C101902F5FA227377C3163A0045B34E4 -mlen = 2904 -msg = 836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD -pk = DD1308F4F73F0FAB6967730B548EEBE01E0162033FAF5B852B824129E609AA6994AACDD3C10A276CD6D933556E685D7366A359A7FC7CE83B2969B7DEF8292500EF3028BFA339A5A0A0DDB533C21EF9B7102DF2680E97A34F2BCC33E5BFE8DF93F03FC18E13849B924EEE68120BDD21C06F8725F95B8118F47CC5FF1C4DC92100 -sk = DD1308F4F73F0FAB6967730B548EEBE01E0162033FAF5B852B824129E609AA6994AACDD3C10A276CD6D933556E685D7366A359A7FC7CE83B2969B7DEF8292500EF3028BFA339A5A0A0DDB533C21EF9B7102DF2680E97A34F2BCC33E5BFE8DF93F03FC18E13849B924EEE68120BDD21C06F8725F95B8118F47CC5FF1C4DC92100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A016FB516E7C05869B4F8F0C19539669879588D91E5755A111DBD2F7FEE5D53C617E2C941D0906928E47FC5ED39F67CEE8A22886DA81F23C066F4DE5E6FAA4E85EADFD2DC42CEF873E33A1307D89B0F4C38C15AE1E834A3CB0C000000000000009F77FAD86F05557FCDA08BB76CC47AE5D55F0C8A129B9D1EFBBC09BECA262897AD388693727C41C4855B154602EE32DC006E5AC50202EA899F24BDE7DB88AFA2018140B6FC2DE6E31FE4230E9AC2ED53D67DC31309509081D3EEFFFFFFFFFFFFFF3F482D8B6E03AE0D6DBA20F262A76DD7001C43B31494D3059A71288F4F90F1B83C2772F1E349EA7925903E37B09788D8F638275FA337EF972AD5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA944A47C6167C93A483F779F2016AC2B6BEDE82C3D73D3F45AC704C02B70AC33B213694C37D984EB3BF62D04625EC1F3247E75C9739E5DE42BE03000000000000000000000000000000000000000000000000000000000000000000000000000003FE3A022F3262BCBE3C90DAE587FBBC3AAD16D3894BC95899C43213895E3CA7042B08A2DBB8877946D25F5B415C9426274762C32BFFAE2CBAB2756D3D421000B79CBB82E2B12ED66E7CA8BCDFF1A4EC80EA04A6608C4110CE8458DC612F5AE87AC5BEFB63CEB54BB6D72BD9441568D1D21F021A25F04DEE1C0E804A0CB41C009231B5A868A222E2A8E552E577A6C7346B9BA28644550A08902328E1684604723B7D81D8C6DB0345088FA0E8784F7D49C788E4B22290D53A5A6F21BBCADB1400C82F880117A4205777A861E3B0028B40175062FA655DA91095FAC7E2945FEDC11BED8FA14A193797BB33EE6D60C23C7531C88841D3F2A96B4AAD4F04F4A20B00190712958D964DD68AA3149E1E705942901141FF702DF1DB7DEF0340553721B214217C1C2116A58017C0233C1825DB465BD005F1BDF8E621F6C87044CF0D1D00E857B6C6EEB734FB093891911AB5E7966E0B7B4621045108249AE3B91139D0E988DC15893CB278A2185DA300E39589C17D461118681E01E9B20D80C9C4A20A00126F80BD195D1E00534130BFAAF4EFAF688F3F417ABC97BDE12259A60AA9F81216F6F58ABAF9A0DE84B7D4B8D043B647E07AB9113E98883C9C91F40EEB070A003E31A98E8932CC3F7A1C600C4EEAF25B6461F55CA45EE6A18537441271D4E64B0E9F8028B6CCBE8973F9D77BB9ABCB1C7C61F43CAAFB5C243A8F1E70626810004F98D6B4E09655C01FCE5F79921D1AEF12943156BB55DF0CC706208B11713082DFC614A7BDC88D9F6245CEC0E301E6F686D02637E928AD33B3232097559B0700581C73C19995C4E917DC191ECF3E4DE829EB677FA75C2A8B01891980A557CFBF1DB942902CF0AB12E6F766E1D061BC2F00ACAE4A6572D141D66516BDB0A71F008161D2967BB015DF013302206FDA3BB7D39AE5F4D6D06EA18E93790CFA23BDDC262337B616A4989534D6A9FA7834DB8E8EF7BC4E90CBCEA665AB14C390A5060087F85931A0A8A5517F225911D94ADB6CABE5896E3C903F82F58A34540A5D5B3199416C9252494B96C45C0442587431391E3561154429577C9A6C6FF9664506004127CBBBE436730E36DF4414697D9A6A3B1480B448F8D4E09D5236BF9722C8CA3D2F3407AFDB703A2D5505B22D67DB2235C7F5888BF721CBBB7A63E248B92300EF57D4965DBBB507F6181341683399C80E511679512BB6B17B2A82E83DB1DD2A15195F8BB794EE13ADE05C3D68E68A6CD94A66434EFB6ECA0B52A612E9CA1600 -smlen = 3239 -sm = 7499BCA04B0601846A0391F81DFFE631A10500CE60E59942DB3645C9C2619901BA442C8C2C00FD860C78AE5604E5F5057BB4B3181E2A23E200E2630CAC020B3D88AD19FD99FBC3C76BCC450063765088FD476522E6BE7306C42E6C7A4AB701E0C7A649D12CB4C3B48E3367C5526ECC103400DA2EFE2603E06BD609703035BF080DCA30FA01CFA7B2085BAEDF09FEE1435E961FE66A0B92017D9292EFFA8197D87853B78A301F8339C33B013053C90BF16138316C2D02BEB28D0C533CEB007DF6EB40A1F7E3611AD85E40F357EEE6B551004F5B2313BCA38AE33E28FAA57A43E2D6C78700DAF1CC82378B334B134DAAE05D489F079063016C246C7CF0EFD034317A305F3C38B76103CF0101FD3123FD4F458A0CAD3BA56CF22395B51155CE35EF4BDDEF244D8E9F6329C64D070381E9C922457CDDC3DA1262ADF480F0441C640162EF01D5D1757EE6757CB31A08AF01836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD - -count = 88 -seed = DEEE61A2FAC04E4D6B7A250124DFD91518D9B90A71FA02665E3088760BF69CB3CD7B6977F860A7026819D178623C9676 -mlen = 2937 -msg = BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C -pk = 71EE0B1A80C1F9B9C4FDCCBF4EA1D52F4B0DE870CE3EE9CBCFCEE317FB61FBE45AB6EAF3F3548482FC61F11F8BF13DFC768B47DED0042A4224B5E3A1934A1500D8A2629CD8A1611D5E2DAE919D38378EF0074016A93AFB22ACF00F3CAB91C4463212B3A800F3E04FF978A9B8300DF55666B40159F52C9B9AD162F6BABF0C2400 -sk = 71EE0B1A80C1F9B9C4FDCCBF4EA1D52F4B0DE870CE3EE9CBCFCEE317FB61FBE45AB6EAF3F3548482FC61F11F8BF13DFC768B47DED0042A4224B5E3A1934A1500D8A2629CD8A1611D5E2DAE919D38378EF0074016A93AFB22ACF00F3CAB91C4463212B3A800F3E04FF978A9B8300DF55666B40159F52C9B9AD162F6BABF0C2400020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001932D82ACDCC719FFF4A3E316B9DE259B426FA746B2CCFDC9AC6B36CBDFACCAE3A1B54D2484216BA0CA1B1A0108ACED2115A0266E461DCDF26AE6058F36F5AA9108B49D7E1D73E17C358BD2AF22E0A7878A5692C164264062DFCFFFFFFFFFFFFFFA446C2F6E757216C050A0909D9B7912FF50BED1BB12E86CE6823087EB17C917082028B1BB7A7BF2FC9A8AE809871C47B3B486E073FCF33F661ACC3C26C2DCEF1B830712EB884B6C7306E8623EFDC6F6116DD540CCE11A1E5E2EDFFFFFFFFFFFFFFF061999CDB8B0BAE7869E0581BB6B04340E29A22D5FCB0DCF79021675EE4BC2C72AD10D747F84D8F1DFF19B33BC731B32F44EC80372EFED8D142FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF3870E7225201A5DB7A878EC973BF265839A654C45DC321A3C095CCFA7B4FDA1C971F52F5DBAC2E468AEAF2DD9B95318C5FE740199B63912D36020000000000000000000000000000000000000000000000000000000000000000000000000000E395249C1EBECE5D89C8AE951DC253B38A4B7828767E2C323D322E028EEB5CE61CCCC58EBC03D4DF61DFCF2211CE603DBE89B507093169313348B8B6F5130600CC676A24454B427D1CF2BEB486DF7DBD541BC6FA13F3B78587D77A5F5214C3026A4953B1FDA0FA355C308CC0F3AA28E22F8E6C636C1D4E6F7234B3B599091600B4C8737697AE87C80532D2234B7D4ABEAD962423FE9E452FD758817E76B10CA76A9F0CABD4A880A6DBC761C5F56A5AF816E0D204B95A3A1CAB7EBFF3D1050A0001714B66B2DE327C154B11CF1F16BAF248B66C41FECD25D94038559994FE47C055926DE79D20CCC22DC126BAEDA858D1AB94E10AF30160E34A6445C1C04A040085939A1F576F1EC5F422DD15870E09CE8E46A239E637BAA1CAA2494D30DFE55F203C3F654D6A3600E66CEDAA0C23F4F30596E0195376E0214E7558D28082020051CD789C1231A300EA00E37394A71B11AC9A8378AE5CF266972584162ABCED559CF2C8644A2EE44F4D1043E8256CB60131251ABAFB5ABCD6B46DEC4703B12300F0B81DA3B8658C5AA79E15758B725873D25E4E80955E3A042CF4E81E37B9BBA0EAE77B343B104041EAB8089A402B35095C1EF86D3E8E600B36A7C519D67A070093ECFE5C64343DEC705D6C4B33242D0B1A3C65BE5B3A72CB3189F93114CAF4451451223B01783E28BE8F3037339D7EDF83CEF0D21FADC98B29285CDBBB2203002FCA77A8D8872FB94F24C52D294C92C8FC0CE301D3B2655A1F67DC32CC13F978D96E7E299ECEE88387110C1A7A99C592B77C09D07196C888022817C7AFAB0C003011C8CD7323937E37586E9BE719191EECB525045B185CED58BA3E39D1D70DFB2B6EF1C5FCAA5A6FC439960C5499357E06C99D0D251C6DAC7D31F87FDFC70000A619E727F021C3D0E9846A6D3E5E93275FDE8137F6F16B572A40C0614A2403D2977C6F2886FFD5B519E3F6BEECE9EAF26AE562D4CCC5B86B97A6115CDC6B140054B4536670A55C23597C812500ABD420DB16D3422D76DBB7B57AB4DEF7EA413E8AD77D0FCA3420F0A5902C9048D8BF1A4BB3855638E993CF88D13492903123006B612602B4486E7EED94C78F3320BEAF3B7C99AC0E280E04F046E1CC09D7E76B1538A7706E9B040236F9522EF2AA452813D09A691704FDC3F30A31A2A0051E003B9BB38BACA8310C8A47C791E0D669E69275A65F49923ABF061E5DDDB8A1E5DBBAAD5A1F6E808A82CEC3BDD91A9D2C5E640395880F51613613504707E0CA1600 -smlen = 3272 -sm = 100020120EAAF1835A219C0AD279A5290E26002E598F92791421171090D90175BB3D02A04001B30018C982CC435EE4A96C7DE798D1B8D6680190ACE5365557F4F9393BD3756CEF33FA377401822BA45F178B6EE936A87C1A1EC90AE221360026D0D9E699DA72DFB5CAFE4B430B73ED6CA800A30F6F36A4C734E8439DABF94D648C39ADEE00DE8906A853237FEABFF47649B6EA84B549A9006E392599D1319BF24695D5495AC66B37AC80017932BDFEC22C5CEAA2236A2D877BD6F1E22301BE529EEFDABE94C1BB7DCEF680F66E480C3F01E56D3F00E7D2188A25B5B3D3F9A06A77B43A010C4753B4C329A27ABD9A5EE2A5647B20EF4A0061CDDAD3DE216929C23431FF531F1AC558FC0100A9A667355BBA64FA4F884FA6147DABE926D6332827B93DE9BDDBCDAA654988C40203B900AA496D4100F3B9532F8782B7BFCD7DED01F92E503673C88E51BB37BEBA74E900BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C - -count = 89 -seed = DAB6C05E29342106CC34769BF419ADCC88010C05B57E673A503E63AE7A4EE55B72AB2CA86C4EF57FC8C02D2E0C8694A1 -mlen = 2970 -msg = 4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D -pk = E3314280D1E9D0FBBE474A3AB093C1B450BF93FE5DF9E8BED7501F1173DCEBFE4715D205AE752A4A9CAFC07A005B55D65F81F95A24BB402093A8E3BFEE352100CFEECD44A655F83C69DFAFE96B6E18B23BA598A13E75014DCEADB964F4DB611F75425FD74B4362D8B186247E4AB1A14DD690E67D18ACC69DE0F90D6970A50000 -sk = E3314280D1E9D0FBBE474A3AB093C1B450BF93FE5DF9E8BED7501F1173DCEBFE4715D205AE752A4A9CAFC07A005B55D65F81F95A24BB402093A8E3BFEE352100CFEECD44A655F83C69DFAFE96B6E18B23BA598A13E75014DCEADB964F4DB611F75425FD74B4362D8B186247E4AB1A14DD690E67D18ACC69DE0F90D6970A5000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D85743F5F28313DF7C533109D4E4E28BD1049012B21F154CFB2139D60608B3130F522C7A272A10FBADC73989B10FD71AE4B22D61875AD8C8F115501ABE57CC43D12CC27DDEB4B27EE01B93D12D6CC10BB409973ECF83335E471600000000000000235EE331C6A4D54B1568932684FCC1931E7952D36FC711F1C2166D8FFBFB70837B30453FF536B0407A05F908A655BAFE85C10531D254DECD4AE9E6AB0BB1FADC9C1065928996A9C023C369B569F9BBA4AA39F64D2156A0B507F8FFFFFFFFFFFFFF356431A3410B48CCAE3BB2314C0CE4D74FFC651238176F97D9A6BA6D6168100F7845B051EF16F5F4A043B457B50F01BFA8BF27E6E9C8006D1803FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84D1FDC7FD0AB75E65D9C571305D07DFA6DF1C4EA35D2DB00B57317DFC683E8C5FB8823D382569F61C02B2A128FBE58BCFB59DB27DBD58E6A245020000000000000000000000000000000000000000000000000000000000000000000000000000FA0D90F8B822434A27FACC42B500D18288B5CFF1580FB0BF247A8BFBD11735549ECD087D32EBC6CF73810FBF3FB9B545476E748C78A29CBF7E3C5B89B5FB0600AFE08615BA8B435BCBC5DBF4C01F73574CBBD3AFD62D2371049B707260A9FF1EADC3D304299C7492BDCABF07A7C1E1E16815EB3196F9975F23C328DA793C0C0089459F356FF40BC603E01045DCF9510FA0C2766F599C431EE8E607FA91F35048E981A4E170AC0FBA1051037EEEDE9B9343DE6F93B6B3B673B8C22D8C96690700E4200B3865EA5DE3CF81996090C24180C599932ADB52FA7C18D15E85F8809FE2787DB7F347E78ABA22471898794D46F97EEAB3FFF9888E8BE57DC54F83F41E00A447558AA01B5FF25FED62A4C350523E2607284EE45C664964BDAE9D6CD8D7BBA25B6E99E15C145A7D062C5025A00EE6446BEFAA6F20B5288A7F8710DD8C01005E58018B6245A10C6C169988DF93BD180832C50695391A0368B3E497FAEF9E6FDE736C925DD67579E32C9B55E09C37E067AE2E1236D5282E1A63BC4DB4D619003D24370182160DEE732644370C0A98A0FBC861BA8AE7F68BA99C00AE437BD047B4898B40C9FEC3144B753707D8DDB0ECDB8120ED123082FC1383D85AB6420800AACD6320E8E4F4610312162691E3A9A77A2FA83CEF5D81D6ED4EE50A5F22EA978109AD7FAE3633E8085961B4C8E26D1BAC547DE14DCAFED2044FF8B2DB7808008AE873DC5A0A2F677F12AFBB9A58CA25237932F041FA67D0E4F3F7F1BD665B529590DC1ABE61771776FD667089B2B5F15884DB3CA25743FAFD70C641204E19005C3FC0FB29227A19DD0ED2904B285F702215AC2CF8E74B90B82E35D688B38694F2C0F3A1939F99B5DC07C3801AF2C9AE2AEE8AC60082B489DC7B571C83A40B00F5FBA914D1FB21F801D2BD5B816B56044699CC21D4EA2226F35D9C32EE8EA66AE6135F937BDAFB085DBDA13C225095974C403D5FEC03E393690B5948D8761300FCF6607809AB5FF37BAC6B5ACD26A8139F13A96474C75110F773A78EAC87CB427F580EED05B7E053BC2694A21153F0C5D3373AFCA3211AD45669016E61F907001F37622D89B7D2B6621F0278D3FDFC33CF4315697B1000CA4812DBF30311121412A93C5D436F5D8ECAD6C6ED2ED2BEC2A92D5716022CBC2190A320B841C61500C114B1E77D53B072FAD7346F55E9FFCD9C74D5EE0313237A3B0BA6A67D08370FC6ED919120E66EE9B495E3ACBEE8D31708813879846501CABB188135308B0E00 -smlen = 3305 -sm = 1E211B865C53FDB58A7B6F087349CE58B61301D3C1B288F93B0F2C4617103C5BAD6950C9F400B051444118D1BB3FEEFAE783C07BD12DB1B200E908DCEAD96A6BBD72B0C07BBF508A77A99400570E29CE629313EA84893F7EC884DD0FDE080127B828C40C7275822269229C1FA59021B01400277CDA785969D88A61EEBC77A752808A3AD5018EEDE99A60705050716AC636ABC2318C5A2001C485A19AF1FB01A275EAAC3F5EEAD399435E0075780D65C8399ED3A79B9D2E821A02A6BBB4019EE8B41CE456FFF996F318ED098149AF836401FAC9B07C22E5CAC774D2457F7B1D44D6C31801E456E4D3A329C6735923AC6F48CF1BFE74D200E10E4D98B0430735D04C7EE31873BD8AD93E0001276F78AD4BACCAA1DD3EC0AA22B4522DEE46EE2D4B2ECBCB4B3BB4FF9C8D52C60103670BC57DEF97EF58E283B8788F78F41B28DA0153CAE1A60624FE131DA53895994C004D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D - -count = 90 -seed = 0CAF47BD9AABD7D09FFAD404449BBAB2E1D48E80AC78550831A365BED8765420DBBE9A566EFDF20D4E5233D7848582E4 -mlen = 3003 -msg = E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 -pk = FD247AD72EBF598FC4E4AB510F57579FC774A527C564D65C2432D95B7EFC8CA4753DE98E71400335D63DF573D828C4B4019FB5880CB9F1B41CCEDD2BAD0A2100AFA0477B44BE512EF304255EB5E53BDE317D7F7F39C8D74C6C5182B4F4BB5486E5E58DABEBB0F489F0328E4ED4A5D6442D85B1439933BAAEC6C97829FFFF1700 -sk = FD247AD72EBF598FC4E4AB510F57579FC774A527C564D65C2432D95B7EFC8CA4753DE98E71400335D63DF573D828C4B4019FB5880CB9F1B41CCEDD2BAD0A2100AFA0477B44BE512EF304255EB5E53BDE317D7F7F39C8D74C6C5182B4F4BB5486E5E58DABEBB0F489F0328E4ED4A5D6442D85B1439933BAAEC6C97829FFFF1700020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ADFF70B5B3D7AAEC6E1713010FB8BD8C73B115786C6BBFDA27EB22D1304648264C027CEEA2A8F2846B0CB64957925D2F0BABEE609474C1B8F8F49FFC3BFB532FFE20969009DDA620A1BD1AE05EBF85FB658D985A1D0866F4CFCFFFFFFFFFFFFFFB55B04C1005657E06F2C637D0301F05F5908797B46EFE4E15E84EC026FC3E4FC8EB8FA56C8FF662AF672BDD90230EB190623FD837A8AAFCB3262171D477DBB97A5C2490102613787C1CD60B986F7E268DAA3BE9653296CD3E2F8FFFFFFFFFFFFFF156EACDCF9DDC7E42860A411C90A59DF2A6F4551304C0560B8AAFB55AACF1F66B412CBCF7246ACF5BBAF069F017333048C7C74C90DE8388B5FA30000000000000000000000000000000000000000000000000000000000000000000000000000006A987083C1A5D119FEDE48FFB2CAFBAE61EF087D7FA68CCF892275A833CBB33229A0F73DF4D34CD9429B9623FF208AF7509A808D99B9D3DB6FD00400000000000000000000000000000000000000000000000000000000000000000000000000007602A94CF315589F1752FB301A23B043316ED8F1E9635FD430AE5779B90A1CD9DE21E0159DFDE571B83C47FDC494A84F53537AA99DA1E8F1C9979F1BB877190094772D8612B63D0F0C54A5CF1CF0F1A5DCBC2D2618F141B633D2C8A18AEDE3F494DA9524007FE7C6A4F1AB1A4F1597290F7985793994EDF30275AF6C1ADB18004FB5ED9F18A84675CAD32B4D0FC06BE8BC3F3BCF225AA130E67BFB15EAFAFC9B8B452F5DFBAF3C0B5182BA77FE49E2B3B5A602F46865B709A6FED71ABC051300CC3AFA119A48DFE4EF1EE21F29A90183E000ADB17D7403EBF4256F0C66E898AF9B2B739E6A22AF3480B3A31B58C4DC41DC3D179303A50C1245E8175DAEC91F00EE32180238B695781B3DF1C3DEBB76F55051577B8376B20CCEF492F93FEA04F45B7A337DC47815EA0106BBE39033420FBDA46BE23B6E845D7EFCC27B9EDC2400AF13298F9A144D89671001E806CE20F5C731DAC8CBEE3978EEC816CFF2B3366BB8E677ECD212087BD99C460FFDF0A8779CDD85CA3AAC197345A52E44718E0D00A6183187E672FB16AE699B4F3F973A48312B824781BF2B1697A260B387E2BC92AE539AC77571490D67AC9AF81D6DB71816DD7212588C03E4732610B4455B1D007474F286E3E311CB24AE7B2A4B5CF689252DB7BADC1BEA7859D33C035728EF324CA0CDBEACB6AE2B55EDD733443E06A8C934CD7F2E05357ED5E3F3CE21D800004E1C6E8893666055D925711BF9A4AB0DD70A0494651831581163DAFFF9AC2489822698BB12D5FE105D130843FEF011D4D80AAC76DCB9B79B7F2AD83FC2760F000684845BBAA4CD591BE2A2E13B41A616061A9B25BBB1E24BCAB67BA338C4560355B9625DEB19A28FDAF2605F96AB6B35720BC83ED9C3531758D40A52122E19001796585A4723783913A69E8AAAF96DE1679F18DA80FA1CD11E3C32EE72EF8EA19D0D57D47F9BE2440CCC8C2B9D3466AB5B06FD29BA1AD0C8A7C832DE561207006780B54D2E55E689A7298AD366918938EF173FD145AC57F53003F835B0A1C4EE297EC38FC28B8CDC1B81B0696EABE7F65B7195DBF26AB992F8C60E7022331900A7C58A3A0E73AF86F7FE6F112BCF5B4E42C203889C39C64A105F4F664BBC7A24074DAC20274ECD789FF3EAA138E184D97C2125A8803065268D34961ABD4B1B00D89CD99F5D99E9468AE40BB0B50A28EFC882D432090059D187734BBD10BA0E633066DD2945B94EE1D8255AF75897AEEADF5E3E977C73337E8769EDB9C8270600 -smlen = 3338 -sm = 855E502E763EEF29049F074A78A3353D6AFD01403959EFCEF6AB5A323A45F1B4220BB4F02A01D9DEB7932C787D49CC2F9E1877B1E122EB380047E4FF2E066A7CC7252BE2E9361D649B7E2C00EEB9EB38788363A4002EF9C2E81BAB759C49003D62A9574BC97F490E51E4C5F18EB02AB2F001920880A44587D5E80D866000C432534916CB016C621BF9868081F826A9CCA771106BC4798201AEE40D9FDD45D515A8D62063033EC4DC0362005A923E4B299CD681484C2957A9FE1F2934C000424268F831752DB705E5197C607AAEB4141C0136BAD14D552EE92D29C93A99C910EC15C3E600870FD10093159851D8D4200343730750FBDF01F3ED45D83282E9AC6C774C1C73FFB9A5F8450001170A36D775D452AD6A90160B1716A0F25D75C6B1DD54AD713C2886D9B5DD3EA80003396BDC8FB8A501BBD0E83F390059726F1A080150FDE292485DCE1982F6EA7B8C8202E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 - -count = 91 -seed = 9564E88F336C091EAD50C893F3EAA8351FA388682F433F7A72A34731020B9C96DFCF75EF5EAE47E12684AFA51EFB49B7 -mlen = 3036 -msg = 2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 -pk = 1B56A12DA8BA6BA256F2F3336B25C12B216F7D20BB851524A25922AD61F2981C2846FC8832BF6C1D47BF3D7A49A0B6F7CD59265585BCC5BB0C8345760E770500A9D0F86EE5BF182918D26CDBE49A1123E3F844358C6BAFFE3451826309BB60DFAF239DD34B04413B7A5A87AE4F2BFA2C8613CE6B9B86EAAD19CCF15BE5B62200 -sk = 1B56A12DA8BA6BA256F2F3336B25C12B216F7D20BB851524A25922AD61F2981C2846FC8832BF6C1D47BF3D7A49A0B6F7CD59265585BCC5BB0C8345760E770500A9D0F86EE5BF182918D26CDBE49A1123E3F844358C6BAFFE3451826309BB60DFAF239DD34B04413B7A5A87AE4F2BFA2C8613CE6B9B86EAAD19CCF15BE5B62200020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CFFF9C387015D9383B63BD379498BDBA7D49375C9345813649EF53F8B522963A8A82E84DBF8B82D8C0D5B35D8E3CC522B9C311F7E9A9FE288FB6D7E69B0A1A35B4387B40BF2FC9F4BF66B4E255D2E056384900CA522037D6A110000000000000075B85BA3E08374392A1253E2B929B37541C42A516925BF46562DF8E86DC934F328967E3FF69B75E3B19F37F02275EA73EA15AA4C2FEAF7B7BCB105F662C627131D680F9D21D8338917F89FB259CEFD2C70EE1B1608D24A1F84F9FFFFFFFFFFFFFFB586EFE80308FA6BA0B032BA7F38D19602626005F766B1597C29D18BADA456663EF55474D83447D89B96676F0DB2145D9B6C20CF41E6771269DD0000000000000000000000000000000000000000000000000000000000000000000000000000004468D7CDB38CD6452889352AEAB9E80D160F3F5D85F4BF8D4F5CE02F9B88CB98C2CE2134D079F0AA2CB49AFB13C1CFC48C1B5F3069E9DD533EE2030000000000000000000000000000000000000000000000000000000000000000000000000000E627103EA1621806A8E195AB7525C85836B853D81243837C2ED6716851BBC83A01E2CDC070B1DD3DD05E164711A3FD9D4B5768451F31ABB122AADAC83CDA16006595F5C870F6B98C40350F815D4931AFF6EEFD53DD8FEA8A5720EBA982FACC7385FBFD7EF3C4F1895D69026897AB6AB91DE1F19CA0260B273BD222F6587220007694A37B10478F307ADC9CB6455D7290A0D0C85D35CD4FAC03E3E0E4A44B2531BE28B16D1FF6B3F85DE726FE5243F9ED3C7476035431F235BF2DFB1B97F31E00CB4B5153C02FEBA2A9FD58ACE78643FB6FA44BA1C73893A08943059BF24F3DBE2E10C2B87A6A1680080ABC07D97BAEBA9892BE0C25EE52082F3E189E122C1D00D3A7E3305379FB12E5F1AD07BD10D02579ADDE2405D829B44591B0905331C4216DCDC19C5AFB3C2206849F9558C45DC130018050FF8E43C0BB6B42C992E1110087742A6AEAF93E9609476FE37E16A9CF32678A44C4FCF6319EDA7DC8AB7844D9C64B5179025699E11430A69A628E46ACE486488E3609BF1AC0CA91502B9805005BEEA475A5A5A034C793F3110B72E0BF8A539AF0B89754A6836474D6D4261EB92A17E1F48661C51303BC0BF2C51101E4E85C0A786B4418BB2578B831F8541A002959041ECA410C2A5600022E9B1D5B87342A0ADDCF3824DB8776D11FEDE281C6AA360DC2E85FD6154D404E16AA6731807CA2622BFC2269F766C2E41F380102001DA2A2DECB15720BD17A9947B52326CA9721E813AC8BBAC5F5192A6EBD356D7E7E920F3F7F79DCF9F235EA097AE0DA8142F152E25EDB0DB75DDD6E7F14F60E00341E7F8299229CB409ECE7A5ECD62084B7BBB5A3D7379486916A3F4622D5D3EFAD353444D7ED522AB9460C1819B89C849D6F2C8C724932194C8128A6674204001B198BFA443246401B38E2652E9C0A51DF98C72CC3EEE3D6DFC2E10802E9564CD066314BCA0DBBCA09CE03BCA12C111659CCDDE6028EE99798BB71A6C9831B003C71E7AB6C9227DCF94F74214197849793E70E92784C16755B992F43CB5E554D44805BE30D9A7DF3F5FA6F971A81AAD51243940FA83EA8E53FE1F2B708081100AD35778A62707A97048814CE76EE1E66F699BA8BA02B66593A4479936831B93EAA3DF75E628382DF369C3023EEA518C5D37643CF28CD696A245E3BBFB03F10004C58278A8FDB2D7764F2BB20F297BFD49CF3051A3AC749EBF0CAC2BB320C2FFD3BFD25C2E6A62C89CDC60F9889940B39C6C876C52C55A1C3D029FF01314A2300 -smlen = 3371 -sm = EFF4B0780C09A5375D6ABBEB25D24073761C01CC1232B9C17CB8DC71755E962963551FDC07018680FAE2F2204437D2D05213BB359550151C017DA39CB1C726D1723A19AEF0E78B3F81F1E2000605AB08C28E74BB09E80F5B594A564F35C701B743817403E9357A9114D0D647E9CBB998460168740E07EC422B77002FB054C27E63DEADDF01AA4DCDEFF404CF0C3554ECA95CC475C18781012B428B6844125A6F86645008DB6F0E368E0301A4B256501CE882025C05AA7D898CE3C815F900FBB4A576B3E3241CA5801CB61D69FC63939F008C5544A8D4A08F304E4279B072DD2A3E62B7005D361913AA485CDBAC236D57FF2AFDB1B1F5019F77DCD72F1CDBA896CC04E0D9FBA16C7AC00001E55C19E327C2DA95B16382116E4EB551C7EF87196D5A96457FFAA9E92670487C0503345DB895359BAFF25C0CF43F64BD436F888E00D6897D349318525329DA99771141002601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 - -count = 92 -seed = 4D0788DE958A707899D5DCC02F756A10DEA2EFE0214F5E01B3281DF4E013CA75523ECEC64723D6C8BEC0B92C4F821D8F -mlen = 3069 -msg = 9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA -pk = 7888E48680398164BEC3B590A362CDECD33FE7C392DCF067613D885639D6D3EDCE7483B68C14D279025C5FB10C5A6B8FF904EF648CEA2300B95106F23F050900E397521205EC9D0A992CF99EFBB01D056AF7432445B43C2B626FE2B1A050F8191834DC71DA91D4323E68B2146B78079A816C5E1842079E0D0F2B8782FCC00200 -sk = 7888E48680398164BEC3B590A362CDECD33FE7C392DCF067613D885639D6D3EDCE7483B68C14D279025C5FB10C5A6B8FF904EF648CEA2300B95106F23F050900E397521205EC9D0A992CF99EFBB01D056AF7432445B43C2B626FE2B1A050F8191834DC71DA91D4323E68B2146B78079A816C5E1842079E0D0F2B8782FCC0020002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FD93DA8572A03F7E09BBD76BFA8FD9B918FA9D2023998C8AB561CE68B3E76337CF6E11E2288E9CBA84C56B9C39398CEE0D19F70F5EBDDC508E273AB77E5C3D89B22518B6FBE54808C9DF08C39BFA056600B3215B25976757BB12000000000000003AFC9A071E2DF107F805D13F269D1BF7D8AF54FC5F9256AAD493AC1DD64AD3189A9453D3646F481F4498746CA536262A4F25CE5CF34A9FD3FAB42BBFC828D8AC7E68869D27D2AB687890AA0F61416EE1A3ABAA175DC7BA66C7F5FFFFFFFFFFFFFFB6814302050384F51C7BE497D866D3C18CFC2A29B929F64AED44C291C073DBED6C4FC22A0C4E1E39FF02E5DC97DC30FDA9449C20DE56D949E721FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3E8D9916A1837294DD55741BD664DE8332BBF506A46ECE87B1DA0B3F8C6A2439CEE656AED06D5020D6D19567600626CAB2DF9987D0C6B04129301000000000000000000000000000000000000000000000000000000000000000000000000000053AB6ADCD85C2DC05246C243C2A48CD2465F7A73A94055EBCCE754662405497763B4AB2CA579CC861E49FF6C9BD2880A84F98EEC446F0C0CDF7303BB72100000F432FF46840FA1F04BAEF2C18F4712EA7A42990DC7DCC7CEA98DCD071C0A0D63277F378B76353920616E4BE12B9F0C075971F620B5631252A44D7645BE071B0029FCCA6B53857151E594E6E300D054AE9A5FDB565249D46BE4F6077529F985533E4A435066F5C7629CFC98C916AB5695F5908181ECFD3961C55F42B54056180041D90F5D9E50B5813B55AB8E95248D11C30B074631005A975F87F30B0454B33989757C79297DD4A55A7AE94E7148AE3B469232138545441FC07C13B5D62C19005C9C94F6955B8944CE7AAC0E00FED09744118203737E2DA3947196B04A0CF9D4ACC1F5F98A7057E4CD7E62D927B96423AB236B93DF01E4A73C6D22003BAD1600512FED2B7A7D1BCFC1398BDFBF2F4E51176FD752A3F6DBE4DC2EB015CC984BF3DE787D68EAC3F7D9FEF734364EA27E6A806B80DCBCE9C93F503C1754523723002FD394270321063C5DC99EBDF8DC67DD4E6432FE6992EA16EF4D931A3FB73E8554EDE4A41076A007628CC6D393E186A661B43443E95C67489ED961AD399A1D0028BE2852F3513D414F5CBFD494B7103E51E37A313280BA8411BAE9BFC9774E99F5A8D2E8B2ADDADDF48E57C454A68D30453CC9F93CC195C6AA3EE36FB11D240004D7530742FD0AC1992DCF9DCCB9763C7DC8AF5FA493C1B94002D64B71EF1F892938E1F4774682521AB6131D528A36243287B9FF7BF4517111EC096213AA14004D61AAD47E95572E3AA86C7CD7E675AA6EA30E0BE347033B69D99A47747450BE7EF99F59715E6ED2B617BE6C37B5858B525043BF3864EA26F6369AF6C7DA1E0038ACE8885C845F1693D7B3A90D63E8ECAA39186F75762578B39B4F980F5704830D7816A85E2EC38543A7A0DC95069D3A8E6104D25F19D1CD68C02F7556F8030015CC4627EB0686449A71785664F1969D08506084209CCD0DF44F4CFA0643F71687B6553E65476C3C533ACEAF3B5986AAD31B61D9084BEBF23839189181671D00FA6924939C1C555F8DDEAA2AAB40A987F8E3BEB8356795D2B478563A4E4E66E3943F421C61FA2B4EC9D08B99441241D0836547BCE3AC5E60A61DE4EF34F20200E9BFDC6135D22A352FE5E3BCD67FCD4493CB43147B7E32FF47288545C94F12E0B14695C50DE28A8A4F03B7FD19C0615D46D787DAA80DDED64CA8B0E5B7480000 -smlen = 3404 -sm = D4541A47F2821BD3FC53D225CF7999283C3101E2EA118FECA5FFA17D646F2C68932BFB172C002A713180687815330F0137374419BDCC4E4801E3FE4D05DE32D6DF83792A72888FF506909C006B1EAF75B113EA8622A9000600798864FDA001A20E8E7CD40A37EF148D761719501ACEB6C10080E9A5DB3349CB8ED48FAE43DF3111C3717F00FF8477171B676693CD3CC920EC18F82E9E84010227BD83FF6B0C5CAAD807887AF75026355900F13FECAC367A880FC4B681D42CB46089673B009B2A6B9A8B1FE04BF34DCB665308F25218C100888120A41B949585B5853E5B568335C664A101194A5AD44248A1753821E11243AD43A9FE10015C0C517D435A8F19F369879EADD375F40E0600017747066DE25593908FB2E236FC582FD5BD13D3E8E555E05ED14B1F1046FD319D0703DD15B2070166964157D2F21C76A1BFB42E2F00CB8E9133E34D320B308C1ECE87E1019163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA - -count = 93 -seed = 55A9C7A0B49706090BC0702ECFC070AB060427FFC820C3FE05B499B59AEB125F2DB4787A5910B88C6F8FAF0A69BE0AE5 -mlen = 3102 -msg = 02C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 -pk = 5C4E46C6A4EE6F44CA683B985640BEB93A618FC1CF19395145C0DDDC44F5AC7FB0DA9CF6055EA3F4AF049302BDE1A28E1B467CBA3F2440E56FD66CC0385A2000D20C712F9B366F341EC76E1606A6C51514A6FD8BC8BF0BCE479522A71F28F9CCB5B4474B2D27BB02644D796F63FFBAE0ED34452C53EC428DECE6B8E0465A1A00 -sk = 5C4E46C6A4EE6F44CA683B985640BEB93A618FC1CF19395145C0DDDC44F5AC7FB0DA9CF6055EA3F4AF049302BDE1A28E1B467CBA3F2440E56FD66CC0385A2000D20C712F9B366F341EC76E1606A6C51514A6FD8BC8BF0BCE479522A71F28F9CCB5B4474B2D27BB02644D796F63FFBAE0ED34452C53EC428DECE6B8E0465A1A0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EA1D5A0AE3AC456BF68E4DDFB6391BA783209A05D23033F1ADFDEB56EB28C14D3D369CDD36A529A25CBF76DEA712C3B36F206152A81A237C24FE3CDDCC66ACC0E2214D0A8055100537D89386F75351FF3CA4081045ACBD447A0F00000000000000CFCDFA94B8B262779CC08BFD26061B5E62AA1C337B1720235A957F334526E1CE80E719BC65E0A1FE1BA4FB9AB4B6FB170F003DFD1EAB420144C3E7CDBDECC8077C15DE04326FAF1A1E157F377D70142CEA8F692997166D64C6FBFFFFFFFFFFFFFFA10B1F8FF4DFFF2C77AADE09DA15E503F9A370A014E4FB46EE69F7F7F11714E8CCEAEA3FD832DC8CAA2991B19CD7773CF959B988E2CE4F4CCA57FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8C596FBEC7912B6785ADE1D800FEFE79D93A5388A9CE4174A9A0FB0E1096C6A5C6D7EC61811B21DD003D9815D4ECA3360289C677BE3AA84273010000000000000000000000000000000000000000000000000000000000000000000000000000454B48B21A6DEE991B12692CA4DF88EA09D594C3E086DD065F47E24AF098F1AE079EB534EFB6CA3C4891F7DA61A964428F84B71D27F7B59359B9578AD79F1E00405987A7E3203A2B82E1BF02818E8EC62FE798F5DBA60B66631926647FA49F9D6DEA0F3F98DCDE816BABACA20FCE18C0419CB31652A3DF2C504524CBAC17030002EBD76C95D78E0E8887093202AE329A8BAC594DD5425F91C5D20D724A315B03319A0EE001DF30F26E2DBD1BBF77878DE2A2AECCC4A26A12E0D14467CDAC1400DBBB05D6EC3A94362FA10307A3140521FC1BAA5F7BDF0277ADCF95529C87EA761A417E21A50DC0D8A60BFEE89E400D5ECD8FAA1CA994BAE425A9DBE2BDC40900D9C7D8D847D189076F35F5C370804149A5E0FE9140CD6F58DCC5BFD93958A31DBF7C3572CB1DC56379A1040B42FC1D5FA04E399AFDD670A79C548DC58F3A050043F04E9806C3C5A8EC21F471FED8C1E0E24D244C2F7D8EA26D122B41FDBE68319E9BE925DEB482FA119EB281C86BCB0CF745D038E3803792A052F8C5560A220087814B9D9616702605EA416FFA45C61BA28B552A8E56AE65172FEB0BBBA6A5D19F20F9B12538BEE07F362A458E2CF09318F22032A98FCB9BFDEF44E5339F02003505E07D077E44E5D7CFABE42893519B8A679E13381DC978BD42E63B31A716410E8513EE6BBFB0023C10A2ED20A69097942D5B34FC38046CA2B2A93997930D003848E31ED5779E3020892DA44F4D04DB104B0E8BC7736DEC4C2863A89602941C104022B56BCDE6D091511EEA137D2A2B8CD91EDA3B69BE96926C226536290C0089A3BC4C287AE869741187C7BA7F56E7F570947479412EF0364F8DB73F362B41DDABC3581FCA40C0F0B3190B82616C084318109128F99BCF9BC2D4AA5A192300B768E1E10DBDEABF7CE436CC6B2C61F4863B0442BA090EDDA94EB601E56AB93CCDE33C5985A812B049AB8EAE6EADF91D973C6839A4E41C43D32DB089A57F0E0052B7EA761D45FDFB33E5154EBCD15514671488E8979A0257FA68076061F283A218439C4724CB41AE31B0307AA11ACEA084C9D14DCCDC8913A3560D2D757C0B0029634BAE0A4297E05CA56DA82ED64E4944A554B9A1BC0B99D9BD1063856474951C7CAA492F4C2103AE2351532E4CE78D52FAECD51445E28EFF8D4E1325350700CDD4E582D8BF9F05771C5F6F0E4B20D995F5B82BEF587EB0D99D963198A5E1A4EAB5FE81FBF276880622C825AD58EB9086A0019AAF84ECE43A329F3FA22B1200 -smlen = 3437 -sm = 0EF63B4007FD9C832DC72FB7A3628C1E1FC301F7F5219ECD6964D579B1DED82F7CF6E3245A019DA9FD9EF167B029E0518AF53F538B82683B0063E7D83D4C37C8B45920781A3C319E28AF160119BB6F5D9048175D52F31B17B5753010171E012E2DCA6362E20188E1C82B6AABF3271E08D3015F924AA4051DD251C289F31A6D0EB9F3B922000802B88C81A50AC4F9660C22FA4C68520EE301DC2B2E73BD1E6EB723A1C432FBABEE03D68D0190E4643ACEDFE202D50D8A718EF147F09C0D014294827FF70D924E66E369A23927C2F5B13D0097484E502ED88927841E990C8F0EC9C3F6B101A6D6C9D54FB1CB7F39A3453810AD5213A3760186A2E6E326C453E4D1247248A6265E97F3AA0100FB00471DA24DC286A2D154869336A41DF14788F6E1B9EA6F69C9FB8A1932A6250801AC8119E41DC7EF1D3BE53E81B6F1CEF275FC00C9F4778EC15C6B482575F3CA1FEB0202C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 - -count = 94 -seed = CEECCCD3F7BB922650E3F6E8F20C47AF17C1C1053EA8FE08226F167D67C3B0781BD774C4C7AAD23C6AB0B9F3E3F96F97 -mlen = 3135 -msg = E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 -pk = 4283FA9A24A1F6B0457CF86AB3C72144660538BFAA0B0EB4F317AFC13C4B49C83E774A3C5BB5C20C36BCE906B65BCA6BF3E22B2F7FC548CD92A62654D9961E0036F02E568FF9A342F4129E747A957C68905B3FC0586FFFB50553B5BFF51AF616B9AD9677AEEFD903CE55B296B65468962672FBE8349615D6F9090CC184831800 -sk = 4283FA9A24A1F6B0457CF86AB3C72144660538BFAA0B0EB4F317AFC13C4B49C83E774A3C5BB5C20C36BCE906B65BCA6BF3E22B2F7FC548CD92A62654D9961E0036F02E568FF9A342F4129E747A957C68905B3FC0586FFFB50553B5BFF51AF616B9AD9677AEEFD903CE55B296B65468962672FBE8349615D6F9090CC18483180002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000363AE04953F5A6A834F68A1DCB34112841C359D5B7DA6C8BC610AA87624F0AFBB8B1B74A089C2641786F84BB6A69D86080D0FF4D244EF525D1D8600A6D5BEC52C1A1102F3C5BC3B27835D6DDD458D20CA59394B982F7EB347A0300000000000000C71AD0A29DF7F146D01B6F647A73613EA50260A4729DFF3761E4056557CC51813D897E77F6CB9D9A62E59AACDD9F13B032958492AE44198E064206AFC0A80DCB5FAC25E2D678F0F791E7D9C249386F3AB9BECC6271F5031025EBFFFFFFFFFFFFFF69287599F9AF80FE03FAEF06DAA7491321E109EDBCBBD908C674D95D8AFDA4D555CEB29A7439293FA091F2D62EBEB28FE4BE714AA2C3792028B90000000000000000000000000000000000000000000000000000000000000000000000000000003E60A8155DB075E66E38882B8DAEB2763B93338A20999E2CE6C012D415F98074C01126862CE7F4F8C8EB61CEF98FC4AD51FA8AB076EEF5CC3B6C030000000000000000000000000000000000000000000000000000000000000000000000000000E74BBBACAE163C88991FE90EB145099937554BBDB77B055B93696EA970D50751E0C65ABA4572E626AD0538238F35F299484BBA97F75CEDFBF254E13FE5450C00AE4665E118835FA6C7B653B9F609E8B278D9F1A889A2AA492AB98ECF1556639B3D64123C47B9E7906E3B6C6551A66D7509D3AFF5FECA84127DFC1C0EC5B500000ADC0442BC446CADDA7AC7558958898071DAC29FC671889FBF6B7B68E20C53CD30C3C7E0168AD5F1160D2FCCBFD93704E1F602882AECA3B74DD78652F0302200F9DA94A65D1AD68D077DF6B8D6495032DCE71C07B64944592418500FF7B3E16322D94A03248A6C3A181CC9E51E63753EF32845592CBD3F4C579F56CF942E04000138699675E6CA8D17F78BD8C2268F07C49DDB8050DE8F65B902CC02466DBC693F7411C5455168DC2F9712EB6EBC59F2FAA9181B9B2039FCB7EC93B933A10600E31C2B6769E8F0910A932B1538E7BB1B39CCD19D9D6095A975D2165A0C4810097979C8F35018C5B5377D05A7EFFC8E8D135357BF9E911623AD84F3F2D71B2200031F13EAF2D7CD4B20D823A9CEB6024A525A455DC0274F5FEB3F343FFBC1C7462AE5B4A79D6080698C7EB5DF0708E21B96CDACDF52BF197D2B09E7C28A990A00FD968197ED413C0EBF4DBBD716D85C54FAB45EE43AD4906F402F65E044DFDBAAB391A6FE878D20DF891434B341D97B1DDD0BD455BB7B071BB436E0A6510F210066AEF404510B7EB1819CEF027E0A1840243DDE33E0F1FF113E2AFEAA123B34F7E099F29365006124762B39036A9FA633118D51AF7F0FCE5769750A74D5F90C007CA6EDA377DC1D785408AFD8B5A6DD823AAC5028D0079C7B7AEFC477E98AC297A11E7C4F6F30E02D7F60621AD051D0203659486E8D6DDD91A84F6932B1ED11000C1054ADA803B7A084D3641C3D2EFDAF723B84749A9FA214AC0FC6B1816C17CE424565FEC98E04C675ACF32FBF7444AB56EA43B07775BBA2EF2C9EC8846612007EDAD55F6EC52C40B2B26750032D35AAF6F5D1E5161493001866D6944A893B8BE7CBE3F80AF7E2332475FBF9F1E7D921D36F5DB3815A32DD838335A3FC20220091EF533126B227405D8C91E76E0CEE21E44259BBF86AF5108082BA55772F3A8879596832F702E0E55BD66CA3DFBEBE946CBC7111B902AB5918F4758F5A5B0A0094040F6352140D1EC3805E87AEAA29D6CD99E6D06ACC14A2ED3D14CBA352BC5A42A7296D63CEBD70822DBB993F0745C378710562920F93C86F4E2F9F92050900 -smlen = 3470 -sm = AC9DCB5306357DCC1E3CC4B2D3501E9722BC01EF4163EE2D2190137F36802A95F31CEFE440005E5DD502E4712538976AAAE0722A11F052BA012E1E4736C54E36733F23C55689C2FA1D212800C0886F09FA4758E1BB30FD828F6174D14E60011E9CC0D35683F5CC8113BD40AFD59CBC47DC0047664DBA4FE01B43C5DDD123D9D72045BE1500B8C076252DC452979D5B48BCB4D979D5C81D010CA76E4107093B0A296DC6C0EB23E9264C8D006FC11AA74B82E96C8B1137F243DE5441EBDF00215DFAF2FD58CEF305415CFCC9AAF8CC78FB01D38BD3191C7E494C109C53B0CD2632DAA3E201B1ACA5FC0B580AF185A755B72A02D2C061710024ECC0ACC2A246D7B1F12F104E1CCAFF470500004562F1A50DEA0B1E5BE1DAF6B83388BEF36B6924E32E17B93C6A3152830406860602C6C8A8F29168ABF1AC1F13BC4C4F7A2723B600F8C912D2512CCC55B936D4CDF09C01E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 - -count = 95 -seed = 2489C04BA57D149A60F446670C13C29998B52F3BAD548A751D7134B694DB25ABFA034FB4BA45E105AE27D575CBD02B99 -mlen = 3168 -msg = 1F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 -pk = A39C63854CA350742B31B8BEC1A965276236DE3AA51C313486B641252FD2AD28B32509C4CF02505B57AD83E0BD1F8F2A3D826CE274061A31BDBBC3D8828C1C00605F7D9FCA7CC3FEEBA7BBEE09711A82EF221C0714BB5E25CF5850B37D66BDE629CB3E309E700DBC0D4FC04C8E3817D4FB7DD3B8D13596ECCFAC74E99F3C1700 -sk = A39C63854CA350742B31B8BEC1A965276236DE3AA51C313486B641252FD2AD28B32509C4CF02505B57AD83E0BD1F8F2A3D826CE274061A31BDBBC3D8828C1C00605F7D9FCA7CC3FEEBA7BBEE09711A82EF221C0714BB5E25CF5850B37D66BDE629CB3E309E700DBC0D4FC04C8E3817D4FB7DD3B8D13596ECCFAC74E99F3C170002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AE2BD4328C49E5FDE2EA9985A66F3A0FF7089F952EA3478BB1FAB6C3605111713ECF8D70F7480EEA8B01CBBA61D1685BFEFB2FCCF00B82A37B46056F65DD57F7B73897089C62E05D57EF76B736BF5A9C87DB392E964BDE072D0B0000000000000079B479A49B332CA267734029E4F4FDF87057F60E3EE839660E0F2B5FA3334860053B42F8FC8F6B02FCE9421AB2B2154BA3FB4087E14BA7137EC3FE9287ADB0113817D92EF8B68D76E92148F6AD205A06CFAB447AC85C8BB7CCEDFFFFFFFFFFFFFF47B71C0B8DCD2FBA992755A2B2FBC564C6123023927B8DC0AF49D80B285D88F2970C06D42B53664D2D866261B8E1CBE4E4A7AFB30C9B17C71667FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32E378979BE55EEFA1204650648CC7225EEBC31B3F77B0DBAE2EADBB6D60086F975E83F4CA8E83B7690B7F60A4D92DDAE5F4795E57060614790B010000000000000000000000000000000000000000000000000000000000000000000000000000BB4AADB262E1580740036318E9C99766DA20784A4E7D1C650651FC5273548EDD583FEE766400CC9962F14C6E65C9F9118311168F5725C5A9BB24B93F3F80200014C6F404C40F44ADC2E18BADBD2007027FF5D639379E71D0F49D48F377658E1ED0A33C6BA5A81DEEAE96D0C79353F639BC1F901F8C6A6C6C43DBEFDB513F1000078723AF3C25AAA19B7028FC319267AC580D70D0EF95F110007906BEF8403E80CBB23A3DDEAB62A03049BF8DBC05377ECA0F8BD4A7C03B8A374F18D8C45F07001BEAFAF04BFEE081B2FEA4E87069F1CC236587207D580288A45C4BB18AC4E1229D910229A304E7301FCB1DE49E7966331DBB0A1AEFD094E1171D209FF1200600887768CA1573DE6A58A5B2AB74CBBF96A0B3BF40F2B2FE82BFE75848121C3728C9915DDC9334D5D9CA42807F4F3748087F77824021DAF79D1A5F6BC5548624007DBEC818A91C9E53D143351C29D43762E8374306DBADB2E3BD5D0F02A1F529B3D0F1C6960DBE0EF94D034D965CAF291BC8FDA8E59F05F463AB69B360CBF81A007474A66B1D6E9B48AB4F1CE9C01E8EB0BF93C4B097FD9B64C88895B7E5E6936C017C2F2ACDCE680B9DA7DD880CD8C669FFD8B9C0D1F270EE6335F5E803CF0C00991D06086813000C06EFE581D45058B6CEA755879A1F38D6B3C8EBC9AFC49672B3E9BB4DABE329DB0695292721735E6BCD3AB93B6A5205E5D8D8ED12F4C41900146F7DAD5F3F9B4C0117894781EC1DF651F5442944CDFD43F2EA7BA40B621247B6550B302A8F108C43AC877529160FF81C6FA6E21571F6598D097AB882451B00C1EF0479B1B70B963F2C1F1085866F257D36047C9C545E3ED0C4879F3419CF489054F0FE5430F1BA195121C53FB34A568972BDEBD82D496AE6507DDBCD390000C9F1DE47F4433CF640935EC7EA38619014658D65D08886DBF521CF639D70FDB962F59A4445D8F7DDA50EE18725E063B29EE82682DFBBF33834E22B72DE3D1F0023EC2739E494C7AE78A6CB8F224B801350035A6D965E0FD0650F9E26F20EA93EEE962F42E11A0FF9B0659B14DF68C563654F6C1A025A9F59CD66E8CA5A71050026F6E86B44DD31D749E3BC22AFB7EA77542DC6A7B89E3D6B7364EF775FEAF393E8DB6C0FEEC39DD1AC0B7BE3B408429B0D80A5F4C9E1B1C38FE8B7B09A5806001F589EB509324F36E8353D61B2633AE82490A51FFAF3F1A4E812B965980BF81832E8239F9DD769D31FD871BEB5E1223D4E781C1E224B2B5CDEFC47ADEB980B00 -smlen = 3503 -sm = 7E884C305B7DE3D806CDE43D7E0EA75773460179BEE313476663673E3A57A9F94A0DF9337F014E533C90140091B9D991A5286E9C7144E5DB005A87663AAEE44FF7A83248529138D8BC47A001C2FDA2193C3C4E0B34A8DAD67D06E87A86D201994FDC6D67D3C45FD22BF633639F5B4DFDAE00BB6934F6AD3D02B589EA72781AD469C81C400073D28F4D1DBCD2B2E14B3D13C0651C8D66D6010E2DE6A294E0B50EC44854239B6FE739EDF300355F26F1F175F052BF94EE5FD66539967F4701C9AD04B952583A2295B8639990D675F8401100C3564ED40F95013C9B388A51FB49A297204900DF3296079052A97885D504239D70A8902DB2015F44D747F1601015EB0EDD4FB80ADDD1B7870001DD6E70926F0A1B96CE400733371507895E13A5EA010AEF700CF292EA0A5F161F0203C58B9E38D26E07E4C2A213767EB19895A0D30008E38F692A195D026AC9D059A92A001F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 - -count = 96 -seed = 26CF860726D4DFA38AE07399838BB336F1BEE59E9F23AE4C81E73D49964997EF21CB5F5412F9A70A1EC39FC6228C36CA -mlen = 3201 -msg = DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 -pk = 966AFB086EDFAE3BBDF105697940BABD555B471BE9522463EDC205DA3F13E389908CBFB2CA25E4D05453C17698F8BA14015CDC7E92A10373EFE6B498174C0500C8A308694E1E10D12A73F755D80CAB435602379C821397F23896DDDA4FE4BA4424AA5E7D96320A6E03B1783E375DA27BEE92D8692815A26AC2348C4C3BF01600 -sk = 966AFB086EDFAE3BBDF105697940BABD555B471BE9522463EDC205DA3F13E389908CBFB2CA25E4D05453C17698F8BA14015CDC7E92A10373EFE6B498174C0500C8A308694E1E10D12A73F755D80CAB435602379C821397F23896DDDA4FE4BA4424AA5E7D96320A6E03B1783E375DA27BEE92D8692815A26AC2348C4C3BF0160002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFEA62193EE14E765F773DF48411D615C10D9A00F76542187DC1531951FB47D6DA43523BB5A533BD236612C304FA4B559F157103CB0C3F11C18856C559DE7836C4101E4D7FE51CA39F294FDD2F14AF116A6E7D2EA78FF42E740800000000000000E877AFD9005E08AC525A67A605B85AC1C0CEA8F4629964D37BE79730002FF346E0EBFA250ECBC14B1F1842A401A1268FEFDD23949BD51DDB90B452E8F99E24A3EB6B27F495CB3C1FE06672C9BDE6C4D24C004993BB83A5FDE2F6FFFFFFFFFFFFFFB8EE4344ED0EDC43F7F65BD34231DEDC87C8A74F056BA3FE02AFA7BB69439DD8BBEF9C0714E99C9B22135E05D589722153BF3FF895D373361A4701000000000000000000000000000000000000000000000000000000000000000000000000000041449D3DFB649E91F5879FDD022914EEF6E8D4629304A1195419B3547D6131E5522DBE97824B3DDCE331E02C7FED28150D7702AC5BAC35AB10300300000000000000000000000000000000000000000000000000000000000000000000000000002BBE29AB0519A4DE29F61365B88B40460700AC2E7A27C68D1AD954611A08DE1692885FF741679AF328667B293FC450C5408275D8130E95CDE85E0943C1210300C097ABD88569E0D7668C3D970AC51D8FFFAEC0A5D8711DD520FCA3D2B385D619BD8CB4C3E7AEB2662111B982A36EC6DF8B47506B5AE4E2D29FEAF9A2E9CA12005B99B5A32EDE25F5DB5BDCA4A9F7A75689A63287625C0DEBE42F6DD25E2260ABBFE28AC03CABD3CE26607A48B3A41A46D94DE8BDF79A0926AABAD460E1CD14007A2F72CA13600559EFCBA83975AB8DD7F0FB68AEE2B9063B65B92FB86201B08C21B53E5F03FBC40F36A23EC9A17696BCF743E6BF832B4EDB5E198024E1E616005E6B092C4BC5AE081EACAD732269C51D42473015F8C1A1C12D0CA1387A91738AAE50DBDCD7685B64E7777CEC7BC54C68A4AAB221486E31FA3996A2DDE4D52400BBF54C7271E0762D7D14F7BB30A2E3029867AE6E0EE39971ED8553C0841486DAA9AF88D0BAC29B20B01D5A947F7DFF1EE6466E6B0BF43EAC0743CCD451130A0074D61E505627F14581921B616A8817087E5BFEE6587FFE69183F4C9EF8E985EBF4FF5601FD9C629678DA199F2EF9F8677C513812F1B8739390D6616F788207004CDED6404E2DADDCE10844EC6057066E684E22D3CA249C098A88065655E5782495D55F55A92C490980B738438EE04FC572A3E733F47EDAECD4CE5A6C0DFA1100F157939AAFF448F47701EAF029E2C6743B6D159EB328F3DEE1E398B0A0FC693696DAEC13C4B8D3CAFF15B239134D70E0824D9090898CC6D374695E3FC74417005413F824395E726383605775BA9995FBAF611F6ECF94BFB7F0B87624147BFF15F70E88FBE3E559D73AE140915B404EBAA80665E19AB074945087B4A9367B02007F422BB6F2AD1BBD6383F4F48B6FE7CA23D7B1791F6E9E7747F89B120CC2B5DD00FBE2745ED623FA5E4F90485720DF9E26558D0E6F5B8D19F079D11201002300F1D3A873868C1312FD7B009F1F12D5FDB1898CE04451903223D6D77ECACCAF8A7C89E5DD29ED191BCC84B7EFB005C3200B5627501F36C070EFD6D614DD531F003898ACD92B67F127FD859ACCA1FF29DA3D175CB626D63938E58F5FF6AA3F9794CF930DF60275318646814CE8CDD0B5CB0928E09982AD7D176D49D42D82F6130035D7E259F6E649F422A49B32F985CA7B2EEA0A703B5813072B64D1A10F3AABB46998DFA0161CE30872C45C030036FE61DA437F471F4910C32AD6D5216E591300 -smlen = 3536 -sm = AAA7081496D3AFD8B64413F71E4D25F3704201D280E37A7D52281666986D65A32721AF8AF5019540173C065CBDC2D5E9B1898B6626C117BF01F13E561D57E828C93861810BD278B75F88AA006066B7AE1D0CBC2548263BDE39170F018CA90005BF1248EF8ABB961C604A1CE9B5F5CA011A01990C1B34B613C5FC731EB3CABBBD06628205005FAC7946130B1277FB39C4CC0DC1DE8E09EA0077F03849028354B85254A198D7C46FC58DC201B7F25247BB83BFC86C03391FE288CFE5A2F500B09023B7B3A14762A86F6A79553C25123ECB0037C40CB902B41D0482123CC7B95B0F443725011D164EF57D6A4C964AA2F5CEED8A8E8CA21101EC37676ED65C9173507D8367AF789322AAE70001BF1B78439423785945E901BC162D0231FE5AF8E0D45BA14DCC2A97E57DEA04CE06037F9116EBAEE925FFA303F46644C51755A5BE006E6DA66D8619F3140BE83FF58F8301DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 - -count = 97 -seed = 13F1F446D9AA5AC853278BF74C9E6447A6CE4294C037867F43DF554370EE261D05C7260EEBF46D6694D0850B8343FBE5 -mlen = 3234 -msg = 525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B -pk = 39C75485265428F37D9F624C94B73CE2309A05D97026239A37D746D4ECD460709812CE30D8D101CB7A124C626A60884B285A3B25F2779FE9AC91505297C61600D78F0D08EBD4AAA23112CCBC222C6C39D57B3143BD4E64797D5D988BD3853AA1E612DC72AED26F575A96116874F49B67654A35B2DCA3B6676CBAE2AFA0C60D00 -sk = 39C75485265428F37D9F624C94B73CE2309A05D97026239A37D746D4ECD460709812CE30D8D101CB7A124C626A60884B285A3B25F2779FE9AC91505297C61600D78F0D08EBD4AAA23112CCBC222C6C39D57B3143BD4E64797D5D988BD3853AA1E612DC72AED26F575A96116874F49B67654A35B2DCA3B6676CBAE2AFA0C60D0002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C17B80C3AD1D04C37AC902ADEB2F40523C094C58C063F078F0BF4BB6215CED0CAD35D0D2824D01B57900278F3D16D74195A45A556228359418871EA8EC3B94338DC4465580787150E2B909486359945FF77FE0F8CE3F6576650100000000000000680B2234A95C9C57B627F6BFEE9268B97F1E409B81714970D288A4E4F2BA7AA7CD98F70D5A5D9E4EA1F5E3816C5EC31513667165FE4FA49F2A8D35715DD2EF4D1925FCE28F3C7743097ADF688B420A96E9B9C0253FAF00BA11FFFFFFFFFFFFFFFFB0CC2A677AAFD091115A500BF781CF8BE8E98881FFA5DC58CA03CE595CDE19176239CF3F39007864C95CE8C6479BE361AA99409F035E7E792F7AFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61420B0CA1D356B8922A3BB71C1A48C748C8EB1919612426F5EBE73D9ECDF91B503333142AC5D2D92A3D5F8B8DD9E16E7391DF1C36E47CE3782C0100000000000000000000000000000000000000000000000000000000000000000000000000007ABD924FD71E0EE7EBAC1CA5641CAC3CBE6C94B33D4C0B7987EAC8926B1E23C455C134992D1783B8CCCB77215F55B6449B4C3E6F612CA749CC021613BB7C1E006F0C06102328380FEED536E85BB7C2E936A4EFE6BB0C9593532B1D2B1D3935419FFDA83A09A6236A3EACF8A54E422019AB4FC41C755106580F411E9EAA6F0E00652F84534322FD4C5325118371DE1E6E475A6974E7C9557D7C7A1FB4DC0AC60D9F2C231301EC902201F60FCE9935EB7A4B0102251CA3A19A8791EFC3638C0500E58F21BC9FC2FAF639601EC3FC76507BEABD706D33612EEFD6EB03581B5AA1729E503B2EC2A564B9C1F473B310B8FD2E794DAF931FF9E818FD7C3BEE5E65160020A19E6E07FF883B3FF9D1A884EEE1EA2097409128DD685D180A5431A615EE17D5881D03420D293251C89A2AE5397E85DD4EBA20B7F4E138808CB44ACE271800AE50D0A7F693B3301CCEBF31FFC3CC8D07FF4AA2FC37E7853C3EFD94CB0E8413D46D25570708CE1D693058C19684C968D2189854E9A3744C1185CFEB01A6080030E46EA4B16EF89A7811F60F09E4D08F5AEFFE1A046E42EDCB91C1A134012875EBBB865629DAEAA101AA9119CB2ACDAB76503BDAAADA98ABB49DC2AB40BD120051EE72178902242B41FDAF78086A794951C9E009AC5DC7CAB511ECFA15687FC0281BFBD8D917322B9B8A9A52F0649A2838D8A9840B5510FA95BEA7FA455100009243DED29B416003AB8A851ACCD23102064D6683B01E46BC2E1D23DC6ADC8090D075DB6FE3FF5C69C94E0D145FFEAF2C3C9F2B8AB61D47125DFC51097A041D00DCF0A489417C5DD4F004DBA9E5F03F79B70BCC550E39220BA1912C85E0BD48A30CC19BF32484EF9C5472C43B007D2FF8B215763D7007A6055C355F942C2C19006C11D8B7191F3A9F048928B317ED653458B933FC4211C23CB6AFE0F2329C170C18393A561A4C6EA0E1BFFC08F94CA887AB4A47E3A00086BE205C3648FD6A2100E6932C979A0E66CB64E646B3A0F02E2A0CF19A6FF019054CF0F62906796CB59FAE7E0DA87F98931084E09F79ABB8C4FCF2E090ED4E80643CDC0A9B2C64182400F608BE7AA5FBFB1F3DA2530881EDB0AC2055801B926B2F4C7FCEB6A0E9F72DED3CAC35C1F6D37A15B401E6AF1A0E7B6B0826A61B7B694C25855E1B17ADA91400CD04CA1F6B8BF7B23C88064A6C787B6E0194C4E15F31A281DB47E725DB8A6D7048DCDBC4C463E7FB240D3B66252065C121FD2A8467E1C41A6B6E908704BE1A00 -smlen = 3569 -sm = 10CB3B70BC90CDC4753B2081F88BE0673D0B01551D2BADB6DCBC05A21489A254A777FFB8F4013335DC429E00DF387DAC48FEFEC3621F706B00F78CCDE16CF70A9A7AEE2B17DC5400B3B8C4017859503785937CE5A45FAD893957DA973C6A00C2231B900682F21605F68AE97FD2142FF4F00039B24687BE2D8471B011D15666F7A46EDBA900780A06F9BE61DB131EF77244AA4BE447284600AC738CC024A5107AF9C202C8595B73C59AB900D18F1C6FFB82D57F7625E80D7788B29F229700C1872EB63B04B0B8DE03691021B3FB8B7F6D0110E3C8839D993B07DE32979B992CE863FC31014661E4E58CFB33AB5B1DBCAC35D1645894F5014C2D7576B8FA16A31BC5CFE470A5221B58050001DF37CAD0EE6B766DFEFC4D6C81A504D74C60181F4C22A438D144D36355030D0E0403DA45E2F13100654E4A878EFD9A047BFBBAD701926DD15337BD763A1B81BA95780603525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B - -count = 98 -seed = 6F6E47E8336ADEE99B2C52CF2DC8D461E0A54C3DF2F08199A9F0816AF8455381054CE47A7766726D3AFC2E2F2BEAF8E8 -mlen = 3267 -msg = 00769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 -pk = B721D737B1C48095B3F8C6660A8B41E08000CA3CC91A5EDC816DEDA7590F939B7D5C1A2A36A0D768E4602C0782F304004A0AC2702B1F2E5523B98A386EF21C00BF4B1905BB968374A6D650E8800D50CC01B36A372F5CB3034A86D1C66F259A903ABDC52593B68F44CA96ADAE17E4A82127C07A8DCB9FA714934232A15E970300 -sk = B721D737B1C48095B3F8C6660A8B41E08000CA3CC91A5EDC816DEDA7590F939B7D5C1A2A36A0D768E4602C0782F304004A0AC2702B1F2E5523B98A386EF21C00BF4B1905BB968374A6D650E8800D50CC01B36A372F5CB3034A86D1C66F259A903ABDC52593B68F44CA96ADAE17E4A82127C07A8DCB9FA714934232A15E970300020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008EE464187A0F22D556CE360E498B98EC95F051B08B61BB55F17A325293F1BB3355A26EBA15FAAE165D26C54C40A43507671281EC66C401419FD6121771F5E01FF35C0089DC0C1ECC109B8B7D77CCA7B348A42BDF75271D6E291B000000000000005D80B6805BDC7BACC664AAC5A18145D2CFE8F1DE47880B546559AB7A9F14D38750CD3905ABEA71E74592470226DB58B00A53C6C0CA3D1D4892F5FD55A43C6A388995332C9E2E1DC135DDB8BEB12BB42D1C648BA68D02B02635FAFFFFFFFFFFFFFF4303A0DE7B4F23FCC60D25A5A73AAFBB654AC91A0E5A5D0C0F6CD6A14A079951AA93DEB37CBA1CFEB0F7F079B189BA7E526F1D0F475BCC44198FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF424B8B6A9890B5B2D9759340207C9F0870296A7DF3E6C2BE3772B0BA3894EEBF1DD1FF1A1CFA45BF8B49F231A1C4ABBACA07D454E4C6CEDC9B51020000000000000000000000000000000000000000000000000000000000000000000000000000B3BD1B71792DA40022BB89DD8805374C399C26414007AAA4D03A73191CF50AE8990BA7029D3A084B49ED818B61518BB04B743B8D189BF759DB2068E40C6D06005D291E815B5D25ECB60F7277A5B806AB369445CBA05EACD2705D3B6DE5C98C2E83E8E9EED534E790AC82D885BB9440048CD23B690E74493D8E1CA6E1CE1D0800FD8D75FCC3CEA9EBFCD088882562EB6062575734D18B34744A20D46B31E7695C5E4851188AD69A52B435A60F07017EFADD0FD021EB9BFD25D634149C7DAC11003B23266AE963C89567F82EE2737717D617B4453D72003A25A3CEF0B05A23F442FADEED5621CCB39ABCF9EEB828951CE9E506CB127FA2524ECE6A4C228B21170052A015F5E743673DDDCF6373B3B109AC2C87766E29CF56098D4A1C5C1725845186FD75FC35EB71B740C77753754BA31F21B22BA38EE595F215239A9A165F1400E41DBC7DF839AA0EC24FF7501B511C8618C739F815A880E667BFCAB6F8467C348C328966E680CC3AF7C18AE4AD0EF0AA344F2530BABD5F88C881DA4CA4791700111E10003F8D91265A50CEB314C2FAE30C520A69E7BD5FA71A1EDC44A7892A98847F9C4D78405631269DC35C4EAB32DE820B8728C6806826DD969497FFB91E008031EAF2B919B4CE21C293B4233F2370ABE1E046AE6995C1C09955B445483CCC4FD53E1DD25EBC7928769157392130A00DE0EA8F68AB8123A471430712D72000BFF4B28D05189A385602FA746556A924C7F7602FD0CC5C5BDBAE480D9277733EA5F083A2A1066E6F3552B5F2ECCACCF15FE94660360EC10B320D41E968B61600FA9F0E4EBC02CD348831D177685691F47C24504175C3B60A040C1642AD12B3E482751F0A27796B8C32BA224AF0FA1F65139A8DF9731F766C50810D8EB50625003979CA61BF25CC87424D29BA53ADBF5754E5F6C62A283D834B9A9C3DC68F22467B62B06BBC64535B8ED4A52F907C86EEBC40D53311B4F196F8C6BDC603B61E002BC03C1CBD2F2341AF3D1693BEFADAD8DE2DD047F9F8BF232928B814310FACF55E77BB8ABFB6FCEFB14BDF30B339E0698D83AE79F6D592F3B8DBE3C9D96E0A00859E36B4EAA99D23F03371A8C24C91ED0A6FD769319897F8EA2131D2EBE2B8EC5AFA75CDC87BC8D6E98199418E323FC67FFA8F7EBAB9865878F68C2D150D04002EB0892A4BCF069CA5F90182ABF97773496871252B28C810CBB0469055BCE8CC1FDA34B8C154123E3A2F70425A0CC87DFD508D6B327A81A7A9AC225E0B471A00 -smlen = 3602 -sm = 1E88477206532D422211B7C593D3A0A48EF60097A3AEA6E6DBC8FC0FD2E35A5BB7DCC9C255000D52EDCB244CF018B5326982CB3562B253070017914431CE622B4A0295AABE8AE964091566017E0DC597BA70ECB5DCCF427FF9BB494CFEAA0066847C938E5BDECB26734178FC0A567B017700AD54120343D2049FD162D0948147B60C9524012698CA65264248036B09E786863E08DBA43501F570517EAA524F2D4A6AFAB1225A7500A07A01D5EF6E3F744D5529289DB758083725E816A50026946DD59E549E17B26FFD7059C36CD511D00054F52BCE0C5D2A61E1AE3047EB034BD1A4B001F22967DDBF18F543FF3827261A4850D4779901836D6F9C3D83C51648F3AC12C1842F7B18BF010141C7FE867E37937897D26C3B83318201CCA04E287604FBD27ABE4AD85C2CF0CB050248D814FE9B1978C1CA48CE97712A9A1B78A800E009E92D4E594C731BC642220CEC0200769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 - -count = 99 -seed = CB2E6226615393FC3BD4AB3A412AAA030AAD40E8648EE6B56D2C1591D8B97915D88F2D22F7221377B4B04CF2AE9ECC4E -mlen = 3300 -msg = D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C -pk = FCA268539F249F769BDB0E95EE3FEDA564B5EE88725A9B6D4E7DE533DF81B91CB00ADCDBC8F4838DBBCD20BD2109D5B585E9FFECFD06A8121C335757ABA71100FE2EF5CFC439C71C10F0749AF0377ABF051DB0E2300B94CB6E92156D1B4BFE5FEE11BE1CCB9D3874B61FCBF7BDD55809C59A4DF4E461F6B2D96D17FF35970100 -sk = FCA268539F249F769BDB0E95EE3FEDA564B5EE88725A9B6D4E7DE533DF81B91CB00ADCDBC8F4838DBBCD20BD2109D5B585E9FFECFD06A8121C335757ABA71100FE2EF5CFC439C71C10F0749AF0377ABF051DB0E2300B94CB6E92156D1B4BFE5FEE11BE1CCB9D3874B61FCBF7BDD55809C59A4DF4E461F6B2D96D17FF359701000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053F959951406B4FEA998B6B6386C4E3570CD5DA21286C9FD72516F624E5B7301B69432922B50157D0311B866B20113D330599B30033322BD06C912214F21D920AC3D605C036E6CA17BFD41BA61DAF55BC732B0DEAA118BAF9D0500000000000000CE67687F5CEDBD0F3598C9379F5989569CF9AD728F42118226118AEE7AFE3E05CBE76CC90967FA8278C0E0B5B69AA44DA73256427B66691B8191B85866BBE3B9FE3FF887EE990D4BFF6C57CE268289AF8A26A12D25032122BCEEFFFFFFFFFFFFFF463AAB47A87A8714AFED8F28057DC9FA043452F87A70C033D4FC4BB244C669A264FBFD1C7EE062129ED7A3D135A1A4FEE7294E0DCD5ED3101C9BFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43C5343A94CE6C6219A1AB37EBB98A93055A0D3288E5ED59DC2C215E491724985C6E1D6B9312FE7BEC65A0CB3404F56EC544B8D460075AC2BE85030000000000000000000000000000000000000000000000000000000000000000000000000000B04B688774EF73289B4AAFD9DC3E71680A395DB6B6E6FA015FAB6994D67E54EB1CD747779BD1C149A25A492FBDEAD4CFE535DF4644F7AE0983BA8BC094422400D6D28E2585EDDED041C1C85ED9C37E632884B3FFFE472219E6F4D3F10D14D7B5A107A5951BA795D779FA2332997CBF6B3773D172146A872A07D09E75ED080E006AE2152803206F1F2C94F36D1FC3A64423C28FF2A0A65426A38465DEDC44592B4FAB77C295BFEF9AFA5554D113C50531A5A18618DC189EB0BC55C357B60C0400EA4C0A8C3C1C0C71E76D3231DCC0B9EB56DD287229B4E7400AADC83694F34831DC9425884F0156F8E21289E4ACF67E6FB372F6BC01F20F6BA60024C3FF090500BBC0F6ECDDC33A3CEE64DF90331AE73CCDB9599192BA29A67B36772C12A0BAE3BB7001010E6B03008386EA6B8B9E35EE47F671638EF23313D9703903A127220012C1908EAA3507B63F2F72E801994B654BEEC6BE78B5B0697EC0C7B37CD3EAE776F733F7E446B9359E5E0A57C75608CDA54136ED0E1072AB639AA66874980600DBD49CAC09CF1D246FAE3FCF431F1CC8CDCD8AF758E4AA0607CF914A4E5C6E60B492A25CE7A3CDFFB05368EC003026234A438C038C1DDFB3403BF17AA4570A0045D22749EE34170BD17558D41318B2D4BD07D28CF892E87FBEEE36CAB2278C28FDDBA3398B2459649EF42441B57CC625BCCBD4420EA1AAEB5C20250610201A009F1AC8E80190A745E1A3C570E2BC3296E213E38E5CF30CFFC4A1E85B30D461503116195F32534AA60FB5D3702D42AE98CC13C60D6EE411E0D1F792244A07250031F41C077C1C44E15375835BC71D377036170B6070C59BB3B14C39813D55D08DB3211FC5B1981399EB0E45FF791B1FE3E148F8690A79E0F3EB41FB0AF0EC1E00A4E82ED0B7C8D4664E700BAE87E488C0377AAA68474BC89B89056E01B9EC0C733C68FF78C4092931D519C20C280BB3BE38971934E6B84A0D4935C2DF0EDB1300F98DB78DBC739FF2CFA9A48E469C80B7D3736E684DE09005933AC8445E90E3E240E0FE406714E9FA3A1C0FFCB557C1CF99FBABC9271A72730E4340B80CEC0100A118A60E71889A2CD2E75402D37C4D664498277068364DB5B4C811A335001750D8D5575DCA9E3690255F84B8FDFD507575A860BC1D6C3A88E47B9E5590A81C006F44269D7EF217BDFCD3491B5D435EE5534A007E62440909F9B64CAB3ED25472111D3F91CF80B528FFA54C759FB95847641AEAA656FC1E458E2AD0BF66170300 -smlen = 3635 -sm = 192142CDB062BEEEED496201493566231B7F00839973A4DBE60BC5073A65A2598B97F029B6007A8A2BB331786B55E704F000E8941F1B5B570187FBE8BCEC15E06D47B7338262A25BBC0FBB009CBD005FEFD919B83F04D17DFFF36F6EAEE8016550EF2B9561133A971316CD679535CE3F060193649DBDF18C004B4AD09D5F93B137FC7466001BE57D22663993954584359F3BC7E6E4E710003BD4E1FC7A7A29F0E9FD941A9670DAD5F0C901C0B14B3B507789F7959A641997A655C25A5C013E35DB7D26CCB6C6C7C55327DB3378B9C5E2012FD6D14A6C8131E2071636E73957A81B2F37013D4A41F12177168EC65D22F1D385C84C7B54016497C9CB64D8D7C353A5378CE071B4BAEDD60001D56442133328542CCC80261C28401280CE4C402C253DBB863B1F323A0B3F7E5B0703F822675CB2E218F66794546412F1801416350000F5F7329DECDBE50ACA9F4EF22A04D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C - diff --git a/KAT/PQCsignKAT_1138_lvl3.req b/KAT/PQCsignKAT_353_SQIsign_lvl1.req similarity index 100% rename from KAT/PQCsignKAT_1138_lvl3.req rename to KAT/PQCsignKAT_353_SQIsign_lvl1.req diff --git a/KAT/PQCsignKAT_353_SQIsign_lvl1.rsp b/KAT/PQCsignKAT_353_SQIsign_lvl1.rsp new file mode 100644 index 0000000..3305dfd --- /dev/null +++ b/KAT/PQCsignKAT_353_SQIsign_lvl1.rsp @@ -0,0 +1,902 @@ +# SQIsign_lvl1 + +count = 0 +seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 +mlen = 33 +msg = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 +pk = 07CCD21425136F6E865E497D2D4D208F0054AD81372066E817480787AAF7B2029550C89E892D618CE3230F23510BFBE68FCCDDAEA51DB1436B462ADFAF008A010B +sk = 07CCD21425136F6E865E497D2D4D208F0054AD81372066E817480787AAF7B2029550C89E892D618CE3230F23510BFBE68FCCDDAEA51DB1436B462ADFAF008A010B19943116DB5B4552B05B174969C61C9C8701000000000000000000000000000094F28A5533DF8872E3C7EFE3D45A175A0CFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1959E3D67EADD79948DB766D9FFAF4D3FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000358A8756E1CA2E31C2F3C879414AC08DF7EA0C1D732F9AE3D1AC4644E524340095A4F53D286FDE8A7226CE960C152C344888C963A457B02CAECA41C2672D76000365B548FB9C9E6C0E149BABA3EC7BC33B8F052B6B9D4F840A2AD67221C8F600464B9862D34ADF4D562F3836EBEFC4D8F874351B3E63A4DF9D33C0BBF9EB1800 +smlen = 181 +sm = 84228651F271B0F39F2F19F2E8718F31ED3365AC9E5CB303AFE663D0CFC11F0455D891B0CA6C7E653F9BA2667730BB77BEFE1B1A31828404284AF8FD7BAACC010001D974B5CA671FF65708D8B462A5A84A1443EE9B5FED7218767C9D85CEED04DB0A69A2F6EC3BE835B3B2624B9A0DF68837AD00BCACC27D1EC806A44840267471D86EFF3447018ADB0A6551EE8322AB30010202D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 + +count = 1 +seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 +mlen = 66 +msg = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 +pk = 8FE148717389E48C123C9AA09FB17C5C6F0CEF7E3471EF400296E3EC18E59901E7BFBD3AAAB48CB49E7198D5543AE786727D904425F343A64BC03513B09472010B +sk = 8FE148717389E48C123C9AA09FB17C5C6F0CEF7E3471EF400296E3EC18E59901E7BFBD3AAAB48CB49E7198D5543AE786727D904425F343A64BC03513B09472010BA11181252D9D0802618742879F3A63DE88060000000000000000000000000000A08AA9609F098A395348F267EBAEF4DDFAF7FFFFFFFFFFFFFFFFFFFFFFFFFFFF2B47CAFB3D485D1A4F57B50D87D1E4DA12FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000001B7BD41098AA5A7D32060BB16BEEFAD5831D1012E0DE6848601925EF238AE600277B6BE2B3A67E51D6E0699E627C3DEB12B1DCB3E182028AACEF08257E8ABC009F4FC464DD478FD5718EE30EB0AF68C14026676C95849BB91AA2DFF2E2AA5D0040A0C68DDDB3EFF91CE84E7BCA98D9F3565A380351B9AD6694C2390C43BDBF00 +smlen = 214 +sm = 410E68D74D44A5CE60EC0C05232C9E08A12AFBC5C4584F3CF9DBF3E235774D01D420A17EBA5C5B2BA8B853F5BC66670DB2E3BBF8B11944E1D82B22896E76CA040102E9356A08D41768E8B250B54C33DE5A3F07F5A5F1667BBFB84E8B68E10B07077FDDC9268B4267E5CE42C8C04F17412E200F7B59038D18600D95C2A7C84E54312FA59ABF9342169F4A4D7FACEAB4866B030204225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 + +count = 2 +seed = BFF58FDA9DB4C2D8BD02E4647868D4A2FA12500A65CA4C9F918B505707FA775951018D9149C97D443EA16B07DD68435B +mlen = 99 +msg = 2B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF +pk = 160425888B22C9793C4F9D8228590EDC3B11ADBD2F17F59FD29CEB3BE1B8C003514B7D201BDB3A9251F704E33E7C0B6D0CBBAD96A5EDC702CD442C4FEB96A80402 +sk = 160425888B22C9793C4F9D8228590EDC3B11ADBD2F17F59FD29CEB3BE1B8C003514B7D201BDB3A9251F704E33E7C0B6D0CBBAD96A5EDC702CD442C4FEB96A80402E3844C89E1596871B97C796605D53D623B010000000000000000000000000000766EC68D19567BD8A5EE6FB1B531ACA011FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F52867CCACB8612A4E59E912F7A8AC300FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000FBB62E3E179D26420CA695D6501168770A9DCACC07ADE6B9228CBB3038698F00FDF8F55B18160B23BD15D5D700BD56D60F69C782FFF4F824198E87F4ADF9BB008DCF8F2A82FD20389DB4909687327781EEDD33F01044844CE4FE3198A318F4009C8FD51F853703768F5C23CFE1CB99CA16DAA16ED3C79C4EA8DFE41839637F00 +smlen = 247 +sm = 58DA3D100C32B8C6DC81AD0AD5C072836A84464E6E1367698CD5160F7F643E0175F0B64F92CA0C144B4542CBA07B4B1FAC3300A5C474A65B3EE104C167370A000006D93E378906BDCA812BBA0978C61418BF63037D989E938386D87330480006580941F9F017A013082513BBCD9AC40AFC809B2BA02DB602E971010D122CF44D853560F50B191F64F3F68F7ADA0D57A09E0114022B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF + +count = 3 +seed = 58C094D217BC13EDFDBEA57EDBF3A536F8F69FED1D54648CE3D0CCB4847A5C9917C2E2BC4D5F620E937F0D329FCF8A16 +mlen = 132 +msg = 2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE +pk = 1584B4356B7B4E181EDCF26987F87BE2AC278594EFE19F4A19B2B64E35D9300093FB5A2203F31BA91E3D544B3D84451DC05C95006D6D5643E461CC68F749B60102 +sk = 1584B4356B7B4E181EDCF26987F87BE2AC278594EFE19F4A19B2B64E35D9300093FB5A2203F31BA91E3D544B3D84451DC05C95006D6D5643E461CC68F749B6010285488839FDF37A59EA81E89415C0EBDB36000000000000000000000000000000800AD7010806B5DC2B29797BF2C5D92793FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC16AC0EECD16EC83D80571FDEEB7651DC5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000006B898C550906EB18EFDB76BEDFFC61B133689140923133BA81C606972D7DBC00CEE80FD5DC8307929AA199D39BBC1764D94BB07C5BC20146A3E5A388475B06005C4CEFF1DC0B01FA0E39F09E54B2B2AE47CEC813FAE39E2ED1648375188374000F96AB88873A63E011D61319C62CB32D5833D9AEE89B0993F7FB4FD2C3B61000 +smlen = 280 +sm = E0B82F57B5E76BCCE7CD8EC810AF242BE46BF0289726C9E962E1D1B21CDCEE0269019AD486AE5C386201EFEB356409EDC6D83B94DB5443BD7A2BD83415623701000195A78C9D44CC525F56CF7938C0B25B332C3F1BB1E7C68971B0AE4326D73E4315B2517E0EF1E56B5B3DFA05A5885F25E0D26E57E315332ADA8EDDB914D0A7A3470D1EC18F38E6DF5EBE2D0FE37E1D6B030B0B2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE + +count = 4 +seed = F1902A7815F37BC7F5802D8CBCE5B48D82EB85691718062BFB84D8C06AA41D6E9039B0A107245DAFA4EC109A57332914 +mlen = 165 +msg = 1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 +pk = E964EC7779D36D490F0FDC3B7B273C6204549ACAFB30383B964FD89968AC2A017FBCFC346BB8D41A294B595B6D108BF17AD8866ECEB74994681F1FCA792CBE0308 +sk = E964EC7779D36D490F0FDC3B7B273C6204549ACAFB30383B964FD89968AC2A017FBCFC346BB8D41A294B595B6D108BF17AD8866ECEB74994681F1FCA792CBE03081D8BFDD41162104E4092489FED630AE4E6020000000000000000000000000000CEFE929082D4CFE9583A3734E022BBCB3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF4F93D85F08F8C6E99B428B8ADACA48CCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000C9B91BA8EE272890D18A88A3D5B217B413D53AF2C3DD769D4EFA5AE435852D004CAD3A932F62B9CE1A714BD37DA9D51D1014E7B062C2115F94D59828F8005E00C7C8654BCCDA11C8DE6602D9C433A5B63A391CF883A68D0EC6080A015AC05C00836553A145A0E80D8525AD9B2F85D04B46E20697BF8CA88E1A1432A2ADD94F00 +smlen = 313 +sm = 2E14ADFF2D85FC5A0CC7323508D73FA2D5F86A531952348B4630EAD0FC4D7101F7690115791F320C05A970CA22291E0BFA410BB2F9D475E1C9B16005813B94030002C16D7B1832BE0EB851996299FAD5816D74DA19280C2F4F5EA6EE34C82DAFF3CE04B74331AA7142BF94B3729E12805DE56470D2261F5E7ACAB01A7234543D2AAD1AB999189A34549B3653667487EE80030B021CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 + +count = 5 +seed = 75224ECC026C18159FF92256844D0ADF953F0A4DD8D74D4EBF1DC5EE8F5630B011A447FD4DC34A2404D620CA0E1F273E +mlen = 198 +msg = DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD +pk = 054AF2DBA4F1BB5D0E19649DBBCA126AAEF0E2A4EB967EBAA3AAAE520C7718001A1EF8FB9979E6EA6D0C5A15D6FC08741297D4912D0629EA999BF66B8A9F660002 +sk = 054AF2DBA4F1BB5D0E19649DBBCA126AAEF0E2A4EB967EBAA3AAAE520C7718001A1EF8FB9979E6EA6D0C5A15D6FC08741297D4912D0629EA999BF66B8A9F660002914F905A9DEB9C4169D08338CCDE0666BB0100000000000000000000000000000023D943E9A63825E5EFE99A65A4C557A1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF0398E56B763AC0855C89D84308DA8864CFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000099A27B997693A8684621269BD76154A2C4EC58568F248B61896ABBD8B37F4000BC58FBB0D08547F8A58C4656D76C596BFC0E9BBF5A3D9BF6B2AFAE0C8B26FF002E6611DAE830A52982EBF55DB22A819C97825DD338B4789BE77A0704B9C3E6002988437856A33A9716EF8854EB0930A0E7BA80012FA9C5BF4EF2787279F1F100 +smlen = 346 +sm = 72B4FCB3D2EB972FAEDC5102C7370620C0702A00E18C96F040B9FB44B16DBB03D884C0FC81079BD080B5349AC55562DCFD79F4EB54FE174D3A85B731C04B0902000282C88F22BE774B00E5B98C2BD1D7B71027A48F3EFCA3D384341AEE771BE3B18C54067FBE0D5D0BAE2291DEF149AFB6AD20BD009CF53B7CA41A1BAA35354488BE394E4DB96496F437B49C2C2D934433010406DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD + +count = 6 +seed = 447F03C8CD27EDAA1FA0436DA492812F57AC946479A9F1F90EC4F5E913A05F8AB0DD7645026A96510F6D40AF05D85B07 +mlen = 231 +msg = 0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B +pk = 9619582993339BE6106DB75C6A670F10AB48D35C9E4098A4A903C007B12E72041745631AA2540728AD98095DE56B0687BA6682727AEC06E57CC766ABC2E2640002 +sk = 9619582993339BE6106DB75C6A670F10AB48D35C9E4098A4A903C007B12E72041745631AA2540728AD98095DE56B0687BA6682727AEC06E57CC766ABC2E26400021DF66A63EDF240911F86FF24F06553B0F700000000000000000000000000000002CE09FA60A5198BA49B4E61F32E6FC44AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF756D462E49D55763D710072444828F9420FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000795288DCCDC78590B12E6874333342D136CBAAEC62A266184ABF7B2E5ED02E004CFD69507059F38F941081AA0F3B563FE3EC4CAE08CC4A1A381950F86C081C002D303431F70F539DCA98D48B953C5F7F9B737B9B899BBF721477009641C14E0071DDF3DDDD14ACCBBEC4D04EC56E4FAC105FD5390B236239803707CC886E2D00 +smlen = 379 +sm = 0C0ECFE995AB3220147D0B6A9A31A4CB6BD3F6A518389AA14F8C37216ACAC50220833C28E1E6845EFD66D5ACED3A5439C50DD65380D575D0B5050617B895600100020BBCECBBC263113EB6C602F1D0633420B6A9DD64B58174315E30943FAD8DBBDE7CCF28866E9FEDCF897B79F4A116760FF4B02C27CA4653D1715FD4A40FF0E161EF6DB31AD42CF8E9DFABE12DB195700119040073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B + +count = 7 +seed = 8C151C556DA912A82DEB32144C8A8C9090CFAF5C12AB822AC3C72618837A41C2453B715EEFF3724CAFE69B1ADCAE9DDA +mlen = 264 +msg = A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 +pk = BB1ED0183D5192FD52FCF31315CC92632E443ACD6A4377010310498419B9F4012D924DB8D9847862CBD0A6F920DA91AC258D2B11F09C08B699E16CFADBC1F60402 +sk = BB1ED0183D5192FD52FCF31315CC92632E443ACD6A4377010310498419B9F4012D924DB8D9847862CBD0A6F920DA91AC258D2B11F09C08B699E16CFADBC1F604022701712952580F4C90393543DB33F066B70200000000000000000000000000009C61275DE3CE58383FC9C2BC08DE55543EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFB994085DEB576C5CCF354C4B58836AEA8AFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000079FC54110C24EF354367B27FC6733C346FD01678EEDB44BDAA36CF7BCF57A400871E2DE7A955EFA70F496612E6F12EFBDE6E96FC31FA1449131383D6813C4D00DC05D5D2EE4C1BF49477FD6E31102FBFEB00263A2802C13FAA47E04809C7E50083152212BC4F79A085D5C835FA8D31281EFE77E60E8D6C4A3ECAE712C38FAC00 +smlen = 412 +sm = 25750D798E050ED506B37FD67A1D5CC74B3B84239ACC1FAC04C4165156D8E50103BE1240850CADE72F97BC9CA9A56987B19AD960E65C4989FA4AE77DEC52EB0100006147A2FFE1448119857BE09619D50FE0E0A04A8118FEF32B35C97FD6BDA84CA9F5344DC3D7C73770DB27A3669979670B5F2FDF0A02779A7EEDB51ADF94DC278F788ADFFBD3E7311034742A22D5DF8202020BA1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 + +count = 8 +seed = 9B42F41492530EAC81992F17613EFDF155F407D7E67F18AE193EDCE714D65D1031E7AD10839AAB46D0850EAF5997AB4D +mlen = 297 +msg = 9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 +pk = B020D488F77878F3DC267BBC070DE2EB7E731E928406A3796D0B581783DCCC04F38B43C46C55098D4BFAB487E1337FBC7F77263F2F1E1960D463C0694C6EC10104 +sk = B020D488F77878F3DC267BBC070DE2EB7E731E928406A3796D0B581783DCCC04F38B43C46C55098D4BFAB487E1337FBC7F77263F2F1E1960D463C0694C6EC1010409F463023D090D72FB8DAF592256C07004010000000000000000000000000000AEF42C39E1E6F3BC079B53EC6CE05FD8B0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D330CC80B924C4458070D1A5F85867FFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000EDD8FF32AB8356C5E312D9D2302E86B7C6A71548CAF55E03D5C9D47A61603400167B55D784EEA1276C8BC16C96C6044E72F69CE413C67924146BB8FF0461A20053C6E6D70E95EB6A3B45CB1A41B5FA11636C43598DB9FFEFA0427E446CFF4200CB41E94944296E83DFA7F05051E2FB800CA0A39698BDD234BAC502C23992D600 +smlen = 445 +sm = 2D3D1A1EC4999E8C422239239719227F6E70BF73A688BFC79082B4C69F026203C156CBFA6375330F6EEBE063F891D4B9EB64A61B6269BAF1AA0C554B8872F00001007C473B905B61ED02C00A0C668E37DD0BC77ACD5335644C7F66562FE53A9E803B937E37B550A9E9CFE3A296DDF4A2C846250B778ACFF1CE349136C958FBB64D2B8F2982C26313A10EE0346A5CC539450211049366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 + +count = 9 +seed = 11134936880F5A11ED3504CF7B273E55A351FCCB10943BBBD186623EE6C7A13A6565C3080D1F536BFDB018F99C4E46CD +mlen = 330 +msg = 0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 +pk = 447339802BB9FF8B81F5208671439BFDA1533CB3311B4F9762107B6250515801708385F7113C24ECC3AAF1EAF65390DE9E9003BDACA9057D82311B76625C3B030B +sk = 447339802BB9FF8B81F5208671439BFDA1533CB3311B4F9762107B6250515801708385F7113C24ECC3AAF1EAF65390DE9E9003BDACA9057D82311B76625C3B030B0B73650687C6D3B1B13CA2069B688AA210020000000000000000000000000000267F461692FE57B6FFD01D45A0A0537577FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF9361DBB163F48C6FB85153BECADE5DED45FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000639A3BAC64BEA7B018AC4C0C7FDB16C8233785B741310F1601259594211C0A005A1FD392158A7091A6B52E305204EF75E5C53A2C1F447F97641B6CA1AC0C41006072E6308B1A44652C22AADBDFEC05E2E8148B936151473A44A172AEC38899005B87F797ECC007DF578E1A35F70DBE5131D2EB89B53A1C3CE029D45F4685ED00 +smlen = 478 +sm = D13145D9FF255ADB74604AEDA05DECCE5B78ADB8DEBAD255443173A725844002A3A53BED0CA716749C6BF95F5883839517382F8E67A548017DDCA691DAFD440302016D065753ACD792CDFB50D97988BE063B68CB85C3A49B68B9C06474060624830E8FA25EB621A290873EABCE887D66D2171E0DA2E88C91C05C991F44098055462E92C0FA6AEDADD6C6EB712BD5F450CD0311110998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 + +count = 10 +seed = 98DDA6B97E89A479D5EE214E660DD6B5D8F6CC638A1CD4F462A0EC545F5B0B0A1A403AADF566F7B1C0C5FFCA29B36FCB +mlen = 363 +msg = 4CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C +pk = 973D16E95C8FA8CF3FC36256CB6FCB93817E96BC32154517962CDFCF4483AE028E725EA16BBAE24E14C7DE3985DEF119751528319FF3F6E12679F4AEEECD710311 +sk = 973D16E95C8FA8CF3FC36256CB6FCB93817E96BC32154517962CDFCF4483AE028E725EA16BBAE24E14C7DE3985DEF119751528319FF3F6E12679F4AEEECD71031191262940DC1802DE43027E6E64D003288B02000000000000000000000000000038E11B27CBD0325EED58EBF7DE8A2AEF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF990FEF6FBEB6B472033C9221F099451F86FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000ED7E5B24E8DF10E88751E66885FD68D2EFEC6F6AE08A221A8AB498AEC52FA300766E2A05D7A4F2784A46FD3D102ACC1881F4E3DAC61006568929D29AACBD68001AA5F19B62E3177B310E1FCE7DD0F52A1D508567C632B811E14FC2AD73DE0800D16E8BCEEA40AAEE0A0EF0E0820FAEE867CC344D90821CEF5D1DDD34F5E4E200 +smlen = 511 +sm = 971201BEE6F39267392B27B28F962292F6511B11A9C08708BD5425560D358A047DA3DF5C0E093A0438FD82566EF83A28D543205B9E5110FF56C748DA405AF40400004927B3D0168910FE51A5E70D1F395C023C84833538992EF43ADD3EAC5684EE8427C2EE7F2CC9A9D848428866007E6761B97493D722662AA9AA4C17E0ABA1FBEDE846B9922E27362C896818E47BDF0E000B174CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C + +count = 11 +seed = D34A0AAD27ECAD31A5E08E9A2D7901A9B85F864D9B1B46F40CDCA0B3615B2CBA04EF82AD7BD8CF627C3E861477030BE2 +mlen = 396 +msg = 5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 +pk = 21945A302345D472A941DD5B915837971E8E5A2D03A77F11416341CBCC87F603AC583EA160B8D827AAF030FB0A745A6646A265FC37FB2F48B244346E2230080002 +sk = 21945A302345D472A941DD5B915837971E8E5A2D03A77F11416341CBCC87F603AC583EA160B8D827AAF030FB0A745A6646A265FC37FB2F48B244346E2230080002EBAC4D8DB77863E10309D0EEA10065360C01000000000000000000000000000046B88244469AE19D1E89D72C2F6DBDE462FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1AB1DC6FC4756A6F0C815714556A6C40BFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000FC836575739685A6B5FCAFA23EDBED57099EEF0BD6404CBF8F935F25BD45D00C4267B13667F8798A4CB5A1C0596965A4D3B2F376496F9AB86284B4502855E009F7F4E167287189A946C4E962B5A5DFE7192B399586D79BF181236F045913C001BB5C3DC780089506FBA9BB048ABBD027243FE3B7C1CFA43060067BB3681D000 +smlen = 544 +sm = 3029D1AC3439BD39E0B433DBF1DE149EA272C7B98F0A9A81659555D1089298016D8B6508A27352EEB3E290F5F35366B09490F17F24412D25F12D7EFF9BB37004000063DA13A10EF13A8FEDDB081FD1E2ADA5CDC1954C50093796475A5F447C2B47562E3A5208F7FE4D88E07B01D3707E3BF2ABC6EE29F04942CE2526D1EC4F531EF9FD1DB5AC16300E7D46379AA7876C8E00020B5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 + +count = 12 +seed = 4FDA9FB6929E3F391901D69FA0AA2F25A9657D249A620F1B9E305A5965676BA76794CAD3355EB632579C3958CA7D443D +mlen = 429 +msg = 49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D +pk = 60D60BDB8C80D3A34E62284CCD7D577006545A7A13FFE873182199D1D7242E0079739ECED41088CDE138314C4F592A90F06E8C07597BDB55A685D7EF5B454C0317 +sk = 60D60BDB8C80D3A34E62284CCD7D577006545A7A13FFE873182199D1D7242E0079739ECED41088CDE138314C4F592A90F06E8C07597BDB55A685D7EF5B454C03171972EF8DE4C3879DA6F516B11D1C849E0501000000000000000000000000000016BCD9E26B0B9ACC36D4F6D7A20FC090D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFA40095246412FEE59F547467CBCA32FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D59F4FCAC59BCEE538F7811615D01AE40A6E93203E834A19BA1D44C94A4F3E007EA8CF054B52EAE9F5AA65F38D17F28A7A161B4FEA81E549FBEB06C575EA1900B034A00E43A9734B11F261F01FB91A7248F2758C94C8B730E2A51F04F8E7E0008BBAFAB22A22CBC51BF8FCBC1F024527689CA04D164181007D2D8A45FE352600 +smlen = 577 +sm = E4E4F49FBA52A92DC85315F659B5CB2317BCB6C204C7101E3B6B61FA4729C7013EC3BDA7A2CDF32E5D3CCE741E3C4163C97FF6BC1E98F5E0236151017397570100013F8950166A0D0308421757DE15C7319F6A6F50F04F7FE6966E297A5BC6DE43B1FFEA3B6CDD612EBC39928F38A78EAA37C8798C19E4CD31E8A008A242F1034572EAD50C0E2F79B3F68C3F2155946B5A00040B49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D + +count = 13 +seed = B0E6A23FAB10A7A333E3720BE00D31507917F39C5EFE1C98CA18BEB5C3101FB4479B478A1558C4C00398C55C9822FC44 +mlen = 462 +msg = 439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 +pk = 61B6EFC812DC18F6ADA63EB8C588AECA0D80AC0B53032A3BACC6C3C8E35BBC002FFF022D1898370C28C37149696990D0181A1F7EE1CFE4F64CAC7F98F9DB2A020B +sk = 61B6EFC812DC18F6ADA63EB8C588AECA0D80AC0B53032A3BACC6C3C8E35BBC002FFF022D1898370C28C37149696990D0181A1F7EE1CFE4F64CAC7F98F9DB2A020B35D8C269F1043909FB79F47D010876D7C2000000000000000000000000000000BA677DD7D9ED03CE04FBFE095281FAB15BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC56341D8556A4EBEABE0E6547D7D61987EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000006E1CFE992960B1FA3911F3F2E995FC614E180262C8D8CD1ADC89674D99B38400298D1F3EF7150A1BC6053FEAF49CEAD4F41F9B8CFD79415D10175AD5DC402D0055BD62BB30252DED7D5FAF4BD4DC3A172ED6DB80DE4C5BF81BCA91AB90FCFD0084E51C391489028050C7C133B2A9F05E6A5AEA64A13092D6DAC664308C380000 +smlen = 610 +sm = 0435A302EC207A8859D14B66B5E2184F438A845CC2263F3AE5D1A480B2ED8604C23CC0C7937511F14F8674C81769180E401C2FACBEE247941E9EBA3E299577010003FFE41EC3D47954BD6CD2A9193F968F1C3C32535AB351AA7FAA2BA2052FF7C31822B2D7438E117C2B8B9D97F3C211934CF04FF10D61B834EF12BB8F113E0D4EF34C4B33E74539731095AC76DE822B50010402439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 + +count = 14 +seed = 0A98A2BD2B9FF42CFC18D3396BAD052E1D0F3372854DA69A318B142F7A1AAC609C3861263BD8FB0549DA7266784DB8B4 +mlen = 495 +msg = 8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A +pk = 2FFC0E8FED091AE82C2FB18A662772DE22FDDFA4BAE6E6AD4B17CEC22C69D80254E447611A108A126DE83ACF74DEDEABAEA4D4B84073915AE7E9570A1EBDD1010B +sk = 2FFC0E8FED091AE82C2FB18A662772DE22FDDFA4BAE6E6AD4B17CEC22C69D80254E447611A108A126DE83ACF74DEDEABAEA4D4B84073915AE7E9570A1EBDD1010B75EB8A15C7EC864BC7672A49349BAA5C67000000000000000000000000000000E872B22AE8209620624CA2D13B71840AECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF897F3940C365CD68D7650E286E0D945131FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000007DEDE3A3D64DECBD3E6F53F9061269AAAC77BA4EA04A3AE194C5D1779422C7004163D29261CD0BED03884B15958ADB24174974165517E4997DA6F586B35CB40078A33430D410E41BB46F7CE5AF9DCED44BA9BAF147C04CF11E5BDB22A1761400D919350F1BDBEC9F4F5D4660292ACB4D47E05976D3F4CD76FE2E06E00CF4A700 +smlen = 643 +sm = 1ACBE3FBB26B8C020DD11DAB10262F631EF20863480A8582B2F3ADFFA01C4B02A86D4E6AC0F239FB42D59FDFC5DD867A5E477657E9BEC19CECF987E97E9AED00010226560DA2EB9A3C6AED4755F1D93C1805995E863BA186BC564D6CD303C3D25433AEF7EFB81490DC21593195B3010FDE51872D9DD8814F1D3C3935770D36F7D006501678C3F441B9D0E598D99730221D02190B8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A + +count = 15 +seed = 9887F1FD854241A301EE0120645CD8E119B43F7BEE11F77A835E9ADF518C3A51CB76D86653FBE73AA716264C146797EE +mlen = 528 +msg = 9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 +pk = 7790AB85CF173FBB7C1F1A3FA0616AC1C182F888985ECC93DD622A97D0D8B304A7319A93825E46AE9A80DEEFE0D7056F52C3590C6F600D641AF0CCF8A007E10202 +sk = 7790AB85CF173FBB7C1F1A3FA0616AC1C182F888985ECC93DD622A97D0D8B304A7319A93825E46AE9A80DEEFE0D7056F52C3590C6F600D641AF0CCF8A007E1020289C5EE9A96E759B52035B8179AA4C7D2E40000000000000000000000000000005CEDCE18E0965FDDAB3EBFA3E526892577FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C723CA0DEF3100064F4BF1E6904D4920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000006FB192983A5E8FBF0F7D1A19CC1347059E2E817954DFC89F06BC46AE9FC1B002DB7B47B4DCDAC1609295D3E353B33DE6D28D77F100C70F2A309004921628A002F89B6DC98054499525D20DD688FC7365B4255C656843BDE8185688AE8F1F3007527FB3DB9A44C8F689AC3EA376218246F9E3C46178BDCF403977231998DB600 +smlen = 676 +sm = C0B3DCE37EAF46DE0D8BA19F9B44944AFAA04CB0DC294D71069FBFB3A53C5002CF7A734EA1B08AF64306EAC3E611480D3E1BBE2EEC7F75133ECA531BE8CA2D010004B23D404D79AE3DFEC7089CA4592407BD99AB0C29DE8EAD5DA0ECA24BB730DCE07CEA4CB3081404164D46DFBF60CC55154687D2D6AD311D3F2F9AA16533E525343AB42973CA6A9A21FA9F703BD02D5F020B029B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 + +count = 16 +seed = 5B485527C3B9A5E5B7579950049CD357975D4BCFEF83FE33C087ACBFCC10A0BE4225E7F8A5F77203B5FC7C0B5FC0E78B +mlen = 561 +msg = 922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 +pk = B0B75D7B56849A2A1B4215A1EDDE5E9A34029EFA56DFA5862686A4C79B719D01707AA4B41F1149D074494111843FAB524A354E80C7289E965800ADBC0C11490002 +sk = B0B75D7B56849A2A1B4215A1EDDE5E9A34029EFA56DFA5862686A4C79B719D01707AA4B41F1149D074494111843FAB524A354E80C7289E965800ADBC0C11490002DDC0EBBC5CAC0F2DEA12583A7A5C30F377010000000000000000000000000000F43EE5D8B708E918A47D74E2D3CBF9229DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FDFCCF71C165EECD15B174D38EC663C5BFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000E92B201218F1C05BE6248CD2A7D526B890B7E0B1DC4701E8B4D06BB3C03D8400C16983E9DF1C621AF68886D703BF37AF437D00730F45E8A38B96D98CC7387C0022134767157893763C02E1D87B570645EB2C18A260A2A9B7837130FE8F47F300A9A5F39E847173AA89D667AC5C42F472AAA017B9DD908103A0D8389279C7DC00 +smlen = 709 +sm = 7CF26512E963553EEBC1E3D78D3184C98B5D321BD1303C5E7A5BBC5624F27802B2EB66C75F14B135656751BDA8E526D62D9884C004718AE7A31DEDA08BFA570200016237B77B0A5F74ECC119D405E39467A2573DCBF64183BE7EA161A72587050C1602726ECE4062380074249D14E465584E92B247B3F7EDFE2AE891EC417E42D4E79D738CBBDF6C23FD2C4B66A7BDDF24000402922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 + +count = 17 +seed = 327CE565CFF6CD9A25EDD84F482FA0758B78CBC246567DAE98B818314AE28CD438E339043EB3FF16E1C2B4B104A717B8 +mlen = 594 +msg = 576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC +pk = C082B96BB794A392E699E06D5F731D28B5BF6CA360F285BBCA1B146084A13B01B98D3847005B0330ACABF27ABC781EC0E10C928CEE3635039F340206CA05830402 +sk = C082B96BB794A392E699E06D5F731D28B5BF6CA360F285BBCA1B146084A13B01B98D3847005B0330ACABF27ABC781EC0E10C928CEE3635039F340206CA05830402390E25F7B7E14B426B1FE3E0038AE95A65010000000000000000000000000000CABC1EB44B45E2C3AAC98109978A466724FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AA9DDCFB2889DCA69846EFCBD82C7EBDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000004D56DAD58482B1F1A6B1D66D2E02F8232984CFD6CA585C8F2F57FCC5DA630C009C9938D7B4082A8909B3FB90D8CE292C20E2648CFAA6DB3E6831A63BD77AC500215E98C9E207673424A95D69F289A689279A1EE2449F51D3309ACBB6E32A6E0057C3CCCE8550DC72F269A2B1F14496AAD6238D4E5E20FD0FCE93565A00422200 +smlen = 742 +sm = 2507DE852449847C226DBB7CD44599D334BB8E31B7007BE238E2BE23BB358F016BF140FEB6ED7F83BD670A894C04CCD6B65E2D046932455B7FBDB21CF1662B04000033B3BFF2D6596472279F0C845B79EFA10B8C8C039F4D23DDAA9E475CC0C5FCF5E85BE6BD7E77CA35B478198DAF78F19985C66F14E11852B7E843F1503C486E38C1B51405BC84ABD1CC96F6214E65E2000B0B576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC + +count = 18 +seed = 790FC03F956D1301A735504075B67A05944A762E0A4BDA77BB8C036C5CF911E2B561EC1CA6AA355D5CEC919AED42A1D2 +mlen = 627 +msg = 021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 +pk = 268966FF7D45C58CCC19C66859FCE50BBA2BF5850A88CEA988AD12F85F2F74004DDDECD5410DB5479621B08EB8C4C5B2479C28083B1223A2CF04BEABF44473020B +sk = 268966FF7D45C58CCC19C66859FCE50BBA2BF5850A88CEA988AD12F85F2F74004DDDECD5410DB5479621B08EB8C4C5B2479C28083B1223A2CF04BEABF44473020B61492A70197C05A3C4FA055AD0F19FFECC010000000000000000000000000000B8EB8EF2FC27E76C2C62DCE15BD20B3DACFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE44A3539585B355344482B00969860E2FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A85B93764B1733AED0FD2D05BC76DA23900E926789A4B000996BC47D53163E0035074EADAF0C41A523E35D49587A038DFA656F139BBF2FF6BB03112AE575BD009B04DA06A80F0C88315A7337540DBC5148EDB13A8FF4D2FAA22616EFCC0CBF000147FB40BAFCA4547B17689ABA331CDD6B4405DCE3C259670AE13CFC0B18E800 +smlen = 775 +sm = 8D60389E4E56FD204D25140DA576BAFFBDCDB1D3B3B5C43742967A1C2F19C00034B844D9FE31CC146CD50E667930AD1B3757C1024223280847EA058F6291930200019EB5B88BAB2742625C02DEB29C33C47AB592865FCC9DF81504E407B37ECECF52C66AC1644DD79A8564216026961D1C8208664D341C15E7373777B7E5C9DF1162866772626AF1882CFF7A9AD23E0559010B17021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 + +count = 19 +seed = 716354F7DEAE272CD26929C0932CA257AED1DD23D67260726B5213D82E61466FA99BB6A7D81DEE9D0EBE03DEEE4DBFC7 +mlen = 660 +msg = 7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D +pk = 2B3356902E3F747E37FB0086D556CAE82E0C5D1F82539DF34997499D679A6A00E74F06CEB783BA42CEBCDFACCAD7BE268A84CECFC24595645FFFD8C66141020104 +sk = 2B3356902E3F747E37FB0086D556CAE82E0C5D1F82539DF34997499D679A6A00E74F06CEB783BA42CEBCDFACCAD7BE268A84CECFC24595645FFFD8C66141020104D33FCB8410DE03D5E56EF6785759ECA7B4010000000000000000000000000000AE0A33EDE2986C375A647FBFDD5BCD3D99FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12975399A57784E4E829528875ED6E7D0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000007E9597975D4D69659D4CBFA66623C85AF9F126CE63DBE013F432FE5EB79BDF00B91FEDD875565EA93C1B56A3C9F42FCF9B6D4EDFA0B83BBCE20BFC3DEDF032001D7417C5083C6F900D6B794E122D0114EF64DDE8F9290BB511C66178957CD40014E31EFE69F9559A74B6687B0788DC6CB576371EB2FD93075878821AA0674100 +smlen = 808 +sm = 8F4D73F09ECF74F8A000E111B8AE356899D65A1A85EE750A6040A7808DC8FF027AB20A171DCBEAD08727CD30605A25702F1A69BCB098FDBB479AFAA00049E200010004ED6C00F15B6B79BBCDD91816A547746B9987DAA7AB23CF354DA879C4F5F9503FCF0FD636AED7515D3B463B1623350A6E8109D0973FBE132CDA7EAE6D66D866461D3646D092E3DD352FE3915BC60701110B7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D + +count = 20 +seed = A32E6FF879EC8866A5F5E4F6318DA8FE6743812ED2CF5FB94F5C3AA3EDF953CBC32665810B71B2CFEBF343A571CBC570 +mlen = 693 +msg = A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 +pk = 61DD57686D6A276C4B4E0C0C1CD6D7A86AAC16351D7D7679AA0257042F381F030FC2308DF3B7935AE1E5D4B79E886D46FC2940A5FA86843EEB9595A6204BCE0202 +sk = 61DD57686D6A276C4B4E0C0C1CD6D7A86AAC16351D7D7679AA0257042F381F030FC2308DF3B7935AE1E5D4B79E886D46FC2940A5FA86843EEB9595A6204BCE020273DF5F09B0E52572A01E7074203B24AC17010000000000000000000000000000B2439C03CD89BBE18F49BDD2D412670F75FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF2BDB02BAD81A4B9D38807349A35A895DF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D78814A356B4DB08DC5A76D457E64134A9B6509D4EDD543924D202E9C04780000B2CBA2C8DBEC75EC7328F17AD4C0A1E3810B418BA988CF1335DC026FB8CD200BF3F1937EE5686ECB10409F6548DF9DC36ACCD67546C197D65804A04BC38B80086FC9779BBC154F896ACCC08FBDDA75C373A4EB89936241C023B3169FB6A5600 +smlen = 841 +sm = 713DCB84BBBBF5ED0EBD2C77C9982CCEF05F763D4058469FA930EB4718E85F027924280D54DBD2FC7197A098BB87EDE0E74AC3FDEB726C0984CC27CA54EF6B04000067AE461820B536C36181B12DA76D31B8B490B449BEBB8EDFA1F089F6703ADCD86301C475C173A08753449AF719CB1015E9FB1C1D6730E9573C64AB603FD8E7BC0210B7E9AD2FA53A42F5E004B272D9031719A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 + +count = 21 +seed = 5A64401EF8E63AEE18E8CC0162845DC7AF388230E86728ECB330007F2546F949764273EA05B397FE71F567E1527FA445 +mlen = 726 +msg = F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 +pk = 1273720A793E41C28395620D5B12952D74FB7167811915108461F7BC385E2303DDBED4DAF208CF73B3C56EDCF50E28CCFC8B302961236C91433EAAE9C42F310104 +sk = 1273720A793E41C28395620D5B12952D74FB7167811915108461F7BC385E2303DDBED4DAF208CF73B3C56EDCF50E28CCFC8B302961236C91433EAAE9C42F3101045FC7FA52F4CCFCE9195C0F94D43F8BFC3A0100000000000000000000000000002C8697E44AA8834B602BD3217151274607FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5F32C419BCAD4E68AD00D40F2946A823AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000027DCDFDAA7E8DDD8CAC175EB06CAE8ABD95FFC7930913F28DEE152CF0D8475002DA2D73C100B7349228464B2072DED7705B5DEB5096499C18F25547801C49C003BE1DFD65A9C17BC8E1D5C0574197AB60B1E1FAD211BF06AC8D0C08460A0F8005CB4C9D010FC557E7BFE21AC8B6D4A262474A6D2ABC0821CDA3A40A996BEAC00 +smlen = 874 +sm = 240ABACC54BE7C4935AEB19035D93FFC912DE8C988AA52A446579923C0B98D0251A01DAC99AF2D5EBCEF7B8DAD1B16D0BF8100153F2A823CB99100A9035B1E02000277D8C0A0F680D0B2BD81D46193C92EFB0E883B46BA2A6E9C4E212E86458E3AE1CA6220B44B405D9244E8010E0BF3173F08FD4150DBFC65398FE321A2868158FBC3CEEF982A75BC7BE6ACF69D54276502250BF5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 + +count = 22 +seed = 3222E4B55D6767E300FDE03DB3D8227E19FB8B08EA9B923FEDE18D699DC3694EFFA7C4DAE2AF57E4A0162B7C564199BD +mlen = 759 +msg = 4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D +pk = 58525BC4FD6D1F4BC7AEB8F2343779E42F718D076BC0BCF05AA26399A3446201FB37C7D7B94585F09917F50F9A2A78280A4DDDD7B713B0B8584649C9839C230302 +sk = 58525BC4FD6D1F4BC7AEB8F2343779E42F718D076BC0BCF05AA26399A3446201FB37C7D7B94585F09917F50F9A2A78280A4DDDD7B713B0B8584649C9839C2303024BAA847468BDB1D066230C0157F5DD4267010000000000000000000000000000C6EB3F613B9B0725BA86CD4FA95E632BF2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF81F97868D18E4525E35048A8B09B16BF18FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D720608A068FD5FDC38410BF2DEC338D05379FF029A88478502B30C21F21610070C9C56187D080A9D9840CC30D4000B1F899EFD9994D461E9F6581BB14E077003F4CCF6B1A829DFBDFB4CBD811194386C74E750F241BB0FA68C862EF23973000F1EBF1924FD71E996AA24511B59F82D917799BE73DA176BB78A7E94108342800 +smlen = 907 +sm = 2E04C0D9993AB76842554AC6CEF517B09AB13820AE09581D0BE0DCE34D3F7902FE319473B5D4A253A4552F5149E6CC4D8B34958DCA9FE74BCBD38952FC73F2040100ABDC254987B1E90D9401D28B06B478341F2334C86853CD4809C80BA5B6E71D117F7AD1F0287A7EEC26591849531EF02B20178A9D66B07D7638733A47EBB0010B5C237D23100A5D5E2D4577195B056602040B4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D + +count = 23 +seed = F41B3C6225245C06455272A6A073F363E5F19F09A0B146AFCDFC2B3B0EA64BAA3F90359F32B2D1017608B03064E90AB2 +mlen = 792 +msg = 72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF +pk = 35D7C402FEA01371E5ABB0FCF458D9163373FF86DE4B61F00B3878D2C7DED5021E58DDFAAB13DCB9BD99854EC607317286D2AB412389F62B9F279C7F83C25A0304 +sk = 35D7C402FEA01371E5ABB0FCF458D9163373FF86DE4B61F00B3878D2C7DED5021E58DDFAAB13DCB9BD99854EC607317286D2AB412389F62B9F279C7F83C25A03048B075976A3006766D9DCC252D131EA9D68010000000000000000000000000000C4DCFB6A3217AA381A535DCDD4A844285FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E68CA38172F4E94A3BAD2FE42BDDA7F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000005F62A04830CBEC7EC30568A8ED0C3FEF7331DDF5FFB2FB0DD27FA89C0DF5D00047D816C18403088074C4F0F55ECA4FFBDF7A0DADBA6D673709999032C09A470088E995BA090E804A3A014A92E6B3A79C28610437CBD9D70FC14C331F39561B00ED06A513CB4A3F79E6E522E01A6E29708E1685903E82E0E570AE5DCA0DBE6F00 +smlen = 940 +sm = 6D82B9CD0B3B921F52F3EEF7C9985741393062A8C6E7263F80D812C1DBD3C003AE948EAF54F735ABA74488A60CF3D723A9A1AEF56DBB30A7EB11E21013F158030000CA034890876DF80CFB4E68BC9179821C61A73AFB04767E75E5519FE1F3C3B2DEDB210F95CB73DC88ECD9FB51F22EA34A588202C70B21CCAFF6F8E646929D880DB6762386B202D7C119255552DA38BF030C0B72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF + +count = 24 +seed = A08AD391E0FC57A83B74CA8CF44DB67F8178262ED9B20AA0163CDD8274AC2BE05F558B112B094244370C1AAAB75077E6 +mlen = 825 +msg = 209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E +pk = 167F262DF8BA760F6E83406D6D374370E6D60232FF0C57FEF5AB2B6A52DFD2042BE7E721C0A17FEAB38F16DA125C4D8E3197DB7D3F928F8BE689F10DC64ACB030B +sk = 167F262DF8BA760F6E83406D6D374370E6D60232FF0C57FEF5AB2B6A52DFD2042BE7E721C0A17FEAB38F16DA125C4D8E3197DB7D3F928F8BE689F10DC64ACB030B61D37A509D3B53DD5BED766F95DCA665D5020000000000000000000000000000EEBC4FA8553092D68A93A89D2CA5A19DF3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBFB59C77A55CA21F1CDA69D36E2CD5E19FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000DBFA19B8F4087B50DE102C96ADE85B9861DB5CFD56373C77A700D914957C3100C9D87328DC2C5BCB1FA2A7416F36A30F14A00F264B979CFACA7EBE200BE4E700C0669A5AD1135389D9C23588E683D94343A45354D5C36DBA22D748F3B386E400A595A695976B5CA19078F383DC3FA47E6D84B5AC3B16F34C80BE31387340CB00 +smlen = 973 +sm = C0CDFE7626C395F592E746391904A1501C065DA48F2344C71A23D1CBF6BF8A046C748BC5B63A53D47E8E5D8976487DAC38E1E4D27F196157CEBED0188DD07C0000003760CBB193E6751953F1244DD4EEBB35FC0377DCAC6110B78E8F5A723765C9BA7CDE80FBEEA316AD9CF06884B9435200BD88B79089B67DEA524D2849F00CF01B5B96FAC1E9811BED691EFB6D146E3A00110B209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E + +count = 25 +seed = 6E0A8EF5156D693FD0140BC4A31084E79773A83F42C8D133AC8A9D62DE3CD74511F893DCB26041E6B35E2B175408FCE7 +mlen = 858 +msg = 8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A +pk = 9DA8A98A7E5B8E9E29C3A131AB753A1E69809B4E7CB65FF71CD0D85EB5EAC40201193BC961CF4F1729A6AD69E5895BD5ACBDDAE5B1B8E1394152228851764E0202 +sk = 9DA8A98A7E5B8E9E29C3A131AB753A1E69809B4E7CB65FF71CD0D85EB5EAC40201193BC961CF4F1729A6AD69E5895BD5ACBDDAE5B1B8E1394152228851764E0202C7CF1ADD63B1427805AA72D6D3C36790F4030000000000000000000000000000D60CE22BF8B9A69316DE4D1F37F1C002C8FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2CEBF4F3C4AF45330AF36D28347AD78FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000E0D33AFEACC873298A14131C4876012057AD77E77A97CA042C8549764A53B1006F1C0658D4AB443DC7AA716972F9139E46BBA5886B1748EE3D1515547FD6C900815E3FF6E2BA3AB73DC47827474E4BC63BA8CC132DAF04692197D39039A262004756F576EDC880B165998D2C8329E307E127391234433F48C80C889D051C4E00 +smlen = 1006 +sm = A31454A5BAF35E08D55266CE3F57556998C7338B4BDFB1F36274DDE1B9D1C301E355042ABA9A36A9CFD37F78BD0FD9D4300A3398AE431D65F32ACCCFECE87500000007A570809EC9A9EB38378A363287C292312037361976D21E74DC8F14FB24EFB8C75244EA0A78AD88E6EF219F33E4B9E570C46B1D837A4A35420324353D0A21AB9B58B1386899CD561D6D10F29E01A10102178F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A + +count = 26 +seed = 49CC05312D1DBE216FF03B60575017A6A1464C06D2C5A4A6F973AD9F275F7C66163A29A803BE759B117043862D277C27 +mlen = 891 +msg = 30D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 +pk = 8FEDEA278AAB98F359E0F7AF04C381161BD65EBE187A62CBAF1E56A12D6B75018FBEBDD6E0B9EFDD4487FC2E461B0E0BD04A15EB164D3BFBB2BBC1220364B00102 +sk = 8FEDEA278AAB98F359E0F7AF04C381161BD65EBE187A62CBAF1E56A12D6B75018FBEBDD6E0B9EFDD4487FC2E461B0E0BD04A15EB164D3BFBB2BBC1220364B0010249881B94BD66304E46A15DF268F3F4FB67020000000000000000000000000000048853903B9B93090CB4849C2239791F7EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B3A4963A039897BB459D78A5326A8B7CBFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000843B5E9C6136B205333F1DC29C3579AA19CFC42BCC093E8431DB6FD214D20D0005EF42CE7CD7D1550A33A5CE6106B8218C1734EC76652081B8FA884DEABB1C0011BC41811ECB205E1B749CF701CECB39895CB416E5D3752DDB20ACF9AD2D09006125534B030C371DD336DF56B3DA50B12876970D48DE07CEF44BB0F91484F400 +smlen = 1039 +sm = 3755757858ECE7CA7F3AD133C21D3C10AFD089AE278D60150AB8EB0FC4F04604F3E1AA6DC9A8233661A01297331BCC2339E916AD70237818DAF6E63879532D0000001328AC8616F4DD33C1B1F260DCDD755ED82516D58522BB4ED24E8ABD1115D4E7D85BA77A9C48A3B0601DF598E4E5CAFF8F825CF95D4D6338C238A0040509A090FF497EE35F620DD755FFED479753D7020B1730D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 + +count = 27 +seed = C33EE43A9CBB4347BFAF71147B7FBDD88D212462CB06FBE695A35402C503CD15732B7D0E8BF829A555B9167BCFA2F2BF +mlen = 924 +msg = C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 +pk = 3C80B03FD5D977EAF55D8CDBE1D4DEBF313B86243D4DE1F6461C6029CCD52B000D978B565605D723292BDBD103042F0284FC6A2C44D2CA1E65B2BD02C2EF620406 +sk = 3C80B03FD5D977EAF55D8CDBE1D4DEBF313B86243D4DE1F6461C6029CCD52B000D978B565605D723292BDBD103042F0284FC6A2C44D2CA1E65B2BD02C2EF6204065F5889820876B8D7BD8937E8B78CF8808C0100000000000000000000000000002E071BB461FE6189518B88D1878C70C706FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF09C24ADD7D414239455B624CC4549B502DFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000005A499A2FB0ADFDE635121CD6B6D55739072E2244B0F996D72CA8DB672DB39E00F971E6090993620B742A7BB46B29929357DB6A8B874FA176429CF0BBA198F800814106100E176A1C59BA5979A307B8C45F386330394BE69B6E4811DA83906600D4800849BC2C7B4B6DF78A7D7D553DDFC17CF4D6F53420EAB1CF461AAD284100 +smlen = 1072 +sm = D95BFFF16BBD05FDDA6BCFB8454446A5922A88B65FBDD2731F746F3F9CA2B10272FDA96100D6D6DD334E81ACAE5850F26A503BFFD118F54CC2BA88ECC2F88F040000F3E3DB349945E6DB1B53E9F20BC758C8811187F51CC161CB290FCACC5A4739C0114D1984E8E21904A72172C87594872E3A65CB0AF1201460A9A70855E7251BFFDF5CA95DF45ADBDF038202EC6EEDF2010611C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 + +count = 28 +seed = 19CB4BE2332F7FF0C078BC001FAB3C5FD8569A76EBCE373D1ED4FC8EB5D744C6464E2B5EECB9EE836CD5D87BEDA78BA7 +mlen = 957 +msg = 86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 +pk = 417156E2F094B83AD08B9B151A9A076BCFF4DBFEC28B1636EE128B0BEA0CBC02F021D8CBE84B286A36F1EDE285F928620FB0C2C37A6EDB37D0760DC771485A0202 +sk = 417156E2F094B83AD08B9B151A9A076BCFF4DBFEC28B1636EE128B0BEA0CBC02F021D8CBE84B286A36F1EDE285F928620FB0C2C37A6EDB37D0760DC771485A0202B176603691C422C4762F4FDFF83CB239DC0000000000000000000000000000006060FB4932248A3A19A11790A99176B767FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD0864BCCE46F2941F9DBBF3F2E2F0E12CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A7F6096DAAF02F4B300DFEF396EE2B2AAE5330860B9F36AB7A179151F42F950019B74D05A487ADE4C1B594C182483CC241A42894831EBCD14FE0D3FBF3B6500080FB006FEDD6E5FAC68602810DD9F58B7A4DB5E1BA9C65B98680CB295BC31B009F1E5ED3C3D225C0ABE42B3C870D1799FFFC7A00BD6955F21AF6FC4B2C84D300 +smlen = 1105 +sm = EE6EBE9C262EE7D18E90A26FF90074B025E26529DF9239868C80409DB94034040DD05AA62EF463D67063AD79E876C176E44AD99AD7F2596CB416C4C865C381020000BB456CD39FF827EA348231A87B3E259AC50ABE4C58E000862CF073949ACAB3A79E18596EB540AAAE0B0EB2CCC90B99824B58E267263B0080900389B183B783323035CC132D510EC99362D72150951400020B86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 + +count = 29 +seed = 6BD93FD13C0299B3EC7403638673F3DBC449F3A617B691DDF73C072B62BF028913375D7460BED2CF9FDCA517690CBAC3 +mlen = 990 +msg = 56ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED +pk = A8445D64805E10125F5718990ADFA55CEB498BA3E213A3B42D474CE7B6916E029C630DD6B8791557EF4479003FDA6174A048E002722F99E6371A70072730180002 +sk = A8445D64805E10125F5718990ADFA55CEB498BA3E213A3B42D474CE7B6916E029C630DD6B8791557EF4479003FDA6174A048E002722F99E6371A7007273018000275195FFCEFD6A61CA0DC060F0D00507BCC0900000000000000000000000000000CC5095C50E80B708DE33B06E45B62E1CFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFF9147A434A056E79980B5A7E97F15EFDA6AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000004107BCC8AC86B41115B2E0979C49EDF57EB2D7DD1B6F71295B7A0EBD859B1A008BAE29DFDC55EDEB258673893F449FD69D5518E5136CA327F43628BB001EF60084E46B0EF86E9C4B0D5C528D133FB931188D00A99F5C2BF84B5462DBB08AA4005D190AF3930143EC0F2020F42ACE287746672E29971FDE1FFBB4A8F348EE2F00 +smlen = 1138 +sm = EEE155964A3FDD52B14B504549E1DA87182762C7BA511680E5EB60592FEF6C04203527F56E636BFBE076B3A6F8E89A73372878F8381D4F61644AF49CC32B37010100BF8B9F33E96FDBAAC666ACCB8C2BB7244F90CCF921B434B629825524B20A442357ACCFFB736FF5826B9E50886DE5DF6E1AD9D6B63A69D0518EFFB4FDB6F55747ED34D3D24F5D17D99776F30EFFA8AF00020256ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED + +count = 30 +seed = 1787C82DA9F2E6CA9ACF7D6CCA70116A1724902C81EDC1439F332C74807AF2BCCCCDC7AC1788BA798520B2999F39DC3B +mlen = 1023 +msg = E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 +pk = EEC40CD062FB2D154FD369681296EAAD01C60A878FA19D737BDCD1F28EB40A03E509D6774B73997E1F03664DA624612A3FE0B941B0235EC75640C90D149BD0030B +sk = EEC40CD062FB2D154FD369681296EAAD01C60A878FA19D737BDCD1F28EB40A03E509D6774B73997E1F03664DA624612A3FE0B941B0235EC75640C90D149BD0030BC78F06BCB6BF0F95E4D7A1287796B74449010000000000000000000000000000B0FABACDF0AE3340C12D6EEF36A81DD48FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFD73D07F343B07FAAAA0F356C87D056CE1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000E481BFE6C10AE9DC02AD80123AF452BAC0ECDB2F501E390B3CD08824CBAFD800C101692FF8AE7179F15FE5775F33677ADDB3042E4B689FB09B857D6E2847420089AD5FD2885386B8473B439DC9EF6FD8B284678C51F281AB47BD1872A5765C00A942C7F69CBF928A70F6059CFBAFB264845B85C185B10C64531BAE067DDE1400 +smlen = 1171 +sm = 5B142A44594AFB1E28A84F475E6D5411428440DCFDFE49165585E23C6F1DF7037D39C38F50527D2345D6E8E451297DC0F99B2670079D7AC8A74E6EEFDEC8870200032754C12C5A395FB64F0989DF609FE22ADD0A3336185EF3DAFA09DDE80027F20C007AC3021CFA1C3AD65331E89BDFA7DE58EBFCF6C2856F2461CAA6E0718F1E6546958CFF23B1E05AFC75B27B492D17020406E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 + +count = 31 +seed = 9E6E12F025B2A57B0F5A3A9FA70396FC332E1802608E5CA07CC4FBA922F1FE5DEA6721B96F1BA2BFB97825A19F08FF2F +mlen = 1056 +msg = 9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC +pk = 4F77FC1F90EED21DBA4592770DBFDB0E126221084F646872D8EDE4F1D6673E00D896F9BA5F2B8A63298AC5376A7ECF71D6A67918A38CAE8D2FB5193D08F7660311 +sk = 4F77FC1F90EED21DBA4592770DBFDB0E126221084F646872D8EDE4F1D6673E00D896F9BA5F2B8A63298AC5376A7ECF71D6A67918A38CAE8D2FB5193D08F7660311C928705BF2C11692B322A78EB69D3BC6D8050000000000000000000000000000DCE9289FCDD2357063B13C8502B6A0D79BF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9562E31134C3132347EB3651E4DA5F5E6F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000004AD22B365407978C6D48410FC1FAA2D373266E7FD85F5406552C813BCAA89300A3B7DDCF296106118A2E9A8BB60463A461E8FBDCCA73C831B4C7E3FE8B25F5005BDF4BD1217003D54C3C48D36FD9CEBEDE6E27E2E68E35DCD72685284621750093565962ED682CDB4C3441B2FF0160DCA5FB7C4FB973FDFCDAF9C5D7ABBAAB00 +smlen = 1204 +sm = 4E0BD3FC1B984444D5F4D55A586BB26A9DF230DAA2CC7A74842296F13E353904E64FD56F8B9BCD42FBEF93689442C1BAC53BADDB49B2EE7E35998D2D66142C0100028FDCC0E68EA71BC7ECFACC51F15B9775D1D458817F079CC34892D8F49475EA9A70928BA7D45B1A70B9015676CEAD201E2489462AD3AC0801E159F0B4030A5F7568EC323EBC43DB75A428E0D49B8A340302119C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC + +count = 32 +seed = 569B8B9BDB707B19CD6F9BEB29F304D603C1509B9CF25987C280C342E870B1E13EFC7DD7E41DC85BF4F42D0493B84B0F +mlen = 1089 +msg = 7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 +pk = 8EF626758D69A8CF76AE0493ACB1AF6C17BE63C351DAE88132EC3BB3F880FE00269B7CD82FDF2B3191B8EBA352DB9BFE4BAAD9BBCBF1441459E33230D8F20F020B +sk = 8EF626758D69A8CF76AE0493ACB1AF6C17BE63C351DAE88132EC3BB3F880FE00269B7CD82FDF2B3191B8EBA352DB9BFE4BAAD9BBCBF1441459E33230D8F20F020B3BDFD304814145330D32D5C34306647984010000000000000000000000000000AE972967F71ED4CCE32687BF7A9D869C83FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB8BC90564402565B86591C73314BF8C25FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000C9D89CBA14E33EDA867814D3951A3A9304EB69D01448175D35A267E11B8EFC00B39563CE66955B6DB42BD8E109A73428A94AFE23258BE786BF7B8DFB405E8D001E3F613D49E6B0200FE291D63C9788180C96F535CEC490042D395173A3277B00857D96594865DA85E32951C0F327B388A9787EED6AFEEAF0815234C307C1CB00 +smlen = 1237 +sm = 226BA078855ABC4411832007A27CFD9DFD7F122F8DC722104AED53F02E39F5047DE8028E0F78B7C42842AA07CED6E3E28CAA5360B06ADC62F5F22259BCF6E10200023DEF454D6314D3B6022974E5D530174C2D8E4C9CA2C51648ACBAEAA97240CB596052A8B361F3E10E72AA836B4F40F8DF54C3F056360D17F416D9B27328BBB93B24BF418217B01FCF547AAC74385DB300110B7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 + +count = 33 +seed = F32C3715B0BA8C1D0BD59F0645E9697DFCF9AEAF761A71ECDF9672215B9F138C0502D7214F6B1BB4D6612432F9FBED5E +mlen = 1122 +msg = 789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F +pk = D712BBD4AE5336CBFEDEA234396FDF13ADA9D28E9C61FE1736DEA3014743C502BEBFFB096AC6CD1DBF16A0F6A35A00F7190FCD7D00B32D9986B0E21F0FB0F70306 +sk = D712BBD4AE5336CBFEDEA234396FDF13ADA9D28E9C61FE1736DEA3014743C502BEBFFB096AC6CD1DBF16A0F6A35A00F7190FCD7D00B32D9986B0E21F0FB0F703063FBA3B57771B22E40EFACD0DF0959A2436010000000000000000000000000000382043A7221C21E823FE41B0EBDCEAB551FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF3519FE6996C2D54BE359706831C6F698A9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000008B0BC86CA755B29C7E0305FA1FD0A33321E33CF9CC1E4E9B8061167EB5506A00EC95DC725E4991379EAE434FDB94294AE553B3B1581AD9FDFD8CD7219191010066D7058525BD480B17BC1F10AAF680430133150E4E37C9BDE9571D45EEB7AC00611C4DE7B09E5AF71247272A6E1BA26B6FE056B47CDB3E4016FDAA2541E79F00 +smlen = 1270 +sm = 7E868A6DB87CB901A91C9132418ABD2C96464A1221DAC2B961BF24282DDBF2000008FF6AE0B55D5B1444F2956F32A2836783F01AF3906B8940D26D8E3A271C030001127B4293C1EE4EED682963C23CAD6B42173CCF567B4FF2E07D814BD66ADE43FBFA7408FD70FEAAE0377ED22F571C31371807CCB831BC01D9F33410FA1E1227C4D21A004B821F958B6F741CEB23A06A000211789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F + +count = 34 +seed = B0C7530A52AC9F561C2C14548D3A5F5053396B738EA1C7A5190F5AB01C9C38719C4DBE856E42D37A114FA24FD5DF5081 +mlen = 1155 +msg = A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B +pk = 1C7A0470455CC492AA0CCDDA3C626068B72ACD52FDF6C5C1B669213C6482730032B23F7B2EAF659A49A6240DC70BF63C514E6A1F9ABE19D90F1657185E6C7B0304 +sk = 1C7A0470455CC492AA0CCDDA3C626068B72ACD52FDF6C5C1B669213C6482730032B23F7B2EAF659A49A6240DC70BF63C514E6A1F9ABE19D90F1657185E6C7B0304E9CB4B41E85BE3AE005F234D8BD4C1ADD903000000000000000000000000000026183DE41F9C6E47C1B369C9464A9628FCFBFFFFFFFFFFFFFFFFFFFFFFFFFFFF375656507B05A8EA2DEE976E09AFD6F582F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000F3A953DC50852C5AC0A19176BC8FDBD9A1607CADD4AD1E1720ED22BD25643C00AE844290A645181678779777BE20603A723FCD56F962BF8DD022414C60085D00BCB58299E6C246B3B730824014678621E4DA93BA592045757E646A2AFE371400B14D652B1514CFF637E47D4D4723A523A71624872083E552CE3BBB61D1CC2F00 +smlen = 1303 +sm = CF1B756F0C6360A52AA5E4E7DAAE23EFBC554444D2691B73EB340F0259210C0181025FAB7B9DDE7FA9D806438275DA3AFF2B21633B9308E9594045318145160100013DFBA0816DFEE5805FD4AEE64E9EF82F7375889AF06211DACEA27E4E29544A0032BD13E4B669952963D97C73440FA419007485FBD41ECF247BA6ABB245DA0CC1E2E5A7B6C1BAF3FF48EACEB7F0A267001102A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B + +count = 35 +seed = B2FD7BFAAFB667C9DABE5915C3BC271EF41F18588666A6F4990C09D098E62DB590110DF6A56F08C5E0DE65B00F91D60F +mlen = 1188 +msg = E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED +pk = 178CC5467BA0A2C39829F69A994396F05BF021370DC3CCF9AAB84A21F9181B00EF4BE58D6AC1E19B11817B916391B97C582EED3FA5DD2069CB8AF00E12BA48030B +sk = 178CC5467BA0A2C39829F69A994396F05BF021370DC3CCF9AAB84A21F9181B00EF4BE58D6AC1E19B11817B916391B97C582EED3FA5DD2069CB8AF00E12BA48030B33DC78529516B8A5AD7EB36A4B88DF8E400200000000000000000000000000000CD078EE9357BBAE92B892780743F161A7FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFD8ED2930BDB01F24A6924EF834FE091FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000025AF511EC28F8B66DAEC418735908FCA9C0A5FEC1B0DC8312FC38E885F3D4300BAD889091B6B51DA54AF762FCD2D51C45CC98C978EC661978009A7A4EF82DB00E783AD4F36C260274AEAC82219E2FDEC2332CF4434D12B43B5FA6832468D3A00C3C498606FAED77C5B0C1B49E316C685151555735C16CDD699B5CA58E2F9AB00 +smlen = 1336 +sm = 1EEB1004A37A22D64FC4FC394CDE0D531CAB1942689D49D65FD6E6DA25316E01343DCCB852D3EDD6710C8574431131BFB4DBB436581D38731B50424FF3ECE6030001BF1AE0161A78AAF1BEC090C93CA49C9285A7D0D6FDB278BAF326F73B91ED92E579D8744F70D2A5E80628F587B0AAA661AD6FBC86E1F7845A88354CBAF32934384BC8475F8B89E849449E868E752DB7030202E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED + +count = 36 +seed = C08E846A8E039C8655651919A8433D475F494899FB617DC3B4715DEF0C992C195CE38158B7FF40E0684B30FD7E623265 +mlen = 1221 +msg = 743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 +pk = F8461870A4F8F32849DEBC3395DDF5E23B46486E28B657D40475E9443127CF0431B13E69F79122B4A979A470BA9B83DD9A2D7FCC21A73E10AE0C53052293860117 +sk = F8461870A4F8F32849DEBC3395DDF5E23B46486E28B657D40475E9443127CF0431B13E69F79122B4A979A470BA9B83DD9A2D7FCC21A73E10AE0C530522938601177B6AA3D2CD8F7A75AEB6509545BC1C3117000000000000000000000000000000521121659BE56E14B08CFC6929AAAF11D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5046A93E84858438C50344D353DE799D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A72B09AC5842927260453AF6CF4096A37F376EF2D9D517D1C83BEBF402C69A006C9C3F2A06AC2D12FF1CFAB36DD01B4C46D639D82E0817E487BCCFE12966FD00148F9BF9865767FE2EEDABF6244A6DC48C4EBC4F6515BF1CFB4F1368DDA89E002FAAD70A456C4F07EFC5156619F8B0CB68F74B798496C84478FD294268F55C00 +smlen = 1369 +sm = C984CFFF4F1B9AD87CEB302AFDEA8C6E8F669E6ED136789E1708B4A063824C02545C9A2A41189C5501F8327E531C0FF139C306FBBDC0EDB06703064479C5ED03000003FE41B20EC26217445B50892C06A79F835C4B09011702FAA75D7B8A251B6E619B227E3CF7402300025B171073FF790C50528E36AB7BA0D74DEA9464649E4CCD2AEC0C6A95D3CF60820AAA9557730A020B02743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 + +count = 37 +seed = 1D9C060EA0408A068BD982D9694D39D02BA5A473378F6F9F09349F686566F331E767263FAFF5DC0E823BB6F648843876 +mlen = 1254 +msg = 3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 +pk = 453A1E36DF3404F66F20688FCCEB7C31A503246F98B7BDCAEF62B8979FCEA904B2CA3C83E96BA5CA4B9439742DBB7D2F15DE2FD321B09BD4ADE4481B6C68100406 +sk = 453A1E36DF3404F66F20688FCCEB7C31A503246F98B7BDCAEF62B8979FCEA904B2CA3C83E96BA5CA4B9439742DBB7D2F15DE2FD321B09BD4ADE4481B6C68100406F7C495E167858D62E4115EB3BE86B6B2CF060000000000000000000000000000320F9A68F84B574024DF6B9DB14EE1D66EF9FFFFFFFFFFFFFFFFFFFFFFFFFFFF211F7546C82E4F5C6399ADF92D48F1F4F5F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000BF2A015F47AA86DD27A6A98B49EAD2A54737CEF9E9D260727479A3200AA2530061A8E6BF3F04322537C902AE5C47DE354B4B01FA594B3336466F7C717F7DFC0057C49A59E3E34042AD964AE4C0384DF33CCE9CA777D6776403CF888927C21300800603B31EFD27E8D240AB35B76117A8EEDE8E0F0FEFE72459F51E98AC6C9200 +smlen = 1402 +sm = 0637B50D6D24D5108FE8632AAA6C50C1789FE5F0E775F9DC1B5AFE512D17BC01EEA8ED7BADE7EA1DDFF512E5B461A4ECC2A347E4BF7B7E2FE82AAF1F249242000000839107FB333F5480C4522C841165B93C38D4BDD3E63D31585204910C3993BC3FAB21D1A3ABEA37FD9BDCD7F00F587D32C982481954B1B94401873451EBDD704B87B7F5D3F6C7EF35E891EC9D668C8D000B023382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 + +count = 38 +seed = A4563D09AD21D3916BF4636301F2E64183A8F003DA186753D7F2DC3BE0089BA09C62B8A52B72C2C8451213606801FB29 +mlen = 1287 +msg = 67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 +pk = C2FAD33A17CFE70AD1E2A2DA9E461A3B5F580D10F36E34E808069E31B73F1704D6D9C68367D1E2FFFD484D57479B58585C6BCA62063F4661F7650A4E60AEAD0404 +sk = C2FAD33A17CFE70AD1E2A2DA9E461A3B5F580D10F36E34E808069E31B73F1704D6D9C68367D1E2FFFD484D57479B58585C6BCA62063F4661F7650A4E60AEAD0404D3F5C8AAD24044B30D2F11B99EAC24435A05000000000000000000000000000094F7BC288022E7F971CBA90D2BDB6743CBF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5D9D4A82650AE77FCBF1504BF4FAE234F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000027E99D7D10F29B1A252E2454847665A2C2BCA627C9F5E790D9A854615069B6005A7B728CA76210F220C669273AE2941A3021737BF618399C4206EF8D9E6784007E93DC7D9E51A87680A4E45E50655B92EF8F1CE574AAFB22D201D0DD294D690061A63D6C3180B902626072AA6D946626270D1AD8BAC5B22FCACEBED4E0044400 +smlen = 1435 +sm = AA68E42038EF1429B509534009ABD7097E6B92BF4767FB68A2D91E5031EF09032CA4C87600D8EA34A57E5E657759894BCB5E015869B4434A2286231DE3AA190400007765153B6EB5F4FFB4408C48F8C4E926C6DE13F1CCD22457EFBC91290C7529A73B19C45F0094E849B53CD3F0EEAD0D34EF6C4FFFA43ED294A2E8E6B2C4A02559838345E380EF0C05F43B7A157C1D1402170B67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 + +count = 39 +seed = 811A8A2ED2917CC616FAF246C5F9BB902E5FBF5430AB078AD6CE871CF8C160512A748216EFAB3A4CE1271AAFEA12C11B +mlen = 1320 +msg = 061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 +pk = 50B5C99480E802C39A7B9033B0EFD0CEBDD1E3FE0F992AF154DE0BA236BFFC04725B06740B33BE6D6EB4C266BF9F5A9AA2AE002E0C86C5611ABF7E2E1918D00419 +sk = 50B5C99480E802C39A7B9033B0EFD0CEBDD1E3FE0F992AF154DE0BA236BFFC04725B06740B33BE6D6EB4C266BF9F5A9AA2AE002E0C86C5611ABF7E2E1918D00419B5B2381E1F28E0DADFAEDA58574968F10F0200000000000000000000000000006840404768CB0F3BB544101A64C3158A12FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9BD4F67D88935E80A91F5B2FB803AEBEBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000006296BDA099C774F93792AE74D32D9DB7638F7749AF0BB39A964E10EA7C160095C3C3B8654AC992760099FECF5E2ABCBACCDAF9D4BF0068EDF321EB4CD2A3009F16D1338F17F60230535F50FCACE1BEFEC4A455EAFE09B1F29F31DD50BE1C005C166199555E3F6490AA676E24EDBD828AB99464DC54ECDB6FE45D491E17B000 +smlen = 1468 +sm = E52B8584B805A42E658AD941876330E172E266DF3B197134C16DF6CCBAD6E40300C074D3E08771A566EC454E61061FA1F4D16F451C5A9F950B6DD09DD358FC0200017F2ECAF7849CC7418A2BE1C76A69F07910DE99AE98F778D2737550E90AC3089AD566CAA966D40BE76DBDD9EF35075CAFAA2207979A88C0E9C8F8632643B9D0805506869F8C4585EBB3787CB0460AC903040A061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 + +count = 40 +seed = 41CC9DB2E90239AB5158A2628E7478D0B3512FDF84CD27A4CA5FE3119A455C22045F198C3C5C39F491FB975BD1CFF7F8 +mlen = 1353 +msg = AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 +pk = 09368E4C0931C14658A1739FE05C4A253C994DD7D34A1A2BE7119A437C40D90161BF1BC48AE7EC840A93843585A7E1880E57F02B1FEE64F2A4B4A5ED9EA6410306 +sk = 09368E4C0931C14658A1739FE05C4A253C994DD7D34A1A2BE7119A437C40D90161BF1BC48AE7EC840A93843585A7E1880E57F02B1FEE64F2A4B4A5ED9EA6410306A53FDD1E2ADF73A9754361E6E22541AD2A02000000000000000000000000000014CCC0C0255D77D30FE991B9FC30EC0FECFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBB782BB2B5CA488A6B06D5BE12FC74AFAFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000005B702AED5BB879CF61F57B3C439DDE0C692B4202A5E96D7474E4241636EFF6008439B01FECBA694A9B5A97E86F5DCB763A777D8C3CCDA8E14400D320565BE0005F638164AC66DCCD4D9026C4159BB307F14BBED193D7996CB9525AD41D22C700BF566B99CFE5C8CE44873480EABBB5FDEB305AE37DBE1CEF56FC15B8944F1300 +smlen = 1501 +sm = D95F373834A1E990795F1A32216E336BEF1BC0CB344237089A7DCEC904B22301765D1E288ABFFFD719F9280FE212A3B6BA440596A6A583401F89460E93ED30000000C6E0C59036F36D0197DA44D744EB60AC91EA6E9A6D371F23B6ED03BD915F84E26D5CECCCE7230D0925BE4D90269E88ED41DEDE35202B976382930880F2F8CCB0553A678CB1FA12B2A607B3806A12DE010B02AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 + +count = 41 +seed = 1C13369824A3FDD41B1065E17297574715D9BD9CE5BB733D36D22C31B62BB1033989A604D78BFB1A0746BD4A2271FC0C +mlen = 1386 +msg = 9D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 +pk = DB834FB959CDF627212EBF61A0558C6C48E3757D375C08B1BC4C09027F3C6E01634C57E2CBCB2A9AD41349FF9BD317E43718C45525C81B5265E201C72D76C20006 +sk = DB834FB959CDF627212EBF61A0558C6C48E3757D375C08B1BC4C09027F3C6E01634C57E2CBCB2A9AD41349FF9BD317E43718C45525C81B5265E201C72D76C2000681666980A41A43B039D390D93CED4EFAF00200000000000000000000000000002A1FE2C623EDCA451F354240E73B00A365FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB13BEEAEB7E3BD14D116391319335B9EEFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000093CE5FD3BA4FAA137AF42CD7C18B88DC08BE88F6D9EA0D0BDB94072F5E53C0007BE355F358CCF8198E24E68D8A6D930BBDCFC89BDDAC50C15D456A505B192F0042CD94A434E75BE5B37FBF24BC8936B53A47D20A58D327803428F2C4E44CF7003D5A7B389EA0282B7A18F915CF6FB06DC487701E82D6EC1E77D1F16C34613C00 +smlen = 1534 +sm = 37A799AB2D24E9E1D09B2E13DFAC897F7A044C294A7115F633DA793CEABD9000294B0BA0EF2493D9C60A9976CC29F33E865F811A7E0566080C566EAF9CA2FE0300000C3179FADF8AECFCFA8458C9DA0BF10D4765E19B37742D7E5665A3A46D4DA73FA78615EC6B5F0477E0B43B4DB8D16E26936A5C8D738391202B13E19631AF40D81D3BE1FBC705BEB004FBE0113F777E0111089D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 + +count = 42 +seed = 7AD6C7DF00C9E52A75290D28DA946305D83CCF6DE2515C19A8E26850C34C8C2E545E2E32108F13B9C97F87AB68D10131 +mlen = 1419 +msg = AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA +pk = CFD17A4AB0C76EDC939AD18C72505018CBD445D3B609BFB0EB356049B7DD3701C184D6B3EE93861C9ABF2D5FBEF602EAC3F49F00E7FE307B20D222CA2DDB690202 +sk = CFD17A4AB0C76EDC939AD18C72505018CBD445D3B609BFB0EB356049B7DD3701C184D6B3EE93861C9ABF2D5FBEF602EAC3F49F00E7FE307B20D222CA2DDB6902028F56F00C0AB647A393F271CA27E3041878040000000000000000000000000000BE5EEACA3A76F8AEDF048CE0FBB144BB3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D266AA390F8D5C48437CF34362DF24366F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000F341C7B4A4969212852A564E210CECAC487D9B2D3380BA5A72B27607A0EB4100EBEABDD61065CDF207BC2190C43276FA3B060F74F5477444A2C03EFEF543A600FEBA2178719AACE407A3BD4BDCB211966539CF9B333C2FEADB69FBA3CE015A00F322AC4391D1763457E9747EDABCFC86C7BEE3678BDEB0A0DB42F1F10D1DC300 +smlen = 1567 +sm = 785578D35111968B8ED7F7579147D9B3DC1AEDEEA23F371FB8419621C4F20C00440633B07043C8F45CDF59DBEF50DB56D0DEC4BC02F3760615C4A98CEBD6720200003B9C7B51AE7722ECD58DFBFCF08ACB4CC1C212664B7EAF82AC56CB5DB4BC264A65EA3FE7E59C962CFC9660AC11980B20B846F623FC1301C55C862074F52BEA3B10C3A379205B55A6B0D899D8F2A899010B02AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA + +count = 43 +seed = 38FFDE9B60DEDB5BBFAD6C52AA02EF6D49369BF276C99E588D796A4F260E0FF0A65C96C35863BAACFFD9B212EC305E7F +mlen = 1452 +msg = ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C +pk = A26A0B5957CE4790B5FBFBF796D463B2437121F48BA07ABC4C08765682D0C60417FEA88122E0F771547F0C860C755F6BA91B280671D1D2D2FFE0002AFB2CD9020B +sk = A26A0B5957CE4790B5FBFBF796D463B2437121F48BA07ABC4C08765682D0C60417FEA88122E0F771547F0C860C755F6BA91B280671D1D2D2FFE0002AFB2CD9020BA118E15590EEA27D695D6D072ACF423AFA000000000000000000000000000000C6FF3AE0D7ED6B0D10074B38E5878069B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBAB823FFADD5EE5683C7571F56B08AFCDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000093BCC1D09BCAA2E085DEAF38F38424F96267830C4E3443178C5818C6AD123000F98701B12F7DF3301C6DD70478153AF59AA0CB9A00FDE6C412BB17062A506C00094A89AF2053672B7C9D77B4AFB1F9AFCC0313370001AABCF3E6ED3989BE31008609E40CBC12FE658617E91DA95159CB366375E6D4DAF19BABD10709CAC67800 +smlen = 1600 +sm = 404E563A474D161673AEA7B0D981A2E38FA3177D7DFC2D627B7A1F253429B7001DFE4E346A1EC77585C61D44F19126337A1900C9400F6D64682A9D396B459E0001016351B97850E85C99A882B10B2AC59240D02E5C053A0FBD40CE863725E6BB5F3C65F6A582C0AC44A1F417F20A82D851121EA927AAC0256FBB0D7DE7757FFCED550DC182A21811F41CA20654B05AF46D000206ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C + +count = 44 +seed = ACC98B16DCC9A50EF57F332D66255CA56C2BB679CAE705B4297F1418DA845861448DA6CC5CC458DE6C6E96128EEB2898 +mlen = 1485 +msg = 96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 +pk = 788EBAEEE2BA2D4FA00E958EADD83B77D70FF4A3474779C445C7C764C62E2800869AE74AA935D9EF7E213CEF3AFCE34020132A3B02D36BF72C49D8F0554A070306 +sk = 788EBAEEE2BA2D4FA00E958EADD83B77D70FF4A3474779C445C7C764C62E2800869AE74AA935D9EF7E213CEF3AFCE34020132A3B02D36BF72C49D8F0554A070306879AAB70B4CC6103590DB97409185DAC77010000000000000000000000000000B47FB21CF237F52431A1623F37496D00B3FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF33CB396FB01B3315B9F8EC899C62BD13B3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000008C3E047921ABE6992DC313A65FC037B99B9F134BFFC4A6802CE07D43F03D3E00DF928CC49486DC3605B4269FC277B374A055598E4F5AB6A959A5697809AC9F0087446C232AFBAAFA2E93B0E20C5D3BEE342C9DAFEAD961D2E7BDFE6BEC965C0071100FBE6048831F68FB6AB9AA8DBDDC9247D06EE9975F1DC92EA6C152D7C700 +smlen = 1633 +sm = 6FAED9E43E46039D6F5C1FFD83F887451BAF87605B81E9A8963E54A234138302160A207BF23499C2BB9599C6C814771880BA894D9CA4882E0C0417DCE8A17604000041A33A4E6F6CBA0953A9C8CC58794863755F8DF4FFD67F6A643A149D38CF4B232D9AC8545BB1E95B1DAC51D5B07F847D7E0810A36E2062E7AFCCFA0C4DE45B746E05A1FD7741D545493587FE8E199A020B0696E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 + +count = 45 +seed = 8BEA4E384E73C7E0B47381B3063334291A0F06D28DB61B5BF65B01D0A747722E0AA62B81AD46C00C8A5C31494E513836 +mlen = 1518 +msg = 047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 +pk = E5FFF4C3047486D68824DFF96A4FF39AE709759F197456E9C0133200D7EC4F046345239D03E55CA51FD618439D0D7699085E8D272A4BFD8D78ABB92201C3BF0311 +sk = E5FFF4C3047486D68824DFF96A4FF39AE709759F197456E9C0133200D7EC4F046345239D03E55CA51FD618439D0D7699085E8D272A4BFD8D78ABB92201C3BF0311679DC356254184D1589F978269DE8D07F70200000000000000000000000000003068BC2F7B7DC79A3AE099B6EC2AF40131FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFB89EE3F1F23D302779B1FB13996DEF92FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000AE4780CF3917D2293424CC6F618E6CA594AD8EABBB7AFBC909DCE0D608E6FD00F5FE2283BE3EC18C2BB31E45E5F5B6B835BC7BED663D923EE4F999837BFDB9000D533D192607F2DE7B8F5280167E2F27B9205FC40321DDFF961BB3DED41A3D002FE6DF27B203A70A729CA0EC16CC68C73A4F1C17C0672C65198E3083F062C700 +smlen = 1666 +sm = 3C9EE061D6860EB4D4C976C0FF3B3FEF0641C036F521A6C25723DDF323661B00B1BBE7CD9276E495E9BAF1D0FEA9E4BC0F513C56FC2F348B2BC76594E1BE5201000278555529CBDF8D319EEA6DDB13E2188CCB7FA34D2CF51E1B6DDF707F7AB389FBCC3AC413AC0C4C86E31C727A891BB90F07AA1192BDEFD6D1663FA08D24A8DFDCDC75805FEBAE4E4FE0579A0F972137020206047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 + +count = 46 +seed = CFA713E4A63A6FFBA43BFB898956DC400507F68AD164C3D24A67B5F8D7548C9DB44DAA43E5E4A0990325A4233089318A +mlen = 1551 +msg = 6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 +pk = CE1AB128F4B241F1C780174232FEA7F6B6EA0D816F2EB97DB6AA768F30EB6D0314830EDDE5BCA62F228E1A920E5EBA3F49F8A677EFC4D767878FC1562083830011 +sk = CE1AB128F4B241F1C780174232FEA7F6B6EA0D816F2EB97DB6AA768F30EB6D0314830EDDE5BCA62F228E1A920E5EBA3F49F8A677EFC4D767878FC1562083830011DD0548A0F68883AA4BD3B116084CB9538F020000000000000000000000000000523BE50D5FCED0A6469625621697D7149FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF9921BE69CDDA1C090AA6992FDCDACB1E24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000008C0A0CA5F9A616BB4A89B0A64FF6646739B087518A38D2FEBDF8739E463E1F0089F26945CC5750316B89F81FB3FC64434201F98BED678C1FA137C88949A3D800B16D381728F238B6E53384E05D4810382C66E51C97F0CDFD63C337F0B3935D00B1A6ECF2CB34D4B2847D61152C8EA8CE446D31E10292D8A3613E042436BA8600 +smlen = 1699 +sm = FCB3312F8539C136F6B4D619E5FB5644CAA996D3C71A04975281535589BA86015C87FFF7BB5A6B8E4E9D4BD5374CEF7A9AA07D1C4E1681912E47DB6963555402000089C258680E515B211ACC154EAF14BB58C10BF828AD704634D7CB3359B5B9E4BB8773E5C9BC2913073F1281A594BA56B7D6633F32979BC55BDEBA8FC4B1D0E2EDB0FBBE68CBCFE5FF1A8561B2D711300012086A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 + +count = 47 +seed = 1F3193EBC58EF65E9E396D69220ADB8ADC729BB388A72CEC9028A094F1CBDED21CFB0C41356AF31E0CF66A3B0D843666 +mlen = 1584 +msg = 139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA +pk = 979C46E9A64320E6895066111EEDBE1FE97C0AB68F1E5D95A7BFBB1AFCF99401938B4FE4668D6FAEFC2EB8AD53ADDD7F5E6903A996EE6702373AB11EA2A18A040B +sk = 979C46E9A64320E6895066111EEDBE1FE97C0AB68F1E5D95A7BFBB1AFCF99401938B4FE4668D6FAEFC2EB8AD53ADDD7F5E6903A996EE6702373AB11EA2A18A040B316FD57D714C40462339A93C90502102A5020000000000000000000000000000F6431277F4BDD94B832D43BA7E0B64F7D8FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFA227CE7E14E10F975FD15A9FD17B06B0FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000BD1FC6D422658C3DB35ED03E6683B202C4A00AC19AED7DF5AA0C23FFBFDAF100B035A0287DCFD704EE1B6AC753AFAE00B4B30251A9F7A53FE6FBBB97FD65AF008F0697E60A4A8D276E119476285FA7519F0697434BC5D3A0A6C50D2D60BBF300CB51C4FEB7ACF7A9EE121B6DF998E2C901F5B42A701F9FC74EE2ED63A4C88E00 +smlen = 1732 +sm = DC0F19F6CAF55BA7E48B12AEE6DCAC506FCC1EC125CE252F6F9016AE3758770411EDF21F22ECE993261D0BB7ED84B7151BDD1B043609AF4A4DABB0C5B87A0B020004898DEE553635B960FEC51083BD5C7EF58EA6FFA3AF65821D0F142C4AF70E23DDEB68765A08C4BBA716DD9EEDA8EEB5CE7A3F2258067736709D7E962AA5CFFEB5487F79964BA735D46FC76AF91AD8EF030B02139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA + +count = 48 +seed = CF5A04DDB5EBC45328F703D486D24443A7692D65AA55F054E3078DB76A7939590A3F35CF1A21E82A845445DD1B64A85A +mlen = 1617 +msg = EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 +pk = 5C7F062F4C02CA11EBF1B43568327D42D38D7004731AFB623EFA0908B95C0B00DEAE4B4983B3C52F99F0932ED9F16E5730D6141FA5EA656E14D88A9689991D0204 +sk = 5C7F062F4C02CA11EBF1B43568327D42D38D7004731AFB623EFA0908B95C0B00DEAE4B4983B3C52F99F0932ED9F16E5730D6141FA5EA656E14D88A9689991D0204C5EBA4064E36C3A359486F58E730AF179D010000000000000000000000000000F66438D6B4E753E80370FCF49A082BE461FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB93C6A46FE071294FC6B28965B79E50E7FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000028575B5482C18E69A3053AC93E4B48795F27436A346DB4A31796086562CD56006BDC63BE82F4D19CE5B7D797AC04A545D71DA730A9FB15FCBC26C6B52BA599002DA7E0A251DD8E34982F764BD873BD015A73D46C0687149D3817F699C785A800EB39BF61989598393C5269426502D24BE84C663D1C3F70CF53F8383E26B52C00 +smlen = 1765 +sm = 241C36F45181ACAF89711D126491937D454C6B895C6A1952154B07B6EC7447018C6A192DFAF9CBB64ABE26CF64CD41AF50554E37C5B275BA36E4CB263BD70E0000002647241A0F2647A1CF37A9FDEC4F40E6D349FB344816D012DDD7019818B95EC7477B4E900336A625FBDCA45668E9805D5AF94FEB3BEC72BF5D2A322A54B6A5C36FD89B00F5481A6A855DE9061CD74C02020BEDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 + +count = 49 +seed = 8C3D2FBBE0D39E293AF2D2CC5A9BEDEAAE3752DFD19CDC1E186D41E717A0412AA429CBDF005445AFDE684656B5D17690 +mlen = 1650 +msg = D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 +pk = EBC0D42B9120E47AD2C683BF12F9E0250F8624E0871DEAF284548EEC4F4F8604E2E1221F28947FAF9309095CA37BAFDB49C9A8BEB0B8FDD8DFB0B3FA061E02021D +sk = EBC0D42B9120E47AD2C683BF12F9E0250F8624E0871DEAF284548EEC4F4F8604E2E1221F28947FAF9309095CA37BAFDB49C9A8BEB0B8FDD8DFB0B3FA061E02021D7933E8147F290392B36B616458B9A6CA5B020000000000000000000000000000A42052E58683F0A09D381183550671E0FDFBFFFFFFFFFFFFFFFFFFFFFFFFFFFF6990418E850E8E38D29473ABF26E59805AFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000C14946E825C7EAE522E607EAA1D08F3E923BEF5A46DC331B34D0E3F85AC04700769392BA3B61CBB12922E6D5C8A6F6DBD59FCF63DCCE50325FEAFC0685F497001B97E722B9F6138054F81F5944803D8AF9FCF4EAD7333EF9254E53B61B825900B969DCEB23E02CCC9364F5B5183E0A7C5446E06FD1F16AF39F7EB6F499C98500 +smlen = 1798 +sm = 3048EE8254CDFF50D736EE1B124CAC121FD97C2228F9CD4957BB7FFE9543D0020A33F72EEBFF600B38E80FCE90A1C1F6BF012754D21CDEB9F0D0CEEAA8ECEF01000630114F50E7C74FEE42E8156799DEA4E051A3FEA3786380EF47E5D24B08D971C0B0F0A135758A9008BE14B5F454A4450CE50FCB741262224E03922AE1954848183949A005725AB15317784C22A9BD5703041DD868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 + +count = 50 +seed = C10427EF0B26328163F85D45E22EC5215415326F013FF31EDD58BD3E97B1A72FF07D275D4C1B517F4661B0638F75640C +mlen = 1683 +msg = 4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 +pk = 37A336AF254587DD02DDA81F787621DDDC52DB923EEB7D0760E4F7E62D5813032231ACCDC1F99F3A4FBE434885FE3A2368CC9192A172D0BB146496B5E1103F010A +sk = 37A336AF254587DD02DDA81F787621DDDC52DB923EEB7D0760E4F7E62D5813032231ACCDC1F99F3A4FBE434885FE3A2368CC9192A172D0BB146496B5E1103F010A2329673CA9AD859D2DC6F47049545A0F8D030000000000000000000000000000FA87C93133ACF36567DA8D39B8BBA055EBFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF05483C32804ED2606FB93BE86A35F75ACCFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000031A26800029960347EE38190DC1ED920E73319181D07FAB7F3FF3076A38C4C0060EF5283F86BB68D0A3244C1EBFD1236F872A8409DE98526CFCFDDEC1309A600C4983FA1EC026D7BE187BD1E1927BF6F8BE751870DCD6093E67B66597923010085F3568A69FAC8F876A6ED7CDE8A8C2664E8159AD4B63F7B1A2FD4EDD8068900 +smlen = 1831 +sm = 2CABCF403CDCB20EA69FB140649C71FFA41471F76F336BC2B9327487DA909200B40EC262EC32C77DA8CA9C1A7BA70EB1E4CAC4FF7A9173D7B5B623669FF53B010001B173D9A7A06CF8DB36D0F2455E4C5D2FE71E3FD8B333EAE38B350317EF01085256653FB5BE26694D39104002D6021AB6F0F76E6388BD83B7A36830BE0B76700BD6134E94CD562956F7996090E7BB5E0002024BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 + +count = 51 +seed = 4B6B73E042CE76DBE39535E45D3BB2F3B9F8B2BDA170E76CC88666844703E32B2367460A0F6A0A2E3F4E7A6CD32BE998 +mlen = 1716 +msg = 0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 +pk = 8CE7B590B379C4C6739E47DE0E76C292F54334F199CB3FFA3B4BF0323EBC8B0166331191648EBB812651FB9B49C30EE2D526CA0F54B88FD78D0DE306F9249B020B +sk = 8CE7B590B379C4C6739E47DE0E76C292F54334F199CB3FFA3B4BF0323EBC8B0166331191648EBB812651FB9B49C30EE2D526CA0F54B88FD78D0DE306F9249B020B6F45195F3843B8483F0C4AD4E8B99019CD000000000000000000000000000000E4B1B061530CFADC1376623F9878FD886CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7C0164137DFF6A7784734C8C4F007232DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000AFD288D4AA91BE62540D39587E19B6AEA42AD105DB0CD07EF06DB3539C03D600533B13CEEDFFD03DACCD77B83436AA52147A997597A260701FDD6FD78C6EE400974C535AB3B7C96888ECDE1AECE6DD78AD3A8ACAEE641B3BABB161DFB1F170007845AEBB9C213CD7452310DF3C2AEBBCEB35C991BC97FAC387D7B761A0FFCF00 +smlen = 1864 +sm = DF143977C8A29F6C3CA07972F3CCE1DDEB31D1FDC18445B74BB492530D5DE804BC0C28B368142B78EE5E2FCDAE44262B639BAAF1DD3179B49902B7701F993B0400023BA338E6C8788A0180412F7417FF263A1D03F88903CE6FCE20BD729E43ED3B9DF90B49F32C66530E1F2B0EA1858EFC7423FE8E6D7DE8524D33263BE13D9F87BD8EBD4AE73056A351B92A3AC712338E03020B0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 + +count = 52 +seed = 3D4607399F6FCBE074FD2BEAB1A7571239D6BE6308617866B65B892EE65399E14DC7FA612CDBC5F7E23116FA86C3133D +mlen = 1749 +msg = DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 +pk = 84552C21CBCB29F4D6BD62D4120BD5A1272F2A3B2A8AAC84C1A951671C4B7F03B31B3E5EC16E333EA5C04952E066E8AF3B0B7E0ABF9584A32EE9D78447CE580104 +sk = 84552C21CBCB29F4D6BD62D4120BD5A1272F2A3B2A8AAC84C1A951671C4B7F03B31B3E5EC16E333EA5C04952E066E8AF3B0B7E0ABF9584A32EE9D78447CE580104050AD79B4B6DB6FE9878FF224CB110463602000000000000000000000000000028A484A4507F97F21807388A89E49237ABFCFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B2155ED7C8CAD186ACBA9ECBCC147683EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000059EBC89D5CBB8AEE25BCE2EEB0DD78DB900C319A4DA82B783A7D6A85F229DE00048DCD97D915460DB4A0D8839256640F3DD282F9EF4EE3B20737C194EDC27B0051B439F2E0CDC26675097942D93D9473327B4E3BBBF2206EAFA427886B1B3E00F569BAC8788F9CC99008DAF005F41F6D6032714E465922018C30E605429B9700 +smlen = 1897 +sm = 1563AEC17185417F62D5E1D6AA55A3606DA3A4445AD7D5C30C05048A7108F801F919723947B817F03B8B6F4D420832A6EBF56583A97650D886E9ABC35D955101010100FA7D8E40863688C895613F9496601BE7F51E3DB464D6AF1C6210AE97EBB877565EE5A0C51838F35A59EC198B61A576B7A00C61D39442DEA3C7A8C6A6CF9C18A7BCBFACA98DE96D968492349889C903041DDBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 + +count = 53 +seed = 7031BA806F4D8BC28529163B239E0EE836871C51D2D62B601B71D6F2B69B203C81440F8FFC09C3AAD94DB1D880160671 +mlen = 1782 +msg = 6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A +pk = 19634D7E5F18ACF5D9D648707B03C70075AE0AA195968ED134D3B0BC76A7EE042CD84CDD7C1F1ED2A39EF92205371948A6916DF52B2B4CB67D3F89648650ED0311 +sk = 19634D7E5F18ACF5D9D648707B03C70075AE0AA195968ED134D3B0BC76A7EE042CD84CDD7C1F1ED2A39EF92205371948A6916DF52B2B4CB67D3F89648650ED03112F761A5C488D7AF751FEBF536200EAC34204000000000000000000000000000034EE3C3CF68C639E1F227F02FABF277C3BF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A8CDC344F9088B53FCC7087B5EB86AD6FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D4034F856ACA826F2D1ECB5426D2F9A4BA0C4CB5C3D8918E0221B22730ED0100F106401F9D7B4DCB3390B94AEFC45B93B9783C870BFFF483C59CC7448ABBF000F9BA82FF6CDC46870B9992335AD8DC1DFEE3B7DD51D06714FE3367D751AABB0008B04B23CF7DEA7CA28FB8FC072F955BC05F9266381D01F402A2F089DF91C500 +smlen = 1930 +sm = 22B10ACDA436E9F4D1A396489CB578CD1A1CC6C9CFCD54FEE564A0D9B355A601169305D520B4DA40A2395F1CF67D1E3C9BF750A0B54C66D2E6063DF8695FE4020300A6D2DF748F47F95698F551B814502C0EE58BF1252A87F787EABE0ED0CA8CA21B9FDEF58E4B0D1F6A9EC023B8F729A90729EF603A5FAE3AFD74F909B39B7EF60DAD2DDF6C4ACDBDBE194A51DB030FA70006116103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A + +count = 54 +seed = C8671A5D752CC6DDF075C899797603A625C142485EAC3D57CAF14F2244D7F84D116B28F959912A758E519D588A6A07EB +mlen = 1815 +msg = 3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 +pk = 0BB25C718555D4E23FA1C1647906958ECBCD788A3C8BE439943088B0E2381702A3BE95281AB245CD6A1FC11A0AE39DD0A39071774CE02A5C4AD6FB32CE7A46000B +sk = 0BB25C718555D4E23FA1C1647906958ECBCD788A3C8BE439943088B0E2381702A3BE95281AB245CD6A1FC11A0AE39DD0A39071774CE02A5C4AD6FB32CE7A46000BE9C38B42B85DE6B61235D59C01DCD423F9000000000000000000000000000000CCE09FF29DBB86978C544805F84512BDCDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51EB8EA13FC2C456D7FCD5B1CA21828B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000419C9D46D16D2F640AAB089EEB6DA50C158E79BE4E35E7F40FC86847AB1AD0008B972496FB8B22259B1446766DB7C2A554BCA8B40DA6F39EBA3A87B8F2026000ED85C607589713E7E2BEE2D5049F4B62CFFCB346D3AEA565A48C70CF257E6A00044E2B52B300A0710E14951DA57997B4D4F6AD5DA64B4D164DDD820DFE6CB700 +smlen = 1963 +sm = 92215AB0AD0743F52B449D9A7EAC2DD5567E6A798EFFDA2F37EC67C70EA0020132EA2680A871D3815FE953436545655FB65FF9B7D6CFBD8D57BCB9C59E64440300042503897041436E19072AA6206D60D5184485BD8C296749BBC19886E204D2B9D0D98AC7C1673FA2C6821AAD17A769D81D24E8A331E51BCE117896BCDB5010E501525D5BB00330BC8CE6EFA4DAD1323D0011173EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 + +count = 55 +seed = D780D7688AF364949A196657A066BD48FFA8DC45B4885279B6DEF362E5957F398CDCE1D20FC3F8F63A275C325FCCE654 +mlen = 1848 +msg = BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 +pk = A8AFED2341705FE05E3277EBD59A9C1754028724904796986B67805A3E159702E1F92EF5E6D0DD0A7AEE5CE46B676413F63224475D034ADBFA248F129CA1A9000B +sk = A8AFED2341705FE05E3277EBD59A9C1754028724904796986B67805A3E159702E1F92EF5E6D0DD0A7AEE5CE46B676413F63224475D034ADBFA248F129CA1A9000BD9F76D8C18C9CA73BB7320B78EAB5DE59E010000000000000000000000000000E2AFA135AD7623FF80DA2501BB064C42E9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1B9E227B43142E1B518F590245C721489FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000B7602CA864595AA5B6E915E945A6795B4F736B80215A345D5A7C9AD2D1E0C3001A91C340C6DD2F0135C62223C10F6E157B3AD7B42BDEF936C70C920B52B03E00690277618F2A789C417270F0F23A94AF1A32D7FC5A94D3A2E16D08DA36860900BD355E9A563D22F3A4901B35F17949F066BB2582CA765E0FD10186B0BC217100 +smlen = 1996 +sm = 01C3E5B017E56839316688907085C5A79DF67425057B77A1239D8DC893D4D9048148E5FE3D8D3FF413B3157BB464D5FA47BD9C35E3621F5F0658BD261DBCFF02000093629FB44E4315B51978939D60C4CEAF8ABF992EDDA813B07080C73B6C2A84F20F57FF6BE40DA485A2AC432D13B52037676F0632A180E24F73B1697CD2A8CB1895E74D8E7C7033ACF617F2BDD460BB010B04BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 + +count = 56 +seed = 36AB8588F5233D15674677535A682382C29968FF824031AF646F58FCAF0E83C1C486B1E75479149FD6F4D9E8397CAF73 +mlen = 1881 +msg = 0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B +pk = 67C708892517C17D227B18A56AFE39B5E7AEE2B07D1ABB231BF4A09191B883012DC8BB83A7B3FEFF7E6D3F323640406FFABD2005F5A48C5E4EA02C633B6BEE000B +sk = 67C708892517C17D227B18A56AFE39B5E7AEE2B07D1ABB231BF4A09191B883012DC8BB83A7B3FEFF7E6D3F323640406FFABD2005F5A48C5E4EA02C633B6BEE000B37570FEB8C8D66E4434DA2E811E71CC77901000000000000000000000000000060133FF5431CDFB0C770329DA01D4FCE60FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF234AF6A89AE17D2EC149790B30FFBF7E44FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000AD336D52869C589F41B511551E2BB1B5F9AEF2B80F87716BC1A72FC6D4C5CC00C51C4FBAA6BA09D2496188576492B537D60B0EBB8E61668173FEF7AD67B6A200A396C37AEB1C67C7D62C33872859A347A466FCFA63A804518E827EC891842D00F089C60E584A2224C73D73ED1C8035BC05D4A1AE4386A54E8B96B60ED4D17900 +smlen = 2029 +sm = 760998F57BC7F8DFF468D6A00CC12D24B84FF0A3F906D7D6C786C241D4D02B026A47EF025088E5AE515D2415ABF972E87E7FACEE1EC450EC9AA0DC57C0ABEB03000070D089307F4B52A0621A791D3F6E23C23B3D403DA93AB18AC1EECCF98390DFC559C070C04AD2CEF0F28F4D080C7E4521F56811DF5B5A8D30A5119ED89E102A879FF19AD18B1129B82BCF1B903F938D020B020707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B + +count = 57 +seed = 4E94DD734A371A7C6AD4A567038CF93BAACE2B9D30F3862198DC55D2F21F8FDC9A7AE5DCA1541712179E3AB1FFA3F792 +mlen = 1914 +msg = F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE +pk = 415024923F072A85684FCC9820D5345B3B7A98311B2399481B72CABAE19A5A04A039A30931150EFB86BBB025F1627245878BD41A76B6627A6C76CFD9B417D00102 +sk = 415024923F072A85684FCC9820D5345B3B7A98311B2399481B72CABAE19A5A04A039A30931150EFB86BBB025F1627245878BD41A76B6627A6C76CFD9B417D0010299840BD9715EE39C433C4CF373E005E941000000000000000000000000000000621311A96C706CC3A553D77B3ACDCD6AD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC97A9CBD8F9F9362439CBC993727AF69A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A22B861440F43747CA7743D9A26A988B57C8EF3E5DF9B6F8686A7BE908CDC0002399A43C60BD9AB102CB9617FDAE0691F31FBB0D5555183D439F1ADA7AFC4E004F89B839C0522751F6C470C88CF9DC7E260668317BCBDEFD9683C1EC92ACC9002FFC065D1859886C9FFC9156E7D1C91B9BA7F60F9C52C7658407551F69098100 +smlen = 2062 +sm = 84A3BFED74DCC6B16A95575C667E77267DFC0ABA609E75CDCC3D30CA794E8C012AA561230A7DC37D21BE93B4D7628D2A669B335073F1DA5884E11F33FF81510103009867C551A0866FA334D3B1A6601E7414A7A4F1FBFB0D054C2246AF350F8FC81F7FECD951C41E0441060D979FFB772402430EEB1EC31995E2776C59AC9B2BF20785474F83882578E07DFE19B860F537030611F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE + +count = 58 +seed = D9281003AC5F7673E0E9A7BC29C4ED75E6B0F228DF49D11A2599BFF2DA9E887163BB26DBA4F071FBCE02891540EC6F1C +mlen = 1947 +msg = 437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF +pk = 0CA1DF78430B293C99F66DE4CC373C14E66DCF17E9EEB964E22D0E2374A2B60470646B711FFBF20858D1AF19299EBFA2ADBB66FF1E5CE4563F754FCC9BCC2A0302 +sk = 0CA1DF78430B293C99F66DE4CC373C14E66DCF17E9EEB964E22D0E2374A2B60470646B711FFBF20858D1AF19299EBFA2ADBB66FF1E5CE4563F754FCC9BCC2A0302E9D67BB6C5141C28D92B40ED533F08C9CB00000000000000000000000000000056C33568AEAC55D1DAED182078E1E84481FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF814354B0916646A0BB1BEEEF9264B6C3B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000041F8857455881E2005560CB9949ADF5B6A84ECA66CC7D8BED7755720771A60002FE42BD7FB80BB80D4448975209FE604EE5FED1877AC646312FD5B7062D03E009EE2C23E90764F0541A41E144801E6FC3BE22E656D9DF0C4AF1DE38130443F00415C76CAF8EF95B48D8DFFC9D634E61BFF0907C4F1C338E1590B7A5DC1483B00 +smlen = 2095 +sm = 2DCB809D8C2E4174219A4CC36F032A0B4179223016842C13FD30165254D96300937EEA3E1473B8AF4D49ACEF5B0F4E2328992A4602A292979664CD411543540300021EE0CAA49FCF7A913F440ED6FD31382B9BEDE865648210058977D61E43AD7A2EF24EE82D1DF612C9EC171B2CAAF91710D736FF36503A2A0C912BFE6B357C4B6FF58882004414AD1931BC9135C25ADC020B04437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF + +count = 59 +seed = 750A74866BE8DF4E60BC14BF36E6D83ABF6DCBB86792D125CF0980007C5435F40F87BA96498A88252D9C5C6710807652 +mlen = 1980 +msg = E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF +pk = 3B6736139B5DE5BC9D5CD589413D8A66C950996D6121DA753F28911FE83021035D3291E36C2ECC2D6D3853AF31C17DD7738401D79905B0149EFAAA68EC1C0D020B +sk = 3B6736139B5DE5BC9D5CD589413D8A66C950996D6121DA753F28911FE83021035D3291E36C2ECC2D6D3853AF31C17DD7738401D79905B0149EFAAA68EC1C0D020BFBE9B9223662951D18A38BACA20860632C0200000000000000000000000000001E8A6E4A83F383F342FC8C4D5F0C587658FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFED2D9E6389AD23F8C1CC5453418826F923FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000005F92BE610282355F630C356DFE6F20676D138181A888E6105E4F5A58012292004BCDA02FA5E000503D32A3783ADF1316C8622E9D6EC733866CACA3FFBA9A3D00126DF24EF50BBC8CE735BFAD6837241422E6E896A39F39DE659813BA3B795400F9F4D89C40991372A742A5740B625DA4D57D486EC7B8FF3424E27D3BBDF7B700 +smlen = 2128 +sm = 6055BFA164BA7C13E0E02ABA4CA6CB9D7D9097E7CC58F13019AC2C6AF79EB504EA4A29FAF9E193F7A2D70D1731C00F238CD789E28E700C46E6385091A720B1030001E507BB0ADE7E12FC5F1EB00616141512D6D48A47E90797CC0431D119EDCA97707E4215A10E1799C220CF9E7908D840745A301A90F577FE21A55A4DCFF223F5DFFE05A3ADBAFF9376CD4FEC768706E0030402E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF + +count = 60 +seed = A832D4AAE8076C4EFE8319A74CE315928AB765BB629075254CBC63EAAE691C220F4B5E1839E9A99D8747AACD7C2F1EE3 +mlen = 2013 +msg = 84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 +pk = A172FAA3FFCC01DF8BC52ED3C8A148B83304C60B2A222D6C4E2609E726F1A30379A23B4334A09ABF6A64BFED9C135D57F606DA44DD24B215B7138C5D9E5F900004 +sk = A172FAA3FFCC01DF8BC52ED3C8A148B83304C60B2A222D6C4E2609E726F1A30379A23B4334A09ABF6A64BFED9C135D57F606DA44DD24B215B7138C5D9E5F9000048FDFCCE0D937B050530B166D10F9673F5C010000000000000000000000000000CAB9D0CEC7E6136D5B9CF73983D5E11D0CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF666659C10DA70AA47E97BA9D996305F9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000DEB4FCDFFD4329984451D3FC1DA831BBFFAB014B0E51982234A45486C3022100B377D0FABF3E8BDB4D5B8610956955C93BE38D0F615A81837C851089E3FFD20029F1BDB365436799872F2384DF69C7ACAC5CB0818EB19E963CAB1ACA628E9D00E56153C6FBE47FC0692E9E05B0C507C1EC245614A1B9AA133F9B2B8D00C1FC00 +smlen = 2161 +sm = 056905A5154ADD79D203E15740330C7E71E8A7E43A77435F9D7FB4A174821B02E731272B25D7D85ACE456B2CC4A2A63209AE09F6BA40C62C07346573C9BBEF02000042278DB44E134FC99D52934E4F67479BE39A4DF4B190F2ECB9FFF9A741AEBEBD47B581B0A2FD15CE7948911BAD4966BD26E70DDC8960EF4771A85C32D839138FF020E2AB0E9A7FD09A0392C9153A5101020B84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 + +count = 61 +seed = 09B8441F47235EFC82D71933A0037FA4F69124C3BAD4EF6A3A7178B417A3FDA874081B7EEFD7EF1BF234C752458FBBAD +mlen = 2046 +msg = 92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B +pk = 14CDC16B910FB42382C53E55E5A963236D47C174E7117322E1F1A5D70F75EE00BB2BB0E431970E25952EA8A4DA06B1557EFD04FB6B5162DA036ECA972562280304 +sk = 14CDC16B910FB42382C53E55E5A963236D47C174E7117322E1F1A5D70F75EE00BB2BB0E431970E25952EA8A4DA06B1557EFD04FB6B5162DA036ECA972562280304B56F1B561D0674314054DF8EA23416A878000000000000000000000000000000FA9FD30724314294E9A041634E9F83526EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D271110B738F8B960A2B2FF6573914AEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D1EC8DE1858E5E9850A088CC33F22193EB354135BA3CE18BACB1C7CF796FBD003D62473D986EF44100048D4D8465D462A221E5099CBD62A737B1BE6E89D5E50028254D76768E70131571E714771757DE9164C8907D17070F50BB5D90696E7C0015929D9E0BA6F53A2931355AD9D2915BECCB3BE316809534841452F1DB8FA900 +smlen = 2194 +sm = A050B1C239800FB022174FA34612687286357D0F99107CCC3265946A2F731F02C36972FDD37FF0BAB04D284D8A8E6A3FFBCC8D98EDE5CE5398485E15E96C2E040000BD1DFB55CC35B3AE2B9607A101C98CB83825839526C5F75EA38C381D73E82F0CE01CAB879E460F69A646E0312956CCDC0128F31CF5BC6A505B1C0ADBC98680B33811708D4EB3BF3AF655399267647900020B92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B + +count = 62 +seed = D2629CEEAE5C95D3C34C1FFCC2338B4A97782BDFCD39111E18540B69DB035B352D012857111F816F03550BFE5F56ABEE +mlen = 2079 +msg = 7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 +pk = 5EAFA9C392EDE250F8C17E2713DAFADD94E1FB7BA84F27FA29E685920022F904D27FC64F94F4775FEDB55A1288D4F3D3772FC5E7B42C1FE73222684B57CB830204 +sk = 5EAFA9C392EDE250F8C17E2713DAFADD94E1FB7BA84F27FA29E685920022F904D27FC64F94F4775FEDB55A1288D4F3D3772FC5E7B42C1FE73222684B57CB830204958C462EBDA89499B06A17C98DE266B331010000000000000000000000000000C42E8FEFA2C53CDDCE646D370A186AE6B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6520AE84A9799862E25A2F6E5B1454D784FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000008B36CA19EAE23F7CA18F9C1B4500C784E3C10D6D531E53966C4F697F35D75C00D5147088D7623D394784DBC5133F61D980A00885721D0582E80AD5DE2692E90003EF94606FBB7E58972919C82D4E2D699DBF73957548239D8B735E5B3F71EF0064706DC262F8C5F690D7AA43EF6D50FFF8322E26B16C235A95B7A3CAF85E7C00 +smlen = 2227 +sm = DEFF4ECAE24384EC79B02CF2917D8E7B3FAF4C1F8E5BF5D63130F51168326B04564CFF816C391D67C566F6BDD9682351542933D4FE5D9F8FD9558310B4777E000102772C094A119BBB87BC7560964784AA10F2A0041C3DE8BBF343770C517CFB48766F5B27CFAFB46FA1DAF38854C8E7747DBE867ECF9238960E9AD55A15923B90419C6C694465D3068D2958B9379456A60304117F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 + +count = 63 +seed = EAA4FB8EF0290A499A1D92EE398A8D7E71CD3CBF01A36750DA4B7EFF175DA26D17AC4ECE49A84C88D1D2C2493563C26D +mlen = 2112 +msg = 2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 +pk = DE481CD721F5CE98C9B732CCCD5D41B49BDFEDD3EA99DD3F83E5AADA3EE15201CE6B908D138453A0EA02F61D8F9918C077A668613A312775510101375559220306 +sk = DE481CD721F5CE98C9B732CCCD5D41B49BDFEDD3EA99DD3F83E5AADA3EE15201CE6B908D138453A0EA02F61D8F9918C077A668613A3127755101013755592203064D33CDD974BA5C393F722E01625E9D6983010000000000000000000000000000C47FA52BBF11299A533245EC6324E50501FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF43B89AC0B668222350B4FC357BFC57A13FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000EF91B934B59120879DF66D8900BB71F00C10679AAA321261DF027FBC356C3500FC1833C725CF1D06B22DB70F9754CAEE795098947DB994195C8860FF114B5000B748F69B9506F05635110678A032816D86C137BE9D3C631F4C4DA83A1FC29A00313F6B8E6771406B80D329BE244F26393C3A2B8D76E913D1C02EE5CB4DDB1900 +smlen = 2260 +sm = 203B38A4003613A48A4899D7300B27AFF10D7F2228ECFD37B12782278E752C022DC95A8AEF95143762A66770ED7BB18767818A834B18AD7A110EC6AD3F2E0A000100A367120CF56D0D9A88B26E74D01DB5618A0E936B5C9D8C76955E712AA4666C5CF6256CACCA2EA0195CECDBB2D5CE2A03FD424A9AE4629FDC9BC011C1592CFD281D9460EB24E3073E3756EA68748E0E000B0B2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 + +count = 64 +seed = 5909111F333F3E939105DFF8532548927EBF289F31A72F4C1B0C66816D8B68F64622F36A9BC85E63601BEE8EE7CB3DC5 +mlen = 2145 +msg = 5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 +pk = A417371DE74E68BDFBE1ECF81551C9A0356B9F38FDBFE177BBD65A9D9F97AA01E526253B5434DA9C1E888E947027C13382130D9254A258753A1FBE14858D4C040B +sk = A417371DE74E68BDFBE1ECF81551C9A0356B9F38FDBFE177BBD65A9D9F97AA01E526253B5434DA9C1E888E947027C13382130D9254A258753A1FBE14858D4C040B43E060C9E9478B3DB0E3B0C968D404059E020000000000000000000000000000B05BA684DA4B8921C61CC6E1DA7521C525FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D9F076033CD3F30E152E16E3654BFE522FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000006EFED680CC99590418718D3240967C6D462F18FE14CBCC08A52E202572662600B7C0679274DBD4415141C70EC61DEB968AF09153C4D4450C55ACCF05DD8A55009D8693A6BCDDDCB3EEDA55262A4678C7525996399F0A2516DB4F4CA60F9E2400AB6E23C7500DA3CD3AB13B8E59DD91CA508A846E0501BA8E78F7C864EBAFD000 +smlen = 2293 +sm = ADBFC5DA731CC43221D8281A0C263BF2A5002081B2FC228626125BF47DA0FC04033FECCB402D692CAE29E4BEFF756F211316E38E17EFBE50880C36B18A6E290100014DC8BD826B0B33EA5A96D79A2B9208FCB6C8A011CC3FB4E08E97387B9B01F1AAD88DF7A848CD1ABC45F22BB6C579E323AEC832DA8447BA54F358723D2640EDD6F39D62120CCFD4374B9EFF59599CB801190B5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 + +count = 65 +seed = 238461A224ABEECCF709AB6CACF4EDD372D45E5F4274095273A49AFE614F2BF713134ABF68B4DD058E6D7B612C3658C3 +mlen = 2178 +msg = 99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C +pk = 097B2D27CE291C033D1D0DEBFDD1F1134FCBD0892F36EE395607995F4978B1024727F6801AD193C762A99150B3D2C5328B3E8B6DC2D387305E9FECE3BA44CD0211 +sk = 097B2D27CE291C033D1D0DEBFDD1F1134FCBD0892F36EE395607995F4978B1024727F6801AD193C762A99150B3D2C5328B3E8B6DC2D387305E9FECE3BA44CD02113907FF70350C57A32A2E10E6430DBD46A702000000000000000000000000000004A0E20A46A68C47EF656BD92EBBC2520FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF45B8A30CF4D9BAD7976EA9AB557761B2DDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D551BD5104CC9D52259C66348A0A7F5584D787D42C09E25EAFFFD614A2DE5C00E4CDBD9A24971CE525974893219D4BACC10BC7E9F357DED7993BEB0CE5BA0800A32219623AAE195170B1E9F0972D5A2E216C3F5A9427E15D9A7CE3130DF14700F365C4D6149C830445AE8A7554C658379D798735877CC5C2E3BAC45332D1B200 +smlen = 2326 +sm = 31CA43CA4F93BCA0F6C02D902EEC6B36CB70BFAE3ED1FFDCBA8D4F37905ECE00459C238F4BB652476249DFD5D01E8701EAF2A2E9CB3080209F9C729E971DDA0300004114D3CE3FCC93CAAB91871B74D84CE1D0C85CF9616E57DE26E24ECEDFFE2093AAAF251D48BFB259194316293EC3CFE4672EBBCD17B08C8609F9A61692A9303E5446C62E44C1552A586ACDA1E1110B00111D99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C + +count = 66 +seed = 83C653708FAF3E5F6FBC9DFBE6FB5E83E572A7688645D75D2C4835B28695DEA4BD7093740D0FF43237354EAD1C978BC2 +mlen = 2211 +msg = E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D +pk = FE34BF50B435B519646E1F932AD2CEB78D08F7FD35481F1F457B47B5C6A387049607F5EBC1224680226C4B0E7EDD3CD55FDA80DEDFF3C7EB15865350AEAFF50117 +sk = FE34BF50B435B519646E1F932AD2CEB78D08F7FD35481F1F457B47B5C6A387049607F5EBC1224680226C4B0E7EDD3CD55FDA80DEDFF3C7EB15865350AEAFF50117E590C975CCDD7202A63A660E745692A9D801000000000000000000000000000022FF9C15FCE4C1803889CDD06057572875FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FB05A4A5B48538CF4F0CDA9012D77D38CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000D986FA33946C40CAC30153C7D365DA042E0ECEF6D2D60A3D4825E95D42A6A5005ACC81C0E56C9537D729E72E3FC88DAAFEE2CFCBD79E3774E719A3982976AC00333314847191F0BEDA12C44581C96CDA3B966B3081970CB994719A4068C12C002F63382F6324CD065B19A652D572370DE95F7551BC9AB055BC69902DD37EAF00 +smlen = 2359 +sm = 0B746D157045B72FA5274CD0208AAF79B62626152A57C83A266B536736FA7303E4A757E50686D95D62131EBDEE6FA918DE40AD2DE3F4BA6A2982099879CCEB020102EAB394C8AD48360D64FCFBE6EF70834333E915203A7E4DB7F9F598C95C63CC4D92DFD86B7F1D32052DC8D8E34CB7A404918418FD5F10594C24F1E946E0281923148F90F815934D58AE58AD3ADC342C000208E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D + +count = 67 +seed = BC81485EE93AAD8B464B5199FFEF9FEFC06EA97645BDFE0B4E915B812E606A77F93917ED925E882161CBB909747AC4C8 +mlen = 2244 +msg = 89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE +pk = 1620D624B05B1E22DD7C3E09604746AAAFE33F3DBD35FCB722FE18A51DFBBB006E3927BC26A2C9681638236DEF493BBE6C089520F24AEE8C258967B18BCE120004 +sk = 1620D624B05B1E22DD7C3E09604746AAAFE33F3DBD35FCB722FE18A51DFBBB006E3927BC26A2C9681638236DEF493BBE6C089520F24AEE8C258967B18BCE1200047FF650162C2DE2911F60D12D8D25EAFB29010000000000000000000000000000847FCC1EF69912FF6DA1EDC57E31F646E8FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF63F37B9EADB0E9E2A8E3BB54829A12B169FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000017D75A1C237EBB39A4C6B8B1D8B04CD09B118DD2054273F735E2DC301BC18400FF405F1FD69361BFF993632027358A0471F2C9B2D6BA2AB510592AEE89DC0F001358CED7C15C433B4282C744D1610B927A0970F6CB2B7950DE2574B726AB2600EE653D8F041755ED31DAC94D89F60A23AC4C1E4BAA9D86D92337A5C5D000D000 +smlen = 2392 +sm = 3CD5CD9E06D9476ABBBE31A7C6728E416647A5FCA099D73DDFDC22314B275A044D84CFD0AAD3E1EDD016428D0121461B368ED329D3D936A432D30B8D11A61E04010170A850ECECF2B7BD0B54ADD10D9DF93FC78E5E170AEFAFB535FDF37B30B01B2CD2D1C2788E7260AF9BE99B963BF8B37DDFBDEAA5142E87F4AE26F1F31BFA5B197697C24172DA23E1232D7EE492F53E00190B89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE + +count = 68 +seed = DE9E2742591A5AF6A6153DA85A510C39FD31A2ACD8A8511F190A9A5E5753E63D9801A8019508E67DEB1E9219CC18BA3A +mlen = 2277 +msg = 8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 +pk = 85BA076F81646785B76E686FD598235E6C632149ED2AE461FDB4F35C49D45300A28C02689E259B017B2349473A1BED781CE2742AF18A56BA963ECF1313F3DC0402 +sk = 85BA076F81646785B76E686FD598235E6C632149ED2AE461FDB4F35C49D45300A28C02689E259B017B2349473A1BED781CE2742AF18A56BA963ECF1313F3DC04024B0767CA8A3C8EA57C41AB1D0A4171774A010000000000000000000000000000BE28CC468C4B5D52C34D6C3C4C0248A9E0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFE121FA7B4223D0A9C5DCB01B9398FBBFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000BBC6C83FA8FFA832A8E3FB1792FD9E1E8934780510D23A6B9D06B9A7F69AEE00EC0850562DEAA61540AA770175BC28FE586E3D561915059471D39957E818F1007B4AA074AE15D2FBB3EC6E00B7A542E8537F03BBB7B16367A41FF6122AD220001B7D8D0D4F70860AC3F076B9F3E22D38425AE2428328C26BA679C6925BAFEE00 +smlen = 2425 +sm = 355BDB1B950FB1D980D412AE483399BB6F50E031573D07C11F5A3A28CA6B7C0052EB838BBA289E5DE40910EC939A66BF4FD870A70BCD42C75CF56E7B1E2034030100B98DD029560ED9D4CE9C63CE5A98F72467658C481B3ECE5773FC9DAC87525434338D27CF739AC311CDE64AE05CC5CA49B6BA25908DB1189CDEDBE664667404326DD77C5AF82E72D202826275D4DFA500040A8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 + +count = 69 +seed = 272E459EAB6A0BDF720E4C5B79E641C95BAB66C3CEE261D0E3596BB04D232ACE0A1CE24BACCAAE9037665A962C711B08 +mlen = 2310 +msg = 62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 +pk = 60EF0B126A9C6D4E63C516C8CD5E79E59120B12401DCB3810368EBBADCA7B70138EA263C50487297FEDF27365F2C3D18E975C33281674353C68C8E78A208490402 +sk = 60EF0B126A9C6D4E63C516C8CD5E79E59120B12401DCB3810368EBBADCA7B70138EA263C50487297FEDF27365F2C3D18E975C33281674353C68C8E78A2084904025BB6765E5196B4CB630EEC5C29DD5CAC3602000000000000000000000000000000F425B20F2217536E45AEF158D8811AF7FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF79BBCE86D4CB62E26A2F2283FC0D71098EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000071FB66F7400D2D2C6EBF2D8366A3D478A71B2F030A063B8CEEF941812096DB002A0EF3387596BCF180A40957DC95B1B11915CA9E5594DBB747F338E469CA530023AA6BC37EC9EDEE5B333BE90571A76CE1B3C00E6BF38927EFF980A541F003004164E44635684AF9071FACC41CD4FE7377271E95D63814412F4E247031AA6B00 +smlen = 2458 +sm = C1C17EABE7D2D5F2EAFE3390CD73860DB6C5F9536328171D371A4F8D37576304B3B1199EB8B81180FBC7EF78A7F080B7FDD926CCBD079B60E4BB3F501D870402010037CD4B2E93ABE66C5503437321676B17C8C8F3A88DE4F6A194905D5A2AEA074229EBE55F18AC590C316A5A025D2D6F79AB3F70E1D8F20B9251454B442012A93232CF00EAB7A4CDF641EEF8925CBAFC00021162215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 + +count = 70 +seed = DCC58DFC13B035323ED44BE50A7096F697C9C143518FED50A59181160960203831A9904847BA20B85E99FFA63E4AB0B2 +mlen = 2343 +msg = 954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA +pk = 3B089D505FB33DCBC5560056711F992895F29F94AFF09F31BD9C5705945856025AE61E2E0E9E4E9CA2589B911D7DEF56AB5315BD0DB717C50AD5EF98F2903B000B +sk = 3B089D505FB33DCBC5560056711F992895F29F94AFF09F31BD9C5705945856025AE61E2E0E9E4E9CA2589B911D7DEF56AB5315BD0DB717C50AD5EF98F2903B000B69F537F942A20336E0C3E546993579744C01000000000000000000000000000048D9AE5CF7CB0A5A8EDA25219ADFF139C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE729C4CA28B9ACDA8F8D9047F8EEE427D6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000008212628C5977FC464D8BDC353344D042ACF26073C7DB7B6C86178CAC20F01A00A1A515B56B2179E951EC6178EC81EFCA87B2A481F40C0CC2618A473D153AFA00F3DD43CBC0600734EB22593FEF00A6AB5AAA33AC60EDD19333BCE9C5BEF23400CD632ECE0AC9EDC1C3B179FFE1238F124739E73EE9F2E08B3AD2FD068AC8EC00 +smlen = 2491 +sm = 853ACCA5DA0709AE899C55E1D6DB56EB638BDA8D6D341714CE70755F33811C02182CFE52390CA5DDE01A523F0F40CF15D6ABBFCBAE17CD95BFF0A13611C3D30301001BE9C44342683FA01A6A5DD404D81A09E17A3E4CDCB83BE7642460815EF3406C0DA8EE94927E804EB736F55B6440177674C42FE28075C3EE393C8A000BEF55081B824FE5AE23F3CC6B2374C6C0A86D00020B954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA + +count = 71 +seed = 270BEDAA7BCD43990FD8B4F44FFB63A3AE8E991BB2BF84DA7BC2CCD1A079C579AEBE2082ACBAB7FF286DE795F31973B4 +mlen = 2376 +msg = 326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B +pk = BA5EF98156C26EAECC654C2D2144A40683136EDF913DF2BBE2AD3B8820C8F8003F5F6CC2E69AB3E8FC8162D53A4840E9AACC4A0AC29F5E5E5B1D4C5F8579D30219 +sk = BA5EF98156C26EAECC654C2D2144A40683136EDF913DF2BBE2AD3B8820C8F8003F5F6CC2E69AB3E8FC8162D53A4840E9AACC4A0AC29F5E5E5B1D4C5F8579D302197F973C91AED63FA8A626FA708A764279A20000000000000000000000000000007A4FBC2E64763B38A609DE3FA674BD7F79FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF415F2C9AF4BDC0D2DF1210090540CDBADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000085E2F46C7A57C832E4A26B0CCCA817DE862DA90882A7B036178E11F8BF3F390014309ACEC4D0E6781E366052F383840F7B0A0C35A25B566B40B79AD05CA30300A6AF5E43E48238432AF0328EE9DB13830A080230619936E2A9AEF20E371175002D9409918C36A0B39FFE260B3C885EA8E528CB1CE6A53C7635FB7B0ACE033600 +smlen = 2524 +sm = E2B1A2D592E69342482742BF1514347C660772423EE2601C1231C0906D299102441A5A0BFC17C23423484923CC526FC2A5454BAD0E0E5F6DD662C176D3A18C0200016BADF266909B4567D4C2E490D22AA4B63D19BC5C3BFF98484BC2237875BAD9D827EA33723C623669CCC5EAEC15B691B0B34A0BA09183500CA547D099AFB5A933405417EFE5E8348D0D47DCC13F48FA02040B326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B + +count = 72 +seed = F151196F55A9ED88F1663AF6BD24B2CB9DCAF3C9B313CD8F0A27639D3CDAE72EA90D60ED5C7C6AB697A06185E5A2E215 +mlen = 2409 +msg = EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 +pk = 8BDD1798514D9886CE4EA51C6CD4AD0D2290F12C8C24B0E4654C95D75E15F4032941522842AB0CA8EF6EBD46EA8B5232CFC264951318CA002DF5F4902C731D0008 +sk = 8BDD1798514D9886CE4EA51C6CD4AD0D2290F12C8C24B0E4654C95D75E15F4032941522842AB0CA8EF6EBD46EA8B5232CFC264951318CA002DF5F4902C731D0008275AC5E152742B1B3DFD9D5389E4D62E6C01000000000000000000000000000062D0A057317728300ABE1F9D89DD08179BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1F1EB3C7F753311FC096FDB788B5C0D68FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000917929ACCFB9CFF9DCEF3E4496366058326806B437E8284D354A65CEEA387700A8E751A16C4E70B5DB26BB2731BA75D1F4FE0929C36344B4C18DBDDE862E5F00646D1D07BD707613C40EC2F141FA313E8C1BCEFABE602CF1C8DA7547024B3A0039848EB31522FBCF01831C93195DFCE9CAE03217FC9A01325F5EA90989578D00 +smlen = 2557 +sm = 4806E3CD95DEF1E24C619F968D2D51BEDA9ED7DBD134CD571D7EFB632C631903C22FCE7E0014DDBE83A6FD07FC322FB043EF6C2299B7F2BB1124641432461100000098DFCAFB6A9D377D8A402CD3BAB18E536170F6ACE5368B51F273F3D3D51D51A9C35F54B90FACDC02CCC24C396C2927E4BF067DA80C9A87795C6ED210D81387399045D623827938117D677995715BDD02110AEFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 + +count = 73 +seed = C7ECD1EC1A3D83F5116C0AA4345FB3ADB4D9F81BD79896BC4932EE2F9D2D1F179BAF7A002D88F4F69071A7931E7F7FAE +mlen = 2442 +msg = ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 +pk = 43A35C891D9E8CC0991A31BE7287E5DE40D0D7D15D2EB7CFE106FFE1380A370392A064F23C34C9FF1AE642B5523CE0ACC0588BAAB059B395432802E092BF380302 +sk = 43A35C891D9E8CC0991A31BE7287E5DE40D0D7D15D2EB7CFE106FFE1380A370392A064F23C34C9FF1AE642B5523CE0ACC0588BAAB059B395432802E092BF380302D9E6ACCF55EC91691F2E5D6F06819C8B34010000000000000000000000000000AABC634AA4C1D83DB251A0D5AA0010B7B6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF457CBE5409DD5055A87295BCE863E6ABEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000B0AED3CC2CB2C1D49DF134C0A5FEC89778A44A6D4D12549E0158C03C66DC2B004DBE4BF4E9BBF3BB341B086EEB85A110EA29F3D4A12BE771E12128E7B4D60900E96725BF985C9B8B587C8ABB57BC8921E3FAF60C049F1CD85C254EE298124600D238DCBAFDC37725518FF6AE50B80503953B3A0D776C760BAB26A54A5C80BE00 +smlen = 2590 +sm = 608CE72DD36784FBFF4E8FD58B2616B52FC3486743C51B0B5C3B115A8AE9A9025BDE78A46AED581829740A58DF5D571981281AFA2CC4EFAD0019687E8F5D330401033BDCC7A90943AC5C42C17B4946742702DB63C829F673A5B9630AD8FE283E2866985EABA298FDAE0670B1608269471638C00F9C0E9C4DF9186EAE63DC260E6C5EA907AB7B7191DA7EEA462B7C6F9363030B0BACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 + +count = 74 +seed = 5DE03CAB3CBD81B8805A17E0FFC2105C3BCDC8D782EAAB161A15AAA543FED59353C1FBE03E7F36B955FC51C9B30F0C93 +mlen = 2475 +msg = 5F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 +pk = 2637AD929FB2AC833E355A680E8C156603102314E11A470900EDBC88B040BF007A60332910A894465E9576615809F7E28B0A678387C35A49EFE97F9C1A9AD00311 +sk = 2637AD929FB2AC833E355A680E8C156603102314E11A470900EDBC88B040BF007A60332910A894465E9576615809F7E28B0A678387C35A49EFE97F9C1A9AD00311C5A8E80E38DF002541A18D3534B61A136902000000000000000000000000000028EA166FB3CACB4C9D21C378B8CFBEE7A2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF95520BBABD3C851798FEBCA301A525966BFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000009509B8091EB7ABF0DBCA289FE0961AA4A562B335A959561BF740C8B09F61AD000795EC2DCE18C96704A6FC95680313E0193F1135B117BDB53A415F9E5EB8620019190AEFE35E932FC944B103573C170A19ECA63E452C5BB9E600E7CCA2E6E900246A36716283907CB70A7498AE5201A6E3DFB0B1F0736A41C779A1038BA27500 +smlen = 2623 +sm = 1DAD289A04A294AD6676A4F33EA38BD5EED034135B19917022AEA8271BCDE201CDF7DDE0E514C5B09E5509464046391074AF6B0F71BC9B8076F9E0A4C08CD104010157840A906CF0DB0CC3A989F7230F3E7EA84E6D2233BC5E0EB339B46B66E80547BE4CF258368D4786F557ACAB5FCD7B203AD3359F8C30E0F5145027F0ECBD461D47C62DBAF8B26572E3A56FD2E5D94B0106115F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 + +count = 75 +seed = 63742CEFAE9868C3C0B31DDE0F9D378FD5D71BE7CC3F0B6ECD393DB55FB043CF00264852C45D1836CC12B9C872A20251 +mlen = 2508 +msg = 9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 +pk = A322F7ED66237BF15BD4529F528EF7C7950C04ED1660B9CDFDD945300FF026020379A4A13AFCAACC3B721D4393092293172131C70B7299CE4615DC74F823710102 +sk = A322F7ED66237BF15BD4529F528EF7C7950C04ED1660B9CDFDD945300FF026020379A4A13AFCAACC3B721D4393092293172131C70B7299CE4615DC74F823710102B5FAC87D69363AF83F5F484F9BE18BDBF4000000000000000000000000000000BE7096825A74DE7F7588BB8099A91B822CFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF677CD1795B2BDA5171FBC587D7E0B4B451FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000DF03FBC51307509267FF3EBE3D09DBBC96D3B7AB5ADAD91B1DC0A9691CEAD500D26C7D378ACB681AFAAEE1E310CACD409285F1717FF461ED059D7CA895B40500F337972507C77FC63E39CBB0F4D440E8D9034ADFD1CB1414D67BA6956A967F00FF8720DE6199FABB8ECD0C6FDC3789A69818BF547399D20C12F54B57C42A3700 +smlen = 2656 +sm = 56B01480C809C8D80C134B4A16060232829732B00229BE22A3B5040DD4E033017570429D44875BAB124F130BCF2C61209A08241209066E059582E449B362C00200000A9E802713CC6447E7D87E019BA892882DC2CBF659150809B635ABAC3CD40F9617BA5F3084D079882FD99A7D5C568EC420E0BD1ED020436C862E5B91A3A38CCC38631D386F40E00770F83D0D2DA8C9000B0A9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 + +count = 76 +seed = B887F07DB5358C3FDC2402947BBC87ABD064B02A859FE8DB37B5BCBB916020443DABA5534A0778FD0B1C05EF3ABE6269 +mlen = 2541 +msg = E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 +pk = 5DEFB1BD673D23B3C9C5FD92E5F9C127247EF2B8433B9D937B6527776FDE05035CC0ABC7C7CAAD9EB8D2E33587E3BE086DA78B9FD4C0460B6F8EB764457340030B +sk = 5DEFB1BD673D23B3C9C5FD92E5F9C127247EF2B8433B9D937B6527776FDE05035CC0ABC7C7CAAD9EB8D2E33587E3BE086DA78B9FD4C0460B6F8EB764457340030BA36C8836A4BAF5E470E0428308CCFF4B5401000000000000000000000000000060B75B55974B3E54B9FAF246B081EC29B4FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB8AB162B65ED2658E83EDDD329FCAFA87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000009520212B620BB63A1A5D55B4E35CFC666C6DBA3C0147CB8943DEA132D9790A00B19CA0CAFDB98841D7EB1F7145650D1FB83ABACCC932FB63A63C9ED68B7CC000A914EFAA390BA0CB57872C4699B5EC1C09AC21C4E2699F3879D2A045FDD68800AA9F6BD1696588A5AEF1695BAC400606A611F14D5EF9BE5963753B67D9D23400 +smlen = 2689 +sm = CA8B63691FBB9E36CE28EFB104ED41A20524420840B85E8CD2F8DD61DA00830312C3D69744A3BB1F429FF91A74C32F48F6AE48D45379070FC3BB69A07E70910001006FF56C472AC1680EE1DCF6F4D99A245A18231819D90B25A5540EAC99C946E87A4FC59BDCDE6ECACFF819E5A7004DBD10AF7D5BD702FA0DFC35D8E8C06BAE975C1E928D31646FD20C21E425848FD112021D11E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 + +count = 77 +seed = D08A139CC7147ECAF4B1D1E434EB2EFA2B2607B0033D8BA989133E496DC9F3654944C7AF91CBB79866443E8C4E8217ED +mlen = 2574 +msg = 34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA +pk = A92FA1A950E0BE849F38346363A6A56AFE50111845AB15F4C17461ADF373220159F46CC984C502023EB1DDEA3295F394C3043033FED5E9DFFD8D3616B61E6D0404 +sk = A92FA1A950E0BE849F38346363A6A56AFE50111845AB15F4C17461ADF373220159F46CC984C502023EB1DDEA3295F394C3043033FED5E9DFFD8D3616B61E6D040493F5053FA67C7415405B85083A84D5CEFA000000000000000000000000000000EE857BF2F8D9FB98B06DBB972ED509870FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFC93F1296806465F022D29EA190FD8AD066FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000A30E97D329654F5ED8A11902167EC0C0F3E3F5697F7FD23685C8E0B2FC807700B6C0F2F17FEA9B81999FA1D8962C021FF9D8CF8A966D09956CF6075E82A25600F4657847618C123B2A9FC5D95A4E83F9DA515675D064B650853393B435956F0019AA806E88F8B9E6EC6550CDD8115AE879E5E340000B7A980BAF4ACCB06E9A00 +smlen = 2722 +sm = 28DEB0B7CB0143DC87F7D77D7FCD39C3321F2D1E5EF2CB6F810A6F449FB5C3014443288F01D5609962ED4E3B9EF56B6AD3DC09829A11D63B054D02AC0032AC030000C7B00B47CC2A63C84C6C2F891E63DE644FE4039E0983F7F49A693FD6DDDD922133DF4719094AEDEDB1D2FCB8D678232A2445C96DC4340CA8A67980344EB29B1463E1CC8CF65D546F29097AF66DC81A02190634FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA + +count = 78 +seed = A315BCF0E6835892ADFA07C034BFCD39F80B62925A95490B20170BD29378E11559C7F1CD296377FF1E01284EC727FFCD +mlen = 2607 +msg = 96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 +pk = 8687257A460EE6DD5B6EB10AA641E64F11E408C101F4B5CC56FBF84C62B3AA02C9A50D4C22321CE5B96D38B41E44D21AB8B15886B78ADC0EAA65DFD17789E10002 +sk = 8687257A460EE6DD5B6EB10AA641E64F11E408C101F4B5CC56FBF84C62B3AA02C9A50D4C22321CE5B96D38B41E44D21AB8B15886B78ADC0EAA65DFD17789E10002237EB14FCFCDC109CCD6FF58352230BEAD0100000000000000000000000000003285B861EBFDFEFD2DF62A7C80EE5346D2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF71109B4C863FBB8CB59C28E426B0C41808FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000D87B69564EF8E998D9B379E1DBCC995029F3163FDA37F34ED6A12BA1A942300B90495581FFE71EE4F45D34036C1FF9DA84D0A037849EC59C6CACDECA4AD2F00DEF04F842A3174AF9E46926285A5643AEB9DF08D9D2F9A3651091975C33040005F06490B23758E6F60380A20643407C964B5ACEA690E10CBBA4B5876BBFB2D00 +smlen = 2755 +sm = 2CDA52501D1039A2E6D3D092FD883B30C0322033FE43DC838A78E5D925CA7301D9D965CD5802B2CD0C831089DA6EA69BD9D452AF0636AC013365F57E1BAE280300010BD140946E682A9ADD6F89A301C7D9A0E72B5B5BD524921BBA05F127ED626C5CAC6B3B2F209ADF2EB04CFB01CBC91BD196F9A1DE2278B39975F8C5F152F5568B9348752CC61ADD4FBCFBC0FAF427B303020A96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 + +count = 79 +seed = 8B47E0EBE786914C9A52D547106CEB4A3D3DE938B3244E02E5F9660954C4C95A23F2476FCCB487673AAD0513820905DF +mlen = 2640 +msg = 2447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC +pk = F2854FEC15A978AB6EFD84EC091BA4004D97D507452E6EDD8581C9A52B9AC90106210578E81E852C474DBEE2CCCB2BF50B8CF9F7B22A80179B96DE6194A20C010B +sk = F2854FEC15A978AB6EFD84EC091BA4004D97D507452E6EDD8581C9A52B9AC90106210578E81E852C474DBEE2CCCB2BF50B8CF9F7B22A80179B96DE6194A20C010B7D5D5F1241BC1218D8B88FF047F1DCEEB1010000000000000000000000000000B22660D7728F6839F507229B506D62937DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8BB4ABEC9CEB807F96A3302FF752F33B37FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000001B5793AC5C2C6208911512C16025AF7BC008B60CEA161BB27373A4FC00D3D000F9DCA41829C697B738EC20F22409AC6AB45C0C31951D1A57D590ADAA38952D00806AEEFB9639C221AAFC65E30C7A207AF4A81E3DC522348C02C2EEC6199D48008D4A35C508C17CA9B364B305C1F6EA2C77B1285A13080EF9882A5405EB0CBE00 +smlen = 2788 +sm = DB6D4520069A46BEC89ECD89430837FFE6A03AB81DE3953B5DBF1F7B55F255018DD2460B0AE5C691A537599B91386E5A97612EC4C0495D1427DFC814405A3604000191F11A4E5BC2B42DF6FFAD8A5F9AECFFFDBEC463043E2C35FA2380C8D2C317F91B3BBA5EE803A3709953E030BAF983E695CFCABD4448FB53BEF59A5F07E5DCFBB449508C43400A549639F45DD729790102022447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC + +count = 80 +seed = 07CD8F8AB7CD12EA7CC94103B8623D6F0FEA2BAFD2325BF6089DF5351BDBB9A94525C3C6B72D3820F2E4D5F9E7C849F8 +mlen = 2673 +msg = AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 +pk = BF2D01BCF11913810C69AB37FBBB14AA852342A04B4A3293E477EE13B8FACA00E0D83D7C8A0D02D9CA91C8D701020A16634BFCB41A1E9C90F80E8BF05E8DAC0304 +sk = BF2D01BCF11913810C69AB37FBBB14AA852342A04B4A3293E477EE13B8FACA00E0D83D7C8A0D02D9CA91C8D701020A16634BFCB41A1E9C90F80E8BF05E8DAC03045DC6BF3B90E4E8072AD0DB8AF89989EDA700000000000000000000000000000064B5D23C40B2DA85C4E7D12845CDD35DC0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9BE774B30A5022EB9A0E4745D51962ECEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000001A6FE66F0E29681A824536E854844F56214DEE6391DB3C632502E5A9921197008FC84F2325FB51FF83E1092425C767954EE0C96C6F9E6D555F2300ACD776E0008156B5FC1001F9A271266CEF849B89233B1CEF1982AFC6C30345D34A11F76000C257B559AF0838082CBBF9CC2A726C57C8FF4C8EBEAE1937A8E5FEACEC229800 +smlen = 2821 +sm = 489D2841DE72ABF74489EB7AD6F9DEABF29D13A447064F7AEC6954D73092E6019F17AA85C09CB47C79E3FA2482D764ABE76EB323A9414AC6A60C267479FC39000007C5E6BC05F65A7C291EBAD1D1B432492302DAA5031988F8E9D67FBD4F93F561334DDEDEF9B2C68228ED8100613F43C4D7527B55FA01772A440DC437A21335315CB2A46B8C17FCBAC86AE5BFBB95140E030404AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 + +count = 81 +seed = 3D598F7C498D8A1095C40945975380554BEF6142578638A7627E2C0A21C59C579F8E8CDA309348FC54C764C899FB93E9 +mlen = 2706 +msg = 63EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B +pk = 808C9A7F20062FBEB28D7F7F1962A7CD9F8D6D424FE85D485E44115627D109026BFE17167CA0CED9E2DD320228ABAAAB4F5B486B088631F0B7301591E951E40204 +sk = 808C9A7F20062FBEB28D7F7F1962A7CD9F8D6D424FE85D485E44115627D109026BFE17167CA0CED9E2DD320228ABAAAB4F5B486B088631F0B7301591E951E40204F1877D49FA3D7085A70AD51F1684A50AA7000000000000000000000000000000E4EE58E8CD04D03056691A0589A5AE0279FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB8526880DED1C3636CBC1D20E22165F03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000005DF61593A8C26008820DB5B24CA77AC8C59B8FB002BE77F8339BDE267CA59D005F9593B5CE25CC3E5F896407BDE5425F7309244340EC9D38F79D5F6CA92AB40054F562DCEA5F97287049B4C125387217198F4F5927535C4E55C339FD7643150099EAF0E40EABB7A3679F7DBA9826611D5A0984068A7474FED1C97BC8D25C6300 +smlen = 2854 +sm = 94DD05F069DD6E81DCCB6E1535E9C139429BD72B3CBA9AD44CB88ACFAD23EE008816C686A457FEA02C2F3F152A8108D9A6B31FD6DB565EDB8134375E7AF338040102151AA4E2910E741A8F21A2EA469B6E1F6EE0132F02F58BFE83483854A83F547EBDDB0E1FD00956B219CE3C2CBB892C0E1A0D45BB89F6279B3D517349E1EBDC100D37E6B0989B72A510D023047F616E010B1163EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B + +count = 82 +seed = 6CDB757AD36DF99E52F535C2680431D5FF36C812D8EA19399F666F2FDD66D3A842A7A5AE1038359AB618FA58A0A6E840 +mlen = 2739 +msg = 7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 +pk = 4ED4647F38F5FD07C424B96FE67803DD890DBEAA998A8AF49D01E0B63A60B400561A3C30E9DEC1D8162B88A11B3EDA95B63AD9E509293A2297F5E6BAD0D3920302 +sk = 4ED4647F38F5FD07C424B96FE67803DD890DBEAA998A8AF49D01E0B63A60B400561A3C30E9DEC1D8162B88A11B3EDA95B63AD9E509293A2297F5E6BAD0D3920302A1DC63ACCE836912FCD4288003D284322D020000000000000000000000000000B499B050308E946126B253BFFB67BFDC01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3C961BB2FC0E09E00042430DF95F8127EFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000BADF4A36AC239F6D5CB8007D938CC50FEE0FD9B4710CF1F7DD33D223BB0C880081A10409827422B45E1B080A05BCAF1FC4810889B00DB0C1B37DB80DA9CDDD00AD3E6F160EBDAF3075F760D24AA7782AA2EE6556CFE34EEB537191D5E6080400F9881E64101B1A9BC1DFD23699BDD3482B63E7BD08D4DC464DD8CE6241129800 +smlen = 2887 +sm = EE2E79ACA3009956B62859B0F6EB2D313BD7D2A44D003FE50A4DF69FB0FF5703CAAA3CEC67C85CE2DC617116A5C1161AD826748EACC766D895ED322C0C2681030001518F74BED5A867812AB2F62E5168E9BEAD61A6282F816B47D465A87E1BED7235660402FFBF63F9661BD1DD433ACE527FF8BE38A15AA49BD3B9CE1D27AD6576F7977B69A3D80E7DD038384634617B510311027785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 + +count = 83 +seed = A97269579EB70D268C58D94FF744329B197F722A8A407B788510DDCACA34C8CD4C72FFC14B76300C86AEA1E4CFA66BA4 +mlen = 2772 +msg = AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE +pk = F202A2B05E25230B0093C1213C54D4604CECBE30567A5D892341623E4788D401172F187BC1D70A1EFE66DFC120DFEB2C40A8F4666FA4338BE8D2F73DB153AD0106 +sk = F202A2B05E25230B0093C1213C54D4604CECBE30567A5D892341623E4788D401172F187BC1D70A1EFE66DFC120DFEB2C40A8F4666FA4338BE8D2F73DB153AD0106453656D73BDF52C4DAEB58896CB59223B5010000000000000000000000000000F600B0B64F3FFE2123A4C7BA943C772364FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B2B7C159A098BD0A4DDAE44DB1BD176B4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000002C6AA787782D560887D7521F0FB4FC8E70A8776790ED8D5477A36A5F31AD3001D0574F89F1EBD186B2A437D928C10E92AF0D16796C26C25B9A2B6B674DBDE004393782354D79A3304C48F48F97143F291E92A6BA76114DCC79BF5E8918FB000B0349912D0E27F9FDB757036502026FA3700DDF677AAACC55E4BD1716B283D00 +smlen = 2920 +sm = 7D712E4548D7D927CB42094AD15516803C00870ADEAE4CFA68568E1F8B562803DAA53B6A1C05180B6E8BBD9D606B089518CF2604E5DE2DD532A584AA6867000000005301B113FE595B2C51DA54C07EB74374678138378A75B30F0D9E1982C9C6191C03A71169D3EAB8435EF174A79F4881031E3B5BD2FCD6F08F8ED0082F40C226366B94697C490D7688AAB1696C8CA534020B02AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE + +count = 84 +seed = 483A81716F91A43ACA6764C4BD2A57C9156B762E9174EA49730A6BEB9CB19A0B3755E37BA47EC524BBE2FA25B9FEF687 +mlen = 2805 +msg = A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F +pk = 863BC9B538C2295400C7BFEC5432EC0A4C449C08DF996161B0324E3EC4F3FA022027539823B06DC9AA2E2189E126C162A7C3AEA82368588DCD8266E2A885600304 +sk = 863BC9B538C2295400C7BFEC5432EC0A4C449C08DF996161B0324E3EC4F3FA022027539823B06DC9AA2E2189E126C162A7C3AEA82368588DCD8266E2A8856003042BD68957510F685B8377C99D48BB2A9FF5010000000000000000000000000000FECA9BF283B246405FB866AAD1415EE9ECFCFFFFFFFFFFFFFFFFFFFFFFFFFFFF5192B2457F59F6B85D77E17DCDDFADCE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000976531E255566C1A3B711D94CD9F32FE7E52B9859E46B17249FCC330058F7900C5FE53A4DEC48DA7100274786266936AB2A12F9F92EFA8F891BBF9F94A163600A7EE92A99996B26179A599F411C7F9C02F6531A44924413CD3C93526895E3F00443E26A76D9D44BB9B25325C7217291146B1065D81F9F4C34BD488C915AC3700 +smlen = 2953 +sm = 8DAA77ED181B874C0C0FD6500A4E8A34CDFC8B1A64B4C7F5859092CCE1BFD1046E445C95B509D76A076EA3203BE31E3B1E812CF1BE9497A6C94EDF714F694B0300015A0AE11940E87532DC4256C6A35BAEC5D78DEAF0E0DB3B8CF1608CD744BC3D98A44C29D04E48C38A793CA24F6A6163CC297AA5B4EDECFA13B5C72A890B8942132B676C8DBF6DED0675F9CE041C4A3E02020BA7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F + +count = 85 +seed = 30F0E117513AAF27AB2516BCEADD1188B4BBDE76E57DFAF43CBF2D70723D941E8F875C5EBF02BD7D67AE81ABCC54440A +mlen = 2838 +msg = E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D +pk = E73F4490E6C2EA9BB46FC92E32E55F0038293861458255AC757D199BD2F30F046ECDB057F00B249C3EBB6148C14FBCD194EBBD74D0F45265C1313E2417948E0402 +sk = E73F4490E6C2EA9BB46FC92E32E55F0038293861458255AC757D199BD2F30F046ECDB057F00B249C3EBB6148C14FBCD194EBBD74D0F45265C1313E2417948E040203F2A87A118FB62F6F318E522923DD9EEC0000000000000000000000000000004EC199A945736382010FF8813560A78B57FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF95204403758BE8AD86F794A2A04B802099FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000003B1755EC379D42CB1E4823D333101109D65C2C34E92F5FD69EFE84DD2BA1840076E07B3D3E1A224B4BFA9E365C135F4794D78D7D2E8A974DCF541CDC15D75800F7D986C012AFCE079DB8523E50685F885864A8C658309C37C056666794149C007FFA444F1CBDF1319DBB85492BC2F655AD86195055F15E027AE181CA22CADA00 +smlen = 2986 +sm = 67C17359D492FB29E50CE8C30F75F488072ADFEB45B2EEB3D2661805254EB8025D765F00BB9858AD3538AF896AA54A8EC0FA8808BFAB285EDB65D8B40E18E80400006BD40021006E8FC29CA0F3F5ABA088306332D814A0D3DADE06DF42552AA36D1A130A4DB3EEB007C868D161589FCEDC6B48971365D29FFBD3424A7E97B4E79011F433117D4BA81A691A07FBDADA57F500110BE43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D + +count = 86 +seed = 070FFB907EE8AB7152A9D380DEA2C4C4796780FCFD80906C5E489B917A45D5E7EDFE6F37C4420E5480E8BB599FE36451 +mlen = 2871 +msg = C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 +pk = E057BCF63D1836DB43402BCCD8B4B35C762D953B65E251A6003A285AF5954F0248C7299B9BD8BB7CEFD6390D65616B726B169744E5772B21863F45EA356BCC0417 +sk = E057BCF63D1836DB43402BCCD8B4B35C762D953B65E251A6003A285AF5954F0248C7299B9BD8BB7CEFD6390D65616B726B169744E5772B21863F45EA356BCC0417275EF447059764DB5A23928A95650C74E9000000000000000000000000000000108167EA29C59D395CEE8708823ABA8CF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF570E4CCA828DB9F1BF6888DF1D510FFEC2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000EDA96F3F914DF2D5102A99B1D6E9C618C230E414C05F5BF25C9F754A8E3F9600A8156F032C2A4B215D68001FFB935309628CC073EF6725848072309DAC53EA00E116238DCECF3F25417029AD3C0783A7385EF7EAE7AB27EEE4E8EBB1B915B6001FD92DBFA9C6BC44E066EDA72684FAB3DD238BB3DC8C8A68FEC0AECF63A48D00 +smlen = 3019 +sm = 15EA7B1D8C03218628B900D8D7C8FBD7F90ACBC0E1A4B1A0192E54B0AA0DB802FAC37FCD1D450E1EECFBB503EE42AEF7C626AD532D120CDE5BC9D4DABF7DFC0300002BC1CD849994C134085DEA264CD9A3BC66F3F979414356ED1113CA28E7AB4D31F633E9D32284428BC0267A807799E34047078FF255304EEF2F8846CA4B30F0F277055EDE0502471A560CAB648971A6020B02C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 + +count = 87 +seed = EDBCC4F6AD0F30066947D678A368B960CCD164889D77730516B444ED2DF10B49C101902F5FA227377C3163A0045B34E4 +mlen = 2904 +msg = 836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD +pk = 4E9A65642E8E655EDF00F0EE8E89F1A3B5B21458B8ADB60168F6FCEFC3DF3E02F133D77A2B0DB58C0708BF24771C61D7419EF30EFFFF4D608618FBBCC048560202 +sk = 4E9A65642E8E655EDF00F0EE8E89F1A3B5B21458B8ADB60168F6FCEFC3DF3E02F133D77A2B0DB58C0708BF24771C61D7419EF30EFFFF4D608618FBBCC048560202A12E77A060DA00D8137B9FC0C45D0F3F2202000000000000000000000000000020986EEFC441896642134CAB31E44C7160FCFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F6F4AF8BA53F20F9C422BC7877D48166AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000023A20DDB380F88D77A565588AB5E09CEF7FC659790DB2EDA3A0060A9AB51C900D77773212BAF7158094F777BCA2BD4217851C51CCD0335B0D79D12E1CD0B6900C5847642405A8974118992B53B8EB4E22319FEE674E0E63BC8F7AD6C2AC2F900463C9847F83B210AB1BBB5C2479C12258734E3784ADC26DCEB3A29A8503DDD00 +smlen = 3052 +sm = B8D6E351991F17E1C25B25B87BC90FF60EAE1DD444850B1154B15F1EF1C24102FBD2D54CBF8AD0E30547178BC2A1476A26C8B817D06E4A87354B5B32720737020000DB28AC90AE9D5A6481BF68D13EFE57A12DD0E938AF620A79BD410FA21C5E549AEDD4412959653392A4E7A45B02A724F11E4BE5FB6E39C6B2D12531EDDC089798778DB8FF10F9B449B3398B82D15E9C000B0B836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD + +count = 88 +seed = DEEE61A2FAC04E4D6B7A250124DFD91518D9B90A71FA02665E3088760BF69CB3CD7B6977F860A7026819D178623C9676 +mlen = 2937 +msg = BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C +pk = 25B57092E9D331D0C4B1CDCC616352BBF09C1FAAE64AB509D19ACAC367D66403ED1C8CC393C85EB142B478DFA1BA4D627B486055418406D1D95DD495D60527010B +sk = 25B57092E9D331D0C4B1CDCC616352BBF09C1FAAE64AB509D19ACAC367D66403ED1C8CC393C85EB142B478DFA1BA4D627B486055418406D1D95DD495D60527010B775ED9FBE896D47DFC11555299A66FB99100000000000000000000000000000010AA28E2693CCA4D3BE0C7CA91E87D0B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8DC9B6117C91D70D7C55A46CCACC921F94FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000FE34AFC26C18D0CEFF026BD10E11F1A17A25178BB45B391014D3CDF10671E2001DFBA9B23ED8407F79DB6F616AD0BC3CD6A981C3BF9CB5AFDD6C6A3B21D92500F583239DF553EE0B8041909B2347A814A40D0F96575BAC5E31B2461113088E00E457F9EE39ADF570AEA5F127F22369F762C055417C3BECF9228D2C962F13A600 +smlen = 3085 +sm = 2C1D322D9229321A496B9CD74AACC63EF77CF736BBA9BDF06FEE5CE469749A0135810C48CDC7AF9EAB6A8ED745ED8E9351C568E0E03830DC641B757B3C645A0400001526A29902EC30FA320D71F903692794846CFC988CB9967C0C2913F7B63C45F6512E52D993847152E845572856056BC5D107B2F6C667B5A2FAA7C5C3A28C1CA023ABFA4202F8903A342782A237A43A010B0BBD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C + +count = 89 +seed = DAB6C05E29342106CC34769BF419ADCC88010C05B57E673A503E63AE7A4EE55B72AB2CA86C4EF57FC8C02D2E0C8694A1 +mlen = 2970 +msg = 4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D +pk = A8B39E50DA4B9C4F3CBF6E31CA8F8EAF88D98A6407E333B099B807BFCE22AF041AC69636F9A04548B3892C824265E6D48DA08C9B9EAE3ED4A16A3856D8CF5B030A +sk = A8B39E50DA4B9C4F3CBF6E31CA8F8EAF88D98A6407E333B099B807BFCE22AF041AC69636F9A04548B3892C824265E6D48DA08C9B9EAE3ED4A16A3856D8CF5B030A4FC369472242A02F9CE0602C372A400987010000000000000000000000000000EA194A1CD07F21A768A124FFF89821C55DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D708B59CCAC8993AC9CF96840467AD704FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000DB892A6A2A2B7BCEA9C223C38798EC499A35B2C8739DF40F58D145799914310000E1E9A8A7FC38A5C92456318C858C444243E3949C145B348E19EEA0C5ECDB00B8FA5A6D363C39CF556999962BB91B7C9B90A63BDE9EF2A16A780F51EFF80B0033FAD87ADFD46393FFA6A93B5946B4D0AA31D1921E12DF662AB27C2C9FDC8F00 +smlen = 3118 +sm = 734D622EFB49990B197ECE13EA33E4157E84B5CC58483996E84FFD00BC89CB0137946EDB39D92B2497B19D1C49C2B7A6C0EDACAF1CB5B5C0D72062E9CA2F8F040002E3AFCBB73A3690485843536A90FB4B930E3229A6A3D2515261198CA4873AF19083BB421E11CC131725C173D98383CB1DC24F5602FF62636B5699A70EAD96B49A625B345C540577F858179920790E470217114D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D + +count = 90 +seed = 0CAF47BD9AABD7D09FFAD404449BBAB2E1D48E80AC78550831A365BED8765420DBBE9A566EFDF20D4E5233D7848582E4 +mlen = 3003 +msg = E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 +pk = 860378DF0E0CEB89C7DCE504F7A11E5972C5FA2ACC2D1BD6CCC4E6E5A5A340008CA5263A93ED461B6845851484F191A6A58C28D5A299EE893CAD160EC60C9B0102 +sk = 860378DF0E0CEB89C7DCE504F7A11E5972C5FA2ACC2D1BD6CCC4E6E5A5A340008CA5263A93ED461B6845851484F191A6A58C28D5A299EE893CAD160EC60C9B01029D93605167B1BD075B35547BB328EEDB81030000000000000000000000000000904C5896C16D70F3688A81EB07489E9402FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFD748F5B2F7D392E506D63651796630B7AAF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000C59786EF654AC794BE0A69A9BA0DC0D2AAA49C8CFB5733A3B1FF663E9CA05900E7605EDC65F5F7610E8888C974F2E24AC4BF6C2705E1E2E91507FC18C3D52400FFA46C71CE142E403D0634DAD4B4CC2855DE037DF51531AD1AD029E2CD070A005EDC1FBB3AC215CF955E5551CDC521C8BBDE444407390EA92D03134043FE6800 +smlen = 3151 +sm = FB2E443082173DD5B782D5FF53F17802F8B80B835D6D8BE6553E8162F3FA7603B8A3F6976FF5162905D3674DDEB60C1A287AE398803ECB62A3089356B91DDF000003771411342F307CEB55D932FB91833A0221EEC9DAF2646220ABCA4BD907B70B833A5719A963170CF6881FD05D23301B435E1ECE53D349F61495DDFDF2050EAFE0738D11993B5128BDF953C789E17E76011111E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 + +count = 91 +seed = 9564E88F336C091EAD50C893F3EAA8351FA388682F433F7A72A34731020B9C96DFCF75EF5EAE47E12684AFA51EFB49B7 +mlen = 3036 +msg = 2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 +pk = 7F704FA71FBD4A365415A5C7EB450845C30E43AE685528C5B5C254DA4390C302ACD2AABCD39866FAD0B963DCAD24E00E016E23C7C62FD2F3461C112F1EDAE30202 +sk = 7F704FA71FBD4A365415A5C7EB450845C30E43AE685528C5B5C254DA4390C302ACD2AABCD39866FAD0B963DCAD24E00E016E23C7C62FD2F3461C112F1EDAE302020F0B71012E7DE3AD39F1324C1A34DD52620400000000000000000000000000002EF99BA69F71390145D688E1B3E39C84C0FBFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F772ED1018423731148DDFB5A18715220FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000007D400C60C56D5692FE4ED1D4AB5C9AD5D877A8ED25E7B01BBD6407E6500D8A00F6B730E80D985110FB273656BCA2BD2D7F44369AC9B4D9EDCA479B603B6045008A58700CB7FB9DF32249CDB9FD272675A5F1DB3235446A9D7E705DBC76111D00177D4D275DA1806A07A9952638F0715C6E1670516F241CAC3AA6BB4BF120C800 +smlen = 3184 +sm = 43F8D065EBC1AB8F4F94AE392C91023EF717290EA2A544370131700212B91204092F4068F99332CC52B110578190C124785704309DC8D90CD2A79AEDA79B2A0201005951E5E0FEF5AC9CB7E93EBD1CAE366B25A9BBA1E764876AC37A5257F08941371D6752DCC76623A9512634F00563E336BC506E88BF3FA96A8D21E3D13CFB8102F60DE6BF89AF1022CFBB291AF6FB75030B022601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 + +count = 92 +seed = 4D0788DE958A707899D5DCC02F756A10DEA2EFE0214F5E01B3281DF4E013CA75523ECEC64723D6C8BEC0B92C4F821D8F +mlen = 3069 +msg = 9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA +pk = 4B921C802BDC0C7BAC8A7B7A80100539B304F14478789C81A8971CF0A25DF703FF3D246DB58420338327746B60F5FE1ACBDD8247E03EB9F8787E11A759B899020B +sk = 4B921C802BDC0C7BAC8A7B7A80100539B304F14478789C81A8971CF0A25DF703FF3D246DB58420338327746B60F5FE1ACBDD8247E03EB9F8787E11A759B899020BA96E0BE0D88DBEF9093CC276ED042D80D8020000000000000000000000000000584DF93656B369F13AF8CEB83205F18873FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE3C086E1870E662404C47058862C174DFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000053B381D812E82CBDADD02A8F1BA7B52BA4F8DB251F8FB4A9540A76E4C8EF2400A6546F9364CCAACC1DA8A708032BF07EFD21244F97C7C52C25DFB2EEE0405E0056A4408031F1661D0C5E97DAFAC755196E299C7C38F80014C2F66CABEBFC48000DE084577007868F978F4845EC366CFCA8A5F90DACAC8AFE9F8609F2CAC75800 +smlen = 3217 +sm = FC620CFCF04D376A6F180A19A45E0217865C5FC882CFE4D2A39648E3CA0BB502BD4294946EFB1F315180CE726BA878DB1FBD8F7F8DA1C22A4E91F08B5A76F4040002B7ABADB07A5B5B3C0E747C5888ABDA22BBC68CCEF1C2510A3DED10AF00C09ABE84FFA931F0E148FC4EA5773F62D93E3ED05AF035035CBA2DFF140E88DC9F73AD9496570F0CD946A0EC84CEAC4A5EBC020B0C9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA + +count = 93 +seed = 55A9C7A0B49706090BC0702ECFC070AB060427FFC820C3FE05B499B59AEB125F2DB4787A5910B88C6F8FAF0A69BE0AE5 +mlen = 3102 +msg = 02C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 +pk = 1D16C25E40C7111DA010681E49E1CA3B20C01DE33DF1E6C77EF169AFF6129A01A85802ADBA4643E1D0359B0C0ECE90D202DFB58AE5B3792F8B67E0C8E884C5010B +sk = 1D16C25E40C7111DA010681E49E1CA3B20C01DE33DF1E6C77EF169AFF6129A01A85802ADBA4643E1D0359B0C0ECE90D202DFB58AE5B3792F8B67E0C8E884C5010B370F8A03B1FE8C3BBE3AA993A94968F31F020000000000000000000000000000B0EFC4F63E09689931A16CD2B9B4FB044BFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF2749D1F5B6042D294C34795F0CCCBDEB34FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000006940D27EB265EB47BA582ACEAF1E99508BD8183D50CB1841EEBA460F122D6D003961EC859F76627BCE74C8E20D2F43CE34363C680724FFE8BA2E67A12815E000855695F0E9485D46DE8B93A91825E215DF29DD0464608178E21ED8CA967D3600A89C66390C761B669FE4A5194DB3B30372515A9EEB6A19F450E492BC4EE96900 +smlen = 3250 +sm = 243E93E46E860FC0E42F7A2B7F5D332B1AE09018B2FD5EA34BACCCA2B5EEB7001002CD43DB58DDC1F7775B914C15EAFB00C56AB0596A519A6D0DA48281D40A04000112688CAAAD325F8D8FB699035F76A0C6555B2E6786E30B131E5EE21B92B1AAC24692AC1A19E884F47A72E0ED9A3726E09C58A3EED4D4DE3CD4BC7FECD047213E4881E40BE5895CA6F236A7BC76CEB702040402C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 + +count = 94 +seed = CEECCCD3F7BB922650E3F6E8F20C47AF17C1C1053EA8FE08226F167D67C3B0781BD774C4C7AAD23C6AB0B9F3E3F96F97 +mlen = 3135 +msg = E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 +pk = 9A65A181921D2AD95DCF0529944762EC23E5652F5307A3516DB8278CA03A6F041C8324CB1D535EBE9C6B0682EE89F018C03FC7B2F862BAF1CFA6BB9A09F74B0306 +sk = 9A65A181921D2AD95DCF0529944762EC23E5652F5307A3516DB8278CA03A6F041C8324CB1D535EBE9C6B0682EE89F018C03FC7B2F862BAF1CFA6BB9A09F74B03060751AC809CCEB4003D6C5AA13EF51E415D0100000000000000000000000000001A8763EF4F021F4473589F6BBA0B0FF901FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF1958DC0A92F2FD2B63AFFE32B46957BA39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000026F9FD65E0F5919DBE3814BB796E1F451C4E2BEE7604EAF4D9234862E5A851001117DB6282FC66065CC2CADCA9CA26C0901D50E2F956648E487058BB33663200556AC1C495A8928C2F9762E4AD7997CF69071C6DE083F56A320CD0684C4FA2005E93C78F4CE040973B4102655C9460D292EC8DFB8160D60ACDDC411A09C7E600 +smlen = 3283 +sm = B051F697EC09B228C8067D58B2D89DD60BA3092FB0D8C605AB39BD9A94DF070075EA1C717B80EF5F3D66B5359D5BE7D479F9753092C5492E5CC9B85EE049140400016DF5BE54DDEF13A170D992E2E603D3EFFBF3A7DA8C3F20927CB6D15ACAB2DBD8160CB79F76191307DE30871A44B4CE17E4CB993A54C52E32EB1C665C70F42B253C2D3D670C87EE4B9D7A9302D040E1010B02E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 + +count = 95 +seed = 2489C04BA57D149A60F446670C13C29998B52F3BAD548A751D7134B694DB25ABFA034FB4BA45E105AE27D575CBD02B99 +mlen = 3168 +msg = 1F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 +pk = B88AEE7553D16879D458530258756C11C21A933E64DE60215C650AD888152601353ED647C938F5E120D1911D26BDF5E92F860420AFC1303BCDF329FE7B2280040B +sk = B88AEE7553D16879D458530258756C11C21A933E64DE60215C650AD888152601353ED647C938F5E120D1911D26BDF5E92F860420AFC1303BCDF329FE7B2280040BD109EE819DACE9A0A2521E5D07E58F512C010000000000000000000000000000EE0A122FFAE6D5F9119D9BDA78E252912DFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B2D05873AE9B902F6288EEE2F69B9173CFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000002BA313FAEEAD3E5461EF362A64E8F324ED7217EDF53F959C88D216E330541E000648B32B70CC65D0CE511299E4FDF12569C2A30CF83AD0047784D0FB3CD82B00246BAA4F8BAE6017FFBC45CDD8C4E6D60E248F0FB4D6029046BA5856AB5D2A0031CA66126824C931080E7847D108F7CB1A0BC12223A589B6B03B1A5853E6C100 +smlen = 3316 +sm = B5E81ED5DE831457247DCDE788228CDE6E984C93B39145A7815A455DB48C5E00F0A4445E84F00BBA643DC293E4A19CD5F263BEC73310212E2D6ACF2B0C74090300002C73D1496B5E1C563455522D5F97C8520766413E88D928A35E82E9296A793BC0D1B234CC01D898310EC4CBF7E9294B414FE5032F3E6C8E680C39B13741FED8A08805D33AFDE92FE84C63798FF7E4C6020B041F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 + +count = 96 +seed = 26CF860726D4DFA38AE07399838BB336F1BEE59E9F23AE4C81E73D49964997EF21CB5F5412F9A70A1EC39FC6228C36CA +mlen = 3201 +msg = DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 +pk = 624909BA3AA3A59F0B7FDF7718047B7DB5CEB4FAD564ED4FE30CB1A6CE28AC04469795ABEBC765044ECA68AB5BF9F45759AA462108BB0E3CB87BF5B649FCEE0404 +sk = 624909BA3AA3A59F0B7FDF7718047B7DB5CEB4FAD564ED4FE30CB1A6CE28AC04469795ABEBC765044ECA68AB5BF9F45759AA462108BB0E3CB87BF5B649FCEE040441BE90EAEE57DB2B6409B8DD826A70366101000000000000000000000000000030109025B104576732841BD306B94C479AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23C57AB1116E8C48EEADDA9758FD34408CFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000033F7C9D1AD8FA1C411CA8896C166C30E762296E32C74896ED7A1D661587B630040AE1468A8867908CE5B13B4E4915E239856E449196B6CEC08ED44F37EF20C00E106DF03744BCC5AF0602902DC91CD78DE032AC4AA26459D0B063B7F951B7D0057FD279C179BB23EEB0CAC66394FA2AEB02321AEC3066CF4B7D5B2792B7C6E00 +smlen = 3349 +sm = F2880D4532B5839983397727C86E79A356ECF846037B92D045B38638F417190029F4CA25A14F78C595EAC9B38CCFC9C24941C728D57338638070EED33205A50200025F7B2815FEBD41EE5BA42F76E0625B52DB95812888A4B200B5BD5EAAA784573A05EF1B76FF0E34CFA846D7AA08DB899885D49993C0E2FF11346AC0190022FFE2DBF86041FB37D3F80FA83346821CD202020BDE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 + +count = 97 +seed = 13F1F446D9AA5AC853278BF74C9E6447A6CE4294C037867F43DF554370EE261D05C7260EEBF46D6694D0850B8343FBE5 +mlen = 3234 +msg = 525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B +pk = 60FFF89DD22626D2E1E03C33892EA62F996EEB46561F7E1496C3753EF882B10454AB98E909FF4814AC3EFF4AC40F590AED6C11688E0B867998F54E3CE4BA380004 +sk = 60FFF89DD22626D2E1E03C33892EA62F996EEB46561F7E1496C3753EF882B10454AB98E909FF4814AC3EFF4AC40F590AED6C11688E0B867998F54E3CE4BA38000479CC90CCF243C7EFFC33BC5EC0B422E7630300000000000000000000000000000A9ADD471EDADABB274B7F05578EF92D92FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D5F3A669E68EC45B1AFF3D9E63E4986CFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000085E4B0FC40BF3A3B1A3C77921F2D45771AAE6D293E305BD97B3C67405799E10051FEDE98460B03C3BFA3C0FA771DC37F9199FFC4CD4D0F12FDAD054FAD4C9B00AE35043DF66565D7E54B4EA33044329F73456E769A72E501FD0F8F72B6D72100DB1EBE798DA8ED2674B3BB95BD9872B90E22A42FD929B0DBD2E3728057923400 +smlen = 3382 +sm = 9F36C9C85DAEB04BFE5DE66D34FC96BC662B1DB9572A7A3DE3B6AD5150480E018613E3B31DBA764E0CDCC6E3DF9B2D0866E1820BE9AC3BECBD998C575D6CD200000201E5EC189C63E655FCC0AAC5EC8BEF99AF9AE4D1AE6F5100CD1477D29A8056B11D5DCD1FB213AFB092F4A381CA9D2C08DFDD81107AC3C995519C64F57FE1670742CBE45DE6B5447340F13F47267EDA031102525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B + +count = 98 +seed = 6F6E47E8336ADEE99B2C52CF2DC8D461E0A54C3DF2F08199A9F0816AF8455381054CE47A7766726D3AFC2E2F2BEAF8E8 +mlen = 3267 +msg = 00769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 +pk = 8F03ABE9D36B168AB16AD66C15BBD7FE02CDB0870A2547A0F28A29AF69911200895127182A8AE17E2131165A0C82482C9C62A6FA38407947B93C9BDED32AB90011 +sk = 8F03ABE9D36B168AB16AD66C15BBD7FE02CDB0870A2547A0F28A29AF69911200895127182A8AE17E2131165A0C82482C9C62A6FA38407947B93C9BDED32AB90011B917D7A27880170AC634D1AB5470EE92BF000000000000000000000000000000C85BD581CE2E4C70B2FF5D9699A94A41FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF337975EFECEB9C56DF5E3764B91E869D2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000002BD1883B56EEB8732C73B5E6FFCF46B132F039A31D0647C85B912E7487744700F6322402215696DC3DC4BBBD1924C67F241A96093AE2514EC372081D2E0EA700CDE475679EA02BB41BD41FA100E085F2AFA58CF0A53A4FF5F20DB778AF6516004F1FB2538B2C05E0EDF0F70698DE9F2F3103569AF0EA13DC274797CC0EAE0000 +smlen = 3415 +sm = 0E909DD003F571F2D04389B83DB2EEA57D651652EB7321C6F6122E4E126314049E5198B4D14A5E8EA24E5A1497FAFA917B436CF0DE7A92C0A6FAD778E5C9420200009AADBB5B4A7C78A33D655BD4E3ABC4BA591671455BEE81192A64EF90C4A7D8D721104A659AEA3CA3FDA4A7BD12625B16F77F55FA62E733C8F6073285B2D2B630FB12BFD3850E3EE24E4E0670382E17000B1700769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 + +count = 99 +seed = CB2E6226615393FC3BD4AB3A412AAA030AAD40E8648EE6B56D2C1591D8B97915D88F2D22F7221377B4B04CF2AE9ECC4E +mlen = 3300 +msg = D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C +pk = AEE7A3BCB9BFDE8D559B028389ABFCAE3A6EE8772B23D30A744290C52686D801651DBBAE757C6998DA21786936DB9A0E50804EAF749BF18802EBB0B052CC0F0311 +sk = AEE7A3BCB9BFDE8D559B028389ABFCAE3A6EE8772B23D30A744290C52686D801651DBBAE757C6998DA21786936DB9A0E50804EAF749BF18802EBB0B052CC0F03112767106192888ED378E9CBA1374BD8427E04000000000000000000000000000004A6CDDA4122E39D0941BCBBB5E267651DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9154E840D72E512EAD75EF13E70610069FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000244C8DEAA8980F2ABF5812FE730C559F2AE0521BF315BEF7B7FDC731FF728D00D9728D8A91D1D8BF818A779CAEC4A9CFADAFC8C3387F257316A41525CD89900065B7AA6170B77C796FB727B81369C268B4B5F0F5302F618001F77BFA01511D00DC7F4A62E86B71B9F2A25F008F9193DDAA564D88DE39CF6F5478000F50663100 +smlen = 3448 +sm = 48D53AACF3227B4F92ECC9B6B9B5E069937AC61BD84AF6488A357CE6D4A1A1010F08AB4373D63513C9C19D7174954F856151814A344098998AD3B0AC69CB8E00000025E4A5C4801D2BC437F96ABBEB2F12A9E50A8ACA6D9948C65F24D920DEAA83F67793AD3D0F676604427F52F89118A0F17AB38194079FE3CFBB51058C3DFE7421DDA8A63C51E24A64AFAE912D248997001717D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C + diff --git a/KAT/PQCsignKAT_1509_lvl5.req b/KAT/PQCsignKAT_529_SQIsign_lvl3.req similarity index 100% rename from KAT/PQCsignKAT_1509_lvl5.req rename to KAT/PQCsignKAT_529_SQIsign_lvl3.req diff --git a/KAT/PQCsignKAT_529_SQIsign_lvl3.rsp b/KAT/PQCsignKAT_529_SQIsign_lvl3.rsp new file mode 100644 index 0000000..38b798b --- /dev/null +++ b/KAT/PQCsignKAT_529_SQIsign_lvl3.rsp @@ -0,0 +1,902 @@ +# SQIsign_lvl3 + +count = 0 +seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 +mlen = 33 +msg = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 +pk = C32377D6F6D70729884A7F6877EF4791E35D21F751A3E96DE23F9A7A3C01BCD8A5F146DC19E4E2AC63007457F97D8A40EE84AEE7564CA9A7FBE6200FD3E5E55901BFC60EB25C50D39F5C91C96510556BAA22028DF76360841721A601D65E8D0F06 +sk = C32377D6F6D70729884A7F6877EF4791E35D21F751A3E96DE23F9A7A3C01BCD8A5F146DC19E4E2AC63007457F97D8A40EE84AEE7564CA9A7FBE6200FD3E5E55901BFC60EB25C50D39F5C91C96510556BAA22028DF76360841721A601D65E8D0F06755AF9F356EEDC7F5AAF658B344692E740BB502077959C2F80140000000000000000000000000000000000000000000000B258183AD021B2AF6F79737F5918EF05D460BFC703C57661DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83FC10C362468FD443EA1D38DDC8C7523DB5AA73159724643DF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C1A4F65C7D62BDCAC3268EB598C5DDA0D27F4FB47D2181541CE8B06F09CFB70FB051CDE52F16DF4A681409AC19D649006DE2760B3179E8F5C52695A675C80484137A068A41376909D6D20F5ACF3A90B0497BD68B473E6C72CD2E60EAF4B35500665532FA5AD8B4863248315C3377EAFF3E18B5681376AC456F215F46F7A61875AE91861DC893CA87C63E9FB4145E1200A9D47BB166EBF96F7CE7C2062040C8BB05FA319F925992D0B99C77101B4C6A33D521842579A9138D7038D6F8CB21D600 +smlen = 257 +sm = 0868CFBF275B8E7B19BF597D658D62CC913B9B2933E30A297288FBE687F6F6B8AC8AF7AA007F191386BB1A203CDDBC2BDB42792D05DA69A4507073D12B0BDC47E2B36BC4BA45C68791918281E578F2DC14294504726DCD4CA4C4565FBB89A12800048C7B84746A2CBD8247248E248B70B51AE91994957857692A028D8F5CABABFC91E4BF1C5D350219A0189C57DE4A7710D29E0364C79B2188449EC0397359430D594C7B5980CC67551933A902D3C11F0FBD6DC39711D3E1F501159EE7FB85CE81B4CE24E1016006567DF469315D513E73F69F6301664E6449AF9DCEB4000D15D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 + +count = 1 +seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 +mlen = 66 +msg = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 +pk = 92D7F219CA4D00DB42C9AB761DF9970AB2C2AF76FA3E8DC7ADA29D2E32D773F9A9BFA8D53CF280247E51FFEB39D8F30C214B343A387BD64F1FA87541F6B6ED565266C207E9EE0672D56891C1C321A0D19858D1A26DD7DBF783FABF3A8C20ED1015 +sk = 92D7F219CA4D00DB42C9AB761DF9970AB2C2AF76FA3E8DC7ADA29D2E32D773F9A9BFA8D53CF280247E51FFEB39D8F30C214B343A387BD64F1FA87541F6B6ED565266C207E9EE0672D56891C1C321A0D19858D1A26DD7DBF783FABF3A8C20ED101503405AFDEBDAC1CD023E5B6DCF13C3DC2522AD66ABC1F37C5201000000000000000000000000000000000000000000003821AF9ADE7BCD64DBDB81B9C8333167874A4746F4EE5D976EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85D84AAC1377426EDE816859D5DD53687808A5B9BEBDACB7E8FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001A1EFA4CD120AD09B4FE0D5C0B04882DBCA66878C4FB8D7C8BA33FD68B7B1941977D336B74229952ABD7D950A499AF00F55AA74551DE2FB2F0B5527BD4466E0C175376DD2AACD8D4AC736D245966990EC6E2CAB4AABC724A106CBFC968716900F51664293DCF53AFEC239FAEA2E0554BFFA747DB718B17430BD739036BBC03765140A56A35FD66E547B40F94C45D5300C7C1356794897BEBBE56C62A3C65FDBC4AD3CC6CC9DE81C4FDA0FDDFB7A4FCED9ECCD6C912D338872CF42DE926E41E00 +smlen = 290 +sm = 2F467E3147AB46603FBD1B6D68C127AFABA0C7BA7C0E18B4E346D97D4B4447F44F9A628F30406C3BB1EE0E9F2E20A7222671ABE5A235F034DBDC1E6F3CD713244BC9E89C62F42A385C14CCD154BB8A4CCBC4171278356B86BA09922152C7BF290002E5596944226870DF7CD61D03524B4627C6FEDCB1972744C602B42537F4F5547B5C193767C3454C26C4FED3D36B259760E40130FD3F0DC49D7E21E1FBF4DC676920D5FF9E280919CE345E010C7EC81211B3956A64DABFB139E2373B93004885EFDE20780336DB2295D8B5B8394958127E14AAF887CAC09F7EFFA35F000404225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 + +count = 2 +seed = BFF58FDA9DB4C2D8BD02E4647868D4A2FA12500A65CA4C9F918B505707FA775951018D9149C97D443EA16B07DD68435B +mlen = 99 +msg = 2B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF +pk = EB728CE5E8A421F40BFE8880ECAB2A240EE04F7A225E59B71C4F7FD7A454958E3B0BD76B85F77FF8105B9AF50C4C0D19DA1DA62884F73F7F594DC20F645EBD98EE6DFDB697E78725C1BD9DB18B1CFE3800390F5D36E0DAEB99B294695C23202B08 +sk = EB728CE5E8A421F40BFE8880ECAB2A240EE04F7A225E59B71C4F7FD7A454958E3B0BD76B85F77FF8105B9AF50C4C0D19DA1DA62884F73F7F594DC20F645EBD98EE6DFDB697E78725C1BD9DB18B1CFE3800390F5D36E0DAEB99B294695C23202B08E5D2F1C0C7E4CA300855E18253F1BF1D74795592D535296C1A07000000000000000000000000000000000000000000002894D4595C2EDC5A0B8A99A23774C2ADC369530D651A626AB4F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1D69C0B415F7C67B4C8C9EA057C62E8170F4D0A5E697183C2F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032C47FF370C8C586AF8AA849E646DAF48A62910F1D55D733F9AF821B4BED97687188EBB1D357DA5481FF4299FFCA4A00E72559B20DB9281A619D75954B911C6B744A7096FEA4F8939B1539AD3C9B788666FFD5EEE1C2492F16ED4B1B2F34CB00555E763D8BE9A67F776FBFC318ADA079B71F2361935BFF5A2E45276971976B4A48C85FBBE5911D80540326E613A7C2007DF33DA935E71A797D66BE74C55005D8826ADDA1AD3C82816AB329E2F26FE554DB2621BD31A5CAEF8F2131DB4E99FD00 +smlen = 323 +sm = DA3AF5395AD7BBB673824E96917EA1C19B670F7D0739B34631CC9DC5EB02F5B1128F8C53AF12527B9CC4E117BCA0AF20172CB6628C16EA99D3E142307A5B7BB739E00ABE6E491ED3CCCF5D7669A096758E42227696193CE199B835A9131AC43C0101B458A1078AF34EEA2AC093FEC66718D06774C5E0020EEE3B00E7E9C2BC0854B1DC524D30043807E4DE36287FBFAB91E611013ECB989371B91F930B454238BB18DAB6294A29A84D3E22BE00E67C853B1B23DB69186B09EF2A85F127C09A08663887A436003A3253BCDBCACC23C3E0C5792261181DB808303B1B4A750006022B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF + +count = 3 +seed = 58C094D217BC13EDFDBEA57EDBF3A536F8F69FED1D54648CE3D0CCB4847A5C9917C2E2BC4D5F620E937F0D329FCF8A16 +mlen = 132 +msg = 2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE +pk = 3DDE0BC396AE6A0A09E59118F81DB9DF8D501F98B8227C210E8AAB1BDBB9AD56314DDD76153D409AFB9F2D47D0981231A41758BF4B2BE0F49DA3FD4C5EB7F28A1E9D3F3A04D41DBEB65658D035EEFA1857CF72B06F99ECF62253C4BD72B5712B0D +sk = 3DDE0BC396AE6A0A09E59118F81DB9DF8D501F98B8227C210E8AAB1BDBB9AD56314DDD76153D409AFB9F2D47D0981231A41758BF4B2BE0F49DA3FD4C5EB7F28A1E9D3F3A04D41DBEB65658D035EEFA1857CF72B06F99ECF62253C4BD72B5712B0D593951DBE33DAFB215345C6D6B21E857F95E8D2F70D19BCBA004000000000000000000000000000000000000000000009A207CE5C0EF8032B9128969F3C0C906758DA55D03755637C5FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B0A1BE43DEEC9962F66BB1BBB102D8A536BE1984B6BB9528FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000855CE1B5588C36F2848A51652AB2578B48492F80FFB18396661E65D053FF6A63FA81E5F3F56B868FA3512ADCF5E115007735526D362348146F148B1D761E8B5D3F19284E5F1B0BC73E881EFEC75E225FBF39822A94F9B96363BD67470BB80D0002BF74B276618CD140923AF83C308EE0DBB6CC3CA2829E24D96AC6C85DA4392932104EA0AD34A9F7E20C7642EAE12400B5B8C70B87707929DF3636F016CD73DBD0DC6A0067694E408D5419391117D871FEEC0FE1956BFDA9807C85E31EF6E100 +smlen = 356 +sm = 9697443B688A2D4D782AAABA7574215F7B002F56961F186FE600FAB7F10B4FCB1F43BCF1A1FA42DD9492B6CB58B6B80D3C8EACD42EB7C93FCB7D87396BBAD6D20D1010DC0B48F38C5D5AADA5972ABDDAE893373C9276E2904F51F2C43CD6C01F00022DFE0E85BF0A0D092CCD56A76EA925B9156813B20413F0E3015BBFF0DBC971BC89E980E2D46C6DB622F104711C8D4D86C7009812991C904A55542A761E2EFFB3297F9CD6B31E80942F270174E631F8F13C597CED157E9764B0FC066FD0071A5C58DB4101A2B173FEECD5EB599A5015129900EEDCA285AD5DFD987000170D2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE + +count = 4 +seed = F1902A7815F37BC7F5802D8CBCE5B48D82EB85691718062BFB84D8C06AA41D6E9039B0A107245DAFA4EC109A57332914 +mlen = 165 +msg = 1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 +pk = F5E50CB53363976CEB633E49C7EFAB26AD1BAB13E2B678AADE4F20692C9D37075E3CD3ED463949811257AB4DD36BEB3DA475DAC1D2BD235DBF8253719600B769B7B0C54F7FCDDE8C7218F082CF5430F9E782629973E4BA480A2291D62913110208 +sk = F5E50CB53363976CEB633E49C7EFAB26AD1BAB13E2B678AADE4F20692C9D37075E3CD3ED463949811257AB4DD36BEB3DA475DAC1D2BD235DBF8253719600B769B7B0C54F7FCDDE8C7218F082CF5430F9E782629973E4BA480A2291D629131102083F0905C9CDAD1120E1C372B508B7523E0F16C416E2E29377F1020000000000000000000000000000000000000000000008D99B1F4D108E0363C02CBC6CA8B7DE3BFD21CC683C0712D4FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA82AEF5478586D85E58BCC0DCD6D454E8467CF6BD1C01E75FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AF7D57356E67C52A3E85C335FD937487B4EB1F5D37DFBA3358264C03E0624CFED4BE82067237D3DD9B68D38F71D09C00AA3F015B7432141989A60ED5621610C25851E48CA3D17A37435703C0691E19E2C1EF02E81BDBBF1AC03325540327660082780823F679D20C309A84B8254D69CFBA2BE3CF09EAE4FBCAD7F5C4F3829F4C826D05BFF695398DC9BF29287BD905009BED949AD66E44694C66A79A234CA9568196B918960EA0F13116BC4E7619074226AF5531DBBB81A657DC68387069D000 +smlen = 389 +sm = 6285D7BF636914656AC4E9CCB92B0AF197C87F97B29E92AC08030970B13C86BBDAEF9FE677B22B3072768ECC99D2490232CE57E3C229DDE967E241DD53D6F69DBF0C3AEEF510A75C46F95ACCDD2715BC61FBB40905B9F99D1C8ABC65B085FB010000BAACA3F9E8B4829AF53D2BD47E62F16FECB2838F1E2639E2038B25DE72576ACC19BC4A78B255B217E551DC1E344F6DD16802BD2D74E37DFC542FFA658EF4193E6C1778351BFE1C2DCCE000B31DA58478BD4DEE10E99C430C66FAF1A6C834418289BE3601377D94BB978B30E85EF6F2F88FB9B2932B2F389A686FFD000D1D1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 + +count = 5 +seed = 75224ECC026C18159FF92256844D0ADF953F0A4DD8D74D4EBF1DC5EE8F5630B011A447FD4DC34A2404D620CA0E1F273E +mlen = 198 +msg = DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD +pk = 60F8C71D573B7A2B851EFD256AD59C44A5C19A3D80B5120DF106BAA913D40FFE015F81343C047393E67CAAA9EE2D292EA5EEDB63D8A496B624656750243C281592E8C00DAE0DC5922D53572FEA9CAF477AF7DF768BC58DEDDA173ADEC4BE4A1C04 +sk = 60F8C71D573B7A2B851EFD256AD59C44A5C19A3D80B5120DF106BAA913D40FFE015F81343C047393E67CAAA9EE2D292EA5EEDB63D8A496B624656750243C281592E8C00DAE0DC5922D53572FEA9CAF477AF7DF768BC58DEDDA173ADEC4BE4A1C043741FB3FCFDD90F6BF97EE2CA065365C9600A5C7A1F7F15D6F080000000000000000000000000000000000000000000002A8776A26EDEB064A1C3A0007BB791C83E2FE5132F9A1A17AF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD522CA4541B67A15CCD0BB0B3C59875AB845D7B0185AD5398BF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000859B2F7F029406BAB47706ED873FFF44A89EB2098D522D5499A8C400A60CAAA0E89733400297FDA1A22BB05DF3C984002B9A400FFB2A9EB48D3F7D6D5BDC5BBAB51271DDC2A070B5F6B17E9497DD79B6DD83BB169D80F16F54DCA4C4930FCD001CF01749C96DCF0803666B3302B3A686B55DA5CBDEBD99574D2169ED2837CBF2E5147C42A3043A08D2892FFF2466E90075FCE1FD93591C59FF7C55983FE6F5D73527AE3CD051330F16F6FEFE7F4C8CDD921E740C1EDA104A9532531090B5DB00 +smlen = 422 +sm = CDD1E86D4BDF2A004D3A43186691BCFEBD1D7518E6AF0B8A7EC1C699B612B6B0D9E7F715D2E8172D9827EA584BA76335FF89D4F0FB12D321915B5EFCA3EB52F89B0F48EBE8D962ECEE3FA1A78A089CC9B48E50EAEFA1230A71F10D5DF075EB3E0100DBBD656DEC7760B7D680FD0B9A5E11F5F85CEF90248AAECD00C97F47EDC6156DC6F70881D51AB154CF91D3D51E223C37EB01F27B59AE0D426D4D625412A82D5E39BF875F287BEBD14716002989E8CD0B79506380A95734433FECEFCC516CE14F50AC9901AA3EF8A6C414ED33A75AB7CA16BDDE2AF23FAA06FFF0BE00020DDBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD + +count = 6 +seed = 447F03C8CD27EDAA1FA0436DA492812F57AC946479A9F1F90EC4F5E913A05F8AB0DD7645026A96510F6D40AF05D85B07 +mlen = 231 +msg = 0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B +pk = 562A17430AB81314909FF4BD52EE1553AB33D18C23EACE1B7A72D394C4A3CAA28CB8AAC90AF8919EE4BA093BED85F808F7DB46E28C274AEBB27B6291F931AFD9FCD88BD56F3C54DAF36A804FAA901AD70E6B53C814CDE4CAF15F859DE058EC2C04 +sk = 562A17430AB81314909FF4BD52EE1553AB33D18C23EACE1B7A72D394C4A3CAA28CB8AAC90AF8919EE4BA093BED85F808F7DB46E28C274AEBB27B6291F931AFD9FCD88BD56F3C54DAF36A804FAA901AD70E6B53C814CDE4CAF15F859DE058EC2C044D1E9FD20EFF42B79DE3049351C0D802D9E1F1F71A32D1BC260600000000000000000000000000000000000000000000D023A32C57F9BDB7AF3CB95DE8D64C09EE9E82415048B2A780F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81768876B9AD6F3CF2E839E9ED4EA5A61DD6F554A25FBC906DFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071E1EEAB98B1111DF64EC38D0B09AF8777916ADD47A1440E369EEE491318F27091AAC0E74B712ED82E7A494E9ED826002E10CCB70D5736349B2152EEA0AE22BEA506FCF77D076531E27B89FC9D70E3D51ED1CE1041C6A5D7D2EB0D31CD5BB6006427C5C26FD1EFEFC20D0D21762D54BA504ABBAD65D2FFA1D23C1030531C8FCD47FCB88E1B1F9969AC60C9431D77E10043907288A82410C0A3C87127D0DE72587BFB4C275EFC5696EE2A0AA5606B20ACFA45300F97600B54D9E9D133A09DC400 +smlen = 455 +sm = 524BF9849425B34C2A497F84E029D15B48EFCEAD80ECA9C921D0A79FE7980B5261EC41A1B40BFD13917324A744549211834C6857472A1DE068B8D2088C046767581B75A84EBCFEF97EC1AEE63D1A5385F469F7986A92F4BEE37FA90B80880D2A00008D77E48E69FFAA9D8E9AF2A0A71CA064F98F39C883D4FB56025F1DCB3A37079973EC274F077814C051150DCB5B5D643456002D0F3D8B8D816EFA6AEEF852715B9F86145EC17B3CC0C2FD0250AB7A775EA01EF9C20082548EDD5A3EEB4A636D2A581AF903F8D0632FDA84AF1D31F0D53789695E171F910F67CDDEFC000A0D0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B + +count = 7 +seed = 8C151C556DA912A82DEB32144C8A8C9090CFAF5C12AB822AC3C72618837A41C2453B715EEFF3724CAFE69B1ADCAE9DDA +mlen = 264 +msg = A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 +pk = 3EC6D2041D9DD9774298B6BAD696D2A8C6D5C21CF17928AE4E851D864DE11A0055EDF7215C419BB3419F4995C1A5683F0EFBB0BFD1CE620F59A5AD6BEA24EDAA8ED5A87A61FFF84E810DFA75CEE37C5BFDF658FAC1D50C0FAF10CC2785C52D0C04 +sk = 3EC6D2041D9DD9774298B6BAD696D2A8C6D5C21CF17928AE4E851D864DE11A0055EDF7215C419BB3419F4995C1A5683F0EFBB0BFD1CE620F59A5AD6BEA24EDAA8ED5A87A61FFF84E810DFA75CEE37C5BFDF658FAC1D50C0FAF10CC2785C52D0C04B17A4B80209E640E28BA35E171D33371971647327B5E9B87500400000000000000000000000000000000000000000000FCEC42091E9B3391B9EB431BF0F30800952379AA1A76180E30FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9448595BA87A5CA8626FB1D079C383458444B62C6256B6A0FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F39A0F8167745D0756E01674749AD83C2E0169806337280D245906F00335D8CE444AB89F599B4C10ED0BF8CE80441500EA05D41572749FC9E56A70684467619EBBEF021241C1FA6BEA0A6B9EA8CBEE08C26524F3A56BCF2AD1AE98BF1791CB00C2C28E37E0C5EF91B3FE12528E23BD4EA2019D00D01C9878DCD8AFFAFF79A90D096487DCBF31842FC9CA702961F842000B5E56BD6A304C45A5078A46D1027B36ACB57510F5BE1493142C06CF191446E1965B5B009FF80AB8F45A4F42FF390B00 +smlen = 488 +sm = ADC712A3D5BF350E13AEA655B9BF01D92472478B404A6F6071DDFA39CA584497C71E66F6C0F1AEEEA987E528E8BFAE31A413C5CBF98609A7BA3DFA199592D65D9517B50B12DFE71D72B1F4EEE7E6D2E54A4F3F0B0603C892F1D3132DEC2F3115000006E7DD9C150E201836B853F93DA71F5BF31E79902CD6C7B503A51D532DC9DE43B574C920A1887390C33F10F5CADB463F17035577BE9935F389AE9BD4DBC27903965CCC9721604DAD0FDE00426E5E365E03D4D1D559FAA7B06EEF679631BADB8770F798034F142E80C0719CD6575CD0A9742CF9F52E7A18C5B3C181000408A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 + +count = 8 +seed = 9B42F41492530EAC81992F17613EFDF155F407D7E67F18AE193EDCE714D65D1031E7AD10839AAB46D0850EAF5997AB4D +mlen = 297 +msg = 9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 +pk = CF617023C07FE87C73F88A258F218CB1C7A661FEF55788EB28CBC2DA0226FFCAB1A6DCEB73011455B9F6F2053227DD4064836DD9B1DD0561D75CB143D683BEABC113114B7714658FC0492806C38D56C365E5ED06B71D4B84A8F269467E0F2B250D +sk = CF617023C07FE87C73F88A258F218CB1C7A661FEF55788EB28CBC2DA0226FFCAB1A6DCEB73011455B9F6F2053227DD4064836DD9B1DD0561D75CB143D683BEABC113114B7714658FC0492806C38D56C365E5ED06B71D4B84A8F269467E0F2B250D9759403F047EB8DED0AEEB4D37F4153302D99916A5C5C1296505000000000000000000000000000000000000000000004833F6C1E2F729CB6DD5642651ECB4DB48C469A86918CB64EAFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35FA6043E915BF2596F12D12867465F09669CD93D3744E8E66F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000290A618A21C97D960DA2602700C41786D14071B7A7BD604F47B1C1E22F773782352E1D791ED80B5181BEDC905CCEF5002725AE2EF285431D78149CDBD658C1017055B797881D305FA1B2F0167F9E9BAB9A953EBDA1A7C9F71B8A89B6DA0A350034DAD23758B359BA839B21B23FA68BCAB82A150F1338E47E68CDADD7BE198453BA1748A84FF61F813ED147AF1907FC00EF158336655F4E83EBE599B84A790535477E698E97B3934535C30C7D6683074BF095D248A3BAF4B31B72BD93D4FD4E00 +smlen = 521 +sm = E10E935CBBC3B7B548B565F207F95DAAA655959A95F630360C17E6D56A61C29101DA728B6893C73D08791BF6AFADC4337BFBC64C52961CBC4CE4AEE971BF66F67940CD1E4D0B9B3EC67919C34D8C7B9E05B9ED89C257AB050C3FB61E60F16B1A010353BBB23066A3B7CB5DA03BB0FCE8E3F7DB8199FDF4BD507600A7068B42246AFB70CA57EB4BFD8740C8D13B7F81CCE089ED01EAC7F688A16490F8FCEE33BA88964A3219C8D394D4D0C46F00DA6729E38B28C4AAD3CE2EA547C859FB92A8ED6298F172CC010C97AE896DB94812A525829B56816ED27A7E7F67F58F1C00170D9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 + +count = 9 +seed = 11134936880F5A11ED3504CF7B273E55A351FCCB10943BBBD186623EE6C7A13A6565C3080D1F536BFDB018F99C4E46CD +mlen = 330 +msg = 0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 +pk = 4B483894AC1A2E7D881FF9D10B3A1D1F1AFE79587DA4032A766A16C4FC127EE80C078C3BEDE4A458256B7BA1D3368F060C01242DE6CF9A0425BB2837EC935A20D2222775180CB523BB3783E45ECC0BD828B43308B6B833F3E045A5CEFDB0AF391D +sk = 4B483894AC1A2E7D881FF9D10B3A1D1F1AFE79587DA4032A766A16C4FC127EE80C078C3BEDE4A458256B7BA1D3368F060C01242DE6CF9A0425BB2837EC935A20D2222775180CB523BB3783E45ECC0BD828B43308B6B833F3E045A5CEFDB0AF391D81C2A487D43715D5672D46CF59DACFC8D9E12AA80BDD9C99B50100000000000000000000000000000000000000000000FE29524F9F54FCBACBE3D4AFA5C90915F33F13DF67B9401F3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B44F5991BEB4C9E9B7F38E0DC29F2D3881E6A278CECEFCFC5FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005DB7D4A67E3BCCC1B069FB1F8077E2D12C423365CEBF4861AFFD25C2EDF83E53A26A974C3BA6F17687C46F7168B6950066400BB0A1E4DAEA83B6B6729889B61A925E689C15DEF2E01434BB991D1859E2213FAC4622D91F272118B28D632EC200BBCA4DDA5DCA1BAE522FE02AAF30D7588D4129A0348B96620C3AD02E9DBFBEF55A8A009A4FB9C79D08549BA20616310059B34ADDDC3856AC1E065F4A63BE2CF57BD02D2BB8F799D90FD43783E01588744E8DC8D963922D207A3D4B65D7FBDE00 +smlen = 554 +sm = E5A65B71E479CD4FAA8635ABC9CBDE691D2294DCC3CEE1AF86551E9097C92CFA76B19C67DB202C81624203075E7CDE13CD481115E7682D3F4A521CAE66323BA52F5B059B8F5A7782620519329094B2F500B03C9C86AE62F805D98E7CE3288F30020003901776E410CFE760AA7542DA9092AF4E5CE51BA2C277430057659F3282DB6E6EDDD4A63828C4121582CB0EF7F69A176800291B640D60298D558B0AF49DC9ED70CD654871D5A02E576000E08E58F2F58606BC94274922332B5133215E5E098AD9D331008966DB366B3B5044A338DD795282DC2586868D8FCD48CC0004150998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 + +count = 10 +seed = 98DDA6B97E89A479D5EE214E660DD6B5D8F6CC638A1CD4F462A0EC545F5B0B0A1A403AADF566F7B1C0C5FFCA29B36FCB +mlen = 363 +msg = 4CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C +pk = 1B3736DF3A9172651BBA16390DEC80616C6C505E1602E458381DC5D99771A4A107499EDCB518667A28CF95897BBF7439E30097D21A0C15338820A723284DBD02F2965F05DF07CE4943F2257D5F1C783FC86B9F46C7111CEDAE76F6842112F94002 +sk = 1B3736DF3A9172651BBA16390DEC80616C6C505E1602E458381DC5D99771A4A107499EDCB518667A28CF95897BBF7439E30097D21A0C15338820A723284DBD02F2965F05DF07CE4943F2257D5F1C783FC86B9F46C7111CEDAE76F6842112F9400231679BD44B645E2FBFE27009153B522530C8A3CAFE703413840500000000000000000000000000000000000000000000B07A1A89EB686B9AE7571F5498023A1AD0A5C878C5605A4746FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD87C0470D6783FF1DBE7C3AC64069ADB3B2EEA4E27CDB9624F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003163BEC69FB02E5E9CBF6532EC81C11CFC779F78463D27550DE581CBBE09F3B684C9B1B5B83D4988E9DD9F8CAD3E1300EC5FF3D69432D6B4AB171F7134E68EDB918DA51BF97B5B70EB034F197DE171BEC7A0AE2CEED145912B0F1640E0EA3000CE240E3AB002B4C1FCDB829846D7EFF89373540F12EE35DC4CE0D4862D6A5A310F6CB3064EF20CD297BB6A329D0C9A001D8197074298660C13655B79488444655732712BAEC17D992EF0779DF1A14BB0604D536383B8A62C201797B6E8A55B00 +smlen = 587 +sm = 4EC160AD70DE3447B0BC789FC17A8A1C4B5C979C6EACDCE99714BC462B07717F31263F9B3B2443BCCD1658580DBF440F4661B4C6BE24F8AFAC09660388140FD732D2343747146C8E38E4E7290FF3346339D7B59AA84A0373B5F3D4840BAFF6130001222F3CBB8FF808EE1447B1857FD4B97767FFEA5F4DA7765C03BD21B73704A4B3F699C86756AF0A06A346D63C4E952B00C0031CB506286487E108E3A2CC5C4155E7A4BD820CD5E618E30600C109AD48A29CD246D14E449EC2D93239E98E5C93755FD34203EA5235F1C1A186E0023BD4595B0B4F1789F6926A536B4B0015024CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C + +count = 11 +seed = D34A0AAD27ECAD31A5E08E9A2D7901A9B85F864D9B1B46F40CDCA0B3615B2CBA04EF82AD7BD8CF627C3E861477030BE2 +mlen = 396 +msg = 5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 +pk = 02A032C541158135EA66ADFBD2286C79E63674993AB9FA2E0FB81BECB3F1B79B05E730BD049209B4282F0DA484C63321ACEEC53559191F45DB70FE5DFA6D055EFF2B2E562E817D41D974A22D85CFA3802A14A21C4B8BBDA9F0F006CC6E559F1904 +sk = 02A032C541158135EA66ADFBD2286C79E63674993AB9FA2E0FB81BECB3F1B79B05E730BD049209B4282F0DA484C63321ACEEC53559191F45DB70FE5DFA6D055EFF2B2E562E817D41D974A22D85CFA3802A14A21C4B8BBDA9F0F006CC6E559F1904BB756D564364CAF76BCE52DFBD9AE468FAEB997A69C0C9783D04000000000000000000000000000000000000000000001A3FD6E90728288AA6F6BECA8680A6783DFDDA2D2465F7E381F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF916D415734A6792738DA82C7F8710262D044F1405BE2F61271FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073D3CA88818E1C236D6417582B6823A6E9D9A251D43B0693B0AE399F90E43574A80A648C3D6043461DD233FF0A200D004F57050C6F1A25F49218E021407A3EA08B8BFD8800332EE2F71887CD308C696F3AC3BA673C242234B7EC47C998E997007F5F508AEF7B6E07D9A3CF421E1D5009F32B7947EC3A87780E4F66AFD9C403E5242DD1B7562F6A145636F7C4E099B400FA58A168213E7C46EEB27D78DCE2C70DE1C811B15BC126A5DDC05F0B46E5E9DEF29521F5DBB8288E7185B08FB74C1100 +smlen = 620 +sm = C44125C56DC631BF6155F1AAD007B5FAC2CCD21A46F87A18AC258613194202FCEB9FC5CEBFE3A38FCAB87CB0970FFF0F4F2541B13EF7517D42FAD3E330318F1DB2F677D4FF78AA14789EC2E6ABCDC149185F083E73833C19266467088955522100004D3F8C89AB17D97B8FCA7E148A7B1F988D684FB52FF115BB037C9DD44A3116B13A23FACA914070B3BB9F39D81ED824608F03D8913309446AD6DD89CFE6065F9B8E4B1C03030B652BB32A030505FAF275F0CB3391B03DD0D2C54740E30075A239E307440137449B558EAF919BDED83440B6130D18F41E5FF554CD510015085C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 + +count = 12 +seed = 4FDA9FB6929E3F391901D69FA0AA2F25A9657D249A620F1B9E305A5965676BA76794CAD3355EB632579C3958CA7D443D +mlen = 429 +msg = 49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D +pk = E4237C37CA4D0E861F896779FF38F5813ECE17672ADBA120327737771E4A20AE93725789E3705F5F02AE1211CC05511D36E90A8F8A13697AAC566E7BA63258DFFA395E8A1A77A2999F675DF2F077DC50B1DAA5269ECBF2DFBD1E9BF2493CE70A0C +sk = E4237C37CA4D0E861F896779FF38F5813ECE17672ADBA120327737771E4A20AE93725789E3705F5F02AE1211CC05511D36E90A8F8A13697AAC566E7BA63258DFFA395E8A1A77A2999F675DF2F077DC50B1DAA5269ECBF2DFBD1E9BF2493CE70A0C1746A719BF5FF8CD8558D7D6A53435CC130FDAD74C9B35AA9A0300000000000000000000000000000000000000000000F6D37CDC93D8A0B6A0D8968B7609E86B63B2F5D12564B493D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5754A672019169699639ED8CB5C3EBA59E6A3D98CFD0CB7A15FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070FFC3FF83BBCCE62F38C922F9BCC3B39D24988B48A381AEF4CCFFBB31E91F7CFD1D1D4C4D460EA948282D7810E89E00C30C99530C0A3326BBBC373E10B93641C8181AB06816D2BEA5BE7B18392B4AE6BCAA2DD80CFA16A454F8655F0619F6003DA7009CCCC84710F611BCAAF29C868922DC8907ADEAAC85A7EE9A288A1F00C77634AC01A3DBFCC422063A7AC2B21700A11F6D2D529BF27454DF3D54AB5B70278BE5290EADD556A28DD4F72047B993EA15805E68777FB031F28DD00C97161B00 +smlen = 653 +sm = 057853C2DAC8A28B149DF69C10A86F0649F0FA929B1EB9364FAAA0857DFC63233A8B606FFD9B0F1DF635950D9727C417552B6888E26CA8381EFBD5E1DBAA5E34F9327B4006F02C9CC35A2B61973A93A2C98343531A0596284C095642DA99922E00003A953792FC90018C951B96A8F84AB399FC8976E466BD79C5012BBF345FC28DAC9488CE523FA90C31678F65757D79872BE4033BDA9131CC263CFE1A0F532DFF1C196B8BB4F7BC8DC8392602E5AC74F7EFDEDA850DDB0676406F87D27D0C5118EABBCED8039A9C601C4484978721FF02877CAF28A3935106E7A2F29E001D0D49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D + +count = 13 +seed = B0E6A23FAB10A7A333E3720BE00D31507917F39C5EFE1C98CA18BEB5C3101FB4479B478A1558C4C00398C55C9822FC44 +mlen = 462 +msg = 439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 +pk = 5C9DE8B722494787F7E689176A52C77248B0AB8580AFBCA92A81771337C05FB5F6003DC55D184000F815097D98EF6E0ABE8A60497FE21D3939B3B5D8792BB9B9CCEB28FFCB95878A10AFC4DBDED0634B2AAC9C71D58240C3A745B5E57FB9FA3917 +sk = 5C9DE8B722494787F7E689176A52C77248B0AB8580AFBCA92A81771337C05FB5F6003DC55D184000F815097D98EF6E0ABE8A60497FE21D3939B3B5D8792BB9B9CCEB28FFCB95878A10AFC4DBDED0634B2AAC9C71D58240C3A745B5E57FB9FA39171149B3CDDA03182F9B82E6C5B41440F5BC0454BA28E4654E400B000000000000000000000000000000000000000000001C33AA3CC71B4E2DD8B3DC282D5BF78DDD7B5FA69373F40C79EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF515A6EAF90710B02044E3DAAA062CC24E6462361CE580F600FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F72BDD1E39819FE21B4C9A60AADD5A9C48463823A6D5657834EE661027DAD9215E95B66ED9CB27737C81991FC77B200037C8C8DB4CFE902D3DEDC2B69132D7F88EC41A7E725DCD62B5147BAA968BE21D079F53782FF44F5BF70A6265D777DE0095AF40A03AA9C875E86BB0220659EA85C52304304DA3C830C5E8B62BC11B4484811A121644DFAD56C3A72F9D5DC32000B0F8ED4A203FBC7AA1C9A59F76F30C17F70A31A24B9268365F97E24A982F0DA331C25FC3A80B22B71E17A98D428B3C00 +smlen = 686 +sm = 7F97BAEA5A72F853D48626D3FCC3FB0E83ED1F1F5B8C9B62F3244C9960EDE5CB8E128690357ABAA025A874C0A81BB20C015FD96F22B3F430EC1B822016E8DB4D192B746050EBE3CB6DA10882C72C7B6049311AD06DEE493CEB5FEB49AD6661220001EAC3EDB0EE4A2F777B4AB542890D6913B2FE89E3DE63C338032117F3EB9BAC500ACFA64CF98D062C8542DC4E19534E2EF701DE9E0917242416BE29D3EA32BA73654DC4376C043EBA95C603B2769098218FCB704EAA84F10FCBC8E8892404FF0CF6E789037A3271BCB0829D221E9723F9FAECCD5FE05B3676156B84000215439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 + +count = 14 +seed = 0A98A2BD2B9FF42CFC18D3396BAD052E1D0F3372854DA69A318B142F7A1AAC609C3861263BD8FB0549DA7266784DB8B4 +mlen = 495 +msg = 8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A +pk = CB56804A36177A6F61D402AC1CB77EF1498E891D9D20EC63082846FEBDE86FCBA195BEE7682279F5EC9A913DDD8FD711630C4017EB831C900A26071818735464BEB333AE258B70B2BF35A7D53A37A3B3ABD142A5D9F91AC13DE15060439B55340D +sk = CB56804A36177A6F61D402AC1CB77EF1498E891D9D20EC63082846FEBDE86FCBA195BEE7682279F5EC9A913DDD8FD711630C4017EB831C900A26071818735464BEB333AE258B70B2BF35A7D53A37A3B3ABD142A5D9F91AC13DE15060439B55340D2D95C5BBEA3E1EB94F01241D4DA3EA5CA6810CA33EDD3389A60100000000000000000000000000000000000000000000D6632A1877E444179288D7240AB5472F3BE4D85A231C57D01EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F357E0AFB78508C9650BF7BB6F0C81F8F5001B7F1840F8258FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EBE49E1D350563206FE8462C653E636C039AD276D186CE8AEB40F84FB5D1583C717F2ECA5C8CC3B75F361472CE10890043679D625AF365FD1288DDF6BA6268649E21A04B5F4487050E2005E9957831EE61C5FC194E913812B8CA918F17896800846129D1BE21C99C1DADEE2387D3F9D1B37461B5D188A7B9C739BB1E452F6E4F42470B9493EEA5B42EFEBAD0E0069200598E15FB0B4334016B8A6A1CA1EFE327915CAB429FA1C988274CFE4B4073C783F63ACA5D36F1698BD6B667493FCB5000 +smlen = 719 +sm = 6F39BF6D31835EF378434866BF201D18DF3FF4B6FB1D36EB703EBD7A3EEC69DA35862C816A15A5B740C9D1AAC0666331F132B915445C5DF52721828669A470E7514355F3FA57881CE02B7957FA4273B56737EE0A08E7833EE34224CAF173A50E0100A1A50D07AE02BEC8C685EDA633E87664C3CF6F4DCD18813D0118557DAC0638A59A9756CCFE0D8AD6C1576394637710A882003F557DA30120CAFFD0CEFA281F31FCC8D7DDA9D8401331D9000F3907EE8221DA2F1563D0ED10FEC94DCCEA5CFA0AF26A4C01514F993DA902322305EE8369D7C66CE44ECA95A3D0D75900170D8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A + +count = 15 +seed = 9887F1FD854241A301EE0120645CD8E119B43F7BEE11F77A835E9ADF518C3A51CB76D86653FBE73AA716264C146797EE +mlen = 528 +msg = 9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 +pk = 3384239526C3968C4E8576DE55CF839990237EE27A99E8FA70401412B80B4BC27616081303F3340799F94E032D8042026F0C24E72B1196A8D29956A91FE62C401C9B231C9EBAC3A9F25764E47C3177CF3738F862620D855AA6CF7B1BB2970F3902 +sk = 3384239526C3968C4E8576DE55CF839990237EE27A99E8FA70401412B80B4BC27616081303F3340799F94E032D8042026F0C24E72B1196A8D29956A91FE62C401C9B231C9EBAC3A9F25764E47C3177CF3738F862620D855AA6CF7B1BB2970F3902E597B8C6BA0EF90ABF81F762237E16F477E9433D6A8C180F51040000000000000000000000000000000000000000000014FC7FB55DD2A1937F1A8ED9E1484D03FD0863E85B6CD75754F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55047C8B0877DA468A539AAECC087A74A899FA80CFF9B6AFF9F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C9AA729933FC6681E19747DEE1B975B76094A0278AB21D8C63F709DAA1421A736986070201B33796F395FE8776594200B5D4A8AEDA12492A5411C00A15BF2244567E25843FF956DA9295EEFC6C2D6CC79E8FA7A08FF357A32C71B37F99216100BBB87F8013271B2533C03647563C2BB4E6EAE0D9AC6488E8E36EC2836990E3DC576DFB0F7A949911DB3408884FD42900663B3715359082B49646CEACF7B5EE151E5631F2DF322AF53B70D66207E6DC0A0164759A0E19AA917904A6CE096F1600 +smlen = 752 +sm = D77963FA0F53C6D12ADBD2AE53C856B5CD9B656CB6481E0ED7D64142EEE8E66936EED08C963B80F8676268555B0C45144345248143F9DA689E5BA1FE48AA10C0974D67B4D43A4B26F6FDE1BF30A691B4578109F6BAFAC37657E491828BD8BA060101B39015CA6FDB4266ACF2CF46AA84E18438271C6BBD0AA777002EEC373E5B56893D1180B44AF2CAC88F82A39DA977122D7A01DDC9FCAA1C204B095040894601E089C41960E93C0CCCA39E014C0738B6619AE6326620328836DB1350C08B486EEFC5510D003467402EE286BF37975B9A0A5EEEB71755B07C87C9C43F0015049B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 + +count = 16 +seed = 5B485527C3B9A5E5B7579950049CD357975D4BCFEF83FE33C087ACBFCC10A0BE4225E7F8A5F77203B5FC7C0B5FC0E78B +mlen = 561 +msg = 922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 +pk = B032AA05AAF1BA53EB1D501E32312AE779AE1CD3A93E4D56ABB7A29704FBC0014316B935B8F7736305296DAEF2C8C51B3D0B06F2BCAC24AB7A5144D75B91F98F28DD95DD50C6B17DB23D9B2CC62BB4210D60AC51B534F2199E46D06AED23BE0004 +sk = B032AA05AAF1BA53EB1D501E32312AE779AE1CD3A93E4D56ABB7A29704FBC0014316B935B8F7736305296DAEF2C8C51B3D0B06F2BCAC24AB7A5144D75B91F98F28DD95DD50C6B17DB23D9B2CC62BB4210D60AC51B534F2199E46D06AED23BE0004210AD7DB266923FA467E65AC019D8FAD4F56EA9A3BDCAB975709000000000000000000000000000000000000000000008AEEAA84AD1A482941C0E9111A3B1CFE805F165C59CB0D553EF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49D975761E38B2594A471B5654A4286ABCFFC67AD4C4CC03B8F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007B6B846FD94BD918A6E18D6A8DAE1F2D9ECE7F5A8470BDF98FC40AD29952619591CFFEA7D5B19E80F08BABB4057B95009496C89983D51CD7771793B4EF8A60374E411EC3FBB14A1136569E10117A7A2EADE068E5530E4D2DBF90BCC035D73C00EE47A2E7E3D67ED409D9661CF9FC3D8449386686E3E2487BB3F632460C22AFB202C5299698964A07020B570A63ED6100EBF127323F5CE44C31FCAE38889C26CC76827B5187DFB5C28A81D04842E0963011E8B941F2CAF02C21B29A57FC0CA200 +smlen = 785 +sm = C9FF462E859CC6045648D134D82FBC2FA7D6C2248313914282CB5109340FB900CC9698818698D9A8F9EAF2B3D168C60DA4B86B7F66DDC6B09B23CFC75F4F07D15ABCBB466E0F9A6F45266A6CEAFA4477BFBA30D7C7A897FAF68701A92B3CEA370002D0B6B3EEE48676C168B1575086ACAE5CBA8BEBA8D5BE786C03FD966247E4222718A311B04BC4935A21563AEC85B90B397002A499A9EF91DD5FFFD97C7D954A887BD4972E0D09AE7A9EE201578DE59DDA2FE28C12FDF8F23AF80568994632865EA1C05702566F6FC357A5975DD2DC3F7A7CFCB4859092AA3EBAB2DF000D02922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 + +count = 17 +seed = 327CE565CFF6CD9A25EDD84F482FA0758B78CBC246567DAE98B818314AE28CD438E339043EB3FF16E1C2B4B104A717B8 +mlen = 594 +msg = 576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC +pk = A501BE65AAAB4D360F0E3EE66A756879F3A940C176571FAC8C5E23B8AA3902C59ACF08E00C25E3E068FCF6BCC81E2C1D42A9B4CC4CF4EC752DAB927D26AE8235788B744194700440DCB47E88CD3CAE69BE6D8434357C731372ADC4E8DF34920A02 +sk = A501BE65AAAB4D360F0E3EE66A756879F3A940C176571FAC8C5E23B8AA3902C59ACF08E00C25E3E068FCF6BCC81E2C1D42A9B4CC4CF4EC752DAB927D26AE8235788B744194700440DCB47E88CD3CAE69BE6D8434357C731372ADC4E8DF34920A0209B0956C5E4B17D684BB784AA31B606548FE8FC600C362878C040000000000000000000000000000000000000000000050DE5D278152C4676602DA48F39BBB96E41EBA20214339886FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED84BB43CE7564B964F37368B7BCBF9A5E8045109B05567582F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F15F535CA0C03C88431536B83BD6349F6545A30E404DB9DFEB7E3312E406D98E1A2A5CAECF097ED523824863F3F83E006B7AC42A76DA78D442AFDFEC990409941D013107F55A1A32F77C9E86BBCBD8363FB8FA7B3475F48271FDF7DA9BBF8D0068ACAB71DC4570DABA24C4B8B50FCCB44F54053E30B0DD1F4B32D835C0E6E8A36B72ABD278B70E96225CB826741AE3005D76887003614D7AECE5430A046A1C767214CCE319C3781BAA9FED15ABBAE059DAA79F6B759CCA31062917D9338C0F00 +smlen = 818 +sm = 0223AE9D8E3EF619B3D2769BC4DAFEA30A2F70E0F6EFDE3079420428FBB9C65A2A31660ED0A35F0C0546564A0C5E53203BB295A2309CBEADA4605EE79C9072E11E6C18BC29DDAAC1AC8AA7EAE69D12863A0AC2E9EF5F5E63E6B7A506F194D4370100D3AADB622D00EEF1C0759390D7B694E8BAABA952888961EF0093747FEF0EB2A7969AB00FCD953A0ADD6317B927E5127AC401865ED41E8AB87ED34BBC40C48F985E13906E166BA0B9240601719B99CB53E54A7F44F41169D4FD7833D4C390276AF69E610115130D702EE257B3BB4644CC77A84AAB8BEDD678A5752E000202576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC + +count = 18 +seed = 790FC03F956D1301A735504075B67A05944A762E0A4BDA77BB8C036C5CF911E2B561EC1CA6AA355D5CEC919AED42A1D2 +mlen = 627 +msg = 021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 +pk = 66B4D16AEAB97EC38A3AA053D50071D3B8956BA344398D4B8A620BA803D94C139EC87EF29629241A9CCCE92B9B986B2C197EB80FB1B46A3A8E0E48B70FDE6300F5272CBDE3882F78095551BE5692B65D6626B0E56F02836F43E06BD45CAD983B02 +sk = 66B4D16AEAB97EC38A3AA053D50071D3B8956BA344398D4B8A620BA803D94C139EC87EF29629241A9CCCE92B9B986B2C197EB80FB1B46A3A8E0E48B70FDE6300F5272CBDE3882F78095551BE5692B65D6626B0E56F02836F43E06BD45CAD983B02257871956617740DDD24C0EB024E6DE5E013A0CD6CEC1681840C00000000000000000000000000000000000000000000CC2BF8EDBA8E15BF251CC25258D69A574102D103C430957CE0EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5322F82DDF09D7D70CF87D505BF9F36608825782207C4273FEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056FC35313F07584E8604D9E4F00D290D321EEA3ECFBA24637EA0A4949B56B29CAD766A4980AADC4A9F04BB8B0A1B9C00DF54E02DF0D30DBB126AAA86B5D0A5C74B3A9C9E109038D6C899211E1A2AA620760286727FAFC0C1DF945BDFFA129B000538E57EB4585A0DC4DC352E3679C67ADCBC9C588F43E96BDB368B2542108101F2D684C0D6FF57342A3058E502087B00344EAFEFC650EE769F33993C7E79BAE0068E9FCA574B67BED5ED26F181132D617E780EA1BA9881BF38A241553CE65800 +smlen = 851 +sm = F510ED49BFCBAF5AD04CF048D8C43A548A8A9B4F85FD82FDF37C37EB215CE3A0C8E676884F6CB7E077DBBAE6846AE928674369A37C128923513433C175162A6302CF3382F86B7966F39D87D8D597D4F11CB41D56BD2EBBA6C15638A4CAFF75330002959CEEC038CB79F8FCDE3D44E95D2EA0CEE9F64F608099D50192BAF6C99052E373DD5744D6B56C946186532F4FF56CC1C4018316F81F77D00985B960B1D52169422CB029469B4E22DABF017AF91CBE2455948095985307CB2A836A7F46B75A37990F5003F0BFD8DFAC588DB0C36034523A4413682233C4282B8D7900020D021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 + +count = 19 +seed = 716354F7DEAE272CD26929C0932CA257AED1DD23D67260726B5213D82E61466FA99BB6A7D81DEE9D0EBE03DEEE4DBFC7 +mlen = 660 +msg = 7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D +pk = 91CC079BF1F78B3980477C4942F82DF8799A4C78290C86DB441EFDFCA6E7F052FC3C7272A6B962DD6F00FABCC1E6DE0FC5F0125728D8AC5B1A5706C5B8D6C85B77D7828025EDBAA88E4B6616C62A54CE86E860D9ED0A2B7A4E4526622BBCE0270D +sk = 91CC079BF1F78B3980477C4942F82DF8799A4C78290C86DB441EFDFCA6E7F052FC3C7272A6B962DD6F00FABCC1E6DE0FC5F0125728D8AC5B1A5706C5B8D6C85B77D7828025EDBAA88E4B6616C62A54CE86E860D9ED0A2B7A4E4526622BBCE0270D016BF73CFBF1A89D2B9BB04C0605AF9A3C1DC40DE00884416B0200000000000000000000000000000000000000000000FC53503A10B64808392ACA5F4644194FCF24A1821F0100FEA7FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9814ADC7931FAE36C2E5BC980A2ECB005271F0795DCAECD6DFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AB75BB550B23FED9AA5A80EE019DE87524991AAE681056B47947F502EE62A16B64DA3A24868B472696EDA203DF6760006108697E533D0ECAF30B1D646F7584526D26E519F6692566F3CED9C0F8308748DA50B98FF8FD58AF876E68219103180017E8200D98E2B8033AA0B82A74E0A9E3F385117CB600D9A7BFC239A45E54D47F9DD53B3A6DD28352C301E82CAE8D230060A8B8D98E07A65A57567912E216552B4D62BEA1F81EA60181527FF46A46116DC3792B580AC98922C06744299A6DA700 +smlen = 884 +sm = 941B390E3A932A05E1CAAB98217BB652741C896D76890BA99444EAA2D5E8E9988000CC25A2A8292E52727210E6F96F29B4D57838016AEC5F3B3561032AD752E4E07FB6AC821A39E857B88305C07F6ECC097B3A28AFBD62929E84E61F3C9E55220003BF74E2FBAC45595A709607C1D1F8D1706BE5F6EB6E47AF0C0166077CEC5F9CD77EE55AC1F22B3D9AE9CCDEA878EDCEE6B200DEE9A24D977EF9C9B249B69185914A00723C31362FACAD410394E31F7FC6E0A4C49A40F2BCC2B95EF19BC7481B92FE72FD001090B83DE00DEB5149554B97EA5ADB218EEEEB08DD6C4500040D7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D + +count = 20 +seed = A32E6FF879EC8866A5F5E4F6318DA8FE6743812ED2CF5FB94F5C3AA3EDF953CBC32665810B71B2CFEBF343A571CBC570 +mlen = 693 +msg = A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 +pk = 1BAC9FD8A7718E88BD0F5776FC4312FA74610209A2C30212990F50BDFC715D5DD584E858F9F69F229D3B9992E22E6E3D66FC8D468BD0B3F3C90000CA22F0390EE2AACB3607ECED8F55218BBC955A238D695C9B65A799E3C5EEE2B53D74885D2702 +sk = 1BAC9FD8A7718E88BD0F5776FC4312FA74610209A2C30212990F50BDFC715D5DD584E858F9F69F229D3B9992E22E6E3D66FC8D468BD0B3F3C90000CA22F0390EE2AACB3607ECED8F55218BBC955A238D695C9B65A799E3C5EEE2B53D74885D27026B2C27CED2C430EE114E2B9A001FD898ABE39F8EBBA75BFCC30400000000000000000000000000000000000000000000DEE66FFA2DD11DDD2BB6D38F4664BB65335D458B00CCDB5E13FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA954EEF0DB6F8BC91CBE92B99EA5A0DF274BC6021E1C7CF8A4FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004528E37755B74A31652DBA4DF8E5EED077E2EA107840AFC66206BC6DC2DE6C37DD2D1C49C871FAD7E4D8A260629EDE00408EF25DCD824BDC75BC1866C19F358776687030F5E1F47C3FFF49FB44DCFD0F8CBEBC882DF34B8F7374E8B0DCBC7200E98412E8CBC84101A2B70787BE73A2A286C33D434744C261B365DE92767D144D47393553AC255E9735568413836DA800871015A5C7619A322725A9436E646D2CCBC11063B0207397258558250CEDD90054C70DA5474826152406A8DB6EBE6200 +smlen = 917 +sm = 4C1E961A91DF9ACCC41161370674C69E9A509E864A2764A0D222593C497F6E327F8C2C114C258F520C83DCCC983CC21ED6CE25C8A92AC0DAE99187538076AF46D413AE72A43F177867897F1389E11EA3131BB7994AD72C108E33B7FA972B610F0003D010E64A163ED59020BD767DD5D3A4B0FB97661C101C82330111AD0D051811C81F3DD5048C220A8E941525A7347E8D1F7B01D85F62424D90812A1D6C544F71ABD740F837D0BE6C30233B013D4D3756F1859F48F625D6CF2914B3EE68940CFECE0072470009FC33D6B8AC6F17F6010C4BF4DA078D921861B691D0E4000D04A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 + +count = 21 +seed = 5A64401EF8E63AEE18E8CC0162845DC7AF388230E86728ECB330007F2546F949764273EA05B397FE71F567E1527FA445 +mlen = 726 +msg = F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 +pk = 14ECE164456FC91BDF32DCA26B823EF4243B2BC8450AB3AEFFDC0778D53F1AC078EAD687E054872BFA3B8EF53C61BC0653910290B215C8F750E317D8454D738F1F4EAF4D55D33A02AD4DDDF6A650685D2B134163D3E32FACD26B44BD169B7E1802 +sk = 14ECE164456FC91BDF32DCA26B823EF4243B2BC8450AB3AEFFDC0778D53F1AC078EAD687E054872BFA3B8EF53C61BC0653910290B215C8F750E317D8454D738F1F4EAF4D55D33A02AD4DDDF6A650685D2B134163D3E32FACD26B44BD169B7E18024BAFAC95184216F88B8BB70D375B341179DB5643DED442A6F705000000000000000000000000000000000000000000008E7C125B11113B7D63F5B0BEAEB882339EB7E2370FEE5C3B66FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F8DD22F1C006645F926A2EB13B232E50729B439E023469ED4F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008624D48D1EC714A8910E1FCF7363A7D8D89E87D658010E12679941E7473E3C848C173FCECB5CDCF4BE25BD824E1333006D3EF9060279EED3C9125737675B8F261BE9A55A16C09348BC75D111902B3AE992F5F4F1C92B0A5C3A246401051BC800A54E19B4672C9CFE2A717358BA61B56E0012DBDCD44D6739FD2214106955D5F03624B5597BE29D535F2316D8F4B081009F7AF18618CD3452B015A52B6CAE9CE3794051AEEBF9952AE32103600AC4661AA9F175DE7DEA7CF61B0679D5D1CCF200 +smlen = 950 +sm = DD3E313820B6F783E17DD6BD052ED2370C8A1143CCBAACF6461CD1314AD3C4F40B219FAB0C13B0E5AA8C01ACB2D8A606CE511BB61642B078648B956BF1A731AEFAED556CD47243CF536C27149D7A122D7306E375339D7D1B0B712D1CD053F0400001CBAC1FE9E50A77222DDAF015E0EB2C5F8CA1B9D32F32DF1B0296A8F35A5DF58E5DA1F73E5C3F1FAD9F47DC31B718B2828500CEFF7658559D9A2212EE598B0B1C4A19BA66670CF5A868200232207EC4C417EDA8D252F2388E88A72B7A055AB4D8F3214D017207F1418DC78BD49BE1072D2F3FD2F61D2F5CD578E63300150DF5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 + +count = 22 +seed = 3222E4B55D6767E300FDE03DB3D8227E19FB8B08EA9B923FEDE18D699DC3694EFFA7C4DAE2AF57E4A0162B7C564199BD +mlen = 759 +msg = 4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D +pk = 2D8F39E7D087D6A9160F0E05FE56E3C3AD45BBD0C559F5DFCB507FC77F709B58C049A45A628BE083A000CDFF99048C0EF82DBA369FFC9F7DB7F0D300553202705C68AC279512F3F231467475C5AE2AAB7FCAE0867F29BAA5B77B8065873D930302 +sk = 2D8F39E7D087D6A9160F0E05FE56E3C3AD45BBD0C559F5DFCB507FC77F709B58C049A45A628BE083A000CDFF99048C0EF82DBA369FFC9F7DB7F0D300553202705C68AC279512F3F231467475C5AE2AAB7FCAE0867F29BAA5B77B8065873D9303023FB19060EF8D899746E3810608291F88D9224DAACBFE29B3F307000000000000000000000000000000000000000000002A560D8F863248D2CCF10531710CFA58E1AAA737A65D3D91E9F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7BCC8D8BFC3C8F1523B18BB8A3F7E24A515DB409E731BB50A1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007F736937AD1ABAEDB21F8DE22CCA1ACDFED08D2A90A2E53CE8EC359412D68862A57388C5172AF4B3F0D331D6ED339200D011BFE1C628AF563F7910189302E9D06D75998B142F801AD3A4C7BEA9239F83FC8EE8A7C73D9AF613D7CBC7F70C0B00DAB0B0E9B172BC7FD0F59D666F0298C41A7FBA81647C1D34B23F93FC28DA559E77DB18990D8BBFF0244C4CC95BE6E100251EF60AB13569697DE0E7E7E5E0EACD95FDBCF27CAFC84BF49F7A1ADD848692B19F128B4AE076F84D340882C6B49400 +smlen = 983 +sm = FB26906EDC4F0F045A9F24FEB5D837153E3A8BA40C2A7897B8291F15C6190D35EA4890962B676017B436B4FD0C90741651532629EB92AC9569D8A06B6F0835DBE2F04445371A4C220FF595137E379F680DB16DE87DC2837BBB42F56BDA3269010102DF5017520E4004DB488A8B51851B45E23EFC0D6B179F97B20191C3EC4FE49F4FABDCCE3EB472DEC3321BFA4AB2C03158280042093619FB24BDE9B0F6F39B5F20906F86A5A63D7B5F46E701EA770D52636A8EFD769CAD0DE951E3AC974AB64D5CD5AC8800B118A9B6DFE0BC10106738D131C550DE6E4339D5946DCA00040D4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D + +count = 23 +seed = F41B3C6225245C06455272A6A073F363E5F19F09A0B146AFCDFC2B3B0EA64BAA3F90359F32B2D1017608B03064E90AB2 +mlen = 792 +msg = 72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF +pk = 3AF62725D562F71077EF0853C89799517970B9F21F468880603D471B51B568B882B008ADB7AE444F86FF88BDD229FB14520D8B9C598EEC0F2002256934F53545A43EC2DAB64B53C55C2CC821DE0516A25340BD8C19E20378CDFD0A5541C3221502 +sk = 3AF62725D562F71077EF0853C89799517970B9F21F468880603D471B51B568B882B008ADB7AE444F86FF88BDD229FB14520D8B9C598EEC0F2002256934F53545A43EC2DAB64B53C55C2CC821DE0516A25340BD8C19E20378CDFD0A5541C322150247736F970812DC57E3D25EB7E8FE0E32D026264B65397C8C4B050000000000000000000000000000000000000000000024195B78268BB326AA68B19C2598D91E6E5733495765F5268CF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5F6C91621B6834D7D87A45E88AA136C19A5E4E5D5B33775C4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064B1993FA96CFB89487FB7642876A132C965658A4FA387AC133A67C7E45C8D30149FA8F34D7F9756178E7B111F367000CF742D7EBD10FA4A0A6AC535E4C9B8C29C80A8B8F606023AB3C8323EC4D2BC8FB28918EF9113F4435FCC81D161D2520063A07ADB09D33758D7A30DA1DCAD093B35B56A0B31AFA7B9A0E0B1E0D772017840CD061C085B0FAFB753515390723200DCFEDA3C41F695268A8D770EFFFF86EA8A95F571BA50B848BF7E80CB57199923D3CDF9CB92B004771878F9C4AC28E300 +smlen = 1016 +sm = 13E9718E31966099214A6742D4352C8EB869D275A0C45C43697E69B3891F69F6018392DD4277A9E4892153DD14FBFE405E4AD91AA959E772E372DEACF9BDF7B14007717AD6AA5079DF4B9978A4C8BE4979FB097BCD1126348E5CE9D25AA6A00E0002DDEB2EECF7A42F95948DAFAE0C2571D98B0EA22241039A5E019A88FDEF1591B481B62138CBB7A1D4DB4CE7B656865ABF0903E5366EACFDD819746539C3D06C88C0A577A83F53A1896176028E26BC150E91202678AECABD374B2690A5ABF9027BBFC4060395F7D11A0A54CCD0AB6B86ACC49657DB7BE4663AB2C1AC000D0272713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF + +count = 24 +seed = A08AD391E0FC57A83B74CA8CF44DB67F8178262ED9B20AA0163CDD8274AC2BE05F558B112B094244370C1AAAB75077E6 +mlen = 825 +msg = 209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E +pk = 3A0B6C35209AE27BF955881BC85D04962D22239B23DC1D69179089213B49E0F18C3C1DBE5D4E7F5DE6D8BA2DCF037F110D6399319E4CFCBA8147726BAFA792A69A01F9846180C96AD073251600C0F2128FD02B89E2C7466CB8020B2AC70F1E0D0C +sk = 3A0B6C35209AE27BF955881BC85D04962D22239B23DC1D69179089213B49E0F18C3C1DBE5D4E7F5DE6D8BA2DCF037F110D6399319E4CFCBA8147726BAFA792A69A01F9846180C96AD073251600C0F2128FD02B89E2C7466CB8020B2AC70F1E0D0CFD906CA23FB558012EF7B02EF0ABAE6A42E1D45351FA5932D60200000000000000000000000000000000000000000000C2058AA27E4018FD87C65121DEFEA980D3BC139FE2EB16FEB8FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5274001C5C93FADC3F3E96B4AD651805D596B05E39F9F9C64FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E7AA4547A81F7A8EE1B774163A800E5144FC86684E99D47207973CFF4571A534C82FFB1D56DAA763909517D65904AE00ABAC161CC7BD6475AF4F18982622638890058DD1B0BC8AFAE597565BC9A2A03CA460F77B633881A86943E83A5944B60022A3BC97A99E7BC4A08911CA9BFF3ABD2F6941F40B50A355F859623669CAE7BADE813688BECB3C3CF68DD24F52AE7600317F226473B4A18F67C7CD3AC84B3CF86C853FD28BD457DF695D8C244CF5EDE5E7550D64E6466A7260E1D2DD9D5EB600 +smlen = 1049 +sm = CBAEEC4A5203560F0387940B2A0E55B6EC06F4B3A1ED13159AA18621DC942D1A1C53C56129787713DA9926EE2D0BE22F31F4F623CCEC8B4055473B1BB6CFC35DC95245E328B7FF9D8398AB50B85B9DDE824B5B0B4CDDECA0CD669574BF32C43A01026448198D6752EC6CB713FFE85B813A475A9A6D7C37B0D2500111D1C2BEEB21E711F0178C7EDC92090EE208D57BC73D123100643B66A9EC1BD61716C4B308A309805C2D5F0D89C26FD5AE00AA02352CFA6B6F123C28B8993AB0B1F2ABB0D352FF8841C10123E14B19E1FE9D27A503A468DAC0A1170D6DCFCB8FEE85001515209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E + +count = 25 +seed = 6E0A8EF5156D693FD0140BC4A31084E79773A83F42C8D133AC8A9D62DE3CD74511F893DCB26041E6B35E2B175408FCE7 +mlen = 858 +msg = 8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A +pk = B2E7705256B2693C2EB23F53FAC819A0299CC1943BD8A412586E754E18DBCD52BBF89E6A1B0A10CF4B4D5A29A04C443293141D24B2ED40F14CE23063AD5211606455CC43D23829A23DBFF5DF973B05298AECA0848F580372C1F2B27B1BF5200815 +sk = B2E7705256B2693C2EB23F53FAC819A0299CC1943BD8A412586E754E18DBCD52BBF89E6A1B0A10CF4B4D5A29A04C443293141D24B2ED40F14CE23063AD5211606455CC43D23829A23DBFF5DF973B05298AECA0848F580372C1F2B27B1BF52008152B47C54F960F686F31CAED72EAF95B004F275EF75DA294091D0800000000000000000000000000000000000000000000721D667CF68D6ABBCFE1171C1AEEAD704B891105D60D493747F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9648260299BD66DFD92213577197BC20D1B9069FB9E30F7B5F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B6773C6BCDF04F6856989DF4BCD5C02AB613E100133AA3DE1BDFFF7EED4A228CA6E680A555E6A9E179C7DA730B481D00616C654B4E44ECFFE445101E0FFFA948D7CBC4CA0B57F647B6E22D72B37F3667D3648997A4F3B607BEB138BE43A1FA009F62927C327D6D3DEC251AB6F2C284720A8309E8F006A83BBB32F1DDE2658943D316C796201022FC53C3474494DABE00540DDE345CABADDF4956484304FAD03EB43CE54AE1D3E6B41D6C287EF8CA2640A46BA868E53FF6949B16ADA3D90A0400 +smlen = 1082 +sm = 320E8600CEFB3118461C029E34FA55F51727D55DED48B58C231947DF2CB9ECCFB573D6D0640FCAFEB94577AAB312F81F4AB9123740D86EAF073B30F222ECF1AFFD00646B572D5B71228EB086B8EB298ABB778BAA576C52B5E7EBBB6A4F96AE210200904558F05CF0E38CCAA1EEA53B5FD0031D5C1BB3687FEF7100A3DB25140B95D8AE4690FD2E4457CB9B0796E1696CA3AF5C00058E65BDB5998D3259DDFC58B65F3CCDD5D423937C3C5EF600964686EB2CAAB5396707467C9E49EB6860E13A32ADC17D7200F1B8CBDBB532986FC869F7FBAD4BFA93747B5C7F43AD5C00020D8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A + +count = 26 +seed = 49CC05312D1DBE216FF03B60575017A6A1464C06D2C5A4A6F973AD9F275F7C66163A29A803BE759B117043862D277C27 +mlen = 891 +msg = 30D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 +pk = C234D53CCE8BB0CC57975D3BFD6DAD1335BE362042F9549CD5AE7FB454E137875C078EF2DB0EE7252D6D1A6F6CF3E51AEF5F0E95765704276B3553383D73AC84A94D8D6625B1DED871A3EE6D47163B9BA9C652B0E5A6A75CCA7216D04239310F1D +sk = C234D53CCE8BB0CC57975D3BFD6DAD1335BE362042F9549CD5AE7FB454E137875C078EF2DB0EE7252D6D1A6F6CF3E51AEF5F0E95765704276B3553383D73AC84A94D8D6625B1DED871A3EE6D47163B9BA9C652B0E5A6A75CCA7216D04239310F1DBBCD13C8474E8C5A6A0B5E4793EEB49748A055C1C411BE57D80400000000000000000000000000000000000000000000BC329AE48A8CF82B2ADAEE8282288CB3A795AEDDFA80E7DED2F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA764D5C951513B8F6331CF455EF22B04D4E5952DA61FBD710BFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077CEF086A10A5B9752A9D28E716BA4554C262E5C8F6982C97F066A5A6069F8431799823959DE372D70F54D6445DA500FE0CCF9E0C9217AD7D9158FFBC0FC1EB3D9B571F3F1404E79769143FB52488557E98BB97F9D5ABEEDB06E891EFE016009839C0547748A87F9B06D6BEC57C8FD57FA972014EEAB39F68167CFCEFA854D8B516BBE6A05C4B1DA61B1E4BACB7C0002B23082A6FCA07BA17802D118396757606AC352A190ABFC0EBDD3BBB9E9214CF8ED92207253075BA44F2911EF1D3D600 +smlen = 1115 +sm = 2AAC28AD35D40887E34571B9E214D398776961A80062EEFF1B82FF4953F5615A3A4E3870960600C4A7D9B0F3740B7E3810CC2AF394E25A041A7094DF4CDEB7FABCE0556636C3BC663287749BCD9988FF8B68353734A65F82D6AAFF277644BB090002B294196B4202E2A4781B84DA6EF791F8E6627E53C6DBFC310191C13BE91720602CD5466D75A182D91C0A621ED8258D987502A2C69FAE791A4E0AC5F264F258BE3B1C67D5CC37706A6810032B7F2EC2D94CF82E5250A4CEB9F0CC357B99E74ADC23FBFB025BF597D9E070BF272CA770FCF3D17AB39D5CAB50481ADA000D0230D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 + +count = 27 +seed = C33EE43A9CBB4347BFAF71147B7FBDD88D212462CB06FBE695A35402C503CD15732B7D0E8BF829A555B9167BCFA2F2BF +mlen = 924 +msg = C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 +pk = F439E6150EBA5AC8052981BCC89B84E619882C6E5D5B7E8055D986E5A2DA688188AC5D76078C7427B88C63AF85EF313D0C398837BACA9EC0B5AB5F83703AEF2509A749018F15D6AA61058851B92D80A523FE495F5BEDAB4FDFC0FA4947E9572A02 +sk = F439E6150EBA5AC8052981BCC89B84E619882C6E5D5B7E8055D986E5A2DA688188AC5D76078C7427B88C63AF85EF313D0C398837BACA9EC0B5AB5F83703AEF2509A749018F15D6AA61058851B92D80A523FE495F5BEDAB4FDFC0FA4947E9572A028114B8E7FDA7E023A500C7B7DAD2E349E868C729463814DA6E01000000000000000000000000000000000000000000001C31E8F4F04F2E9BB31D5C7027D9E1B7ADD04DE124BC0012F3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF951CDE6BF2D7D496F7F7244FC9FEBF3CC002690CAE23E4FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000653E7C9341235CB28085468218141506F6255775D6419B2275D4C4AB1E2BA221BD739074DEDF344CD3F66047BD920800F10548BF337266849ACD84FBEFA37654CBDF46DE41175638FBA9747CA87CC0BF976CABDB5A3B6673351D30CC4C742E006E184ADC9C13BBEB19BFAE8B33ABA5DCFF094CC9FDCF5D156F10C138B27CC035A8EDE93FCDF2B6D4711289DE8F6B8A00592ABDE8653CDAB44BBF6B2563F29A716041FB5CD74E1A968F653E3CFE72587C84DE33581DB6DF21689397AA9C4F2000 +smlen = 1148 +sm = B5A7D050D205BA71D4119FE4E158C75B32BDB3EC84614C1FF489BF40188287F7CA399C1F8F365E72687DF6C25CE5C40C29ADE082211863B6C44CC61B146F010192E0C5B52AF01F2E9B62BF500A797B18E6049C5C5BA35D0CAA1F260002E9571A00003B9D4C8F38CD31EF2BEFDC4E136B4FE8FF8DA3390A132AC502FB8CC8B328360C058864944030EC86D31EBA41D8EB3CCB07020B873E32648F62029FD7947253CCDD334D7A87BF183F0DBE02E467F8219FE1DB1A0577C544737F6268252D3E83B152AA020201B7FF57ADA8DB66D2C0ECAB32D051BA6411857871BFE7000402C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 + +count = 28 +seed = 19CB4BE2332F7FF0C078BC001FAB3C5FD8569A76EBCE373D1ED4FC8EB5D744C6464E2B5EECB9EE836CD5D87BEDA78BA7 +mlen = 957 +msg = 86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 +pk = FE562AD899A5875C85C3AE4A9F539913FEC0CFE648E3757C58B5FECE2462C10350DCD6107F42C740C089B730123D8F24CE328961BEB50565DCC279F73B38FB31648D223BE562AEB6E52D509EC88BC78599874B9545B5DCC7E9381554A8D7933815 +sk = FE562AD899A5875C85C3AE4A9F539913FEC0CFE648E3757C58B5FECE2462C10350DCD6107F42C740C089B730123D8F24CE328961BEB50565DCC279F73B38FB31648D223BE562AEB6E52D509EC88BC78599874B9545B5DCC7E9381554A8D7933815C7740F18A884657C4B37AD31192A25DDC17139DD8BFCF97A6406000000000000000000000000000000000000000000000696EB6CE53C5DCE65E85702215CF3DD4099636853C2C90B94F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1947AD57D643DFF85764E7EE36756C74EF643D86181E41CC50FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FE5D101EDC5D20FABB0583C804FD14400156927183B952A6DAE614A66E333606F9EA7AB58A0B288D6C740B9DF4A904004B44C6A78C0DA51524F8D93A82F29561B633EFA0609CF9927C6585ECE4C06FE411DC1A263C2DA582D8FC52887361A9001DC4D059527D71AC98C47A5EF0E178CB3288971AE4AE2A2F92C38DB73A281F7ADAE185A3F79777890EF73336D35D69007B626045E0D1D571B68E8F20AE41E8CD8F40530B31707019BAC8523A2502052AA9AD4C5CB94A3495CB62C70F22337200 +smlen = 1181 +sm = 44826DAFEAC80A8DE394BD28C122E40EE5844D8D0EE652CBEF33F60B1881808ED7968A0E1CEF71AFB0E6DDD14EC3FE001D0980E27B4E9ACF12A8D8F68210B78E2E276FEE8DE0912122C87ECF5B5232CCA2355D64FA77DAE163FC730500F6AC2500004B937EDA2577D3C2E4084E9324C9F48E942DF13C71B3C3BC039AF97389F9EA950D5A1784DF6BB5D30D139032C5F8C63B8B01E3BA5F4F488D84143A2D04062AF66D195AF61D47ADFDEF7801A72EC7D95E843A17D88C2C97841886F59EEBE324508B12D30159479E5CB784B34E3DB99D98BD5312BF9EEB6BDF975F7B00160286D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 + +count = 29 +seed = 6BD93FD13C0299B3EC7403638673F3DBC449F3A617B691DDF73C072B62BF028913375D7460BED2CF9FDCA517690CBAC3 +mlen = 990 +msg = 56ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED +pk = 6C651C3CA600B9CFAD170F07E5086D68805FF08FB13A655D2120510F9C08DF45CA7147342EBBD8696C3FD07D81113337DB3C11A4E5833160C31725D9DACF5D74554B39DD858C3DA20282385297289FBAD1CF3ED6DEB619C577630AB53589A31A15 +sk = 6C651C3CA600B9CFAD170F07E5086D68805FF08FB13A655D2120510F9C08DF45CA7147342EBBD8696C3FD07D81113337DB3C11A4E5833160C31725D9DACF5D74554B39DD858C3DA20282385297289FBAD1CF3ED6DEB619C577630AB53589A31A158FA888B8AB699880516569B4CF1FFCE2E397D9C62EE5A917B90B00000000000000000000000000000000000000000000EC2570328F401432F736644543BF3E74CC957872B05D385981FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB32FAE76F487B5115D81CAD318B7437044808521160698868FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC51336E720FDF37D06B5F62DEC42D3C5B75691A474F00FB5D78AE342C6210ED86F308DC7623D72E3FE0C159C8D7A100E39CF06BA57F9D800821AF7CF586C1741EC164F34DCD85BD2DECE8543EA0DB81094D8A4C87543E5E6E0308E2A0621700A53BAF501FA6EE2E72D4D83EE9A6C8891A03F9CA28500AC994C8EF9A74C85E9250D3340F584BE8BAF2C82230E120FF00A581A37A02C640FDD3DD05E922EA15D47AA859BA87BF8D967E95E831879499998DA9CF70170FCEC8C623331B2EB91300 +smlen = 1214 +sm = C01489A9727BA7EE66314BA4D1799C7577970169E8B5BDF10E78444DD6151EFAD42D1029CB799CFAE1573D9D94EE953B281B826458C67839A9D6751CC6F23C1FE50BD5113DAB038298B50E87F9981C82E4917715AB7B21EC6A277374CA74803B00036F5E425AC0ED92CD729435D113142BF198ADA8F5170A74C0013B1D66D18DCDD73B4E51A7A6067A180D2F6F832513984A3D0198666306C3EFCEDFECBA2ADDB428C6B275D8869694779CB101402CBF69676E4E56A966A2ED400C5036F5B510B371FA477B023B31CE65A48F039574260DCD2EADA14FC836EF412130FC000D0256ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED + +count = 30 +seed = 1787C82DA9F2E6CA9ACF7D6CCA70116A1724902C81EDC1439F332C74807AF2BCCCCDC7AC1788BA798520B2999F39DC3B +mlen = 1023 +msg = E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 +pk = 168DE0DFCDAF39CE97867C4EC7D67D3A30773A0D290E1A2A22B1AE4368A19CE4C3A97E47954896A4AB47A17AE4F8682CEFC7995B235464656C43D5D083C07629DB36D619F559126993E5111564811E75EB2D9E92FBDDDE33BCA5A34EE2EC363015 +sk = 168DE0DFCDAF39CE97867C4EC7D67D3A30773A0D290E1A2A22B1AE4368A19CE4C3A97E47954896A4AB47A17AE4F8682CEFC7995B235464656C43D5D083C07629DB36D619F559126993E5111564811E75EB2D9E92FBDDDE33BCA5A34EE2EC363015019F1E3CA7FB9DF2F61F1588D74F7E7BF1BCD6888A55D655A10300000000000000000000000000000000000000000000CA10B2E0F5442F1F3B153BEB34048FAEEF729A268465EB1C9BFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7315DD86E9B25F6A1B4EA9C65435BFEC02F3F7AC6E9A95227CFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D0BC43C80A64B00D23233606F770901DD3529D3DFBF728B000515E7D309FC5714913B2A92CA14C2F025F6D3F317F60041491BF55E45CAF50DAE098AD3FD24D26E73F88607A566BD71DDB51802547122CDAFFC159326EB40513E317A5C4AF20043E76F3C8FAFD70338EEC1E10B2AD001A60E78D88E552D03F74949F4FA4E79326C1EE3FB9C752693DE78B0F930DE260028A612176CE3ADA183C187467775FB3EEBD46A1511C9E5E7115D7B139E52077735B4B5A725BDEA413A9B8B206B427700 +smlen = 1247 +sm = BA6D16B09ACFA4514F0CBB05D6125DA5C7D4E8E9EE36791F63C82A3F0CB8DAA9722B08E4A31CF9BADBF987ECA36D7232822CBB63F5130C1CC483655E365D25A185787D43859D0750A0352A6DB279370C5B1B9BB3918EB42452F160BBDD3EA6050001154B56F316E3A2B77396953EFC846BE9DD4B208E508B041000271B308BDC692D395BB70AC0F5FD721F030F63B8475BABD800918E1ABD7787EE96800DA1BFE0BED95AADA8A9ADCA120B5401A1705637DAB21D72468C8658202B0C5359E00488A914ED6E011075E2DEDA9424BED153BF1E7D81D338A946F6F33965E7001704E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 + +count = 31 +seed = 9E6E12F025B2A57B0F5A3A9FA70396FC332E1802608E5CA07CC4FBA922F1FE5DEA6721B96F1BA2BFB97825A19F08FF2F +mlen = 1056 +msg = 9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC +pk = ACD087BFBBA242AB7B10CA520065B040D5E91C983200BD5F65A4435545965AC6338AD10C9304FC10A366051E9FA2F6360C549AF95E4FF415D2738EC49F09813D16681772A9E7DD598668570B92D0B756BB7382FAA6F0E73921E85FDBE2C4232802 +sk = ACD087BFBBA242AB7B10CA520065B040D5E91C983200BD5F65A4435545965AC6338AD10C9304FC10A366051E9FA2F6360C549AF95E4FF415D2738EC49F09813D16681772A9E7DD598668570B92D0B756BB7382FAA6F0E73921E85FDBE2C42328029D8C8D8AD4D66ECDAC5BD3F55F881771561286C3F87CCE1B740900000000000000000000000000000000000000000000E84492699141FA0FB69921436092110A1E140F4D205ADAEAF5F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF739532B2CF2D9EA8C7B4C28A0F9BF540455DEA4F22950A4DFCF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DBA4F7F6B4E0810E841B63FFE758593576EC737BB755E1D09C791F66377739E71AE90FD7A226B11FFC68F3FFC04CE7008807177063508D48C22A4D6277241816469F8F4C3E6197B0C002436EE790959A317F83118BF57FEB6C24D2BAA46D4C0066BD5F628B168827B0FF9D976C8944EA7455C0C3F5B81EFA497355DE1549E19A0C51DD31275E55930821DE1074EB8200D320F4C4F7211141652E3E1BBC8C0718916386AC677F827EEE376728C1BB8EDB43F30037E79D43C78F71DB7989606E00 +smlen = 1280 +sm = 7A39F3A95A5526CB2C8BC203E87EBDF6CD2D41A408696B9DD418863D6CA0942BFA12E5282BB7DA0CBCFC8D7E71484325B24252BE8427430F072559FDB612BEDA917CDE760E70B3DF32BC0D49D439284E07B557C19F82EAD1D40CEF9D4185F827000432DF8A178FD9E8A4BB198EAC59AB27028D9669C3890DCF92025F93E2733D75525B522696EA6A865239121DD296BCB66C9201FEF7B70B4C4DC698BA40A10A8520951DEB5E28FDE411CFC503B1D13A0867781C53E943350254D5420FC3BFEAB01F1BA83A02A072EAA757784168D6A70D6F80662286B00EA85E3A040900170D9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC + +count = 32 +seed = 569B8B9BDB707B19CD6F9BEB29F304D603C1509B9CF25987C280C342E870B1E13EFC7DD7E41DC85BF4F42D0493B84B0F +mlen = 1089 +msg = 7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 +pk = C00B500FC287A7C05A91D802E5CF564B1277E076C1FE80F83A2F6EF22D40F150379CED8BF63E2F175332AF56BCC72A379084F0666D296902710EA26194060AFAF331D2CF852E84C7F09EBDBD323407EC4DA2CB37541241BCD3C1B5D05E3FF11A19 +sk = C00B500FC287A7C05A91D802E5CF564B1277E076C1FE80F83A2F6EF22D40F150379CED8BF63E2F175332AF56BCC72A379084F0666D296902710EA26194060AFAF331D2CF852E84C7F09EBDBD323407EC4DA2CB37541241BCD3C1B5D05E3FF11A190FD5E14B61A8472A2304EF363ED10EB5C694DE3A9DA05054AB04000000000000000000000000000000000000000000004423F2C6FA89AD61386F0C03F9776493D7FCD0B77654A68144FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF412591366BD0A57E772EBA7AC1B5D1899465C08C2F27357A4AF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFC59883DD0EEF9BD43199DDA0783EACE6B8E460293BD6987D111279F3DC75C3A006DA98CA5B2DDD26D3DAA955EC9002716CB71703A73AB036D9126C612D0A43E562954399CCDDEB7B85662F4A15551AED8DE7C7725F776324B7B5801F668004D84C30A72D79E6D6A7C92FF7D47FB6846853CA75EED68FB34DCB74D89B8AFD2918EFAD3F25B5D763EFA087A3BE2D00032118AC85EE10BB6DC1C58263449EA0CBE3B7E764556EA6C2EE23371A31CD325A4E861A475FB91A1F4A06B84F3685C00 +smlen = 1313 +sm = CD0A8FAC93BD5A02D6CAC6408DBA7464FFA549E831B30775A8B5EFBC1F1BF993D6147A09C46B867771118EA7DBAF3D0654A1B488620D41ED4F46E5B9DBB81FE79301100B86CA190CBEA555DAA8551AD48B521A4E11CC05A09A9B1F46F512652500039D532C0F7EC21DA39307843830EEC150B3F57609EE50C150014F6772030EE24374293867FDC61BC41767E46A249669916A03D0240F48C93784016C42527B106F257F128020B86D0E7CD4038849D4D5B46C43A87E69ECBAE4B2C4D1B814CFDE00657E6003EC70A21688A6E3399242513173EE1B80F4A48D3E2C21C00002027FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 + +count = 33 +seed = F32C3715B0BA8C1D0BD59F0645E9697DFCF9AEAF761A71ECDF9672215B9F138C0502D7214F6B1BB4D6612432F9FBED5E +mlen = 1122 +msg = 789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F +pk = 342D41E195BCC0F17DA0EBB52E2F503ABE98596EAFC8FB8C7DBDDBECC804E3A98E62F28975B02654ECB0A47DBC35B83208DEBA3B070EF3DC4306DD99CC3C5656B2B9DBA958CDF58C01DBB0D608E48237A92762DB5A9E12F64BFD0973CC173A171D +sk = 342D41E195BCC0F17DA0EBB52E2F503ABE98596EAFC8FB8C7DBDDBECC804E3A98E62F28975B02654ECB0A47DBC35B83208DEBA3B070EF3DC4306DD99CC3C5656B2B9DBA958CDF58C01DBB0D608E48237A92762DB5A9E12F64BFD0973CC173A171D1B3F98CE8E446BD44A227574700A0D96C001250901E28B376F0400000000000000000000000000000000000000000000746D6E4836B16EA500413AC81D06B136B954408DB06DE29993F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BC6D0D99D0A815F4D7537C83F124F013244E9E571D0A02BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C5964DE3476276A57549C85B34771FC6C99830D71D3E1FBF4517B837D56ABE24669136F37162CD24D48DEE12B76BD00D105CC75926C995AD5DEEC969A54F43F950095FA33D168004A9F5CB86028825BD8E2FDC7AFB37839A113755552E797004FA82535F5D28F248B6599F9096413CBE862E4697267F6B8A082D212190BEB54D29E5AAF92AD74DDD7B896F1A86AB000DA09A35492238275347A11AE7EB9CF040621C125410911CA39C8AE2CACAD51ED7C534A61578D76AA2D4EF66EFC160300 +smlen = 1346 +sm = 568E8181E19210876500B571B163BAEEED34FBA5DE528F79BC3C981AEFDC094B027480109833123B1483AA8B6BFF2A1AF0DCCFCA937E776EC61BEFBA8F15F5004BDB81023CCBC2268B1986A676011FD2F3C840C7C66F0239E9E53F5215078E230002A760EFADA971A446172D27B13A7AD9D38005BB9EAFAD6921026E27D40678395C5DDA7E125AD971B0DEEFE294EE52B148030099AA1194875D8A893CDE65F524BDD39AFD1E5730EEF6E0E203DE58CAC89836DB3539D61A928E953A7A5E472315180ED7CB012D556426359A7D328B20E16C4F23AEF99C5C3BE7601F16001504789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F + +count = 34 +seed = B0C7530A52AC9F561C2C14548D3A5F5053396B738EA1C7A5190F5AB01C9C38719C4DBE856E42D37A114FA24FD5DF5081 +mlen = 1155 +msg = A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B +pk = 32A1114EFA96B9549306E0E515048E09A4A5DB317D3E00202D68486131FA9528CFB4C23055A806CC900958D4BC1C95258C0705132A272B29FE03B6AACF7D2EE9C269BC1DA3B5416F8B4161F746F9F236A954F3CB89D76CF3DEB5FA6BA5B5761E15 +sk = 32A1114EFA96B9549306E0E515048E09A4A5DB317D3E00202D68486131FA9528CFB4C23055A806CC900958D4BC1C95258C0705132A272B29FE03B6AACF7D2EE9C269BC1DA3B5416F8B4161F746F9F236A954F3CB89D76CF3DEB5FA6BA5B5761E151BBF0EB3713A5C62B6EB86BA90467E8ED0330EE24C645AD0D40600000000000000000000000000000000000000000000F6030D7193B083E61714F4EAB33F936382AD452A7880913E9FF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9CA331749225076979268168D51C2DDBAA6C57FAAF007F56FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B582F4920EF85F8B62D23B9B35EBAE2F2F2D9B03BA45714A3AD9922788329E67216EAC55277DADB5F57B5C35F3B393000AC519CCAFF5857CFE464971DF24989E799CF9DFD73F02785FDD3838F142FE50AEAE07AD0AE5AEC4C7D1FF153F49CE00748057333E7C91DA46A60DDFBA837462F5BD2F30BD995FC322855E5ABDE46F9703E04C2D3C7BDB453ACF1405770254002DD0AFD79B5E261FDCFADAC8E442A8E48B8418766AAB9305FD1EBD35C430163DF1D66C9AEDEF7288AD5F9AFE5BB9CC00 +smlen = 1379 +sm = EEA4485793831D2D969A9CBD430A5C913AE3C3F6756309D60197E97A8356A99733B4397020A55CEA83AE59FE32B77A14C30C813FE61158457547273C3439C24541EE2129DCF670FA5D13D51B34E05471E808AC706DB3805424475D099E036811010135C3739993D6D3522B9486F764D862EBCDA5F9EEDCF1C7F5013F135FD57066AC8669955C17A5A60137E9BB049825B65C2E005CBD49178A5C4DB4F9367AD6644259E03EC5034E7CD4031000F24C944A379A00CA83ED15A965E54DEA86507AAB0651CDEA007B2BDDADE795AA46436E09CBD5809B67B7CD7DB879EF4C000206A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B + +count = 35 +seed = B2FD7BFAAFB667C9DABE5915C3BC271EF41F18588666A6F4990C09D098E62DB590110DF6A56F08C5E0DE65B00F91D60F +mlen = 1188 +msg = E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED +pk = 67367C99EF4BF2D82FE6A1D67F48EDA9A153E77901A268C8A9A94B4549DD85EA16429B3E74D81FCA797A81E5B174E633677DD5F69E3A5BED02260BFF7F4C58DDD8B670BA5DCFF4FB66B0E2957E0400ECC6493CC4C06C157C29444CC755E62D1706 +sk = 67367C99EF4BF2D82FE6A1D67F48EDA9A153E77901A268C8A9A94B4549DD85EA16429B3E74D81FCA797A81E5B174E633677DD5F69E3A5BED02260BFF7F4C58DDD8B670BA5DCFF4FB66B0E2957E0400ECC6493CC4C06C157C29444CC755E62D1706D7675BEF536267746BFAD741EF64A53E9E3BF5D79D9ED9C1E70000000000000000000000000000000000000000000000F6357A9BFDC3F8F5F664712209FB682DAAA09F0DB79782B9C7FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55163FD4EEC9E805B2F2DFB49A42E1D87E94A44918341F59F4FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCEC00DD1429D206E037D1603D23E2F2E3E6221C3F2DF837126ACB6E97C7FB4C19328321E4B94491E6643F07D1B4D400BB909C67E650A4621CBD4F89B77DA4C1081ECBF1EE90D839E0624EC04683B19BD213C31110917180FDED33F309660700FD5DE0A98895B7107B10772771E4A08DD201A61B6C210C535923AC2986AEFD07BFE3A52590509B4DC8D405917E253F00AE82DFC9F9ECDFEF7AE41381E363600798B0EC1478F5AE861C128A819F8BA413FCA898F9B4CAA9F0BA87E82388AB4A00 +smlen = 1412 +sm = 5F1FB120254CAE3A7D6C6EF9B6BB071C8591C0DF1F9D518440BD6B6DFF600B462D1A29F1C93FDB8541C14B55CEDFA40566B45F00BDC808A7071110DD33581E060EA829B578046127C699D1FD323F98EB5700845CFF54B718A5BFCC363FABAB2F000077D2DE0699869F5843C4D85C1F2855C603B3A598A1B7F59503B704433308D0EF3C1BC294374A4B30EB7CA8F797BD5708EB0327F9B1AA489E08499715E4CA160CC1A3870D1DE1C1968B4900029A3C801BCAD9DBF00117AAE56CF7BBCEF89440D23E86C902B80148D9970D04EF350A0CEB23EFDFE89998E1082E991300040DE82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED + +count = 36 +seed = C08E846A8E039C8655651919A8433D475F494899FB617DC3B4715DEF0C992C195CE38158B7FF40E0684B30FD7E623265 +mlen = 1221 +msg = 743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 +pk = B8E9F9A0EB150608CC94B4A2BD8EB2CB923EFF312CF6109C0A2B3266838A6D336D3D5D86E95D678ABE10F3A89B2E51108ABC888CB0685971781EDD53E9E1C3DFDF412AFB20A0AFE71118C62E46740FB5250E4AB9F312019FE42B5EE6C5FF283D17 +sk = B8E9F9A0EB150608CC94B4A2BD8EB2CB923EFF312CF6109C0A2B3266838A6D336D3D5D86E95D678ABE10F3A89B2E51108ABC888CB0685971781EDD53E9E1C3DFDF412AFB20A0AFE71118C62E46740FB5250E4AB9F312019FE42B5EE6C5FF283D176F47853B90D539E55BA35B5D8081CFC220DA737BF58A722B150A00000000000000000000000000000000000000000000E6159EED862A5A8927E2753FA059A1017516447BFAAD2956D3ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9396AA0AAF1AD7BBE15128C734C402A7CB05C0F3932E50C015F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B0D5A9CA88EABC72C8A10F4A55AE8C26F6B5FE21394CA616B025B76A51D06E318047791EA06D08E0E034EDD04614F00E175ADD378956D210B1DC39CE5D477FE8FD93ADA88AD90F1B5D47F892AD3B61B9478E85759B66A5409736C49252CD100FA9B26EC9901D5F62CE1EE86221A834208FE0E54E9958262945B7DA9FD583B31B6931674C108ACCDE800354B19BA0F0091BCA4D9E290F6651BA92B00D26CA021ACF93FE75C231E156CBE095F4230690A861A929BBC42B94E8FBBFA6AB8A24C00 +smlen = 1445 +sm = B0FF334974D8CBB67981EBB9804079D7A9D39AF5F4F501238DA754B37CF9AE1F9C84A070E52544BD681D6F8368581E06E3BB4EB28AF28EF04D612F5EE63F9954DCB7AB6087A05B8F8BACE06B6B456F3F0FC121EA9FD93BAF41F998D80F8FFB3A00010E9C7CC01A91F6853064B8E2CE9630DB63894B395A2836C6018B3D115F16431719709D96D5C03507B206EDE3497F9325B100B2C193917A72FDDF1BC4DBF22D2747A058EAE77958141E7D0148994940038F2ACFF69FC724000C2D74770F4A81DFBA5362009A9783CDFF6E5F861C53C22D3B8B31F72E79477BE62690000202743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 + +count = 37 +seed = 1D9C060EA0408A068BD982D9694D39D02BA5A473378F6F9F09349F686566F331E767263FAFF5DC0E823BB6F648843876 +mlen = 1254 +msg = 3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 +pk = 2921130EFD0F72C45A9CC84E8B1DD2582010EBF53F3E4661653226F742B1990BA00CEBAC0B436AEBE5EEB5E5D26C8A306A996C1CF4D86C4E91F53658F1A15150D82B93667533BC53306719B0227B964B6316A2FAD1A5D1665533EB1484BB1B2A0D +sk = 2921130EFD0F72C45A9CC84E8B1DD2582010EBF53F3E4661653226F742B1990BA00CEBAC0B436AEBE5EEB5E5D26C8A306A996C1CF4D86C4E91F53658F1A15150D82B93667533BC53306719B0227B964B6316A2FAD1A5D1665533EB1484BB1B2A0DDFDD97B9B03ABDCC091B285C7D034D7EFD7AE4034F649C5F2F040000000000000000000000000000000000000000000060A3B4E8F5E1C5F65E4BCCF102EF43B109CDD1FAED40457531FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC18EFAD69334CF7521F23DA27CB2D0CE407297AA5FAFF85899FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C4C1962821501B0707C52F9EB306C4008E83AA111A53F20183639AD30B5EC155DA53751DA29D794F4FB7FE89C14C00DCD01E6BC39952BB5FA89E081C7DE683C4E20CE76D2E63DC7BE988061537F6C02AE1B619C3D172553B2538869061BF005D3ED65B86493C1963EFB78B71B9CEA50C9F3750C500C5B238D9FE950054BB750B1DC333F605C86B56DA9C0490DDFA00F1BFC54E8DE621FF4CA0F755AE83F7F3E718B6A102F457377B7B9DCF40BA7EA707056CF9E750D03A12878B2665D82D00 +smlen = 1478 +sm = 499F38692573F25B15B98B402DC33BCB867F93F8233B67DBDAC212477A48C006382231A9E5CC92106369863F14A0852C2C30DD94514A149CB47A8602CFCFFAB0C837AD4FA0C66539A2062A51E50DB78C112902C08678A6D7B44F8BCF808E1A4000003C73EC604BA7918B7636BE10D41C3F89D1A54D21E1AB3F8B032B4A47CCF195889F7222305A7B074136278073F16A80373B00F5024522B07F7B16A1E79BC7F3810D396DDA8ECAB676AEC90009F12F88F4ED03FEAE4995B410BAEF1533AACD940728AD3C00BC90684ADB4D7E0FDB9A2DD15D9718190FD5E5724EFD4D00020D3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 + +count = 38 +seed = A4563D09AD21D3916BF4636301F2E64183A8F003DA186753D7F2DC3BE0089BA09C62B8A52B72C2C8451213606801FB29 +mlen = 1287 +msg = 67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 +pk = 397560AB6EDE7504CD531608FCE28B0F8D6AD2DFD16E89D13333EEA40E4723A031E761C531974AAF1438764FB7BD7512178B6C32800395D9044ED277A6ADD0554F32ACC63B67A5BABD5C6EEFDDB4D51CC83616477E048506D161ECC3644FB01006 +sk = 397560AB6EDE7504CD531608FCE28B0F8D6AD2DFD16E89D13333EEA40E4723A031E761C531974AAF1438764FB7BD7512178B6C32800395D9044ED277A6ADD0554F32ACC63B67A5BABD5C6EEFDDB4D51CC83616477E048506D161ECC3644FB0100637A071DA1B4575848B08D28FE2EECF71945CADAAF719A7311D0C0000000000000000000000000000000000000000000084F09C0B7324B4209123925970C58DEA45EC446CCD324ADE05FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33DE2DC0BF51A3403446DF89E0CC119C574DC27C4B66A7D0B0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075B5A01E8E9BF53CA7EC2AEAA8E80F521A47CC0D03C4EEE78161B93B25C09AC2382CD1FB5C47BC1BA8DEBA4CAE0A550037D728A3FBE104F026BBD9598FAF0C7F11B53DEFBFB92FC9DF41FC3848B197350C867BA80E599511779B52F7E72DB5009E87345E7D97CE1BCD3F8842A7DC8B46FBABF4078E1F0D8E915E7DEB7CCEF8375CB75E31659E3A9A75C3D00658881F00C3C06618C319213C1F30D206976E77799D91E5C6845834D56B6771EC142EDB60CC253310700F6D6C5BB98847368A3300 +smlen = 1511 +sm = 204C2F627751E7F7A63957A6758F01EE7CA9E290EDEDBE6FAFCD8E6EC1B641D5CC64A514AA25285FC853FC86DFE3D037CF76B8DE85BCAE48D3AFCE0015EC8818B00683AB2F594A845C0838214BF4A678572C1EF85C9C00CDCF0C2DD73E780B0E0000595DA5464350BAD046C36883E46D5F5B5156ECB220599F8403C25D66AEBC7961956487941818D0AD8B9731FEF4E4BD59140087EABBDB6DEBCC5493502B5036F22CD915CF724AFFF822B702199051A6E643256BC20D001574905A290E2D0D253235F57F02F767E886D224F870C318413D62DD6259DAEE2648689959000A0267109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 + +count = 39 +seed = 811A8A2ED2917CC616FAF246C5F9BB902E5FBF5430AB078AD6CE871CF8C160512A748216EFAB3A4CE1271AAFEA12C11B +mlen = 1320 +msg = 061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 +pk = 45707F8AEE3375EB8343A5C0A577675EE06846B49D9D679706AB484A265A8F0D6F2EE4B936E6C5A7CF575569B715832079C77D46D45CB4F062928EB229E79F3F76C307B22283C028D332AB4C6F4CBD106A9ADC27069F262C2B764DC107C30D2D02 +sk = 45707F8AEE3375EB8343A5C0A577675EE06846B49D9D679706AB484A265A8F0D6F2EE4B936E6C5A7CF575569B715832079C77D46D45CB4F062928EB229E79F3F76C307B22283C028D332AB4C6F4CBD106A9ADC27069F262C2B764DC107C30D2D026342549D3FB3119C77E54BD0FE9FCC32F08A5A1DD84CF6ECD9040000000000000000000000000000000000000000000074F15D15B778DA066D134188B6D1FE5CC7D3AC29C409FDC4D2FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FD708C1FA6DC2883288FF636B8A185C5D8B4D6A1C7787FB98FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A95BECA55426E82F57DD95F70ABB2E850870DEDA5573504ECAEC399368AF45C77458649A91455E9DC93F4633C23BF005DFD9294E0FD6E824B23384ADEB315BED9389D9F65352456061910F92ABC852EF9D94A398C780655724DFB218AFE1900F9131F4935DD3EFE067B5EBD1A0A7255F1A9C299DE9023B9BD00F9101CADF6D70B212A4D915D615F6EF7A3602DCDBE00E0858AC902AF496A781A7ED9B5E843962EC6B198ADCA3EFA847F14DCCA7BB4736A1139273ECBFB5521FD614D9567D800 +smlen = 1544 +sm = BA90B3C924340B088E4F12AC1A4503D74FCD95D27558455C8D151F43A95E7C9FE91F3DB09B9B4CC3AF0620D5A709F810DB62B59A39AE9BB997C89CCB85760FBBBA614998A99013F190A6807AE52C755CFE60E4F3D9CEF1068ED7452B8C489F3C0100EFAF46A10D02FDACF50AAC3E9AFBF4819C1DBF9A70057F4700DBFE2D2B260D1E25023BD16431D661365108BA9EE860435F00BE8909852CCF63C800EF003FB409C9DB8E45594539582755008DEA56EB895F46CF7AC870C01184D2CDDB7C2EC902D9167C00CE4237A46C34E9D073D1E869149D179D6A3D78C5AAC400000D04061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 + +count = 40 +seed = 41CC9DB2E90239AB5158A2628E7478D0B3512FDF84CD27A4CA5FE3119A455C22045F198C3C5C39F491FB975BD1CFF7F8 +mlen = 1353 +msg = AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 +pk = 31A17EC2473FA0B9A1305A28394E92D9264AF21017779C0B849D635EED965E658BC0E83C24BBA14BBD58B8EAF9E6E0107904D68EB2CC61F8DCE6442AC19E63A8B8C4974D67C884C80CD4A62DEA291CD7D66A98048DA64A413A24A85D8B363F3902 +sk = 31A17EC2473FA0B9A1305A28394E92D9264AF21017779C0B849D635EED965E658BC0E83C24BBA14BBD58B8EAF9E6E0107904D68EB2CC61F8DCE6442AC19E63A8B8C4974D67C884C80CD4A62DEA291CD7D66A98048DA64A413A24A85D8B363F3902213E557BEC77F3A3C5BFD846A6B7024B0CEB95DEBD3D15D9DB0500000000000000000000000000000000000000000000B692DA9A5BCBA7657BB5F1012524260D8DFED868A133295334F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15FC14BF77CA6477DD10C5109FC7FA21E677BBEA707E441F61FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021ADA029475C57CD0CC7F737E12E05A6D622A5443D6B5566B5F58442266411CB41C860895A0CB1760DD4608E6BB01A009DD2CB03E6C63BDDB50C6DCFC355E5327060A1E86AC90D6EE5BF3537CA4FB9C3DD7AFAFFCB2D8B7EA9277B33A171B800C1CB463D33D656337835CB34064E4840381E86938C8915F6E5F4C359A7B8548B64E11DF0DF67EB1F07ACAA3F3568B500C43A72BE7E894F743218F2F29D846E5A03313D6253763C5373A01854B12F2377B7600CF960601C96129FCE4653764200 +smlen = 1577 +sm = 514EBAC64305C83AD30FFE55E0F6A94AA2CF6A7D94723880F0DE9502E565F095B809FC2D9F0B28A9B0D7C37CCEA4C50EDD54629E4F8B8F6E6A81F3E28F21A10A8448549DD6571387C1066900113277C6EF219D33F4B00DAF397F028376EE851500009EBCFB4AFC8C56DD4E69C65A1A6D8482DDB8E6DAF7A92D0B01B7A42B1E84A4E41ADC49C4B100CD5827F0DC7AE605B5156603F3ADFE4B130F872C1862E51EAECC4A36DC496D3FA2F1EDDB023982FA5826E77090B6C9158F43B7C53E2BD1EB4E45C2E7A500A2F2AEE252E8A15AA03C1AABA424CA94CAD00ED7B249EA00020DAE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 + +count = 41 +seed = 1C13369824A3FDD41B1065E17297574715D9BD9CE5BB733D36D22C31B62BB1033989A604D78BFB1A0746BD4A2271FC0C +mlen = 1386 +msg = 9D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 +pk = D4FA37FA9097DA63398E22E0BA526F599E9FE78101BD0D96EFD56656B502819D83542098F700BD53B29B03E41C5BEB07F5E6FDCB0DD420300F3B52F2F38C6B9E42662B6F31ED140E09F66F5CBF8AC84989F5B01702F96766F541006EE620200515 +sk = D4FA37FA9097DA63398E22E0BA526F599E9FE78101BD0D96EFD56656B502819D83542098F700BD53B29B03E41C5BEB07F5E6FDCB0DD420300F3B52F2F38C6B9E42662B6F31ED140E09F66F5CBF8AC84989F5B01702F96766F541006EE6202005153D1159900C72A27A433CAB78DBD7A370C1C5B0864E23C40BA00600000000000000000000000000000000000000000000245BF65F769A7754E273B45EA9E17E69F498E29627F3B8E679FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51031D36BE172692D1A951C08E75989FC526B7D4FA5812B862F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B57D3C7F31F61E7CF48CDE704278BEDB5C9E3D614A029F465F5058C599721EB9591951E447F836A87BFF85B6B7A5CF002AD5858F66605D4F32D6A80F0D607D8F997EC2F1169F7BB4817460BFC7CB03B468D53875EA464FF73395BE7BCD22B100BE763A9E986ADD39D2884CA2CC66F956EB6E5B9597EA689D76D7A8FF15805BD5D41BA993C0A0AF003DE3735EA3CDCB001328C2DB62A944FDE2F1A2E480B89905877025693C78E48A93845F2D3489F2DD946FAF1173998BE735F6D66B49C1D900 +smlen = 1610 +sm = 835633951BCC54106E63CEED3CE93CDC8BAC24AAC4911E1D0D1666E308BF2B2ED669338636918CAE1B7A755F1D6E1612548FC2B7607CB9440BD5A258491FC80A2DBD68B7A803B3DF921D56F96AFDEFC3EDE391AA9BEBE7A076E635E267383F1600004AC5EE0CFA86ADA7C900AFF3156989844F203C427B518AED00F784CE6F98AA8A3883266D74ECDEC02FDF1C025A41F659EC00237AAC4CC250E90158C9797966CA7D7CD12A736EEE7CABB002885B64A606440419F2D1E4A99EADDE9B2B5B7CA702867DCE01E1EE25F4DF4554CC84D82CD25A4BF16C85A88CBB6FC0A9000D069D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 + +count = 42 +seed = 7AD6C7DF00C9E52A75290D28DA946305D83CCF6DE2515C19A8E26850C34C8C2E545E2E32108F13B9C97F87AB68D10131 +mlen = 1419 +msg = AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA +pk = 59B9662666C97220E8ABDA8B13B6BAB4B9A1FC7631254E89695B9F98192D0414570E50C7DF2BBA044981CBB798D3EC261D2572D1E9D38A704C86BAE221F26B31206F23AC7D6B15178D4B001F828C7A7BD8851C8EB7847711EAEE20575844AA0906 +sk = 59B9662666C97220E8ABDA8B13B6BAB4B9A1FC7631254E89695B9F98192D0414570E50C7DF2BBA044981CBB798D3EC261D2572D1E9D38A704C86BAE221F26B31206F23AC7D6B15178D4B001F828C7A7BD8851C8EB7847711EAEE20575844AA09069370A9C05739638C7F3E2EF0D7DE13A66693FF7196364285700600000000000000000000000000000000000000000000A49DB83FFFDD2ECFF140F02CF32449E827B4E4F376F6070D03F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37D15EB8558C696301451AED57295850F208C6D15B3E3F0304FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F34BEB6050408DBBCE588B3A85796B09975A93A1426428C5D8ECA558249A90F9E65C49F0DEC54BE5A7C37DEEF016C2002F26AD18B6B29717BF4884B085D844A85D3624889B3730976385C78762797EB592CF2BF311F723F83B3893848B12CE0042BBBFF2834A784B23FE257285E803CF4D273E616350039643F45B4D24C9F836E80A0B1A74BA5A695CF94AAD2094D900214293179EEB81C09B989CFB78365B9C8D4BFB254EEF73CADEC6733651C16A1FAA5E0FBEF77256BCCDACE6E80DEF3F00 +smlen = 1643 +sm = A783A684F8495282190912FE85629AFEA029F74D6CAD476E240ECB3D2B9E0A0D5DDE5A164430A9153313E3BF33FEAC24C99BDFF7F05F8A0A77E4A22F64B305F1FAA5E454B5E15EBC5F18737BD389BCDDAE21380F1B9F099B73DD83C75B86A2170001D94E2BCA15C4393D8974BD4DAE3CAE7DE12AC906EEC87013013390BF8F4F54D2052496B2244E8CEDC17AAE749AF15FCF320101FB9570C35AAE14E2C8AB981B9294348E279554F49E0B6401C94353D926854764B72B9BA4D90AD843DC31EAE4C8DC3BBF00048B732AECE4AA01751A26A7EAE16083C0CDC272D6619C00150DAF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA + +count = 43 +seed = 38FFDE9B60DEDB5BBFAD6C52AA02EF6D49369BF276C99E588D796A4F260E0FF0A65C96C35863BAACFFD9B212EC305E7F +mlen = 1452 +msg = ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C +pk = 57A40ABD295109D27E407D9167B09BA5333E6D16524CE89592F2AA012A7B86A3224E2D2956C5C76C7C0B7E94D65C4309A94A019E56E69BD47E2149F3E0C15ED896C863DC9B90489DAAD31AA267058B55F6B140E06B9E110A949F0C4CE78E740302 +sk = 57A40ABD295109D27E407D9167B09BA5333E6D16524CE89592F2AA012A7B86A3224E2D2956C5C76C7C0B7E94D65C4309A94A019E56E69BD47E2149F3E0C15ED896C863DC9B90489DAAD31AA267058B55F6B140E06B9E110A949F0C4CE78E740302FB6271B620CB90F69AB034D6F771B9174C55DAB8887B2BDD570700000000000000000000000000000000000000000000A833FBEC7DF3A2B945A1A07DA1C6837A1E327D06658EE3B156F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34570E12533DE7871B6EED1E966542C21FF93C894C301BE3DF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F6B785399AB8F42CB622B2AFC01C7D0BD38CCC0758C12777CBA0C45C70D60460F2F0E8F10AF2E12A9CFA4F03EF67000CECFC211115DEB7BD482ADF91E9EBEA383660A52BAB6659446D423A543F6584BCA426AB1BEBEE2EFC9D012D8F1984600F7416E2F85691F47E147856E5464277B08936A635D3BC1FCF0800BA3BEFF5339A0BAF83B0AA1DC48CA51525AA0A23600FF74F3854D3BD67E5518260A4AFF1B0044D98DD24247E5BFBDF9059C93D74AD62BE86D2F28B8CC0348707D78F02D2800 +smlen = 1676 +sm = 1AE3BE4C79D2DBDD763FE1787523C43AD3CB52409EA00C5702A588E0937FDBA5E44CFF5ACE9CF672BFFFAB72BACD1D2B0EFB69A57431D673692964104A6F5BAE19F07902D20F69E851CBC72D2DE219502469ED5C12F1815208D2EF2198B9B60400009B4AD63200D0C2E432263EB025B57651C0691573DFB151F503549451DD530EB6424F1FD24C7578B27C5A8B93435115D10B0215DE0F3E3CEE3773A5529F07392B2E2CA0FA8EAA5ACCFD410077FDEDC1CA593DAF6A3074CC96DA258F9391A2C33AB05FC903AD24286F0AC906EB5FE97799F87D4C25377B7CEE6A7520001502ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C + +count = 44 +seed = ACC98B16DCC9A50EF57F332D66255CA56C2BB679CAE705B4297F1418DA845861448DA6CC5CC458DE6C6E96128EEB2898 +mlen = 1485 +msg = 96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 +pk = 435E5754639352CD27339DB833A0FDDA57CD927F9BAAE4AC87B002AB44E20DEE35BF64F1D5DFAAAEFBED70E91D6C7A08A62EDF576FEEA49F40BABF746BD71EBDE77176439F2290EBFCA8449F98BE6A790A66AF5A847E8A4DEF62D0AE4B701C1B15 +sk = 435E5754639352CD27339DB833A0FDDA57CD927F9BAAE4AC87B002AB44E20DEE35BF64F1D5DFAAAEFBED70E91D6C7A08A62EDF576FEEA49F40BABF746BD71EBDE77176439F2290EBFCA8449F98BE6A790A66AF5A847E8A4DEF62D0AE4B701C1B1581A5B52F2B42B464213C505F85422814D6994FFE01FB721AA006000000000000000000000000000000000000000000008C5E3B09EC4449A303B65BA0FEB5BA850415278F6160BFF007F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF59FE7C600C1DACB75702BA7BFDE175EB840C66273FAF23BEF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A30A4E556E8E8C3767954BE6C6AD63773F828D295607162671E5EF32C598F25171030CE090852D210641966863A6AF0042F67271BDDB1003690360C872CB4DCAA77D236136EF43579DB56EE7F8AB27F6FD35D5470A168425533B4EC0A6BEDC00C4C8B1DB752799203F1B2D0C32B4EF2644920F1443BCDCDF9F8451604AF1C81F47B99B1CFE329170159C472E7E6CA000817B2FC432E4A4B1561C9C53D665F33700BB51B4FA4E7D12228A549FADEBC40F911426E187FDBA78B1192EE3521FF700 +smlen = 1709 +sm = 432FE3547B2730E62911903784D6F30564A3860FAD8FF367CC6D61F68CFB8AE6F384F1995FF315B9721D1D46F3B2F40C11C7FCA1FC4D06998AF0D36D348EED4C3BCB9FE033F9C65FE4059F443E1B5A15ECB88BB235BC2287DCECD350AFB02700020151032218F8195D0BE9B0C96635E66D134BD9CC0F07E272B8000A477227E2AE15722154A69E2C574A2EC6D93F2FCADE194700EA701209BDD7A21F3571F2FB837B78C6ACB6ED4CE3B275D6005285F28CFB81D107171C839CB4E5EF54C4DA83018449903800DF6CCF98B35B858CA8A8CB9217D9D463BE154C4CAA6E9100020496E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 + +count = 45 +seed = 8BEA4E384E73C7E0B47381B3063334291A0F06D28DB61B5BF65B01D0A747722E0AA62B81AD46C00C8A5C31494E513836 +mlen = 1518 +msg = 047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 +pk = E5DEA097D250D5180619186B8388161DC55333B32C729BE549CEC3F42643B7BEE09CEF8205F4C2314BA0DA834FFCAD312D7E8B29E182F400547DA89A0A97A110F13871ED5DB09D9CFC17F1DE84E1FC11A4C06C982A5674EDA3FAB77F8C2D380C15 +sk = E5DEA097D250D5180619186B8388161DC55333B32C729BE549CEC3F42643B7BEE09CEF8205F4C2314BA0DA834FFCAD312D7E8B29E182F400547DA89A0A97A110F13871ED5DB09D9CFC17F1DE84E1FC11A4C06C982A5674EDA3FAB77F8C2D380C153995F44523ED78304BDBB14CD4B42DEF72345FE1F47BBD451F0500000000000000000000000000000000000000000000EA3972E6816E1E003AEA67E6A7708F07BBA34B01060D89E731F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF257B19421F023958D7AAFE96E6D64CB172F8F8A6FC9E0AF07EFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006DDA29EE3FD2DE634767D2E45390AC49BE317870262BEE9764A3DA27F51DF1515765CCD4D2A714D451A8C8D282982400F66F7C82FD3B0C04B2364E3EE757988C043B70846AC3EC9C0DB74A274640CCA87EF2D638A372458C0F9CC04C2742A300FB09E77B2BD2A1C4D78D6124E9E523384FF0F64B231D3C810FDB6242F87F98C98B85101AF78141118BA1756915EAF60009B70744D178780C4DE26574C4F6BF537F5A8E9A5C29CFE2C4B94682A19EB76E2132C6DDA5B1D860AF05D04FDDE43300 +smlen = 1742 +sm = 56DCE881EA3598D49FC29CAF0198666A463B15CF322DFEFCE3406F6C1B8AF0B50F76B7636F9BE09E6D2113D19EC0C006B3731954DF518EC9DB1844BD3A3DDD139ACA1971CA501243BA89FC4C419E66E6ACE34F213A6A78A5D89928B26E93BC0001002E9129B678A5AD6515EAE1AF536F73BACBBEFE51B6699C8801CF4E150535A3CC085EC89569A305179EDC916C02789FFF900123835D17B906C87C82A1C12358555614AA2BEA5B20C7B63B013BAB3D54FED5C1653E705ED4EB8A914E259CAE88A97E983E01C56A3121A3199F1A813E19041849C8A2A03CF78082C608000D02047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 + +count = 46 +seed = CFA713E4A63A6FFBA43BFB898956DC400507F68AD164C3D24A67B5F8D7548C9DB44DAA43E5E4A0990325A4233089318A +mlen = 1551 +msg = 6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 +pk = A955AF761E87312A72EC6AD8EC29E3463BB3805210A2C7ACDBA50139190EB6A18B0CFB2545EB05EB7D775C68B394D91C6B6B0E85863CC3ECF95CC312B97893CFF52E017C96E35CEE67B105FD539F3393AFB499CBA501C74B6CEBF9432964663B04 +sk = A955AF761E87312A72EC6AD8EC29E3463BB3805210A2C7ACDBA50139190EB6A18B0CFB2545EB05EB7D775C68B394D91C6B6B0E85863CC3ECF95CC312B97893CFF52E017C96E35CEE67B105FD539F3393AFB499CBA501C74B6CEBF9432964663B04E5437A905ACBCC4606498C8D77C6437EF692ABFA2DC1E102F00600000000000000000000000000000000000000000000ACE7CD6EFDDF9C6DD48F44863F3E2222FA4FE3692E5C93C57DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65D28FCF160DB874209918BB92C039A710C073C9484437995CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2159970E20843C86EAAE2434AF83722DD2BE686D559EAD471316BFD161AA9693967AB113F4A78C441628BB1F45A910083444E19428EF4453BE42EEAEB103F8737CE0CEA8B81D55F6E0EA017802B406991B7808F74449046DF7DA65CE73F4500856FC3046F45F74F6D84042D18FEA3E9ED903EFA9C36C9A13F1B68F5DB7CE540D1937B62F7C20EBECE6F411910F81600C796209AD39A0402C784F564742882B273AF40D3E936AA4D5A353960C31B812F3549EEF7A592648E5E7EEAECC9C09B00 +smlen = 1775 +sm = 25A355C4F550B69320655D783DBC3DA2D6816C508DDE663F697155141D08AA7D2DFFDD6DE678E5CAF3EADDD26FB8950DF5573BA5834354174F92453E7257097B6083447A3E8F3E4233462F21C757C16664C9C52983EC7AD9C6BDAEDD3A98051E0003D53D474CFD10293E09823298AF4C864A20408AB085F89A1A006A796FD82DFCE17A6C93F147A486DF9C316622E5FCD00DFA01EFADBDE435B1AD633545CA20901C20260274A944804B198403D64BF7F21CD6115DE3F8D57BCB6BCEFB4D4149C7DF8E5DD30052FA8BF55139987B5F54A9E09764200CF08656E7940A1600020D6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 + +count = 47 +seed = 1F3193EBC58EF65E9E396D69220ADB8ADC729BB388A72CEC9028A094F1CBDED21CFB0C41356AF31E0CF66A3B0D843666 +mlen = 1584 +msg = 139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA +pk = 6481BFA821C24449C29629D7962FE50F52D472F586AAC852A68AABA5FA47879CCDE3879743FAD38D5E8C049CB2719318F127C3CE1E554F48D8FE497CA5F89AD8263861660843A43B7CF46E50685CEEE611AE3DD2343460A69C734A22513BFB1617 +sk = 6481BFA821C24449C29629D7962FE50F52D472F586AAC852A68AABA5FA47879CCDE3879743FAD38D5E8C049CB2719318F127C3CE1E554F48D8FE497CA5F89AD8263861660843A43B7CF46E50685CEEE611AE3DD2343460A69C734A22513BFB161747CEB93AE04D1395EC2525F32F173CECE3E0554CE4E8EC5BFE0100000000000000000000000000000000000000000000089E336C944444DEE358236BF4CEEA927CBF2C66BEFED121A0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD3552023E5FAEF5D4326DAB056EBA45F5660313C902C395F9FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098378A2E2FB6626C13DE2E93800C12CE8DA40417988C90257EA303290C13BED16D28B05087980FFE90F0A2CC13AEF00001F7F73DF13FB2A61D6E356837453C1FAB99ADD39167556A0800D4193273883ECC0F2073D2113EEED9414F6122AA5B005F0A0E16ADB2F10FC072AE8D5064321DD13226E9274D9CA40ADBC9EB1BA5AA91DAC65E1FF65BF386D42079D9C749B500451F839D82130F7C5C001D03D6F8D9E48A84138804E8A2521A378D17B6F287FD67B1F78D97DDEBEB49F7E744BB1ADA00 +smlen = 1808 +sm = 4FB40B09EA54A59A9D5F7C036680864D7210A289089DDB0E1DE62307B1699B2AC9DA87E982290089B6D19601F111BB27CBEE508B16A913455F0B032D027EDE028A9E414531ED7203F0DF8B406CF7D318918CF0A4BC746B4476FBAF9EE3F6F1200002E76B69531E6999CF4409EFD6AD81BBD15B64A1312940133D02F6CAFB1F7C69EAA0634825415201BA164CCF0D221BB0D107036DDA9CAD3CE297DF74B3921BF0531C9A480EE7EC2CFD11550176573E50F1EDCCCEF9C8E51D682C166FEE8D8D8B7926D3CF00FAB28C9DE1BFBE4F5BD9AFCDFB01B984EB42B1AF49A520000215139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA + +count = 48 +seed = CF5A04DDB5EBC45328F703D486D24443A7692D65AA55F054E3078DB76A7939590A3F35CF1A21E82A845445DD1B64A85A +mlen = 1617 +msg = EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 +pk = 85398A4C3ADCA128CFEB81A9791072629000A6D06BDC7FFAC6AE031A89C1003F9F6D6B7D32214F39852F1C61CDDA1E3DAC74DE1FF220E3AFC171FF5D59A9BB22529D2F37C1089B27D1265CB63BC3F5EE93B91174F9B593ED073680EDEFFBFA220D +sk = 85398A4C3ADCA128CFEB81A9791072629000A6D06BDC7FFAC6AE031A89C1003F9F6D6B7D32214F39852F1C61CDDA1E3DAC74DE1FF220E3AFC171FF5D59A9BB22529D2F37C1089B27D1265CB63BC3F5EE93B91174F9B593ED073680EDEFFBFA220DE9CEE17005E3C610FBF44C2D44C8FEA5CA20012ED7A01AE9CE0300000000000000000000000000000000000000000000F6686DD1609DB44C74210EFD6F07DC3D7CCAB07E1EAB7E9D3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDE774814BE8CAA2D0B1369FE4E808848909B60961FCB71E1DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FBE22318E11E8AFB620C28B0019980CB48B415BB84DBD19BAE2348BAA62098621057E3F7086D286B8BEFA202E70AC00497F5974BC3EFDD7A8C33164D974A8E3EEF95DCC33030C07D95F11154DAFEDC8147B7DCF305F5F6ACED3D306C30397001F6917BA47364519267F78D0336C03179B806102032695024C595B6A4639D3FA31EE03A97EBAB5D0031882F886E90E0026DABF91F0209766307B980B06CD6D920367244B885542345702C300C8EC19B1A49C20A4D5F90BDBBCFA8BEF9C9CE800 +smlen = 1841 +sm = DD2BAF7151FAA77A5DED54A6F783B93861B50BD266DCB199DB62A8DDD88A9F1F87F1B9FEED60B21638A42EEC53ABAC2EFAC274F54475FB17F2EA2632F610301D75C79C990CADB8C0EC40CCBE2F57A9605A9C8F6BF1D5E8B0104D78995F658E0F0100C62862D59667F95226FF817693DE57E79FD8410398E76B0600D5650638E1473BAA4E4FE03E693C4D158034B093CD2C58B5019D2BC9AED53E1850002C1E648E8EE7F0E42008EF19FACAB4014F3CC6138D3CA44781E6A061DEC2F11B092442F2CB01B7C7013C901EE9C0F11EBBC827BD423F4F95A862871D6DC5DECA001704EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 + +count = 49 +seed = 8C3D2FBBE0D39E293AF2D2CC5A9BEDEAAE3752DFD19CDC1E186D41E717A0412AA429CBDF005445AFDE684656B5D17690 +mlen = 1650 +msg = D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 +pk = 34886577EE113E52F8AC7E2611ED08C1B95B85AAEB58E97CB9A56EB713404F92A7A7231F145D7F213AF533015E1D630CD0561689C91D3CB64F4B2045FAC04049EC76659A5A0D1F692437069E01C1539FF595832ACADFFFB632DEB8F1CB200D2F17 +sk = 34886577EE113E52F8AC7E2611ED08C1B95B85AAEB58E97CB9A56EB713404F92A7A7231F145D7F213AF533015E1D630CD0561689C91D3CB64F4B2045FAC04049EC76659A5A0D1F692437069E01C1539FF595832ACADFFFB632DEB8F1CB200D2F177DE1C1D3C7C9A0DE90BEB4E2632F556F57D1EA86BA1CC62E9C03000000000000000000000000000000000000000000007092347C4754EFFD516FD4495EC7DAF495E8AB806D4EFE33B0FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFB6CB4556C96DDB986F26F0DE40FBFFDDE660C14DD8309F3BFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098E55FA3277D954DA53D3B7F9382879702F93FAA637B40CD5E25172D346F8AD3808CA7ECF35763B28BE244087BEA5001346075F5B75056301EF3A0686BA034EEFB9CB855E987D15FEC371D909A3FE93C7667B9DFB4719A0C20F7A1311422C00E371691A4ACCF964D9AE05FBDFDA2F1080192F4A5E1C37AED2A842D3DDF6BD3A48000D9753EB647581424A494E5BEC00227F2E9950E38F810D9AF54F109D158C842880791257B51A548106592E22B98EE243B9B5CFD5E1831BC55D1F1FEB0000 +smlen = 1874 +sm = 363F534958109D359ACC34F77C39FD87D3ECCD7B771E2B5E6C8BE8E46FC61C80E9BE428C726B44D37E07B042658F973B54D9CFDF03137BF5B99802294C6B85917E93F07F0051E46FF86C04AD9103EDB153B9899D83CF26C3F8C35FCAD87B0A13000240C3BA81E87C9A422293FD610DF8BB6FE38789582FC7378401A50D41B59D8F2A1632353A3D6F1FE8BF6589E938EC05D00E02243102DE3CDC3833AAE5B4B6CDF9FD3A88BD1A343603C84D00C95F77D83C3D8F1169D560CBF7BB9C0C8E50594CEDC8ECFD0095AC86878FA5C341003EB0B16D887E17E12D226BA8E3C2000D15D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 + +count = 50 +seed = C10427EF0B26328163F85D45E22EC5215415326F013FF31EDD58BD3E97B1A72FF07D275D4C1B517F4661B0638F75640C +mlen = 1683 +msg = 4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 +pk = F53FECDB1474FCDEFF1CB7C350866CACD773A47635265192C9F27764B9E8EB9BD143AB543BB2F58F01FF44413BE4C512E6A557189CE005F96DF816D8709F05BE871D65A86C6CE7D938AAE53D694869E57BEDC2B6421A300E905C98C0D883143F04 +sk = F53FECDB1474FCDEFF1CB7C350866CACD773A47635265192C9F27764B9E8EB9BD143AB543BB2F58F01FF44413BE4C512E6A557189CE005F96DF816D8709F05BE871D65A86C6CE7D938AAE53D694869E57BEDC2B6421A300E905C98C0D883143F049B9DAD540C38DA70C2EDB5A5417AD89CEDC6CA349C5325CBA80700000000000000000000000000000000000000000000DEC734F91C9E1068FD64D3A7549D88BAAC450AAE7EAC1493FBF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D57147606396DC9CED6F61637F874C5C4FD22A71CA6A3C70F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001D86B2BF88880127F1AFF1061CEFFF2033854B4847A927060585A045ADBA33A36D2D80F05ECFA987CFF50A5A73348A003AC52BD4FF75894D49AC021623BC7843E38973CDBDD100527B37736319EF039F74AB2D389BE10FCFAAFBC93928892200B852F3AE45E8D82CDAB75BE03677D4DDBA80835C5DE880D88260499F0487D250DABB4848B421299BC84417B17EACEC00E3A92746035C28DDCBCBE1427285DDF4D252EB89316AD6C797532040D46D7CC0E9D6731C2F9E3C5ECAF4940E0790F500 +smlen = 1907 +sm = A7E57A41BFA1C7EC585C49835FA217244C38D32AC81922A5B69996C73E9CDBA200DB097ECE7C3314B194A44567C18A3EB16E0102A4248AB574847A045ECA2357ABC4232E118D130D0934F760E0485D915D3AFEE5FC40F27843F62B227F54BE190001196F0D833B58273F33DE989FEDAD9E0108C20E93092E08440396ACF1969F5771AA138AB2BA91B2EC51197B9F3926E6436602CC0938D95921EF83538B3447B36DA738B68217057D0DA22200CEFCF5540DF789DB57A9E0EA23AD119AC2C6F8A64D3A177E00D22B864A436D9E63CC56329E06EBAA8DA86EEE3B7A9F1700021D4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 + +count = 51 +seed = 4B6B73E042CE76DBE39535E45D3BB2F3B9F8B2BDA170E76CC88666844703E32B2367460A0F6A0A2E3F4E7A6CD32BE998 +mlen = 1716 +msg = 0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 +pk = 1E170339BA8462FD5BB229C4686A0505BB32B80D033008EF52A909C0CFF676BA600B775DDE58E87948CD202ECAB7892131F68E3C129C2729D32B5888F987BC855FFA98C9B1847FDDAD92B264CADCE85A2209F393F981D7FBF038A782F885CC1E15 +sk = 1E170339BA8462FD5BB229C4686A0505BB32B80D033008EF52A909C0CFF676BA600B775DDE58E87948CD202ECAB7892131F68E3C129C2729D32B5888F987BC855FFA98C9B1847FDDAD92B264CADCE85A2209F393F981D7FBF038A782F885CC1E157BDC0F0B5EA329E9877183204B03241ABACC46DDCDB01864050E00000000000000000000000000000000000000000000C2F4889E0616D1E6061D11121B71DB22F68FD783F17D291E20E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA71ADB0FACFEC0349DBFF8E11A37DDB0FBEEAF281FBA4668BFEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035463D1BF400B952174BA87E3083502354E0C47D2B61305B514B651D456F2736867AFD1F40AA1E64AD9073B5DB493600EE66357DAD4AEC0F270E8BBD271E22B8D36589974475218DE5F05C434B65646E7B3B2F4C9F6AB9D5ED0CB37D486EED0021279D58F98CE5CE84D0E1D5A804DE157E94130699CF94944D2C2D3B79ACBCE1108EB32BF631E677CA7C28572944A400D7C7840D07CF4DCF28906E5995965A51026BCD10C828D244E4BBD5B42AAFABBC0AFFC00D5BED9031A5E2BB23158FC100 +smlen = 1940 +sm = 214171747CCF19263631033C3D9EC02B214A620509ED3586ADEEC8E74468F812FB2E17191B084409BD1E78E3C6A798150888ACC3EB7D15FAF1EE4BBB00D93A899E1289852AD95F46AE393046BD0F032B61A2059D20E4AF692987B6021B9050300200D5588DB08C3E6BD4239756B38B92733BE7944AFE2ABBC84500E9C031CC9D3969DAD6354A0E31F5315CD3DA0783DAEC3EC1005C343DE21C312D1222E28D4971B7C45535F740B27A8F7E2B00BF69E5962B3E4D92463852E3FFC5F5B466DB614B4C94A8AC0071473F5907B76A07A7936F326A0CEC32D640B5086618AD0006020BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 + +count = 52 +seed = 3D4607399F6FCBE074FD2BEAB1A7571239D6BE6308617866B65B892EE65399E14DC7FA612CDBC5F7E23116FA86C3133D +mlen = 1749 +msg = DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 +pk = 36F79EA00035C13ADF1B9C61FD411125630510F1AAD74C4951EE8ABC7E49F5331BC18E502F5FF4895DDC4EB1A139E4216B64F4CCA988E1BFE6E09BA2EBC24DB53967824D5A5E1593DC35434B7B2CAD3755BBA8031F2C522506D8EE8C714A231A04 +sk = 36F79EA00035C13ADF1B9C61FD411125630510F1AAD74C4951EE8ABC7E49F5331BC18E502F5FF4895DDC4EB1A139E4216B64F4CCA988E1BFE6E09BA2EBC24DB53967824D5A5E1593DC35434B7B2CAD3755BBA8031F2C522506D8EE8C714A231A04E73807F26E4E90502097219D6C3715D04C1B6AB5B8161774DC0600000000000000000000000000000000000000000000FE0374BC8F65A80FF8492297EF95467696CA7BE577D4F0235DF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05345C1D772296D7B4EEF5CB84F3A4C85F2F240EFF2862A583F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C3DDA1EB695BD01FEFD205C4274F0478CD06B21F6BC11A98896A0EF43017D36F7FA8B81D49FF83451BC9FDD06CE26E00B82118AFDFEAC7A70F607E0CCB1E0DD782C13E81B039819B2C871A7291DF6976A073BE08CF6EB1020C12189F3A1B1200675B0FEF4D12E25C20C0FF298612D298C8FA2C4C339EB86604568EF62583B684E71D6991EAC6AC046C67257E82295A00C7D65D31DD13296CC7DD78373D51E5D7F5F91432900727F4F9DDF3E773C0986E4AF1F08C736E9F5E10ABE620F6E2CB00 +smlen = 1973 +sm = 38FBCDC3A71DD23CD2AAB50CB39241BFE0E6E72A94384672993E775FE0639A215081741E690DB35945D034FFF3E14D0AE67F7518C855DFE4D0AFEC481C5430F6AC7E442CBF3FC7630E227226C0DBF25473C1903669F0365559C94A357CE8B33E010233790C2D41E4AC954B5BDAC25E357AFB1FC36F77A10A2D380131156FA726D0BC54B52073624E8AEDEE29C3C16F8F09E59701B06C08D71D164AEAD7845DD2027AAD53E3A067B5120C25B801248058E459ED14C55B51FAD5B24CBCAB37577A492CAE4A8700ED5F531A53A846A5848F6501AA17A6D0DCE8AAD21D309B001519DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 + +count = 53 +seed = 7031BA806F4D8BC28529163B239E0EE836871C51D2D62B601B71D6F2B69B203C81440F8FFC09C3AAD94DB1D880160671 +mlen = 1782 +msg = 6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A +pk = 6F0A296346BAB0784DF610F7E881824B63276B36C183456D4152BBC8CDB63D4BA106C5A9DAA66A39BFC016635C61A90B786DB88E5AEE2BD6499AC23687B23403A5AC26BA69655CB1FFE1C6D6DE76E70BBC28A3572DC3309C079E1590E27A0A2C15 +sk = 6F0A296346BAB0784DF610F7E881824B63276B36C183456D4152BBC8CDB63D4BA106C5A9DAA66A39BFC016635C61A90B786DB88E5AEE2BD6499AC23687B23403A5AC26BA69655CB1FFE1C6D6DE76E70BBC28A3572DC3309C079E1590E27A0A2C15AB31A316F560C9D54FC36BBBDB6604E3624863554AB17F722E0A00000000000000000000000000000000000000000000D686D6C6F2028946EB76E42B9A2E9B67EC4093DC95A4DEE88DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67C80B8BCAD30F55C3BAE4A1F6B9FA1A6414BB0C94C4550647FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E5E8D03B23CB02085D9E6330C841064D108CD2155F64ABEB297046EC04FF6A49C79DC8B14DB95D7E2ACC5670475486006AC4CCBE57483AB0B903F11D6F0BC480A0115AE68298E141FDA45DC6E4796C494F6DADE0727F60D88AFAE8E26F126300724CBD46526793D008F421F550B713D9ADAEEE17D4BC6B0CE3E1B3946E9F251B2F8B10C9C41FDD94DC5A2575F5B5F0004F51E6A284631E52075B8B0F71644A304E4DB415553C60F137C9E149346E46AADF345FCA53BE469A3311EE6CCE509300 +smlen = 2006 +sm = C5AFBE71C9194E348EF2920F5E4EF96B5142DCABB6FB4FA6F546A31654E69F1CD3A6DEF4F361566212D8B35A2C920D408675CDF68338B68CCCF2F1F11F5AF4FA55E51B49554608B671A780AA3C8EF6B982F45C6E0DA01D504EDF2E1677AC670501009437427CDB43541F33FD338F74D8D9CF0D11AD3C0F58ABCB008B330D241AB70C51FB989CEFF522037971616FD0C5F6D96400F5AC28A21382497B69071AD552B6CA6E8D81C5A89373881600215FB583F1BD0B9F31EC8C1DFD96479723169B25F8E9766A01689B90018C2D96BB04FD269E071788115CCB676DE1BD950019026103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A + +count = 54 +seed = C8671A5D752CC6DDF075C899797603A625C142485EAC3D57CAF14F2244D7F84D116B28F959912A758E519D588A6A07EB +mlen = 1815 +msg = 3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 +pk = B6102F9B34ECC91323B2FFE2452D90F5DECE6DB575ED0BEB36BA42C19E8E9557BCC9A5C13D0410B7A9D39E4CD658512C017B913565A9CCF78A36F89145A1D69D031C2DAFFB29FC0CC368BABB9B02B6112D0B3593C14C7CDC0D49D139CB41EA2B0A +sk = B6102F9B34ECC91323B2FFE2452D90F5DECE6DB575ED0BEB36BA42C19E8E9557BCC9A5C13D0410B7A9D39E4CD658512C017B913565A9CCF78A36F89145A1D69D031C2DAFFB29FC0CC368BABB9B02B6112D0B3593C14C7CDC0D49D139CB41EA2B0A41B6D7A5A04E88FEBB8DE71C1F04BC0CC4C3A49F2BAD0A54DD0000000000000000000000000000000000000000000000921A0FCCF3C6845BB3C54B972221BD983A2A41E249D1D386CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F7220703C09A7E5AE50BF6DC9042A4F82896011EABF35C487FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002BAEE4AC080376D63F0C2929A2F91EBD653B3136570FF2E5A80173B369588EE0F01E36A9E5845CA4BA2CD5CA27E15200C6E5412A7DF7EC960DE023CE889CF34B1450B481EE0A69D04B4BE068B1DF1DA7AD94B5543D2BC296AD19FC864DDF460099DE9E29A43904D47AD4198A4CBEB525679CDF4A3DC53EAE6BB8EC0F8FCE141586EFCF5A24C173684AB812787E034F001352014527B72580949C8D615C2E5976D46CC1E7C423AB26321F5BC4D28219F605EE6C85413C0FCC709F9FB509541F00 +smlen = 2039 +sm = 44C851B6689C6AE3612CAF5F0B7946DACE7DC1386CC10FE27634267879D474C6025F498DA6401FA47E3D027439CB7F3526BA6D0E0D51E6FDE2D5776DE48DE1603694561D4D89626A1AB3401860B26934DAD623C4FE419918D23A9CDF9F4CAE320001DF20EBE8871F1CEABFDC3F335FFE04267874B20BEB18888A00EAC3C7D22D13394BE380E4C2F7A2BB20F71C350862A8518A00743611E987A84B6645AB5670C06D4665B29D5B570656C05703DA53310E0ADF4E2FF56CD017A69AB14BEE2C5296AD0AF326012ECC98CFDD384754917E7AAB420FAEF4E487F4422F398200040D3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 + +count = 55 +seed = D780D7688AF364949A196657A066BD48FFA8DC45B4885279B6DEF362E5957F398CDCE1D20FC3F8F63A275C325FCCE654 +mlen = 1848 +msg = BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 +pk = B3F306A0B94BCD949C2C401B222C30845BBF026B6E08D80DED1DCFC9422537579CF87B86155F958C765AB706500B4035A02307ABB3A7664F44B02A8CBFFFBCB677BF3CAA858ABFBD1FB0D49388B05382931D5DECA96B0A4253C6B6F5109EF8040D +sk = B3F306A0B94BCD949C2C401B222C30845BBF026B6E08D80DED1DCFC9422537579CF87B86155F958C765AB706500B4035A02307ABB3A7664F44B02A8CBFFFBCB677BF3CAA858ABFBD1FB0D49388B05382931D5DECA96B0A4253C6B6F5109EF8040D99C8C9CC902A477E588D5D7D3BDEB9E4187BFBA566856EDFEC0C00000000000000000000000000000000000000000000DC876DEC680833F92B93CD0D8B18E317C7A802F58B9ED85FA0FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F7CE33A213A97015186DE162C4081FE45DC9CF0C06EAE1AE7F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B960465644E2B5720A5B8B2ECB05B3FBF91F7AB8D12BE6D811B9E679E6AC031A28EA0154EFC2BA000220F6DEAC919400E9C93A61CAC087EA5F2325FDFAD4693C810D44C26A93E431CBB2EA818564207818704601D2ED5A55719452EC9DF86A00D2313FBA25ABB2611F79207E7A00EF98E50A79458DD6A1D0254382B56AA93A7D3AD1413EE03FCAD80265E409C5D345007962E1C5BF01A7DF0BC321AE22AABD0FC2F88C7F8A99502F0B652FDE49A36170C8BB5A738B082EEA60D7F2B718065900 +smlen = 2072 +sm = E076913578D841A2ED93678905BCBB295D29801E70A5ADD1C32FEC7EF5DA0E3B994DE2072616DAA5AA74F97C5A41DB33B2249A7187A91E85D01B4AC7175F52E87D482F3F817E9EE2B726516FF7224B77A2AEF8B9C16DA78D6E49971B4B092E3E000331978B5D17FA5BCC6F8162CC5ABC8390B02A400BF028F3EF028AFEABF70D2B935F86371C899202296E7F8137D7B9AE9D3E02769063C44E8109396515EE1938A2E88AB60E3C5F948C94460244D2CD5DAA48D4945816135218D1F92AF0259417DB24C50B00EC1A24C66CC40820B119AA19E05F462EBAA4BF755AB6D0001D17BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 + +count = 56 +seed = 36AB8588F5233D15674677535A682382C29968FF824031AF646F58FCAF0E83C1C486B1E75479149FD6F4D9E8397CAF73 +mlen = 1881 +msg = 0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B +pk = A9ABBB48FCC238E917694739CD6ABB6C8BAAA1DE18BC989FFC3500DBBB1B0934FA9B335CBF683D63038A53C4940E8B061469CABCBF9BA0C5FEBC3C7F0B0A0AD7DE8222242CA669D895612332584D572F1CD163E84003CE9A65BB1B40B94A574004 +sk = A9ABBB48FCC238E917694739CD6ABB6C8BAAA1DE18BC989FFC3500DBBB1B0934FA9B335CBF683D63038A53C4940E8B061469CABCBF9BA0C5FEBC3C7F0B0A0AD7DE8222242CA669D895612332584D572F1CD163E84003CE9A65BB1B40B94A5740047BE77D931FB1B8472DB900327CC7B425D0730A9E2744B06E6A0C0000000000000000000000000000000000000000000046F9C0376A3A611AD94A892EF2DD952927BBD44B8EE2089C9EECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B137D6A05FF246BDAC9A97645608E98A53BC4263259CCA1D1EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DDF4F95CA441773A163BD38D5F0B9B1E9B7F9CDACB010259424333186BDDD7EE877DC4EDEB84A0326254E6979F654F00D730663F077A1BF8127F4E3D1C04E4E46576B822B6AEA87122969F5F017E165B673B727386005E979FE80CED7277530009EC7FF85DE46E04976D11A3EC57E63804ED73F46412605D22A4D46BEE910BFFBCB2C7C929AB75586D9FD2D6C672A300C08387263269ABF4144331DABFEBABACF913395CAF344E8AECE965FF3CD2A6350C4625209F0421EAAAC8916C66EA9C00 +smlen = 2105 +sm = 408699D637AE75C8A39F16F560DCF436DE0AAC5E8E8B94355BE48FC4F1195F57B01E4300C55442F48A6C746D0FD88C1ACCF881873638A74E848E3E12095A5DD008C97672898F439DB45EB336CC48B7D973E74E046931684B17E749F985D14A3C0001CCA46354C5EB290DA53EE61714316EC3D47574A017BC6B9901D589E3EB9F825A171401740E2060A26BC81EB8BD84DFBBB60162AB5685A644789EFAFBBC1E0ABC7C90416666D6235F2CF20225E33055A3400020B643780BABC0528F72D8319B9E3AF86C000078F4230195C2B4D1C29EC981164617B4A8786152A1290002170707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B + +count = 57 +seed = 4E94DD734A371A7C6AD4A567038CF93BAACE2B9D30F3862198DC55D2F21F8FDC9A7AE5DCA1541712179E3AB1FFA3F792 +mlen = 1914 +msg = F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE +pk = 770537D6205BCCE545199412D69FC527B0C1283A9F6EADDCD776AE11087F3A3CBE214475E9F5878D8FE38EF8E7D2710CEB97CFC2777CFCC97EBDB4DEED248695AA57670F6D87C1DDB7598B1D604D3C9B5135DBE174F442C060DCFA713B5E002A12 +sk = 770537D6205BCCE545199412D69FC527B0C1283A9F6EADDCD776AE11087F3A3CBE214475E9F5878D8FE38EF8E7D2710CEB97CFC2777CFCC97EBDB4DEED248695AA57670F6D87C1DDB7598B1D604D3C9B5135DBE174F442C060DCFA713B5E002A1297A977019554CC3BC42BC4446B6096B2D9823FA91E0C85E35001000000000000000000000000000000000000000000004C7130A1D6110D001076F7091B07D72EEC6267C894FF81F88CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1A2F59C8E28F81644FB57FEA856F73B17B4337AE4090D20ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008B23499DB3408E3A5664FE3BE139C3E8BBF982478EB2AAFD95452921100BAFB01DAE13F9A43720E8BD83B713E4078E004F2A514A1CF22535CC7CF8FC4BD98005260E41B73A6D5B222DF9FFAAACE573A936820C169929685421FE1CABEEB8E600DD1F0A06535B849C5D6A6EEDD5B0F68B77758724230B4A55F0B3D8877CDA07C947C3AFE9ABE8EA60BD2CC8F0EB451B0096FD9BEFA2D85664CF3104A9D3247BC03C1E4D806A60678F03965124FDF65C187753821E3E14B413CD590C6528AD2000 +smlen = 2138 +sm = 35FB556511666F78006472E283495750501010D88F9BA3BD600C5A600B41AD7F2CCB38FEB5F125139C93639E76BD6B3A567B35C570205A33EBCB4B31544E6757B49BBD970C14CC2CB8F3B076531309D4E40956713A493F2CF0AC407CCAAAC127010068A442E192614C0DFA478E46D1747A5E65D142A613DE9E760189435A91097C6015C05C628FF5A3EF8964A9C1F73050684B019730DD70A005C67A21F35456B2AC1FF24432ACC4B7FBAA0C001112E57E5747FF33F507431B1127F3D8DD23473491F6E76A019165B4E1E60FCB06496E8D0BF34EBFF27ECBFE2C39FAB0000D08F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE + +count = 58 +seed = D9281003AC5F7673E0E9A7BC29C4ED75E6B0F228DF49D11A2599BFF2DA9E887163BB26DBA4F071FBCE02891540EC6F1C +mlen = 1947 +msg = 437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF +pk = 26562DDCCDEDB0544A61A5E6025790E3C17F65E0AC75B58B32168BC1471537535A54026918358296AAB4A8866FA8551A88A42C0A828B611F02DC8AFCF80C36225A3FD957E9C6AD1D2F482B4AF7FD9A4AFB3F33F9706A008AE49D87E4F1D6973E02 +sk = 26562DDCCDEDB0544A61A5E6025790E3C17F65E0AC75B58B32168BC1471537535A54026918358296AAB4A8866FA8551A88A42C0A828B611F02DC8AFCF80C36225A3FD957E9C6AD1D2F482B4AF7FD9A4AFB3F33F9706A008AE49D87E4F1D6973E02F5922D38EDC32D8B3F741E22AD43E812845FB10134EE4E47FA07000000000000000000000000000000000000000000001E9A0D6FB5210F0A59F7609503FC671AD6A43697FAA65FDCD5F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE93ED22EE2C23EB4EB0EE6CEDE74974B798711B61577F16574F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CA4A38DB668862728DC75B157CACD3A74E1E1F04EC27322CD47B62F396B21CE000742071D1FBD878A86887D6638A0F00D1EC07FA3D822296DFE94420BA25083A3DEEF0BAAF4D21CCCA36C0171D6902664D7CF327FF06D04C414683A9367675004D898946316B47487F7D849A543DF1D083D0AF8D252BF135A91A3D7674A38291FD3789D603D610283CE1BC2B3528F200086C66549E5D91DB7C6B2D518A1A3B04A1C8E7115B10186A21027737C68DAF996CCF4AA014B224A52D21D4321AE7AE00 +smlen = 2171 +sm = 634DC56285B89B7407A0264B968B557357E94B7A33E6FA0E9E29DB2810FF4F154E62690E84E92F59C097749BE7510726E02EB84D79C24CDAD793E3492188469EECC7D681B365B086BC774AF7646BE4535A627E2501C1C066A2F41D93D4A0DC1F00005F00544207B8442B63E1FA6750944B388C769F2ADE3E36B2019201F624097EB7AE3EFE80B10EE2F544CD8E8AF77AE36F6C033F15D5A08326EC8587616FB8695B1362B11C09EBB7DDED26000B1697E99401FBAAEAFDF08EDD4780B76ADAA763035CF4360237E1FA010497FB2199D15A40B94700AE2C372EA9AF7AFC001702437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF + +count = 59 +seed = 750A74866BE8DF4E60BC14BF36E6D83ABF6DCBB86792D125CF0980007C5435F40F87BA96498A88252D9C5C6710807652 +mlen = 1980 +msg = E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF +pk = BF29E889CEB263445B1888174F77EC7795458F38D3D76A3A363339DD744F1D66DDBCE52C6C8A71F8CE0EA9F0F661EE25E54845E2238D025CB591646AAA727D50D95BD738876615F10F8630E0342F260899A2C5502D0F58A163EDB29D5077A53D0D +sk = BF29E889CEB263445B1888174F77EC7795458F38D3D76A3A363339DD744F1D66DDBCE52C6C8A71F8CE0EA9F0F661EE25E54845E2238D025CB591646AAA727D50D95BD738876615F10F8630E0342F260899A2C5502D0F58A163EDB29D5077A53D0DB191629BF1865A038A68E88F93648D89A70AC7169026C9EBE30B00000000000000000000000000000000000000000000AC799084F398188009E480251ED1105EB4D1639EAD4227FEBAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF037B418B7B6887D36C75E9C121EE45194C17DEAA7C619CE0C5F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009DBE62448DF4FF2EC90267731C45D63B43E337C782B5EC7C259D5870A931F1425230F55C330A7E166D9EE18E16E319002270A14D063E65FAE65118BBB00677B9A3B6786451681BA9D8AC19819A91F2E7367AA41932F97D192DACAD016DA9BF007B66CBE2BCD54A6E4A372AC7FDBADA7FD6805CA9F4D344BB3A3209B1B4AA9D461F0275D7F1C630C6435E9BBBAA793F00832315D168F3AA559B620B70879EBC46A1F229B550190333A852FCECCB0979AD509EB22F985CCB24219D17B49889DA00 +smlen = 2204 +sm = C1176D6DDFB15F4EB590FEBE109B5C90CB26A90EE26A8B8A96F46F5BBCC7F02F99806BD16FAC90625F9C00935D572337F5B7235BA250CEC76DF00A31FD57FED248F4C9949D4B5FDFDFF4DE7E16C152B1CB91FF1417331BAA3FED1A891326EC17000196A7B8CB3575C23018F6DB64A783A789EE7B380B7F674E9E01A76E42B59CA97E11C24D03D2E56940E71C16F2A538C3D00103EE48D8DC5E9BD496C96E231E312745C9786AABA6B94409E6022236B2F9DE16C916F5742CED60BD6B02A408803DB9BC211D038E133928DD38CC552DAC4E92212F6D6729A451C536EA5F000C0AE4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF + +count = 60 +seed = A832D4AAE8076C4EFE8319A74CE315928AB765BB629075254CBC63EAAE691C220F4B5E1839E9A99D8747AACD7C2F1EE3 +mlen = 2013 +msg = 84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 +pk = 1DDB86A6C92F87E644F633D1B996102AAFEBF78ED7D4BF10289533C62D6AF1CB09EB7D88EAB9E1180F37BCC656A55411793B7F68CFB75324EC3CA0943AAE45D8C661BA935A32A9A71737AA91C0B43E6659956A354F679F5B590DAB3DD232F81B15 +sk = 1DDB86A6C92F87E644F633D1B996102AAFEBF78ED7D4BF10289533C62D6AF1CB09EB7D88EAB9E1180F37BCC656A55411793B7F68CFB75324EC3CA0943AAE45D8C661BA935A32A9A71737AA91C0B43E6659956A354F679F5B590DAB3DD232F81B1525B1A7096C29BDA4EA4451BE97C5DEFCA1B17D5D5C9CD59883050000000000000000000000000000000000000000000024ED713BBAC905C6DB9CB46B44A9457064A7FA10A0E0FC6A12F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF517DF548E58738F6610AF5AE3377C38D6602B943452B84220FF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004165E6A6E71E2C3ADB8E236A4AA7FB2AE30C36636CD03405BC9FD61964020C6F3D50D805944A87E9245D5253BF36EF00ABB34333D1A135E730D971A8702213E20825FA6B2B2253A40EB946AA5638DC19778B95138A98423CEFF80F1BA2AF32002AC5BDE88E6A3F22502EB78E1F5BE133443293C0B97343F216B7DDB5B0DF0E566AB136AAC6B0B7841A6A983C44926400D51CA85670DF0F889F4A457B84F2297D2AC3B091760D72A4101EBF09470362BE49580805EFA63538F536408FFE8BD700 +smlen = 2237 +sm = 9998AC0A91294131D587C338CB89FE8F93A80C08A4F08E47C1AD7280F88CE118FB5B753EB2C104EF300B6451671DCC05A6020BDFCE165023E72027C7D863966CA7CE2605C427513747745E18D9175D7FEF16863669D084D3449F82FC9A910B2900002CB5622CC4CF1FF47E1C41B156E03E6B93153E3F3451F9B203BB4337234B4E62302EFE73F65DFAD02983025E551E1B382D03F5934A8EFEA4928DA1603A458D3DEB7558EB76F2CDCC941B00F01338A69F2E297E6099585A2F6D9D0E70E4A4FFE28BE0B003AA2078498FF8B04BD3CB58CF13EC69AA11C85802671E4700020284C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 + +count = 61 +seed = 09B8441F47235EFC82D71933A0037FA4F69124C3BAD4EF6A3A7178B417A3FDA874081B7EEFD7EF1BF234C752458FBBAD +mlen = 2046 +msg = 92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B +pk = B1A34D1C67A25CBC40FA1F900A56259C1D10D26BFFEE4C47C6ECE3AA8D573BB959E00787D504302749EB278C1963B50F0F9C268B43A78A47A5979F28EDA96E9F62F9FFBB1DEF1CA525109322FC8F7DBAECF09CA47675080750524E973D4E011F04 +sk = B1A34D1C67A25CBC40FA1F900A56259C1D10D26BFFEE4C47C6ECE3AA8D573BB959E00787D504302749EB278C1963B50F0F9C268B43A78A47A5979F28EDA96E9F62F9FFBB1DEF1CA525109322FC8F7DBAECF09CA47675080750524E973D4E011F0431BF1EEA705E84D4E3E96D0E64ADA0BD879BE76646814AE975030000000000000000000000000000000000000000000052F8EF8A2F788725202F7EF0845292C75A8FCD30ECEB8703D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99A9C7609D59801ABF3B9C90DE86A6E460B339935F3A86E1B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009F14BCF9FE13BD27F4B916A9D66C9288345FECC2673403495921B313ED5AAD6A2D790B66698EDA9CC90F5EC8FEFDBE00FFD406F47BBA802E55F76CDBFE3F0CA160C3C24D500EA2F5E228D407619BB7ED2D54675640E25986322961E7B5F4A700E89ACFF88C57AEF6AF0BF07C51B0138F20AC1AC9A91C0EFCF0FFAFF12A8CF424A0069E44C5BCF34752923042F0532C0097A4EBACC50E39A72D2B9BE916B2824A8B57DB10CCE3DE4ADC00BFB6D92253ABD4936E9E8468419356FD3C035A60BF00 +smlen = 2270 +sm = 57193DF57F6AC4C6E2ED2AE774F2557E30136334CB18AEEB57F567155119C48E348E28A3501D2976DFD8D59EC401DB381E7A9571CFB988865E8BDC4CCC6C3A4B5E2D339A161136838882312AB4CE525D9C9FD09EFA44D660BE9BE655A56C4F390101ED4CA1D4BE6B7F9CFE2FF921ED73D5175BA9A6D7F57CF72F0105C6D45542DB4ABBA83299C8CDCBD16014591D0EB6D0F358003E8FD8997853579BC65CDD4993D2B06AE3C713E513D108340100EA6C359E6E320FF92CA554B4AB4BDFCA0A2670992DD47C00F7437CF8FF1B673D31B0458959ACA52430B7CCFA9CC1E900022192D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B + +count = 62 +seed = D2629CEEAE5C95D3C34C1FFCC2338B4A97782BDFCD39111E18540B69DB035B352D012857111F816F03550BFE5F56ABEE +mlen = 2079 +msg = 7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 +pk = BFC5B5E807B42AD853DD163A7E4D350DC8CB8951EE3534A9C86EEBFB4ADEEE4CAC4FB938462E10E77F30760BD019F50D618B6D23471AF768FC2B36A9A9ED753AD07234754AB1F4D265F3FDA51DA9301F067ADD02EAA5DFCC1806FA3DE04F7E0F08 +sk = BFC5B5E807B42AD853DD163A7E4D350DC8CB8951EE3534A9C86EEBFB4ADEEE4CAC4FB938462E10E77F30760BD019F50D618B6D23471AF768FC2B36A9A9ED753AD07234754AB1F4D265F3FDA51DA9301F067ADD02EAA5DFCC1806FA3DE04F7E0F08E13F0E7D13B12610B33DE6A3056B234F01400A67F086B1718A0200000000000000000000000000000000000000000000A293BB3CF2EDCBA83EE9E629AC0ECBA56D78676CBF7AACECFEFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B021A04BD2CF0213E65B01E3146CDA9466F60BC540052DFD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C3CAC3162998D88EE674F396EB25F0E070B8ADEF2CD3C1121DBBA587CDAF972332E33D5D5CB692333B2ACA3C801C8200E0DB90B42744AE5A5D2E2B997490A57F42AFB2324FA1C3F95964E699298C3F8CD016B5640647E5D9CD2CEF58C2CC1100A1F6CCCF129BEA1CA179B1CB8982811BEAB5EA0426B49DBA6F5471513BB74A266695F4E6637AF5823EB3CDD2439CDB007373B4A26A785EC08BEE5C62CA322553B4B83B68B15429169FFB3B3170D1F3BA3F6AB6E2E1103BC9D8A76C75F2774F00 +smlen = 2303 +sm = BE161E8A562924B9C3A300C2829B5ED4AD48023370BF2FC56056FA5ECCE66BAFC0384F4E6B79B088143C33FE86DE2C3135B17004BD317F4A328EDF28F114E7E3E2AF6DD1F27D4AB9FA8C26835A0E067CF61072F5D1682675391F2C58CDE9310E01018D4564B0D3C67FA4F2706EA5DCB56AFDFCE004A192CEF91301BD5DCB40D61AEC43A8D210F415F8A960898A228AE3FE6FF1013323A03B06EE302F5334D56AEDB9F9020260C318145374D201592A67C1FD75B805DEAC9E01A042635F8432C228A2EA349201FC9C4FC06E6430614F9FB28289D181A8DD34E7478CE03A0015027F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 + +count = 63 +seed = EAA4FB8EF0290A499A1D92EE398A8D7E71CD3CBF01A36750DA4B7EFF175DA26D17AC4ECE49A84C88D1D2C2493563C26D +mlen = 2112 +msg = 2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 +pk = 31D581D7CE5CF90A35B36B35A287108BDF745A4EFB8C62E09F0C6DFC744B24CF7E30EB9571D30AC9446245274A66BA0DE91D8E5C5E806DB7F54886C54A446AB36D215E581FBF76943D7A57314B19AE57AAEF9D807B695C218C9FBD66CD0F052E0D +sk = 31D581D7CE5CF90A35B36B35A287108BDF745A4EFB8C62E09F0C6DFC744B24CF7E30EB9571D30AC9446245274A66BA0DE91D8E5C5E806DB7F54886C54A446AB36D215E581FBF76943D7A57314B19AE57AAEF9D807B695C218C9FBD66CD0F052E0D916D38F553C031A40DB230F7D92E2C84C99200CBA8E37FCB5806000000000000000000000000000000000000000000009627184630DF76EE4034959EE074AAC68983D51D3FE40F66C3FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B3F86E9390B8C4A9DFDDF29951F95FE697D6DF282AB79DF80F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F8F9D449E8855E5E60A4E342C35C010980ACAEF099CFFA3146B34060CBDCF502D57E6D2DC208C5E325FF1D2C767D8B005D7DE50420C4A064436C592BAC7E8DE53CB71C551A04FFD3EDBDC82BEAEB00657CE0413733E439831383D42FDB6A560003C7EF7436B15C25B6B9996D50B0AF09131BBD18F5204DAD2D26926E0C3792042DDA29613436B376C2A045F5468ED700788D7212FF744A23B38D1C1F8C0E50C9AC427D540965EC5785B37BC7F84DBE2FE4088BD9272A34812EAF351AAC529600 +smlen = 2336 +sm = B580F3080A17E4CD375DA560CA32102FCEF7860BBDEE6266E35E3FB7FBC60F3E64A1EA074B7C21990FD4D9E1A5B1A40435B1490F58A270A8970CF5A68E241060EF0E94211FCC0BA52181F0ED2BAB85BB0C6BA327E40A4C55FD788ED1AB7652060000C35FBDE7C6DCE1F7658055A56BB244DDA1FF9DF9E47951FA017CD439310FA70C7F76A3E97F2E37ABF530B54033698B5B98022E6EEC8658AB84637BE8B096A53F19C00E228EDEC6F5F07E00ABB67689489D9C8AC15945AC883009537988BA7F6F57BE9702E8834A3BC6E5D4DDE4B8D5B24F430CDB2E75A8F08CF10F0004062E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 + +count = 64 +seed = 5909111F333F3E939105DFF8532548927EBF289F31A72F4C1B0C66816D8B68F64622F36A9BC85E63601BEE8EE7CB3DC5 +mlen = 2145 +msg = 5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 +pk = 4DD61EAE5D4A921F63BB8135D692D7CDCB185550292BFD9CF2B1C4E566A727E22B0653540FCC6F8F8277DD9123D6713A11D30BECABEE87E749346870AF39D81F754D6B328101C4142912F6EFE5EE79747959CB1F0D7C2F07D4006B94A88E1F1F08 +sk = 4DD61EAE5D4A921F63BB8135D692D7CDCB185550292BFD9CF2B1C4E566A727E22B0653540FCC6F8F8277DD9123D6713A11D30BECABEE87E749346870AF39D81F754D6B328101C4142912F6EFE5EE79747959CB1F0D7C2F07D4006B94A88E1F1F084D0100DECF1D1AF77635C16E26877876C8A1287FC16ABE92030400000000000000000000000000000000000000000000EC841AE932AAB6F6B160872E635C6F575299E684F558075FC5FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC34D71EDABFB8A46EAB8FDF0636413C33FE9241F7010E7623BFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A763CF2CCB32D3BE88E6CF27D0DF97D0AB1545F20B37F8B8F434F36472700CE435799F329D878031950553F96610700C5AF2049F63809C4E080BC76962AA2E1D7FFEDE196AC7BFDFBB1A6E4182993A9600A5DDEF44D45521E9715A9A73D1000079DD947186582AE9C046C0E5FEA7D420208570E6883D15BEB99CA8F6F74A14A8D8A2C6B8FB25B412049276243697900E5648C839BC108BE47DF057DD464841DA71C846FA6BCD6C3FDC07A75850875E6123C4AF502FFC8177B62BA9F2CA89800 +smlen = 2369 +sm = A227B7B91D92A72917266B1082C941ACF683168625C89EAE9570840A1A509139D56CE0E06B6F7071DF967BEDBC598B1657B06BF7172B58D90DC096AF58A590B36CF9D05EB11AC7F96EB8ABB17A40030A7741CF961F358FDB7FD33590CDC1E63C010061EA85249F806D758E97AAEC75256010E656C2838BB235D2017705E913E493874CCBDEA648FC8A6CF3E1093AA3858CA4C500B25AF8C7A02D410ED771ED49AF66BFD796631545860D64500127D399465388A490116B6439C638217DBA29AEEAA2D6EE99017F281C4F59C88AD674B7A83D7EAB1A34B72749260A12E80002025180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 + +count = 65 +seed = 238461A224ABEECCF709AB6CACF4EDD372D45E5F4274095273A49AFE614F2BF713134ABF68B4DD058E6D7B612C3658C3 +mlen = 2178 +msg = 99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C +pk = 9C5D171D6BBC3AB86F8900A8A4A737A42C0F82E557B84FBB6AF73ED851C7B584CB74974C6A254CEA350DC413E8F89221A5E72EA787FA329FB1B1F43996AA48CA273EC7B12BE3B8D532483C62EFD4CCCBA0015CC257560C51D0E7C9F118D07C400D +sk = 9C5D171D6BBC3AB86F8900A8A4A737A42C0F82E557B84FBB6AF73ED851C7B584CB74974C6A254CEA350DC413E8F89221A5E72EA787FA329FB1B1F43996AA48CA273EC7B12BE3B8D532483C62EFD4CCCBA0015CC257560C51D0E7C9F118D07C400D31EA1FAD99394C098FB426413E1786D30D39B5CD2AFD5E457B0200000000000000000000000000000000000000000000FA90BDFF4E041DBC2B217BCCDEE1138BA7315A3BE2B775AFD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99C7F53F074ACAE5E82ED1E84CA2369F43601A61388F52DA12FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008B0216DC6C847FA343AAA8308B8F9EEBAAFE9373FEDE294BA53E9805405E2633621E875E2645C189FFA3AF426FD125000C8F1E5AE1863340ABA68454E719CD3B1D1F2E3E9AFEBD21DE459626FEF354804715513B9464F7B48917A309F2CEE20031113CE803337A4AF8666355B62A7C6AC2446E970B8AD6D41FC855B5A2426DB36B753236199135B2696C69C5FFE6BD0081AACBE2AEE9F96480F93EA77A34A61F214B228A38B1C546FEF20DE9CA31B3DD9EB4F22866342FCC3CE1C55080FD3800 +smlen = 2402 +sm = 8EA5F5201BC27CD1696F0438B5C5036D1484CC03CE133CA0BE1EF2A851766E256DEA43D8D9559072829D349488256210086BE8B8B6763CBE025364F39CF4B5C90516B78D745DB456C45102486E6813F4F3D11BF98C2DBFE4B1CAC3D367CB7F400000D55E28FAE3BD478F9A13C4A0640692F90425ABF293088B0002CCDAFE9F13ED1BE72D21FD3408C23E35048F153BCBF2D68F01D824C284C5632B02B18812DA4CEE70B80E7598149AE987CE038D7E402E47D1594346A6EB3EB500DFA5938A663765BF969C02227ECAE7A3B7727D285D11A383B8FCCFD8C9BBBE92EDCF000D0D99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C + +count = 66 +seed = 83C653708FAF3E5F6FBC9DFBE6FB5E83E572A7688645D75D2C4835B28695DEA4BD7093740D0FF43237354EAD1C978BC2 +mlen = 2211 +msg = E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D +pk = 60EBFDDAFC244AA3F770BB20AF3C13F3F5357E3F2334831294A92C5C8C12FDFB7C8760557D9807FA2741D3E12DEDA31EFC32CD20BB0C851759A6C7F04F1EA28E7F329B5D9E1FD5A4C2D88D21920EBB02440342E759B47126203FDA5E56CBF82502 +sk = 60EBFDDAFC244AA3F770BB20AF3C13F3F5357E3F2334831294A92C5C8C12FDFB7C8760557D9807FA2741D3E12DEDA31EFC32CD20BB0C851759A6C7F04F1EA28E7F329B5D9E1FD5A4C2D88D21920EBB02440342E759B47126203FDA5E56CBF825028BD2787C526223C44EF5A83F72FD4752A78355BBB2A21978B0020000000000000000000000000000000000000000000068938F026D0B471B88CF0A8C0326F64FAF2DB6FCE88EE2E7BBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD41847A29D24EFBF392B9F2258D6F1B84EAA2124CCA9C7565FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000884F5E93D2CC30A093148562892CF5B73AB32035B71513865EBAB8FBF44663822C062EE08B7E3A64A106FCEEA7E421000BF15A7AB2D4805D4EB6D5731C256A4BE3AD0174ABC3DAB58EC68CEB35F790AF8DB664FBBAAA28975466AC6C6C566A00D3DFC8CEDE2F1BCFE91B2B2605220D0F464F009FEB255B7D5F3547B4BC98B6AB183F1572D81C9AFE93D8596CB23DE90061CEAE9EE3F3CAF391B177D8E22B05BC9A11C8CAF8A54BB0AB9613B57BB7683BE3D020D3BDB392C1B3809F950D7B0E00 +smlen = 2435 +sm = D3E7C5671216FCF4CEEF239C048781D39B53A1D665431A97C7F8C6D443EC7660914F6E787D5798121011F7CB44A9F32A06F018066D6EE18FC4031A89E24D16C6CE2568AA9BF211ED0E34B55C22E55914D75E6D855043822F31A1160A081806320002FB6BD774EBD7AEFFB0E4DEB1B7898DDB793F6130E0038BCA03C854043A3392C05A89CE8918963AEDD0C511BD3C3F336C7400DC6E5DCC496D5EED56C95E6FB12FD5C28CC0EC0B40B791F201B4A55077FB62D249AFB73936D0918E61A4FB2AECA32E5DAF00C0DF293A3DC5EB76339C527E1512270B765913C090AE60000202E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D + +count = 67 +seed = BC81485EE93AAD8B464B5199FFEF9FEFC06EA97645BDFE0B4E915B812E606A77F93917ED925E882161CBB909747AC4C8 +mlen = 2244 +msg = 89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE +pk = 2314DA10722E48990EF8AFD657DEA8C619B183A9D83C4DD1B6E39A14815660FFA3993436800DE9D8C3058B918BEB4A0544C19BD68EB3A49281A8FBB585723D428B6F1A148F9DDA4697EB5495B286B58415E01F71A15E0F1891D15CE80513B92A0D +sk = 2314DA10722E48990EF8AFD657DEA8C619B183A9D83C4DD1B6E39A14815660FFA3993436800DE9D8C3058B918BEB4A0544C19BD68EB3A49281A8FBB585723D428B6F1A148F9DDA4697EB5495B286B58415E01F71A15E0F1891D15CE80513B92A0D8B47C407D43D6BEF7F4B2C473847160DD746480E46B949F3410300000000000000000000000000000000000000000000E62BBD281C694A6D07E930B2C81C8C996F4E9F1478B48AEDC4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD023C6658F18E75D6B0AB2DAA909B833D50C07CD9DF167DB5FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A1AB4DB5AE4EA6721B68203EA56BE498D975BDC2CC9DEC7582B0A6A8405C25C738F5F92D9F068C7C4F5EC7120877F20064425F1447CD10A7364B81463C48E99E4184EFADBF124465D99E12FA6A588574A461CCAC392A688EDB9A502ABBE4C6009F6014BB4FBD4CC26D4DAC7691CAD31BADEDBE7296487372652DFA04E501FE9AC50D3E8881B081F322A4D6C3CEF99F00ED4BB56A1903160B66ED86E0C0A6533FDEE61E5A6E6DCE494AB43EBAF14D31964B07600A5EF84C02B431AA225E2A0B00 +smlen = 2468 +sm = 7756F37BCDB09C4634856AE42E60FBCB0B8FDDDC08B55C93C30ACB294FB71A1A1CB2F9936009CC8407FA2AFCB1DC8C2862D4CCE87212CA7119C16BD35BD29FDBCBB5B4BE6D19C699A17AAC597522B2E9BE0C2E364D6E81581D81069709145725000661BDB04FC371F994864194BDB4C7AE3BC1843100125B42A80188AA4EDD1341F45DDFA3735E29BAEC72A7CE12F98BDE972D039E794F467A1A4F862E8F048D1FF873E493078E2FDA1B8A1D03B00CDC9E373A1F730D570B6E40EAFA85D30364C7BADA5D1903FECE0F73DFE07892A8C7DDB3FE7592715D53053B60D35100020D89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE + +count = 68 +seed = DE9E2742591A5AF6A6153DA85A510C39FD31A2ACD8A8511F190A9A5E5753E63D9801A8019508E67DEB1E9219CC18BA3A +mlen = 2277 +msg = 8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 +pk = A0981413FB53C7B74F18F5243F58FD8A601602A08CE000B4CA4A845C81372C7DCD6E058DA03371C254E74D1155E24037ED69FA3595D8A73846FAE58949782E917DB06DD1A97F1014551DF8F66F7803F281843B764C5DE5BAA41641D0AF04BA1915 +sk = A0981413FB53C7B74F18F5243F58FD8A601602A08CE000B4CA4A845C81372C7DCD6E058DA03371C254E74D1155E24037ED69FA3595D8A73846FAE58949782E917DB06DD1A97F1014551DF8F66F7803F281843B764C5DE5BAA41641D0AF04BA191503312C250E5C04927FE136EF867F43B3C865CB45DC8DDD513B0100000000000000000000000000000000000000000000FA1C3C1B05D7D9A1EA4B4580FA84B2C047BA25892963570ADAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1F945BAD07C834A6202B4D050390C5DA4AE0DB4C896AA885CFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F82658125730243B3CFFED335423678CCCEC19B6F4FFC330CBE305BF27CA20AD3FA1AFB7FC28FD36D9CDAEE2A58AA6001BB3FF7E6EBA040B06E216499B78B0C4C43984B3307579E09B1C89CFE769E5AAC8FFA977C21642B4EDB00639243E0600ED255AA0B465E95CB17F2758EFFCAA25AD199239FE3626EED688330884F50B49520E2F953B4A3A24A9677C993B5DF700E22A93033FC771507CD69712AAAFE63E5B9BA43D196F836705E6FB63618F45334C7DFA302F0BA6AEA2941A5003F56B00 +smlen = 2501 +sm = CD2AF01272CE2D9F1D18F05DD4E2999FF8F9AB2AC7BBA96AE33EA3CC262A70E90A9C9FF1B46C5D71588BD7C52488BC3DF150D457C1F4FB825535C339D3D3449BD69C006D107CCDA0B077FD94069E6113340309B839349B1C9D0892AD620E762100000DEF7EECEDCCEB5B53C0085A54F164C5B12D896BC28FD38603E6C376554DA9870D235869315E6B85BE40751A7E8A0400990206AA3949104D6F05F3C7923976F8D3928141B3BBAD06BE4B0285CEF698D2DFCF54908EF6ACAF4997DEBD77DA5848BAB2DB035997C33A157894F52D6290770FF44914D20FB121B02F1F001D0D8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 + +count = 69 +seed = 272E459EAB6A0BDF720E4C5B79E641C95BAB66C3CEE261D0E3596BB04D232ACE0A1CE24BACCAAE9037665A962C711B08 +mlen = 2310 +msg = 62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 +pk = 7282A2422A608147472C50CA0FD8208D9142731DB360FE98C1355F237FCDF8F07C14F25D1259A4D2F62056D11ACA9240908ECDD49921F36A69453865F48600BE9B765BA58B0D032570139715E0ABD6CB2E57465CB95B7F47A506A770FCC03A0817 +sk = 7282A2422A608147472C50CA0FD8208D9142731DB360FE98C1355F237FCDF8F07C14F25D1259A4D2F62056D11ACA9240908ECDD49921F36A69453865F48600BE9B765BA58B0D032570139715E0ABD6CB2E57465CB95B7F47A506A770FCC03A081773EFCD4B6361E80B47C7523C58B3805CE619AB9044AA9861680A00000000000000000000000000000000000000000000AA270C3EA12ED6071FC6C0195CC0FE5226F16F183D1B23934BFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD9A58142D8F1450D30FF181BA9E8A6DA3C4F0090851A38F26F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2A60E7EF5A85F94BC11A3D1C49022B3756138BE44B7A5AB413514FA6435B751735F71A3E20CFF22437F77E61BFD39009305B8438FC823E822CF14CDF5020FEF0746FB29EB9BB8A4ACA7C36699C72CDE4081CCE9DCE84A912C9282356BBCCE00E9D365B251116F38E6586BB613EDD5FBAEA99C65B0575164EBF554C18FA66250966B077832FAD02AD5DB3567B29FF4005AE4F98B52F89685BB45FCB9D68E1F5F8D418C1495268EB9ADBA0A26D3809560046C56A5A7AC7EA745F01E89FD28D500 +smlen = 2534 +sm = 4FCB71B22A0A8143DC91C39C2DEE93A3D89C21304085B205955F4288D6966FAF9059FAC6D1B6403DFC940ABD1DCA1214174721A36BA3119C31106509ADF8BBAC659F46E49A1914C3BB1FFDF138FAABC58776E7CDCAFB733B5BF9F5AE3665761A010086621D98A69BD9FD666CFFE5FCC6733365808CF3DFA08FAD013525D2EF7D210308664788D5553D691B60F6AD2AFBA90EC2007BD260252866513839A092BF821E96B736BBBB9ED633B53401C97B2E817876ADED5CB28C08B8517D50BD145BD636EDAFFC01484A7B409FC9FE81EFA0B5C05689E329D670774DF8370B000D0262215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 + +count = 70 +seed = DCC58DFC13B035323ED44BE50A7096F697C9C143518FED50A59181160960203831A9904847BA20B85E99FFA63E4AB0B2 +mlen = 2343 +msg = 954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA +pk = FE2F83C162DBECA216919DD6EB2FCB6A73B3F3F0A2B06916C393E1442A166E01F7FC5294D3BAB39E6551AF3285CF3F376A9EE8E3F35A093F68B669E8DA917E43D117C2E97F6A39249AB9BBDDCE399A07251FF3592B6FCB56F7651783F046691319 +sk = FE2F83C162DBECA216919DD6EB2FCB6A73B3F3F0A2B06916C393E1442A166E01F7FC5294D3BAB39E6551AF3285CF3F376A9EE8E3F35A093F68B669E8DA917E43D117C2E97F6A39249AB9BBDDCE399A07251FF3592B6FCB56F7651783F046691319C79EA1E18E33D1EC20E2C9C27A571C120BE0E3CB966BBF4F6C0A000000000000000000000000000000000000000000002EE6E11DA9523A000C1C3F717BF283C841FE172E5974477E67F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3534482B48FCF094EC8699114E85160FA24AC6939B9B674BBAFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005B9C202C5584A3A329FC146AF7124EEB9C896D1EC92AFA0437CAB5165118FEE55B928F44B1EE3A06491E4B7B9CB2C00B0A8208DE52926418B67C46C54BC73CCA553F3220C80967C16F09E7F442636EFDADF918A98EFFEED82219D651147AD001D2CF0D1E3DE01E39431BEF185D72B3E01E8998CA952297F54918014C906554C8BA196D6CC085020AECA1A28BD488D009748217F151F04B0C80ED6040D37D28FB5D44FAFCB702666EEB4A4924C9CC4401182564136158AE15060214026A3CF00 +smlen = 2567 +sm = DFA5B8A7F99F9207751FDBDE13375C768B195E05EBD9851EB421BAB076D8794E92BE757DF4FB8E4F163002E37D7FAA05EEDAA433E7F4211AFCAB8FCC9132BC5A665546223C0C6047222D47793D7A6997652D274EA21196CE48A41E5FA6FAD5400000976E45B13458C36DB6CDDB7780803C6D0275485C69869A9C00FC031353B1653D5EBA579EB82C9244F44E217A55C34B2CE3006532D7D5F2B1CF18705938618A339B96F8C8B9AD446DA0B003B7B18B38E50BF089E798A526D5D8432BDF498A70270EAC94010A98ACA7BDDCDFA0FA2555AD198191F717D3FE0B35663C000415954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA + +count = 71 +seed = 270BEDAA7BCD43990FD8B4F44FFB63A3AE8E991BB2BF84DA7BC2CCD1A079C579AEBE2082ACBAB7FF286DE795F31973B4 +mlen = 2376 +msg = 326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B +pk = BA5CD9D2664C177350793A6126D0201B2B9EB62BD9E7C0953B6A4A5B980742ED78210D256C567166028A2D06BF176D211275C4B38E21815D2F6A45B56EAFCB2F8BE99B2F49ECFB1A0431AC51FAEA6D8A167B9A81877653A462380ED515F41F0A0D +sk = BA5CD9D2664C177350793A6126D0201B2B9EB62BD9E7C0953B6A4A5B980742ED78210D256C567166028A2D06BF176D211275C4B38E21815D2F6A45B56EAFCB2F8BE99B2F49ECFB1A0431AC51FAEA6D8A167B9A81877653A462380ED515F41F0A0DCDF56469C3EFDA2F53A87A28952A6E3BB8D479432BA61159FF0200000000000000000000000000000000000000000000BAD8A09889723A2CBFE4259D0F0EC2A335C003E0A35055C632FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95509DA0F41F6D229A69F0F9D9930D17B8BE9E82E8B325A842FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000452A1EB5C288DE8B722702E93CACE2A4AD34DDD495F38BB043524A40AE4882A2BD05AC5FAF841B69A7C5E368BB9CF900F48FFAEA4AA14D06340932F427A7041A022F48AF4B2502998BBC450CB4B565077B4CE711A05CBEABB4F6FA151D347E00DC9D7E09F53C9DCAFE436B3B784B1E363DBA81756DE39FA708F14A1FC82FE42D5909F26D02D0EC62E3D193E2F02E4F00C702530B85D81A9D505F5BCCC51F47DCC775A03C4DD1B3890ACBB4B5B1246DBCE6332071BF8FC5F32A5FFB72D925BB00 +smlen = 2600 +sm = 2877A1E6FC120A8B599B1805A791F25ABDB3140D372EB90A9EBE799BDE8B741EDD1A6B8C94B7064A616B6FEB003BBD1B0C95DEE17E86AEB517F3A663749812C5DAB644FAD816957D75A64540DC982B2F63A1B86BDC79A4DA36DDA20A9803F303000227B8ACC81522D66E769E818566625C6DF526C213DB92C21D03F8B33A21497971B6F9754C2C1EFA07AE69B05F773EDA684E03BCDF9AFB62056A03C0948BA2D5FCDE86C1AA346DEE0791FF00ECD3E97899F1D7BE2AEED3C25F8F5A62C9ED4F86AC92FE4000258A84189A0AE064258D152B7DA11F1E801BCB01C24866000202326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B + +count = 72 +seed = F151196F55A9ED88F1663AF6BD24B2CB9DCAF3C9B313CD8F0A27639D3CDAE72EA90D60ED5C7C6AB697A06185E5A2E215 +mlen = 2409 +msg = EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 +pk = 132C30C4F9EFD0FFE7105B0BF68D90D49495022A1864BEE0A1C3ACB6BA22848DD450EE1F5730B0B8CAC750B0D71B7B0DA235AB11F91CC728F946503C40871E04A6EC9D89545FC6D2E8B20B1ABEE953CEBD4545BDFE2B1199074FFE8D8E07672E0D +sk = 132C30C4F9EFD0FFE7105B0BF68D90D49495022A1864BEE0A1C3ACB6BA22848DD450EE1F5730B0B8CAC750B0D71B7B0DA235AB11F91CC728F946503C40871E04A6EC9D89545FC6D2E8B20B1ABEE953CEBD4545BDFE2B1199074FFE8D8E07672E0DEB9CA60B591EC5516A2227E5C8EE0A201BBBB81718DE01B1430300000000000000000000000000000000000000000000DC1A89CA5512F3FD1F2304DC7B7342DE1D6B1D60FAC546718DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF076D9B5F6F4A12E12ED6ED5BCBC49BCD73E43894AB01016C3DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025B00ABA432E194C7BD0980D20E11DE225C8EFF74E0B6F3D19FC11CD11F74B2C935FF1F6E4F60450E255EBC718560400F12F106ACC87FB496CDCBD780F4FA2D142DBAC8EACDDDB39DA44005C1D925227020FFB42D0BFF2EA8899EE1E97C1510072D54661CC4089C43DFD004935C66A4F01D063B15BBC416D2D6DDCAA0443290C097FA58ECCD5076A4CCD13FD860FD6006B3BAA9AB85B9920E9EFD16B372D7067D7CF0593D739BEB5F1DB2B8A60DCF01A548D9D193B4657AAE413BE06344C3C00 +smlen = 2633 +sm = 4C4D8B58B3EA81DC574C711F8DBC44CFB82696CDE583D69873ED2B056D4D79CFDFC8FD1B91A1CAE40BCA38672219EF045BB2D998FA00561FE7BB93EE3161C513A4AF687545A0E2D250FFCDBEACD7A553A5011B3A6EBB6108879C0D23C308152A0002A5B08029E39B70A83C8CD737763F49F60CCB516992BCE5A001CEF3ECBFA1FDC011F3C3EB86CAD843DCE82109E16F3DAE93004030D2BFF3939B3EC1CCB0FE1769505E53D260FAB761FAE9026CA070D34C908C8BA89C222601122E2BDF9B812BC3B35F710298063A2446FC7DCAFA101798C0DFE93EFFA43266AE99FE000802EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 + +count = 73 +seed = C7ECD1EC1A3D83F5116C0AA4345FB3ADB4D9F81BD79896BC4932EE2F9D2D1F179BAF7A002D88F4F69071A7931E7F7FAE +mlen = 2442 +msg = ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 +pk = BEE14C675116A2B08C27B3E063AC4C38FCCD4F29735CD589A5EE24A0DBE738DEBF5739920A960191AF8AE139032547131CE636DEE68D11ED5888DEA71116772DA141B5552F330CBC2DFB4CAD245975A98F9E519112E2A933F99E25B88C901B0C02 +sk = BEE14C675116A2B08C27B3E063AC4C38FCCD4F29735CD589A5EE24A0DBE738DEBF5739920A960191AF8AE139032547131CE636DEE68D11ED5888DEA71116772DA141B5552F330CBC2DFB4CAD245975A98F9E519112E2A933F99E25B88C901B0C02099E14B52211926F0DCD9FE7B33687CB87E255656FEED9F5FA0900000000000000000000000000000000000000000000AC1841B3060D78CA1F9E324E6F3F4BF10786C0B52202583EB5FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05269B89D3029BEDFE71DDB649779DDEB812C09C62CEE0BD38EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033FF7261A2B91E00F141ABB1413B42C6AE26952F17F6F0CD8382EE7966EE64A6FB49BB3B13A0F1E375758307C591F10011489AA5C0E5249DFBD4F1F473E21A33CFC20C03828C5AEE81F8A634425609244479A113EDC3ADBA8CC41A43E5D2DA00BA5C69F926D79F17DB7FA944B0DB281CA9BD35F2A1DE14BE0C4883EB5C6BA563B08A657AB0E03F529E25F6D1B8F9FA00CF4E1D932DBC0D588F3B861B683F02824C328406EBDD7F7C14670E4CC1BEC9D39C4FB9A02344F405869EA492558A1C00 +smlen = 2666 +sm = D4D4B923805EE3158A5263F0FA2E2D6D5666B44D4639F255366F1BBC17B2106FCBABB9BF08A62E43DC86921AD8C8AB065C5653B020A3B15DE46EC3D3A42A51FB99510146A7193A9031BC78ABDF7DF18F096307A838E61F0861524C7D16F498360001EF5E336171020E63D537E8A450C57E8AC0042D10D5639E8803069BEF526589FBB06A74B1C69F47A96B064D19483F5E773602D73596F1A7C1BC352E8AB4C3D24439993239D407EF5AC9CE02CCEBB3D55E79AC9AE430ACCFA7D0D2B260C3CB1B1FD1C4C502F3D34F69AD81F2896899B47AAC5EE5509467F60E675F5500150CACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 + +count = 74 +seed = 5DE03CAB3CBD81B8805A17E0FFC2105C3BCDC8D782EAAB161A15AAA543FED59353C1FBE03E7F36B955FC51C9B30F0C93 +mlen = 2475 +msg = 5F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 +pk = CF4AFDC959CBA52F3F48419A6F93962E4332CF8B2A078817201DBFDAE21EB16C49B9A4FF749A5AE44851C92A02F2B53D13C6D703EFE62FCA2CBE877C4064246153CC0F75A1E690EC13B43640B751BB8DAFBCBEC78E365A77FCDAD15CD27DAF1A19 +sk = CF4AFDC959CBA52F3F48419A6F93962E4332CF8B2A078817201DBFDAE21EB16C49B9A4FF749A5AE44851C92A02F2B53D13C6D703EFE62FCA2CBE877C4064246153CC0F75A1E690EC13B43640B751BB8DAFBCBEC78E365A77FCDAD15CD27DAF1A1977ABEAD17F6C35BE6016DF64C2BF86BA04AB6918E56E10FE651100000000000000000000000000000000000000000000A2C27A3EA02B045956A3DC7153F219072EBA623EE649566F6AF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9166DA272ECCF8D3B64B5E79C05C7CC57C243A92F73C7B6B7FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042A114C152859285C76BF277CCFA2B1DF971A5770E45571B8AA40F27C1847A4C9DD9085CE84C77F472819EE4D0B539002166D0E515433C2C5FE0AFADE87357B670438DA6973FA6DC66EC225B6D3955564DF7E5E96CC0C085607C6F278904F3000D67E8C3CD355E004083AB8C47FD579F3EFA49DFEEBA381F6D3A494054ACD5C4F7FC849DF468AA45454FB410472641003DD825E58FCF6905EA00E8337003D1F6BCB80DDBE0AD6A8C7AF6F7A1F6966E7C2E3556E5F82777A7D196619A94BF5400 +smlen = 2699 +sm = D4B4CA1D7A855ECDEDA3C3236D4E643AAEBAA0CE2EF6AAAF9D41733BF9FEC417E59E27D0EB1B137644826D603473890E6212AFB0E2F1D38270D07848E3D21A81ED9A9F59BFADA39DDEF83B103B299381D1A4A6FE654D5290FAE3325E7A8AB71B0000F8154BE0F3752B57707F73DEF3CFD1F31EC040BE6AAD12F6008D313DA89790D89C957FD4F9EFD54876490E7A60A0A21A0A012B00096F4DD4BDC89ED63AFCE455CFC1970D1E72F82FAC9303B6D42C930825860F1369C54F84CBC5D17383B47FE09B4B9303E6CE6EF110F91EA2C91B311A18ABAECFFB5B7072602B0A0002025F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 + +count = 75 +seed = 63742CEFAE9868C3C0B31DDE0F9D378FD5D71BE7CC3F0B6ECD393DB55FB043CF00264852C45D1836CC12B9C872A20251 +mlen = 2508 +msg = 9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 +pk = 835CD070D41DC42AC9590767F5F3C6865B0DE9235AC28069AE32DB78981F4D9D2FF2777E9B50E97139D2CAF8A7605412FAE4BCF0C9D306D938FCB3F9650C020955FAC1D6044D39A8581D6FF22E591D8098748862C2499F24EA4D25B32DBB9C1404 +sk = 835CD070D41DC42AC9590767F5F3C6865B0DE9235AC28069AE32DB78981F4D9D2FF2777E9B50E97139D2CAF8A7605412FAE4BCF0C9D306D938FCB3F9650C020955FAC1D6044D39A8581D6FF22E591D8098748862C2499F24EA4D25B32DBB9C140403F1A4721D6E4C05B3C89B35654F7F9ADD47658B87CBD44A0A0F00000000000000000000000000000000000000000000569BBA1FF16FC9DEC386B54AB823ACBA418040FAE72B9D5BA4FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D01D4A2FBC684F60EBE6EC9FF63ED69E9600112F375F1AE25F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000861E7C50502550B6F2EBC5166ABA5104F244C3E88443422B7FE8B1E891386618CE31B5B62F692B951809B09A22381400735AF989EE960D2A324FAAD70CB4F6EB93E91429244D627FFCEBD136BA4D895CF04506AD102E8580F2EC396F08A4E00055CFE52D250B09369BE667E187768030D28B042CC7EA261BA13E9C61029B09AFB687D924D67473E4613F72DB745FFC00CF6D79F6AE564303F1BA1D81EEE3E9D435C1D39618FE948FCC2A9BBBEF5B83B6224BBB0978AA0E6608157D8261581A00 +smlen = 2732 +sm = 5EF3010BFCA9EDD53F5F2344E54A90EDB59B2A59B78DB5C63ED903D2FDC5895EA7FB3C48C11514C43DAB46D231F30A34A3E6C74603C627182D71D89D96B24C6BB8FD353DB90D69A16203FA22C8FD6E41DF9A33E3F1E1AE4BEDE4F6E03EE41904000089DA8A3B361F2382AE5B9A325FD1A729DC26869CDD674572002A51315DC69620C3CF161D04CA8B3665D2340F8CA3B139B001FB464E451AFB40D294B738DC59F18AB41A3AD5E547C92D7C01BF6F2F95405993794DB5EB96D420DD3B1CA815C76C3C0FEA00FC598ED020541C44999D95C96A613B5E5371DC4EDF5C27000D0D9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 + +count = 76 +seed = B887F07DB5358C3FDC2402947BBC87ABD064B02A859FE8DB37B5BCBB916020443DABA5534A0778FD0B1C05EF3ABE6269 +mlen = 2541 +msg = E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 +pk = 15FAB55E3121101F1181793C2FC138817291F5147C8809678737FD8C01748F5C7600CE31EB8F53620B1DAB26ECDBB83C62699E95383D56B2B29CEC543DAABF784AAD998AB8DAA84AF083E868DA06A867E12A2FD844FF37B6661B98AF1E177A1C04 +sk = 15FAB55E3121101F1181793C2FC138817291F5147C8809678737FD8C01748F5C7600CE31EB8F53620B1DAB26ECDBB83C62699E95383D56B2B29CEC543DAABF784AAD998AB8DAA84AF083E868DA06A867E12A2FD844FF37B6661B98AF1E177A1C04118142897BABF4FA9880D36B9F4D5C22CCF73C390A9046510A1500000000000000000000000000000000000000000000122F5D2D3DBAA0E65CEAF32AE70D58D577DE12C4CD1BFF0388EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE79178E83785C758D91C8CCDC477639C60ABDA094A65F07835E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005B6688545F9822DC2B35917338CAF3B47E172D888E21F1F1E8104C8A3165FA6D8132FAF0F1AF6A731DA605BB9AD14100E99938CF640384B2B4F683F98D723ACF639F221CC8D79D80207058E894B19507AF59F8876BCACD89CDADEA53F8644F00A7E1684A28AB7C08A4F90AC32C75FCD0C3304D07AF7776836BCB5C9453C350F9D2BFA5E599051BFAA2243E043BF95C0080491677287770BCD3AC104A353F3C34E26EDD1B4C65DD82291605474404C3EB03E844B5BDE6AFD2EAD6C87D6CF4E200 +smlen = 2765 +sm = 1C233766E33D08A9FBA88A987A31337A887334AC0EF0ED9471F610D337DE5717AC914F15428002C74CD654E96F85571701B6194BF53EB45347ABA26C2C94552B564EE5AB65D46A7FCE11A7A5370AEE6D6D862C2547F45D670F448F771BF4B10F000302FFF6D1854E06F652317690541C2D44D9FFB3159DFFD607011587E5C0248B7CBABB1277638940A49F140B940FE4D17A65019C590D611A5B1F099E8076FAF3F5045330A2F8B84B09FE66018AFCE1C1C6E41C9D2602DD18F110CD81A547ADFA1286C3EC006554C8376E5CB39285CEDBAEB360B5F2373A62FA18BEDB001502E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 + +count = 77 +seed = D08A139CC7147ECAF4B1D1E434EB2EFA2B2607B0033D8BA989133E496DC9F3654944C7AF91CBB79866443E8C4E8217ED +mlen = 2574 +msg = 34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA +pk = 1DA727D91FDFB84F20B871F4D9598DFAF7603C574C81FC06F1C7B88DE847CA1DDDD9626CF66C55ADA5A005377AFFEA1E7D7E2DA73145F475412E327DDF14A7DA83279E0384AB175DE5C1E9543534F50B1F8DCE8C0E43781185E2BE73BC9ABD280A +sk = 1DA727D91FDFB84F20B871F4D9598DFAF7603C574C81FC06F1C7B88DE847CA1DDDD9626CF66C55ADA5A005377AFFEA1E7D7E2DA73145F475412E327DDF14A7DA83279E0384AB175DE5C1E9543534F50B1F8DCE8C0E43781185E2BE73BC9ABD280AF70CEEBF2444424F9B3AC7071C65D191C9A6B990D70C413715090000000000000000000000000000000000000000000048F830E64FB55DCCA71ADC8CF99E321825D04936A8C396E1F3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79DF1732730D08F07A880001A9EF0ACA2A0B5A1F6221506420F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000079A6C2A166CBE4ADCDFADC3CFBF9AEBCB368A37C533472E87EE5FD4D25E50F1DAC34D79B204FC5A3CA7040300EF34F0064958ADDD4FFBC4AD33C6D34AF5D6AECBCBC246AFA58E0B8D4B6B046FA16F6EB56B1C06841C4B92CE2FCE3A48976E3005BCCB747A908E13454015B23D3721F9CB408DC8E9AE05C57FAC55D5A6259ABE6DFD4E5724F06EA646D22F292D16B8D005B170E4BC6C5457ECB01FA5EE9ACB66B43D12BC15EE05DD91D67AB17C33BB640AB709EFCA9CF52F596D7FD3C9D0CD300 +smlen = 2798 +sm = 1CBF4DCF893B8D703AF5144A30CDA3931BFC456ED64C1179A398EB8DA3E1C3D03E4546C0AF6724B4E1597D8CE7357D33DFEF4D1AE2B32D3497EB8CD7B5BCDFA036686BE90B134133EBD731A0FD4961F472448FF48EC1273C315E6EFE6F832822010416323EEE9B2D117510738C6E859B65C63E41915C616A2432007BB6F1AE0EA37B065FFA4E466859DAE3E484220E06091D820030A96BD00F80C64A2BF8C8A8F720DCC72D964C0466B655F30090828844FFC346BFAB80FD8F2F7A99880DD8243A7B85CFD400D3356A9F8F168D00F53A46300D45E71F6C97C6B6AF0DEA00080234FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA + +count = 78 +seed = A315BCF0E6835892ADFA07C034BFCD39F80B62925A95490B20170BD29378E11559C7F1CD296377FF1E01284EC727FFCD +mlen = 2607 +msg = 96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 +pk = 95287E919BCF3240EB644E1AA22BE9E847E4DA00BC7546B3A3B1D502BAD27C70B9EDD03C156F864CBA78BD1E4DF0F81E0518A2D65A1BD153AD39C08967950A82E5149F8105DCF885F29634F16CFF6350619197A50C16C2C388CF80954B48102B02 +sk = 95287E919BCF3240EB644E1AA22BE9E847E4DA00BC7546B3A3B1D502BAD27C70B9EDD03C156F864CBA78BD1E4DF0F81E0518A2D65A1BD153AD39C08967950A82E5149F8105DCF885F29634F16CFF6350619197A50C16C2C388CF80954B48102B02E7419B799D7371790C1937040F316CDB072C37386F0728D6BB0200000000000000000000000000000000000000000000A8F24B608C234C299B9F0A3360FAEBC8E3059BF7EE84155F79FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF918D16ECC79CC761D2576B2D1D56C0419786AA88B8370E4935FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F3512082367F46E6839CDD063DBFEC8744CC8A1F8D0980653AEA56C3EE0C0D79F5698FE10C7FB74A3F775153BA9C900C09C9EAB4C2A99467DB671994533B1E3D748D41DF545F2EB2E14F0C3A74A97175F47692CEB426D38D07A32129DA2F500BEA48E68DE452560ABE63BC86402A4999E16AEC26369A64E6323BCA3CA941DF5BF9F5F1AC5E97E39912C6AFAF270E60061E9B939F0FFB658523F5E467998E270CCDEDD5725468A3676180BF9290E69C2810DB7646EE76CC643D483D3EAFFF500 +smlen = 2831 +sm = F6614CB7F8D230A5D2DD029594934FD84DED309F1759F2F2D744A8060EA114BA4B4912DE90B848582F1DA3060D8FBB161913DD3B2D2263E9F9929D4F2DF35FBE10F32A12E0B19BA2E450237FC692B8FA5B2BF4BFD1063E087180F5A1EDFE5D2F000438B2A51C9306737F4F7234B21C129A51A6514723182C9F3A009139EC8F1D2A832D8656B9536B0622526BC314C1ED4DD0D502F05514E8B1ADDD036111D22438BD86CC5DDD648F6B8D47690380CB6D9B9D878665F41FA2F6A140C28A5F45D3B3196C013B03C266FD06ED22AFBBA70D11B716EC8389E23EB845049AE3000D0296AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 + +count = 79 +seed = 8B47E0EBE786914C9A52D547106CEB4A3D3DE938B3244E02E5F9660954C4C95A23F2476FCCB487673AAD0513820905DF +mlen = 2640 +msg = 2447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC +pk = A53CE76B2D27DCAB7F2A7C855985519DE0DE8072E01C97836B1BF76E02DDC34E47BE697458095FAAF495CDE9C962A91D213963F478EE73FCB808F392BAD761CD76FE69C2F00CE22A7A47CCA98661C97DFFD738712DE7AC5BF8D523B180B99A1004 +sk = A53CE76B2D27DCAB7F2A7C855985519DE0DE8072E01C97836B1BF76E02DDC34E47BE697458095FAAF495CDE9C962A91D213963F478EE73FCB808F392BAD761CD76FE69C2F00CE22A7A47CCA98661C97DFFD738712DE7AC5BF8D523B180B99A10047D4F265F5BA419280B0500A4B5CFD0A6DC269834C8A567B4A10200000000000000000000000000000000000000000000FA95FA27CEF991C68E0DA28D82E572A8CE25AE5AF1442B2D5FFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE965221AF86CA03BCD00EED66E8ADECBD6DE843D449D828E5EFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000645959E77E253353FB7AAC3E6CD346BAF4183510412B0DD568A014D357ED125C396E66761B0FDD36F2C38DF6EE117B00C1E2338B21619DB4A2057A540493FE1C2D1DF589209FBF94BCEDBFD32120CF24EF85A0999532DD3BE7101F7A38D31400BFD55F5EAC88C39EF9E173628E0114706C86F308E3DA10D8231A40053E5560B0982F71573F93EA74747116551D81D300D259378D6628383F3BA13770B9FCB92C199B74A82D5C22D8691558D7B7C9D3DCDDB1FF8184A5736ACD0A4C303B5F5100 +smlen = 2864 +sm = E99A7427F53AB20D3786816915C1DF359FC92D4B3EBB079097AC17554947E44DE3C27B441A6455E17D73A817B2D43018DD367AC0FD64826BB47C2F742305A32FD78212AA7089B6BF9269ACCD0413441DB56E1C497E1CB8AC89DD91F208CCC21303015F6C9ADFD32B615D480EA55EC901FFB20A1EC93180FA4B5800FBB0D40CA3CEB1E33179A748961CB25F269606AA2D73847E00E162010996326D376F525B6FE460D96FF0A29A3D135B4E6300C74F2AA755265FDF8DF28DD827374000D69F21D2D0EABA7200AC13B4593E1BD8BB8627B719A344BAEAD361A700513A3F0002172447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC + +count = 80 +seed = 07CD8F8AB7CD12EA7CC94103B8623D6F0FEA2BAFD2325BF6089DF5351BDBB9A94525C3C6B72D3820F2E4D5F9E7C849F8 +mlen = 2673 +msg = AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 +pk = E79859AE6628025E989609CB3E80EB5C31F03893B7A5A06A5984916144AC938A7203D0E13B5ADFD8AE32271386D69417879F7F591B146AACDA36F7071C551FD68DC3D43265B0DE3D73C3E28426AC79F759C1761BB75CB606168594C0E3EC4C0902 +sk = E79859AE6628025E989609CB3E80EB5C31F03893B7A5A06A5984916144AC938A7203D0E13B5ADFD8AE32271386D69417879F7F591B146AACDA36F7071C551FD68DC3D43265B0DE3D73C3E28426AC79F759C1761BB75CB606168594C0E3EC4C09023D3F21640848074D8ACABD1CFA862093FE1D6BA86708AB564B070000000000000000000000000000000000000000000092D1617E2D40BA3496DAA1188214EBD2F017E7B24AFB63C4CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF035166725F31A35BCBB9BD8EB1B94C103F0244BFF7223A12EFF2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FC9BE2CBB461D1BA109A26FC06D9ABF99096FB069210BB4E30A2AAE9874672B8F08F1A2F44E09727D621E1FF1B0A2001C651CB48D4E9A0B8027AE324F6D2D31602FB90993782483159A792FA08B7D08F7CA406B569C234D0E630E43F2816500D67B2DF052DBC3EF25DCCF0CA2AD58280446CC5CB1CC8CE324AC4B0B6EA51D2D718E6909AF3A256A8E23AD00A654BD00E9A7C1603DDC9BDC0DDB4C428AB8C339FDE87F4C131A201F04791149D98C062F3E12F47F278EDE454A81E2BFB691EC00 +smlen = 2897 +sm = 693743042A9D8204478AB4D99705A1D2BE4FB9420F4D4C1A0DB4EC37BA0E701CEB7DF0CBA369AC6BC615EF830088CE29430AC5D9E91BFF78D9AA025A7F4C05EFF31562FACBACA30CF39FE47154864A75969B1A44E6ADD1423D87B1C03135A1140003EB7AAB48A5D424B4D286D76885570DA362540ADB503F07C000EB1DE8300ED982B994512EA00CDEBF9E4C948ADA66CB36EE03BEB718584A8B8512D8A704A3C8BBFD141504D6AE9A5D33B800F66A9A69210F33815451DD66A7F57D0578E7E100884E2350000B8A22A07FB3C88AB3E004666DF10A5488104BCC028F4600040DAAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 + +count = 81 +seed = 3D598F7C498D8A1095C40945975380554BEF6142578638A7627E2C0A21C59C579F8E8CDA309348FC54C764C899FB93E9 +mlen = 2706 +msg = 63EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B +pk = 77DE3A17913FD1A2C293BE3F90F575C69728E7361AE956779DF827102C2EED76D2337F9EF885A8314A977058B3E83315EB1B132D7FD05A43C9540B002C412C23AF08AADC2AACCB1A9F9D9961453D10CAF45D01D443654D169C91E613E2B75D220D +sk = 77DE3A17913FD1A2C293BE3F90F575C69728E7361AE956779DF827102C2EED76D2337F9EF885A8314A977058B3E83315EB1B132D7FD05A43C9540B002C412C23AF08AADC2AACCB1A9F9D9961453D10CAF45D01D443654D169C91E613E2B75D220D4F3BA7F012B23D2E4E2CC84E460BDCE4E4019F63F42F6910080C00000000000000000000000000000000000000000000F45FF0D97ECF31FFBF586AA232A99935FF21D41D97131493F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE32E0CDE040E8534B0ED4BA2A3D531EA62F7BEBF1FFA7FB40BFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000291482AE24E930B189FF3D1E5FD2C0838BC096F3ACE7DA2ED4CD5E15FA1CA3A496148F18BA3271BF6E48B507D1442A009956ACEE0C81D747BB4434CC5344919CAF2357F5B09423AC56A87CB78A7309133F12DB0DC2E86061FF92EF1AD05C76008D9056D8137BD32EBB51ADDF4A48950527AB0552569301B907B00BF40CC1EFF76F1A48E38E2E8B169DAE4AB176CB550054658EF7912AFD78A7761FD22D80B796BEF6DDD130DBE3B9B7941E2C144CBC9B7F8E335545F8133E9B92E8590A958800 +smlen = 2930 +sm = 38F5E92E5C90B568C2443E985B5CFE3B48E18A4EF5708E7E52AF54C9460A8566282B711FE892F49A210EC678718FEA3D7F5A1780EC36E8D6A2C6BB7541D874EDABC18EF24B3D798781415E310D2652083DBB498FB9672ED1D95F39F8AA982F3D0004D53B0FC2777CAFDCD99B95CEB4F3CD4E8CA1D183BCF4253701368F8F8387BECBCAFA1F27A83D575B5B471C691656F2207000D4472C807AADF8B939707C3A280E24C685A87210D68F26EE01286C1D04661FB500C27444A85041096BF0E920BE32241CC102662428146775FBF809120C43BBD6BED7CB80BF573469C4000D1563EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B + +count = 82 +seed = 6CDB757AD36DF99E52F535C2680431D5FF36C812D8EA19399F666F2FDD66D3A842A7A5AE1038359AB618FA58A0A6E840 +mlen = 2739 +msg = 7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 +pk = 5C2398340A0F0CFC6E960527C31AE18DAE87822F75C1ADF4DC6EDBECCEC6C1779C640B955CA0C929505CCEB531E690395946348676CA5109BCFD4C38662D0F74FCB613642AE0A6A3CC3DE4FED0D643D2B6CD3870EBB2F59A31B80E99EC56AF120D +sk = 5C2398340A0F0CFC6E960527C31AE18DAE87822F75C1ADF4DC6EDBECCEC6C1779C640B955CA0C929505CCEB531E690395946348676CA5109BCFD4C38662D0F74FCB613642AE0A6A3CC3DE4FED0D643D2B6CD3870EBB2F59A31B80E99EC56AF120D21C248C30983C2F68F45AF273F1110E59619307C11D519212D0100000000000000000000000000000000000000000000B2A55856C5412D40023EE3720B031127DCA5BABDA8AC5BD408FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01CF6A4FDBEE879E20F4D0A88434D3D57E9C116F1B52BC1CD8FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B344EA1C6D07EEF2A2BD32815C58700F368070A5C18FC65867D7F765AAA3DBEB1B5AE92986165C5EAD25A9E8C307E00C881ECB4A6067686E2B6138E841E47033AA00BDF4AC6EEF45A50E9ED9F1770C6ECB6B2F060ADB6F6E0A4B875E812D000D1967440939EB3CBD2F74B4D681F4EA870586F39815A420A767A87E065AFD1992172657C7D1AE3BB9284627B02CA68007345BF47F973F17FE4F7DEB4C2CF227360AA93683286B09D01B75576BD6F1313B10C53D3DFB3DB495133881B369B2D00 +smlen = 2963 +sm = A924C44DA7605536B88C17792EF9723968A48FB3B5CC12FEE66FCC3D70DB9FCE9BE4141B3D4A6EDA83471EBC37BD1814AF6D7D01BA3FBE71B98093F0922B647D46BDE31B5B9DA1978B80E2E033BEB4CC0B8B8BEDC4A93C563F13E4383405CD1100015B46DABBB4AA3D21E631933807DA772A43EF646D86715EBD03FB76F1720D999DB0E119B0EDB02CC86490A11028F0C28A8F0147591366B1B3F3AAFD311B46F8E4DB66D620078A5C46015F02C5FAE39228470EC38EC1C530B2C82356E401670C68494A93007FF9A21FB05B76ADD74EAF034CA38B2A2B02342BD4FB33000D177785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 + +count = 83 +seed = A97269579EB70D268C58D94FF744329B197F722A8A407B788510DDCACA34C8CD4C72FFC14B76300C86AEA1E4CFA66BA4 +mlen = 2772 +msg = AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE +pk = D6BDD284A3EBE2C62EB4CAD038FF040E0FDB58799B4FBC547C4731B0A0EF6789000597489E2475B8A5F21E46AE2AD9271673E16CD029C215002244F6ACC4CEE2C6A4E8F2DEEF47E1ECA318002B8A2902FA876408FCA8A3DBFEC99FA642B9A72B08 +sk = D6BDD284A3EBE2C62EB4CAD038FF040E0FDB58799B4FBC547C4731B0A0EF6789000597489E2475B8A5F21E46AE2AD9271673E16CD029C215002244F6ACC4CEE2C6A4E8F2DEEF47E1ECA318002B8A2902FA876408FCA8A3DBFEC99FA642B9A72B08B581668576A9260F7E6776FDEF40D9D1C1751C0FF2E441FDB70600000000000000000000000000000000000000000000B0774CB197CAEDCCEAB2FFDF2D119EB890F812704AC576F07EF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D0EECFD0D26D95D713901C660D326F0FA119A432BFCFDE5C2F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008F99DD57758F62A19C73A2B8504BFB76879B967CF7631B4912525DD8EA419408B38FB671D5C44441E572B8A24DB6CB0007536D45412EC5C1259AD4CF108A91854C4D1F1D7AFF460B450B1FFF2E5A8510EA52830FF7A103DE3336AD7F9C86520012E24A245F6D148BF8FB04B792FE60241CF68D776260B13EDE58CBF751D33FFC70EA3B1C45E75BF77615A9A8F4DEDE001F4511646E773A7613D549FF5A59C001C83E42CD3A8512D86B7F7C6128D64917082DD1A9A790FBA9E279DC7FFDA1E200 +smlen = 2996 +sm = A1BCFED6660C47565DD1739C9293D275427AF3D90A6D9A1BC425B08B20A2CFF232020CF6308E9D1938CDA0979CBECE1A79E5850F3F325A954113AEB65F87D0D4F3582C7DB59DBE30FB346185D7DD2C291DE730779EE850E216E9265A59BD150F000111F26C617CF70C1BE0A9F0E840B1CCF379F31B4300EA6A1003CCBCC1517FF24D1CB1016BDF89D1533E63E21411A23CD55F0388C6DBA698A3F0D1EB8985BCB7A5679C8C421B6306858A2701F653E781CE3DE81BCEE1F2716DD4A37D65165A0AE44537A100185D77EC413ED797CD3C2E3D0235A2DE28A115602CC2F900020DAE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE + +count = 84 +seed = 483A81716F91A43ACA6764C4BD2A57C9156B762E9174EA49730A6BEB9CB19A0B3755E37BA47EC524BBE2FA25B9FEF687 +mlen = 2805 +msg = A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F +pk = 9659687AF5AD44F33E14D816D3A1BDE87CDE7D760704F45B389EAC41EEB8B195190EB4F91F3DD788C16078808F10DD1B5BF7576B8D0B72AB5D1D3C25E7C1E36897858945B42FEDAEFAE5E7D9124C456FEA79F4C8A6635B1BFCCE3238B09BD50504 +sk = 9659687AF5AD44F33E14D816D3A1BDE87CDE7D760704F45B389EAC41EEB8B195190EB4F91F3DD788C16078808F10DD1B5BF7576B8D0B72AB5D1D3C25E7C1E36897858945B42FEDAEFAE5E7D9124C456FEA79F4C8A6635B1BFCCE3238B09BD505041D905A1A9CD52DC86066312EA07DFBF0B52528ADC1E1B8B43F0300000000000000000000000000000000000000000000D63C0941879D382B59F8700916E60DD9251034A8D00DD5955DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF195015C551C272E53122D06A61CC4CB3842BC217F0C0232EC7FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BF09B1D841397A6418E605426CDC13C26B27A165B794B3A1D0392968E1AA04CE04AFFB8AF3B65565B1B622A2A106F00DEE57702B31FE804B986D3F2142F8345EF4E7E898266D672C939191526A72765718FF30C3588103BA4D062A8B2818B00096937BDEADA53023D5E600A560589F13426F76AD1C180BE429D8CD3497E0A67480EDA3060EC057A721C1B3B9A038E0077B3A673C444B84D2FCB4EC8C2DDD12BA41359FF14535CAED2E538880E846EE21B99EC4747EEDFE26934037D02634100 +smlen = 3029 +sm = 3D5CF30783C0F6F9F6FF90002F5F7665078A14530A47765390242575ECAA2413A7174D64044AED3A65488EF041EDB70DC786D45DCE1094C19DCC5EAD2179B420043D0DE4B4B2EA4C9491F0D40E6F23F886C87B5E07600B17A6E26C972847DD240102FA8377F609D7708FBDB913B7C8D8B676872C5A30348E7E6700FFD5792A93A67B664D17F60ACE822DE4068E9AF7892506B90078BFEE0BA52FA738B41A43A013A23227F140EBA96827FBC4001EA4C4D451F41A6E6BB1E8B92F657F19E052E7841254C08C00EC80F109DFB1813DA4E0E66F81B24CB3F03B174F7CBA4800040DA7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F + +count = 85 +seed = 30F0E117513AAF27AB2516BCEADD1188B4BBDE76E57DFAF43CBF2D70723D941E8F875C5EBF02BD7D67AE81ABCC54440A +mlen = 2838 +msg = E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D +pk = 112207EE865D8F5C4A1953200EFF4B9CD183ADF5F7273EC368B9E6136769F7242444BD9B3BA1D208FCEB00D6A22F73401BB7079B62A36F4512F4097F933059B7C9864EFA90DE27D396A5DF25BD0BD055BE17E314762DCFC181D0DFC91B87F12402 +sk = 112207EE865D8F5C4A1953200EFF4B9CD183ADF5F7273EC368B9E6136769F7242444BD9B3BA1D208FCEB00D6A22F73401BB7079B62A36F4512F4097F933059B7C9864EFA90DE27D396A5DF25BD0BD055BE17E314762DCFC181D0DFC91B87F12402ED4950B286CE3A9553499DD854275271B3F02AA09FCF9ECBD40100000000000000000000000000000000000000000000AC50C59E66B7923B10BD887EFF94236D21B8391D8903C88B92FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5191FD455D3045648E389BFC8BD80B8BAB143168575BC4AECFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004CCCDC44728558A699584C4CE11F983C614A1F82A62B162D45FD0AE943126CB3105EF02C629297F55F77F32C09DC440019C1441F891A3C2D897DF480E0117A36603A60E8126FA9EF5796928FD9456EBEA70B8CD3BCE7075EBA20AA5E92F838007D96E85006EC47F85576521DBA6E0FBAC937AC0E382243744FB88263699624E6AA4A4097DB3108A5C8B6E979A6564800AB780A1D31F4359816733146085A03ED705B1BDB4620F6F50FF1BFFDF70A8A12E5B2C376811FF82993A453026A2C9100 +smlen = 3062 +sm = 3826E68E7DFED6A4D2DED374397D32624DDC2CE4E4172273B5B99F4515873DDB5B93ACFA43B1260F22A8FFE651898623DAFE336ABD4C03313D173AB55F2C7DF4719BBD808337621C0D219983B2BCEECBC2B0948B7B6BEBCF1EB91B7CE14CAD3B000397F249F297B275118323415CA218F521C40DB0232D22E92602037CD089CC8205845616257A64D13D32C646C73EAD577BB802256414F510EC1271B1482050953C852E85C54B56EF29A19D02815CB96624017AB03A043E222E98539B8D431BDB2DB8A869026B4860C07058A0399A70B6B6FD6D3206ACCEDCBCAE952C00100DE43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D + +count = 86 +seed = 070FFB907EE8AB7152A9D380DEA2C4C4796780FCFD80906C5E489B917A45D5E7EDFE6F37C4420E5480E8BB599FE36451 +mlen = 2871 +msg = C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 +pk = FA504CF77C4FDA63BE02FAF5C77315588E4512A8A28E28FF9D52EBA6E8D9E9D5BCD9F20F4EA3CE624329876D69584507EC002663B5244FD836C9E2B5F55C784C7C925228C4188A05A73E227D17FA22D68A7C2708825EB82CF22E302E39998C2402 +sk = FA504CF77C4FDA63BE02FAF5C77315588E4512A8A28E28FF9D52EBA6E8D9E9D5BCD9F20F4EA3CE624329876D69584507EC002663B5244FD836C9E2B5F55C784C7C925228C4188A05A73E227D17FA22D68A7C2708825EB82CF22E302E39998C240253CABF059104A5CC8D3B73B9CACDABE3479C0E4056C776275C0800000000000000000000000000000000000000000000463CEC107D8853F99BB4B49AEE20C2E42B6D2B7F55B504AB1EF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D9F10E85759C6D1B3A87457B299173F823EAF9619957DC3F4F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC0F953B393A4C514673824F6700220BD8A1FEB018544EBA5D9E877D5A2E69A14F72B50606BF3CB7284B0F4C4D12CE004BE3E5830097DEE7EDD6E5E14E3F625219AC341BD679D56C09DD45CC815AE4F685CDD7572CB9FA36E585308977E0BC00B14A0D66192EB8A0C26376EE1C7ECB4448360711AF7F2261B5A17A628143E389BAD6EC7399DF5ECC2B8A361B2B721800FCE44733282B69EBEBE60571DC026FD205DBAC335A2AA0A1EA998E25AEA6DED646022A2431DD61809EF4CFB8D7E4B300 +smlen = 3095 +sm = E99122084AC80C0D3C3C14A49438A889969402D8BB91E150ACEA5381E7EB31CB7C976D0C5FE95D897A7211827E83A237A5BDB04ED44A6BA7E2B9F6A81DFE525B4C9CB13A928AEBF677F1E2A96C93622F127B1A01006DD4CADF4903F7E49C6C1A0000731A1C42220F2389B45A90F1851A7F7E52F17A140F63F70202F0837916B393E6F27B09707B9AC82F657B90A3994F44C5670136371CE9B77A65A615079F6C4D4F2CF2913D908062F526E003916472099B2173193449CFBFED6DC55F0078C37EE66EB28E02C201E0F4184E62702607796B16046F124F561390C2919F000615C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 + +count = 87 +seed = EDBCC4F6AD0F30066947D678A368B960CCD164889D77730516B444ED2DF10B49C101902F5FA227377C3163A0045B34E4 +mlen = 2904 +msg = 836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD +pk = 69806CCFD3B14DE9794E5A3C5F598B4AD580BF29CD59790CAB19DB97339620CA6854D1252B440A126B6BDDD7A2FD1B0B0A0525F34E891FCCEB8A403AFC054074EEC772A8C89D7CA54FB2FAEB758DF6451A8BD45467F91DE2071EBBC535D8202D04 +sk = 69806CCFD3B14DE9794E5A3C5F598B4AD580BF29CD59790CAB19DB97339620CA6854D1252B440A126B6BDDD7A2FD1B0B0A0525F34E891FCCEB8A403AFC054074EEC772A8C89D7CA54FB2FAEB758DF6451A8BD45467F91DE2071EBBC535D8202D049F38FB31026B48A6B2380BC75BF482487E8837CCD64E10818D0E00000000000000000000000000000000000000000000B6A2EA04334DE0F39B65C09C985352D020279259E4AA5C8E54F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75A168FEACE66EA7BB05AA0BE86B36231EFF0B530CDC951013F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004AAF7D8B8DAE001E9983CE8E15CE2020D34C864A4E237E0725796E3CA9BA9B280E1FFA36581252CD60F7E6443E28B600B78AAF33B4EA669496B8C2859B164205427C5CEB314A397A7F37E18F5100DEA2BD399BCDB7887450170EB6DF6704550041CF98A984F732F33A88C948586A82CD8543C19C0EEA281BAFCA802FA5BFE1B05FD3C28DE799211C89B855ED51E8A5002B6D43ED61C7310D9E649EA1971CDD8874D0FB3B226B50C816F294D7121408603B36FED9C0AE2110BE6508839C28AA00 +smlen = 3128 +sm = B7D69B13D44D476433E1FC090134A495E106A18A80DCF29660A647096B97F7DBC7FE3A96FB0E0F6251BAD2B2B07A7E36D8F9C73FE19A4F358E0F477B1D0BF4B87C6FB8F6F73FD668BECD8729A78DB5EDFD1B051834F4B4491149C5A1017A653802016970E05E9528A100D8277A548E191F0ED9BEF9EB0BD0B43B00E7A198CD861C718F9A04A01AB7B40001AE8E223D45A5FC0800FB30DADBEEA5677C5FD655BC897523E8DE4B1DE354696115000FB46DC90D2ACA9709F1831263ADB4BFF7DF2B732CEFEFD70013A16293C71F964844F64970888D7D283EC24721C6FEC1001704836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD + +count = 88 +seed = DEEE61A2FAC04E4D6B7A250124DFD91518D9B90A71FA02665E3088760BF69CB3CD7B6977F860A7026819D178623C9676 +mlen = 2937 +msg = BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C +pk = 8FB1BD9F9840A7C85394DB787993BAF12B7498976623ABE1246F8780FABBF9C0FA513FF51364AD8ACB6FEB210B38173812CDDF1E8616B72401456C089EB0B994969C6F4E1EC40F2D9A0F51D7BE7FA5B9CC1882BEB99B854DE0841CFD69104E0A0D +sk = 8FB1BD9F9840A7C85394DB787993BAF12B7498976623ABE1246F8780FABBF9C0FA513FF51364AD8ACB6FEB210B38173812CDDF1E8616B72401456C089EB0B994969C6F4E1EC40F2D9A0F51D7BE7FA5B9CC1882BEB99B854DE0841CFD69104E0A0D472A986E46805CD9CAC5F47BE4879CD149AF8FDE540E8A80F70200000000000000000000000000000000000000000000246116EE446E0402F6BABFEE10E1EF5AEA45F37674AEF4C297FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F254CA9271582B6E372E1A8956AAF896C46BA0D566B347355FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AB6F64866E9BD09D3A8B4F80553998294042DBCF3D46FF3746CE4B316E3F4CDF2B435A67271997E0D343351FBF5D9700BDFFF744DAAD7A206177FF51E47939E9D802FE7EB9C75BC4F3264740AED12ED62C48C706199EADC396D98AAE2DCB9900C6040978766326A71B1116321A3FA8F268304D1D5BFC516A8D30890321BDAE3559DB50CFA70E7DC93B5AE6F9D229FB007D8CE7B53AF5A24848D4CEDCC9A9138BE6EB886C71065708CFD6F8A5BE52EB8AE52C8FDB5B23DC7EFA816A7B1DCA9600 +smlen = 3161 +sm = 825F845C51DFE953427B6AC09CBCCA38267292531185C312C0154A0A2D58A42B81E34D22FCE959DE458B873DB308971369A57D2195A41E9E644A313056E48F3760B3BE92DBC45691AB2FE4E8E21E3046B99D2B9D3C6265AD9668193AE01A681200081827D8B0F13935FD1AC0E62EA0A935C63A8E7793AB2AAD5803AF745E38F87BB47A9B30696607D1FCE9D91894236ED500250128E1204F7E8E6A24D69A794D58D184D522D1511C807B4EB103191C8E5AAF5021B79E964B93A6EB793E0794FF99AC3D4FBE0320D0D2C1B9FD2B48CB5AF10176F351AD69FC4F701A139F00150DBD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C + +count = 89 +seed = DAB6C05E29342106CC34769BF419ADCC88010C05B57E673A503E63AE7A4EE55B72AB2CA86C4EF57FC8C02D2E0C8694A1 +mlen = 2970 +msg = 4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D +pk = B3B1D97469C08D9A6ABDB925B6E9B094892F36413591AAC27FE2E3EEE2B14A7CB3102D7A87D6238C09D7BA9EA3A4840FB34D3FBA90F9814D463D941439B2E8659CBD0DDFB3D2816EB97DF2C2E99B8C33CC2EBD23FC3BCD75767F13B7A51B482006 +sk = B3B1D97469C08D9A6ABDB925B6E9B094892F36413591AAC27FE2E3EEE2B14A7CB3102D7A87D6238C09D7BA9EA3A4840FB34D3FBA90F9814D463D941439B2E8659CBD0DDFB3D2816EB97DF2C2E99B8C33CC2EBD23FC3BCD75767F13B7A51B4820068B865F98FB3CC7B6427FDC802DBBA9FD961FDEB074ABE8377407000000000000000000000000000000000000000000005A68BB4265021BA4C55186E52F1DDF829C7A712F4CE93C01C2FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF671163F3D26AE8E29A44E0D0007E0DA6665367200ECF9277B1F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005115FC65DF553E4FADE3148EDEE6161B06BDFD5FC1C6D1AADF206443FDB4A9A720D0B959182AC02F1F5C7A89931055002746CC17C403760B009A7E15FB163A43CB6EF08982516239D70B0BEF298A26B2CBD8DE469096701424881EFF5EC3AC00618841F5DD8C2A24B59315C308FC2455DC7589DBBF5671BD21BAD1AC9305C8CB99CD4C74C9CBFED57CF26A3A618EF200CC4146DBDBC4A782DC7C57D9025F3CE133C722B0507D2E9F1E64ED41C2984EFFFD9B80F3B6C7BDD3AB7FC24C0E676F00 +smlen = 3194 +sm = E969BD29CF343118B041357BD519EF957221D880B174C7C56EF4C5A6936F248DB2E28ABFE2FDA4231CFACD633673353202FBC59B205C094F712A7766E9C292C515F7D35EDBD9FEE09EA77748F8972EC5DA414593D6D88B0FE63EE80AAE2D6C1F0101FDE49022FF672A102CDFD7A339C753BDFE53790721F41D6B0125F183F049FB2C03AACA322480A062AEC3F81CBB384F18CC00887EC367C408E68076D6E9CC78094DFBD91A7EAE6AE5B90901925A39A2033ED30968424A068CD18511069A96D1DBC3325A00A3DAB98870CBDC2F42593129D8DBDF881406084F56478B0006154D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D + +count = 90 +seed = 0CAF47BD9AABD7D09FFAD404449BBAB2E1D48E80AC78550831A365BED8765420DBBE9A566EFDF20D4E5233D7848582E4 +mlen = 3003 +msg = E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 +pk = 53DB7306DDDFA971875F5293B2EDD587DDA2DCC34A7AD6005407785C5E3E9E199D98F7CD8B782A9867E91FF23EA37522BCC5C431F30FF0A5A230BCDD748227AB9F31349DD10789C9ED9B27290A7A76600D524E4B018E24A700525D3E8B3BEF3319 +sk = 53DB7306DDDFA971875F5293B2EDD587DDA2DCC34A7AD6005407785C5E3E9E199D98F7CD8B782A9867E91FF23EA37522BCC5C431F30FF0A5A230BCDD748227AB9F31349DD10789C9ED9B27290A7A76600D524E4B018E24A700525D3E8B3BEF33193736166F7E45606EBF2F8A0A5944AD30E0FDAD86E97628F9C10400000000000000000000000000000000000000000000225EA7F086499886CEF6750653233C4CF607F6EE501DD23189FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4748C65BE4E2193AB865E3D735E0E48BA5762F28445AFBABE4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007253DD4E76EBE67050B63CE8CEFFF72677E9F0DF78BA881A1A0DF3D1CF58C6A38CB570EEDC6968DD4669B7343E540A00570F883084F4F68425CFB4FD7D8BA540DED615984C9659066F3322F835DEA6EB08CF0B2D324AB3B742789431411EB600BB75568EBF7C66F0E9E5CFCC39B389261F3EE7CD9FE0C4ED79A95B240A732D4B19914703A15412C45CDA64992975610015DA6DE550120CDB24B20E23003115CB8660D1096690F936E74409D5C5E0837895DAD728B079DEBFC75E7FDF6FD59200 +smlen = 3227 +sm = 50F14EE762AD36C0F46B1B525E9E47230A9BD8299C34C954B0EBFD520B23BFCF7C1F730C309A3EF34AA15874FDDE792BC807B3063D2395E192B1973D2A3DF932B9A9E6D6AA36F115D408DD534A1D7551B49FB2B56356E3278C0BCFB398E66C0C000136074680CB74C268136487B4A7491BB47D3DEDBB2CA662470331FA852F957BAC28B9C38913511D0A14BC2D6FF39FE6D823017067D444829D01C2D64A7115B32E52A965014CCFC196DC30009DFB4C47C626197DBF78558E8BEEDDA3897318EA73163E4401A4E9D35037BE7A99879FD38AD5E4F1079531D569E7D631000402E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 + +count = 91 +seed = 9564E88F336C091EAD50C893F3EAA8351FA388682F433F7A72A34731020B9C96DFCF75EF5EAE47E12684AFA51EFB49B7 +mlen = 3036 +msg = 2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 +pk = FD07C9E3ACB3F384289405FAE39C7A203EA31F327A64D34A92B74837A73BA9FB573B0AA997ABEA0BA5B5FDBCC8D4B607BFBF1D2CCCB58DA00C581E83853190E3B6FCD08FCC9C4AF3DFDBAA29BFDD2C61AE3DAFF0C01E1E25FC27788D678FFC1002 +sk = FD07C9E3ACB3F384289405FAE39C7A203EA31F327A64D34A92B74837A73BA9FB573B0AA997ABEA0BA5B5FDBCC8D4B607BFBF1D2CCCB58DA00C581E83853190E3B6FCD08FCC9C4AF3DFDBAA29BFDD2C61AE3DAFF0C01E1E25FC27788D678FFC10020FF4889325B3F0AA275ED855F930CAC1BF097C1AD2DB2DC9730300000000000000000000000000000000000000000000501531C0413D8387753EFC0E859A397114F62E598D22EA7A73FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF996D63F9F4350B0BD8978F3E521AB5B937EB76EEB41C566CB8FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005D3C97893D019A626CCE36BBCB72454E1A8C0C0FE6849831D3E954021B2E7362D5B253F8C08BCB1563A200F6B3E94600E00AEF4F866284761E59BE410FC3235718DD8D98326DF05C5E3ED5868D0D7B55F58410DA531DEF6BB9714712AE737C00BEF4C09FD6E070EEA3855D1DD31AC883EB8EF16801091AAA474740ED6DED83330FB509C2FDE8AA96F999849935165C00C52D81AAD487239BFCD75D7B6F333407A562A8AA77D49ADCA34F2A0B642E4DACC0EA70773679239AA8A9A33A150FF300 +smlen = 3260 +sm = EE8E95A768E9648373C2898B1D5A35F1D044382C54A0BD06E744C542D75C4172E40CE3E7B8806F6CD141EEECA7F02330A749034BACAA2EC61671C568AC0CD769B5E9F99D5201B1FF89C62CECBF0698D47F00CBD077EA46621169F5E5FACA96300101FB0055D0FD8F91724B2409183F88C004FADF269A2A6E47970033F8AD2C04CEE68417CF800197B6FFF6D752DB9632B8ADB7012872C5CB23AE0BCA672E918143EAD9BB25E9DB1521DD7848002A0D3D5CDD9AEDECF0D7F7F3897123769C97A6078014DDA1010668B48D05CE5DE3FF817E4DBAB7FE4F2ED7B356E248BB0004042601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 + +count = 92 +seed = 4D0788DE958A707899D5DCC02F756A10DEA2EFE0214F5E01B3281DF4E013CA75523ECEC64723D6C8BEC0B92C4F821D8F +mlen = 3069 +msg = 9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA +pk = E46537C877D27F403973B0733FB1744A27BB6189B4C5261A1EEE7FBF6892448458F0EDF6E048E512159649952CA57B2662BADCA4BAC283E1748EB0285A8CDFD039ADD5E9AB9C829DE0BBA8B61F38642B76DD4FF9BC13CD5B43719B985841762917 +sk = E46537C877D27F403973B0733FB1744A27BB6189B4C5261A1EEE7FBF6892448458F0EDF6E048E512159649952CA57B2662BADCA4BAC283E1748EB0285A8CDFD039ADD5E9AB9C829DE0BBA8B61F38642B76DD4FF9BC13CD5B43719B985841762917652A26C39E50736CFBB21B92B9DD7E43FFF72D9AC4467DFDAE0600000000000000000000000000000000000000000000E4E30B627097937E6AFFF8872855332040B76334A09D447A0AF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF87E889112F1F792E1B76664685D5B7FFC20FC88666D6BAB6FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A743C973F062B91CBB9F7F385E12909E84070DBB0A27F4E505592B5075BD25DD34DED6727DFE832F0DB92FC13FBFB200BED1F03F04E2750AAA584D9909A257E8680ABAAA3B16A6C606664ADCDC04701D0566D2E885F9640831FF0453F485A400EE3FAA8C4EEF3C3AD8540E61982E5CC848647CD70F7598B56AFF549B57A5462203928935BAD99F99FB682760EA07CD003764043F315F2CD0C694D3ED1619E3C60BB6026AFA61CD09C16C73C7F4FC1A3ABE95D24ACA1361F41BEDA0364FD43600 +smlen = 3293 +sm = EBC0478521BB503EF13D77D8DA956F473A7ED6EA63CD261C68773F17BA20E00C7726745EB1B8B0F19389BEDF7B5728084F92051C09062C2A87A26D6CDB0614D12D8FE418FA30EADDE1221F4834CAC8D8D6A312E5379B11F14699D59C5F3B013200008C189D385ECACAC6515E5E6EDD48594CB15F119283EA442802C9B5D03B69A05F1019185BDE93536EE51F4D4CFAEBA1551801319DC2A398E56F5C6B3A9848BF3ED30AA17AC6C701F26A14030361F094B99AECB3462A663E2609C8DDE07B1783E8C02CF20105152392CE76AA14D3689D3DBE62D88E72B11E07C539C0000D049163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA + +count = 93 +seed = 55A9C7A0B49706090BC0702ECFC070AB060427FFC820C3FE05B499B59AEB125F2DB4787A5910B88C6F8FAF0A69BE0AE5 +mlen = 3102 +msg = 02C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 +pk = BAD97EE9163009F504014511289C806438481FD6A89A317F3762119359D1939ED02E2267E78B9150CB1AABB55694313331FFA6BDE5C2817688671E9F68644E766304E95AEB3BB9F3C50F5A7357479EAD1C20D1A7187B6F338156ED0D3D76E13F0D +sk = BAD97EE9163009F504014511289C806438481FD6A89A317F3762119359D1939ED02E2267E78B9150CB1AABB55694313331FFA6BDE5C2817688671E9F68644E766304E95AEB3BB9F3C50F5A7357479EAD1C20D1A7187B6F338156ED0D3D76E13F0D5BD5C2D88A0BCD4C261A8C5E9137B336655B27C591335A526708000000000000000000000000000000000000000000001CD4DAC1D3D2807898DF68903E0145365B09F223EB3669CF4BFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FBF9DC4C588FB08B017CCA9809EE123FDEDBCBBA5393917BCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009BF2B1A45C1C970206CCA03A13E9D63B860C42FF375D4E0B6C0A447426BB83968F1ACDD1148E78F2D5144F6272AAA7003C56A482B5A8B1583B281A3FB321E7066F564E6DA8C9CFAD8FB6BFEBC3E45AD6B797E6A273D46D09103DAFCB5719260087CF8137184302E48A7E506637FA690F58C359F1F647794B8CB88F67D9CE806DC36C1DE3A072EB770E40BDBC96EACE0049706ACD5395F7017C7EB7CE8D5145FC58FDAD886E169A1888B2C12C6FF1D8CC4CDE5D0612E98D64F91966579CBCC300 +smlen = 3326 +sm = CC682D346464318C725D0A939DCB148DAAFD8A42A35B19B17950C849D274A83B6D46D658788714B946BBE1473EC60E3EFCB9A97D0FFED0F7E7885AEB5C7AA39041F8BFB9019E3F01F0776A18ADE9D4E2CFB9BDACB4458ECE41642645227CF11A0000637254FAF5B50870C02A891ECC408FF204D0275788CCE54E0111811B988434DAE8EADDD3B56E9055F94253DDD9769C5E30018132A9F6E5F984C3085BCDAE4076A1D594AFEB1F002FC44D003E2BAE479694477178AADEF16A2863F0EA09FD632849196003DA14FDBFBDEB0F7C686C1A16E3DDDA41B1804888EAFB0300040202C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 + +count = 94 +seed = CEECCCD3F7BB922650E3F6E8F20C47AF17C1C1053EA8FE08226F167D67C3B0781BD774C4C7AAD23C6AB0B9F3E3F96F97 +mlen = 3135 +msg = E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 +pk = D0A480C6512B3B1F118919AA96971CF8D08A44632B2F5D52D0A76F85AF82F045319C1C74B69E635C7EA334721D1EEE15F27D30FCDF9031366740C9F6C874DA78745D6E3AFC5E84B5B2EC3A8DF2D9DAA716705DC78F30357BDF5EB867DD96001716 +sk = D0A480C6512B3B1F118919AA96971CF8D08A44632B2F5D52D0A76F85AF82F045319C1C74B69E635C7EA334721D1EEE15F27D30FCDF9031366740C9F6C874DA78745D6E3AFC5E84B5B2EC3A8DF2D9DAA716705DC78F30357BDF5EB867DD96001716C300852B3D5BAD598C82381B3912A86A59B43C847E83795F2906000000000000000000000000000000000000000000002EF07F7AAC911B401897765B4759D52B352FF000202C191BFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED4BE49ABE4B1FD9BA792E2D8FD04A7453B8A34A67D35BA631FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081FC1095E2C3CAF7BD2586574033922E328B177049299278A188C74EAFA20CF98DB9A92DFF11440A2C690CE72237DB00CA855869EECD26BA95F6523DCE248E5808C6A68A9638D0906C59124AF183FD0F79385EFBBCCF81CA1B0E8CD3BFF47E00E341F3D58B47A6DF69A886F228D827A98DEA49A2665B6494AF2CDDB33F87616E701DF5BC6620EF20B9F993798F82BB00096BFC544D5BD910D3A83D8EC085A0761D63BF63B957CBA3E3391842F57AA5877A891FC22875E13BE5D666C48A88E400 +smlen = 3359 +sm = 718A8EB3CDF536B02788FD7798980E4DFFF7CAC151697102EF42C7BFCD3FB788FF0B21FB4C025EF5AD95B37EBE4CCF08CDB02CEE7D377C58F927BFC521254DFBB6204D440A1F180D22E83C460D72F14E95EBCB829360D272652DF694FFE8BD0E0100C98EC261D94AD6F7E2528CE25A96C68E92D6D0BE2EE9B577006FA011F123C71F0F9DBC1934A62E2E259067C47CC419901101E22184F5D5F8D66AD6952FAEC10BE269B095BC3E6F11A0BC00ED50A44966497429467B8764CE62421F71844A3C30EB43B100A549FBF749A735C1ABC92905B0235DCBBF035EE1D7137E00020AE13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 + +count = 95 +seed = 2489C04BA57D149A60F446670C13C29998B52F3BAD548A751D7134B694DB25ABFA034FB4BA45E105AE27D575CBD02B99 +mlen = 3168 +msg = 1F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 +pk = B8A33E04B1EF9007EFD16F7C6E8C7923928667D4D0D6D14C673C5665BF4FE0A634E704657BD623FFDA29079AA6309D33A86D498063DF0E01DB17C594844A335EE2E8754F7408EBEE4897726C3446C5FF7C7519E8BC43C3E50A1910DBFD710D1717 +sk = B8A33E04B1EF9007EFD16F7C6E8C7923928667D4D0D6D14C673C5665BF4FE0A634E704657BD623FFDA29079AA6309D33A86D498063DF0E01DB17C594844A335EE2E8754F7408EBEE4897726C3446C5FF7C7519E8BC43C3E50A1910DBFD710D171779C4DAE6D9E62050C79E7DDA69902513E251CEC9A214A3A8250E000000000000000000000000000000000000000000008EC44D6843571490D22D18D990765C3C47E2495934D85357BDEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37DB6F83550997FAB3A657B9644192451FCD1732A58F3D7265FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020F7EF776E88FCAC009CFB4E1725F96B8C7EF85483FE3A6C3DB061F49ED8DF00937B4CCA9FD57DA964D745BA0F128D000B4C706CA7BC48F28F8E807E6B381BDCDD401C46A0637AE3A327CEC6D62ABB2B40A1F0BCE4FE25B5F2A17864F2AA9B000FC977C3EBA13D3AD060385F5F7E77D9B65CFABE22FBBC6B66F49887B93D2DABDF11373ED53CFAA86EAC6AAAF73FA80013C53C0CE2A62FF134821CFD33B591A4673EB6FE946BC5FDCDAFD721022EE3D1FBE9EC76BC446DE9B49A732B14A87B00 +smlen = 3392 +sm = ECB1BCE110A70B3847C8DEC5C934B826D0D426AAF2E15943192E4E23E5AC232D8F0016DF90A291CCFEF88E1DD04C1C37E594D84560F163DDEF34390C77A1BB2281D19878F702FC6DCA0A48906AF265C90C7A90070470E264BD4ACBDA784079150002564D336734753B510DDBA3092A1F10F793C7FA741D1F8106031D3482BBC587CF479F43CA56573D1CD3BA69BEB59007E82E0026BBDCFC834C171E5A2EB5D775D9441B94CAF6E8DACB88430067B7375E7DBCE873233B4F4A99D5A23B76310CC42962524702B4E77D26D6CCB1F21FBB567AA6488B5DFB60E929BC0AEA0004021F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 + +count = 96 +seed = 26CF860726D4DFA38AE07399838BB336F1BEE59E9F23AE4C81E73D49964997EF21CB5F5412F9A70A1EC39FC6228C36CA +mlen = 3201 +msg = DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 +pk = CAE068B163D88807169E716A4DD31B9086E6240001992F0E9C0EBFEA54EED31BC4D24C024B5E16F03C5F394A6747C93A351FE6F6A489A13F351A8E226112D9119FA10DD8BB9655FC1CE6ACA60F0B1D329DF1ED3C8196844BF9D2F507D393713A04 +sk = CAE068B163D88807169E716A4DD31B9086E6240001992F0E9C0EBFEA54EED31BC4D24C024B5E16F03C5F394A6747C93A351FE6F6A489A13F351A8E226112D9119FA10DD8BB9655FC1CE6ACA60F0B1D329DF1ED3C8196844BF9D2F507D393713A047DD07DFD91D9D8E4F66DCCA59942BE590DA665F225DA5AB39F0800000000000000000000000000000000000000000000F007711C6B712980AF3A8BD9CFF19E864453EB3BA308164C15F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83518CD4E5ED7E08029419FF7EC8549A754F16E8B156C26165F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020C19B6D96A7CDDA1A61B7CF09B4DB415DDB79FDC0ADC20693DCB491DB02F2E929342A25CE0BB693576FB7EEDA69BD00C5F122F41418DC11D4BC755FF5F104A2A6F590501429783BCFE250625DF280D880D6F6C531FFFEC482EC2B330156630091F18E09B14336FD437B9DEA9785E6C16E69FC6E1C9650B4C6FB940CA1E267B5F33848428393E3E025471B8CED9709006EBF7F09A5B91FE7523D95B55E197F1319ECE00CF191A6FF9282391F9FFF11F046EB49FADE46F31D4A04A5CDF740D600 +smlen = 3425 +sm = 80A2A7534C9A1771F0D2131986DEC194140C5CA67793B2BF68C97B60E11D120B8B76ED18DA52EF5BAFD0E0E92EBB5D028909A1B92FA159D4A6B9C34E6ADB09D595C0CB36C5D13C397FB3967E1362A8056DA1BAFDFA6348C16A7AB29231C9E11801024A0396E5402B7D84139224BDFEE78EE8CF82199E518E98DD01A3ABB0229942B5FF7F2D25C96FF474E054618766297A4D020042BC093A60A50809AEBB1BA58DD5B8A43B8A8B7A68189ED00161840BEEC6B5677D7C6C0FFBE861729AB451DD9A5EC9D7230148B6CDF825D48B5C273A8BE2E123D68964832F0B489673000406DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 + +count = 97 +seed = 13F1F446D9AA5AC853278BF74C9E6447A6CE4294C037867F43DF554370EE261D05C7260EEBF46D6694D0850B8343FBE5 +mlen = 3234 +msg = 525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B +pk = C06A1F8C8D75915A8ECD5FD416887677BC9E0A774B903887C0A59090FC0981AB0B973F93312F86CF927B5FC5EF02F913303FF3A63D0E260A9649E44FEB4C447E77B6A97572F5763654E6AF725EB41A4EB1218D1E7752D3327BB3F62ACAC5880515 +sk = C06A1F8C8D75915A8ECD5FD416887677BC9E0A774B903887C0A59090FC0981AB0B973F93312F86CF927B5FC5EF02F913303FF3A63D0E260A9649E44FEB4C447E77B6A97572F5763654E6AF725EB41A4EB1218D1E7752D3327BB3F62ACAC588051515A3593204871E539A92A020E20291B3D4C94AE8F278BDE02903000000000000000000000000000000000000000000004EB8019A19E402FD364E7650DF07BD39408A992940171E0860FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11D3118FDAFB54677A982E25C42132B75C043ED1967C43314AFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DF65A561738FD5D379BC3602AE7CB19B15B15B0F5875DB7CAE474501511289A4879AC5B28E0E8680955517403DB8E000F7FB1918D80D5DDCB0CBC996A72A7B31546AD4865840AB30A65BA0F8489ACE9D28BE2477A79939FE6AB1316FBA364B00AFDFC86E876B5EBFDA5D03CB1B75D89C557F995E63EBC85586775CDAE3EFFCB7304949C6A18D326817C490DE4F50890062AC1AD2D6F1E5D782D2DCCCC5526B93C70CAFAD9877C4E272593943C3C2675A9BE47F69D49CA26B37ADC8F0D1A4B100 +smlen = 3458 +sm = 801A07A234AFD9B2594DBDD1C53CC89A75213369FC6970DC7BB182623B6E448AAF379710F31C81EA0A9B95ACA9890A372760D5A41A6EA8DE4F2187E5BC3776B915AA29761AD5D527B182F9A89A8686B7BEEFCE05105BD96B4CA2FCBC32BFF1070404FBEA9631A095CE80E7A19A22CEC7F29EB2EF88B419B84122007BA4CD202964F915EAB6E32BAD10759CFA6E5B308C84FB230056689E76785B005BD64519731BEB8DF7809EDF75F3DC8B08000671E360E6D143193BAD9C3CB1B60D0DEA809AC41ED7270B0001690504DB5C198E7100AD105301A0CDA9F219D9D64F42001515525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B + +count = 98 +seed = 6F6E47E8336ADEE99B2C52CF2DC8D461E0A54C3DF2F08199A9F0816AF8455381054CE47A7766726D3AFC2E2F2BEAF8E8 +mlen = 3267 +msg = 00769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 +pk = 12812B71758DB5FF7B4E9D23C212BF12A3E034897F8A863B02D84AE66F9B97FE3A2261DE981FE94DF2D657A647D65A094718FB8321BA7A1CD723CD54E3CA7E55E328A7A68DA5890DA570F6FD7A3DCD0C0839E674DD24D302D7A6278773E5193A0D +sk = 12812B71758DB5FF7B4E9D23C212BF12A3E034897F8A863B02D84AE66F9B97FE3A2261DE981FE94DF2D657A647D65A094718FB8321BA7A1CD723CD54E3CA7E55E328A7A68DA5890DA570F6FD7A3DCD0C0839E674DD24D302D7A6278773E5193A0D0F9E99FBAA399FB65AAEA9B665E9D5D8E8B51E6483B41EF54807000000000000000000000000000000000000000000001692BCDE7AA173123FFC635B637E71F25377B6F4827E908D65FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBC128A6251B21F8743531AC52CA23E9119A6FBC36FB072F86FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CE6150485DC3788DBF16DDA4D726A07D972732BED40CFE3E118382E720FFA47EED3405672ABF66490F40C8DF64077800277DF6A9284ECF89BCB666ADC0C20DBF702D093D71206A66E60B568AB894C573662533C124CF731FB4BBE9DE2DD82100BB806592AD66C566B7963E1B17E5A2C55EB0E744FEC639AFD6E29E424A2C637D5489A310B38AF5A39BC79BA40A0AD90001B88126D9EE144273578773FD01E57BD8DCC3283FF2A7746DDBAA5E95E0A721334AA736C79DF1262F321D0B733DBD00 +smlen = 3491 +sm = 0CACDB81744460787779C56A6233AC5740E24B18C197E108CA155428F2437AD2838FBF7761F62C0A379525EC0840E03154FE62CAF75C9A9C559C5BD4E2E3810814897FACE11DEB7CFE14A0464ECA04121A9743E61986DB672C1E1F24DD5EED3100004265A8E60E0B33760828E3BE4BACA44FB3BA172C7AC61C0A016D7D769EC21F79421A3734A37E0263B37A1DA37C1D426D4E02EFB1BA9AF2EBAE0CC91CE9758BFC94D500BE5958514DBE3C01A5EFCEFECCA74852824E9C7F4E9CED80D51B2F127C7903370119F92D6AB43795DC7473C47AAF764CD093AABD77C25A2D000D0200769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 + +count = 99 +seed = CB2E6226615393FC3BD4AB3A412AAA030AAD40E8648EE6B56D2C1591D8B97915D88F2D22F7221377B4B04CF2AE9ECC4E +mlen = 3300 +msg = D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C +pk = 97B2491418546F83BA265558C1760B3A99D75B07E92911FAAB0C9E5C4C3BD5FC124D06C1279C79CD2DFE9BD5631F3A40E1DB911150909AAA6FFE0F15EA7A3BF99BD551D43E59EA73B18AD127338384EFF63FCAA1BF5470E28E6D25A92E48A91215 +sk = 97B2491418546F83BA265558C1760B3A99D75B07E92911FAAB0C9E5C4C3BD5FC124D06C1279C79CD2DFE9BD5631F3A40E1DB911150909AAA6FFE0F15EA7A3BF99BD551D43E59EA73B18AD127338384EFF63FCAA1BF5470E28E6D25A92E48A91215EDF23496BBB842D9B349A449648CDF5ABE415D32DCE428F0810E00000000000000000000000000000000000000000000F443D064BFC3BF1B04DC4C36C849DC2CB0DD786C288FE0CE2FF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7580B476E97C7A9010BB1850C1B9952D713FD1ECE1C927639FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091ECD973D130905F45B7F4F16C3F8E23E2E4B1F3984EC43E899ABB35C67771D14E1AC9980522D4797BB4C5FB22FE6400714E99F82044CAE74CF31B92EA7D21EBA52DEE208D3BC30E02DF152EF9528C093CE1E5AC7FB386E0D501AFE0803B57001C142C0CDA1456C5D54A8D2570B1CAB3BD0D825763936D0CF033E3D3E9C17CA1D2EFADF81C2DD96F2DAE700295AEA40039A984EFE4C8B9D39065ECD561B7DEA190A712AD85076E3DB7DC1A78D196DDF93847693701D53B626E16397F4B91EF00 +smlen = 3524 +sm = 395065FC036D268F8670C464031BD1C6B09234D88E8C03ACF55D46506CE9A46AD40F528843C411D8898DBF64973DD005D92CEC02E43F6F209108C30CB6CD7E05884AA6CCFD81BA271812AE37A79E823EF535EF92FB20A484FA609B266133092E0001636EA19FDA9113BF7E808409700879AC580753FFB9207B6E039AA07D0C58FB9248713E13F861838B392175FCA7DEF10D750341DEC723B607130DBC72C9FB71FBA306A6C908395EDB25D50388CDED7A0343F664B8F89786E549C0928A371A0F31B3C3D50203E4232FB30FD90C891680DF29B31EC40D4A9FCC8AC23A000204D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C + diff --git a/KAT/PQCsignKAT_782_lvl1.req b/KAT/PQCsignKAT_701_SQIsign_lvl5.req similarity index 100% rename from KAT/PQCsignKAT_782_lvl1.req rename to KAT/PQCsignKAT_701_SQIsign_lvl5.req diff --git a/KAT/PQCsignKAT_701_SQIsign_lvl5.rsp b/KAT/PQCsignKAT_701_SQIsign_lvl5.rsp new file mode 100644 index 0000000..4ec0f95 --- /dev/null +++ b/KAT/PQCsignKAT_701_SQIsign_lvl5.rsp @@ -0,0 +1,902 @@ +# SQIsign_lvl5 + +count = 0 +seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 +mlen = 33 +msg = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 +pk = 86FFA3B0F73D55A64D13C6F89F28D75FD17C5E2368E1D451127C16D1A97CDB440E20333A233AD2F8E4D70187C8AE31602049ADE949A87F95E79DA4C456F5D400B2485A96D04708A2F30046812B8D65A3BFBFDED0DD6563462F9E2BCE760CD753CAE8471BEC7049EF28FFEFE859C15DAC49DB959AEE99842D97A380A70DD7330106 +sk = 86FFA3B0F73D55A64D13C6F89F28D75FD17C5E2368E1D451127C16D1A97CDB440E20333A233AD2F8E4D70187C8AE31602049ADE949A87F95E79DA4C456F5D400B2485A96D04708A2F30046812B8D65A3BFBFDED0DD6563462F9E2BCE760CD753CAE8471BEC7049EF28FFEFE859C15DAC49DB959AEE99842D97A380A70DD7330106F14C3FCF2ADDA0DB66D0F7195AA2D8D1879DB85EEDC153ADDFAF01FA471C74492A01000000000000000000000000000000000000000000000000000000000000D2E0BC29F371BF8FA7827E1D87CB90F7B7C177042A24E4B8182084435C87E402AFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF072177EBCDF87393B1291C98A34A3A4CF96B18E9D0CB2AE1BD47B218E247081C38FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B7CF3AA021EA69832B2007DFB7D4D2942B529ECE361CABBF367BC484128F6A5A8AF847C6C23F6664AFE8F29BF13321FD5676B3BABA2F0A9C80167BB830A90DF6049881A5F7C5E46E319FB1A38BCFCA8F48D6263EF8CDF6A098494FA84CB0442A58F4AE4C665D3E41B3C507BCBFD8B2B14EFB978C34F6158062D5A64D82028294823F3C856903558EC51FF3BDF10952D376D4B1B0CCBA40DD28071F1037FC2E5625EA37A7ACAF4DB86776C45A6DFC3C67AE6F110FFFFA397486DEBA200FCFC4746F5F269903C44F48F3E4CFF02E109E498D5BB9C3581D62071CE462C682597A4AD7D911EA10383D34B6EF580378E44F14983391F7DA7157C435477E02 +smlen = 325 +sm = 6B8EF5D7689A1EA1CFCE9C6F7495E309E9D1D1B03E61CD97088E679C4901D0B6B6D38217F4AED6C44949B41F9AF80B43E84D0C91BDB1D00E06957BEBF30A58012AD01E52CF7906CE197AD06696F7FCF756908EA980549E7C215D089BDE7117799F628817A1B9C8FB7FEBFF7E9D9B776142460CFAAFC97D48A57E09E0DA378401000229CC8E1B94E1F2F8AFDC42066BEACE076E3E70DD01F90C4D01DAC17BEC58743532848D438A87A574D9DB940C17236AE3566281E27A99EFE5EE26E05B88A1D610A80B3AF38267D845C7FE330F199B43794A9B2E14846924127366B8F6A1F0F24D3C4B54D79DBB61B098BF32D98EA8819F7BE4A5FFBA29E88B1A996C6CDFD32B048BC2ACFFA28870181447FCC8B6F97B63C47CB013C6F3D84CBD07619A5C355B000911D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 + +count = 1 +seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 +mlen = 66 +msg = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 +pk = DDBF05B82D61DD94C4D04534D013C668524642505F0D674E0C10006BF6B45C87DC49B2E3055D9C1EE4C277598A60C295E174D52F6C4A938BB67730C50D409C015BD74FBA5C590E0B9EDA468865B3EEBA914AC1FF5CBD1E68502DBC7F72B9E5FEC5A593538F641215473CC5441A2FC3770723B7380BB6664967BBEC6A94B64A0108 +sk = DDBF05B82D61DD94C4D04534D013C668524642505F0D674E0C10006BF6B45C87DC49B2E3055D9C1EE4C277598A60C295E174D52F6C4A938BB67730C50D409C015BD74FBA5C590E0B9EDA468865B3EEBA914AC1FF5CBD1E68502DBC7F72B9E5FEC5A593538F641215473CC5441A2FC3770723B7380BB6664967BBEC6A94B64A0108A9814A001EFBCA101080DC988B718CDD356564C09981C0046082BA93F61D93126A02000000000000000000000000000000000000000000000000000000000000941944E281A4A1C9CC6DE84BC36BF4A305C45F17A4EB015BBD2F103829502D5C9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5116BBF5C8E55F9EE73E9BA24E2C01DAE1E0ADBCE644C3318E9EAEC3E17CD15FC6FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006B74642EB54C9A507EBA46037C5A28DFDBFEDE3117B1C0FD67B6202CC280B5E3897B7FDDCE85AAC02982475C9F6C23B5A2E5077740E880293EEF0D8B75C4041B872313889DE30433BD9614CE8ACF74F8B53ED9837389DB6041FD1D7B36D8848365BEA9631322AD506A85470489625A3ED98DA12871850A65C3DBD7BC0A02DBE3D00B9EE5CF179911FE14D2B6F2C91037E51579D6085A51857C2B09A24FA77482F3F3BF2AB270DF5AA1182CB410240A4A17A7A4D5F03F903981825EC306F233C28FF681036AA626B678094D1BA47514BA9BDC98B158BC5BEAEA91D0637C4A30ED3A8DC9A8BE72D3B8FE5C80EE70BCF65B8E6CA4D5FB30AA90898CF005 +smlen = 358 +sm = 2FE69D4C312452982E2B0911544D65EE17554ADBECB2A03860A180AF5B8964044F1BAE37D60EBEF295F7334574007B9909E8B9D5976A54801394AE59C762A300F67507792B1282B65DC7423BB49577BA5F904A276019694DB0C14201E589B0157E2B0EB2018E2060DF6CFC7C90EE2037C2344712D38F7EEBE13D2B79A1933B010101AF2BC85CB1642D01A69264DA9401DD3725C31ECB056D60F857EF6A4FD6500017E967F6A6948D1A6E047A557E87BDE88147A5291C8DDFADA35958AAF1EDD4E52320A8B309F58E8C43608DD70A39F62E36275CD4D0E0B07D319CB4C4BA9509B60C222A75C8FFC4B14F8562D98444D746E883586481AC539827913D3FEEFB6DC803ECD2209764AB4B483B952A021EFECC29452724FC981CD00F95848A3741E67F00090B225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 + +count = 2 +seed = BFF58FDA9DB4C2D8BD02E4647868D4A2FA12500A65CA4C9F918B505707FA775951018D9149C97D443EA16B07DD68435B +mlen = 99 +msg = 2B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF +pk = 4703985ADEA9F41A6CBCC98227E662690352617BBB05D5406297B8A12BEBDB1BBAAFF7C9B69BF5FC5351BDCB3664AD4F5160C188A390A41B2F36EAEFC2C63E01475746AABC99CD5A8FE6FD0D12C94A7585FE0B8551D82F83C6C7089A4FA9B05735BA15F77BC05D9EEBCB7628C2491A58F0768CEA699C19603A23E5EB75CEAF0004 +sk = 4703985ADEA9F41A6CBCC98227E662690352617BBB05D5406297B8A12BEBDB1BBAAFF7C9B69BF5FC5351BDCB3664AD4F5160C188A390A41B2F36EAEFC2C63E01475746AABC99CD5A8FE6FD0D12C94A7585FE0B8551D82F83C6C7089A4FA9B05735BA15F77BC05D9EEBCB7628C2491A58F0768CEA699C19603A23E5EB75CEAF000419A6ACF186A8755C0CEC4C07F53334EB48E5D9807A46A825461948FEE355AD4A65000000000000000000000000000000000000000000000000000000000000002276BF85DBD4FADEFD0A040C4447A74872FE0B281399F8D431110711D72C8C30C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D004B93340A6643D28DAEC0DCB9D18BCD6279C1ED686782CF436446C7074AD5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039F2EF4792BD3F49D4B7112DBF8CC22A6A8C30C91CF24E37FC9F4CFEF7F8EDA78EFAF857A906DB7A9E08796A95D806C5A42AA42355D5C7E1B5B9D10906BD09A747E4C6E0D5C2A354000FAEC28A2F76E301A19F3DF7ED929E733BFA21E29F92E5282DC197699640AC002688F92D55791944FD51B39DA1B1F562AF3FD4C808E8C6BEDB10C2E0B9F8724182D4FA58808BB5439D28EC0D9A34FC9719CF1E572AD9538AB4676A56D8F0B2600FE9423B46EB0FADC597FC5DF9A2688F243A6F0EE331D67295C36739694DEC8D8A77B299831D47D1686CF1E521E2942C12D8C8A5DC912FFD53B7F50F0A95F55E25D9D3573EEE6503B7A93650E46F889B36BA00 +smlen = 391 +sm = F0DE30A68FFC1D912BEC7A314D61BA53D6F31DB502CDA21EC8BDA753478D14F6D43D18474FAA819616390823177287BF7A1C847925B6CDA81E69FDCF6157190098CA36E386DEE1B6A23C6A477A29D89A9F72A6EDCCAC71E7BD033E789DD540F2D17A861C2DD8683687380AFF21DCA83CD8139B216B68B47DB65C5A93DDB8820000008278E96A3FD471AF02AA36BB548DA75E179DAEDB9033151B257E3D59A96AEB54490D68A9DA03BCAEF327BA5587DCED533541473DEBDD67EB75559B670DF964590DF7AF6912D1E4C5B7147BA4A0483F719C7C37F9520D9F16AD07C047F4ADED35A881BDCA495BC6C77514BB54560812DDC23A28FC209B3678BA5FD966D755AE3214EFDFD44FB557252398C68801EC227CA857DCA93CF0B7D9714BA04E1BDD460009022B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF + +count = 3 +seed = 58C094D217BC13EDFDBEA57EDBF3A536F8F69FED1D54648CE3D0CCB4847A5C9917C2E2BC4D5F620E937F0D329FCF8A16 +mlen = 132 +msg = 2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE +pk = 1680152A96029E779C0647DB83A8AA46B652B4B451F59D239A78A203766671CD1841A4C922D214783540A74CEDBFD5782CA9DA5FE590FEFC16677370AB212301F47F04AEDC4D00DB96ABC72BBE84D3EFA75110FE265432B46E9D98349DB040FDAFDE17FB9136FD46EB35238AB723A5AD3FF1E0D57F20A97CDA89E1CCB1408F000A +sk = 1680152A96029E779C0647DB83A8AA46B652B4B451F59D239A78A203766671CD1841A4C922D214783540A74CEDBFD5782CA9DA5FE590FEFC16677370AB212301F47F04AEDC4D00DB96ABC72BBE84D3EFA75110FE265432B46E9D98349DB040FDAFDE17FB9136FD46EB35238AB723A5AD3FF1E0D57F20A97CDA89E1CCB1408F000AD9A8463B0F5ED30A804E229F8D74C4B672F858DA8F2A3FCAF86302A36D347BEEF9000000000000000000000000000000000000000000000000000000000000000AB02CD124A9C322D19965E17FDBB4240A575C3A8145024558E3A1368A3AE0D558FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7351D7DB8C23801DBC78CDE3EAD2B3081894697D1F203B2A58E4778DEF42269A4EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008B2F06CB1BFE2D6B93E26F89FFBD8F8D600BAA4E05E93B806FA0077969E0D41A2839926C2BA1F72D25EE31755FE385810D268B3D948EA70F37B2D0B56AC60F2E64876E2067CDB4C5A2C1A8FA6967D362E03D8066B8EE924567766A782581AFEC8ACAAE16049A8D40394A093454E1489CE77FA5FD63437DBA4CB2ED9B70041D2381A8DDA6A4F50D3DC034DCB4756FD6DFDA0EA8135CCF79734BC3F2997ED823FC44150A8BEF221AA0F90DC62E46CBCB015946FD4E751F03357E67AD8003B777BCC701AF05EADFCADE380032557AD9389B6263F6A8169FE6E0EF64B6C85053B328508BCB8A3EADF702547BC739EB1892F52CFF93F938074C52E9A08B00 +smlen = 424 +sm = 528365BD8084F5C02A098D0744A199B780457475E7EDFB9CB1DAE22DE74AE0385DB2C7C56F0C88F5FFA70312B75A0EF390DC3CFF751A9184C324CA6B51AF6801B0F7FE7953F3C86D6DE5A75F0D408094095634886DDA2E3D4060E1E53123FA8BD6EF75CD4AFE980E9E4822397D02A5299684A0215CD8087E43234FB77099CE000000795FC94105E8EAEC8DE51A55A0DFFED30FB4C1BD10DEC2BAFE4C2D3C5B6ED363B4B8D621C0CF54B342EA12A84B71C99A4F8066A89781A3E80169B9C1C40EF411F2B4570B2CCF456CFEEA2CFD5261976B091BCE5C614E65E1C4558DFB6217112A89B3D8FCDBB697E7764F224A147989FF10AA2FA2CE6300D02C99043C464BB55ACCDA580AB2D5B88FA474690BBBCDFBDF79BA391C50833BA243A7C2F069D14C000B092F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE + +count = 4 +seed = F1902A7815F37BC7F5802D8CBCE5B48D82EB85691718062BFB84D8C06AA41D6E9039B0A107245DAFA4EC109A57332914 +mlen = 165 +msg = 1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 +pk = 75F754FB7FA58FEE2564F102417C8B868145AF2A48B80AE4ECF1EF79BFA9290457DBE80F1B9A869F900BBBC56C2AF28C3E6758E9673AF71975F0F0C46F7563000DEE012474A4D8FA6ED0BFD536963745862975C6DD179C8CA0343EF2F8750499448130AF4FB0A6B2EA5A5D5B5A7F5D743DF1EE04C32B639B71DFE430DB92080113 +sk = 75F754FB7FA58FEE2564F102417C8B868145AF2A48B80AE4ECF1EF79BFA9290457DBE80F1B9A869F900BBBC56C2AF28C3E6758E9673AF71975F0F0C46F7563000DEE012474A4D8FA6ED0BFD536963745862975C6DD179C8CA0343EF2F8750499448130AF4FB0A6B2EA5A5D5B5A7F5D743DF1EE04C32B639B71DFE430DB92080113F7151D9200CB6FB804F167ED16E665D1B73D021075C933E9AEFFFAAD2CAA5272DD01000000000000000000000000000000000000000000000000000000000000447B65A852BDA293732310D8CFB7C43A85360563CE804748549EE24495A66B302FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7F31F777A3E5ED4D1C94F6E34FAA7668B77ABD7DD8FD51C07348CABAF46830C04FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001DFDE5DD1E378ED1553FCD9DE3BEDEFC17A724949BCEED62D83BB28753FAD6181833C7797C54DB12D7A93E1E783E5BC14D2DA916F9746D8EBE80F94F6008933A09F9C2FC1CE3190E6E1ABE8ABB350B341B879791CC1C26F33D0ED2565E15F5E47DF21F512A3FD1EAD59E14BE018161957A05CFEACCE13002EDA4BC0A016154C650B910313C16B059BC9F961CCC95C3D42AC1276DE13A055419315B6700E71A3923D8CE20EA6ECB2849965C56D09897C5C44810FB3DABE450F564110546A423A761D26A5961853EBAB7D4D724A916418C85E88187E9E4F1DBC5894925641513EF917698A95750955EDF442617F1516CB598CE4138FBCFBD4BB4320C +smlen = 457 +sm = 942D75F0DB013499D1C4955E23AA834F690D6CF7F9AE27509B552C95E121FD9A0E2BC57F67BAA6302260116E605D06E11F29BE8471A874EB0EB8ED137047940055BCA71D13F9EDB525D9EB0DBD0DD683007F62135E0D667D80BE4020A94924C7F9A0AF590318EC3C3307F19C4E03334AD21C29E7E947B913D11850EA652FA3000005886F78FE624F8AF4FAAF4E52BBF975D4EDBCC2F785814C103BA818943105693E4BB98EACADD1399ECE8624E975E40F14A500C34DA055B5E53D179E170119170D888DDDB85437D1F596423715E2E3EA1564DD5C8F6A0A2ADE527DDA3C43369F272F753BF7418D8B3D667E50BB726CC7892E0275EDD18708925A61DF1D1EBA8C02362640EF5F7682851D387AF3C78E427D2BE86315D939AC26DC72EB49583F6700090B1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 + +count = 5 +seed = 75224ECC026C18159FF92256844D0ADF953F0A4DD8D74D4EBF1DC5EE8F5630B011A447FD4DC34A2404D620CA0E1F273E +mlen = 198 +msg = DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD +pk = 998E2EC64B1E67FF78C4D3EB18D4AC2F0C67DD795C5B65CA90F14C42C9AF941B8723A211986732C8C528E8DF750238CE3ECF2EF2DBD2E6EE9CAC2FFF041BF000BD4E16414017D387ED80A07F90073A0D3F513482575044A6D6771DAB8EDB4667A70630FECA2E6AFD1D748623C626D57D32FA2324D1EC3C9057E4CFF81432950004 +sk = 998E2EC64B1E67FF78C4D3EB18D4AC2F0C67DD795C5B65CA90F14C42C9AF941B8723A211986732C8C528E8DF750238CE3ECF2EF2DBD2E6EE9CAC2FFF041BF000BD4E16414017D387ED80A07F90073A0D3F513482575044A6D6771DAB8EDB4667A70630FECA2E6AFD1D748623C626D57D32FA2324D1EC3C9057E4CFF8143295000417690AB53B555D1939D6728FD15FC0529F294177337840F90EAEC00882A50CD1610000000000000000000000000000000000000000000000000000000000000060AFFAEBF23E8EA071CA1EED340CE07F103DCCBFD6FCBD3ED4E07F184A8FBFF946FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF290366D2385C5709C98D6DC25500DCEBF43EFA42D07E7C8DC96128CFB3504AA1A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055A224934D0832B5B981468C798B1C572BEA1015D56DE358EE5E521B91D60961710775E1CCC8D15133B8D0BEC9118422625328476C6684A5BCD764772D990218A11A1C31446AB8979B5AE6D258195BD523B9C348535B0ACBDFFDB9C994AC34756CD004CEAA293ED2FABC13C6BD18BCA749A84E95030EA7059CA427DE9D0207EDD75D68396C61B4FFC2D41C6391FAF085B8B4735A6CF6503B1FD4F2E4F70211A60031AD472C05309914979265A77345D65CB8E125B0468D6DEB7F61D90F130E049AB304325B8C38DDA471E1F805AF521FE23A4CFE26C95D5A0525B4EB4FCBB2A975162D27A8426C1F15F4DC5FB8B688DCEF877D896C8EA7D95FA13609 +smlen = 490 +sm = 38AD3749DC40FE0F7D4AA6A4B324F93CD2E4D4BD96074660C21EF30A9B593A6A1EE9E93DA3BB94634F8A77F37131E4FD2B31AF2EAF425A03E7C7C862413637019BEA7B0C76F9E1A6780672CFAC61D6EE57AA988704CC0F29229A5CD34B739474CC99ABBEB549D3BF04903CF7D5EA959B0D5F4DFCEB7417B57FC2DACB1A3AA000000150573D77D3862631DC6CC6F4BB23A453814D759C9006BA777A8815D9313FED1361464B2E4FD3D92B3E23B6F511974891B98D8BB5AE4627AACD5FE9EF97F07F267A993957DE80A47D040E9CD61ABAA48393AC43A8616896046A583ED33C3E4C2FBC343D98AE78A7E417F98B6223F3B749E7FAE42068E3686F9EF83570CC22FC3F8BF8EDA062DD1B5F376BBCBD91042C7B2E9B9A5189EDA9504B6682404B2711000208DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD + +count = 6 +seed = 447F03C8CD27EDAA1FA0436DA492812F57AC946479A9F1F90EC4F5E913A05F8AB0DD7645026A96510F6D40AF05D85B07 +mlen = 231 +msg = 0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B +pk = 618572A9B3C5B890DE13066244E0B14A71C10AF6C213BE77FA4D2D01A6CEEA4F0BDFE265A76344E2588DBE6D66FEC04A36FAFC5ECD7F13A06EF822F7EFD6AD00C2F741BA0428410AC8B4DB3A260279E2106E0B156AAA75FFD6C9CFA477F17E05494A1B019CCCBBD1EFB42EDDC1D3F617E1361BFBCDECE7547452ACABD2EF42000B +sk = 618572A9B3C5B890DE13066244E0B14A71C10AF6C213BE77FA4D2D01A6CEEA4F0BDFE265A76344E2588DBE6D66FEC04A36FAFC5ECD7F13A06EF822F7EFD6AD00C2F741BA0428410AC8B4DB3A260279E2106E0B156AAA75FFD6C9CFA477F17E05494A1B019CCCBBD1EFB42EDDC1D3F617E1361BFBCDECE7547452ACABD2EF42000BF7E19BD6D6425714C9EB1ECFF3443C11265328CFBE5EF19BC61C24E2B5E40138FF0100000000000000000000000000000000000000000000000000000000000088DA5049D8A48753F9CED6F7D16CD0CBA69A0C3DAA82778DB14E234A1A89D42119FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D2F675296712BCC1A0293974E1D881068F662ECD1B1157216A585D0476FB5B4F2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A033D333E5F32DF0DBFA61DA62002DE0100849B25F86C2A1AEF9F0682A21B106601695F19733AD6494C07B818D3B5AC4412029748F86216FAE607938B6250B7BA0EE16C3A2E4E4D94BBFC6271B2AE59F7A76540F319199FBA92369A4864D25A9A83C41B3135A1BFB221E42AB8CDF66EF825E6F4685FDC90ED18C0F758A040BC629CCC6050C4CB9A5E442A27E1678F55502AA55A549339D3138F12C80FE15023AC86E00AA6FAF4BEBAAE79A3F98921EABAA1F0F876A39494A03D741CE091DF46779ED7845DF2AD1EB9CB12B5CBA17C8F396A105849E0C5D9EA82079DB1CEE7013886CB79E05E5A78DAD1FB3112D54019837E8293628DF84381C0A2E05 +smlen = 523 +sm = 15F76E14CEDDC3A3FADD5D4D8FDC753EDCFD8738AEEE084BF87F862336946FA22D7FED984804359C0EF79B5ADAB64807CD0792D66242D93CDF2CE4589EF24E012BB823440970651EE0190EFD957ED078E344FBF2566C9D79A361ECD00C132DC27ED2235774934CF93A662CA298844C4BBB988F5DC957E2ED400F0B7D69008B000002FB23D96F8CAB363E1EA1D079BC2280FB1FF779576BC1602EF210499E487BEF6A55642FF8E75B1FBAED2D3BCAFB1ABAF0B0028B5604703C4E800702DC3181B03530DFCB2A1EA307FCF060170B21A6B8D6202CB48BBB2941E6C441DEBC9E7F44401C63419A4386B4527DC2202D45A90062E52122D4A55C8428FB683B2CB030F24588E8536CA42B177FC4DD5216C83C41CA2E98EEBE8F6E822CE57907CD129C6C0013020073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B + +count = 7 +seed = 8C151C556DA912A82DEB32144C8A8C9090CFAF5C12AB822AC3C72618837A41C2453B715EEFF3724CAFE69B1ADCAE9DDA +mlen = 264 +msg = A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 +pk = 76FA66233B237059099A990B2DAD4B54AC270601204E8560F67CF89BAB454CE04C720520F93266FE0E15C538102F0FDD5B4D1A3ECC7B43A5D73AE9D0F4BF3001E576B9EC42A359B9E4018C83E9C7966C2F7195D152569B3EE7A9E7FA2F06BCCBCE3C3227ED8184638F04AE7974C09C5702BB3A149338DAEDC31F004D2E4AD90011 +sk = 76FA66233B237059099A990B2DAD4B54AC270601204E8560F67CF89BAB454CE04C720520F93266FE0E15C538102F0FDD5B4D1A3ECC7B43A5D73AE9D0F4BF3001E576B9EC42A359B9E4018C83E9C7966C2F7195D152569B3EE7A9E7FA2F06BCCBCE3C3227ED8184638F04AE7974C09C5702BB3A149338DAEDC31F004D2E4AD9001103BE0203B2DFF29704FD97E8B65EBC0AEF2ED7EE27750C06A1DCF87A39FB26D06301000000000000000000000000000000000000000000000000000000000000F2FFB5AD4D4A4D664C52196BDEAC257FF18F394FD56635C2C3A525C7A19BA1F9ACFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B28B121E7E3316431C9E2DEFE976EE40C85458188FBF2AB44FB800EE28D6D2C4EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009FADE532158A794925A862A8F18F78573F58C44AE91C6FFA049E7703DD098CCC0F3C859D8B7619118774E9ACB55B882B49B43172AFD10132D7C94A66A4FC0CAFD25752F50116F0B02D7B1F4B3F26FCEEA7EDD9E3381FC7DBF1E86F4A01E293A5BFFABADA5920E28CC0CF8BF18912897C69C673D7CF8FE68D4C78F8FA25006E667C372968EDC4B2A871D1C17B411BC662CAA12990F3B92CF286D564F0245FBF93A698776EA31C7BB1B5FB1E8249E71CB98563B8F41F066FE31C71135C0849B5F44F8FCA124F5FA4D464E39D14F0EA222B4BD3498700EF27518B010A3597BBEAB1101330D1EF332241FD3381FEECDD2BB80DA4ED68F271DA2FD3BC3A09 +smlen = 556 +sm = C4F4BCB291C412BEB2543EBD214477C18C42C45DE2BDC0ADF905C07C0A268FC5F9429043D5DBC20757DC2840B65FC614E0AA4407F9EBB058F931FA666133320156848A7C1E601D2920C66A3800B79A07A7F719A4307F37EB8CF9A152F15734A9D7CB77AA39CF7999F1EC5731280421E2C77E795422B879CA4C6E61BBBE1AED0000005358D44D679D202C1A225DBA32A33F9C3372310D06B983B26F9FDB9AA1664A0A82B2064CA1651B267C8E5C8B53C680EC0D59DC6086553F2558E79A1884F7FC3DC999FFF51434FBBD848309398F21FDEE42CE33DD88E8A7008772FCC1D0D1F524DF5F5B8D9520F90C88E24A41A09E7B040AAA1A60839A700E44566F7DC045B7754D89088B7421A7CCCBFB832C6AFA1641A286D2B30FB072872C646154605E0C000B02A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 + +count = 8 +seed = 9B42F41492530EAC81992F17613EFDF155F407D7E67F18AE193EDCE714D65D1031E7AD10839AAB46D0850EAF5997AB4D +mlen = 297 +msg = 9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 +pk = 7510D115172DE1D55B44DD9C00C9D334F0908FB134E1004A108FAD32912767377930F1A70E9E968D8F9065D0FA9D5656C2884DCFE379D3A178C16428A68FF10032FEA028BD4CE04738612310D309BEB2A614AC7D8F9745AB158DDF4F9AF835EB03E30EA7FCC3E744B89879EC14527EEA6CC302B4ECA44A27469C857F2194240109 +sk = 7510D115172DE1D55B44DD9C00C9D334F0908FB134E1004A108FAD32912767377930F1A70E9E968D8F9065D0FA9D5656C2884DCFE379D3A178C16428A68FF10032FEA028BD4CE04738612310D309BEB2A614AC7D8F9745AB158DDF4F9AF835EB03E30EA7FCC3E744B89879EC14527EEA6CC302B4ECA44A27469C857F219424010987A68EFF626AA0E4B39B6B07EFDC6A6F27FAFD0197478764701CEE9043FE9DCFD300000000000000000000000000000000000000000000000000000000000000C2E9E6305A622028A137A279C26D72B58BA52F39F8774B3A7D3D8C2B22322E0D89FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4375ECEB53176D110121FB72EA2E11D386405E5FAF628786E1605EF694990FB317FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DDCE16026FB2952B946A93854D11A74797D624442E50BDF37D95016F01AF66EE44319167AB6E4E3488874328A12C09343EDEB0CC95D835A81F6372854C6207B2D69E1C14B099EF8352C5A7BE5C165476D259415A508471FFA443203E9799B9990557E0EB18C4D02E6102D66ED1290E92CE618910C427EE851A00072A430D58B6B2FEA5CB0B25D22987140CBFF537F419898B5C2F03F8814ECF3E5DE59207128844156CCEDC5A8BE09EB246093D84A09E1AF5073324F09D4E5CB4C2FE067DDC672B6E79E903B373BE8480B01A81B3440523099E3F63B1D3754A07E65DDAA6427B528F21A36510B1540CBFFB2508A39367DE08851F9BFEADB6005CFD04 +smlen = 589 +sm = 997FF4D350373E82577D25A0773626DDAC9214C23C4B089F8A1B2B9720BC50FB5EF94294710052538E867466BFC38DA151815E90D36ADE9E32F53778B6B496017EA6A6A7AA0CDCEE62F9358F962C98AA78AA4E5B2CC6F00CC859CB427514428041CDE56867BA22F6E15C7C35634952C7FE1B46F444F45D4054C7266615814E000000BA50A4FAD980A333E1648C1D06E10E6F260EAE69C4DF8FC06575CCCF76C30F77F344F128567C15CEB5EDD33003C1A905140424D3D303E7E19E657841F4E44436A39C162C948C5FEC67D16E8208DB030A24F50F4AB4590CFAFA2E6E351F79B607504EC3139CE05B5CD5FC37040D2AC7B82B81D37512F1B0BBF3AF54D3885D86032029922D634B7B3CB52731B4534C2D414A0D9D209023CF1ABD378634BCC40100020B9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 + +count = 9 +seed = 11134936880F5A11ED3504CF7B273E55A351FCCB10943BBBD186623EE6C7A13A6565C3080D1F536BFDB018F99C4E46CD +mlen = 330 +msg = 0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 +pk = 9ACF0BA18F0D88F81E230468E024B502872656F59AE7E649E04EA20EBA14DF141899D28844EB3A05EB9C0E7832012B6544C8DDDFEAE73E04ECC10F2F49344301A071A48958D65F30EEC4C431BCA2A6FA7798DA2872E9CB205FAAF18A8593AB288B93C0064AFC2AE1F67B8F23AE4E6550BFEA5A1E10B15829F4F1E573B871280002 +sk = 9ACF0BA18F0D88F81E230468E024B502872656F59AE7E649E04EA20EBA14DF141899D28844EB3A05EB9C0E7832012B6544C8DDDFEAE73E04ECC10F2F49344301A071A48958D65F30EEC4C431BCA2A6FA7798DA2872E9CB205FAAF18A8593AB288B93C0064AFC2AE1F67B8F23AE4E6550BFEA5A1E10B15829F4F1E573B8712800020D7D25B8579ED0C2E5E673C6D1AD6040FBF2F4C8280A3ACD578D7C917259742917010000000000000000000000000000000000000000000000000000000000006EC996B2AE80633885B9E776F725BF066406787B57A9C64C9F98E8CCC4B5FFEF44FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF373BA53DBDEF1B20826BD6417C26F605296A61459D502631C66D9CB8239BEAC5A1FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000791FF7B31A9EAF514D11F47696E44B4921B5964927B39DDBBD0CFBB27F442C328576A80D677D8A2B33B9A314D7E4CDFE2DBB9F14F5A6CF7B0E61D1DCF3D7045F3460B61CD1EC7FDF98175E4E658FE4AA2E325CFBA24E1C7CE4739806D3E0BF39CB373CD8696AA7C0624965DEE55A727907E5CC3F7C6ECE1543C6FB12F001CA8039BE5ECE9C2AD40C365E4B67AEF7F5BE6963336C7F57FE124D4DF5053D0CBE89EC20BA74FAB80FCEB34194D076B60091EEAC2D377B5A419BC83507340661DC4C80E58855782E2B15716A4E1D03302CAE8768988C92B5864D1B363956713F8B3CDA7024D9CB49E213BF6E098F8AE732393B40D00BAB92FB5785023E08 +smlen = 622 +sm = 4CC286089F45B8B0AA86D3CD53874DA3A4A7B5D20B4E3B2E779479E1F388560243474A6DFBD339E81613DBF6D715D6605E65E5B714B90517F28BCCB411787A0097A644F7FE3DD155AB2AAC2B68997F2FB6099EEC9188D243279C7E3D63C055C252120B76C4B77FD64D903402D401A8A315CB89058FC4257D0B4EF6E1109DE6000200FB3076F5A29FD75F5B7ADB8C1287361B1B4ABF1F5101012CD84FFC4C7C4EDB0704464575A39B0220EE6613CE53B08BEFAC0FB0FAB967A44454168B58B1DBBD09A62F8605B51E349225B61F6E62A257FEE47612320442713DA71234DBBE0DC705434C2D5B5F8B86979BD90D71B75841AFDF01C3D1167D0B74F86BB45025DCC5095A09A21A8784C1EA742AEC03CE1D0D1D6CFCF2C805C7519DBD9E17D6F48D540004110998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 + +count = 10 +seed = 98DDA6B97E89A479D5EE214E660DD6B5D8F6CC638A1CD4F462A0EC545F5B0B0A1A403AADF566F7B1C0C5FFCA29B36FCB +mlen = 363 +msg = 4CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C +pk = E4C22ECFB06664EAE02EEBEF8228410D365F17CD6D5E6FD2F7234CDF22D1DF5E7426B4ACE2B3E5C0306C832C7F44415311C0BB8C39F598DC73751ADB5F709C01FBD9D1A3F2B41578BCFD5FE7D0946EBF8AFB33B10124300ACE562DD073F6E82864E9A01A5BB6AEA675B73CB4F34DD5035C53C08F8933CC85ED77B29BB26D0A0106 +sk = E4C22ECFB06664EAE02EEBEF8228410D365F17CD6D5E6FD2F7234CDF22D1DF5E7426B4ACE2B3E5C0306C832C7F44415311C0BB8C39F598DC73751ADB5F709C01FBD9D1A3F2B41578BCFD5FE7D0946EBF8AFB33B10124300ACE562DD073F6E82864E9A01A5BB6AEA675B73CB4F34DD5035C53C08F8933CC85ED77B29BB26D0A0106F926BF23DA3868F47850A6CBA26D1E9FB6FCC4F00629F87BDFCF730D3FEA21386C000000000000000000000000000000000000000000000000000000000000007CB09939105D04948AD700016BAF9CED7381B4FD1300474B33471C4F935A30D3BAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2310C312ECF7FA5F9941D49C6BA7C747B2C828251719B6D66073BC2A6A075DC54BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F547B16C8ABDC10B172DB9939FB0D2D418E765945C99895294018126B650AD5B54D4BF1D282ADA67F4A24352C6FBB759384F4D1A85CB352BF1E0989F9CDD0E648613A56A4EEA5F95B9A8D9EA8C465DB7B50099582CF051BB3F6F394AEC584FB26491205BB05466C9238F6931143302E37DA4B3283C0E93C07D5E973F900CA38A51C18246F96980276BA8D6C586F35D18BE1E0DF3C63BAFC7242281BB0C038215CDB09A8AF92FC240D2743884CD159958843D8337605929824E2F3DEC038180F487D4CA9ACCD8D75DA521591C9CC45EE0921A121FC5242883547D6A60047AA82C22861DBBE6524237983C22B8593A8EE9E2F2BB3CCE169BEBD422A504 +smlen = 655 +sm = 44D975942D1EB8D8A2F21261B8B6F7607622A54DA9897A165A653C5E499400E57DEFFCEEEBF982EFD2DAA110F33D05875637813C2318691CBF0E20FA778FA0019642B34EC650E7E63CCB1C16E147B851DAA82A8FA64188940763B31177BE537AC35D26CB1D92BC23083BA8252820D6FF25B30A469CB30B4D2E19F3A16E1E45000002FE4A8E364E05E3F49CE6C6E770D3F3EF36F19E22214D95BE2D8A1DF5FD7D2261E752F0F9F2A6EB2648440C013995FB4E733EAD1E6A490D177BF6D42160BB976198CFB44532D3B13AA9D173AE044A4598EC580FCBFDF0C1B7C83B4AE46D405F25921991FD02A6E7F347D247A1F4DC2203BAE7A2B7BBEF2017681F44DAE4E7CA7C24E3B29BB4845442E299E78EB7DF3AD98347BDF6BD044F715D8C15A849B0330009094CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C + +count = 11 +seed = D34A0AAD27ECAD31A5E08E9A2D7901A9B85F864D9B1B46F40CDCA0B3615B2CBA04EF82AD7BD8CF627C3E861477030BE2 +mlen = 396 +msg = 5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 +pk = 324DA236FA8CB8BDDCE6F82568808C4BB325E07DCDA926BED7BCA233307857153DB5DF35C135FB19DD45420C044D60A15CDA24D0EA0B97117517D4744640700011069778887B7F3FFB4B10FD082C16A0809F7514D7A9783D219194D6C45859E6BD57AE18EFE8FDE920EAA2FFF74D66604CDBC65DF04470556954BF527A0872010B +sk = 324DA236FA8CB8BDDCE6F82568808C4BB325E07DCDA926BED7BCA233307857153DB5DF35C135FB19DD45420C044D60A15CDA24D0EA0B97117517D4744640700011069778887B7F3FFB4B10FD082C16A0809F7514D7A9783D219194D6C45859E6BD57AE18EFE8FDE920EAA2FFF74D66604CDBC65DF04470556954BF527A0872010BAF3D719CC4E02B849C6D2DCB61762DEBA32172C8FF8C736B2D90ACF2B1E9517E98020000000000000000000000000000000000000000000000000000000000007476D58BE1294B4A821FE824A99801FF3B2DF3A073AED9438BF151713322208947FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7B4925A8058E5A6511CD1489A005098F9C0105B01778846CA24801D52FD547B83FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CB027F60C9FF27C7DC920DA906E4A6745192169C37303FA211CA7F15CD49813C0B4A196DC4D1A493D057423A4C922A77525AD36BBC9AD0DC2F4D08B6B5320DEB3FD3EC19FB0655975B360AC24F6AA14C3FCCC66AE25A786A37DAABEEE75BADE7D4E0E94FD09DE9032856ED2E107F7966B866EF4686EC7CCD983B816A47099BF4DD4B6C16A5A2BBDA5AFCAFED401B2A7C1EF8E0661D129A312E9686A174CD58EB1944F5FDC64A54F9FD272720059898F473BBF1B842BBB4C2D44D5AB60A403A9ADAF909956FCB6F3064B5C5C34B8DF3CD51495945F4DED8C86FC39304BACEC67F56EEED8C072DA9EB99871B92F009D8F40EDC1050FD8F43F8846D0F0A +smlen = 688 +sm = BDDAB9C203E1C57D91FA4751AB6D4BB36252FA23504D19C02448290F306478EDFB4A52A6354EAA642CE4DA569493CD1A168F8AAF2FD98312ABCAC97579FF2F0086CF7CC85E15A4B064E5A252D29FD7B2D1F3E48FEC340BFF324E33F947E424588FEB08A284C0CC2F1947E9A61FCB30008242E144459A476B47BE3331B6D8350100001F299FCBA25DBD48142702CD8F82FC963927E0E8BAE3B867CC18672EAAEC645C1B4D42AE15E15B1B938BFF63EBB97B2E402286B98FFF96B096F75769B5DBBE254BD81E3DC438B8904C5EBD0A9195E7674D89D866DABC8E8CFCC8678C42F000550036556FD56FD0206269658217A161D35EE8632C7BCB5D1CEF4535A92FF4BA6C946380147969695FF235F4F8527C9B80E2F171608BE4B2985D2B0AF661A90F0009095C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 + +count = 12 +seed = 4FDA9FB6929E3F391901D69FA0AA2F25A9657D249A620F1B9E305A5965676BA76794CAD3355EB632579C3958CA7D443D +mlen = 429 +msg = 49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D +pk = 714AB6197FF90E9397ED42F09EC458FA2257DD9B00DCE3801A87D7B9241ECB20E33C949A5F0E2D500EEC30E64168776E340AAB28ADA1847BF9C14E96FE092A00FF58C4949DB9B32E007F9E5A553E4FBDF921E4FED6C45A5900CA24823486F8A1735CF8E9A12640BE7F2915C879B004C7120261C887D7A25AAB77860DBB1A080109 +sk = 714AB6197FF90E9397ED42F09EC458FA2257DD9B00DCE3801A87D7B9241ECB20E33C949A5F0E2D500EEC30E64168776E340AAB28ADA1847BF9C14E96FE092A00FF58C4949DB9B32E007F9E5A553E4FBDF921E4FED6C45A5900CA24823486F8A1735CF8E9A12640BE7F2915C879B004C7120261C887D7A25AAB77860DBB1A080109A992F3D26A0524A901E5C1A5493CFDD2339FCA5E56A7AB1B6E0457CBF1E27A895100000000000000000000000000000000000000000000000000000000000000AEA767C7687E6C76D6276EC2BAC90BBAC2DF82DDF992D5BEC95C94CC31456C939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF392276C7A1E356FA73D0F60D0A6F749ADD4906D6443C3089AA6AC80888B0850C65FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003319FFF6D5920E15C15BCF6A25E93817AFF90189F5F11FFAFBB3FF4827865FF4243978CB95A3A08B21E0E2D693AB13820B01C01C84624E9B79526C1C8AE20B34CE1C7A01DC316F084EC4EE6D06D825CF2602CF117AC7C8BCAB240A59F7FB34556721B3B4A79C7C411F552A99CCF2EE2A52F2A5D024CE4913D473997C290F843EF7C89D78F0E1FE972B7A2509EE5738F5A63DC9CF479B2EB80EA24691D16F74F911BE58016AE7508C0D9FDA1D365D4C6B7CA22DA4AB9D363F7852D885083FB0509CD214D87E9496848CF0C61BD0EFB4E1B3CEE642EEEA9F26C6A359B89FC3C70B5B0744BD4C9124E9341A2980A4770428A8E23C64CA150186B29BF501 +smlen = 721 +sm = DB15110BB5FACC31E75610003BF0B1C3FE4AB32CD7D8F50045BB13789A729762BD168D37D47B50AEB48162D8DA2AB9725DC62D07C8B5E06E26601E9A4A943B0006209D5A458ADB12EBE9986F5B6743E0611CC223FC7579D33802B8102FE9AA2FA15D57609DE98225625AB623157FD77E678D6CF877BF536B4136B6572729050100009B92DBCC7093AA83F66791EC212D9D859E52011AE528EFCC6BF87DBF4F82405E5E2170A861B3DAAC9D8E18C1922731228750ACCC9DD5A15D547D1922A0C66D180BDABF011EC630901D89FE153E8E19927D4C42F2EA8EB5F15C878028470B262725D3340C6F36DE3A48D9E4551DA3B2588B1EB1524FAA067306974A992D687C754D4FECA2563445591A60338D1AED0C1337FB743D97E398AB6079528EC99E3100090B49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D + +count = 13 +seed = B0E6A23FAB10A7A333E3720BE00D31507917F39C5EFE1C98CA18BEB5C3101FB4479B478A1558C4C00398C55C9822FC44 +mlen = 462 +msg = 439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 +pk = 37018D6D0C3C5E4D9471F7BFAA0CCFADFF5C2B308522E6135ABB974443069AF69E0F0500CC9E0CCE1EA3065B5CE896871306FE288E0E54FC86FB73B4822C40019BA3DAA475B1E71BA878A7580D069D26B58814AB982354DF25B350F2540360D621A5D1C693EF36154F62F8978DA2CC923B6AD80E43E5FD5BFE3B18CFBCFF91000B +sk = 37018D6D0C3C5E4D9471F7BFAA0CCFADFF5C2B308522E6135ABB974443069AF69E0F0500CC9E0CCE1EA3065B5CE896871306FE288E0E54FC86FB73B4822C40019BA3DAA475B1E71BA878A7580D069D26B58814AB982354DF25B350F2540360D621A5D1C693EF36154F62F8978DA2CC923B6AD80E43E5FD5BFE3B18CFBCFF91000B733EF1C2AEC6505E54189FB77C0BB7342D0F5EDF2C5F1C8DB16F39B160AC77CDF700000000000000000000000000000000000000000000000000000000000000863B5C15538C79E1B68709DA725E2E0171C0CEB21B6662E65C1B47B13C64547D25FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF893FAA66F885FF8A579BFB6718CF4E2CD76C70520E5A63FBF1FC934668FC818AF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AF08483CCE75E4B3D385B802C21AE515741A8EE8AE7CCD07AE885911AD4327FAAC90E1D1950E7BC6587B4827CAA7DA75B278D5E89572F3F27D764AEABAF70AA3B3C7D68A1A6FAA3816E231A3CF6DBEA51BDABAEE345B120BEAF4E580A9680DB5A5BEDF88DD63604444D419B45D23D74318C23FF2C78202AD3C08ED7DE10E3C7FC9C62EB5557858BCF46AD11900C0736ADBE5E619115BE39578F0142E5BE29BEE69C8D9371AB276CCD89AB73BFD55A20C8597CC5E7B576663799C4A550B57F4E51BC9B5561EEC070D11FF5B01D2376E91AB4DE4FEEBCF123CDC89B5D09450C414327857D3D7B3C3DE8C7EA4B0628C4EC05CD2D55DF72DBA0B69EBF702 +smlen = 754 +sm = 435430153ECD491B58C7AFBEA99B501B05C0733E71BFAA7036A4AF523D97761A07F727AEECADB01D26CF084BC48851F9CFABD3B60FD70F115D7B480500342F01F8797285E73EF857D9A4D3673195974AA187F91C95E0581F4D77058E068BE409142B563A07B70013A88EE0FDAC17F53C3CA6C2410EE12C52C77F9A36E7E2890101018A919353D43022ED505FC1FEFAFA94C28516122162EEA752B3543778A9DC79018370D8907D4A9DF8B6C6E058DFBE80DDF24D4540495EF90E38A92D8C8EB1531D8CCDBA9766AA41DD6DCFD7F84CF7AD0CE57C1BC88C1FBD8B42FC2313A586C22929A463D991BF26F3F6C6D6CFF53DE1F51CBB2B092284AB8459E157A30ADBDF06BAE95287D74F0324AA442A6401B089BC3E7A3A95DB4BE7679F66CCF4ECAD6B000619439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 + +count = 14 +seed = 0A98A2BD2B9FF42CFC18D3396BAD052E1D0F3372854DA69A318B142F7A1AAC609C3861263BD8FB0549DA7266784DB8B4 +mlen = 495 +msg = 8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A +pk = A4C0705D2AD82DDD6006451863F64A062D684D18F4F8C7AD58D7FE98BE06087F57C55ED7BBE161D33DCACC3B73D44FC216FF7C93231C97557B41077E1C2ADA00C19D6C86D8C231A33E6F3CE496C7D26DA1716113B2FED52563DE342059550FA6CB211AB63D70CCBFD0C71E426D2FC0DDD83D1F38B485AD67ED503DC162A10E0111 +sk = A4C0705D2AD82DDD6006451863F64A062D684D18F4F8C7AD58D7FE98BE06087F57C55ED7BBE161D33DCACC3B73D44FC216FF7C93231C97557B41077E1C2ADA00C19D6C86D8C231A33E6F3CE496C7D26DA1716113B2FED52563DE342059550FA6CB211AB63D70CCBFD0C71E426D2FC0DDD83D1F38B485AD67ED503DC162A10E0111211D42695E1D0E209835EADE7C9714DA8ACCF400BF9015AC77B6B3071254DC74BF00000000000000000000000000000000000000000000000000000000000000EEEED88D79D3CA8324CB12489F8D2EF4AE171AC6777CAD23EF486699DD4E47208EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01125A188603B9B8C1DFC01FCEAE80F31B746B5DC9E83670062111F1DAB5B48529FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BA71320B5386BE3EB89D3EE7A91B4826BF1617F2028BBA326FEC8950D008AF95ABD7432D7B1C52B5CCD76D41C3AFAC0B9B331C302E77637907A5884E34D052EC04070902F85478CC3D741F4544826EF7EFA0D2F044FF68D750C1AB0584B23CD816E291ED2295664D4439A3D19248F7DC127EE6D87A768EA2C34A6EC3B0E30A3EF4D5943ABCFFAD1B8344BE46C0A923D8C64ACB45743BB51EF921267E36F13CF9024A833EC00275F6A8CCE27ABEC5C5A3078262DFAB4E5682A1446020E13A6A6FFE93149A664A488C8AF22328F442F90E936C7F78A2B491E285842BF9F39B35FC83AEF02E5614D38B7100B0858A39D81A0793F550096EA05F670E803 +smlen = 787 +sm = CE09692606B0B3C9C260D282DBCA1099EAC817ED2B5BB51754B71C513B5770F5D9F61862E605C5341A1F9A2AF46532ADAD4656AC4DBC935DE276BA7DF4EAD600C057BBA024F80A04993F676E643E105D45064E97701C835F5BAB933AD6632AC5CFFA8DEAF46DFB1CA5A05A70694A8F96467878EEA2A60657A82A272AAB556E01000135A43C9E0336C02B08E3C0A5A8AEC52C34A026FB1084A10FEEA5114864F9FE1D0AEA1F84DCBA03BF92558C0C736C60B1E267AFCCD5B4C8C822D74CAE9122F72A20C3DDCE0DEB6CB147746C442A35ED8B34CC5FA6E3176F1F015F519A9AE4CC2FEEEB9F324ADCAC3CABFF89BD18E1EE8D6526D429172370DFD69C5F5A1CE3711368AFB6ED44FCCBCD09A9606C74C9A05A0E3F9BC6F83739801AAB2A488EA4610009028CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A + +count = 15 +seed = 9887F1FD854241A301EE0120645CD8E119B43F7BEE11F77A835E9ADF518C3A51CB76D86653FBE73AA716264C146797EE +mlen = 528 +msg = 9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 +pk = D402CFD1DE5CE453EAAC1958D5A6BEE05FBADDD39906A4C3786067C7FB6DE8BEE8395DD0319C45ECD848C7704807EE74611ED850C128405A17CD9A24EA15A30073F826EB4712B094A2FE47C28CFB7AFD0B92C0CE96E92B03A02634FA440B7D9C79F8BCAE31C98F5C95CB8BFEAF384C69BD89CBCB892476B078A8BE09F52B980002 +sk = D402CFD1DE5CE453EAAC1958D5A6BEE05FBADDD39906A4C3786067C7FB6DE8BEE8395DD0319C45ECD848C7704807EE74611ED850C128405A17CD9A24EA15A30073F826EB4712B094A2FE47C28CFB7AFD0B92C0CE96E92B03A02634FA440B7D9C79F8BCAE31C98F5C95CB8BFEAF384C69BD89CBCB892476B078A8BE09F52B9800021DF6A5EF71F05ABE3FA8F3547C5F4A6FAB302723DC8628BF7BEB95AFB24CC573860000000000000000000000000000000000000000000000000000000000000032C66A5CAF705303B548939404C1E8E8C666A8B661DB52688298741F134D1528C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43AAF874F66E3B9B4DF371F279856803B21D3B48A1A4B8B8F1459F0C4A24BAC5BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EA84DDFD6EC1E8335C415FE7D9EA6C6CABC803092DB42048A9AFC04E5D542AF877582CCF505E42CD49BDC8BBB2F7B003DAF3ABB979A03E2B93DACA8CA1FD0BC15E93533F4F72BA0475EE8110E81F017EDB7CDB6BCBC0B34CBDF70BAF5349C2318D41AE259B2327F1B67E58DBA4E0FDE2C5E9BE091EF58365AD8583B867066F6DDE321F5D3F9E92275E0ED8231426E4FED5205B38BF2EC48D4D859CA9C3DCD4C6607F57385E247413285142C2BC4C4A28463B8954D04D7183F017E64E0BAFD6E87756792CD4E7F757FDEADCE286BBE9787314B6D81C110B06981C91CF6C9C79301C3F91D2291E3B0BB6828B25E350165FBA9938E224D84446C9C54C0A +smlen = 820 +sm = 165D6E884CCAE8F3610499FBBCC9E262A78D814A14A624557CA729593E28EBCB2E0453B9184825D263F5BD5E4098BB937DE366466B67AE4F4A99877C04084301CC264591E5481B1FF50B4A864FC9D669835C9FEDA8BF3B4B2240767683CACB84AB4F87FE9CAD6BAAD4B2926C7DB0B318E6F3CB14722A0D3DC8F36DBC963AAA000001E515FADC14E3C7465C13895706F1E2506058D88DD5A2BBB1BB509413CB4C8546B7CD9C3D1841B9A57435134E8AD43EBFD500D1BCC726B2314B92E3AC5927D6287D2472772AE35ACFFECD312CDEE2ABC6CC114AD9D43D4408B1919989470A9E318D35629F34471D09FE3A899DA143DF2A2BC91FD6A19303C66DF0B4DBE8C4DC02E84F80795215358B70AE2BDD21E0FF3D3D4CAA10666793FE39A1DE9B849375000C099B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 + +count = 16 +seed = 5B485527C3B9A5E5B7579950049CD357975D4BCFEF83FE33C087ACBFCC10A0BE4225E7F8A5F77203B5FC7C0B5FC0E78B +mlen = 561 +msg = 922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 +pk = 927D7BD63C93707EAF175FBD652DB368197BF8CBC8609523A8DF543D63EB4E26E05C5EF2E41D5AEFE0790D861D64D5E75F70021BCF358666D4E036C1DA7FFB00F76F7F69E31F7DD10FD3DC6058DB6F82FC1CDA42F303A19599A444F686D4AAFB84A3A2A65D9D73FACE698046F9F77A808CB54BB0D4D4F3492D2E78A2D381700009 +sk = 927D7BD63C93707EAF175FBD652DB368197BF8CBC8609523A8DF543D63EB4E26E05C5EF2E41D5AEFE0790D861D64D5E75F70021BCF358666D4E036C1DA7FFB00F76F7F69E31F7DD10FD3DC6058DB6F82FC1CDA42F303A19599A444F686D4AAFB84A3A2A65D9D73FACE698046F9F77A808CB54BB0D4D4F3492D2E78A2D381700009DF972DF3C190C79B8E307E69C43CA45855276F7DD3AFAA7A7A352317F7F72D4A8A00000000000000000000000000000000000000000000000000000000000000A0C165D07FE2B226E09A48B1E147274FC4849623FDC4F5291437ADA30A1F67A4DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B82476BCDE039B1F3FCAF8C65759366E883F30249D6EF94BC03C9BDD99DB8B908FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002C7B0CB16745E5228092EE4AC973B30541CF26B998916657B9985ED95962669BD953640F2144BE0C57E7F834A8E570EA9AC980E51269002D282B27E6C60F0F1B74E6A41207295BA6832D684205F267C424622CB36A8D92AB01AAED90EEBFEDEDB78FE6BE3A3EC6DBC3D925008B3A60EA48E5D9D905CB7A45DDF852F3540E351EAB766D5FF4E6700FFD86FAC8D03A2FB5B33AAE01096786C891480B019E192114496AB60EE6DE43B815F2A89536CA5E2385672B311E3709038A1317080C1568E64B1CF14EE14F296CD6CF0D121EDB5A2F0DFC47E31AD374009DC140400D90D8A6C5BA6B671A257C128380D079327D3D2851E97848346895E2C414310C +smlen = 853 +sm = EE463310DBB58AC2083D26370BAB2462CA1CFDD48D3241DFAA027DF0232771EC2430E1435900B5D0A0F3BB875AEF9749E0471F6DC6DF0896145ED4707E5F4E01FADB7FA33BC414FABABCA0DD3D758BA0A7BE8553979D54D710EEC2B120792F53135BAB62349AF84B52EF41A6F44EE7A2E97D742398B94BEC9FDC3373DA9E7500000214E8288671F091B15249B1F6B1F4145F0B51C99F7F7790EDC095D54DE3DAFB61C11CC6440EA5AF3C8EEDDD53C19976BD8E153A9A3F3E860F2968895BFBEAF31FF8FE20E1E4411ADCF16121F50732F338270B53AE9D43632A4C572098DF9CBE08DF8C3AEFDDF979F901C75E95C399E4A677274E6B8D40E80998F973A3BF9E91754AF9E509A1DBE8E48336A4EC201DDEFC0864339230EEC65D884A471269302D000B04922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 + +count = 17 +seed = 327CE565CFF6CD9A25EDD84F482FA0758B78CBC246567DAE98B818314AE28CD438E339043EB3FF16E1C2B4B104A717B8 +mlen = 594 +msg = 576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC +pk = B99DEAF88927EAC24DB3C9C7A2C84FEE099510394901D8BCFAC31CCA05413AA47251ED9B2AB356B784695ACC74C54E573057C7B7CBD83412FC7808C7982891018AB08AA40F33B35ACCD72FA69CD0179BFA84CA44AE1D1C5A17425A69F226B1267481CF7C58E34C3D1E367115CDF732032CC8573FA4964E3FB9DA5A2E25055D010B +sk = B99DEAF88927EAC24DB3C9C7A2C84FEE099510394901D8BCFAC31CCA05413AA47251ED9B2AB356B784695ACC74C54E573057C7B7CBD83412FC7808C7982891018AB08AA40F33B35ACCD72FA69CD0179BFA84CA44AE1D1C5A17425A69F226B1267481CF7C58E34C3D1E367115CDF732032CC8573FA4964E3FB9DA5A2E25055D010BA31ABEFBFA41EDF1BE4E2537EAB7B22BAFD3425643116CF8A363EADC8E6C6F6AD90000000000000000000000000000000000000000000000000000000000000046B1F90B5065E392F7C640B8B224F89E7D0E2F2B0432D0C3C89DFAA88502A07CD5FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC316E317CE6F2A317887B0711D4995D0C7DF7624DC274B79BCA6071DC229AF5633FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B5A83A577B25E0F7A9079CA98EDEFBEF763270197836C1BF60F693BBD75979EDB14DE7A7A298045013F4B7C75B7DEB05BF5670F06BDF59C8E4F7A75F1B780CCF957884D8B9FD58C717906FD9020DF08BC7F43EEC6538D9AFCA24ACFBF830F72025DC3F1145C1AD933D0042BE612E2753E3B3D7264C15BB5AA9731B23F20A507C625098E337F4894EA62DFEEBAC51342B3FCF88F15E12D8CFA44A1AEFF6881E6ED6A18715DC509F186234D722320B92791DBB3F37BB02356570401F370BCD22AFCFD08FAEB686F53A47E752A86157E79DFF0AE6EA70DCDD2C5233C3B9B7F326111C0E7F789D6C9E69E618B751A9A4B35680D2D068845BE55817C58F0A +smlen = 886 +sm = 489B89B0A3FE6DCACD01FBE63504DE30A889F1E48DE09B9CA76F03930B5C30F8F2C0384FFD5F6DCE77DE619C54237B3FEB4122C0367D70D2DE4DBF4AF712B2000DE60C8071EA6E3DE88C9CDE830538B0BA30E540A56943907C2CB2A770625D9B75B5C2FD136C8E07A37723C2AAB1CEF4F757BD637FCC32C2CA21973A84E411010001B534438271C869EBE5C01E81D13FE1EB5DA2D07A468B8D13CAADBF5919B3EA46CDD3833640E99719F464DC7DD92C10A39385B955E6D3C3B00B31927C33D24A2DC7DAC6AE90B5440D50762F0E6BCBBD98DAF2F18B74EABB210B5E5F0DD48BEA7CCDCBC2FB023F221E01EB995DC2453AEF01F04C54365A12F3143F0FFF5FFCD84D21A7AC63801800AA170E014663E7533E364D68CD8FDF7ED4E7DF3B3780881000110B576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC + +count = 18 +seed = 790FC03F956D1301A735504075B67A05944A762E0A4BDA77BB8C036C5CF911E2B561EC1CA6AA355D5CEC919AED42A1D2 +mlen = 627 +msg = 021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 +pk = A27A76C95A406095416A577975B4A1E3FF368E268200395138C48F9CD6A4874087B522C232ED1189E490C12BC6D5AD6BFF4D7D06F58C9F0C667966CAC143660163B1C4C6F2A5B348740AF0EE962750739CF11252A265EE233B17E6292A8FDD6DF024BE8EBB52B13D4F9BBABDAFF03C5C7B2CFA415E3AE6E2332AD4DB65D4110008 +sk = A27A76C95A406095416A577975B4A1E3FF368E268200395138C48F9CD6A4874087B522C232ED1189E490C12BC6D5AD6BFF4D7D06F58C9F0C667966CAC143660163B1C4C6F2A5B348740AF0EE962750739CF11252A265EE233B17E6292A8FDD6DF024BE8EBB52B13D4F9BBABDAFF03C5C7B2CFA415E3AE6E2332AD4DB65D41100083DFEB41A3DB5D97B5FA640152CDFF32FAC2A7A25424A63717696305FDA5E36C8A300000000000000000000000000000000000000000000000000000000000000B834AEC57C8F149C4C73474B4D9BCD5AE049D21AA64EE82F41587F7DD0C91BC074FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BF6BB66EB6C272460E8E4C5B64627B775C1AC0C4871A35A5C7AB5F0AD6467586BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E835D85A26D0EBCDDAF52AB8A2884E7E5FC38C6B0E978A93EA3663E62BABFC039C5AA58B2A1FEC131A309F2B19D6DFB6F02F356BD0DA8D7B107F6D21ACFD0A5B1A652E496D42AEA68E7F3117531590028AD66CAE20D24BB4A423170A0569AAB150438FA439E7A1F9DC865DE22197335BF797A83F05C6495930EC3C0D5504CF69857696EEE9BEC19C27AAD9560A149E8FF583E4572723364784876660EF8C269D10C1CE35ACCCD14A44874E130CD20C981B0C584AE2B5955DB5F02C7F0C8EB84D334CFDDCD5076F7F1F49178B7F31B4BDB722EB5CE001FBAFB9CECFD2631A97D744AB37488B40995C34B1223AE8AD3AF7789C970D83F389617D261A0E +smlen = 919 +sm = 0A8955F203B5EFD08235DE2E5C3DEE70D71E9DE1128029FFA5DD4E17BF6458C0A4C2A16AE8387EE54A86B6E65D629FAC7FEE26B530F6C9DE84BA4D612773340102B22EDD937AD88D80F99FE10EE245D1897DA9D00CF3C6B868CB9B0924A1E22AFAC7667E39CAECE1941BEC70BCA7C019AF7165FFEA7C7728573A666EB79BD00000039541E05A33537F0356EF05DF5A70AE1D5AC2527144D5A3B7362F1F8C9C5DD453BC5414A0C7E13E4CBA2EFD26B953A614920DFAEF30D23FDB12BD31AED7A508392E7F72B7F59DE9D4EAD1099F2BF7082E358FAD7FAA24F8A84EDBF77FC779AB2B00287A30F6CA7BF6A343E8E3AA6B1A7C9C51EA4656459AAF4A4CA0202A2FC86308D914E12A4309E1EA1A40671428E34918461936BBD02DC01E5670BE91FE20000B04021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 + +count = 19 +seed = 716354F7DEAE272CD26929C0932CA257AED1DD23D67260726B5213D82E61466FA99BB6A7D81DEE9D0EBE03DEEE4DBFC7 +mlen = 660 +msg = 7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D +pk = 18228D8A383A6CBD62CAD3781E0399E733A1ECAC64B13A5E77ACEE4618E167BE1CC6A3D322071D8630285B591267633DF8A359621821A35E9752729FC171E6002B83D90A9D352423AE28876A19CC3AA70F50E95305243CFDC864B92FC25F199D0ACFD0D5F9CDEF71D436DF4B95D0CCFF3CCE8DB9CD7B754805293733B7E4290009 +sk = 18228D8A383A6CBD62CAD3781E0399E733A1ECAC64B13A5E77ACEE4618E167BE1CC6A3D322071D8630285B591267633DF8A359621821A35E9752729FC171E6002B83D90A9D352423AE28876A19CC3AA70F50E95305243CFDC864B92FC25F199D0ACFD0D5F9CDEF71D436DF4B95D0CCFF3CCE8DB9CD7B754805293733B7E42900099103AD1CBA75A1706FA918E51C88A863DB9E00CBBFA63983A7E057A6B80AA0049600000000000000000000000000000000000000000000000000000000000000DEA637939FBFD2AF71781BFB23CF0B9CC25F180AB56B56AD6A95860E333C120100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF538F587212C9B10D204C86992DE43839503FF9D4F11262ED4AE43A952169698253FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001F7FAC5CC8A711CD288ABCB8FF183FF0763B8B282A6489A536B8677E32BD6E65584B1CD34FBF5D225B10536CB72747800CE3931C3666D4EB0F0B4B593D9F07278A2F9BC52A06FC3A4E70930AC848AFFA3E0AAEE37816F5FB033266B20DECA858D6A49B8A5C4BFC5F275655BEBFFA0F57C9ED04A523308E214C8CED16350F65A0E481FCC62DFF472676104B6B12D792917E15CF2F7F8991470C5D68A8E348F58AAA4F3DC1B0253A00C48F7EEB790B8105C30F361CB13E0F7B53C084030D0254DDFCC66ECC3424B5BE77016AF746B2A7054AD6F6B1B87699A4F517FBEC84286A635DFD81780BBDE190E671D9166A2322DD06EF2B23EB85400C4EDCCB00 +smlen = 952 +sm = 3C05EB7F0A60DD8229ED8F99198FABFFC8A1B07796F2AED82554A88C68474C73E2C0706E9784838CC884E0110172874A4D1582747DA9283B71134083B8A0BE008721632B820B7AE8C9B72CA218280B1C14D7529FBC34A73962C5DA5D16217D7F1AFCF8F49FFAF0137B72CC2163468D749C4C5B0D30B6D8E8732BF8520EDE560100014DFFE221C85CB35FE6D4252298DC679677F615F2FE24A375FFE733F60DD89F64AC0E5D32899ACEA4C64DBDFD82CB3FDE69E2D365BAEBBF34BEF7E344FB93B4581F192E784DA59DFB745B3C83450CB5151CA021F487D3DDC8D1137D8CF8D9B71D82FE5C30A96462741E03EC70808334E20DA853030471F4FD92D5D8AFF306EE279659B1806EF702728241CB9EB15DD6DFC0BD6E2FBC9ED979DE4D441D27267C0002027BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D + +count = 20 +seed = A32E6FF879EC8866A5F5E4F6318DA8FE6743812ED2CF5FB94F5C3AA3EDF953CBC32665810B71B2CFEBF343A571CBC570 +mlen = 693 +msg = A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 +pk = 18821E85FFD587A12FFF9BC93EE712109BBB4CBAA42000AF6BA0059227843D3452CCEC41C52C5A954B92911D80F053C5399D5BC142117572B8BC5C9631BBEE00CDB138677F8557F73B55C13CE6F7DB452FE484BC4851EDDB17ED7318964711218495555F21ABEBDD65A8C6C1D634D8BDCEBA45F17D1A664868C829072B50C50009 +sk = 18821E85FFD587A12FFF9BC93EE712109BBB4CBAA42000AF6BA0059227843D3452CCEC41C52C5A954B92911D80F053C5399D5BC142117572B8BC5C9631BBEE00CDB138677F8557F73B55C13CE6F7DB452FE484BC4851EDDB17ED7318964711218495555F21ABEBDD65A8C6C1D634D8BDCEBA45F17D1A664868C829072B50C500090BC9A48993D9B5D7E354B3AEA3EBD9E8FD25544152B45F079326830FBB4CB93EEB0000000000000000000000000000000000000000000000000000000000000094B97D7715F7F0B7C98E231F595A52D478F6E891E74B46EA7BF6867F98A2788AC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25688E47C32326D73BBD5FB39BA41AC37DF807F3BA6DD62A9B117278693DAE83F3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003AF96A05763921FC13321C1A0499F57D445A71DE773D2FB4FB031A162CCEBCAD9F9EDF3B4218F7A07B009EC6AD5CFB47B01731AA1F39F688BCE64C5A131700293B908C4EC1FDFFECD1B886D761EFC61CA4390414A3369A0792DA028DB09A0864FA0F6859743121543434250B95B20921D651AA7281E78F5AE48EC698CD0BF548C3A7C6F4B0B0AB06ED7321DBEAC4ED8890FB28DF96C62945019769BD9E3DB3994FCC445784C86B38E993A93ABBC5CAA5EAC4E6465ADF4D43DF08B3540E0995D852E0C872B6FC8EAB60F2DC64C496CB5279124496D28B25A88BD5E633314F7DFFAFA2A283BA327FF70094A3A2DB68AAE5BB90DEF152E108EFFAD4AA09 +smlen = 985 +sm = B342E2F0A8ABF2876329D46576BBB5D4627E38550CE9DEFE9C7E7C638F1FB83956AF8A279685F033BBD21B5B6CA44CD45FE3C114942B091DC784E45D13AB6C018DADB02FCDC7110ED32299FA688911A0CFAF910D80A994ACBDFAABBCADF7709E328A9DA458534252F04B90C4FEB1E578256242EC6E8086C8008362670FD79B010000D353E7A09A5D599D34530D55D8528F2AE3FADE5B311CE9F7FC10CC7BC64E8F677C19606C2DA815462AE39B0B12C35BCBA4C020A0DE62649C78D9E3E8FE8B4A7901025117B8D8539D7C1956E9CD8501A86635E51236E7910FE8DEB5DA0158926B4B597E523200B8D12D3FDD8EF0401DB6D5EAE7847EF2F8A484D4CE330596491FF3EB8B1E59405648535027E99237AAF4881E02DED934E2E7774FE3F1DC9544000402A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 + +count = 21 +seed = 5A64401EF8E63AEE18E8CC0162845DC7AF388230E86728ECB330007F2546F949764273EA05B397FE71F567E1527FA445 +mlen = 726 +msg = F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 +pk = E919E85984B77AE2B8D378DF88C32D7CB24BA0F1263B8AD8CEF85DCA9B5C0EC2F1EF4BF562D1646A043D4FF711080EC2217BE409F1DED5AEA192ADF3AEA68E00CE26B0D4572026A1BD94632A149DFC7DA3774E641A624611086C3545635ABDE81468BCF30CA35D67C32E648C61B89C8AE5096C2FC83E7948908C7F3DED8EEF0004 +sk = E919E85984B77AE2B8D378DF88C32D7CB24BA0F1263B8AD8CEF85DCA9B5C0EC2F1EF4BF562D1646A043D4FF711080EC2217BE409F1DED5AEA192ADF3AEA68E00CE26B0D4572026A1BD94632A149DFC7DA3774E641A624611086C3545635ABDE81468BCF30CA35D67C32E648C61B89C8AE5096C2FC83E7948908C7F3DED8EEF00042789D71130AA1A9134C53DB7BE877333EF1C872797157254BD7FD36D5884A39F4A0400000000000000000000000000000000000000000000000000000000000014B4DD0C078B5EA7CAB54D0887A87E23E91A8FA7A16CD1FB981A48D8F5B0C964F7FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35234390D5615877400931F275B004A6B32FDF0251A19F35F94FD79A2019CFD253FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BC7C7B1B57EFA36E8EE6E16765186634974D629631F6C29CE359D700C38DC231F1FB614880E51A5C6D6E5830446A6A7036C5A7CFEBAFDF18ACF0F10682220095007C303AE4A2C59CA43F3A46B00A49DCDBCAB8E1B12BDA3818A4A8E2E9B46C8FED4C023D2BBBC500B7A1D12BABB5E08F0F64AC15E09AD21ED7CBE8584F08CD248CF52C0F2015AA188E1D7C8FA4140EB6BDEE225B97D351A40299DA5282AB89212631165409738885331987A201A660BFDF142E5D60ED5617AF544BA90EA68BFCC9387FE1498B6A3C68FB89DFF1CBBD3A0C5C04659392589BDE83CBE1D0CB5E3A923D8DDCAA81A40DF43B48F805F0622542EFC94E3D0A379C6D300706 +smlen = 1018 +sm = 9C3FD844212756BDB37325B1DD2A0A4202D6536B74929460663BAFE1E25BA8D0293D0933C24EDE8FDF34C5BDD00FA6B9512BABB7457E773DD93CEC876A588E008BD1A6195104DC90C24325D2A601038161FBDECC4F2C84CF70AD69F863D7B8CBEE5645488AC8079B61974979E9663539170B7783C2CB6C8D473BFD18AC230A010100FD449ADDAD4B8AB92E171103FF646DE9EAB548F410BB48FDF5E6CA494B34C601C64E4FC20690057368455A967995E1C472DD2097A42BBD88055AB01BD418141356C3F91EA82B3313CE577541EFDBEAC7579585BA479C231CDE5873B3DFF9C70CA5229C3D9369C2330845AD7BCF75809FECA87461AFF5B3254E232309BE88AC00621667E1898907C8C269ABBC05D83F440EC4162C1403B74FCB0C1D16547754001309F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 + +count = 22 +seed = 3222E4B55D6767E300FDE03DB3D8227E19FB8B08EA9B923FEDE18D699DC3694EFFA7C4DAE2AF57E4A0162B7C564199BD +mlen = 759 +msg = 4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D +pk = B44D634F81060844E8DBC94884151DAB4D77EF0C70854F57D528D982738F4B9999D71CDD636401E38DBBD5359CCC07E7697FB292562C00AF008F73945F06EF003A7A736E5CA12ACB6B38024FD3538FFA79B97B3B7031B17AF7CBF6F7FF5D880E2075518876B2D39C3D9E5812FD15E2B66ED70F39B48DF238AE516650D47BCE000A +sk = B44D634F81060844E8DBC94884151DAB4D77EF0C70854F57D528D982738F4B9999D71CDD636401E38DBBD5359CCC07E7697FB292562C00AF008F73945F06EF003A7A736E5CA12ACB6B38024FD3538FFA79B97B3B7031B17AF7CBF6F7FF5D880E2075518876B2D39C3D9E5812FD15E2B66ED70F39B48DF238AE516650D47BCE000A43133ADDE9BDB1830B6727CD5FC7C20A888DA2C74433C3AAEA0FDF1E95433F4161020000000000000000000000000000000000000000000000000000000000007AB6F9D5E07D7AB46CA1B9997658D21A4B4C3F7DA40D1F900FFD59E2F0EFE295FFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21EC2591D328EE6707861DC25BFD970863844556751A179A38B9CF2785299E027DFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007DAC40A9411E03BF83EB8245ACC64D8A7FD2BF1ACFE004D551BC6462F9AAC0BE85849717E8A45CDC711CFD6EF2C8C36D5D9B79B1B0CA118CE66EDEA5B2900E395F93C8C620F93B3400CD71FE22D01373F12107C977BB3A8620F32C59476C2070450E6EBD2AD6525A3D0CD1790F2A27B073407016F694B991E8E0A53B010618D1C8925EB8B14E75B3DE7CD7CA523C7B79E07DD749AD529B7D31F7275BE1F14A535F14F5911024ED8AC95560656320A7D4C53F281AF32742A57CE08C24018F1A4F32E68CFA0EB72A26FEBB273F91F6AA898861007291D112A68DCB350B8C76300038018F6F1DE88A87D798D6A28D7C317B60AA19F24754D504F5F3270F +smlen = 1051 +sm = 15C5AC7095F5B0F76D69D1247F790C1997C2C8A4071FA3F00FD035EF54BFF22C8BF1EFA2F7236D073CC9BC71FE7A4E38C22C4C862A0D19FFAE9DBFBD3369AF01C664ED971BE805C03A36E660EBFA22385EE28B943EA1255EFA67E3F3A24399A41A36CCCDA7B152680E5088D8339ECF063CE4C85B638E82C39B19B5B1C565D00001006E52A70FC530E1B91095C7F1602931A7DCD45E941A0C86097BA9267ED2B69F379B0DAFA548E31288FB76387768B58FE9FCBAEB2AC25578F037F9C2CF35B8A81B439A2B12550C7C1EA9960D9F2AC06E6AE6B4E986E0FD8347064A9A26705FA127D9E545C954B369E8C307790AEE5DE06DEEEBF30FCCC0F344C8284172403E872AB9876C22365BC8FC941BAA279DAFA368D7173632849401538D4E47AE7F810F0009024C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D + +count = 23 +seed = F41B3C6225245C06455272A6A073F363E5F19F09A0B146AFCDFC2B3B0EA64BAA3F90359F32B2D1017608B03064E90AB2 +mlen = 792 +msg = 72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF +pk = 7B9B0332AB99A71169356A89F779B1D91FABCB11E191F6D3EC9C8C614F8F37456CE06FCB7664624BE68179A4637D64E6639B8EDFAE67822865A9BD4207B73A01DB126C568C8EADB041D066BD4C55FE89D5CD5E55382A80C3E90C0A4BDE375A3DD3CCC0C40EE1EFA8E62696ABE39D9487B77A9BDAF49902D2CDA6E007970EF9000B +sk = 7B9B0332AB99A71169356A89F779B1D91FABCB11E191F6D3EC9C8C614F8F37456CE06FCB7664624BE68179A4637D64E6639B8EDFAE67822865A9BD4207B73A01DB126C568C8EADB041D066BD4C55FE89D5CD5E55382A80C3E90C0A4BDE375A3DD3CCC0C40EE1EFA8E62696ABE39D9487B77A9BDAF49902D2CDA6E007970EF9000B1D4B065134C7032607B936F432CEF38B16D6F294660F9D9802613B62C444502E51010000000000000000000000000000000000000000000000000000000000007AA9588BADB5C8670C0744B7B48D7B27ECEEB04F6B59D1FC71E6542FCB8ACA15DBFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF213638CAA2C82E4E49087B5B0B9F4AA82AF404E4E38B857ACD9B4462880CA87F60FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F9A497F550CE97559F667FAE7D8502BDA0CD222A19E9E215DFD4CFA6217A2CEEFAB909A0869710DD0514679F73C574D49E7AA5D6D6EC8A5C0577062626100D3E1A45181E1C0B13D53E298AF0B554DAE524F8F2A5A624576E9C1D552BB5D70FA1F5315C79FECF62075A77A63A4AA2C1955AAE40B14698C476B8B0A4F14C07F3B7EDC606836F6133976ADD64837A2FC94CA7D7070ACD6176CC68A552DB22252C84A5A2FE65B2F89206E302625F2486279AD7402809916EB1E8AC7FAFF50B3F2E3ADD39326FF8015834BED05E1AD939EA033DBB333213811ECD76A27C53040179A82DE5103251256959E516856217AAFFEB3501FCEA5F4DAA9FD6567405 +smlen = 1084 +sm = FF3CAEB1B8D988477657EF91CB9566550820C6D1F117DDC01A89FDCE6E0F61ADA9B5DC80AD8B850F776834657A90A2C402FC225614C4648AF6EABBDDBD3F8301C30DF28F5285A40CCD1D74EC92403A716F7E0D2121358B5474610807AF321358B1B9265F127890BDB4B16938C9BE697628304FC4B4A545E242946DBA401B0D0000008B2071733215C1F5B971D13070CA8DD9D7CC10F61F3FE427F3534F69AB387D2E6D9E47062DA40756A47AE952F0D0D9D0DA97E29F1C24D871AC32CB0A6FD40E0E360D10A6DFF20B9E7443A1F5CF8514C92CA60807983AB8C5FE9FBF7FEF496126F5BC8351F2A28775049357823A5AB50A9A139C656A95DC3E79F50872EB58EF7D5D1EF35F03899E3234ED81302969D23D8CD2E873DFF7D7CD01C19E40B4E00D00090B72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF + +count = 24 +seed = A08AD391E0FC57A83B74CA8CF44DB67F8178262ED9B20AA0163CDD8274AC2BE05F558B112B094244370C1AAAB75077E6 +mlen = 825 +msg = 209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E +pk = 9AA3CC10A1563FA21216E06AD2D8322872CCD5BCE50C7B9E9772956C7513DA7B1652258C631B3F1C0A0CD71E6585BDD21D104E829BCD5D5C89A7429E00E494014BB984CA4C0E5F40EEA0CFE5375FE4C907993EBED2905A1EEFDC940C14A88E01050FD3483E872624F3B2F104A42BF40CC7488EACE0DEF541DCF8246A303E460102 +sk = 9AA3CC10A1563FA21216E06AD2D8322872CCD5BCE50C7B9E9772956C7513DA7B1652258C631B3F1C0A0CD71E6585BDD21D104E829BCD5D5C89A7429E00E494014BB984CA4C0E5F40EEA0CFE5375FE4C907993EBED2905A1EEFDC940C14A88E01050FD3483E872624F3B2F104A42BF40CC7488EACE0DEF541DCF8246A303E4601028B2BB438ACD4A18C457DEC77CEE6A70A27CEB5AC7B62A9119E12932F8AAE9128AA000000000000000000000000000000000000000000000000000000000000008C8E4FB0273DEDEE8DC9229C7608F807D9B01C21C21B016E7FDCB6A827D1337961FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF514C505BB7120C349BC58DC952E6D8760FAB0A5C6BF2AB6C8C30B8E9D7070FD2CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009085F68A437DB6037B245BE1597F00215EAF941837CC28C53F7BE4F63F9A9BD2A409F3AEA831DD4FDA1E58ED2D766A6369A7B350D983F6BC3926D242F5E9056D3B0CA7414A135BAD06BBAA9148D8F21F02853BF96AF33AE5B81AAB2E47978633B1337DCD095035A0735D8955876BFD7913260B6A1071CBF162033D43BD0F3796573D4F5DEE69B288ABF5FA2BCAB94D8CB8D5011967C5BAE41AF0BA8EFBAFF1A5B75D332B7D49918E15509AA68389AE3D13E9AEB8D8A4ED12E4C51BFF08F392058375447122F3C9658B2316F3745AE4BA135B5BAB9CF933782B7922429A28EB02D1BF37EA18B84FF0BDBC5BEEA2249AE65967CA6D9BBF126CCA52B802 +smlen = 1117 +sm = 53D65EB344ABE5553853BA79377E25C54D005BB43FCAA82FA7D855E1282E2E13114CB0B784DBCC49ED12DCFC0ABAC73737FC059F0B3C5DE6F9AA19EBD5A53201FDB6C51252D7312D7063B85ECE83CD31697D141E9AAABA2CC3B3674E8978FB1EB6D1F332BC1A901D78AAE126AC6DD4776DD321E8D983132E25D4494CE370200000005D73513892E2AA76C677380A158BD721EEE7CB21B3635A0F346A1F66F82E45620267D259CA39341122C779B47C33AA3584220C4FC0590736C8AA82EFA21E057B7AED8CD3165F11A44F59334CE437BEBE5F237FB8A005D9A4EA47C47138B13576D34E2D0B262D976FA4A33AC12AB374153CC815375856A21E98DA66DDC067001463770F7581D3EAA653EA34F845AD60F16CC3F136CDB50B0A818D2E8FA67611000C13209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E + +count = 25 +seed = 6E0A8EF5156D693FD0140BC4A31084E79773A83F42C8D133AC8A9D62DE3CD74511F893DCB26041E6B35E2B175408FCE7 +mlen = 858 +msg = 8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A +pk = DF25ED8E92034135EB39820724927E35FF8642FAF77A5546566DF6D4CD8F2601D9E35E23BD4F32495A9CBA1E49C00DA12598631526DF11BBB6EEA73684563A01773CD2DCB363A25CF537D5346466F75D8FDA3B5A7D40DA84D0F30AA9EEDAF44CB70504B0A8C27AD7AD6B25F61A3B53FFA45C712BC6D2F338974F2012D831D80015 +sk = DF25ED8E92034135EB39820724927E35FF8642FAF77A5546566DF6D4CD8F2601D9E35E23BD4F32495A9CBA1E49C00DA12598631526DF11BBB6EEA73684563A01773CD2DCB363A25CF537D5346466F75D8FDA3B5A7D40DA84D0F30AA9EEDAF44CB70504B0A8C27AD7AD6B25F61A3B53FFA45C712BC6D2F338974F2012D831D80015D5B5D8CA276508ED19150DC4C37DD14C4BB5C46D70DEFF261C1C455F6C2065C532000000000000000000000000000000000000000000000000000000000000004A9278CB3A0FE511016812B373BEF5016F5DD974801196EAF91B723595B1B950A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3BE394C9B4E9691B8B2425588A6C579FD7A157664695F8B1585EC2034F9EF9F8F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EADE130F431B6562C4DE9634642DA7EDBF8DAAB1359AB5A8D2EEC3E9F8873F81BEC30084FF8C4941B88EF62D8AF183F9D0059E29BF7F7E7DE89BE1BEE25A0D4D05530D70D3D4116EA6F54CE7274A5301A81998E07DA21E471D5F60EAF1C28F77E8F85B5A5A0A3699F943646736E90A7BD772698293C270F3CD8A53D26802C9845D26683781A69B1CAA9041492C087A1B9A497DA5395F2CA5A98B62F4B784DD2B33016D5F7A8C57F36996A85EC8D07F5311CE66975F554CDEF4BB06C103B097E0023FEB364A9457D8F9B5FF60E12EDEFDB216CB6D60C738FDF01502D673C8106590AEF294A642C727DF9259C4563F54398185621C68C634CD1E105A07 +smlen = 1150 +sm = 80B7D189FAFCA68ED58EBC3D68A99437224A38D2A1483E96417912A51B696015678F2AA6B233C20ADA78670BE16036FE0E24BDAABF0E7C60335B38AA3844B300E32BC2672A5D90AFD6D3CEB8D858EF74C55133749E93B8C182C05F53E5AEF5AC4E389610C7C0D25FE40A77EC9706C9FB15209BBBD879E635CC0F43C84E7EAD0100002AC615954F34BB28C766EE05A97B869A40A995229B5EF0D3CC6E40F6EE867B402B2A416A49D31C71ED9E723BAB1D33C12A2F7261DF0C58CB440CBE8E407E102705C6DA0475CCC0A100B2391F45A3B8AA0C3E1087913B4A356B8584684A56EB1F45B7EBEE51AAC48260B8948F12C46282FC57787555D04B15A192D9BC8BF67252C99C05BEA641CF70D4AEACEF4F80CD8BE8E8DC084F0A3DA4AC8B9A0D6FD055000B048F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A + +count = 26 +seed = 49CC05312D1DBE216FF03B60575017A6A1464C06D2C5A4A6F973AD9F275F7C66163A29A803BE759B117043862D277C27 +mlen = 891 +msg = 30D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 +pk = 019782F99FF4626AA38764E7E5D45E2AB6DFC501FE8F80707093F7286CDD97B5D8A0C73DF2D0968993877241BBF16DCC4918877F006FE37E6707FD1F4A1D3300782A2B88C2ABD7F125BB6599F1056488300F40C4EAF2006E671C3834F11FC3F9F2DAAE620F907653D9B62741C6E5EA861A5A6E24EEA12300BA623AF60F979F0109 +sk = 019782F99FF4626AA38764E7E5D45E2AB6DFC501FE8F80707093F7286CDD97B5D8A0C73DF2D0968993877241BBF16DCC4918877F006FE37E6707FD1F4A1D3300782A2B88C2ABD7F125BB6599F1056488300F40C4EAF2006E671C3834F11FC3F9F2DAAE620F907653D9B62741C6E5EA861A5A6E24EEA12300BA623AF60F979F01096358D1F6CD09D3E25A90AF1F9CCC90F90D39D94A46B4DAFEE823F63B409FB534AC020000000000000000000000000000000000000000000000000000000000006EC51524830F464788A471A4058C4D6B1B0E1E766F6A26A935B0BB259F591E9AB8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF292BA13A46283F531318AE3569FC963488A638C8AE9F3034CA7DAD71607BE3ECC5FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002CD32FFF27A9A90DE28C5FF77C41B848C3512212B346365FB8F422FF6AFCD9195F947AFF7DB9891C4F8AEB597D48294C31C38F7A9724CE90960513462D48010FAC1B5A48F80C7CFE526A33AA5E2C1AED3ED9017F88444E6B908D49AF62FC869D896BCC3B14A3DB1E1EC68C04628B14D856E26264D86AD0D36EF4A1398800A90C24FC11EF7509BE5B966FEC72379DD5370832D0FEC4C64DB3766BF94A8567AC015BB50C158603F705E3EC7DE18A18944D2C1E6F890B0BA48FEDCCD106018AFD884984A862198FF12DAB6B24BB35F0740441C2D95B8F070A1A5905268904D492837E52304E5AACDFFB1612919F1657C807B82A32540C3ACF7FC574F502 +smlen = 1183 +sm = E38313D2E441D0CAF9A7329A1ED2F885B9BE7A0398CBFE3892AFF23800B97E59547DE079D4C135554C8BB20BD08D75C789E258FE077DC5A0EB75F35F5F5EDF00D407A253458F4A1DED8699D9B39ECCE8EDC0C3E7349BDB91F483D51F6AA15B427A13F2F40CC222C915FDD454D9E7CB58411ED4C56C35E7D12FE1D102AE0A7A00010101ED374168AD68FE38E68A228AF3F4E50231A2C987D897D3788A48FD4C3D160A6CC8FD0D2062B520DB6DA1737771D8CCCDEEE506F3B9A26E67EFD1AD13B13A278435E106DDF9AB8462D1369BCD027CE0E88B1402318A5E87C8D77D2629581C04B28C5FFB235676DB3E63EEE8950830CCFC5B2E79634D11F3842135930D9D94060B7B8D44AFF94243F3B187E31DA60E0CB777B51E52A76EDB4B3BD5E526D67B00040230D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 + +count = 27 +seed = C33EE43A9CBB4347BFAF71147B7FBDD88D212462CB06FBE695A35402C503CD15732B7D0E8BF829A555B9167BCFA2F2BF +mlen = 924 +msg = C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 +pk = D00401BFCE5070818161AAA1F82F8FD206316B543F0DE852395E8BB48E0A945CF0CCFBCDEFBD06257352538FDB42F5431C1534797F61C81C5531801E3F14280042CB25184B24E166AE913DE785E50D6613348BE4DB34EF8F158F926CCF08657827D78F0CA42D39940865E6C6326EF4EC11E4770DCDF76AE0C509C35B1B09930109 +sk = D00401BFCE5070818161AAA1F82F8FD206316B543F0DE852395E8BB48E0A945CF0CCFBCDEFBD06257352538FDB42F5431C1534797F61C81C5531801E3F14280042CB25184B24E166AE913DE785E50D6613348BE4DB34EF8F158F926CCF08657827D78F0CA42D39940865E6C6326EF4EC11E4770DCDF76AE0C509C35B1B09930109D91C8F4E3B6BC918C5C1DD13BDCA0F19C4B0C1590E481BCBC2271BC5EE0A3D2A1202000000000000000000000000000000000000000000000000000000000000B4718FEC6D93A6832D849EDEBFDE870D53EB847F2FD0707BE6BAE5B4AC461B069DFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB904B7BAA751619F295D8D63E3B02EF5B4498BE88B14E0AFBAA5D9F1D647BEC260FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006A92492D8F42AE5E463649BCCA9AD61A7FD7CF1A2B23D086DC962AE0C5939A802C4AAA70421ECCE33BE6B968506F30CC393CA8532ABA2E80E81F73007B2B01A1FA2A99CF1AA0BA9B299D6D64326B6F70D54C9C0D89C31ABA9AC7DFA3AF8D1DCCF95FC29CB85D5435C4D92686C1681CE17243E75953FB1A37AAE70E03FA0F41DFC9953EFD3FE61591076342A61D8BB8934690E18C5A6D2A8CE2F3901EF9FF427DDAE1772F28E12B9DC7496AEB4CEC920D0FCDE00DFD6155230939811205428E910651FD635E5A9E350024B4A4DDCBD7A9106149A255F75DC7D236AFC1EC8C1EF7B2F522E427870EAD1254EA701340C1A8358AA5BF24B08CE93EA24508 +smlen = 1216 +sm = F2C81A2F6E7A09EBBF7BAD95AFCA48FD03659E76F63D4943353BE59CD70AE64ACB2C60B4209F2A76B44510B0936F0779FE5BA12794127933302741E9DB415800A4123C8271DA4148D65D9CBD4E91FD453373D16A8032224336FFA482650528BDC07954EB7A4390E48BC26160DE11E7A6B5029E5D1DC2B7F7F2A57A7D34E9E70000015002E992281A6890F0BF5DDDEBE47D9B9D3E1EFFE388A947E85AFBA03D1C8F06E1051EA38F7EDFED42FCC04E7C9D5BAEE0747EED58EBB1B6AED90D416A9A484F56091E179EAE7774D73C72EAA1FA162956CB1CFCF82F7401FA876B701D89C03734DD8A7BDBC144C13100CF2D27DE274D3A9FBDCA46EDB2DC4F1AC57A67B2664B1828864B76C4CC3E2C9B34F7178181EB3FBE591907FAFF71297BAD97B03948000E04C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 + +count = 28 +seed = 19CB4BE2332F7FF0C078BC001FAB3C5FD8569A76EBCE373D1ED4FC8EB5D744C6464E2B5EECB9EE836CD5D87BEDA78BA7 +mlen = 957 +msg = 86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 +pk = 412A5D768787C17818FBBFD45BB494B6B36AC93D35C0A5465052D998A4735DE0FE5EE3C555E75D6D7A75E1910A92E0F89C9B1AD9DF8535A2DB52BD771D0D6F00BE317186AAD0A35207388D97C103D498CCA6A09898D86ABF3B545333CAEE1148AF13C209C1AE2FC9E47D43C820D2266351BED96D5569013F01D024D23D6BFC0002 +sk = 412A5D768787C17818FBBFD45BB494B6B36AC93D35C0A5465052D998A4735DE0FE5EE3C555E75D6D7A75E1910A92E0F89C9B1AD9DF8535A2DB52BD771D0D6F00BE317186AAD0A35207388D97C103D498CCA6A09898D86ABF3B545333CAEE1148AF13C209C1AE2FC9E47D43C820D2266351BED96D5569013F01D024D23D6BFC00022764B0A5CA1A6CC54EF5DAB62C05F084D2858D9A91775E12FACD4535D86CF3F55D010000000000000000000000000000000000000000000000000000000000009A91831DADF5CE503018EB1B71B8E63145A1E51484C66C81458352488D3204CCDBFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65107614493F1DB64C11B154F5DB691D638EABF5596881AD6C8567A2ACB2984E60FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E54B3381F133101C39400FC5AD705D82B75B635E07E344208ADC87E7017E5B1515C34D61E747BEAAD38798B3132BF6B144985B1C8C0FFE74D624F25F86B90ABC5075EEDC50044686ACD4937965CE055888855ADD769274E4DB1304BC09B012FE7F4BF545718A01291885E7616EBC1D6AEDBFDEACD6FCBDA2BC69B449FC06C8704976AABB15763362C788E28CF855695D556CC80911AF2302E3823976B3DAA49C1BDC6D63A50AADC88993DDD98FDC188719BB688052EF37286A198B4D0C79CF267FB42F03945448366D1C15BDC74F26078973E03CCD25432E3DDCD6ED7D7810CA98AE1EAB34090EEFD38954CCC5099B6D04D57276BC81564D26E7EA09 +smlen = 1249 +sm = A7BB35C97FE287DA3F77F9CA1129CF38EFEA7DB42CA3AC71030312333EED58DBD1B2BCF62D9B9E7B85150C5F8A3FB1C9951E4FC6CB0E3631884BAFD18ADB2200FEE9D271726A5805BCF7434A5A72F14B4BF3B070FFC5D5F4539FD676A963D9F6E4289B1452601E37D2FAB3349459E06FA1830193215EC87DBB40439122E51600000021394F7BBAE0A1D8A581CD5D85A2D1CCD33DA6014F8C21C3F920F4B43D3F4A03A705C9BF5C3BE59DE2A89DE777803BE05D1B115641309B61151A9CD3ED225B6DF2A5802D03A975864B9D7F17B344A6B8850768ABE6D3E1554BD55F998CA31C622BF32F0792C86E74CC7B107FFB5CAA446B6E0FFA2F850CF8D7920F63144464780935E96BBD84C018D70D0A88969AB0F5B5D0FA0675134F56270EAAAEA29D4600040986D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 + +count = 29 +seed = 6BD93FD13C0299B3EC7403638673F3DBC449F3A617B691DDF73C072B62BF028913375D7460BED2CF9FDCA517690CBAC3 +mlen = 990 +msg = 56ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED +pk = 092B93C367D3951C157B2556DEE1FD0DB7B62C4438DA6CEC5D95E9CD7EF747194A1BFB395357CEC4CCCC1CFDCC626461F79972C265398AF608F37A098BEF0800EB7638706A3B8A43D2580DBCF318695EA3BFCCF47DEB62B43576A25A992F5EE6DA414A3C75BF4752C7C1582019A114029D772CFE275AD1F5B398C60332F0350015 +sk = 092B93C367D3951C157B2556DEE1FD0DB7B62C4438DA6CEC5D95E9CD7EF747194A1BFB395357CEC4CCCC1CFDCC626461F79972C265398AF608F37A098BEF0800EB7638706A3B8A43D2580DBCF318695EA3BFCCF47DEB62B43576A25A992F5EE6DA414A3C75BF4752C7C1582019A114029D772CFE275AD1F5B398C60332F03500158796E970CD3AD6CD8ABCF3E73E3AC0374A8767E75E17DBA617BDE3A81A82DA7C2B0600000000000000000000000000000000000000000000000000000000000052F454A99F127B1BAB0AB8384ABEE83375BFE4638D2A6D8F6D401CFA28328FAFC4F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA38762C57DF728F1F5A9A603F068D40AF8155D12698C7406A09B782B4E405F7E45FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019B74ED5E65920EE2D8695D95EB69341A0842676A0F16FA9DE64F6EEC835055F513D0CAFF71E2102A51C79DA4EECD6DC57C6D1FCAE8FC87A168D200DAB4C0B2BA52D239B2067C6B0F69A991088FD4530F9E0C5D45EEA01911DCD4C0A54D235B84CA58CD566D28CFEBF07FEEC614CE5B43485F33A2CBDA46DA2946CF390026CB5B402D1D803B349E97AF61944B027E9B9E796B4225E8A65950F2D72B3B2607374216B1B4D5B0710112503AEF9B1919CE3532640A5728ACB71FE1ABB8D0C05FC5C38DF01D934A765F70E3FACF24DD5538BA217E6EC3E77D135020F92AF0CF5338A6C9E28A12E562694F5486399A6F47611D3892C196A4DEEE3822A4A0B +smlen = 1282 +sm = 6E3769E68A09B6B6543D93680A70C46FAE93FFBC60F1C89A56B3061ED521FA91578ACE01FDEE7846F36F9977FC95E85211B48816258D6D5832E16E5FAF1C5200BFB752ABDAB7D822512A35F58BE6F683B4935ACB74E3F02BDAABF9EDBE4161D821087989F1D71B8E855EDFF0E820A7BE8256D002CD095BB3B0B3F8CF641575000100353789166D71B947F5D5F6427809F79538DFCE6CC80470405C2A73917A62B529984727698B6A253EE66FAE2DFA9822D606AFA901A69DC424A0D07833395F903A9BC346140D9D0CBDC53C69EDFA82BCEE89CF0A9FE1A1D8E0F90D68EE703DF219A5942CA5676893F117B41FDF7E6AEA27B7F750AFA9FA4216A4493D2937E0E82522ABAA825C033D35D1970B41FC80511B935AE11C2163E2B3EDAB4CC0D1353400020956ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED + +count = 30 +seed = 1787C82DA9F2E6CA9ACF7D6CCA70116A1724902C81EDC1439F332C74807AF2BCCCCDC7AC1788BA798520B2999F39DC3B +mlen = 1023 +msg = E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 +pk = 00D06F88772EE4EF0991A51A79956AED02FA705D1CE35F468B921308CA5E849CFD5D6C41D06535C11E95C2E1A57054C7A6B4107B0F2F59E73206264D60375801AFBF1BBFFF9B87A2238567AED824A3EAA1CA80ED3CA792586148185418EAB43D4D969F9D06BF658D578120AB1BBC4FABD6A5BB66CC22EAFAD5CC036B5CA94B0002 +sk = 00D06F88772EE4EF0991A51A79956AED02FA705D1CE35F468B921308CA5E849CFD5D6C41D06535C11E95C2E1A57054C7A6B4107B0F2F59E73206264D60375801AFBF1BBFFF9B87A2238567AED824A3EAA1CA80ED3CA792586148185418EAB43D4D969F9D06BF658D578120AB1BBC4FABD6A5BB66CC22EAFAD5CC036B5CA94B0002B31EBE999ED6A5543FD1AD85519909239A5B8BE9FB9CDBF29C87A9C4876CC4C46200000000000000000000000000000000000000000000000000000000000000C8A3A0A7A53994069095F3295D0792BFFE81FFBAC701BB398B46EE26FEAEBA5A80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2302DD37CCA99919E72ED6625157EC4B436C105FF33AA496C2D6FDB7895F19CD42FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000478CBB837B310EAB26E0AC57D5BEAAE82DB91EC72DA90ECCAC05297376EF01BDC67283D4D142C3EFED6300FC196410358B0A640508236E9CA90DDA8A65C509DE66AF7C04025D64CD55C5D0744D35EC213FB007E3FC319B96EDD857FBE5EFA2E8874186A7E943F926FFFCB1E058022E3D72B93EE0C5AB753B9B735DF68B0FC8315F078A188227BD05B9D315CC1A880F1B7DE2F8FA06105FA8B23F616EAAA399FD161E1599CC024FDF5442D54229F48E9087D41C987FA3B570AE404B780CE549C49879282FB413EE6764BEC3159E64FCF38CD3F742265850856274BDC5A753401F5267D76DA2F989ED814663781D2460388A78E15280C2DF93FB199602 +smlen = 1315 +sm = 278E2E9DE655230F72345D7ED42C8EC75CDEB8CCDA647DF8B9896D068D36C1E92A4630AF0741F61DCC1B22C48AAFB2C6C0F5886CAD6799A026A5CA6B96376A011E00C63776E8714D434C0BA2E16222B34C844581B2889D3AD9FC2178FD5B03D82E67E38101BA6377630F4BC1BE201565F52D009603176DEE5DCCC10CD040E2000000C94D929E8D2CDC0823257E27935F0788FD3EA2169E09B144444BF33FCF6D7112FF5080AE706AF6A874EB81BFECFF5B8C3D50819241951D11F7B378EA89AC3832F380E722866FBD0771D6A4D28AC7105687F9A41CDC05C8CF8812F66A8C3E1B5536FEE2EE4C7E55A06BCE90BEAC735777003E307F62789A04CC9A9DECEBB920350D64BD27422FEB8921D19BA08F02BDF9C9A76BEC06A8A81D902E8866920827000202E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 + +count = 31 +seed = 9E6E12F025B2A57B0F5A3A9FA70396FC332E1802608E5CA07CC4FBA922F1FE5DEA6721B96F1BA2BFB97825A19F08FF2F +mlen = 1056 +msg = 9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC +pk = 9013F2D352783AAB8DCE6BD56395DEF4052C64AD4E1C83609241C500DE3110AC1C7B08F38B64146DE8A7922B0D41862B18663A294A74B2442C33E463A94ED1005FDBB566D930D7D1E6D0270314F31C0B36B7604CDD644803D41F9EB3832EF97238A8AD204254B6B43B627D9988D27FBAD4CFEAD35092CF49425DD813EF00020004 +sk = 9013F2D352783AAB8DCE6BD56395DEF4052C64AD4E1C83609241C500DE3110AC1C7B08F38B64146DE8A7922B0D41862B18663A294A74B2442C33E463A94ED1005FDBB566D930D7D1E6D0270314F31C0B36B7604CDD644803D41F9EB3832EF97238A8AD204254B6B43B627D9988D27FBAD4CFEAD35092CF49425DD813EF000200043B8CFDDEA8CC73EAA4A6288B694C8209DEF6B564AC52550F4089A3EA7A2E10C10B00000000000000000000000000000000000000000000000000000000000000801E21B38519F5146948B1ABAB1E816B759E6E5C9AF6615D999CB74848B5F6A4F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F5BCB5024BE41FBBF88A53D6E8DB22C46A80FD4C526F6A3F65F424D16DCE7D3F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CD539177E5FAEE10C979741016EDD8CBF9F0715F447B7365BF9EBA70F0F8CAF2881E813DC66D3855EF3DC1F649A65F8A5CC8D2E1A151678035BA5EFA596404748E703965C6EE446005532EEF4FF99D41211885E9484E59035C167ECC2754D0F92650B0BC3C921010C9A02FBAF5B8B63D1DAF53D742D0CFC1919687B0F2061EC5EEE179E79D21899C1CE930FE088B2317573F199A9B7AAE35E05CC936C494D7DA8D4E264A9C4FF19A683ACA40807DAE15EF4D57D68B118286C75C1C25035165F8FFECE8858E6816F6C1E5589FE3882D289CB4B92D683593D9E9831D9CAB7C125DFC83E5BACD156BCDA424B251B97D4FA08AE48E4E3DD165FDFC245A03 +smlen = 1348 +sm = 433FD9232252BF6B6F011FA41AA6BA99B57B331ECCF8B1FEF7B0465A0BBF799DDB200370F292806D6953D30D16AF88BB70053BC63CC23FD02DC854C57374AF00A44DD70B01CF3822415163A4204F3138445ADE6E4303E2C66E64C265E1C0FCB609F6D73E558376D19430C197EF5A3959D111B3C5E4527534A320176EA2428C000100F24B00DD4CEE43F64E3FDBBE6F39C6F9E8E042493CE6BFE5B015CD4BBA955D23BFED56D8615481856A8F030E4D8917FCC68F4CC3105121C8EAFADF869A3980156FE76651F1187A938DEC6E10B72B06E5C4493A193405FA295F25FF5858B26A0435396C5202E0C5C07D71FC2DC5C3AC6CEF5F46A184AFDF9A80B5323380C62B16AEE94ECD036E4880EAA81E16E539F7C4AA148423BDF547F07409FB5AB463170004129C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC + +count = 32 +seed = 569B8B9BDB707B19CD6F9BEB29F304D603C1509B9CF25987C280C342E870B1E13EFC7DD7E41DC85BF4F42D0493B84B0F +mlen = 1089 +msg = 7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 +pk = 87A04FA8EA83535EC7025807B20A787D05541297EC0F679A3B99675DE40B78BAE25662725BAE9D6BA1DA2B20ECDEC8EAFB25CB19BF6F668D228840A7F99A5F0020B2408347535299316AAE82D33A745BEB464F7745D15459E300E00B0FD6C7425042856EA87B5DD61597EB97E6A4C22E6D36D32A7CF0E2256FBE0ACE7085860009 +sk = 87A04FA8EA83535EC7025807B20A787D05541297EC0F679A3B99675DE40B78BAE25662725BAE9D6BA1DA2B20ECDEC8EAFB25CB19BF6F668D228840A7F99A5F0020B2408347535299316AAE82D33A745BEB464F7745D15459E300E00B0FD6C7425042856EA87B5DD61597EB97E6A4C22E6D36D32A7CF0E2256FBE0ACE7085860009911EFBE96C4B751A97336F20F5E75942F01D85E1A3BE905915C6E684151B8BD16F00000000000000000000000000000000000000000000000000000000000000E4516FA51D85B1D3D319B86BE7AF32A387F1EF5ECB3E7C43834B8B6D3A80ECC07FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1351C6082880CD2FAE3ED576CE33E7D259715309271466877DC7219610B2781CF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FB77116199C5CBD136A72DD0FFCA8E2CA632EE3F3AB165086A7480BDB1FECF22E64B4BF53B5296FB167AFE7292118365EBD2841A36F71110E77E1B85ED4B0820EEEA9DF3FEE656D55FBB55C0DB7714A79E1758A0B702D9235F35D55C758BE6E5F0C4B50082CEC0387B20382C2B319E5303FB193C235951CFF13B608FD90A9B2DEDFCBD2B7B154438D20574231EF915A3CBDBA45E631E6453A9CDB2E721F6221E7DE4FBF1DC34078CE0D933D5ED31179176D446596793EEFBA38F0D41056F74EB9E3A9A8390FB0D67BA5973E929B18057071F6965AC48D7175F7519EE0CCF187B4454D26D8F98268EB3D71B34F7EFE983AE8D85819863DF7DE107EA03 +smlen = 1381 +sm = B456CAE354A392DBD8BDA1EB0F1EA2262E3403815ECFC7F497632B49174F0387FB2B273D5F63A88106E2511728D6BE006EDBE94ED3677ED170037FC1E8AD70011482EEFAA888E3C63FF8F661A3A1F33DF572499BF120140CC21BACA72AB78F76B5F0E8A59E113F163E9C7E094332F5FC574C92D15F6401BAA6FA667BFC792200000217A1D3292F81E1355A339160E460746E74C9638EF457A943313FE7C72507FB7F43F676DC33C1F97357CFCE100641C1440D50C852278EB7C22802EB3DEFBB984F1FB524ED88CAC53BCA04041D4D4AACF615E0547A2F969C05DA9B8928A2B3BA4EC7C60C720948C48588A9B34889279D9B8B57C7BA5611FF9A057FA0B76A82743BD9F7AC44496B289ECEECE8EFB599CF7772CC29E05F2DBE304C448FA2F6BF6A0011047FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 + +count = 33 +seed = F32C3715B0BA8C1D0BD59F0645E9697DFCF9AEAF761A71ECDF9672215B9F138C0502D7214F6B1BB4D6612432F9FBED5E +mlen = 1122 +msg = 789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F +pk = A8E8358C8F5D03986CB92B7060BB52B726534BC3E5193D5F85C87FC77A29D3D0A606C8D624255FE24EDE7179D7EE6B72207E7997AD7540C4A83FFA4B9CDC9A0078B3B310B1E8D3F8924D01E55CD99AA3FE9516490EAF0584E76BDA9A312D7C68B63433A9D7009704329F3408631FE04A83C7FBF3D8A010D7B70D36173763910009 +sk = A8E8358C8F5D03986CB92B7060BB52B726534BC3E5193D5F85C87FC77A29D3D0A606C8D624255FE24EDE7179D7EE6B72207E7997AD7540C4A83FFA4B9CDC9A0078B3B310B1E8D3F8924D01E55CD99AA3FE9516490EAF0584E76BDA9A312D7C68B63433A9D7009704329F3408631FE04A83C7FBF3D8A010D7B70D36173763910009C121123997D574BE652FE1D72EE4F6C8A63F7124B543C1E8A303C0F27702F6379B00000000000000000000000000000000000000000000000000000000000000181CEAA7EE77B39250E7865C8F08C6B0825FBC70DB82373583AA3D908032355C23FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB813F2E9D06EB2193939922DD1147B98DFC60772B5904E74A6876095BD7810CE4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003770AE99B84A2498BE9B6D09F67A17EEDD2D9E00FA2DDBD85013B02C04BEC62E4DA080AACD69438CEB609983D1BDC2B23C6E9E5D74D96AEA914FD2EF45010130C77F13A69DA02ED89573DCFFBA0CE5FB8CA9C6D3ECFE1103C0A5B11F85A496DC94B95D40200C6CC66E4D0A4B6AAEB818A7FF9ACCBB4D07DBA30C3D5EA801D406ABDC81C7213A77C1DDD639075AB20EB3A0F3C1721F96B61CF5AA4092348DB55E97544C4CABA3CE1BC4B0B7988098D6C77D93B758FBA8E19652AC331509D1E81C58C0D6AD821AE8E99937AC5B3239EB67FA66E836633C587A04CDFA5FE5D8FE664DA777F628B3492FD446E2B2DA19F00DD378F440D2F36BFB2A53A104 +smlen = 1414 +sm = 8C49D802493750DADEBBBC7D2B3E874D52B03D088A94E09C5998CAF2687441CABE2247464A337E5B93AF7C2A8EFD7F93371BB0F098653318616A113D3D4BC900533D873882AA5F360FDAE86BB607B1A8E7931A70890967F4AAF7B4EA549B5B5DC05D8C3A4EA234A2EDC43FBB827D36EB66965CD6EBBBE762026625695ADC71010301DAD90A05F1E6B132341A5E8C1085BAA9DBB0E41DD6D1C083ED1F87FA1EFED20E35637B6DE462A2AA96595C48CFFB7E8FF1D6C2F64F135E4548B580885133FA0614F150F7863432CD80DDC7EE057D4AAEC437B1A627779084EFB69D0AF13ADA01F7C3DB6A89884956752AF68434BF032C9D7F3ECFDEB0FD5824DCC055A486CF04EE22AA77919644225FD6F6EA3DF2441774B8E9AE2CC76F9B86076A9C1FAE70000602789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F + +count = 34 +seed = B0C7530A52AC9F561C2C14548D3A5F5053396B738EA1C7A5190F5AB01C9C38719C4DBE856E42D37A114FA24FD5DF5081 +mlen = 1155 +msg = A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B +pk = 2E02AFD2BAF5B6011A970220D1C54071E99FBEF8CBEDA2829161A8CE901FFF61B0E71E9A2F8F15633AA0BD8EE28689D534E45767760D474F3B49D01A3717270003FAD49066B345F90673A71ACBD2D4F4706A308C2E78418875A3A6AC25C2922C078311CE7DD2435A30966CDA2ADD991C7612D093DBAC7DADEB6CCD8404C9580102 +sk = 2E02AFD2BAF5B6011A970220D1C54071E99FBEF8CBEDA2829161A8CE901FFF61B0E71E9A2F8F15633AA0BD8EE28689D534E45767760D474F3B49D01A3717270003FAD49066B345F90673A71ACBD2D4F4706A308C2E78418875A3A6AC25C2922C078311CE7DD2435A30966CDA2ADD991C7612D093DBAC7DADEB6CCD8404C95801026F416374BDB2F5431737DB422B7721374F6257156BB17197DBF70FE155B26738A701000000000000000000000000000000000000000000000000000000000000D4FB951310E31E1E76E27A764581D9BB459B8C2639B7F2F32D579A4B8723425B91FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01701FB6A5AB87161A077F4077512EBB704038751765D10FB2247DBDD564B7EFC1FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008144FC459473E4463BDC9C194D8055193E1FF1AC3567EF8AFE8E1E4755CC4ACF4BEF216B5C5D812FFBA69408379EF425DEB2F08951537A96459C93781C8706A3E8CE34233D3FCCE2D34FA277561C27F99D153625077CB07A8722A9806C8346D061B5B767A7D869F223DDAC8ED702C0BED5F7CEFD4EF4E852D0741CF9C902299B643026DAA59F607F5DCBE760227A816814815BE31347A7B5EF38A847599AC2EE5D0F087F078CA91A1D79A96EDAC77606E83221B89012F6B7B9760CD40426C7AC114D5F42BDE1B3CB8DC62308DFED269B0175CD720DB4FE371496C13C3B64DDDFDF5BC9A4FBE6857CA37C6C55D3632E999984F0B6C6069ED69ED0CD0C +smlen = 1447 +sm = ACDB7D6F1EDB93B1669F508EEF97F07725BAA963E4E51FB03BB0F91045B6F286F4DF7BCF80640DDED255E40691632D5E5620225AB8F0E20728AE5A5B1D1B7800F5E30187FD12268EE68C68CB19D0DB7DFAA0B62387A8878A2D22CB7F4477B5E8BF23757FF5E4FE3F07DC0EED1A1E2D2634879F875AC402D31FC739CFF0E13101000265A08CB4BBEB5F6E76D6AEFD860510E50B0352E6BBDB3216956E9AC785291905770E41A46A2E4F79B667738A5BE3680F7DB0A320322CA67160DC0F27F5D2AF5EA25D24EDE374553B4E403F746397BFB26D8FE94DC9F45E1881FE8492CBCC7376629B33A08AC8AC7A29B35582637F3831E3F7C897152D0B4BC93A91B48F74EF4C4A62A23BBB2E16D900CBF6F0AA290BE650B50F48DBE3F31A6BB77CCCF02F60000909A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B + +count = 35 +seed = B2FD7BFAAFB667C9DABE5915C3BC271EF41F18588666A6F4990C09D098E62DB590110DF6A56F08C5E0DE65B00F91D60F +mlen = 1188 +msg = E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED +pk = 4FFB7D9A9E056D4948C4DFB41F92204A85AD92BF21211EC68404CA8045CADB364F786A47BC567599EE7AE27EE69D1018D080CC18CB5F0D7FF3D994308BDB3101FCB3638320001125ADB94F9AA12672B88378E82ABB1CE483C6F1ACD482FA06F79D8861D56B0236B8DA19E6B94C73A3CF81D3A8D9DF28CEE6A2352E476A2B910109 +sk = 4FFB7D9A9E056D4948C4DFB41F92204A85AD92BF21211EC68404CA8045CADB364F786A47BC567599EE7AE27EE69D1018D080CC18CB5F0D7FF3D994308BDB3101FCB3638320001125ADB94F9AA12672B88378E82ABB1CE483C6F1ACD482FA06F79D8861D56B0236B8DA19E6B94C73A3CF81D3A8D9DF28CEE6A2352E476A2B910109C3CAE5133CE68F3DC5426501EAC2B35DD17A11F3B4695E4DC994A2D15FD2B4178C0200000000000000000000000000000000000000000000000000000000000046F972E3127304CA7E910166C8C279231460BD47E0502741C81B79862DCC8889AAFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC559D55E0ED471D08DC65FC6A542696AC9FF02478BFD72051F86843703D830FAE9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CBCE4D6CCAF9DC0CA7CA7EFB34E613471B3B4E0E27FEAF81FE19B3772B884E73E6A81EAF6377161AA6553D9AF3C3C9F010BCEC6D6E7A9E71B9267B3A296B0240B199277FC6BAEE4293A68F133D1F68D9C5EC09B8A7426CF4DCF9C18FD08F6C2AFA18C1E0A7AAD7ADF39B7F868B7097181547F18A93F589B5E3E33C9C170BA2DF827B4BDB828860F537E19D526325A9718F331E25CCD201BBC1C06900B1C66B55AEDA889919253FC382E919D3C0978E8D532E458FB37AB596F41F8C7E0B27BB33136931223AFD995FA0DE0D38124693B960E0FAD95154B33F6069F2049EB424F3F31F6B7FCA17B3E95020EE16DD74C1E9A0B6F1A48DDB878E12C6E109 +smlen = 1480 +sm = 5414DE966211736EA3E5F077787F1A1FC3DBB94067BCD832894198C359B272285DCDE9E9EC86AF1D45C3A4EE1E0DEDF2FC7DF3837EF783085884EAF2959CD80061B690D044E002A0AD2FE5EEDF20755046518B965C19D87D475112330278D5732D9300B6793F2F31F0451E8DBFF3F2B55F7226E5FEFFBBA4C48CED7BEA10AF01000003CF40B690950971018FB623022C5D13E1E83993300FDFAA797ACE9C42B39C609A94091F586D8EBFB5096166E5637968457DA829C2A793AE2D2915F734653E7F3BC3AFA7145CED075126A8442E8375058B3294900F7D53D87A034D61A5FD66086108E8F2EDC280B2F74C9F47E5FC0B9183C3B509EDF3D9EEF99BE795176FDD7859D049C320F7D4DDC5442DABEB884FEC11747E0AC5422A26222CC5D8A74F01000206E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED + +count = 36 +seed = C08E846A8E039C8655651919A8433D475F494899FB617DC3B4715DEF0C992C195CE38158B7FF40E0684B30FD7E623265 +mlen = 1221 +msg = 743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 +pk = CF712E8F8C03922DDBB9A1069A6FF9131DD014BF96978FECB02AB09309C08ECA9101525FCA048CB5C8743480762742F8684CAEFB1AC3D1BCAF2873C30A7A87016A62C3DC1D0C80961087E734B5C90631DB17AA6D43450D79B2FA2D25DB30582CD5E125467068C572B07A494647824DD90270CBA1CB0D186B7177001668260D0102 +sk = CF712E8F8C03922DDBB9A1069A6FF9131DD014BF96978FECB02AB09309C08ECA9101525FCA048CB5C8743480762742F8684CAEFB1AC3D1BCAF2873C30A7A87016A62C3DC1D0C80961087E734B5C90631DB17AA6D43450D79B2FA2D25DB30582CD5E125467068C572B07A494647824DD90270CBA1CB0D186B7177001668260D0102B1D6E3A7733C9606E1ECB80C21D1FE844C3B3E99EFF21D72EBB5D0F666834F36DB0100000000000000000000000000000000000000000000000000000000000060E7E466E07A51EFE5B90F065D6B969C3B84420383D0D9457E0D7F43D0BB41275AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95D7B8E010682C0F0C148AE580F9F9F4E5ED3CAEE23B8E623B4DE46826853FD437FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009045112674771F3819264F77EEFCD5F2196911C8D2180113E5582172B61179ADF2CFDD0BF7508C22D5B5227F46F8AA3C8DE10D484A4E578B9F7B4744864D07DF0236F894ACD57BD9A45FD537A16BEDB213EC0C579E739E269EC82B707E25FA9B2F97E63E189CC4137557B7D2378D22EBD935B8627D805FCC52CF24F957034D579DC846F9453BECDCA8C7780DD14567406F6A30DB4EF2EEFF315D8A1A1D938F5603EA476912745C49718EB7B4EB03E47251B92625F4526F5460FB69440D61F82FAFEAA02C0C87D18E4B32962D34014D1D77F9AA21286273C2FE435003EC8AEE9EB7990EE8794CCB1139B6647C143D1A6DA125373DAB4689266315420C +smlen = 1513 +sm = D879DD4E42AE544212DB45AF385EFD0CECA9304AAC4E2656C535694973C212EAC00575B45B052CDA1E8D04FBB80A65A8C4E02AD802E08E3854D2C3024B05720167C5260C32C6684B078739475F020439FDB9EB13D581670CF0CE53D103F162EE86C02B62C54BD6B3B198F599028EC19653F9FBA864D59AC8F76EB7C73E4A460100021E534EC585119AE6C37472B7D8E6000A77A40E49E75ABD20B225DCF02B03363367CFA2425603065ACBE7795892E07A7A3C3BEF8890A8811ACF4B77C7C4ECF3159AF5D0BD62ECAA8722B27FEC282CBC2D3C128FD52402AB7F79990881A2D1E3118BC94A38764EEDBBDD73C8D57CCF513DC472EEE72B91B95901FCB08E00239C7F397534E7BB3340FDF38CD5B63BD2B910B06B5E523ECBBF6B8182995C2BF815000209743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 + +count = 37 +seed = 1D9C060EA0408A068BD982D9694D39D02BA5A473378F6F9F09349F686566F331E767263FAFF5DC0E823BB6F648843876 +mlen = 1254 +msg = 3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 +pk = F0528B218684756DFA0D9560D6FEC752EC4099C57ABA09ACAE104FCE5853CE88B75280F166261F74987C2F459066AC66835D0B0605E5D2852EE7BF2F745117012A74DCDC79745207354B2BC4F170539FA7F6D4530A869BAC0A9447A48FEF293497CB2FF2EFA80A983BA814BC359A3477BCC8AE8F61320018854073CED39E4B000B +sk = F0528B218684756DFA0D9560D6FEC752EC4099C57ABA09ACAE104FCE5853CE88B75280F166261F74987C2F459066AC66835D0B0605E5D2852EE7BF2F745117012A74DCDC79745207354B2BC4F170539FA7F6D4530A869BAC0A9447A48FEF293497CB2FF2EFA80A983BA814BC359A3477BCC8AE8F61320018854073CED39E4B000BB93D4F0C8DA02E9A0DD6FBDAF2D9A6D15EB57C4BA12591F228ACA5B0F09FA4EC7300000000000000000000000000000000000000000000000000000000000000E877AC031A911D4CEFA666FB9D998A80BB0DE6F7E5FDF995B940CA772EE7415763FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FF92A694531FE2F23E0E70ABB85480407405B9248DCC6A7F2646D5EA798EFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E91609D6F9B8ADF252D7C1771B97F5777545002501A0AD57364B3A02681D7181E3BAFBEAFB18B870CF71ED70B0111AA18C8C2D91AD6ED8E905CE4F6F3880DBF27B341FF35478B20478EABE1B78F345D0C66D6C9CE9CAD74024F71653346FCB1185701A51F7F8B34267CAEEEC76C7AB5264984E19FC890600A9B1013C8094989263514009B6B63DF5AAF211589DCE6A3B7DDF8B4BFB09504C01B08AC9F1D1E82D58B8ECCEAC765B5FCDB98D97A5729ABAC5462E8712155AFE8EF6A2C0BB82C17C386CA4A0C4E407F710A4A040475EAC30BDF86F6900F7A0FC4D2E255E3A15FE45DE15660104C31CFF00798B3234BA55DB7AE9814FDD0E6D2B6A50400 +smlen = 1546 +sm = FACF9BB50732D738F7711089A5BD371E258793588225D84828E55BD73ADD360D1DA0BA6DBA6418A7E25E91198282B44D7BAAE9B9A163B2BE6C50AC6A06618C00F91D58865C3873AE5EBB99F988D06F81212E6ED93288A9A9890F01942A282B871E9CBD6B362238CE26CAF095A2006F34971D81DB9A2DE6F535458DB1147344000000E2BD24B8D7C1F87135C2991432897053A4B5E0CE7A8E7AE0DC717C8945BD5A1C993DC265E3E850C2A598CC91DE0CD353AE014DCB196407DF9366AB59F1F3577E4D4444C9BE88B30FAD5BD9455E22B6280122E9C0E14DC1A8D4A22F779822F65B6992EEC999D5C1EAE7B1C2F1253FD39A7A97790BD7AF346B04F5CE5F4A974B4D002B036334B4309A293865155176DABBC4E31566BF45F7BC0721F07E0048690006043382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 + +count = 38 +seed = A4563D09AD21D3916BF4636301F2E64183A8F003DA186753D7F2DC3BE0089BA09C62B8A52B72C2C8451213606801FB29 +mlen = 1287 +msg = 67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 +pk = E45066A7E0AA9D23E3D98AEB91CA678AC3C6B84547A117C61CA31A96F68A4FFFCF2295DA06DDEB69FB051EF59C787060367E36F76E5CE56BCA4E86B6BD10600009673D888A160F0AAEDC3BD49325C03039A638180E342C8F3B150DF5C7F40B8DC68E1567295173BEE2DDBA5EF5D8A556336DC39A4BE4B4CD4834DFDEFA9EDF0004 +sk = E45066A7E0AA9D23E3D98AEB91CA678AC3C6B84547A117C61CA31A96F68A4FFFCF2295DA06DDEB69FB051EF59C787060367E36F76E5CE56BCA4E86B6BD10600009673D888A160F0AAEDC3BD49325C03039A638180E342C8F3B150DF5C7F40B8DC68E1567295173BEE2DDBA5EF5D8A556336DC39A4BE4B4CD4834DFDEFA9EDF0004B1CCA63159B5DD2C607C16361945F8D35F14815D7288EB63C390AEA2675C67F0DB0000000000000000000000000000000000000000000000000000000000000036C2D27F828C16C6DD065982B4D4BBA9553D08B38D57C16EFD3F89BA2A9427B667FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD192FAE9DE547BF8230474B0756819C25DA08A56AE621526676151AEE7BA332131FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BF8F95D0FFA7DA2F2967388E2AC6BD4DDCA6CE56F2541694E021E9F0F577E6B4FEB6D5DBBB23AE24F630438AB1D97D25E3814AB2824B8264AB15F0781ED008F5B68E74B0428BD465793A54125F4AB80AB8C58364DB1C7CBA9F9EA684490E0DD06EDA82891F2FD202802B5A033314CC6220B9C360461BE47B66B5010BB00196B2C71DE4DAEE1DDABBD73033A01B285DD96AAAF2F6D183C05BC31CF4446B905D1895AE2AAE2A26F294B900A0EB198CD4E4BD9A07D027FF49151FF7E89F076DBEF5478E16DE2909FA83E0E2937FFCA3BB37D1C5689D85EEEF684D98805014956AB142C99597B7D5F002BAEBF73A23B418E6B6B426F609005F7B8C174309 +smlen = 1579 +sm = 0560127D6367E5B3E6A75B78A94B66C1D92181CC6FBAB36DFF8A4BCCDA34D693B2F69FD3D40DDA0621CA6FF4694519F2845C484D316AFFC80FFB9E57C3C60100DF855E1C69888E39CBA31CB19DA54AE7006A1ADA5D99A9C786CC93F94E69B640DF8ABC63A4FC1031F77D7E39D1CCDD94FD2041EB278C783EC60C5C3AED836A01000044ECCF7218C773D6B4EE26FDC36D15FAE61C3D549F613B13E044A169C459484413FF5CF62A4F1DED2050F1A3FBF2D5E0F2C1BE22FF1C348E514CEC1FD6F1D116691BFB74EC70F851BEB0FBA6EAB5CF17C215AB90701CB2B2CFF0694B58354977DC9B960CA8C3084410F9391E4946392FC06C5B84043A1510248D47D4C5F5B96F74E1A401BC9A986D99A6E036AEF6244F705492FA44ECB08D210406D2FBE85200021367109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 + +count = 39 +seed = 811A8A2ED2917CC616FAF246C5F9BB902E5FBF5430AB078AD6CE871CF8C160512A748216EFAB3A4CE1271AAFEA12C11B +mlen = 1320 +msg = 061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 +pk = 0747079E19F3243AD728E7EB3E98960F5E7A4207C9F5C6B14878317D7380A53C1B8ACCD97DF15751D06C9CD83C61F8A60FE42E8A983EAACB08DFE36BEBC253010B1420E5DF5889C374B665D1C22B124A6EABC63747F45AAB355205DD2C6AC2CCA084C12D5D29471D81F5D56BAF6846896DE858720AECCFE76A8C6EFB4DD2BE0015 +sk = 0747079E19F3243AD728E7EB3E98960F5E7A4207C9F5C6B14878317D7380A53C1B8ACCD97DF15751D06C9CD83C61F8A60FE42E8A983EAACB08DFE36BEBC253010B1420E5DF5889C374B665D1C22B124A6EABC63747F45AAB355205DD2C6AC2CCA084C12D5D29471D81F5D56BAF6846896DE858720AECCFE76A8C6EFB4DD2BE0015D31CAFFE50264BA4AAE4B30091524A212371EA7AFC81303D2ABF7D6597153FEAA90100000000000000000000000000000000000000000000000000000000000086F5E290C60E8A55DBDE7BC4F445690A04304DF5F8838120B36550061257CDE78DFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3D37E5C5517E58F70926701F01DBB693A6BC0DFB0770B7DF79445FECD6ED63C4EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056E192790CEE9D8217341A7D3449BBD499C997CDABCD677D48B95CD13141351637B04F7B9304ECC81E3E6AC149241C754304A5425C254AA79346E30505320747D33293D0745765105F72928262244B17BD3D85FBC30050510F6DE60F234AD180B132AA38F21C726151789F3E17C902F413D8E1194266ED73C4BD7F955207233037E984507EA27EF813A98305251FB4736CAA1146269D37D2411511280EEF8955AC16CE0E0C267727D7CE445C8B293F4D38E2E9E7114A36A575014F320BCFFF8E555501222F0804B935B86BADC125388FEA21C7181574646A3B423BE0934F1B31BE4D202C98C5CD1C5953A0942E116A586252583B32FD7A3CA46FA30A +smlen = 1612 +sm = 10E2848C718B91F08EC780396467ECBBEA51C87DF3439E64E49B91604019BE21E7E9FA3A087D1F19EA8576EA001F9B4308967F0F3EF88C54964C9437F36BE9007F648D9BAE8D04128C57FA997D9A3FE14DD8214881BC024F5C2BCC7489FDB6314044A48A8EA8E41666B45A90A766664D7FE9E01D5BF46BF39982EA1D53C6BC000000710B3113F2B24C3257467F441B7C5EE11D49210B36B3855068187045247C9C4C447388371818B836B763C8E348FB4776067CCC73F7ED5D78035005B39510F74DF50ADC7466ACED3072159E510A4E1EFAD6B0F0845D7D989FB8E85CF2C01046460FFD2925A9E4563CA182947C26F706DB16D998C28A9C23FAA0CF7DDEFDE419212AE12D4BD146D41B00C4F7A1BE2D706F277F0AF9D4D92AABEDCF4A603BD570000B0B061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 + +count = 40 +seed = 41CC9DB2E90239AB5158A2628E7478D0B3512FDF84CD27A4CA5FE3119A455C22045F198C3C5C39F491FB975BD1CFF7F8 +mlen = 1353 +msg = AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 +pk = E02DFEC5974412309FEFB75A520A2B583DA96D550719396AA7A699FB87AB7EAAB2716B134DDDE77934977990774AA24D614D7E18403F78FD4FD56DE67BF50F00FA21337F8F263D0108B9C1F1095DF58DE8CB8BD754A11901FF0E5A2EB4387A2D98BE0358252E7FF1A404DBC387D78187C563E007E5A0D488D56FC00B5CE9160004 +sk = E02DFEC5974412309FEFB75A520A2B583DA96D550719396AA7A699FB87AB7EAAB2716B134DDDE77934977990774AA24D614D7E18403F78FD4FD56DE67BF50F00FA21337F8F263D0108B9C1F1095DF58DE8CB8BD754A11901FF0E5A2EB4387A2D98BE0358252E7FF1A404DBC387D78187C563E007E5A0D488D56FC00B5CE9160004A3D16789F8055CC8EF43903862419A86A5665A5D9F28A9B9E8E97B737CE010E3E800000000000000000000000000000000000000000000000000000000000000060A496A3BDC280922EF44F311340303AA190BF369BCF5CFA205BC20052822FC66FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19FA242EEEEF5223038C95759A82D8EB4556021A0C6730F0DDF26859CC340E364DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BBBCCB8171A3CE2CAA21D72C78DD91C93491CE8B002780051C4CF30175D4AFE85348ACBF342F8ADDB259C116F7EE0E7C86B1B66404ADF626A7340B6C3DE0DE98E374DFDA3E1E21052A7E7E2D1C6C3F31BD5F8F0607F6D31A23A4DCF63CD388CCFA01902D5C346BD31BDD4E0CFAE1F8D753A7BE239A28B949111CA8AE20E8C01E3EE8B871C2A9112E085E67B7BC2DD701A77715AFBA0105AF60245106FF3D016B4911D266084734E74B86120B3B662C43D524B9CB215623EA35A700501F7D5E3A22A51120F1652430FC85C5F993BF83D06496E28BB2C6EB3F394D5CB1C333894F77E14FBD6A3BE313C5B636430169ED9F030002F07804B4CF2358209 +smlen = 1645 +sm = 6D80FEA2A2266D00DEA04F6F697E2CECE8C3F85ED458A044B53CA205B76BC532FF0D6600E99CEED67C68E6C13F878990A33C99A420D5B4EE142297E5E7468001D259073D9E685BFF1CB1B946C0DA55E8477235C823FBB7F23507246F876D86B973E530138D91CA6F78EDAA6C27C243C7B13C6268E06FC1C64B1BDF65C09D540000003BC85F978142E094637765766C49AF0F98E27D11DE2A70F6FF96A3CF1A5D357E2F8C5E37E7BBF8B0E1936072B6570E4F191EB208B5DBC964216D2454E24447178CE79FDFCAD0A6CFC94F6E53D579CBDD5A70097959D6D82AE1BF5B6F09EF512F2D490BD5866245AC634E7131512DE35E959BAFA7FE302139EE0CE26E41F8D8194DBF2936D04A56CF8233E16B119372F97717AAAF753A2C3725A6B9D26E9879000B04AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 + +count = 41 +seed = 1C13369824A3FDD41B1065E17297574715D9BD9CE5BB733D36D22C31B62BB1033989A604D78BFB1A0746BD4A2271FC0C +mlen = 1386 +msg = 9D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 +pk = 3FF992A603AF8817B8BEB8659BA63A66BA10F91D82FC959A314235E751228CB18E8BA9BAF36E0563C32B32656CF59C692BE6C7949E4C49A0B00D2C7D6D74F0002ABE74CD1063F70DC6B17DFED727A36961A531DD0D8D39B6A387C84DD21C0804BAD14F384DF266763C8949F8E521F28247F7ECBED74A2E7F37494688A4D3A3000B +sk = 3FF992A603AF8817B8BEB8659BA63A66BA10F91D82FC959A314235E751228CB18E8BA9BAF36E0563C32B32656CF59C692BE6C7949E4C49A0B00D2C7D6D74F0002ABE74CD1063F70DC6B17DFED727A36961A531DD0D8D39B6A387C84DD21C0804BAD14F384DF266763C8949F8E521F28247F7ECBED74A2E7F37494688A4D3A3000B5D1D2DE72A62C6DB94AC2ED981930686BF0193B499CED7DEE8657D5E4A7C21850C01000000000000000000000000000000000000000000000000000000000000320820AB2987C602C1F2A1EB3E8ED46A8E4EFBD68CBA56698D68EF4F9839C2714AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12B266C2592B9D8E1F63B67D5959034B8CF29B745849D31BAEBC23F5B9CE9E20EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044A2EED0CFF328D5D61CF4ECCE190AE34947C2615E2E885FFE3A85B59F00E28DADB347439C0D6637F6C0C9518FED781A08B5505F526A7987709CC0D04D420AC57C12F7E61AB6D1FF38218CFEB5D6199ED3ECD1B6532D1E729F58AECE7ACA7DA505363BF758E9958BF7003DC4F4062F282AB4457E7A5BFD822A4FA201F8030748FF4640D06F3E6295EF2AAA74600E72029C08A760B0DFB5C89DABD356BA8C05EF6297042D70209BCC21FA20C41A834D3A5EA16391143869ED2A415A920F5F95991BC5728C1E3ED865C1E060A18624121FA671618242D6FE03A1E539AF0A059BE0A7E6AFA9A1CB901A8DD4F1CE3BFA63F4D4E4B776364DBE530CAA9E0D +smlen = 1678 +sm = F36E8DECED0DD3E382B489FE4B2E4B4AE2ECBE0F3C771546DA44B34BB01090A34936BC6A1B8622B9F44010C05AFE209D90E92E5725ECB1EBBDC324CB1B6F9801F51B40B8851B915FC994292E91030AC205557FDB0EB52EF8997D615EDC764FFCF039582BFDE296D0CDEAED192DA763DA06FD6CE6D7ADF82C1231DDE12B760C000001FE746AA28C740A1DCD36AF3964F955BB835A4220D85A083751FD11B672E2E739CD78F5EA70DA84696849F57AD5067684E26B05DD76C63382B5BE0B7BD0EC1A42E6D1B3BA83D73C7BC50974F97D9043113265EF2A1AFA18E561B6712E7D0E137798D0434094EF2DC484D6A5D6419033C9EB8AA5B38CED1977316E870D9412A55544355909B134183B831B5EF94D7A9C76BAE09CA65B668EC548A6317F83B96F0009049D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 + +count = 42 +seed = 7AD6C7DF00C9E52A75290D28DA946305D83CCF6DE2515C19A8E26850C34C8C2E545E2E32108F13B9C97F87AB68D10131 +mlen = 1419 +msg = AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA +pk = 4CBAC9B9239BB5F676CCC50A484D38FF958C70EEEFEB340FA0E8865A5D092DFFE639C6FD08BF46DF98072DBE6522E566BFF3DE6C939BD910D56B61CAFEBDFE00720AC7512B1224C3D338EDC5CBF2746DE2CA1F5F5ACB421BF36ADF283F9F44E7AB6E98B71056E7B6E4722187F8CD50EC7FF5328979598741BED583877AA7FB000B +sk = 4CBAC9B9239BB5F676CCC50A484D38FF958C70EEEFEB340FA0E8865A5D092DFFE639C6FD08BF46DF98072DBE6522E566BFF3DE6C939BD910D56B61CAFEBDFE00720AC7512B1224C3D338EDC5CBF2746DE2CA1F5F5ACB421BF36ADF283F9F44E7AB6E98B71056E7B6E4722187F8CD50EC7FF5328979598741BED583877AA7FB000B97F9440A990A60EED6EC0543FB9005FE427A167935EE3CB8F8B1A2A79CD74C9C440900000000000000000000000000000000000000000000000000000000000032AAC359165228FA2974AAAD715CC776CD375665F3BC7BE4414C1333E8316575E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF695E59BEF1B24EB8D21A209EB5EC2440C740EA841FD505F2298FFB683B8461BD2EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EA059DC4DB9E0B1A8EDBCDCD62D0162FDFA777D3A7D3D3373D8F4A14FAED21D50E029D06107812A089521C8A4B8F87DB3C3636A9CEFEB739BEB5712E362302AFF0FB2BDF859324C13CA4F1C03A031F326A1D326DDDC4D7762D63861C2CA6494CBD8070492FC9410EFCEB072B9AB3D792B500E5F39B3F3D7FA04A6DC9670E154230212E39F60EA265779AE564AFE2E9E8DEEAC10C79BF6AE38992F11492C825EA57ED7DC58DE4DA93E86D3FF9BE60F3F59E3E01621BAE92F082BB2D4E09EAB104D239078ECC8AA38911607393A3479E41C57A5D7FB26EE76AB7751DBE9B5D3E0E0C635C278046D5C6FC1E8298BC2826089D149A70C018CE0E79637F0D +smlen = 1711 +sm = 3178E7C039AEF65F2449BD7ADB0619C0F7A3314F0FB65F43E11CACBF725D518002DD0E099F2D35BB6C9CAA6973662D6D920969B85BD8F7A25A45074CA2208201F20DA95D1FDB57597DB0A9710DD79397BAC3901D97B97F26107F531B47E6A79D0436039EABAF1FDFF26835F9239F1F38B9ACEA44D5BDC98DB2F0B66A2292F3000001F8CC428A0365AC57AC4679C2830B6DF2CFFBC52010A6E0808462D0A052334866A97B7FD7C5BFA15CE805EA2A7484B38A3966BBDEF83B4FA003BC42BE2F84A74C5AC02EA141A61E0F8759228452E2142CCDA0A4B3F6549E80791ABFE24AB64264F1429F70CBA9230B58FB0616D007E380FEED5C09E5C4A51D8BF2C69BD244957797C438ED853DB3E29CCF48223D22AD771DE3F894F3B3EFE7B8D8EAAA237222000B02AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA + +count = 43 +seed = 38FFDE9B60DEDB5BBFAD6C52AA02EF6D49369BF276C99E588D796A4F260E0FF0A65C96C35863BAACFFD9B212EC305E7F +mlen = 1452 +msg = ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C +pk = 8AFBB181D58AC7607FD69A05B578CBC46C9BB1BE947801F4B08652554D94F6E75B0FFCD81776D06E3FB656957258E199BC6D7EA2D35CC11A2F0B112AA0EE2401EE276635D65CCD7F6F62E24D660A1CEE0B7AD3C0DEF48B0F6C3533CE53DE5FA91CCA80DCA63982F7C382085EBE06CE96B676BAA3BB34FC3D37B4A79B420DB90009 +sk = 8AFBB181D58AC7607FD69A05B578CBC46C9BB1BE947801F4B08652554D94F6E75B0FFCD81776D06E3FB656957258E199BC6D7EA2D35CC11A2F0B112AA0EE2401EE276635D65CCD7F6F62E24D660A1CEE0B7AD3C0DEF48B0F6C3533CE53DE5FA91CCA80DCA63982F7C382085EBE06CE96B676BAA3BB34FC3D37B4A79B420DB9000921D86BE1CE7EDF7D22686D9E2B123592FA5E1A5772874DC800E5B79E5D4AFDA3C800000000000000000000000000000000000000000000000000000000000000383CDEDFE18F04783F07BBB1C17689E7C92AA8B35A9ED9D21B04FBAC531DCEF5CFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6B65F952ABB6375A81AD6B403DA9D67690C6683412556327538C15FCE25F5DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E9672106085B7AAF2BF41A97D468161A64D8F6041F2A15E726B1BA2D2A84EC209AB8FE0AE51B30697980D6E03703AFC4FA37F7E79CF63E8FB995E29A75402E5C8D9D87B8DB53F5A0B06A318113287C99E3B412CE3410D1550E400040A7D96419E013707239366AA4E5CA8F8428ECF2809462CF024AE999FA28FB96FE304E3EE865AF23F6D9CF41E3FBBD91FCE44FCF50529C05957764655F1EE95B1EF3AAB89AB543A8494452547E8BB0CE7F0D2E5D6213ADB68DCD854DDBE427BB805B58365BC35F213DA3DE06BF38FBA02B632D52FA5D9ED0505B283A9741F9FE78C433D308739BA44A364B261402F2EBEF0B08D0C4ADE014280539B86E8B4D401 +smlen = 1744 +sm = DD46BC5060A25AD5C5F6F35F04FF5DF807B4F0B6B348A3A1DF31939F24545F8587ED4F105217FFDA1C053514478CC4C96F9AF3147D9D955382E5FB5FC513A300B4C3E0B3C86DBF636F800D110B932F13AB77A4C519B66D4B70BC1AC98166A60A70823C54B99C41E887C2B73E1D54659D04CE7078636240F5EBE516D82CADCB0002006B7EB52EABF32CC5558F19BD409F5ADFA1AF6FFF4929161BF97B3FE2C314511374C61C8084BB6DFF7BF2164B439ADD32F792CBE2EC00A23A9F3CFA7277D2061725847FFD9AA7A390039B8C3908A0D51F84BD77A9527E1856C714236C00FE7D06ED3366AB9BD8499ADB11E6937E6925CDF2DB66BA1C74DC1C548C97DB0994EF076ACDBFE14609409A31782FFED11BA2B8FDF42C87F958988E54C8CBAF233A30000411ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C + +count = 44 +seed = ACC98B16DCC9A50EF57F332D66255CA56C2BB679CAE705B4297F1418DA845861448DA6CC5CC458DE6C6E96128EEB2898 +mlen = 1485 +msg = 96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 +pk = 326A1EFC774D5F3CE6B11CA8EF53C12594552D4C5D79EBD0894959BE01938EF8C66700B1F6F09AA085D9E45C010A8C65CB2CC105E9130639AF56359D6D101E011842089B5EBFA5E39FD7E357276E957244BF96D8094F2406454EEB9BE5F31F5B4F7DE0024CE8793123DCCBC68B0237B4B2913CF3A7CFD7B0650D7396D3971E0002 +sk = 326A1EFC774D5F3CE6B11CA8EF53C12594552D4C5D79EBD0894959BE01938EF8C66700B1F6F09AA085D9E45C010A8C65CB2CC105E9130639AF56359D6D101E011842089B5EBFA5E39FD7E357276E957244BF96D8094F2406454EEB9BE5F31F5B4F7DE0024CE8793123DCCBC68B0237B4B2913CF3A7CFD7B0650D7396D3971E0002CD4E118807BB35EA68F21AEECE12B037D111EC49E23102FAC917536C9E559308F500000000000000000000000000000000000000000000000000000000000000AA3E3288148EFAE49D42E3D04E9D77D551DB015EA21ED7AB5E2B7A0FCB3DEBCB7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71CD9F684E28C572F23433D3E519E679BB8F6C0F1C3E70FFF8499DA3BBCBAD93F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F611CF4F1922A76E7A89171D1ADA302A2786ABFDE34007D3B1DC26A2DE0F5950BF3797726A958894BA0962C94F28573A08CC959B30EA3387AC0CB3BEAB7A0837C624B42B18B57DF12F2D8910AF71B031A22D31A09E2BED86A3CCAAA7218BD1765E8E74ACED7114657DDF8B377A5C9FDCD50BFAB8EEC9C8FC0D7121C1FE077F1B5A9204DCA004563C41EB29E3C15556369254B21724862161E8511CB107C239AF6F31E2365F14192D30B3023DD119CF7C9D2B185811D707BB7CA3E3010D94334B9227D51E0A8EFF4A426CEB99E36DF459DFABD747C0584A65D16B15863AB992E86F7AF9DB93DA73969C62E7C94E9F3E197E487DA97EE381C13C67DC06 +smlen = 1777 +sm = DBB74A539040C5F26947613A755FE9913828B1745EE0F603380BD74786908140A32B0F044DB493CAD5D95DF0F741F7C3814E3B3E2EFB4090AF753805CE825C00E9FB87A63E38A61332BC315D019A2BE37D8CE3E22FA7D32F0627899ACC8E1F501B011F1897CD83880EEEBE9BECF68128F0484B54FC27AB82FD9C77E941FA15010001F5BE03D6DFC6C0ED3C6128F663A599A614C626D393C2B8524E983EB5B16FE702DAFD61C13EF3FC59027BF27907DCA55CE4C9C69C923C18E56CCD4656B3E3F54EDD84DD1F75B9BBD9ECFB78499E4AC4F9BC48EADD7BC369FAAFDF7A15C6EE2C4FFCA5312F5CBB51D42D8A2D326DFB346EC6E5F91275E37D24C94039B91D33AB658E13141085EA21D87172B34F68DEF7FFFF167F8128351BB6E9C8DE53D6683300020296E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 + +count = 45 +seed = 8BEA4E384E73C7E0B47381B3063334291A0F06D28DB61B5BF65B01D0A747722E0AA62B81AD46C00C8A5C31494E513836 +mlen = 1518 +msg = 047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 +pk = FC49E9EFE653B88F41E404451EEDC01BEE8775E4F43D58FE8859C1E07042EEEBDFA66DD466670B8C3DD160C14DCCE241AD606A4BD04DA611A690510C3949B700C5FF457121BA165D5A0CD868115AA5D981D11D32BA320C96C7522E8BC43033C7C7768A1CB20F7FBF4858C58C8E0436253E568C12B1C39575E5A3E3618A108B0011 +sk = FC49E9EFE653B88F41E404451EEDC01BEE8775E4F43D58FE8859C1E07042EEEBDFA66DD466670B8C3DD160C14DCCE241AD606A4BD04DA611A690510C3949B700C5FF457121BA165D5A0CD868115AA5D981D11D32BA320C96C7522E8BC43033C7C7768A1CB20F7FBF4858C58C8E0436253E568C12B1C39575E5A3E3618A108B0011BB994265E9080B943B0335D87D79B733AEE0EB302F6446E0626C933907BE1D811001000000000000000000000000000000000000000000000000000000000000F0694AAD69B1917B25D6BEA24AC784FCA4E063E10361DFEE04F5938F95FC4EBAE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87C1695E47AC035C45B776813A413F9B89742E105292AF2FFFBC16FDA457DE82FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000273DDCDBEE830CCA275F7E1A87657663BB9F532E8DAB82ED613701EB548C67F27D558FB923655A6D9050567160FCDB2BB7225B382D9E0C863B1267EA32730809A3927336ED6A6E16EEE18EEF233C2828D3D86F1C9A1CAFE60DDF1643D854C13A1A0F4D49527081C2D67F11C28CF8269A5750F7AB5BFBF0C2E0F06F95DD054AF33C41DFF3B0F34F0FE63302982B08DE46483B3D7D1EA3749BAF8C814C6764EC740EAE6AD83FE48F39E2E405885DD02B5FDF03FB48949D6BAB1208FB45036175C59244B474982C39AB63E630F3F5B83A715F1A3C7F42DD80303457790413D26B9D695F58F48ACBF2E5066289BBCC8DDF8E6335601B218E2B77D05BD109 +smlen = 1810 +sm = 347C8EDCEB78968345E975EE9305B2A8D98AC220B8027B04482FDFBF75E13385CCE6BC19451CC4A0F522100270F692B0CE99727FB43D694A0A326C859DBB73009924F06565B325F995382EDD8B1D81DFDEC82F7FF1EF82BD0ADA943812B18B9B1D95CD41DAEAB081E6CC10A4E34EA30CEFB571E9821FDD6F614F921C7672C4000001894241B0821EA3FDEFBC6F1DBB7EED84E8F75BA5B5609B0D6DBE35C5A301AF7AAC0D869CCDEE9E7EE362674E73E4E65B1E00AD7FC093857700420C1D966AF436D2D303140E156424B63FDC656970BF8499131899045DA2150D78190FC134F94EDE5C3AD3CCF841B750FACD4EFB8349EBE8857FD05B395183FEA6944483F371042E54CB11F25FF839C50E0208EC7FD2A469F327A673F6704662273162181B6B000A09047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 + +count = 46 +seed = CFA713E4A63A6FFBA43BFB898956DC400507F68AD164C3D24A67B5F8D7548C9DB44DAA43E5E4A0990325A4233089318A +mlen = 1551 +msg = 6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 +pk = 658A6045412F9378885121675B0F1C3712E440139AA2DEF1E970E23DFB55369D677AA4807EF23A76A6F1EEC03FC79BFA2CEE162EC2AC4B3024475CC746AAFF00B95668713E483B2287BE00B747BA92B61079C6B430C826F29695B1FC9657A7ED1784C2E0F4CB99FA7E64E09CC61024F116AB90BE17A1EB389B5F98D3FAD6E4000B +sk = 658A6045412F9378885121675B0F1C3712E440139AA2DEF1E970E23DFB55369D677AA4807EF23A76A6F1EEC03FC79BFA2CEE162EC2AC4B3024475CC746AAFF00B95668713E483B2287BE00B747BA92B61079C6B430C826F29695B1FC9657A7ED1784C2E0F4CB99FA7E64E09CC61024F116AB90BE17A1EB389B5F98D3FAD6E4000BFB5A3E7CBCDB25A2C4176792CA0A736ADA765E71AD4AA836110260224F6D6BC12B0100000000000000000000000000000000000000000000000000000000000042FC9590D1846A989645FF04B7640575773C78EA24439355534AE32A8ACDD77ACAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83B0BCA999C4F4B101A0EF094F7143EF8DB64A6BAA78A24C850D65F4DE6CD97BE3FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2D49762F1113450B3018FDE4E32F8DF8EA06FD990775384D22F6C53E69747E1FDF55C03CAB5766544E1E3B1C249AE6B426DD5F81249D3EA9CA496E55C48056504DC3DF4AC92CE257A50684430000C641E6B4BC61FE99DBBB9246E13552A59468217D10F2AF6239135645F79464C3F25E2E1D8DA1EEF20CD6D9C3E88E30533B3A24ABB1EA0A20A34C9869641C2E007A4CD707ED95290BED5DE749EB595FF2F6B87B28C15F64FCC84CBEDC5A43191C12059C118335CE78BD5B75FB8BC0A2897924F65E355A382FFECFC7D1DB4BF969746710F4474C26877FBAC8EEDF0590D40413F76CD60E9A0C13E05C7E7992C1E0AB3A641A8A8347B72C783E11B0B +smlen = 1843 +sm = 459DFF73EB44C432BECE1FEA9C4C2BEC8F6D58130BE6ADEBF38346818A1F6E03A669A321B12026CE54DCCD5016C272614FEB5645C302F39C4568CA44FCFD7B009984241082CA24430E131A9B9361EABBA8655BC8893AB976919119AC6672B0EF7CD7CB015A58DD1BA0C5B02DD52BDF91BC4DA44D5B740351BE79607C73A157010002579228D60758A47D77A0F1B9CF2D51243A1D7EB597E852FBB45E0F8A339EE432596FB41DEF0B239AD7234191B7FAC97831A2807AA043146DFCCCB60339C6F850389224B8211151B76BBB7C242D427E12AA446DA3E9DBE9414F88108610F1C02384D0AB2ECB96438482A14084B0EE0D35C865FABF7C0D14FA33B1A68F8C14A1159032707F4BD3768BD2306B268DD03A36005DD6C464405DE44377C0B9B5E95E00090B6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 + +count = 47 +seed = 1F3193EBC58EF65E9E396D69220ADB8ADC729BB388A72CEC9028A094F1CBDED21CFB0C41356AF31E0CF66A3B0D843666 +mlen = 1584 +msg = 139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA +pk = 1D5F2CFD5740E1D0A2CBE66555A31F0A8823FDF1763B3E04A5D8A54F7A25041B6282359B6355F199FB341F0CD7D8502E735C419ACCE4854A51DA3016A63C74007886A8DDEC383667A76C53B510EAA89A0F74891B85BEF7BF11E203619254FCBCE21DDC3946AAB5E10E5B6EBB651CD45C290C72317D5A2A69D23F7016177DA90111 +sk = 1D5F2CFD5740E1D0A2CBE66555A31F0A8823FDF1763B3E04A5D8A54F7A25041B6282359B6355F199FB341F0CD7D8502E735C419ACCE4854A51DA3016A63C74007886A8DDEC383667A76C53B510EAA89A0F74891B85BEF7BF11E203619254FCBCE21DDC3946AAB5E10E5B6EBB651CD45C290C72317D5A2A69D23F7016177DA9011165DA162647ECEF61BB86535A1C55B16AC0DA173726CE13F5EFBD3C420B34E588BF01000000000000000000000000000000000000000000000000000000000000A2F0D5D7485E6B14D140456F9E0D2C442ABBB8598FCE8C096C865757C6D7D9CE3AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDF280B78CB991617389D977D4BFB7FB56990276FB7E10924BD828E68B7EC4DB43FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001F7659A5843F6EB9F0750674DAA33E4747880E20C161671A4800320FFBFCA01C55039BCABAB196E6A2D25F68C7410B86E3F6B28B19A7ED88E2397D788F540956DD0F7AA8E02B5E485DDFF1EE8E3DA5B1CFDF96F25B90493B4E51B1B2D56CF301D41532958401E613EA440D827C4168734CF3D215131BDDE60EA8D82215016F01507895A411145B23FA1D992683ACB616243B91C09299EDCFB2513EFF76E4087F40EFC5F9184F32AFBC9C63B4C982D6730FA60D7075CF470B14681A1F04319CF25C244F0BB74E9ECB5D462AD8BF13DEDF078DF1C6F6856FDBC568116C57BA6F8D9F16E4F68010EDC3D9ACCE8165B88B95E8EB2CB6DFFD36A59B54C10D +smlen = 1876 +sm = DC9E948CD353BF04A5EC349607DDBCCB5C7A25EDB60E47E5438378C73B347A0C319E34EF9D5FF8CC915BEC602F15525144BC24ABC31BAB86D6080E24978C0B01B8577E96FC2BCA24EEFB0712E7E1CDD1BBB051D8330A207A7388801CC4E388B1F17ECB3CF88CD614A13004E24FB73AF55C582DEAB50DAF205DE673D9AC94680100027B7A0E761C339889676241038C510F0ED96C9958B6A48F181986EC938736B51E5EF953B6C98459EB9B32EAB83AF3F45032A4C9A0C840D6F72286B5E6A6B0880D4524629AB9D9105D40BE2C4D61CF9EC079FDD5825777599CB96C0CC5447CF81BFE4A8AA32BC189E23CC16E8C499AEC44C9D05EC48600EB0999D656C43FCD981907C5E14137D1977591FE0A762B6E04B706518332451ADC5210CB90C22C9823001309139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA + +count = 48 +seed = CF5A04DDB5EBC45328F703D486D24443A7692D65AA55F054E3078DB76A7939590A3F35CF1A21E82A845445DD1B64A85A +mlen = 1617 +msg = EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 +pk = 9C5F4AE908CCF4098BFEFDCF92395843B8AC489FAD07033B84DDD56BCE06875CE0B1FB21E93A7E7CB91D522337EA6965F9BCBCC3205D35E38D636AF068E8F500A87046DD38D2EAE4084DB14DBAAA9932CEBCDC0684062EF65ED7DD8B5B02D8F811AB914114C2337361CA81512DE3FF0AC449EA32D25C8D4CE66F923E12C5C30004 +sk = 9C5F4AE908CCF4098BFEFDCF92395843B8AC489FAD07033B84DDD56BCE06875CE0B1FB21E93A7E7CB91D522337EA6965F9BCBCC3205D35E38D636AF068E8F500A87046DD38D2EAE4084DB14DBAAA9932CEBCDC0684062EF65ED7DD8B5B02D8F811AB914114C2337361CA81512DE3FF0AC449EA32D25C8D4CE66F923E12C5C300042169B2FDFFA7C6E39BE429B7B0645C6F500E3D9AE537229D63E4CDE27459830FEF0000000000000000000000000000000000000000000000000000000000000050B09F5C101AD458D12E873578D67B57CAA145095E29F104D822A5E3F6445ACCC3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC19B4A73FAC5EBBA3C56975D0E5CEAF55775F22F5F0316A7AE282B747181DE65A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087A4074F9F413C96907E13D621EDF95F5D12C30168D8EEE6369D857A8546D538BC43B71368659BB60FB73DA67B68A6F8B3074E833DF4975B1CD68F0BE6D50CE3D165FF3308F62361475EFBE3D5D8F73A63C5A58C626DA0E4188C632032417C401DB752A5427BAF2308D37581ABD6288F0F95B6C7F580E9DB7AAE2C6E3A05C3D7603915E0F98AC01A57C25F379E8D2A39443843633ED7D2E624019BCB279CC2EC1857AA908AE1C3A942B5FE7C89EE9C0A7DB3890D270E1DC59A77F1B20E32CF415A41444B4BB63C341DD560A3AA080F4FAD607A4F5F56615FF25C541E0CFFB2C710A873F35DFB5D8BA6D08A2E8508C31EA0B5023F2E0A51DE63336203 +smlen = 1909 +sm = 8B34BBB1FD27608B7575D31C5B5C0F3825A22C61F15890964B13568B0CFC897D9D8EBC72E733970DF6FF82193FA0F25514EA849D1FC753B19DC75B25E9523300578A4C42565D3038720DCE8AAAEDF43ADC2441AA969DD0CDC22134996DD1A8B139B73B8FD85ECDAA7D7D31BAB31DB87D22D9FDF86695DF8BA02A108019147C0101009909F3FB6CDADEFC6520F2EA4E990BF37634F9C28138D70B53BD521189801B04E019522B07B96EE76C4D31DECD13B15E630207CC465D0BD4F741CF7B6A431E2D8B66278B7302376B007CA659044ACFF90AED4A70FEF6BD041E4B37D000DFE200FFA45A011ED56DFD6046E1D10589EBB3BAF24551A4F38AB914AFB445D591F011022309D469BE2BAF076B72E1F312F2194E12DCD199EFD68BD7F57D966F4E13000902EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 + +count = 49 +seed = 8C3D2FBBE0D39E293AF2D2CC5A9BEDEAAE3752DFD19CDC1E186D41E717A0412AA429CBDF005445AFDE684656B5D17690 +mlen = 1650 +msg = D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 +pk = F0AFE8776A7C268D189E783654C540D88D8FAAB1CF9B77FC361EC2BCF8F427C0CB3C2DFBD4217171476D011E6AA8C2F272C8668A582E4A4C44DAE74A969A9B01C3EA125CDB2E93FB1BE9409F031749AC35462EFA8A80A3399EBFF7B3E9691596A206C2A392A3344114855EC744BCF676A4D0903FCAC8E6BDBEECA4E8183513010B +sk = F0AFE8776A7C268D189E783654C540D88D8FAAB1CF9B77FC361EC2BCF8F427C0CB3C2DFBD4217171476D011E6AA8C2F272C8668A582E4A4C44DAE74A969A9B01C3EA125CDB2E93FB1BE9409F031749AC35462EFA8A80A3399EBFF7B3E9691596A206C2A392A3344114855EC744BCF676A4D0903FCAC8E6BDBEECA4E8183513010BC3EEA267BCD7119E8A4585626384800F11E615A21B496905CC17358CBD97B5931601000000000000000000000000000000000000000000000000000000000000EADD700658A4EE7C4200E150354C68F5591402A6CF99C72826E4BE341D688FB83FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BC364E104F6424759C0D3A3D682BB56B84BB0C543FDB05BBD1B84187DA77B43F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000789CCDB02C83379904E5734A01570E20FFEEBA68B4C854DD2BCE378119454CCCD21908FB8C7EC6C8F94328519E06EECDB1D4AEFCD55662A63B8BE48E79600F0B5B0F6365B922DC4A6B3301FF285C0333F04E7EAD78521E508540C249556D7B3CF2D2374F7625EED7A8724569ECF1E1CD3530F1C3673BC7D4252F7D6B67007124022F28D2B65B7C8E9F1298E3B6984BF078D004D76ED685ABDEB47EB308DED94CF5FC55135BDA6C0B0EA30FD2389CD9B66D5F25EE8F49539E9942D89202F56FB49A56B55136CCB37A32220C99197C6444A7F011145E8F43FE5D1C9A1716F4BB0AD918104D9ADC602A5E8AF854D7F244663ACF86711509C784DDCAF208 +smlen = 1942 +sm = 7FFA98CFE0776341F2D6D7E9814B179C9378D500B8B386F7A394B528242B6B87505C1101910ED69922664FE0FE86CFB6A626270239D3FBDB425D42BEA8E385004B260725ED9143A9A74912232DAA0A31371CC2DCAED29751CF7728796CE4BF035A6CE77CCF8B71C5B51509418D1D9ED335BA8A55AED3AEB2DB797D8D4EFFAD000001E96CA84E10E1667858E1D5F145C08D1C0FD6D7B3D7901FFE4BBEC2AE9862E958566CBD276ED4823A11AD7EAD2B91040594EF2715CD209CFF7C40677861516D71F32BCF4546B85377C4F5C70D14D9270C7DC8F15F05D8543BF04DAB099F795778D8AEB66A9E017A0F3B4E53AC40A29F022A34498CA73138C105612E3FB2E93E6D80D630A975055B141F0C0CE22BE7786E2F77AA8C5CE2A09FEACE6DD6A79007000B04D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 + +count = 50 +seed = C10427EF0B26328163F85D45E22EC5215415326F013FF31EDD58BD3E97B1A72FF07D275D4C1B517F4661B0638F75640C +mlen = 1683 +msg = 4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 +pk = 42BB819A3C9C4D29F5CF202B083482818889A5CAB0B7243DB0F2C86756F6057E5CF7C9E0541A1340AE0F3D8FAA5D59E3E496D4AA1DCBA69B3F9F02668D2F1F01D7EC933069DBD0C0FE2FA251814CDAFCE0B807E9C5E28ADCAC02A8357EBB1DD65AACFE61E95FD15F7B8D0315ED0DD83E1807E7DA93F25A01C30D41739B8DAA0106 +sk = 42BB819A3C9C4D29F5CF202B083482818889A5CAB0B7243DB0F2C86756F6057E5CF7C9E0541A1340AE0F3D8FAA5D59E3E496D4AA1DCBA69B3F9F02668D2F1F01D7EC933069DBD0C0FE2FA251814CDAFCE0B807E9C5E28ADCAC02A8357EBB1DD65AACFE61E95FD15F7B8D0315ED0DD83E1807E7DA93F25A01C30D41739B8DAA0106519153F3E5490646809D5E210F6639E1D21BE3C0FF7EB4E0687AA6B680249E381A0200000000000000000000000000000000000000000000000000000000000032F5DCD6F069BA4903B91A52AA182610EAFD8D2BE0F5CE0AB388DC2A8973912281FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9113AA5D389013644C91CE3131FFA1B66FE203B47C02A4D973D28849E4241DF033FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020D1773D4E1919ECE776493FC44A9B052FBA6BD86E251BA3DEE926215A8BAF390AF6B712208FE7B7B05A082EB9178779ECFC6A58C2ABD8FE6958B2AA3E4709251F8DCF7490A5AFACA43F24D1AB234BB656DB95DDE94F40F0FFE772B885778F684695FA5C5D43CE62A7A082D7207657C67FB4ECB48131650121508195C10DF77C6A0DD4DEB4329DA4DAA577AD2DD83A8B01ADBB2F16235CF7500AB3EECAD09BC44776F6AA1A86B4B4A194877B0ED4D98D6B1652EA204DE4F4F8DA50B90EE6EBF65090B1DF678709692E712CD8D60383C8B9FDE1B1607295DF317ACF3A8E3A1BDACAC6508FA7FA4CEA8D19CEC1D4185E8CFCC0E055F5A4D33620BA8803 +smlen = 1975 +sm = F6EE2C0350EEE963E20FD65F1C413F7ACF207ECDAD0EACB45F325F40BC2B81681712B270BD84FFAB84FDF98ED5C6166051D404D050CEE93FF3F544C0EA8EE900F7336D7FD1F84659C740A3D28E3657A96052CFC01183B1F54C340FB982EEA6AD9C7E2A1637FDB73792D7F3634A130F0309736E9662C5195028FF57E1A89179010101982CA951EED2E01D9240C19A2837CF53E73AEA3CCAD108CC264254EBB203203FEB96286C2BD0F972E616F07B116BD86B6DD27FACE1572789E626EEDB1D52A8185A4BA0EF58D8FF310CC56DE318661C9ECEB8270F375FF57DF6EA9C84FD7F000AFA6E1260DE9C7F89396373275237FA442F32FA22C753EF62225D82DDCE54562088073AE2B3C951705E559752BC0F4BA7E90C3CF75806984D89A54B31B129200002024BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 + +count = 51 +seed = 4B6B73E042CE76DBE39535E45D3BB2F3B9F8B2BDA170E76CC88666844703E32B2367460A0F6A0A2E3F4E7A6CD32BE998 +mlen = 1716 +msg = 0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 +pk = B2986782C3DDEDD3F12EDFD37320676124FDAB022B791E883EA1F3085F5BC0EAE730B11D422374571066925782289DF49E2FB9DA9ACF73261F086CC7A4F50700395F83AEF3B1B0DC40AC0F637EA809B46986E28C99943CB79AD1F2667E1CA77643D06EC881B37824995CD301F11C9C7051A50EC11E8EC20322FA72180BF4370109 +sk = B2986782C3DDEDD3F12EDFD37320676124FDAB022B791E883EA1F3085F5BC0EAE730B11D422374571066925782289DF49E2FB9DA9ACF73261F086CC7A4F50700395F83AEF3B1B0DC40AC0F637EA809B46986E28C99943CB79AD1F2667E1CA77643D06EC881B37824995CD301F11C9C7051A50EC11E8EC20322FA72180BF43701090F3B5B57EF281E5F1FD80455CC0CC4285200B6CACBA74CA7C9A8F2A853B45B628901000000000000000000000000000000000000000000000000000000000000D851FAFDD2FED6C0340FFB9A69F13CCADCD449543893A6E4D5729FCC747ECA05EDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F01F779337AC23D0FA348B552B732761BF985C11A49CB4834768F9EFD56BACB31FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ABAA392C844E069327D2B671E4D5F7DDDBD4269633D765B7E43E038E422140315D78DE270D14A9D3ACC823E8B7027733CF2B5599526D6CB19E34CC110CEC07662C19B5ACA10DE3043452DB787830926DAFE53F15FBD6F4C238AC61FB31E996B6BEA24A64E91A88C297D0B19CB672B3BAFF51FAA62E90013C2DD477793705B250BC7E7F630E1DF83848A6206C714DD529597232AB03206419D1E344D8A2F86694EB0D60FF5F07BA0DDC8A9FBD69CBE1A27B89AB4323527A52A0137009063102A5EF9B6FBDE3EC9E68DF69F61DCF2952A48DD4954E991D406870F9A8083367796F125ECB0AF81BB5911AF924DAB91A442F3D33489570D202326188050A +smlen = 2008 +sm = 1C3A9A549ED52D965D7CD3FFB014B571C42E9783D3F439D6C962023EF4DED81CABDB01AAE03193A7F4FE5698D66B5D8E30FE3049B97862F84D9AFD83AA830D01AF76C8EAED18630FA7E6F4597312229502398B940783D58629495A44664AC5AD5D35567FCB7CA35C21562A96FED197A67D75713D1A29CFDF9127DEA0885AB2000001808880C2F4E44BE6C3D610D5226CF4523E8B38B33DA82D58D6AFABF2E485144779A9461F1FDCC074AF5F8634017CE50D669C93279FA94B3093C502EC801B1B5CDE76D3FC3307837F5FF9FFF3BC0DCFB850FADF530301559A400E7BE3773C5D4F3C8237C86ED92A408A6D80932001282647AF5E1D94A9933884CF62BE74114F5F18E97AD35DC68FB3450F9BF32EC22223C4B43FA5ED7118BDBFBEB377C17E7E0002020BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 + +count = 52 +seed = 3D4607399F6FCBE074FD2BEAB1A7571239D6BE6308617866B65B892EE65399E14DC7FA612CDBC5F7E23116FA86C3133D +mlen = 1749 +msg = DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 +pk = 48C7E551C8F921A8F708621198AFB9720ED93204F42AA452C1193F2992BAC0EE7B6DD1EF47ED10AC44A136FA52B4BA379B116E6A07D8FAECF852D21586D7FF001C1258282F363B107261EC4EB8798934277630F050FDC94D1E6766FE684F11A29143B22EBB320F259FDC931946128FF9270F5F249307F5DB9FE9A7DC90A5030111 +sk = 48C7E551C8F921A8F708621198AFB9720ED93204F42AA452C1193F2992BAC0EE7B6DD1EF47ED10AC44A136FA52B4BA379B116E6A07D8FAECF852D21586D7FF001C1258282F363B107261EC4EB8798934277630F050FDC94D1E6766FE684F11A29143B22EBB320F259FDC931946128FF9270F5F249307F5DB9FE9A7DC90A50301113FC9A603A5A21F22A63C21015CC37FC07ECEF7CD0FB54E18485B6E3053E43B3E30000000000000000000000000000000000000000000000000000000000000009ED5E85B68E0FE5CA7F111FF99D604C0DE60079BD5304502D1EDB13A4BF89A7AAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3501D35628888A5153A436F5D180B8B3CC3CEC211F94FCCBBBFE6DA1633AE6D3B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001558989AFB831F181C5C2F9F2B5B449B8147F6A31A69FF17D4182E58D2228C19384B188A2C8CB68500E2D98913DD7B4320575887C8529E1389BB8ECD89680F01ECA7EB660D3BE56388D5CDE0A34EFE34B74E28EB05B07A20DCCD7E3CEFDB4ED2D3953486160C860FC925C9E50DCA9C8ECEF26F00BCE0C89E6AB969A3430AA38436EEB182549473F36452DD2B60D342ACB05B08CB056D2FEC5021F7F94CEFB65DBB7C026277011D2EFAA1DC59751B1203B8533D78EE9C656DF41E3794096C46FD94040780D1DE419A3997E2E1FFDB162355E848C877890156E5DA1F1F4A95304D01A5F1AB22B9D5B0D760EC3DF4DE650B0B9CEC35ED9411616AB5C80F +smlen = 2041 +sm = 33BFC88B8499E09F743C4B47D7C1D543BC6099837986DED55A64AF6086634DB6013026DABB5D9F08CB9FEF51FDE8C88E33BFE294E3CB2401F6DA0DC2E660F2003D4D0C61EF9D5F69D4A9A95C8CAAAF89817CB11BC7DE695FA5DE42AF51D363A9F8ED4D58537C81F4EEF325D1445ACBB640B781B1D065CB689ED64C9EB6406A010001F917FB200371BB7669C9CB991B2EC58177CAEA8828B2464CB4F52604020288536FD69E6DA7BD3C54190D8150F32F8EE2D4510EDF27999BBD9911813B0ED0690A34ECA4CBA2C685CA3F794394F2B4097343D94C9A623DDE0D4DCFC42089BD57412E5F718BA12E84BEF5A9F6E16186E5D917B8CADE26C8928A2B92C19AC8D40369E324DE8A57C79BDA420E69F104E678493C2F5BE03F747B3EDB24AECE8BBE00001109DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 + +count = 53 +seed = 7031BA806F4D8BC28529163B239E0EE836871C51D2D62B601B71D6F2B69B203C81440F8FFC09C3AAD94DB1D880160671 +mlen = 1782 +msg = 6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A +pk = 098DE1013AA751197637A3EFFEB591CEE999F8647A19F40F50CE4D5D2EC409D5DAA6C2C8857AFEE4FAFF776C934D17B3708B6E30C743F450D51B19C2ABFC04008964FEA57946C7D9D9D54C9536AB2392A203CD108347BF8067BEC03C86D89AAF1530ACD6CC24CAC9A85FC82E330404C2629EF0DEB7533B7ECDB1C1A39A121A0102 +sk = 098DE1013AA751197637A3EFFEB591CEE999F8647A19F40F50CE4D5D2EC409D5DAA6C2C8857AFEE4FAFF776C934D17B3708B6E30C743F450D51B19C2ABFC04008964FEA57946C7D9D9D54C9536AB2392A203CD108347BF8067BEC03C86D89AAF1530ACD6CC24CAC9A85FC82E330404C2629EF0DEB7533B7ECDB1C1A39A121A0102C3BD167840F4C43FBA15AC24BEC3B5C2731B1B5BD69A25B428EFA8804AAEE77FF801000000000000000000000000000000000000000000000000000000000000CA211F95F2E9A64F5ED4295EB51F30E969A9A9AE967602A1861952D0A1E747DE4DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333CCACC1E418DB0BF9EA5D7666718F77BBBEFAF38A383BB397AD117C1C412F15FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A158E5A6EDCA79D6C8CD1A94689DCC24493029CE98933A47649AB91462088924943F8E267EED91D1F2F49BE7E254EC94AD1BC8577212DC39FF66A69FA61B0A41E2C1A824968EFAB661A66A3936CFAD44207816996227FABD688D50F4CC3DB465EB04C29FA4FC110FC5F35612E119CB9F222626602CD59072A6E60CAE66053981B053B9A96E8ACF2A8280799BB01B58893ACF410749DFC259EDFBAD68B0BCBAE19C48B80C6889E16785FD74ACB9F2F87D3F4072A0537478207D1C9F1C02F2D1519F8E2E37BD1A88FAC173F29A6644C51A85476730D40BC7B55A77F36C4C6023BADCDB0EDE78EC787F7B9B28AB8E8677DA814D68194BB8BED144862D03 +smlen = 2074 +sm = 78D64DBEEA26EECDEC98CDE2FDC28C97A6852D074A757C0C4595B3FCE0067D5DC8F346CF7A57357477CF03A494EE285C820409CAEB7407FDCD07F7367978A10164D7BCE042F07A93D24BB5C74A45D54A48A7B09F0C14770FF43007EF819998767BDD8946B6C34B85D69F0BB47812878D434CA2A80FFF7C3B2A609FD5E020EF0000019B19136D670AE90153C2D6692E9A0C8F89590AB72B31B28F8E181715E225F340E9A5C45B08F92BCDF7B1047597867817B076423C723152821746A9A2797BDA053292E52535C7CEF426B1FA43470D60B2A1F6283E87DE697FB57B1D5E15DE54607C4D6A30F82361A1B2746D8F2A7E62E43526D2B76973C32F7325D327167A3F75F5B0EDA81DE11E7E0819101348BA13D4F5D5E59117538B90D5471BB665350B0008046103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A + +count = 54 +seed = C8671A5D752CC6DDF075C899797603A625C142485EAC3D57CAF14F2244D7F84D116B28F959912A758E519D588A6A07EB +mlen = 1815 +msg = 3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 +pk = 953C090629EB8CC35F4D0264915E72ADCCE988FB8D90F5E39DE6361CAFF08952BE016B1189F78AAF16AD150E0D4FF4F1ADC5AACFACF45CABC740909CA9C95300AE185ADBD57F292DF9DAD9FD508A02FDC7C633A2EFD93B4856AEC484B11F12621A53B15F37A582500D7F73ADABDCB1E78777EF912A80D6DADEEE6AC55213410006 +sk = 953C090629EB8CC35F4D0264915E72ADCCE988FB8D90F5E39DE6361CAFF08952BE016B1189F78AAF16AD150E0D4FF4F1ADC5AACFACF45CABC740909CA9C95300AE185ADBD57F292DF9DAD9FD508A02FDC7C633A2EFD93B4856AEC484B11F12621A53B15F37A582500D7F73ADABDCB1E78777EF912A80D6DADEEE6AC55213410006EBAC4331EEA59332A0934A4340DD877CD45304B46F0D2FA5F11BC2A22F3E438C6500000000000000000000000000000000000000000000000000000000000000C21C3B7EE9FDE3D9D046E7D6C1BE913AF28D989465C1DB803882FAD37B48586650FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F0AB2FAC75779D6851CD5E701A92DBD4EB890E06535643B80E08B82F6F942A246FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047215CC3D117FE78637B9F2381BEB50A4DA1C410AB42003407E3617F341313C6956907E8D82975F817D1AEA7D01002D9012B7FABDBBAF9A48D7DABB5F453095969A75B52FD9FE06E652CC9CCD7E5B972D0F69CF5741D95F2499FDC55F8F125F0C2EDE76CF02B7C46F34F79317C3BB26245CF8448701FC7E8D6AB800D9609FCAE64A14A5F77D20D1831D606BE560FA2F7204DC020D58126380F156BC92BFA1DA8E6CB337985AD0112B02F3CBA7DF2FE350C950559BFF8105CDBAD5C7202EF3C6BFE160D865B68CCFADBBD8DCCD9032D9509758B543D24DAC6D59D7C4C9F37C5443991702531B008E22401C48977F42C92644BFD75647C75136A4FFF06 +smlen = 2107 +sm = 3E17B40EEDD7D115B178455E87B883C84A5F6701FCC24525D2171ACB9C9DF765A15F6F5D62E71DE4EAB573A56FDF23C5CA20BCF96032D8F19F038242A6C98C01C352582E68B42464CD0740AFA33A78FBC102548BDAA2DA258566BD057DB12551C998DFE5A349D2B9B603639E4AA7F903D9D0B8DD58AC61E8C2DE273951813D01000013C7B366A40B71780468CB62BCECF5525B2DD5D11917A057EBD48623D4A42052223B831A2312C25C2D19289AEBC6B27C48691490E08D60D4EF1B023C7E98B922D670C4D5A41E4B8964D135F5AB8A5FC988DE68A373D7E6FC13D8289EF419961387D1A5069B220B4BC7979CF03B0DE100B38E557A091CC1735B8C57E4B99CE568AF3E4528FF2BD87B70C220C3F513465583DF3FCCF6C7B490135374D01BD0500011063EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 + +count = 55 +seed = D780D7688AF364949A196657A066BD48FFA8DC45B4885279B6DEF362E5957F398CDCE1D20FC3F8F63A275C325FCCE654 +mlen = 1848 +msg = BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 +pk = 8D59FFBA0EB6527526523D96EB7B0095B553CB5CB07C93DA4390466360C645CE93E7721BB911848C171BDFDB98B7BC0348AAB771B3A115312A138D09E0240401B010F1AF992F9745968DCB06CBB749347D30C5FAF6B243199AA0299CBC229E5F4A4610008582C019FF23E4E3BB721B086FE3848376FA2E8CF6EFDA62809407010A +sk = 8D59FFBA0EB6527526523D96EB7B0095B553CB5CB07C93DA4390466360C645CE93E7721BB911848C171BDFDB98B7BC0348AAB771B3A115312A138D09E0240401B010F1AF992F9745968DCB06CBB749347D30C5FAF6B243199AA0299CBC229E5F4A4610008582C019FF23E4E3BB721B086FE3848376FA2E8CF6EFDA62809407010A6BD0AFFE63EA726AB6EDBE36581C66D6E4B05DB69FA1E958475E20F14E0104DA740100000000000000000000000000000000000000000000000000000000000072E3DC11232A4E96CCE872F7EBC8A573252499D7B4AC9451EFF2BFE64DAF4F90C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB171978C6EA3E0E0B594F79744E553A99F68541A6E7AC9DEC629696CCF6230D21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002AD865C130344C7BDA28A93DC2E582E96FED464B8AC1836B0559C59E1836CF2831AC25B6B451AE4713FBC084550223A36A9E60F73E8534A9A1A4BE7C02AA09536C7863FE71E173C699FC89EB35A62B2798D54AD64777FC57FBFA293DDDDD5332E5FB0FCB5735D4BADA3C158C8C4ACDB1512634CD91F4FC7F154458E7560E2B3D1AAEC87B1F865893BA48A5D158B7A09478CFDD1F8D0538DDAF4341384BC546FDFF60452102D6442B4DD79CF3459408EB30C437D256B5C5C3F41DDC3A0FEDA62580CABC9E63418705799B73D5F9AB1DA04AE7D038E4085CB43C8C6222006D4809900C86741D737E733E358C2C3A57C6696AA51224549EC54AC09FA70C +smlen = 2140 +sm = 963C3A0942B9AFAE292EB808BDB4E766DA4B1B139A03970D3ED3FA014CFD1C456752BAFDABBC9541237092A6EC5CC9463903CDF89E91B5DC10F781B1EBA52F01E0D54F29B017EC84C4F6764186658F1E79E1B51B0FBC191D9998FA7567D903BFFB5472A9834C1B12002765D300E92E7A093D275F31EE37E972251F1D1F51DE00010005DC226C43D07FBC7E513DE6D6D2CB2F0702C827424CB79EDD580E6A99BF181130DCF8E8D51AEF00D7ABCC85477577ECE39A9036DE477030E9DC13394C09A30D166EF12A7BF9A67800295D45F8506932ED1C91C4515FC3D1952FA92D18E4B5128107B25E37276220248FD525A39A88DA1FFDAEEB210A1A189FE7E87E1C2D881F7D60FF3EA18145E8B5E86AD55BFB18BC3F6A1D193A27ED4AC8FF6DBE7DD560000902BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 + +count = 56 +seed = 36AB8588F5233D15674677535A682382C29968FF824031AF646F58FCAF0E83C1C486B1E75479149FD6F4D9E8397CAF73 +mlen = 1881 +msg = 0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B +pk = FEF2F4E0FBC14602D89492470C194E1A3FE63FE6D7C74854AA0B7559552209006F0A4C38CE79312F9989AA2209C6B689D5678E0D3F6DC060AB3C59D730530500D1214F79FEE5663AE4618AF8D5B57B941CD3C8CBD3A2A92AFD26461DEEE46A8F17A1E5FDEDBD194534BD8966625810A6A8EB9D652061405FEAA84DB7BF66840002 +sk = FEF2F4E0FBC14602D89492470C194E1A3FE63FE6D7C74854AA0B7559552209006F0A4C38CE79312F9989AA2209C6B689D5678E0D3F6DC060AB3C59D730530500D1214F79FEE5663AE4618AF8D5B57B941CD3C8CBD3A2A92AFD26461DEEE46A8F17A1E5FDEDBD194534BD8966625810A6A8EB9D652061405FEAA84DB7BF668400027BCFC167247C593E4E87781FFCB9EA335573520E89CFF68783B7DCA6441E601E2201000000000000000000000000000000000000000000000000000000000000DED2550483FBECE1371048E54EB1EFE63C25188ED1A382FCC467B1F9541506200AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1DD77039320C450728747EDEC180DF4065B248AD9086E9FCD06127B77D1842285BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000363D9469F19419F7BC7FF7F97BEE1720E4D91691EB1AFEC2A47F3BB21C1B0EA8C95BDCAEC17DB2DC93CF4A8BA6B557695B23A85DAD0416473E2005615ECF00238B3B4B2EB53DCC50D262867458BA7EF897D51A30638A21C518792719C7AC0555C1109E762EBB2C7C65DC8E744BA059308CFF9B45294D6F96C8F9D9614103DDCB783DEB7B5A7CE7E0ABE97B30B7C7F71933FD8A7F68FC408B65AD9457D1A85E2A9D990EE7329DA74152E14CBDAE3B4F8C09DD0B8683EDC0650C30997107666E58B8C6A0E53B5B228F5789CCA028F68B46F4403ED565A4F88664D4BB6BFE8D7B2E02FAB925BFC587D3616CE20B5AE98916758B8B24E6DF909391EEDA0C +smlen = 2173 +sm = 004A87B5E69574B9FD649FD763BA8B322B80AA9E30B50242CB430125543AE13CE8A9F7B714A969983152772DA1773BAEFF1D4F1B68194FFB1BDB504DE85E6C01F2AD363459A37D55772BD2041B7D01146D1CDD20FA5A94C56C35CC9EC022F35390837CFEBF95CB754BA94158AF4ACD051A0C0C9DB8AA61EFED937D213FC6000100009EEDF7F3A4B1D444492844D4CF866E7BA59C95CCA4A6D6DF303A0A789AFA216C1D9192EA4F8412A8CFC5CE5D6D35E822BC7E91FEE0F043C059ADF43C2009F663032F550707CB5EDE1ADEF5307C3B498664340949CCD71BE00705951F3F969168506E1462B76150B72984CCCF90F51AEC92C62F9C54C21CD78FC129EE1C29A86A38A60CBACF7513CD00A86EEFF2E70473CBD4F4B8BEBC4FC1ABBEA15EEB8C2500020B0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B + +count = 57 +seed = 4E94DD734A371A7C6AD4A567038CF93BAACE2B9D30F3862198DC55D2F21F8FDC9A7AE5DCA1541712179E3AB1FFA3F792 +mlen = 1914 +msg = F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE +pk = 3E2172A11D117B502553F8D8195E78276565E2C77E94B48E9407816D5791DF4E02D554E6CE6DA79342BCCAEF842E8F5EED9A13FD7740ACA651B3FAE01130F3008322F21BB0F1E106F282C823FD083FA3BD8A6044BC9B71E60CD2C24908D6774A9F1F0763639AD3608757050F02A83AB7C48363CC89B2C74357F407592AEB4D0104 +sk = 3E2172A11D117B502553F8D8195E78276565E2C77E94B48E9407816D5791DF4E02D554E6CE6DA79342BCCAEF842E8F5EED9A13FD7740ACA651B3FAE01130F3008322F21BB0F1E106F282C823FD083FA3BD8A6044BC9B71E60CD2C24908D6774A9F1F0763639AD3608757050F02A83AB7C48363CC89B2C74357F407592AEB4D0104C59CCD0C310E7BDC93C1E5A606459006B6FF34E588331B35DF1A7D0011BC4198010100000000000000000000000000000000000000000000000000000000000016C4BF94E48EF29EAC90F36FC73CEB73870811A171DC4AA5965C2731E49FBDA9C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBF78116B9C3D5FE0B4748FCFAAD402652D57A7E82FFB84A2E898E69F1B3029AAFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000762F7F94E8C5CA81203791EA4F9A8ECF7093ECE927A2534A17D0708000D8EDE54801016B05CF12B1B7387B71BBD41DB246EA46737EA926DC86D7D7B03CB105C70B36D21D8622785F48B20A66CBB29602CE41150F729BDA29C7866BCAF7B03A70843EFF90ABFDA0D1EB9F9CE5A09BD342A463EE3F07CE1B69CDC85D10160391833723AED4041B634F2F6DFFA3045F2EE3CD19119D2BA23CDAFA47453FE32972C04002DC54EFE1771E517DCF370980B4B1E82DA9185385F68F80FBAFCB0A67FAFB1B97EBA10C3DD64396274483EE1A2F1A2BA6D4B1321D9813A21E3F98EE3AF57EE68178A38E92BBA5DDA135B75A8978421C1B507A8453C36ABDFEED01 +smlen = 2206 +sm = 3235BDFAD6E3880AD7811463604816AF5BCEE401E95FAF5F5E03940DE7EBE66BD947A8D3C4F5AFC0499E720D64BE1BF83025AEB13C4963A1D77F721E9FBF0700780CA2E78B2DFB1211A33A68D46D9304100B5FDD9C803EFAF2490645A98DC1DCB8447454320F54B353BAFDDB3782DCDFB8CD801B6EFCDD675764B2D0654DDF0001013DBF7B122685CD6D5DFF0953B5684F2F77FC5D4918EFB5992E3176A9FF44F03C5243BFF53FE43764C76B03F5115E6EC5F1DB7AF9457F7A748CF2AB0965500E133173975C04F8297AE4F192A932978298FDBFE238C259FB2CA7DEE8BF75E965128CE9DB780C413F58BB026E56866F1E9FEB76BE6C2F4D01DA7FFFD40AB83C75140663207EC3D7F1CF8FB25F160FB72146F713C00F9B4AB7BB856E2C838F4761000909F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE + +count = 58 +seed = D9281003AC5F7673E0E9A7BC29C4ED75E6B0F228DF49D11A2599BFF2DA9E887163BB26DBA4F071FBCE02891540EC6F1C +mlen = 1947 +msg = 437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF +pk = 3003C366C7F9EC3EE0F44B9EDFB35BB21E06B6959912C2AD18EA0F71837A647BF39A5C08FC920E27BBFE621A62F072425423B13517974B475B48BEF3D4F8A100908B381D218248DCB537E00B65945367F1CFFB5976B0BCF5BBC8EECE4885E19A87DAD6351CFEB70FC3782DA6A510A84CB626FB8A6AD97CDA8954EF74D7A3B50002 +sk = 3003C366C7F9EC3EE0F44B9EDFB35BB21E06B6959912C2AD18EA0F71837A647BF39A5C08FC920E27BBFE621A62F072425423B13517974B475B48BEF3D4F8A100908B381D218248DCB537E00B65945367F1CFFB5976B0BCF5BBC8EECE4885E19A87DAD6351CFEB70FC3782DA6A510A84CB626FB8A6AD97CDA8954EF74D7A3B500029F3EBC8BF1A8E6E057D21D4CA7812FC76D3754F7AD619DC4AF5CF936005FF0986F020000000000000000000000000000000000000000000000000000000000008CE7943B0ED91B76B4ADE07643A48021C54000FF33A7B0A8FDA32117FBCA9088A8FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55F5A646E4929E0829B929C8337F3FC2BE09D6478D3B250CBAB166FDCCA46B2427FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D7F2373B6E1839779994191E08E63E84AAA21863B9AB8BFD5772FC8F3871D3D2E655CC05F19FD043A66A3A2665BDBA37982E0A02A5F2C0F2B9FB8B8913DB0B1DDB70EA478CE800304D9E914B4EBCB19446397711EE33902F28D0312A0EB79B27AE3AF90EFEFAF9342DD161DA27E4A8C9E847AA02FAEE3E0ED27B8B4FDD041635737DD18F1BC905D5975A7FFBEF8CC525A2FE0A4166142E022B577B34841CE7D9B5A4DFD9C020C2B62022112150268A247E0270A7F9A6B64186D3139207056CD65785351955DAC7BEED6934EB464E20856F71CBDE609C30DA0B99ADF83C2345CAB72DE62362E03E048329E62F4AEB460B77A81E6D21A6C9C39646A90C +smlen = 2239 +sm = A9E134D68F216C77CB2D6DCEA469BDDA448CB2F6E8AE3E5F3DA56FE52CCD5E95C9221F3354A750455D72FF9B8FB8885E690193B7DD27683E86CE73DDCA621B012C3EEA321D7199629117B7E3D587C5A3E8F0883920260D5F211D6A9DB22C21EF8B993467439941984283761E8844F37D21C14F1D1AF9D4720F0229EF531EBC0002009058F27B9746BA984396CB8AF2B11A7C5B96C93D1858D792C83430C65C3BA610EBDE0C30E887F260E2AD4AAC29D81B89855F0421CC0AD8EAE05CAEA78290021A0D1A417AE4A2CE874278384A2C8A456657CDC4088FD96206EDC0D18210F95515301D842049109CA2E356CE8D1AD682C796056F94FB597947FB700F73941B830A1005A0ACA4F0AE4C0CDB95803E0098C0676548AD8191E482C9CD7265280E6E00040B437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF + +count = 59 +seed = 750A74866BE8DF4E60BC14BF36E6D83ABF6DCBB86792D125CF0980007C5435F40F87BA96498A88252D9C5C6710807652 +mlen = 1980 +msg = E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF +pk = 37D3E6618A0EBA2105A1942FF02C24217BB9FB7FC3F31F7062F451CFBB9EE1A7838A5AA9B79F6E2C430D6863B49CFD44708C525B5EFFFD8D092289B100263F015014AC17939A718D7CA66F7D9B8FAA6061D0061BAC11D736200BA91B42D36E6B97508EFB43D092508FEA5F3E6D7CCFF3A945A88BB0314C447436CF017CEE5E0111 +sk = 37D3E6618A0EBA2105A1942FF02C24217BB9FB7FC3F31F7062F451CFBB9EE1A7838A5AA9B79F6E2C430D6863B49CFD44708C525B5EFFFD8D092289B100263F015014AC17939A718D7CA66F7D9B8FAA6061D0061BAC11D736200BA91B42D36E6B97508EFB43D092508FEA5F3E6D7CCFF3A945A88BB0314C447436CF017CEE5E01117B1776F905E18C7E4DC1A13E90D65E13448696EFD9186967719459A561CB558BC00000000000000000000000000000000000000000000000000000000000000092B244E43FB8234AA46FFC9BBDFB629C0D6D8EB7EFB195D8A7392C4B459A46B5BDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFA6A7767598CCEC95DDE18D78C96FEC2A1CD1D36AB664CE8C1585C0ADD0F053BAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007B96F473302B865BE2B82625AB4EBD418762118CB8BCD51FC21E1D7C4C647C738300F3B21E82CE169F014D773D095E3CB7D87154D1E990C34F9F54EE894F087DCD59C9EBAED687C637AEC302ABFF1D033A969399F0E7F2F6F6BA571A2A352E5B6960D0080D6B7D7EA34A404A9F6C0C274F60413CECBDA2A6EDE42E8939037EEBC75F8E962C83F0ADCA83444931197D02659308ECE82616B1CC5E37A9F534200CBD2D533E9BD17F4480ABBB3DF1A2397CBBA17D6F5028233F57DEB58E033F2FED2982549E8B1C33FD9E3624686DFD16816FD2AD150031A331E78AC869E9CD5E20FF4E981F26DC892FC79FCCCE1F9F425D6633577D6496125B4F65FB07 +smlen = 2272 +sm = F48CA3B53A82D1E6D9767431D5F694B8247530967FA2B3467F6AF7CC2F4D001B8B9AAB1CF912AAB1DFA3BB47059914DB49CFA757015573E00BCEDF368D432C00C4451943CB3C8944164B0CAFAE69CB39FE5EA649BA6009AA912D8F0B5F9EB025F82774C01422E9413E2859FCB49FF3E660FF60D525D9DF161607BB5F086B6F000000B5175521E8F7518CB0B354F279C7BF26CABC5BB61CD5DA3E24ECDC48637EF324DEF6728BD54673D088386347A7C37C204D4723D213419437BC7428CB5512876577606644DD2D49F325BE52E8B804BFC9358B91EC0292F9B7FA6027D87CF6D72C7DB5AC40EEF5A88F4FF1F06B1716E7C7BF27EDE7117B9E3C4F865249CDB00605203477CD46D9032E8B858E6539CC51AD00EC32E6BFA3EFD76849E1EF85F440000909E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF + +count = 60 +seed = A832D4AAE8076C4EFE8319A74CE315928AB765BB629075254CBC63EAAE691C220F4B5E1839E9A99D8747AACD7C2F1EE3 +mlen = 2013 +msg = 84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 +pk = 811EE8A347FB4C73210B57171DE37CBECDD5CDA8068F4E3BF5E0CC870961403E0C56ADD308216281DF18612118B9F4B4F9FF91206B6A5585CD2B5C9B5E02F20057A6CE3DF70F77F8BC515D95BC39A05522F940091ECFF7CB8C5C508285B7056660921184AF0592E34E3A43F05852897A98F9199D145BE9B2927B6C5B9BE361000B +sk = 811EE8A347FB4C73210B57171DE37CBECDD5CDA8068F4E3BF5E0CC870961403E0C56ADD308216281DF18612118B9F4B4F9FF91206B6A5585CD2B5C9B5E02F20057A6CE3DF70F77F8BC515D95BC39A05522F940091ECFF7CB8C5C508285B7056660921184AF0592E34E3A43F05852897A98F9199D145BE9B2927B6C5B9BE361000B2365B9CB4193A7EC3C9997E693F5F34E397164F9F547EEEC9669A3BF0CF9C4B4D300000000000000000000000000000000000000000000000000000000000000B87617DF078F2025E41C678E4C94A62215DA2D517DDAE6C5E7F73DD3827D74D3AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEC1BD17FBB07890FA5BCA63F351C119B39A66DAC5A4B82944CCFA0795896C1D9FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000928E9D98EBC7BCCCF7AA00688AC9D5D01EF3DDF8BBF789FC9F4DF4646433B94C5A26597307191FB9EC2272DF666CE917F57092FDFA78877C6ECDD6A05A7A087B8E5BD30EBA2C82062AC5A88D1896360744E5E51040D2CCC3B8329E087D27202FD79EE80F0989520B46E210E22EB7BB08E00E16A17A1E1DC6485EEEA8CF0315472C6EDCE966E776BA97656FA8BECB71833D588D5F02E99C28725AD87C790875B5B2F7C0462F1B2413790F1D90C6E874E29E63E82BF6B90DD866637409069A52ED91A783E26616BCD504B7B0C075AAEB73754CA98FAA0FF737847EF93DF23F5FB453D227274E94EE2B971F92BB968299A5BFFD4CF303126F997A69070F +smlen = 2305 +sm = A214E234E71D318EF4FA2B10818ED1C54565D16A01A87487236AA327E080930F59CCDF7FDCA499528C8F3EA5379E2619461635B324B337B521CF61604665ED00C18836472E25E62BEDBB57A3C8D43EDBBBB7813D294CFC3C772224950D709063CCBD3C68714E395CE5D1AE26FE3D653FA83E96BFE7D28BC91E2B933B2AA99F010100F379EB2C7015E6104FC6B178AE5E15E2314B67B48F2E92A94129EA200CC3CC0295907F46D47B9914850D0B10A2A51B81D60486B013133A078A628EB063BF6B1D89B21797EFDA5B06A008634A011A1008700E666C50D6D0287AAF5FF468013802B6CDBA644502B61374526823E80A14EDBE79CDFAB460DB0AD1912FD53EA1D2287DBBE80C99C543234A839C26E855D3AD7E2EBCD0D47003F3B440E9804F667500090284C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 + +count = 61 +seed = 09B8441F47235EFC82D71933A0037FA4F69124C3BAD4EF6A3A7178B417A3FDA874081B7EEFD7EF1BF234C752458FBBAD +mlen = 2046 +msg = 92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B +pk = 963001E677687EE54167796BC53ABDF29970E6B93BBAE8B1B42314EF4024A035C715EAE42CB2F02D57044537767E2E529D9C2FE2EB2E840965CB8ABEE70F000093FB520D27E4B3C597F8502B226C1E7271F3559C1ED9F2ACF1F37622EB18257A5DBC2E30AA0C44480A40700FB7E72FDC279CB776B8FB4D71374B8E4328CB610006 +sk = 963001E677687EE54167796BC53ABDF29970E6B93BBAE8B1B42314EF4024A035C715EAE42CB2F02D57044537767E2E529D9C2FE2EB2E840965CB8ABEE70F000093FB520D27E4B3C597F8502B226C1E7271F3559C1ED9F2ACF1F37622EB18257A5DBC2E30AA0C44480A40700FB7E72FDC279CB776B8FB4D71374B8E4328CB610006470541B80C81EA86BF39D073B54AF7C4E5314E75D36B52AC7AB7DD9F4114639E5600000000000000000000000000000000000000000000000000000000000000E8C00355FBB4B6D1E075F5755220B39C8C451EA69AA04971EB915B1685BF33B2E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3EB9CE7E204205063ECF4C1F507686A2BE33F89F7D05EDC632F76F7037688B0ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033B55A54DF921AD96B869A94521EE3BAA7F00A4E8A2B8B8B78B2725197EB70DFD7B52E8CD6E1ED3D36F0BFDA5F4D5014FB3EEE288725CE47695F16CC1B0201E7494BE559B0329B25F106753850F87234864756E57F749E7C0E4185A2A24A638B30347662134EACEF89758AC9BFF6082EE2656D294FCBA6F3E61DED994502688A1E41F2A206399A0381368895D0F8AEB356A14613D4132A6AC422D5FEF3C559B8B7E7C10B22B80B7824D5C85BED08863C4062A5E1DB92009A1CD646350EED2220E7627960C5B46F6C68FE2F7EE32F5EC1D47A0C861874F7C934E2D4BC5FA60CF0FB2E894297CEC5CF63FB77E2495002A5EC857C18195402C1CFF3350D +smlen = 2338 +sm = A314BC20FB5410211DA680E4909B07209D618B12B9CE477E5DE305FCA63576842AA8ED0BE11505A4729A6A8B84630E41E03C5256592D0090B690E74CAA9C6A01CF33EEBAF2146ACDFA86CC5105D16BC4E3D754BDBEAE5CBAC8BE5CFA2E29F590890A17E2C598DFDC1751BC8BCC16E96AAD39BF9375BA3D8917E25BC90660230000004FD2484877C4D9381487DB1FE710AF9A9B5FFDE610AE7E4D911FA4AF059BD51A0FC7FD8B4D1258E2BB8E18E6E11623F801DE3614C9EA19A6D61DC61697F93C37A720DACAC94E1DE583553DE178309C8448CB38EB666353953EB2AD8032611B519CC3FE8ED9B3134B278A73C13BE08EB7E2D9164B9E33F035E1645B31F240B06DD58A90E4BBC0E57183AA4F061E3866D7DC4FC0287E2563BDDD19D43A6F7F5400060992D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B + +count = 62 +seed = D2629CEEAE5C95D3C34C1FFCC2338B4A97782BDFCD39111E18540B69DB035B352D012857111F816F03550BFE5F56ABEE +mlen = 2079 +msg = 7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 +pk = A7D56E600D4CCBF36A4B26296D1A55D4F4E780D27F93E3EB5757106BD17411C19E8471ABC39EF8702F958DE59A65BCE6C68331E47177F7C3AD59FBB242AD4300B3ECE13186FE0595A23590B8CCBDE883B5D0DDF6568A54D5C9685DB3DEBE6E7BE738900490EF0CD555F4BA3007170E2FB1F26524FEFFC340A726D638A6149C0011 +sk = A7D56E600D4CCBF36A4B26296D1A55D4F4E780D27F93E3EB5757106BD17411C19E8471ABC39EF8702F958DE59A65BCE6C68331E47177F7C3AD59FBB242AD4300B3ECE13186FE0595A23590B8CCBDE883B5D0DDF6568A54D5C9685DB3DEBE6E7BE738900490EF0CD555F4BA3007170E2FB1F26524FEFFC340A726D638A6149C0011631F45F7187BC06A7E3F5AFBB441837EFBC87D2671D2C60ADB78F372A5344DF78800000000000000000000000000000000000000000000000000000000000000FAF58EC683535F4A0DC7C866C9D7F07774E0DBBBBBD8A9977CF12DB3601DFC2885FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3334962CFB87CC812747D8A7341F26D95E7C967A7F96BEFFC4A5CEA5FAD8C6325FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000937A1FBF95D214C431C18C0E1D612A999CF7916499F566336B6B966194A5540DFEB24727E98E968A954701894B9EB02D6B022785FE0A324D95936044E4390E87EA1041A31767BC810125EBB2F91701E8E10EE0E5A979930647FB458C7E23C281124DE9C203AB9480BA0B51F475A4B550DB3735393088A7494BD9E0B13205949913EE58BBC4823158934B7BCFA4F2978DF38B04FA0700274B9D5ACCF3B33AE4622B92861BE21D1C5D1D29524773C48F074CCB5A451CB312BF4593B3E4065D2A95DD3AF4012ED159DE244425DD50ABC39EF6767403DBE4F7E5F6353C73FD0BAE461309BA78BBD3EE72F4D444CAE0E2D2599EF7A950A04446870DD6F10E +smlen = 2371 +sm = 65FBA9393D36472C2C68EB3A86065A32208033C8DD9804193F092A7A42D46E2469959B456DE84EB5E2D528EB0403F5D19C30267A6F3321EB16B49913E64E79001B51B1E7E673AD3908B62C48B36D363988DF3612CEB45A2E6BAAC2EEDB9A05DB667963B34AACF54D8D485F0A7D58E6055AD756D2806402D1C45DE15E51F187000001D3DB22EFD52E14C24976F284908C2D1CFCED45D8F1F958D2D74014B978C4D17606DE6E1D13280610C328E98AB2C3A5E55D4DC76B4DDB4D9D41E8CB39737E7E685681407282DD0172903DE0B76EB29202975E3315FE5ABDF8CD762A69E4E2A9572A4BE4FB858D5CA31C87536C13D30834ACE98785B2E7D0EB8F11B6E487B099406014019060034AEE51A69D4C6220C6C8E5D5B336F440B1E71828FADA309E150006097F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 + +count = 63 +seed = EAA4FB8EF0290A499A1D92EE398A8D7E71CD3CBF01A36750DA4B7EFF175DA26D17AC4ECE49A84C88D1D2C2493563C26D +mlen = 2112 +msg = 2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 +pk = 095F12674CC3D585AC0A6A94973082CDF14574E9431BC0032A987B076F26FEAEF983CEA1A40D15F48E2A41E45FDE000DD5A68F56CDEC72DE30A7903E0D2942015C3103DF230443C3FEC7905E0FA1DC687543C673D110071E83FDF14DDE030FF8CC1999261B5901770699E07E5DAD9D0E81B76C32C7E770DDE557D0E6869E8B0110 +sk = 095F12674CC3D585AC0A6A94973082CDF14574E9431BC0032A987B076F26FEAEF983CEA1A40D15F48E2A41E45FDE000DD5A68F56CDEC72DE30A7903E0D2942015C3103DF230443C3FEC7905E0FA1DC687543C673D110071E83FDF14DDE030FF8CC1999261B5901770699E07E5DAD9D0E81B76C32C7E770DDE557D0E6869E8B0110870E7E70C1FE5A25EFEAA17D7204154939B0A2018DC7D96DF60F1BA44A39FF615E01000000000000000000000000000000000000000000000000000000000000F8EEB9FD235CFE61FF2B2DF74C17CE447B81038719464C4F75D41B885BC61FDF9CFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8935E835C889BA517113AE204501F6DF197B664D34B1F5BA8C38785CE5953D9B9AFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005A4BC0A8245FE1588FEFD4D3CCF81C048975A73246B48CBD508266F9FF885935D37847C91FC45561756B9D8E4AA89D844AD03608E856DC5BC5F341BB9AF700733BEF7A56BF5D237C0F002D57DBAE77B1E6C394E9D5E03F8096B0A142A3CC0D890A8768E0BFFFAEEDB76EC214B958E7E9BC739D4424337C17A46384FCC9099DF29BEA5C69F8E38A364FD508D0ECABBCAF9EAB2ED1A4B1792F484CF2F6F1BC25AF8038B41961BC839F3301B8BBF888DFA31CB25516161A7DBE22F8AD3300B3B1B0591D3E05BC5F2CA925AD800B337A690689AE31B5943362DA5B169CBB981EB3A07CE6B82F0634CD10607832DC41612901003083D84DE1E788B7111605 +smlen = 2404 +sm = E31EC04ECBF766A665083AA4EE85244FCA1A6327EC2FD15B233B53711160BA3212263372CC9C0FB44DAFF7EAFA99EFB5D9DAF686280B3FDF86A0CD14D26D9A005A6015D5853E662007CAE175534A1CE7E221EAA71ABAEC2BA50696FF59045274011AD72F0C9086BAF20AA4ABC23B38573885975D77CCC40A05704434DAAAB1000100F4648D7CABC2571D0CAB3A3BCB0080253DF86559D7562BB897C445AFB7B2942C376960FFB85BAD76AB084B7689B3CA739EDC24B03298F3E8B43611D0EF288528898A9914ADAE73E4E6EF43C52C39195FB93ADE5D1B3E49CA01A8AEDDD632260E6E7DB77B0B8248DE08F141A13E8A7CD4DBCC3399F0844937998D35E0B6CBA31393FF08E10A9B2537F5EF1506863D18DE16D26F104BBBE5A568518C36C0137A0009092E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 + +count = 64 +seed = 5909111F333F3E939105DFF8532548927EBF289F31A72F4C1B0C66816D8B68F64622F36A9BC85E63601BEE8EE7CB3DC5 +mlen = 2145 +msg = 5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 +pk = 66E055A31E7BACA431BEB5E53DB7F833BF46EBC24EEA56D4A812EB7E89DCEB60BA3229B20A52676FCBA2F228C16B1D45C11C3167385938226155CAAD54BE7301A5EB1A0CB8366BBCFB435DA9AF5684D22319940CDB55A85CE21C9CED8C34D9D5A9C344BDE439C1C90D1B98C76A3958CF14E4CB418858C6FBDB56D8F7744DE80009 +sk = 66E055A31E7BACA431BEB5E53DB7F833BF46EBC24EEA56D4A812EB7E89DCEB60BA3229B20A52676FCBA2F228C16B1D45C11C3167385938226155CAAD54BE7301A5EB1A0CB8366BBCFB435DA9AF5684D22319940CDB55A85CE21C9CED8C34D9D5A9C344BDE439C1C90D1B98C76A3958CF14E4CB418858C6FBDB56D8F7744DE80009074B60545CAAA92CB379E43C0DFAFCEF786384710770B88BD89CA396168C80F54200000000000000000000000000000000000000000000000000000000000000A68A55ED7B6A3CA2AF3251E48D869032F6D3A6E4E7CBBB64D3369BB12318D6F6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D9B685D3A5929D5D3FACB33661F0F1DC6364EFBA4DC9B901B510209C1C92F67B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A92782EFA7FD1D04D04908386FC7571C14B0EA6AE14E9C871B43FAA36AA4307CFFE45D77A14C799D25C73151333F31D380FDF15A168DD939F70BBBCC05D50655E07163EB8EED71891F6AF3C4BB333F842E9FEC5FADA7CFE0540AE47AFE99F3AC9B15F054C252594DC329C8C6336BEA466AB2E4161C157768B25A9DDC600C1EA4A64A716E183433E9C58A3196869FFA9F8E7A7B0B97CA64FC1E6171A67DC17B91EE7295DA7B4E96FA02F99B2B013A375150E4A1D2BA798F68B7151D7A0A41826CEC3AB905FF9AEA869739831F69268881A12FB9BEA188880162183E81AE406426947F908925C0E919596599214490357D7B3DA4CFFE4335AAB60F520A +smlen = 2437 +sm = 310EE6336DC393BE7039DC6412AA5C069EB2DDF768C65EEC9B0EFA0BC121D00DE2E57FE453C9AD09B77AA3E2415FE6A9FD329D18152B78C7D9E6E4EE7B588501D62FE8B4B74449A9C15A5519034581542BBC9955EECF266F434B7908F96466D1EB9097F3B818129627297AE96280EBB6A10D9BD30DDE588A9B6F6222F6CCDB000001084A093170E3E46227291D8356C5C0BC7980EB764D41A163A33B0844993CCE7D3F745B18FD428ABCF0C637BDAAFB63DE52D0B3D5E0400C2CB0F9A15846F53F1A4282DA0C1EA8DD14E07629F437156CE7FDAE2BBA65862D3B441FB78518E32564423CD73329DC0CFB9EC61C7CC0327B9FCE2595C1F974191EB91CF6A49B25EA67C5BD1F5F21CA1968447481A416E696A0583C8A3820624A9E2BF5B2D5E06D6D000B025180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 + +count = 65 +seed = 238461A224ABEECCF709AB6CACF4EDD372D45E5F4274095273A49AFE614F2BF713134ABF68B4DD058E6D7B612C3658C3 +mlen = 2178 +msg = 99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C +pk = 1C38CA6A0795EF722E627ADEC106D37DF4EC9F17A59746FC1E6BA1FC1F8630BD6BCCBBB9790C02E1A1C2ED6714A93FBBFF0C1F7277F1FF3952581D88205EA0015886663D206A7BC59BA30610C485E6CFEF8C61EBC679FF3D42C3FF52AA81957787DEEA988E8A4832B19E018B97A82A7D4141D7692073CAA20F8863CBBA061B0109 +sk = 1C38CA6A0795EF722E627ADEC106D37DF4EC9F17A59746FC1E6BA1FC1F8630BD6BCCBBB9790C02E1A1C2ED6714A93FBBFF0C1F7277F1FF3952581D88205EA0015886663D206A7BC59BA30610C485E6CFEF8C61EBC679FF3D42C3FF52AA81957787DEEA988E8A4832B19E018B97A82A7D4141D7692073CAA20F8863CBBA061B01097329BC25EFE6C13B4F465A49D6F316B2662EB9AB38B9F192D1637DC890B750FE9D0000000000000000000000000000000000000000000000000000000000000054A89636F9AA49EAC2A023A4AC1C156F8352704BC7E11AE11CF0E06DAC63B1490AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA14BEFC81BE9EA8AD99C984A7CDC5DAAF435826B9FC3F825D374A7F941E5656137FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000876E4C97EEE52A1FA7FD7EDF05EFCABFCD6BB50C36FE89025E1142998F0E5EE97BCD2FA6C0DF630780FC88A77342F1F7949ABF6A38683C1FCF4FE11B1723062E8E76239E9519194EAD80FF900AD4D7AD84BF9377FEF4DEAF7AC3653A79696D9C24FBDF1B0BD777CADF208B594D75872AFA51A6A9E45413F84251C6A94A0EB2799A02D470BD5D051141FDA79EE81508D0A45D5C545BC55F29C37EA0C3931D8754010C5EF6D473BDAE33746A9886145E123ACE00FF29C4F0060AA11DDA0D99A0241CF3BF346B6BB0C665D8B6D4261E69EA37D47131C7628925848AAA630631F51AA486EA01B7E40239CC65FADB0D43203B04DAECC9FF372F641E6A7A0B +smlen = 2470 +sm = 785D0D3C46C0261D87800E2700E7C61AB3F9896EE736DDDE2A1CA19C7DD5361D6AA3C36078E7F30870D1566A794E98C1C3EB6088456F2526FA83C7A05D518801218CD511B37F82BB093A9FDABE09BA223C9F69EE8A42E61BD0B3ADF71FB9260BDB111C89C521C59E8C5DA6F1620B7871FD18213CB998AC1E7680793C5F129800010014F56F4D9EE235A7B3EB96293F399CD9AA73FBBE5E4DF48713A831E99EA4F010375181E5F7C6CD1D07848433306C58BE9D78C435E8D7DCF7283161AD781948355363A541AC0535C4779762770867FA1E97A9231103452846F069898AF9BD551C011FFD21A0743CCD09BD1EC8CD551DCA4525295201AE4E8941DF9475C7152C0FDF77F271FECFC808CC1102748F36DC04BC570DB92DD5518E598C63DAC9AF5900130499B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C + +count = 66 +seed = 83C653708FAF3E5F6FBC9DFBE6FB5E83E572A7688645D75D2C4835B28695DEA4BD7093740D0FF43237354EAD1C978BC2 +mlen = 2211 +msg = E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D +pk = 9C951FDCDB65DF2833810D557F4053D3B80B71A8BBCF564C604BE589F38C8804B4045FFA464C0CCC0846E8A6E9E4F784E92D16CBE188003977EE0566E4204B00141E6C75F8B860AFA774D38B815227F5154EA3DAECF354591182D04367E1320EDF031B60D953D86F9E725A0654F181D565DDF52198DDDBD53E537337DD065A010B +sk = 9C951FDCDB65DF2833810D557F4053D3B80B71A8BBCF564C604BE589F38C8804B4045FFA464C0CCC0846E8A6E9E4F784E92D16CBE188003977EE0566E4204B00141E6C75F8B860AFA774D38B815227F5154EA3DAECF354591182D04367E1320EDF031B60D953D86F9E725A0654F181D565DDF52198DDDBD53E537337DD065A010B236BD768C68E6DEA3290DDF915AB078A2A80228A0C701C9AB8056B0FE67DF724590100000000000000000000000000000000000000000000000000000000000088C48DC8717AE7781C5A0602077A65D25D9BD9F6D9513625D53D8C802D4B12707EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF636DDE7A7A7414BD2D5D00E9D924C25A144550EBEA77779BE2BEC43A04B56C72A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081FE6F4D5BD3341ACA3190C687CD70845CFC82CB3208CF308A4B8B8709472423942B488BEC896BCEF9869D9B6B13957572EC8BABD6FBDD833076E01F2B0400C52C1E7D8A88304E52898F91784085ACF7644EC83248278A4B50AACEB6216090DCAAE35CCCEE8AC1DC85D22CC6E6768E4989D72CB6140C6EACADB18448DF0373BE4258F2D895F3338C700A1724FE3871C6883B13E831B0535E95A8B47E9CDA82A572DBDF2809D45E16C9807AEACE64E6AB370CBEB7E90BE3585C3435F20632AC004D0A44C43FF17B6F5DD223AF0E9107F69656AD82C7E0034F1F6B5CB08B71218B938D3E8B282CA71E76A3DED6E1ED30537D4FFD38EA39F29010B04F06 +smlen = 2503 +sm = FAC411C71F2EDC54A13192BBDC9196297A85D0ED11B03748E32AB6565AF800637EFB975AF74F3F857C937BDBD61B1D02D680D22AEE219DE1CD4569ADD935720169FC1663614FE1A175849B72BA96CD8EDE7057CD2A28D57F6B77125B555D88FCAF969304214C3D8A67BAD752240135231C524109100D0C1666DD41FD57FD680001059638C7EFDBE4416E042F6D577517EA42107B87B8BB17FCFCD01BBD83E3F9CA1A2D996762B1BD9FE505FF7C25EBCAFF1C549CB11962C91C27170AA54406041F06C66DB98744EFB86822D26D6496960999D26126598CE180691D97FDB2EE0BBA18452978B59A30E13BFC04889A9D19F532B170DD0ED3E3433EE3387CDAEA05522F34ADB5E09902E1DFD79ACF7A63D673F64A799E54E12AF8BA52A2D5045EFD2F000209E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D + +count = 67 +seed = BC81485EE93AAD8B464B5199FFEF9FEFC06EA97645BDFE0B4E915B812E606A77F93917ED925E882161CBB909747AC4C8 +mlen = 2244 +msg = 89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE +pk = BD723A28E6710AF4FF0357EE32F0603C60FD9197A9CCC6DF79726A0C12A9931317A224C5CFFA0A62F9F15F8C8F4E0093442FB4567D4785D23A92D9AE89DF1B01F13F9C50C06082DC64C38FD1983DF8B56F7D8CEC01500BDBC6859E175F3CD886F29E32B4042A5EAC54C0DA5DF0FECB359D4AD7D1E73C533300F2DD3643E2BE000B +sk = BD723A28E6710AF4FF0357EE32F0603C60FD9197A9CCC6DF79726A0C12A9931317A224C5CFFA0A62F9F15F8C8F4E0093442FB4567D4785D23A92D9AE89DF1B01F13F9C50C06082DC64C38FD1983DF8B56F7D8CEC01500BDBC6859E175F3CD886F29E32B4042A5EAC54C0DA5DF0FECB359D4AD7D1E73C533300F2DD3643E2BE000B33C50D66A314987AEBA24D496E8E3A9D9D3F7D93A034FDE6694023A05ECACB494F00000000000000000000000000000000000000000000000000000000000000181BBB55262969B3AEE9EA01483AC78C94C32A085AC43BAC8F703C96AB396AFCD6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D5AA28010245577240E17919BC6CEF1A35DEEE36EE0677F0A05922C10A61DE062FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000553736CC6055B7E9C4DFE390689901781C7B8F001238C7B4FD40E3B45D129FD859FDF7E097DFAF7CCDBE4ECE8008A1214E7A22CB3B0FF3C4C2E1A6BEA996057EC0C96EB9260ADCA03BEB6B69A8E61EC5B793EB980C5EAD00CDF1424C0C72F81ED31E62C30A0280A9A68F844E4C24F1BE6972DAAAB0F6CE877C8BFD442A08E6A8B77EB73635FC3DB97BFFED4F2BFEDD789A0062F2D48FB7093C04B53C012D68AEBDFF27ACDDA254C9D92F7EFECA9080DA86B7746B5EA5D1BD933EB0AB0685F40BCFAF154F0B7ABE394F5EFB7E6462B6283B90CC1ECD2F932909A6E28E4FB42DDBC79034EE9405524DF690E90C436980BD0C96FD61AAF55A9A6E5D2702 +smlen = 2536 +sm = 0422F58E66C7A84D4F67B02644E54D6B982EE26B04C82AF927DF9E36B00930D05BE9C858AA6D7D895902F9B3B700A68F5D6696F5FAEF429FFE0BE99236C1CF005D85ED1AF5920A6052A48B9ADF8A08647B74BF23237EB9092A8AD4361AEA1747CB7823BE437B1CE1806FA3991C10499F5B7EF04D02EADE59806C117F2E309E000000AC0D2170B1F16FC099B05DC5AC2F324790E193DCABBD6EBA43DCF2A6384C7A5C758D24272B34FD161ECADAEE4C13DB06A35C8ECB1C24FA40516F92AD32576713FBD6A3DF344A7817611BA2104B2B7D24F3F7003300272A821A7BB6F4112F6B0360E640B43B3F1809EACDB0FFBECC0C11753D00630CB35F34495AE1DF414E201C5F5559976C1EA4410FE7FD2AAADC540559F3F39EE7B202EDBE434D4832762900090289D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE + +count = 68 +seed = DE9E2742591A5AF6A6153DA85A510C39FD31A2ACD8A8511F190A9A5E5753E63D9801A8019508E67DEB1E9219CC18BA3A +mlen = 2277 +msg = 8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 +pk = 8743B4495F1A9D92FCE89F8F3A451C4794FA5B25368EF6A25BD914E3F1145B6E0AD8C059DD53F1B3C3C19EE2A7F8AE5FA38468ABBC6E56C283658227784AB7002F6A0EA2145795EA3B9607EB20B1D825E17DB087DFB1AFA8FB94A7147EEB63938D5FE1DEED537DD6B39A6B5742E5E425A7F9A900FC77A71D78CA490F19352F0009 +sk = 8743B4495F1A9D92FCE89F8F3A451C4794FA5B25368EF6A25BD914E3F1145B6E0AD8C059DD53F1B3C3C19EE2A7F8AE5FA38468ABBC6E56C283658227784AB7002F6A0EA2145795EA3B9607EB20B1D825E17DB087DFB1AFA8FB94A7147EEB63938D5FE1DEED537DD6B39A6B5742E5E425A7F9A900FC77A71D78CA490F19352F00093F25D25CEE59DEDD98A2F8A3E49907860908BDA0A8C97D9991ADDD2D31F83DB62001000000000000000000000000000000000000000000000000000000000000728BB82BAE5D53C2B157EE6965A408A15046626F27FB0CEBF06671C2DDA2D278E2FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97DD84FB6A83C76500A51ED1B7BCB35C71395CAFE1B39EE9FB97A5E4573282FE13FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000712100201C05070AE94C1341714FA8D600CCC897119239D8F9B80CB45FE55CB00A37B2DBA40D471AE7E8C39DC4D5AC751E1525EC063134BDC93F7E45B2A50BE951EC594289E94C8FC35FA0052BA1491A697E8E78D1283312D728E62C6408529EE62D7EDC3F2947661CA18A5C3FE90EE2478C70D0BE64CF5100D037CD390735C1BB4092F2A2C0EC80F72DD5D2A4B7A01F24848710011FE3799C5947104F2D56A1FAAC5DC7BD76CA9A6A2D933760C9C820AFD9199D852B1A2CE4A9564B09844E06DAF827250D707245882E6E77ECCCE02D2984C916102688819EDACDFEB3B7C99FC32C673458BF3C3304927C59EDC94AC1560EBB540665FDC3A4683301 +smlen = 2569 +sm = 67C9B6557851F6DA0F09E94AF0D3D230359C309594B0841AF44D17B5D4F414605CFEE1FC8AB0A001C88DD3685AAD03BC53ED686B75A214EA95D7AD240B94030111FF9EC22D8E52BAC2EF5A680643E6F5F62794544DC379FBD4E58E2CF89AF6962AEF99CF4CC934B2DFF95D36F1EC2FE4E59266A41B16A77F1B5CE61F21F98D010004F5DB1E31A4043F52E24935E454A2BB00A4A06777AEC256060D731D329C4DE14E87D6BD5DABC82121AF41D9BABD70A7B4B185990A0B0927D9ECCA47F43DD781331EDA550BF74F9BE71CC39C426355C4E1C5195DBAB25392B04E3A78A134C5065FDA1E71448AF3F3EA99A421FABE9486E7B35FD558E53F8ED0441316BA0CD82179C21F0F1E75EA3C99AB0652679B7196A520DBEEA57A8142E4E2B788BF139F470009098337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 + +count = 69 +seed = 272E459EAB6A0BDF720E4C5B79E641C95BAB66C3CEE261D0E3596BB04D232ACE0A1CE24BACCAAE9037665A962C711B08 +mlen = 2310 +msg = 62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 +pk = 9DAF24D679D57297F1B5A98E1AF35636B42CBE88E29C9AFDBFBDB51404EE8E1419A73BA5002946D2FE49DF09B106BE7373E76EC2C011391B7F1CE1C951BA8101FAE1E5E92AA579F7372FF496BF01D33A2B9AE8F6C7494F33AD945D930C8A44D22AE3170B6DECFB45189F68ABB4D245329CA239A25C6F5BBA3AF3F20CBF27AA0102 +sk = 9DAF24D679D57297F1B5A98E1AF35636B42CBE88E29C9AFDBFBDB51404EE8E1419A73BA5002946D2FE49DF09B106BE7373E76EC2C011391B7F1CE1C951BA8101FAE1E5E92AA579F7372FF496BF01D33A2B9AE8F6C7494F33AD945D930C8A44D22AE3170B6DECFB45189F68ABB4D245329CA239A25C6F5BBA3AF3F20CBF27AA0102EF8D61EE8723D7F0C4FAD42584E0459C4C65C0EFF611E208EA61F6B42B99BD3630020000000000000000000000000000000000000000000000000000000000007AB90588BEB9AC779B36E2674994460FE6175C797BE0A35934734CC7FDB21DD519FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7389995B17B618CA23BEDF8165B7649A7992713EBB54B84AC881D78E6E252D2BD2FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003D0543AF86B6BDE0D9420804F2C7216FAADB941EC03EDFD822E406F6BCF997DCA63D58B4F95AEB52893523B852934D64B0735FC205FD3C991EFD2D93292A0E911957D544A3A3C02D89D64E83EA7E349BD7489F20757674B097FEA209FA33CB11F855A9C155EE55E6142C199B07DD234B4D2DF9CC4191EC31437614311908A4B57F60ED44116EA61FC1FFF9D78C540B0968CF0CB63C54A4C8CEEEC27F77D2B2BEC3C6AE9068870F5D883936D219D3AA7179BB88BE0F47229CFF7FD850066362174E6F014E7AF23E04587827725071EFA32BE552665331A5BFFEE651234938C8EC49DB77E682A08EB774A8619D907953DAB6EB9986318E3363FEB72604 +smlen = 2602 +sm = 0D91298C1BB89546C5BF9B197EA21F9F6A4B9B8059B65C0DCBBA7F0FAA83CA4DFA740AB119502B56D44E412F522D7B3341621DD6BC049E7D2486777E4FF537016766DB314FA9AD950AFCAEA1D48A46A1C9EF115EC8A132E3B70BFBA11EB91C26D0E31D2312EA610C0F43CA91421889603B35CE0F68EE1E757BB48A0683BDC30000031FEA9728728601EDBA4DF977337CCB33D7D61C22A861B49F7334AD1323A79B6C8366EE058AF3ECE5C80B13BD968F34F651628B36D20A0F90AB411BD20A073C1EA21AB80607565C5A4D944788CD049E54E36DAEB8F763FD4944FA7AFB924FA069E299D93DB0C7852237886EFC19F5EAB54F411DD33D555289371C0490C1EDE10BDAA7D748A3129DAD84899F8E04D981B6C4969A81637C71F4A29EC597FA227600020B62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 + +count = 70 +seed = DCC58DFC13B035323ED44BE50A7096F697C9C143518FED50A59181160960203831A9904847BA20B85E99FFA63E4AB0B2 +mlen = 2343 +msg = 954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA +pk = C2EC3391F39A55EB2CF1B8C3FE856F54732F10A9A7B10F97A5A84A28025271F4D5287CFEB9B0316D0AA40312B334E6020F8E1BDD8E08AA0BAC948B2BBFCBE5001A704665FA704EB927473D420C3A55F2FA457B5105C0775B8E4045A1DB954CB799C52406F95F7CC3A1C4DC32AE0A1A0D5712605CFCD529902718262FB8D3A90002 +sk = C2EC3391F39A55EB2CF1B8C3FE856F54732F10A9A7B10F97A5A84A28025271F4D5287CFEB9B0316D0AA40312B334E6020F8E1BDD8E08AA0BAC948B2BBFCBE5001A704665FA704EB927473D420C3A55F2FA457B5105C0775B8E4045A1DB954CB799C52406F95F7CC3A1C4DC32AE0A1A0D5712605CFCD529902718262FB8D3A90002A55E1BC6C918A16197A792CE9A680B808A1F145B86137E181F72974EDEAA8288630000000000000000000000000000000000000000000000000000000000000042D53E8DF24AFC400E1D7089ABE6E746F32EF3DD4E3BFBD8CC6D322509871EF475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9767FA21790BD78924DF5B0ECEA6454DA2757DB274DD34754E5390578D942672B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026156E8AC156135CD3ED60EEF3D9BFF32E346F96A91D02FE69D4FC5CB43FB0B9BDECA6ECEE47C42F0E70A9A8251A946038445134AEDD53C110C6860F7D2103DFBA0FC917AF92A2185F697B619E3C2AC46D5D00DD99D345EE142EC8FD9230272EBD5DB28A9A2EF64D2801AF860F123AE4427AAEAA428E1B007AB73E63670A0B8A28379013BF9333B17FA29F0E0B4AE32CAB2563FD3C3822611DBE35FE2C58F7CC237695C4CE56B1466B5856B98043582E4977A5F654DB736A69401A4A094A9D7DE06817B4828E7020068FE722C6F7B17A5F9B662A08AAFC0E4C79C6CCBF379902EC2DC36CFE9302F053D7E59459AC466DD0783F5DA76855CC45E1C904 +smlen = 2635 +sm = 9A01CD0166471A026121EA4B71024A5E5D04154C9A123AE56F9516666F6168258D44256161BF6B4EF69F74774A5816855428C9290100CD8DC770C391941DA5001FC0C84058974B756767B71B74043770512E980545D6B82D47E47194BD84C891B15F15BC9573CFA241AA1F345D627987720FFD2DB511F666730C524FBA981D0100012BE3D3E1316D3D6E940E6F851B463BDC03505B05973ACA8983EE9E59665899571194703357974DDAE41596CB55A6AC07276850220495539DDDF9284E7D3F3008FBEFC21C58A428B9ECBAD394494FF5EB4F275E437042D356D5C68DB190948645DB3FE330F7594E68C9A6CCB188CD9E81577960C28A7A90B6EA119A3F6CE1D059564C82418A7604BC10A70537AD8335F6C4258AB00C9038EBC92DB02B32E01F000411954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA + +count = 71 +seed = 270BEDAA7BCD43990FD8B4F44FFB63A3AE8E991BB2BF84DA7BC2CCD1A079C579AEBE2082ACBAB7FF286DE795F31973B4 +mlen = 2376 +msg = 326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B +pk = B7DC0AAA9BEBD78AC4E5B404C52442BB4C1189A89C2EED0BDC87DD05AFEF4A8BE95552B1E13B8C10800B5CA339EA77D96E5427EB5115C4697D2874FDA39473002A9EA343F3DD38797D32B57E1734158ACA6AD80AD8A9763C3058A230126675334E769B43841E15FECDFDACFD5E4E0B68BEB3E8B67026309445280E42F49CD8000B +sk = B7DC0AAA9BEBD78AC4E5B404C52442BB4C1189A89C2EED0BDC87DD05AFEF4A8BE95552B1E13B8C10800B5CA339EA77D96E5427EB5115C4697D2874FDA39473002A9EA343F3DD38797D32B57E1734158ACA6AD80AD8A9763C3058A230126675334E769B43841E15FECDFDACFD5E4E0B68BEB3E8B67026309445280E42F49CD8000B599F6B77391E43061B37FF89D203E70A987A98FD2952DCD4CF1F27D09E9B9382AE030000000000000000000000000000000000000000000000000000000000005A442713C9A31938DF3520010581C63254BF20C15FCFF57A4BCCFBE0FFA678E93AFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5474B2A87F817E73DEBF1B7E437D0DFBE86021660E78662CD37AC00813DC26691FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008B2361AA2D7A9564889760C938B98855779174E12DBF39B69ED9CB923F7689626550FE7FA951A6578B0E5AC6B87A266E02C44D42A7F487E471540A7C517407890C3FA1309E95C9DA4BB5E43ABB1344E3A1956666D9ACA9545BF7B824800A4DD5838842C21C80C0883AE19077823CF2E42E75FF52D1FC5502A62BFDEE6D01B3ED5E7E6DC504EBA6ECEC7E69754BB2D05AE8AD7D8F07E31ACA2CBCC5983EB4819018CB3D8158979D75E47A248498EE1DDF7CBB84C0AE58802275D7A5E30B9EB5445456274858930A0F1A3C4DBC6413DBB8A2265CE5EB312DE17881A748DD3ED2BD043ECEA27A79B6CDE999D62746EE85D7AF7075853BBD17BAC70BF506 +smlen = 2668 +sm = 9DE20B3488719A9D40A54EEF13D74562647F17D001ADB341D557390F0AE55F866EB5DC107F27C7D7230BFFDDAF236039E752CAA516E1B141FD0D7304BF316601C89A363D90F5FEDFDB6C3CA73AE05036E09ED664DF8E9E905BEF1F3E0D7A684C2724E49CD4B297FB5A2F8A32AD9DF00DBC89381BEF9DE11971FADC12284BAF000003F9038B4A985536413AB8658E00AE937B7C9612BC99C43780F379AAC28978D2081A209DA588FD990BF97DCEB558AEE6F3CB1A87458CD2E70A883C213DAE36B536E8ABBA13F25C225E92DC4EC03862D428997C86C765F76E84E623A4A89E6AE700781B1959ABCFB7879E8A95691DAEC4049E898DA95098E21E12F11C5DA1F4F7264C4B78F6739A70F5DE207808B284CAA44C695F6E417BC72174B27A41CDF00500090B326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B + +count = 72 +seed = F151196F55A9ED88F1663AF6BD24B2CB9DCAF3C9B313CD8F0A27639D3CDAE72EA90D60ED5C7C6AB697A06185E5A2E215 +mlen = 2409 +msg = EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 +pk = FF341A164747518C6241B33555318E06D5E686703E89F47AE283E72927D95FBC16A83E4A249C5EDF0ABD7FC9412CB8FE07A69872EB00E06782937F9B86984501B91BCB2C16EBF592E4DB81DE6181D896DAF06161D6CED7207984091E082AB229C2B1E60D07C8DDA12A51DBAE076A0513C5E7C107872D2CBFD261AB84EC59350113 +sk = FF341A164747518C6241B33555318E06D5E686703E89F47AE283E72927D95FBC16A83E4A249C5EDF0ABD7FC9412CB8FE07A69872EB00E06782937F9B86984501B91BCB2C16EBF592E4DB81DE6181D896DAF06161D6CED7207984091E082AB229C2B1E60D07C8DDA12A51DBAE076A0513C5E7C107872D2CBFD261AB84EC593501132D96229CA6B724AE014D303ECF93D9D97BAB424EE7E9D5B0A72F1096E02123731901000000000000000000000000000000000000000000000000000000000000B66E137A7B11295253E45304A4F878788AC166DE729908C41EFD55FA4D5B305876FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBC51B19F0B20C9D949219482BD42694D23AF92BF112BF24C6D68C2AE30B35DCFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005F6CD4C689FC79EF48EB7686DD8CA84DB538141F10457AB953E5ABB1FFE200037124AB2037924BD6F0AB24789098BFC74EF8E1768DBAE6F3CD806060C9D008EDB089F2B1C193A17297089FD9F23DC57399E182E7CBFEACD58AF582205917D3D847FF81F4EDA6FD8C3E386264D588F63EF2262717ACD9836711BE0FB1370A9AB4EDE97DE86D73292849DE6760E4245AD9590BD2A33D4E08A0CCB587C8CC4C482611500B4EF0F43D1BD63DAA8AC86C4E8573EFF8828BDD503EE61538220CF526A6B237F4471C028CC28404FE64C4C88F75FB13872589B9A81701EB3FF20715507582FC682E95A977C15C970B7A4D21E0ABE0D36F2203C0F162DBF01F08 +smlen = 2701 +sm = 45C08FB2F9EF270556B72845F43E1C7A24F350391572E3F3055943F112E2045C31F3C64E454F9410C478863C15DAF96E10FC320F6DD31D27DF2619F45E48DB0010FA67F720BE48E16034754F3DB74C2EC881489E5E2AC3FDAF4847E18366FC05799CBB61E10FB0AAF0B9D5F5478A3DF54AB928A8BAE099E3923725CB632867000000FAB49E2DEE6D6CB3469A678AAF9D91A128B3AF595BEEA11E1A5FB7623826441C45E2CEE83FB2EABC1C69EBBBEFCDE3741FF72693DE9326C22858ED3E73B3FD1E5FD55180211F441C288C0AC8AC03E2317467FE7D04E162BC41E9301111C2B31057EA3943F62C7B6070BBC613F3308B87B33A8C3B54D398F2010326965D68AE351119BA1682314E0E03D9EFE94F04D85BFD33849CE643BF5337FB27CDE58B32000813EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 + +count = 73 +seed = C7ECD1EC1A3D83F5116C0AA4345FB3ADB4D9F81BD79896BC4932EE2F9D2D1F179BAF7A002D88F4F69071A7931E7F7FAE +mlen = 2442 +msg = ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 +pk = 8199BF0B4BDD84EE48D25073F6E8CBA8911C996AD0E007B1F8B838557534185EA65E5149DC81D69A760621A00786D77D7294F089A8344DAF02B8B291AE3ECB0052BD2318905263C552D851E3635413610292C5D3EDE0043BBE890742E2A95575F1322CFED16C8CE47B8324268DF2A16C4F610BD45DFC6AED670C954968A1640002 +sk = 8199BF0B4BDD84EE48D25073F6E8CBA8911C996AD0E007B1F8B838557534185EA65E5149DC81D69A760621A00786D77D7294F089A8344DAF02B8B291AE3ECB0052BD2318905263C552D851E3635413610292C5D3EDE0043BBE890742E2A95575F1322CFED16C8CE47B8324268DF2A16C4F610BD45DFC6AED670C954968A1640002BD2244A867C7380043D410EEA77B514F1FAA6A62F3E13F6DE3470D25BE1A1627D301000000000000000000000000000000000000000000000000000000000000E0E469E7BC4B05A407A8B9EE9E2C7BF7E3A284FC0CE810A7FABA0B12CF623E0B6DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF358B22AC84C2871C23B7868B407898E3186D83442E0602CD273758FECCCC8A3A09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004654E97011AD386DEAC328988DDAED9DA3FA2E3F96781B7608351E4F8D34EE3F3A6F29E7EAC07338CF3FC3D9D5743A9A2EA852846D9AEE2CA02D2DF247CC0595C00180C3781ECD89923D080B7FE3ED18C5330D574CAB994DBF87B904AFB22D880753ED57DF8D3FFF09F9200E213E982238A8B2EB939A72F12104A2947F0723E42BDE8A8113B0121008A17EDBE742E2CDA9AB6AEAE210247B17001A3BC7A1C1383542F799D9D4063AD768AB5F4F5084690BD01219D698780977287FB60F949B2CEFC110B55F816AA14ABB812BB4E04EF7BFCF7E5708B2821F46155B0F4A57412A3CEDF3586F2BF6840C7E3D679837AA2E391B4D46841AD4B67FA7D204 +smlen = 2734 +sm = B45700221AC48776950138D9AE23BB2DD548E6E845DEB24A4F82DCFE04AAA00590C984AAD78A1DEB70E8E6D86C7D03141C9F92431246560F3523254A1DB10101E0B7D22A3BDDED84713ECA006255F21216961C5C177D93F75041340F9CA06F3C2CB1E528CF17ED619102D631C3F8254723DCD77D0DF32D18FC1F471AF96A980101022AF00AA3D5C28EA62C063982FCAC077A33DC6E25CCCCADC676DE4DFE415FE437AF9E2A73DD4FA84929E514B2A3279B400418BFD32E550F20105A21025C00FB3E36A7ECCF99415D99911C3BC110133E863DA58D0672E0367C944CC6E365507C0FFBE9EF9D7BF98A984D89F6F6859733066012E89FDFED85A58C6D80963D10AF1675624FD92490D849B48CBEDB60BEE50F1BC2678F8BA3C3E686141C22D1443D000906ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 + +count = 74 +seed = 5DE03CAB3CBD81B8805A17E0FFC2105C3BCDC8D782EAAB161A15AAA543FED59353C1FBE03E7F36B955FC51C9B30F0C93 +mlen = 2475 +msg = 5F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 +pk = 315E3B59E0CAE5E5A5185A1A31F4F7C1F203B4B08F5CE0B0D0553A802FAB20B8CD18D3AB3B60367D3F74CB061A91F60EEEFE8E4721F9529CF96423CCD68655006606F7C1B15CBABCDD1707D61609FAE571C48D9A2EA0A574130A898D07CBE7687508DB6EDAAB4113D73DCE681AE30F496A85976C43C6C4E920050C668249030004 +sk = 315E3B59E0CAE5E5A5185A1A31F4F7C1F203B4B08F5CE0B0D0553A802FAB20B8CD18D3AB3B60367D3F74CB061A91F60EEEFE8E4721F9529CF96423CCD68655006606F7C1B15CBABCDD1707D61609FAE571C48D9A2EA0A574130A898D07CBE7687508DB6EDAAB4113D73DCE681AE30F496A85976C43C6C4E920050C668249030004A373FEA16D6384323D6D0E039D333A7D57ED3DDCADA9D14FD5C31896E96087189E00000000000000000000000000000000000000000000000000000000000000D4F74B21A57D6F33A01C09F9EC1FA3320C886A33ACC06108028AE9CD54547E8C52FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B9F3AEEEAB445BAC7F8DA71271B9B97F5C7E43E9B7D051F8475D059CBBF22302AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CA702570A889E34AE21244B5C6684461969D45DFF68C5D98D3E509A40102CB23CB3D65FE5C5ABBCBE87871928A8931A9D55198CA8A0B67C144DDA1BC3EC00E31B98F1EE75ED1CA9668093A402717A3C67A968B040184807FA60FB1F63DB34F38809F3993507F136F10E406C658D263C6F5EFCE122224983979C5CF9F300305E9E6C5C95577E36E29F1CE8F71EDF310881DAE0CFEDE4A06BE668CE46D65BBAB0E0BB681F9DF98DEACAEC811E9E8882A37DB12B1E480E0252652D5CD24015528F1D7593B67A5897A2F7DC82D3CC3ECD29040A45686B0A0F705EE518C8864C39747CB6E28D8BCE0D7C28A644340BE6BA9D7F1801BCCFF305D2F8D28CE01 +smlen = 2767 +sm = 8492447458900DFB5F39F686455F55290B0CB444A7C2EDC8D359AABBA89990249AB46C26B17CC819445B3504C8CB152B5BC54E05CC5575BC12D13B8D0891DE00088BD97AD063EA9090B83455F2E0440D974B4A69335F2FEB54DF54B113B0C2EA0B916A86E0F7D00E34836493DD3B8F9E07B7E1A625920B60912C347B52D9A2010000D5CD5D455A63BE4B71EF8952EC5C80BE2AE5E6BE9FD4B677A5CA731A78D64515FAE83D4542946F1FED07C31049ACEF07DA96696B3480A11ACC106DE79C77BC5C66F46B119B67A9D9FCAB03C973E3FB3287365AAC4B38913F7A58F3DB9C10E37269D5540BBED8AC2BEB4F6838FFBE7E5929CB61208B39F5AA106B211F831FC66BF4B41548970611C085F7F3EA310D1C336DC197241DCCE4C08EF6F4E4EFF26C0006095F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 + +count = 75 +seed = 63742CEFAE9868C3C0B31DDE0F9D378FD5D71BE7CC3F0B6ECD393DB55FB043CF00264852C45D1836CC12B9C872A20251 +mlen = 2508 +msg = 9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 +pk = CA329CF9EFBFCDA21138B326705A59310AD9076B9A14C997C8D8323B2D973F6CD67139A3FA8EE377FCCB864EDFE437B4A11618CE479ED50FC6FF0B9A480D8300D1E92BBF05D9E663A814FEB85503C8B62D459ECEA2B3ED7834365BE5EC25AB545F04A0F28346C66ED0C3AAED02B60589CCC62B32BC4A7C6815A135E99E1B050104 +sk = CA329CF9EFBFCDA21138B326705A59310AD9076B9A14C997C8D8323B2D973F6CD67139A3FA8EE377FCCB864EDFE437B4A11618CE479ED50FC6FF0B9A480D8300D1E92BBF05D9E663A814FEB85503C8B62D459ECEA2B3ED7834365BE5EC25AB545F04A0F28346C66ED0C3AAED02B60589CCC62B32BC4A7C6815A135E99E1B050104FF812EF2BEAA282DD18A6997CC7D4E4A8D7204D9462F2130762DF17DDC0DA159EF000000000000000000000000000000000000000000000000000000000000005222AD9FA2B0B0702D92AE2C73DCC0882F1EC699EA1690CBC6CA567B2AA8446DD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF758ECCB2162C91E7D481FE4B37DF08CB773ACFA8A099637271535375A949DC1C42FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002320676D65007ED2485364B3877292E26BEC1C1941FEB20BDCCAD3AC54AA467A0C455E4DB071E871AE0EBD0CBFD34D7F58F90E5CD6E62430EE3CFB2F8A9E08F92E6CFC6D7FE90B75E49FCDAFA753C8F820AEA0124994E59853875BA5C4E310AB69718E7FC45003C07A59CD140D1396D8BCEC35BB2429414A60F8E2936E0CBB047F4A31F656213BF793A1AAAAA5CE60E7EA7424FAAFDA180FD6DB39D9B1797D63EC01A3658FB64F3AC4FBB75741CEA62EBC7854C1502DA23C727B5A700004B135F210FD8530D868588958B758D562EB0DB397A0AFE2584C0873C2CAF2CA3A4E95E6727DF6812C8F4FB37984BAB55950356218263466527F8FC2BEE30D +smlen = 2800 +sm = 89B53A2B3496E0F7DC21AC587649275EFCBCC8CBE25B1BCE6654294D52B44A680A365E9BA61F102438EBF8E7F50D50A1F94957165B98AF87EC9417C8F90CC10087F585FE8D7D0ABC853E6A4AC994F20DC61E5CD2721F462026E05C50AE5F1DCCB5028997DE3F6F6EF390F48FB570082CA2BD342402E950B66E93738613EAFA000001E671B7366743D78933E0F6F562874F6C0FD3242F9EE610FFA8FEBB81A393CB0A9992DEB514D6DFE2B5A9F61F1F7205CEF67F00E731A113A6A5C51CECFE3AC11DC4188FCC71654CA423AF4B92C6DC43F73461D66661C0829F7D8A1D91EA164A047582C41FB9DAFBDBF5BAAD02BBDAE1D647105C0B59D2C4C3A00D97FFA8F458790CEC0DC41315329CEFB69F82E559F3B652D5A69F06F3F73066AA5080644D5C00040B9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 + +count = 76 +seed = B887F07DB5358C3FDC2402947BBC87ABD064B02A859FE8DB37B5BCBB916020443DABA5534A0778FD0B1C05EF3ABE6269 +mlen = 2541 +msg = E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 +pk = 58B57560DCEFC455436D23225E2278B8FA38A1E549E78615C3E538D06575260FD3E37454DBCC8D587AA19A7278D4BD0488379F445565BCD8F1D4C4EAAA06F4007912410A4B691BD0A487DF3EC49CB63616D86CD222164912BCA7A22B765CD30643536EA220DEBB29A372E315FAA9BC867581483CE03D6C0CA5C3BC36834BF10002 +sk = 58B57560DCEFC455436D23225E2278B8FA38A1E549E78615C3E538D06575260FD3E37454DBCC8D587AA19A7278D4BD0488379F445565BCD8F1D4C4EAAA06F4007912410A4B691BD0A487DF3EC49CB63616D86CD222164912BCA7A22B765CD30643536EA220DEBB29A372E315FAA9BC867581483CE03D6C0CA5C3BC36834BF100020391E53B55CB3D17EECB2792EA72F30CB29153850F1CD5997CABDB84ECA3D66D3500000000000000000000000000000000000000000000000000000000000000B22EE3A57FD891EF098AF93BA0A569E2D79F19D9344C5D292B7B927B9D03ED99A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4169554E36F3709333A629CE087887B6C5A7EED3D65EDF3CE369BF1CDA50B095EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005159FF984F42D37B20F2A523E9553EB4759006A909EA4CA41AEA62AF1061A8885F775CEE8293741E6C60C1F7BB9852C34326F5067C4F18E8DC62A174A4770B15A02A4F546CCE9A523158C5092FE3D120ED797C4CAA0841DADB85871D0BF8E3FD092142F6260C74D12FE146D656362C9EF5E521531FBFA5EC0DEEFF5DB7018122C560C0E9711A783DA964D2720363CA1A7176DD0B090D5584222B525268049369EDCC0FBAB0B51DCE11CFB404C6CF7A445FDC0F46453EE7B075AAF46D07B85445213DB6A106F05F17274FB89A116C88137BB10B553AA00E50802A43DD301D5E15B474FC935AACE7C15EF028AF786E8F64AAD9A62E57C12613409FCC01 +smlen = 2833 +sm = 53DDFE1FF27EA3FE6016D45614829AA6A8933BCD528A483FBA4A4A0ECE52499FA8AE11677278CFB6EBC0CF06EC48CB04A4BF175BC867B21A7F63043DE086AD00167FFD1276A25D46F486CC5B26DFDBB0539441DE17FD2D124AF98E7EC7DF33679C14C55EED92F6807C692FF9B10AF63568A9ED3D0ED9B2A229AC04D8E1CB850002008F8CB2FD42C318808307ADC98C00603FDBD3B346E0AC399502F7ACD16462FB114D50DC0CF88007D3B9390D29CCC5DA16D1A6910884FE33A636AE3A1416988007D13354FA1612BE3C53C548C6E08BB73C179550C33FF3085C7506FD8100B0211A201609CCD5C3647E74452E5F56F2E7CC86F5B09B1D4042AB03CDE326DEDE3A19ED2FC918FA22F60DCD4E4F09004F1F05C963484A765D778DF8731D6756080400090BE7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 + +count = 77 +seed = D08A139CC7147ECAF4B1D1E434EB2EFA2B2607B0033D8BA989133E496DC9F3654944C7AF91CBB79866443E8C4E8217ED +mlen = 2574 +msg = 34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA +pk = DBD1FBA53884AB2B7F3916FE7B07836B6BAC99911CD152A02BE14B6CAA02161038DEBB63A9789CEBB7D1C42A1353CC8E1D96EB0EE872A149C027253C8F53C800BFFA76F7C7E94FDF7D3D6A5E40473DE48837938A08BB618B89E600EA2B0EFA15733A746F5DCC14CC426E4601B2651EA5D99B8D5A9550B567B10368C3D7474A0009 +sk = DBD1FBA53884AB2B7F3916FE7B07836B6BAC99911CD152A02BE14B6CAA02161038DEBB63A9789CEBB7D1C42A1353CC8E1D96EB0EE872A149C027253C8F53C800BFFA76F7C7E94FDF7D3D6A5E40473DE48837938A08BB618B89E600EA2B0EFA15733A746F5DCC14CC426E4601B2651EA5D99B8D5A9550B567B10368C3D7474A0009DF1B921C712FAED1D2FF1AD9DE6761148A6BB1288D2F9D6E8E0A353836999E26740000000000000000000000000000000000000000000000000000000000000012BBFFDF0BF74815ACD118C644F918101A250984DEA472A14D8D13E20FF2BB0134FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF094850D3BF3B02B13F32017885B1B80A65E4DFC75D09ACA9C6CD12A9F6EC256C7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002317FA52F245B0129AE2F71BBB8E498ED9B3EF437A0947781ECF21E5CB42C2A2420D4EAFF6965B39D88D91DF5F5534717C8623522B1BA315485E70AF879A0AFAADFA507858DC5A3705ED32FAAD25D78E2FCB0A9289891F5AD24F83B9937C54BA6EE11467791138F8E776257D8EC7A5753EE91C74C014F96CB1C34693310F33F40AC4A87A4EFFCA4A71FBF84C5D58F53B1AF4361E5D2AA950BBF7EEAFE98C8F914D9FEBF4D263C68692BEE50098C45DDB55E57F13F72E5F5CFF2C1F4E01B30CA98990C878AC4DC3A66140B639ECE75F8AB665A631460CD5AC9F6E4E70487D62D9DF898DB89CC2D0F39EE1306C04635C8713592849F668043ED894B60D +smlen = 2866 +sm = 5040254973F89D966C6EAE6311977FA8717542C2D53F8009AA1687499FA884757BA9FDD6AFEAF2AF6332415DC7CE5A6684DF500650B9AF24EB6263087847CF006FEC82CC11A16597DA1721BFB6487E4C52C4287A06AF34A9D2D18C2CD5FBB8C19746DB693BCD28116E74B8FA6CEC143D4E09B112550C61AB18D0893EE14F3E000202852AC67BC44400FDBE66DE3131D709AF570A9E6D93802C057E8E4000E966F90C4720CFA7D237C8F75B8AF26C8D9A8D865B3E75416F62AA567881D0FA7BD26904B946C2A85DCAAD677B45C97975A9AAEFDE30ECB9D25560BE8B7746AF5C27F800EF6FD2B259643807E50AAC3995E8B0875B0178BF4DECFD32C32E8984C365ED155C4E37771A98866FB840BD0C1401A778B162665BB101DF1CA1CC929283F57E00020E34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA + +count = 78 +seed = A315BCF0E6835892ADFA07C034BFCD39F80B62925A95490B20170BD29378E11559C7F1CD296377FF1E01284EC727FFCD +mlen = 2607 +msg = 96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 +pk = FF169F4A219A6749CADD0E286FFCEE4C715FA18B0B2D5887B224AC2FE72AFC2A8F807B7A0B5FEE2A413E14DBFBB372395DF01927714C3DA484288E929F5882003545D4C30FF3FB817F2736274BF8910C9EB42D29741132517C201C35D5ED6D5FF8470DDC90FBCB3EF5BF7F7E94916FB75B6D03F41AC2E779EE4278111BFC7C0002 +sk = FF169F4A219A6749CADD0E286FFCEE4C715FA18B0B2D5887B224AC2FE72AFC2A8F807B7A0B5FEE2A413E14DBFBB372395DF01927714C3DA484288E929F5882003545D4C30FF3FB817F2736274BF8910C9EB42D29741132517C201C35D5ED6D5FF8470DDC90FBCB3EF5BF7F7E94916FB75B6D03F41AC2E779EE4278111BFC7C000235C2555845B6A3BC3C801F56A5AE7085CB4AF8D1A7D3451B170CD9820ECF88168100000000000000000000000000000000000000000000000000000000000000F45A3C04B770D4E0D3A1B72B49782EE82F328B33DFCBF61CE4259F722F0D0384C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57243CB7DD58F5F1CD9F120D4CDAAE06F63EB4349B3E213688FCFB53E9B2DC4C00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091699B6AE2DB42F39A6E70A685CD229A6DE3A3BCD05058FD723887973112D4268B465AF5EB405785A72B8784BB2E1A2C58A2CF9264BF5BE53BF6E1CA0F210B5FFBBD9E193F38CB8C2451F1A739A72EEEE6D43144084BA1861473ACE0295A3AF21E441C672CCA932AE0F73F9AC301F4DF343DDCDEC67618C136426A4A8905E1D501C25D5609E4D2AE6ED82B8DDB16EDEF0A46E9580278276D195C2B4950BB17293561472D145EC57F777107AF647DF78C4768326DE991C1CE2A1DAD85046455877DAD1F451B17B8701FEEEF352B2642A3CD88DE14D07E7ADFF7252CCE7B69E66924AFD06BE892726FDB4FEB9510219E927B4B8E1F6B079FBC8EA1320C +smlen = 2899 +sm = 556334C112FC4E931FA6F62FCF1C8A33770FB724D78A579EA9651D42ECFD9D75DE42DB7023A7B26A3AA59C158C40D6D590C97708997B030947FCF72D8D99A001F0DF57FAFDEA2D8962B1135B53A590C0DCBB8684C6D85CD06952F44F6BA7CCFC0F58CD42B5B5235461D794219F18B65EB2A76E97E3820F469A8C9F5AA55DA1000000ECEF8D4A0F1D16D4850AEBC2C8B130DEC24B0C8CDE2A7C9326B2CCCE2C6E6A5303C6B2142DBF2A9EB45DFA37FC9AC3E3353CDD772381300E43136770FF349670A11CAB31ADF23DB88175BD3FE78561BCC7533E08EF79C211B8203B01D84A1C50033E7CF11199D2D6339EBB4D37615DBACD4E9CE476427E79E86B2744AC8C9A29A16D58D150EF407BBCBC02188108F344C72409D0EEB2B13E955FBD9C3EDC0000020B96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 + +count = 79 +seed = 8B47E0EBE786914C9A52D547106CEB4A3D3DE938B3244E02E5F9660954C4C95A23F2476FCCB487673AAD0513820905DF +mlen = 2640 +msg = 2447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC +pk = DFB503A0402DC5F85567C95DEC6A57685D2B72FAFA8B2D930E4E88A22F2FA9837AFDBE2D1EEAEF0C4E061792B03D91CA662AED44D3D89718EB47AD4DB7D6A30077B7A171D4FE465A396E9710FF088BE9F93494EB99D334D29A640B3675F6487C0DA1D48477E47044D243637EF1A876C0C401FCFB4BDE4E374A6081C0C4D0290009 +sk = DFB503A0402DC5F85567C95DEC6A57685D2B72FAFA8B2D930E4E88A22F2FA9837AFDBE2D1EEAEF0C4E061792B03D91CA662AED44D3D89718EB47AD4DB7D6A30077B7A171D4FE465A396E9710FF088BE9F93494EB99D334D29A640B3675F6487C0DA1D48477E47044D243637EF1A876C0C401FCFB4BDE4E374A6081C0C4D029000943178A6FDAE58B5AC815ED138DB50CDAE7942C37F4A716F2A8AB702F6B3CA116DB00000000000000000000000000000000000000000000000000000000000000FC081224EF108F335DB27BFFB5DE978CC46FCAAFE8B8CEC01EC76598E8F3E2F769FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B3A9DFEA28EC09298BE5742AD922C6CA52CAAC64E72D84003CDA06C2D154E633AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C12AA404097423B7023F08808C81DCCC4AB303EE053591BD8F4B4DCBE343BF99EF7E38BEE2F95595E93506831F17094CAF67165DFDDCC8A3DB1DA6B235C30BD075755DF51945A8DF4406FBC913B6671DC5413377D47A4BAAAB206A8C208CAAAAF51233305AC396CBCBB5C3D2B6C3E55EF37CEB8774EF3A77AAD903E84504212227ED06B1428E354A4DA65ACA1739F45CA5F766755C511DAC59C1FEE524A1B1EEB5F22EECA72F0EBFC09D9573F907D2DFD7BEBE8C482F942C62849B810EBD619EA68096CEDF480F598FB0AB409F707571D5444B769DA45BA4534B000BF9C079313E3695851D4868F92A1229A5EC00061C9AEF158CD818668B67703002 +smlen = 2932 +sm = 27A23A4FF1C669491F0E7D8B7A33748D126A76494D83F218E138D0293D1360A663678894306A13E96B58A94719C338A8EEF859FED728B0D6AD0E2AB5C1319300A16F6EB7CAEE5A4CC7D4A544F193BE944BDBB28298DEAE18F27E0A2B9BBEB78A11246446E7384260527AA6D257B3A9EC9C2AD603084F8B33452A71A10C223D000001B7592728DB95E4D84D1064C441849CAF7049A86386E1AAB237ED38F3BFD4477DCCAEA43569C39527C2A87B62982D443D24F66B081937EAE3DE9455D6CD6198228E6499582C05BB49C602469E01FD94D1FBAABDD69543DAD7280EE2BBC4FE11788ABFC09EB112399183D189C71F63992075A88CB3FE883306C07CD08553F44559DED30696E373D0D4C2A07F020DCBE312DF6FCAF6983A2FEADC4F108FD61173000A022447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC + +count = 80 +seed = 07CD8F8AB7CD12EA7CC94103B8623D6F0FEA2BAFD2325BF6089DF5351BDBB9A94525C3C6B72D3820F2E4D5F9E7C849F8 +mlen = 2673 +msg = AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 +pk = 0F61E40D63BB2E41EC2E480BCC7C0FA0E3C4EE7545BFE89C178CA5B74193D3E5AA565848C7F2E33D872CA375343A6CC97AC8E5FA424484E9F47E05B3C9EA6700C26D063619ABEAF88F9B45D07FF19CE9A3C7444444594AA92A30832D440B5EA17F57AF7414EE30E64C145AF8EC57EB0550D01CB7388A9B587819503EBC73510109 +sk = 0F61E40D63BB2E41EC2E480BCC7C0FA0E3C4EE7545BFE89C178CA5B74193D3E5AA565848C7F2E33D872CA375343A6CC97AC8E5FA424484E9F47E05B3C9EA6700C26D063619ABEAF88F9B45D07FF19CE9A3C7444444594AA92A30832D440B5EA17F57AF7414EE30E64C145AF8EC57EB0550D01CB7388A9B587819503EBC73510109C32FE7D33245CE2686F9535E4ABC4C5E54C0243FB09E4CCDFA0DD37310A14BFB9600000000000000000000000000000000000000000000000000000000000000F686AAA4B5EF730451A998D395D7D8748D0C28AD91BF7FF5D8597E4D3CE07EA62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF998AF141C36B51491D232AA878C72A1211F86989E24ACB71E77454300CA77F965AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C52277E4F1DBD7AF540DF86F50572813357E604AF6C3A16F263B99096F185CFA0E5C23ED5B2BA1EEB8DD4CA53A49FA9633207ACC49559362D46A375D3F0905BD6AC594FFC8631AC55A42F3C160625F205FFC2D4340C80F0D840224E3A2E9BD19423ED016BDACB5AC3D3FCFAD135CE4F4F1D654259E1F94BE10D752F63D02517756E62336BC8CB3706B7C2FF92CAC79E8718CE342D51DE16487E0F1D590C46EF4E8F9BACC0C4C0B4E852D3701F7697AA949DD527755E8DF560CDA4BED0094A3862D252E106C477F49DF1085DA344FA0436FF0177FD47B0FEE3527288767FC0981EBE6267AD245717010B8A4777943DEF796899701AFFBEE156F37A603 +smlen = 2965 +sm = 5B04BAD7AA1BD8FD00F1E6B2BCA5EE42B8BBB5E47BB77189551240A7C2AACBD54CBC358E909A767252206C450A5631AFD652B4F1C43C4B80AE1EE8B9162110002B8DD5C38533333DCD9E389A278D0B0666897408920E4A7C9ECA36E5C3B7C45ECAA5A055ACF69CE70CC236A7C880652B6806FFCA2AB93A586528235B171358000000FC76DF88676F6EE69F826A3E9AA4790E08B62A5C39B96345D0736CA40A5A9819CF3C3833CCA0FFD7BBD91D9E492B4B82EB47FE4D0AF885352266C9AF5BB2BB008B21ACBE6C4F7DB5CE4170C4B03210FDF92EDAA958F5AF58DF6702511F9028297CD23AAFF193F485E628AAE2CFB228A74F5110411EF36805BB637EB4E27F89162A8612FA5C598AD290AF1AC19DCE6B57910545515853DD480C1B5BC0287D4F000B02AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 + +count = 81 +seed = 3D598F7C498D8A1095C40945975380554BEF6142578638A7627E2C0A21C59C579F8E8CDA309348FC54C764C899FB93E9 +mlen = 2706 +msg = 63EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B +pk = 40F105B446B1C03D04987AAB26577806A477D41FED3EE8F2CE11492B768FB4DAEC54A577E56DE6E5EC311CAED532F2261A314E9BF09E18C64A851AF9F9170500E444BEF0A4101AEF46041BEF52C2DBF2D687B2EA91DA16629C468664476B16697FFCA15CB46E574308ECAD8B9349F82E528C13401873BD395D08359274A6870004 +sk = 40F105B446B1C03D04987AAB26577806A477D41FED3EE8F2CE11492B768FB4DAEC54A577E56DE6E5EC311CAED532F2261A314E9BF09E18C64A851AF9F9170500E444BEF0A4101AEF46041BEF52C2DBF2D687B2EA91DA16629C468664476B16697FFCA15CB46E574308ECAD8B9349F82E528C13401873BD395D08359274A6870004CF14418F19ACED5B71B91D2AC10E2AAE7EC2FCE672D1122948E4279E7A9EB1003A01000000000000000000000000000000000000000000000000000000000000FA113360DCCA67357B088EB90A0370018ED90340C16582B70B59CFD2D22201C712FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B1DF89A7D5C0700E734A56073C0D26BB14EAB025F3B79CD074E8406B5DBDA2F0BFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004B0018D60BBCE03A044F6E9B369DF1708D6CBFEAACB8080DAA753B105A1C5E61F5E0E5AC1E52E3DB8FB4E9F66C21A6BB7BBDF08545E1974477D777B497808D75C6445A22C9399EFC8F13593BBDD78481F5A4A330B91F35D22799643D1A49EF421319AC7693A330373169009FC02AA903478FF61B6EBBA46E1C2D015B600FF4F62AD46AC95C332BCE7B3607C40628F7BCB9108F478F2465C6391C1E6403AF4073E7CB38BBDCC1A634FB3115C2C43D8D64709CE3CDEA422BF9CA251070811737F1CE6942218EBFB3E4952E2621A8C617FF41D3373EE75A0F6697F4BA72594FE426BB24B6C1CDB06BCBE3E84270BCA993F52016AEB60CF9747A724FB00 +smlen = 2998 +sm = 8195080F15E00FD447AE32E238A0B7D491C3761DCFB0FDF2272A825848A48D7B1A5788B916789E2136FFC7FC1E9D38EEF8A28F1B5071698A89B313053939D800B23C4AA307950667EFE022848040A9A6814B1C5A8D0B68D61EDC7BD923503DDA2046D6D06BB2104EE982E0374E189E1C51654446C15B4D93B8763AED9B594800000081FE2A6D36E79360CEE5BB9FB261BDF9AE5CB0EF466972ABB0863FCD7A9482468A287CA03CD32D61C388ED4E796DC80F62026B9CFEE5DB830C4492C369142C19718EF4E76EE9A58FEF0140300AF371BB99AAF84B2907E6914F79C24323C36B26C19AA106A58F5057A3733F4074824E648305AB1343D28DD55C0993DD8189097148D2DBC381980A84A89BDBD973A381E888DDDD429921171180A7E28AB16B2C000A0663EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B + +count = 82 +seed = 6CDB757AD36DF99E52F535C2680431D5FF36C812D8EA19399F666F2FDD66D3A842A7A5AE1038359AB618FA58A0A6E840 +mlen = 2739 +msg = 7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 +pk = 458BDBD88AF5B2CD9922C20348FD30D1E75E0ABB80FDE2C65CC0315B7CD038BB3A170D377E1F577A4559DED9AB67393969EA47879F13942DB1DF62AAC28677012A18B06C3CF9649A26D526E0E22CB5F0C8A4FB9C12D7365227DAD0125CEC96871C93FDA8851ED6EBECFB399C229D151557F21DA332B87943FB1E01FF94B2120104 +sk = 458BDBD88AF5B2CD9922C20348FD30D1E75E0ABB80FDE2C65CC0315B7CD038BB3A170D377E1F577A4559DED9AB67393969EA47879F13942DB1DF62AAC28677012A18B06C3CF9649A26D526E0E22CB5F0C8A4FB9C12D7365227DAD0125CEC96871C93FDA8851ED6EBECFB399C229D151557F21DA332B87943FB1E01FF94B21201047D9B3CF6A8B4C7A62A7C3854C6CF49F65F90BB98D47D0D993A457F2A654D9699D400000000000000000000000000000000000000000000000000000000000000D2499A8957F07E30CF3762BBE7EB6E32C7136C384830244270FAF464C1903213FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D1CDC7F8ECBE41E6E1B1BFE27881EB807FC0659697F23FED9EFFBC9241EE5DCA3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D265704AF2A6EED24DF811B40443253072951D8332E3ED6152EA0DB143E2C5AC2658F038245467DB5BCC3A7D77FA062247478E9F4057DC1403F3BF96C3870AA7B3956BBAC4D41340978A9113C12BDDA64483ECE1F0B26E8FB6CE34809F3D7F1969DBE8D25AD9E4617E0FB430EDC5D82AF2E595E38767426FC2E9AA7D060B336E63121706F2D820AE0FA71CBF20A5782FE48FAB27B4769E37E0A06A4EBF767F90DF0FC24BAF944B61A1ABB86C6C5EEB47681189E43200931A57B277EA02688AC74B854D91B46BCEF103A792EAD733478E40E226CC7E65F72B149BE987A4A65D2D1614A3E9AE98C797A6E7AE4ED5737EAB5D473399E5C68E1C66895800 +smlen = 3031 +sm = 50E43C695914A161AAB7F4AB24BE8F954D2EA41BB0CF489A32F73535D67CBBDA3C4380C5E538BAB71E836469375A2CD189B2AF3E3C163AB175D5AD1FCA0B1000FC33BAF392F5FEE42D23FFD2FF63744AE66631EC27AD0CC850166629A9485778E5CB016F458C3FCB2FD0E8877F351329F96F244AC6B932B34DC3F6B12A3B8201000023E018E41E61AF4C9EA40495E116B82AB5A79A345A603C11F04B67A584793074781820AF2F4529C457624C59791D184626B81DAAF906238FC9A5823F14BA2E0B0E346A170B159B6A38FB85A6B05077820E914C45A815FA6D6A2729CABBCF3C55D71B9FF7819C79F10D8DB6BDCE25ADCEDE7DE97293CE45EB852F3C008EC08E5C858E420866BA0A97054207067A55FF4825DB3754C5840F04B76EE1F0961D470009027785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 + +count = 83 +seed = A97269579EB70D268C58D94FF744329B197F722A8A407B788510DDCACA34C8CD4C72FFC14B76300C86AEA1E4CFA66BA4 +mlen = 2772 +msg = AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE +pk = 28907D368F2FB8AECB829BCAAFE72DE1C21DE46F1DF2393182CD278E44DE7413F5948B5ED5839825DD80752A20D5A83C8B80A36BD4547755FF2C474EE9A10401FA1BC1FB8ED86231710625D72934164E47FBA4DC05E4DD68D0E6DA302EA1021CC4A92241329BECBFC357ECA4C1EE65E57F25686C6FEDDF5156B7BB62996BC30009 +sk = 28907D368F2FB8AECB829BCAAFE72DE1C21DE46F1DF2393182CD278E44DE7413F5948B5ED5839825DD80752A20D5A83C8B80A36BD4547755FF2C474EE9A10401FA1BC1FB8ED86231710625D72934164E47FBA4DC05E4DD68D0E6DA302EA1021CC4A92241329BECBFC357ECA4C1EE65E57F25686C6FEDDF5156B7BB62996BC30009535234451EAFD6472C7CECE5FC22449D46149E6E34A6A29B8128BD668A15FDAE84000000000000000000000000000000000000000000000000000000000000009EF8A28F96BD3843743E53B37E0E8442B9B90524CAE861EC5EB596D6E35C68409DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1FB6ED563EA675C636FBAA06A23FF539327F74E1B58279179659CE22A9287981FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F2D1EDA8D53F8A696D7EB1A9508D18915A5A3BC41302F278E2767A728DEF64DBF83E29E005E7DD030FC91566CB1C3233D350C6ED9051D2EA18FC2193E6107B0A301FC4A9E5FB2CE45B216556D35A55ED8EFD8AF10DCC744497FC27CD85274905C8779AD4BB43B0A1AB8CEF0334F2F0B17F6C177A02ED96B7ECB70523E0A3A1C18370546D2FAEBF32358CC7F6B1DFF8C7301BF701D19DD904C93A9CE78C142BDBACDD8DF797235DD7D6ADB17260FE82D51C23BC9E9BA0B7EB15EB965094793B1C1EA0327EEB775D4616B6667A89C584302546088B28C22F64990BB16428051B786FCA86E69A7BC5C1CFCDF398C00EA33C42A8C2843C9760784DB6305 +smlen = 3064 +sm = FAF8986E74D432925CBBC34AEA6FF2491E2697FD3E0E1C9AF02094450FA866A18387B01794D71C87BACDE0CB046F4C690B29AB0583594132DD7665A4C38888004D293B95114C439A2FEFABC1FEB2DE929E88F2D3EA9784C51492D14247412371BD2BBE0E643174A0AC574F3D7FF14CE9E170980F955141039281856B1F50440000005F532EF850CEEAC2DC6BE67D4D3A6B0FAB775643E601AFEF0509E4FF1C2C2A1BE0F70E6F2C49AB78B3E7129226C4DED25A7B5976F52B853C2262A6BAA030887EF88CE9C2DDAD3D43B0C02CF6E2EBAB7314750960F1C4FAAAAF2487C0585B6E2C5BC2C42C6F9FEE4405BDABBF47DB1B481FAE83550377FAE26FA8629635BE6B1CD515B5926B3E15B7AAA11B41FD08E6B83E37B3756095D950CF106417DA0B7C001102AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE + +count = 84 +seed = 483A81716F91A43ACA6764C4BD2A57C9156B762E9174EA49730A6BEB9CB19A0B3755E37BA47EC524BBE2FA25B9FEF687 +mlen = 2805 +msg = A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F +pk = AAA590C66A7DE94C5E03B201795BF22B9BA65C636630FE9014C7005F6760A0EBF68452677A64898B8393FD827D3B341A64ABD9F05F0D0324CCA632553B217701D94A869B5C1D87ECF06A7A96F6155451B02F568364F039E357C4FF5C8AAFCE9CC2DFA6218201401BC5CCD0AD8641A034093FA2C91DE17B51698C5C08CC216B0006 +sk = AAA590C66A7DE94C5E03B201795BF22B9BA65C636630FE9014C7005F6760A0EBF68452677A64898B8393FD827D3B341A64ABD9F05F0D0324CCA632553B217701D94A869B5C1D87ECF06A7A96F6155451B02F568364F039E357C4FF5C8AAFCE9CC2DFA6218201401BC5CCD0AD8641A034093FA2C91DE17B51698C5C08CC216B000609FD0153BEC1A8431125AF0EEFC437178BFB257A7E6A6A706DE0D37F864377E2AC00000000000000000000000000000000000000000000000000000000000000349D7B6D18CB0C448724526DE74DB65E845BE7FFBBEA80B1640D04B77521519CD8FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD304279FD3D267DF4A4178D7C5B3387B4845447ADE61C0B90B7A131683F44DD6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022B3349A9614071C4DF7BDF0112F9B31B9FC54BD3DA4804BEE7A38EB1DFC17128BF487E922E4EDA2027D804F2F5171682D6D2C72EBDBFEB835D9921FA62A0D4BC857AB339FE6B7E6BADF6B283634D48795E35E276AE53DB1F51A80D6FB606DBAE842F261BC87544B43C2D086B13AAF01BAB8B3FDAA5247C0161C4EADA30571D5F0143E69D205023B86A1EDB612BBF9F19BC559A1586B6EA5E05FFED25305B0CE12E0E86023EB67D18D2D9D67167FAA1E871A63C84FA65BEA01AC8764069997018F8EA4022FD1DF186735F2D833C60DBEBEA4580C271492FFD541513AB2E4497DBF4E57ED9CF2108186A603FEEB2B911C836D125B48643C625C06B005 +smlen = 3097 +sm = 3AD36A6E22AF730526A36EF97A08E28D4B160A5E56B848288857E2DEA42FECB1FDB92490449661C76576A7AB43F4FF47059B292A9758E82E07CABB44B91F8800BC09536075C905F0D6FA58FA5AD8485F1E57677AA0EF6D598889E7BC06427D8918AB9F68A83B5FC1FEDBB23B7223D6F1C6F9C7F9E66377E976F694ACB5FA030000046912DCC5918F6BA14A91D19E58E09E757BE2C81C44D8B4D00E9C301413CFDE3D697B7C85C4F455BA280A28EED059CB836108A4286A791F75B528FA9952733826B85704E0BFA9C8B5533F155FD3A50C07DB9F9F7111A31E6B790CA69665D76242E8D90983D37666CE6893BCCFEFD0A7BEAA696CB3B54FEE1CC94D96A3FB7EFA4E6DBD71DD6156D7414B3965CFB6A488CB905D134E041506BCB0B859407DE434000909A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F + +count = 85 +seed = 30F0E117513AAF27AB2516BCEADD1188B4BBDE76E57DFAF43CBF2D70723D941E8F875C5EBF02BD7D67AE81ABCC54440A +mlen = 2838 +msg = E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D +pk = 9CBFD2A145FCA5968BB33C171794A2074B637E751FABD95D469D7D259C3A89390C24D6FDFB8982B8F8CF0B59A2E71B1B42A41C4457647A8CBBDD6BF297EBC500048B2C80D1D1D9F4DF27E510810477A0838F90F331DF36171297DCD5DF665DDBF34D20E63D20AE18F9C2D2255ECBB11D7AFBC4BA4BCAF1D6C67C8AB26986190109 +sk = 9CBFD2A145FCA5968BB33C171794A2074B637E751FABD95D469D7D259C3A89390C24D6FDFB8982B8F8CF0B59A2E71B1B42A41C4457647A8CBBDD6BF297EBC500048B2C80D1D1D9F4DF27E510810477A0838F90F331DF36171297DCD5DF665DDBF34D20E63D20AE18F9C2D2255ECBB11D7AFBC4BA4BCAF1D6C67C8AB26986190109C9DB83D4035D1E9AFB698F4FC4F1EB1C3071C4AF4919DB0823BCA513A46216A5F200000000000000000000000000000000000000000000000000000000000000F099A6F0135E4A82C7560D270F026935665493E82ED7B06E95B6A67137CCEED544FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6FFAAB7836C20E254FA17BFAFCD39DA7ACA12664768FBC4342275C29EE6761A285FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092CF9D6C0F49046063F1C1AD92D8B54EE2E1D7961351F9E44B7FDF59CDCD8B3E994B850D390AA87FCFE6E2F2890A440B693F78AA8F3412C3C66C8BD6D8A301090B9514B87B2485EAE21219D0722B679F647AC5AAB253371D841AEC13D15BE812780B106A0D746A43CB0267B3A0853DE90581AA891EBA67DC536D9E0F690C830D22D0D8BE5493CF0E34E0CD9CD3310FFA0C58346092089F7E3DEFC0829CBCD1B3FAA1468B83BC326FCB5C2E0744E8D33188309824D5F029228575787001D31E6C3F105DC029F471B477CCBC86A1167869223D3586093E5AB24593B007C72667B1E7B8D3661704B1772EA4CE9B79D7195F257AE92FF0DA635F7CB08E06 +smlen = 3130 +sm = B1A1C2277531C35C7EEEDB647C7A20199AF8B47BFF0DAAF6D878C7A3F7C1F85A4253D754B8043626AE0987999A688D64CFC7C42BB3B2239BFD3E988B32F31100DF139631CEDAD6886916832051C2D64231DD9152EC4B0CC5BCB127EE656CE539B2EB5F73CE85D1E0B94147CB9FA5853DDC697E1E74E32174AF144A61BEB8AC0100000A80D6BD0CAD2B1611982BB3A27B3B53FA748DD8499D032FE4740CA9073F6C3D1515F9A4F5DE1E9E21B9F73367934B31D74A06EB6D1B53318EA2FEF42411F73A6D37C4A598DF5D9C15ACB32804A0B246A401003502B1DCB9F3034C28DF3A1F72BAACBB3C567450854DDB2B00130417A7DC92EE37EB196096E68E67046D040670A9C48BD44F5BFEE914BB673476F3047873F8AA409F5A87FC62A938683EC768000B09E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D + +count = 86 +seed = 070FFB907EE8AB7152A9D380DEA2C4C4796780FCFD80906C5E489B917A45D5E7EDFE6F37C4420E5480E8BB599FE36451 +mlen = 2871 +msg = C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 +pk = CFE1800B2C38C3676FDB008D38798E271D3517AC38B74329C131027A7411AD1D67CF3F0B2F1C288767982DBCE99C46B0130F4F4C54F5E317A0F68103E63E300137772E215A2AD88FA9BDEE6BF14D46690BE00157A5B883A6509978E29D9A34F1CECE3BA39A61DED3826E1E3D27D009C033ACC6DE09F1B3B85885FB904A6E11000A +sk = CFE1800B2C38C3676FDB008D38798E271D3517AC38B74329C131027A7411AD1D67CF3F0B2F1C288767982DBCE99C46B0130F4F4C54F5E317A0F68103E63E300137772E215A2AD88FA9BDEE6BF14D46690BE00157A5B883A6509978E29D9A34F1CECE3BA39A61DED3826E1E3D27D009C033ACC6DE09F1B3B85885FB904A6E11000A134266CBAB3AED02B12E02F788090E5A74521ACABF787F1D2150ED8FE5D305492101000000000000000000000000000000000000000000000000000000000000B033D54190E84E22B8CE19D02ADB43EBB7FBFB9CBD97F1B456777928A77BBDE1EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB30B8AC0E8B00E8D18AEC308754C25819B18FC7E3C9B1A001644D6D2F70CA5ACBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C3C88DF2E819C5295A5963ADF248EB9C9FF5D571CDA3C1BD7B1C9D72B8E8D119BF12826BC81CCAD3AAB39E2B2FE4749972BB28EF915E6E34422F49EDCFC10E1FDDE1A6F4886A04D23D3698C83B0E8D09A236F0A3DD7E8CBF08AAE3241EB2286EA0C0065ECB2F4A0C4610D2B324471D0E9BE58D611013CDEBECC195B369021213D0659E0CB9A3F39BCF17594F60BBDE06C545ABF9C90A4BF79ABD280550C0033F53899A81162DEEB6B630BB16738BD57B508166DB13EFC35D0EDAB58C0DDFF7332ED31D017FD3A3A8323F8133ED3618E3C05D24E9CC2918C835505BFD39BECC5EA35CBFD5295759125AC082FDA63A8916BD0E3F92EF68166BDD973900 +smlen = 3163 +sm = 3628A235679076549147DE001B5859C0C51677803A5EC48D4BFDFE06F281FFF5384D17991F0C2104DE024DABEA58BD4B18E7C8C0D3BD8E8DE31957B5D6E28E008FB318F5AE96DEA4EF8787AB78C55C851FBFB23961D88ACC655E9F95A6A2F51B6791D5313D733EDE16976A98216F73615EDAFEDF6972FDF9EC0096F4E83F69000103BBEA45518DB0B4426ACA5D73012F05EA3BD9ADA1985897CDF1BC5DAB1B08770EDC4943E32F56FD44D5F55C495626F114B882DDE20B4183A6547BA3BDBDDB8931839FB48F824A38772ADBE919FF391FC1F19717613B3F6157DA501BBAFBAFCC3B84441A9593CCFC2CF894514D6EC32D18F9FBC9AACED4AA8D7DD631730A1BB138B40E16EE71B6015200124206E520E2F7CB9E807D990CBD4ACD5617D2C6A941000409C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 + +count = 87 +seed = EDBCC4F6AD0F30066947D678A368B960CCD164889D77730516B444ED2DF10B49C101902F5FA227377C3163A0045B34E4 +mlen = 2904 +msg = 836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD +pk = 008A867B6A0BF5D3DCED05501B913EBC188E0F44B627B6E37677FA1C6895A16244CDF34CE7AB7DAA430BE98A07D15761EF7C3A228737FFC6F514ADB8E59D35011EEEB2324EDFCCE35C3CD3FD7ED4782F47649DE3E97E7A763CA51E7E4EF47FF8460AE64EA7CB2C309B3F8F80AC839EC03E244A1B53BCEF89BD5979AB015CE5000B +sk = 008A867B6A0BF5D3DCED05501B913EBC188E0F44B627B6E37677FA1C6895A16244CDF34CE7AB7DAA430BE98A07D15761EF7C3A228737FFC6F514ADB8E59D35011EEEB2324EDFCCE35C3CD3FD7ED4782F47649DE3E97E7A763CA51E7E4EF47FF8460AE64EA7CB2C309B3F8F80AC839EC03E244A1B53BCEF89BD5979AB015CE5000BC708ACBF671024843C5795B2909D729A2C0A6F38E75F94018593D1CD6728481F53000000000000000000000000000000000000000000000000000000000000008ED8B1B881237FC5375CE7C2F2060DF2983B653A90C3A79CA5B9F9711C90D5B4BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11DCD2E4FA3945EC28140D976C44F74CF842991DF0780E6C1796405FA96BD042C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C9FBBFF6C8DBEC4E5C2568B6F760FF42B779B42B7A30B4D00CFBF95B056E47981CFE1D3DE613DAD9F97F24550D402E12C8EBBCB217ED111B0746799C8960F97898A04399538D991D714A7212CC754C7DE8F67E88091B2A3790D8D5A651E6EA1424551CFEDF332CE9E6F64771FC65D137BA788567C2A6E7E558B4267D605F9B570CB75200A27E3DD2103BD9CC6CEF4AF45EFA87E2AC6D1761E10996E7263061B5853EAD2E1CE5C8413F89E5BC2F30EDD8FB38EC0D1C3EBAA640E19F70C6979D524392F006BA0BE161F2A17AD0B294A2A9C99FF27485F79F6931C111915B0C6B7FC9BA4E7A29988125B51FF13FAE822FDBAE1F953B88098763ABDCF0C +smlen = 3196 +sm = 7BE38A848673B3F7CED7CD73A9A8768B585710F8799A73FB3FB3B1341B805623F0397C34BF4E15D630AFDD6967F0B2218670BAEDD2A4D9E6B6B1F1C35D2370006B3E62B447AA78AFA0A5D09DB5615384D77C019FCD797F9476537F05D13B20A47EA5A07445A600DEA6E11B6A05029A3BEF03D2B96F8DD30EB11987E713C5DB000002F6ACFCA4F1B42193FCFB888FF7E0C6EC98174C82BC560352BE333CB53D96160EB93427AB97BEB1B75E30DB63EE7809BBE95C23FA0F817CBB6F3CAD172EC54B51D8C594C78349F7EC759D5709357B35253D3780FB073795F2466D9FBE6D150D2E36A26C381F9A289E0EB50CDA6A07A49DD0DAF5DC4D46CEC8E6452D5E3C261B06EC4A82199C541C38588A0FA65C96493B06E72B1B636E592EAE72A77297D924001309836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD + +count = 88 +seed = DEEE61A2FAC04E4D6B7A250124DFD91518D9B90A71FA02665E3088760BF69CB3CD7B6977F860A7026819D178623C9676 +mlen = 2937 +msg = BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C +pk = 821B7B150CD6E32BDB7AE113E1361066BAC0F25E5BA052A9F7638CC9B75D0580109665ED8F70C570E8B15759742D0C5B4A971EE5250AACB565160411F468E400D2F7EE40FD6DDD7A61A4BA50CD444CDE9411903EAD268A6C33CAF6A16F53DD93153C84A6A65305568A937BAE58BA2DFBDBEE1B0F8A884FA54E04F19BC3A9F60013 +sk = 821B7B150CD6E32BDB7AE113E1361066BAC0F25E5BA052A9F7638CC9B75D0580109665ED8F70C570E8B15759742D0C5B4A971EE5250AACB565160411F468E400D2F7EE40FD6DDD7A61A4BA50CD444CDE9411903EAD268A6C33CAF6A16F53DD93153C84A6A65305568A937BAE58BA2DFBDBEE1B0F8A884FA54E04F19BC3A9F60013D1E8234BABB731B7AD92CEDED0C08669B5D27B2BA709611F4E582F99C64D9DF13502000000000000000000000000000000000000000000000000000000000000785E4BFD7D0F8B710F0F8067F6BC5E5DB8BEECC2932FC5F34D21B9429A47BDF345FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF035EA602ED2CCB5B95501E154126C58102319C38F5CD2B73268E58EAA7EBBD480CFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000885007B94052CDA59E95669A3A15C097C6BE000CB8ACB365826D8DB874571891FC577C554365ADE8C2110CEC5062F3B8431A02664C2911B64F072C9055850E25863A38AECF8A9334FE544B7E616CFD2ED7AB45CCDA2EEFFCBF1C6F8E5435935CB1C3381303DF128B13300C47145FC23AE734846518FA88446D1DDA3D3F0477EB7917FFAF443389130D2F81E90B196C168F86BC58C856DB3ACA00445C457AD3D3F95C72F17556A7F4369925EDB1FC816C5433CCBA19C587AA8F07B34303002FDF662872022DD687B3B8A65434FA0EC376657CF75B0A01C986756F7B3246F04550A8A07435201E3FCB87CEF68C17EC0B81D6712CF8C017BA6F11C7DC01 +smlen = 3229 +sm = 693F3095677650E3F22243DF8ECDF0C8009B15AF431B9A898540BA2F293BB5F382377B1B08E3926C3DFD8278BC019FFE41131053C0FF3339206EC99AD7E16A0168929A621339B6AC08F1DCF0782BF639C6A84B889147D0D1E92B099727991412F9B332C583BBA69B2A2FF190C4A1DBF7CBDE019F8C991B1C9FC6603EFCB948010002D174B4845503EFFC4AEE16B92B9BD47615B792ADA73B674676FEBEBF248ACB4DB84A5E26B807B4AEEF3C549E3B1743BB8A478FB77CDA0F0F5B4FEEC5A82E267192BBB3FCA06333601353933BB270CA8F0EDA4C48BFA6EC7A45E21932E5A45467A4C110AA66253852AFA6C5C9FB84BA95B2DC43D297AE02DF9CFDF333A3FD4804799969C619192AA0EA8E214CE7BCC14E1AB72965A47221144264E5FAB38630000B06BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C + +count = 89 +seed = DAB6C05E29342106CC34769BF419ADCC88010C05B57E673A503E63AE7A4EE55B72AB2CA86C4EF57FC8C02D2E0C8694A1 +mlen = 2970 +msg = 4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D +pk = 09011E5F0041EFC3BA9C542053B27B8EB2A85C7F2D1FC6FBB04FA31C10E3DC70259E65D4DE2B616E8DAE4CD0D8F727658EA5971EEBE696B2B1A6DBA23A7D4D01B745A0CD7D6F5443F214979FAB466B009EBD1F7C16E2A27FC70D3B38A9D53F0A7A4B0474810CEC9CDC0789D3ED456D66B0E634996868788A46E96E163C22520111 +sk = 09011E5F0041EFC3BA9C542053B27B8EB2A85C7F2D1FC6FBB04FA31C10E3DC70259E65D4DE2B616E8DAE4CD0D8F727658EA5971EEBE696B2B1A6DBA23A7D4D01B745A0CD7D6F5443F214979FAB466B009EBD1F7C16E2A27FC70D3B38A9D53F0A7A4B0474810CEC9CDC0789D3ED456D66B0E634996868788A46E96E163C22520111B71FC6ECF630F26160018F35568F98C6E69CD44AA8D97577A6C8800D7DBB80C1B0010000000000000000000000000000000000000000000000000000000000003635EEECA3172FBDBC6E10AE70D7D0138D50D80C568289ACE4FF3AB6317AE129BEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D59FDA60155E00457763350136FDEDC746E70B0B14B0DE04D4B552D895627F27EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A7CCFA8E1B2462B0F31E9F80D67FEC6D89B647197BA927CF7BC943B8E6EDBA6F6095A86BCF2EA3E3C13F2C69B96F02EFC3DBF3E0496148D0A233F80FE35D094742682ACFF88184424F9882D6CE8B037AA9342954C5ADE7327CD31B72632337FDEC09700F01EE761B83C01C4DF20BE22158EA4054AFF457CB6859C7928A012A43BD16691A4E61E329342E998F49AFFCC7C463E5F87CE33CA0E84AFC33E1F21E2B7713CF911D007A9FA91D173B450C8824FF5D485A75CC86F579EEACEF05FF3BD034540937830C60BC9BC8287DDAB549685AE5E2D4129576133261F7A2FD78A7292BD047D063F2D2C017005AE8F80F7BABE768BADCFD6103EA77587000 +smlen = 3262 +sm = 73CDB9409D42318620A9E5506B12D826C25D0DE32764B1896B3729909C67E12EA73FD37734B25E113F3B722216F1FEFDB404A2AE23D2D2E31B6E190ADEA7980031D99FA10004D60C88447B0299DF100D8B3DA2B19608E68ED7D0A8DC60DE9678DAA9F8C19E1D9214929141451817E0243AD7D5978D2FC410EDB515062D780E0000017BEC1CB7A960F80B9C4A69690982BF185B41CABEED7FB7E5B7F2FD773C48237CB95CD2CDB062031EEBEE657AD867B9B8306F63C948A57E4736F05F67CC18C736A06F015AE336144FBC61963A447769C9DF8AC1D1DEFBB715309F558E0B34576D4A8DB217E6D1DAC7C2D0C7C221E88433CEDAAC205166EFAEDD46A76F9149CE56E2D9B8DFE1B4C7074089238006853208851368A4906DE91D38F84B213ED61500020B4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D + +count = 90 +seed = 0CAF47BD9AABD7D09FFAD404449BBAB2E1D48E80AC78550831A365BED8765420DBBE9A566EFDF20D4E5233D7848582E4 +mlen = 3003 +msg = E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 +pk = 4D03481EE77BC0AE3E42B2B7A69A2D8A3FD516495B76EC82D71B1B7F478D559C1A33FC4874A1486B9F5213CB6AF92F3CF2C1AB0793AD9B795BA1A08298B40200F698121919A54AEFF896F98300EA3D7CEA4A7EA04199F768CA692AFF60A480AEFAAD3FF6B6EB6587E6B13F0D2DF1531D0D143E5AE040992090BC1DD435C8B40009 +sk = 4D03481EE77BC0AE3E42B2B7A69A2D8A3FD516495B76EC82D71B1B7F478D559C1A33FC4874A1486B9F5213CB6AF92F3CF2C1AB0793AD9B795BA1A08298B40200F698121919A54AEFF896F98300EA3D7CEA4A7EA04199F768CA692AFF60A480AEFAAD3FF6B6EB6587E6B13F0D2DF1531D0D143E5AE040992090BC1DD435C8B400097968E1E2913586C35AD41B388DA8FB83B303410521521D2E1BD3757A4AFF409CC80000000000000000000000000000000000000000000000000000000000000002CEE80139B7CB70C195C93ED78DD3E095F9332E0DECCCF421323F6DDE576BBCCAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF236A4F48E21D61936007E88787AFF630DA178C3B7750A832D32E998B2E02863A97FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EA6DDB9C25C3C98B89CF31B3CC86F9A157B71C028E79C4DCD4B37A795DE9ABE0125207DFA7DD28B81A4124963921FA10CD5635AA12ABBA9A4FA48FB78D5104A7625B8A98D89A152ADF73541ABF0122C655DF2549CF3742D28BFF5D88F5EE372076EF980870965180DB1FADBC36A1BE2997F87ECAF4A4100A0E03B3995B07D97E2B454C125F8F74D7053E3B2E2F6BAE3CD5A1D01B0744FF20785ECDF114AB74960F8F3B5AD0CCDE3D03389772A1A2590E08B0D7FC563F0D627CF688FF088368333FE0F1A4639E03A86B790FC9F357FA0ED40480295C454CA7B52C6F93BACC70622A7A7468DF10669EE4B60C5A6B5E19C227491E08C7473777661F5405 +smlen = 3295 +sm = F768E5969E00D134024EC9B0CC9D941DF374454A14A9BFB91768BB8442967DB62D767434CBE2696105AF786CFE19D21608B3A1D54981F487F1D2B4950A384701E4DD5020F681E892AEE74B0FDC2F9973B5AD346A361410E3E00FEF39C23E23877039F7B523C8EF331511511FD953DEC218503231916017B296440975FFBB8A0100006EC339408ECE4941B90C81660B43D2867DFC54D32ECFA79C9E672213FC3B406AB9C7E999412E3ED3E00095CA046D5AF9AD6C1D2C9BB33530EB228B2CFAE2616185BD7F06C9D877259BF569BB700601F86F7640D776FB3EAA8696ECD269A6356558D38AC0D991B577941E9CDB58C5EB66DD636DFCD5F8B6E00368F99CB7FE680CD91C17858021F530AE83C5BD55A563C40C318B3A76941054CC9AC2F17CAB7B000904E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 + +count = 91 +seed = 9564E88F336C091EAD50C893F3EAA8351FA388682F433F7A72A34731020B9C96DFCF75EF5EAE47E12684AFA51EFB49B7 +mlen = 3036 +msg = 2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 +pk = B4B7FFD1FB04D359F1483162745DF70EB6322895920F66A2F4332BE1F3E1FA87BAA4158DC1057405D0236D805999DC48A2101AAF10BBB9A9F581FC3027785500E957DF0E95D3511288CFAEB99266E456225AA11E5A47B4690CADC10199AE3C8C6A9FC0DC958463884EF5CE43FBF4E9FF72292A24E83BCD35C6ECF1A042895B010E +sk = B4B7FFD1FB04D359F1483162745DF70EB6322895920F66A2F4332BE1F3E1FA87BAA4158DC1057405D0236D805999DC48A2101AAF10BBB9A9F581FC3027785500E957DF0E95D3511288CFAEB99266E456225AA11E5A47B4690CADC10199AE3C8C6A9FC0DC958463884EF5CE43FBF4E9FF72292A24E83BCD35C6ECF1A042895B010EF996B033EB010C9C77C950BAB148E9A7775E9D886044817513DE90E06840685EFA00000000000000000000000000000000000000000000000000000000000000CED0F810D025BAB7F79B56AB5CDF0305CF9052E4554BC5A56E88D4A05174E960B7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9383CDC10957CD38B8BC222A23B376D3BFC92782957DD64A2AFC1FEB58C384FB3EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053F90EACD2C221C3D8F6D717F1FFC07E2B33052D4F6D607E4AC257BD6180F4CC72B38906AFA445B7531FD28F9A25CB3EBEF30CA72AD7AFF4489D722A5FD06769BBD3BD186FFE886878C25A5B95CFDF59A28164473A9D9FBBBBDBA0664C34BBB63B247CE29CD621F2CC07A5262307AAB6FB07A9EFD71928455E75185320AFCB50890D36121D65FB89AA3349778DCC0A1336E38D31B4C36EEC487AEEFFCDE3642FD4A9BDE7F2C6F30AF027039768A1556B3AFDCB38208F9C2DD58E53E0F47F912A8047F134A7FA52382F6CD57633DF5D1B8A660E6CB192831A438AE526954A18305BF60B04AEFA58ED4EE4C032F6E123772B02596C1D9A6B5926FC608 +smlen = 3328 +sm = 6BDA4F8172AE6F3469EE167072FEF4FEE840BB273A3809FA13514E1CCB4164C8DF97988666A1C2EF7EB262C257966497EA1EF2811D3D1F278DC1047F0725A40147A28F934DB95ADC094607A03607BCEB95252857369D4295689A9B1D9D443FFC14BABCA1856DC6F0F0CD2D26EFF72B920146D7DAC7C3890A2AF494F3C21DD3000001E564018CF78104D69C6E1D834EB4606DEC23D9D48DCFC480A1D3A6838F5C4668CC20530521B90D4E83EBCC89CDB428B5E9A76ED113496AFDA3BA6FF6F0F3A421A7BC250A1E3DF8196ABAD9932607E53140A3F740534A987B4820ADE481D034364EB44490BE3C5DD918947D0E118D5E8D7F78BB1A5BF2F2A0841220CEA37419257E104EDD1C2CB0AC844D236BD99CFE8FB4D547B08E3402CBA2B5F290E4155D00060B2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 + +count = 92 +seed = 4D0788DE958A707899D5DCC02F756A10DEA2EFE0214F5E01B3281DF4E013CA75523ECEC64723D6C8BEC0B92C4F821D8F +mlen = 3069 +msg = 9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA +pk = 8817CF0B031E55E105B2E2E368E4526759435E23FB9C6E34CD4E5F5F2C0BB651A42DC7FD91BC1E0CD9CA21158BBB2F3E7C41F0E6BA10E73110987E63BC374F006301AE082CAB9F78875501509848BB4972AA5C5F91A7FAF33663602AE78A75F292769E0BB66A9033BC24DBA9FDE54F0CD276C6F814B07060D53A128C2902490004 +sk = 8817CF0B031E55E105B2E2E368E4526759435E23FB9C6E34CD4E5F5F2C0BB651A42DC7FD91BC1E0CD9CA21158BBB2F3E7C41F0E6BA10E73110987E63BC374F006301AE082CAB9F78875501509848BB4972AA5C5F91A7FAF33663602AE78A75F292769E0BB66A9033BC24DBA9FDE54F0CD276C6F814B07060D53A128C2902490004DD6681345EE93EB8C524DABAEA6328F312703B20D141C21CEA4D9C215997409182000000000000000000000000000000000000000000000000000000000000008A99540BF764C262808B636136C60739687324E0E5E2F7400401D6416DFC7B9E1DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2FFE27F2E10324EC00C223564DB318C99AF3FA5A1F325FA4BE484342B91738893EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F9E1BC180A6127966A11015058CE0D9D00544B1B0B70CE377F61E34E37BF0FA7ADE0D8652E92229F4F4F8717C8AD5494256900EAD22997A7F87637498949058ED180A019D8F2CE2D3AD3260F19ED23579971F0A27CA58B48D049B2361CA1ACAC5D4098AAEA016A1B4621FEC1B5C20BE38CD59D0112666BC5B58BA46A01017D5F488649CC7B7B227F6F30E439F86F438C2896AC6F6AE60D868C2AAF8BBB8593648D6360529737C9B63EA88D65CE4540D5A6566645287716F7CD199C9507E9F228A9070EFA5D67E8F85EF1CC251292F44C67205D88602707E0FECE0E9E7C740C8A7CD12DA64857FE6EF4760BC2C9763258824C2339F2E89B13614B5304 +smlen = 3361 +sm = DCCD45F5E653A884B0101713B937C7257DA31C1C8FCE92F7E374811620D434266396D784E3E1A86567254B75D6E5BDEA780F3808D2A2BEC1CEE291304665D5003BE63F35BED0DEF9772718782EF15713540D6342CF0336B837362491E8B62916ABBA6CF01979CBD9EFB945C6BD2380F84EDE19434EED6F5B13B7773370BD54010003182E2D7036BFC5A49F338A793DE577A3D3AD8163AE1D3644785852BBA7DD47439D8C6763BCBC32F0CEA50837BC2F43164283BFA077DBBA54F18D811390A43A1408EA666D3CEF4014C5BC9F40AFBAE4774BC984AD27A08EEEA820D5A3DDD8CE51460A4D406E92795FCC3EED89CD99F75495011F0F8D670AE81784998CCD49372726F9F034849BD4899BF5111618CDD14DB530C936B6CC4BA3DA519EFF55167B0002099163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA + +count = 93 +seed = 55A9C7A0B49706090BC0702ECFC070AB060427FFC820C3FE05B499B59AEB125F2DB4787A5910B88C6F8FAF0A69BE0AE5 +mlen = 3102 +msg = 02C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 +pk = CCA1C3A188097F2A4F67AD963EAE9D595A6F1EDC56C3C1258C0F2739AA0C1EB3F8E0238C8CB0094319D9FCB1837375A46874E3FA49008C3E86A4A28B6B74B80022D15CB01C571E14700A31F0CD909940BCA75CAFE08386218AAB57A48F4D4E9688CA1B944D1742EBB8C15F3E83A9BC5D54648A6E02DAE02B0C287095C0955A000B +sk = CCA1C3A188097F2A4F67AD963EAE9D595A6F1EDC56C3C1258C0F2739AA0C1EB3F8E0238C8CB0094319D9FCB1837375A46874E3FA49008C3E86A4A28B6B74B80022D15CB01C571E14700A31F0CD909940BCA75CAFE08386218AAB57A48F4D4E9688CA1B944D1742EBB8C15F3E83A9BC5D54648A6E02DAE02B0C287095C0955A000B071A661E11B7E9ED6054601CAA81B0E9D871A17BAF6A47FF6D57F9F3F64950A84D00000000000000000000000000000000000000000000000000000000000000366A8C762652408E43AD91934E1051C43EA32A79825833FC314626BC16C2C9C4D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5356342BB1C1C3215B8864BD3C26C6BC2AEDF04367D510F1EDA5ED19F80C0A7CE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F07335B6ED624397F5D0342175EFA85FD5CC2B79FB4627127D69F6BD0E28F03AAD5AA0DB63B4786E2D81D1A25AF8E2DD2AFE982EB2E02476C1FDDCA69999012BF299045852C986D79766828C6F3C0F260A7D7EB66C96FAC85498CBE49F717213EA203FD8A0027199A44567362682A41C7F5DCA5131FB9DBB0DC2AF199605E33552243C916DD14E585B4F1993F4EA479EEB8DF5D357ED32CA8736AC87D8DF96C9F85D0FE0AEB4BD38FD32A373D1CACBC15D079CD7843B7EACC03599E30122A3F114798708A0CC81797B8A81A09193DABA3A6598E7AA27445B5E32E057723BAB7F2030EBD673E58A518870B8E886B3D1EC2FEF678649DB8BA6BDB63C04 +smlen = 3394 +sm = E55BAF22D47DE81B66EA8C0EE3054A55EF2C4BBB25C9AF99D2BA6B08EA79113AB999FA1BFDD610129F8E434FD903BCF11AEBBE04F896D3DD970D5F49DBF25801B3FF4BB67E1E7CD785B38B3259F674333A81683B69B298749AB3C5373034E3F1823857F0867229467C930BAD63A87A84949C85B480F05B45E77339FCC13D65010001ADA45FB232917ECC2E396F2C38F7F60F295F86EF918A82D3CD5C9DBBED94446753EC28CA9FDD0CA597389F047379439E34291A2B8E8F7AE64F97A56EB25DE06DF47562B145FAD19BDCF5EE590A4EA46E3FD4E2F5427A025F43CAD8622260370B4A972496FF5046718A70DA66FAD303C3CE327FD895A4980F935A8D9F9EDB206D418A34B383FB57BD95CB4EAD0DF5C6EE7C56B284B4B2C24ED05C79F6BB084700020202C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 + +count = 94 +seed = CEECCCD3F7BB922650E3F6E8F20C47AF17C1C1053EA8FE08226F167D67C3B0781BD774C4C7AAD23C6AB0B9F3E3F96F97 +mlen = 3135 +msg = E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 +pk = 7AFE52CB1E1364ACE004442CEA86362995860AA77122ED732D4861DA41E32BB3FA2ACEA9966050A84C54C773992B8EB91FE214D73ED5838B2F540270EDE69001827B7610328EDA052562F780D64D1A1331A672FCB37EB1088E5941EA67CE44DCFF8FD5E812055E58CB0230FE2414F72AB9491F4F47EAA22B79EBB3DB96B2550109 +sk = 7AFE52CB1E1364ACE004442CEA86362995860AA77122ED732D4861DA41E32BB3FA2ACEA9966050A84C54C773992B8EB91FE214D73ED5838B2F540270EDE69001827B7610328EDA052562F780D64D1A1331A672FCB37EB1088E5941EA67CE44DCFF8FD5E812055E58CB0230FE2414F72AB9491F4F47EAA22B79EBB3DB96B255010901F641A120EECA7C4058D2D9534FEA426E0F1E7CEB0A0184F58CC984C7E063D8BC000000000000000000000000000000000000000000000000000000000000002CE6456592BB5D13017DFFA95077B48F773E99C6E8FA98476B9D58CE4AA00872B7FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B7EAC44F1DF9CCFFC428F1C3BB91B7D102ED3635DAA577778A255598677BE27ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ADFCA5BC2D2448E118DEEDACA8FF001838F0B22F9DD1FB90FEEB634BAE7045CAE1D21FE8FA50EB33DF6DF4A20686E65AA1AF2D42B8101A28BA917886C6650DCEF510399B4B54918ECE7912FE23DBD72372AC1BBB7986D9815C7301C2330A75AE6E605CE2F0DF440BEF7D1EFBEC8718A94E2EAB40FB001A81EB2AD45A4302CD25518826C8C995FEA5DBDCC17EA459E37816C9CAE84478F7B59CA38AF99B51A388E2ED818E49B5C72E0BE89698DCBEA803DF3D2F1F37CDB0382255F72C09294A91B52D74A92D99DF870DDF3DC80268B049F49C92FEF6AEAC0D69834830CF5FC6159D4A0CC0E44A97E5B9D36BA930C4EFD2D16C7A42C96395DD127BB40B +smlen = 3427 +sm = 72DEAD3D0AEF359A67B42F9A57667DE26591B0BEF1C5586D39C694FC07C5324DDF691B6C1CA41A2C9B9E0E884034E5AA572331325D857728AF4806211B88A00155B04904D408826896D20AE30B002BB7A7ACB52005F28CD9FCBFC8A78041D52614A368E452EF4D3C9DE03D4DE29AD964FDDAB6BD833AF787103E94B6D88EC3000000C284DD0720E89AD14646F52B61D031A4A6A37E9336F61D18D3D0AFB12DFA5B262FA0F7B8BAAC6C6EE8D48CD30501ACB38631D96A50F0725C0A3DE27EFBC5687BEFB6062F024AB5E39BD57AE2BAFC0232D241B56DB1E9AA352924F4728EA13F0EBE023373C9B804B6E86F4346AE945803A1020E5ED4C1A58032F8722DB8F42F78C7F84A5ECC7C045E1448ECB36839B80640209ECA7A61195C4E1DA0571C6275000902E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 + +count = 95 +seed = 2489C04BA57D149A60F446670C13C29998B52F3BAD548A751D7134B694DB25ABFA034FB4BA45E105AE27D575CBD02B99 +mlen = 3168 +msg = 1F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 +pk = C222C9A0C160E739A876FEAC51437BD7D78AB6552A3BC241DF53773171A1B1114FF99359A44A50762D3A12FFBB76E7A84CC99AFD4A79BA195C411A434F78A4015E30EDB272753DE7130DCD81C3A7FF8FB116DE99DE432F574C654B0C0365A9C44E3360A3EAB99174897B426967DF2828CC88542CE87CF97EF5C0D3A739D10A0009 +sk = C222C9A0C160E739A876FEAC51437BD7D78AB6552A3BC241DF53773171A1B1114FF99359A44A50762D3A12FFBB76E7A84CC99AFD4A79BA195C411A434F78A4015E30EDB272753DE7130DCD81C3A7FF8FB116DE99DE432F574C654B0C0365A9C44E3360A3EAB99174897B426967DF2828CC88542CE87CF97EF5C0D3A739D10A0009FDDD578DC47027D201BBB2D6DE30370FC24581A05D38304FF5C7043F787017882E0300000000000000000000000000000000000000000000000000000000000086D174F1102B69F0C5BE7D86CC59794C46C2842E3D453A56C560581F71D7495DDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01AF1F45A956908CA9B28435F30E86F5A7CC78E2F996DDA4B51BAE6E8299776638FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B18FEF43EA497C2F542A5B454DCE57A30F64EB19ECBBCB404631AE21471C982494319F2CB5BC216601781052ECF620E15E6874A2210C761D0E42AFAD5BB30C44EECEE5A7CBF9843FA3C8E983C08390B0298A1B04CCDB48BD1DB173E655B3BD193C8EAA5DFD52A33BCCCA38AB50CD455AFB837764C6124E0299599921B407DCBE2D6FFE574672916AC54F8B209919DBE6A062C22644B62FDCD6085EBCB6426EB3E03B2B523439BE3C43B1164BAA32D92FBD3E3E469E6CDC225AFCFCC40E5B568E32A9E5F3B6BE2E21BAD079A574A7BC640A3AE50EAE8CA967AB419E0BA677525BD418888AD16FB672959113C710F677F857712B03452FF3951F86EF03 +smlen = 3460 +sm = 42DF0DFF44D5EB5CF5D6BEC46EFA4478EDDE1827AE1E63D2B33B77781B36EDEFEF5B5964E99F83E99366EDC66F2C2FC3020AA17C0459252FECE3F5A4C5B7D80030688357F7D5C6229EC43EBA8ED567F755B868222278D65F7DB4B7A71A13DB66E891421C5BFA66A9279F08062BF87CFAB9867E493519672507A4A17AB64F44000001A54DA1239711ECE047E65B9738F10D1C6DABB170EB7BCFF4DD9A6009CE0D5777877F944860EE3CB6A9F1166D2E4E1F68CC7CED9035A17630B73CD0E2E3D8E313DBB3A908BED16E2396CDBA34850D6B573F89AEE6F32F580B57D0AA0E55AA6E1D1F66B060CD4D6B32E4D5E70C0ACB2B6EC35DF0B379B510338F8A03E6D3DF627246D264BB494811F812690460DAE26C7EA22023C1726479ECDFE35BFE1D1F6D0002021F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 + +count = 96 +seed = 26CF860726D4DFA38AE07399838BB336F1BEE59E9F23AE4C81E73D49964997EF21CB5F5412F9A70A1EC39FC6228C36CA +mlen = 3201 +msg = DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 +pk = 4E9C384C66402776D1F26C99005CBC096CEE17C80BD17601C6AC77BBB94BC923ECAB3C86BC5B7031BBB7C4501DCE5636C8FAF545DE86A706F02BF57081E20100D8F1BAC3F8D252C463706CA5F3D1444784791B3C135A015AA75FC0915E22CFFD2278F6DF5967EDD74C1DD932BDEC5670DA0801D0408014FF13CA9E11F28630010B +sk = 4E9C384C66402776D1F26C99005CBC096CEE17C80BD17601C6AC77BBB94BC923ECAB3C86BC5B7031BBB7C4501DCE5636C8FAF545DE86A706F02BF57081E20100D8F1BAC3F8D252C463706CA5F3D1444784791B3C135A015AA75FC0915E22CFFD2278F6DF5967EDD74C1DD932BDEC5670DA0801D0408014FF13CA9E11F28630010B65D414B8C3631EA754143B4C4B0367B775B8500EFC2C0061F5D25D21B4D395D8BA000000000000000000000000000000000000000000000000000000000000002EE2826325537658152B6E29CF2027EB9CAF84182868169B019661B1C57DA0ED4DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99A5FFA2AD0AF8D13C5639EC9D291FC8689795B20736D8CC20997062AAE2DF59B3FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033ED6154985C2F341ACED83054CA6AD639093573C75DD0E41989234EB6101AB0F91C373EA902AF34DBB73736A26FFAECCC00381996F5BE5657A0BEEF5A8407112BA385418C738244C1EDD51418FAA6CCD0F167E539155A93F14663DAFA52DCE5C638796550604A42EC61C75E10257232CAE11EFFB8170D9E7E4763C6DC014A2011E5BA442FEEDE09144F2672EEE77C67CEAA40AA4C73F376DC9A832AC05EB9D2EF8EF29D3ADCCC630960BFAE8546A7A74EA3A74F0ED276280A1E08C7098BCD5C354A6FEB122C6B19C7D41535391AA29473384CB0C1593A7E3B1DA9D3A2515CF15C7FFB113EB7CE8C9656EE68D5B5A926DBDBB7864B5B0C11B9F31901 +smlen = 3493 +sm = 0BFA785A12181E572395C21FD4CFB62C6A6F4DB80154EB528C950ABF49F9D18D6C9F5056D55446E3E2D6D157491317640CDA545CB5281687D4C688217CE6720096AF242A2C491B22DE39C8B25BD1E406E12C4F228DF10B68868845F401BE37F5DA011639683C1B6E888A8F27CAA4CFBD8200B8E246140E88AEB10E5E61A7160103016DFBBBF41C2367F97897A02D7DACDA6B22418855B693FCD3A1583977E93712063C86520B97ED08EA101B65748D8CB31B05BFE36D4665F85B03E2EC8C4825EC00ADD63D03AA1656C947FC9C436A8421D6A5C890955F53310E7AB4F3C537BAFA008A0260F993E94A824ED5106EAF3E612EFCC2CA6AA9E639495B1854C1B508DE0270D6C87D123E24784AAC0E6172330B6BBE2B37276B85F9B417B0FF8AB9232A000209DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 + +count = 97 +seed = 13F1F446D9AA5AC853278BF74C9E6447A6CE4294C037867F43DF554370EE261D05C7260EEBF46D6694D0850B8343FBE5 +mlen = 3234 +msg = 525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B +pk = 32AED15B55B865168B7299A24D4097DD2D58CC448836523D4EE62AF13994F44257C5B6BEE3DCAFC15F79663F99319A9FE88F3F0540AFA4809BF08E9E16C03C00735A85D78EE2E65116F86CC95C9634A430BBA009F8141A9CD47B26EECB93BB885E87889D9C56DF06B805199104BDE23ED41304785FF366A3FD0FB42231449B0106 +sk = 32AED15B55B865168B7299A24D4097DD2D58CC448836523D4EE62AF13994F44257C5B6BEE3DCAFC15F79663F99319A9FE88F3F0540AFA4809BF08E9E16C03C00735A85D78EE2E65116F86CC95C9634A430BBA009F8141A9CD47B26EECB93BB885E87889D9C56DF06B805199104BDE23ED41304785FF366A3FD0FB42231449B0106E54B60B727568B78C006383DF1E786F8F3CB41E114412D0D72327AB88B07D3442B000000000000000000000000000000000000000000000000000000000000004877285063324773E8E02E70D9ABA9132A4F74868838C400883900F70C7DB55DE4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1139548EC3C39C12AC8F6E5F69076BD727377D634C1E9A61502DB71F7A26B592F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F534C70B654B872ADCC57B6B90E6C6E0AB8745F7B1B17D9AB8A27649C643CF9C08FE4C874FC611FA8A56350ACB833868159642F9A57A2637853A09ADEF90D5E08D865FA15D721E914FA7B09C945E8AFE5CE38CE1723D354140376CF7C03B8AE4E74F2BC537CD8043537989230850CEE1F267C76FB49E02F5E32BC64E60E43A870706F274521286A53DFEA9CA39E8E671611ADFE5A7EBC8E67B38F2EC0270D99BB8A6D7155DBA664938A9218E7FAFF62E444B98127BD5077ECCA14FA0B8D304242550BCD854AAAD49B559D927E6F6ACAAD9E05DF7E9AFB6608E687EAA2CEEA909F3C42DEDD42CCC1B6AEB6C190CE4C5B3EF8BB3D34A3BABC62347201 +smlen = 3526 +sm = DE0B89A68691DE10250D6C9AE703436167E64DDD75E7A8A9605FAE07E5F06B4D6F93DCA8C8170F29252D3ECE877086C8A5B3CE0450EA4D9EB3F3DAB86394F600592BEF86D47FB6A4438398122B91A847044CF0EC43866125B8AC0CAFD66851B55C88B7D38E4DB817C1B30B143ADFFE3AD3658D4E3FD4FDCD055D146809DBF6000202CB45BE6C0DCF8AABD6FA6FCB9C6A078A4305F5958BD8E2781A8B69A2DF80FC0323894B0F6C2F564B72252E0C03483D8601C669A646613C28623657A127F1B406CE1533FD3770875F3BB0077DB9A8D7146D65212444FDC540BEDA678924703D089A92D746846EE6B0FACAD2041B5EFD7650B416EBF5D17F65DCA19404AB99B10F2D078EB9C63EC8477A7293219F4E7E71D7BCB4D339F7179451B534E4E69E0C000206525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B + +count = 98 +seed = 6F6E47E8336ADEE99B2C52CF2DC8D461E0A54C3DF2F08199A9F0816AF8455381054CE47A7766726D3AFC2E2F2BEAF8E8 +mlen = 3267 +msg = 00769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 +pk = 80B0DC9151DCC6100784C6A67BA5F6D96FF2BD9D74AD42AE6E2A5A9C2552752548EE414102075D8682CF3F4135ABFADF3BCB903F63CF3EDA35F65A5EC95D7C0047CC38045B2BFB17F32B075716E578891557C6306F4CC34F2D1BDDCE660F445A47E6ED5160BD85A6C6B34DC783FB9F4D3DF5277C9BC4CC7ED4F59BD6404B7D0011 +sk = 80B0DC9151DCC6100784C6A67BA5F6D96FF2BD9D74AD42AE6E2A5A9C2552752548EE414102075D8682CF3F4135ABFADF3BCB903F63CF3EDA35F65A5EC95D7C0047CC38045B2BFB17F32B075716E578891557C6306F4CC34F2D1BDDCE660F445A47E6ED5160BD85A6C6B34DC783FB9F4D3DF5277C9BC4CC7ED4F59BD6404B7D00115160210CAC4BE8B9E766A3E57490D51037FE9790715E617BC0896E002C6AE29E6001000000000000000000000000000000000000000000000000000000000000AE150518ED40A5A2BA70F274A0E61234153D4C370F094C6DC846582974590A1BC4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDC3458AB9A74F86458E5045EBF5356403A585160FEB8DF9AF05F5D950166135D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024328D9D48861045E69E278DCF9768C8E37484EA31EF0BCC1B0E3AE8FAF34560ABC6CDCA392969CB3E0EE61C3ACAB6DD1A1F50360DC921AAB4DB8C028A3403FF5A594FD68FB119A1EA8FE44384CEFF72DCDC51F77DB98D255296F4CE4EBCC1BB97B647BE0585CB50A4CE609FA00C95F21A90921E0B365A05B7851672BB01EFE2B8B332F90A7990278DD8B32F21CE49C2C927EBF6763B5A309F48B33E27D64994A681341178CCDA2CA7C732F00C3D56EDDCDC08A019016071F3D004E70CDE3FC90E8E14CAA0AA2CE2994933BADD4BF6DCC965043E171A49CA2ED4E1A7CCD5AD4C6F39C8C6E3457DF1355886B741378DCE36B0804FBAB2638F36E43309 +smlen = 3559 +sm = 965A7065AF6DFCCC603866579CE7B79C15B97F81A37D57D8C196DAE17DAA6D132B614EF12C741BA34250F3E9D199ED92B7344DB19150EA7FF2027D137ECA7501A6CF491B3E6D8161DFBB472CBFA5F99E81BA0023D16C6A53D54496E3571CFA17208AC1EC89550F353D99A3481950AC6DBBA7AFB81C5CDA1C4C5E76B58C393701000007718F74225CC164DF5B1641D471902891DAA472F578B7E2A421D4686C5ADF41FAB7FDA3A5B7CE02AE413D8C71A21DB90F115C14B5A59B2C163FB84A45B6C02A0CB895498302B4734F148EBE0265AB0291570B1A519C0242BC901E421790561FE5C809BED987F28BE61216C88775F1FC0C2639162BDCBF718243CF2BC60A9F101071FEDADC727DA69426382DC4AFBE2099CA8A95C4036999CB20C310D2E84700080200769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 + +count = 99 +seed = CB2E6226615393FC3BD4AB3A412AAA030AAD40E8648EE6B56D2C1591D8B97915D88F2D22F7221377B4B04CF2AE9ECC4E +mlen = 3300 +msg = D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C +pk = 1740ED04F1FFEBA0C76FF93F193B4CEC5A6E320E14A741A8C3A53D6783984E1AAB37F3DEA54ABB7F2872CF7B5BB53B1C92171CBB6DF13831620D7798A7C94E00A38C466A38584F474830DB11C0E6397C5878A232ECBF4E969C0309B03027AD9A74D8C70A15639DF50BFDF0A7A95C409D5E9F6B5B5B7B7B9B5276D97EA795180102 +sk = 1740ED04F1FFEBA0C76FF93F193B4CEC5A6E320E14A741A8C3A53D6783984E1AAB37F3DEA54ABB7F2872CF7B5BB53B1C92171CBB6DF13831620D7798A7C94E00A38C466A38584F474830DB11C0E6397C5878A232ECBF4E969C0309B03027AD9A74D8C70A15639DF50BFDF0A7A95C409D5E9F6B5B5B7B7B9B5276D97EA795180102D523CCCB5C5ACECB3F4B741D2F7FB2379E024A682E1A08268FFCCA2920FD7B93430000000000000000000000000000000000000000000000000000000000000046D65DB2CD6D6D2F27A050ECD6DB7BD647B5CA50FD9A3445EE10B2A1AF4EA9A8F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B80F113DC97D57F3BA72D02C034BDCCA563F96C1C8F933ADBE370E2AF9CC92CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022DB311DB284B8E8C9CE5CAFD84A7375A6CBF122034115FE4CBAD2BF22AAC010BEF1811C21764CA0C8AF031805BFA3A7A3DB4F8BB322CFA5BA712A45CCA9057B1FB8C586701F281E1016A91200F0EE60BAD04E080DA7187720199334EDBFA1A80750BD9A37EA762A2B7BB2E08CD482DA3B786C5C298230458A2AF5E5490F878B2A0CA4DD8B0E1B5D7EB3465DE1D3E531B678CC9399B30B8CE8BABCBF8F2A0DB6599B8BE5537CEF2B7FC8D6C24EFCBBE15137B1E00733624A9780719A0888DD3D1AFB9C0B02661E608111D5F6D1DF8C75F5D711985FECCC1E43729F92A15A197A4D4C70D6C15AD880CC6874FA5E263E47ADE6FBDEF671F3F6A8ABCA04 +smlen = 3592 +sm = FE19C1B5CC41F9F0BB396534001C2E254BFB5C7EBC336AF736BC9AAA640D3B60A77FC92C3D532509F6D993D0501C98F6EDD3B8206F6ED3889F69066F8B0E04000CE57B6110DF235284419EC77E98925273FE1ACCFAE63FC1A3479382BF7CC97CE7363E1942B06BC0F4C6A5B4DA015472C9EEF37CA9BDA12AC3B0BA3BB6106A010200DBF13106F1C5F82595BEF2C1AB27CDF25E435022E814B806E51026835AAAA4158F3884A4D12E127954109261DF940171AF5CD0741D069A2E8A283CED3E63C21E2EF1D31FF6BFAE29F9472DA2008776E9F6C6BB9079F29418CF65E278ABF0520F8122AF4D721739A0860DA3DB8F7815657F9A5029411B1DFA0B9651B8AF0DCC11D9AA0C1F05D2C4DE07106DC9394B355BA947FFE5B6CA14410638DC95AEC671001104D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C + diff --git a/KAT/PQCsignKAT_782_lvl1.rsp b/KAT/PQCsignKAT_782_lvl1.rsp deleted file mode 100644 index 7b90b8e..0000000 --- a/KAT/PQCsignKAT_782_lvl1.rsp +++ /dev/null @@ -1,902 +0,0 @@ -# lvl1 - -count = 0 -seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 -mlen = 33 -msg = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 -pk = 9CD11509551D641707A4D8965860CD0FD782CC1C8725B542C4DC785DEECA56242EC67D9245CD464B838554D3A7FA4F1D90C14736F8244E211D6E31BDB98D500C -sk = 9CD11509551D641707A4D8965860CD0FD782CC1C8725B542C4DC785DEECA56242EC67D9245CD464B838554D3A7FA4F1D90C14736F8244E211D6E31BDB98D500C020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AF7187CDA313F37FF9F3FDABC62548F969F25CAB3BF9AD2C7907227CA6AD10F3649AD7F368B6CD97D76FF56729E90300000000000000FAB343C80EF416B8BE874E2F6D2DA738008124173844DB6019B7B823C49EB7D11B466C99DCCDF9BD341F730E9232FEFFFFFFFFFFFFFFEE8D38C11FF3B50E8BED000948C0604D63CBC8943CAD5A0FCD1ABF813081FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC92E582CC35079FA93643B1F12B3F08643F6BBAA1BB43EBB601D254D030C00000000000000000000000000000000000000000000008EF4D10A6D336B5F52CD549A2E3848D1DAE6DF6D25781D0F22062325D7B5CA1700F2DCC37B1C212B003DD8586636BE3A8789A405116793CABE12D7E5B26BCC217C1D15748036C18065AD551620EFA234F65476EE48C3A50481189663363D4411E7EDD0B9BAC2C93BD5B3494096B7D0EFF8F1F3E3481F3869BBBB51E24B161C242012F79E4A6250FE4CD6699D7E3824D35E4847E743A07B091404A6BD71D75D2D7D0962C9F51B1CFE300AA1FAD4C0131E69066D832E3D5E462030DD90E7D25A281907475E62A3DE1571CA2157C71EE37FC1945A840408E6C6DB4C4D506A27EB24EF8E239666A663F633A6F766DFE127B32780AFC06E2E5A86D86FB9A253DDD531A38E6416E4FD5F12399957CC8729246CB1D5D57219A5AA35BE69A821338D0D14E5AA83E63F843C0E5C4FAB40FBAB315D019ADC0D29A27BB5D98E3977C516310AE21D41BD0DACCC9940A4CF2A3633E53AF534A7A46EA39A2D75ABBB4170A3990FCDA5F7979185252AAB38A927086DFD3C0C96040FA6A8C87769D6DFD4BC47BE0D38372CE59BCD4CDDE324DA731765EB430F8584D74D8398C73CB8754E918C37076128C2C89262A1A2BE4362CFF195D4A276BE747E5727FF58A7FEB0B4CF247F1B -smlen = 210 -sm = B29CA17640DD8D78A001D6F99D80699D24DBB104DFD7056DA56F2DBFD704F75618FC796BEA040E0612450CB588553B9365021A3E7BC1D5CB83C825056CC7E8B20385B169BA0479A158DB7F6FE2292800AEBEED83CC6F775C9D02FE2F3CFCFE3A789E89051BBE86D0E294A2E3AE04F0AE5AE4818C5FEA17026FC904C8707B078CD5062CBFB0019E5139B8E3070073641AF4203639A9E635DD312C169C5B0A00C6223BC74DE28D76F104064E2800A8ACF700D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8 - -count = 1 -seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 -mlen = 66 -msg = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 -pk = F8089F1E4CDEC1114D05242799C95A33EFF7A619154C72B638D0CDEEC96F7C10095044E16160DA2E4685CA344E8686BB1845D37C41EC742F65A4AD2B95B4FA28 -sk = F8089F1E4CDEC1114D05242799C95A33EFF7A619154C72B638D0CDEEC96F7C10095044E16160DA2E4685CA344E8686BB1845D37C41EC742F65A4AD2B95B4FA28020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000441D5C11A8AA5C5467D8B0AB25D9D9860E8B6739EDA0E89293BF033B3886FD929F7EBFA53CE32ABB9B731B32BF21030000000000000087680C8DEC0D588EEF306C300F766450BCFCC4BF62C4ACB2CDA05AD3591BEA80E887C81C4CF5CE437700B9C700F4F8FFFFFFFFFFFFFFC78EB69DDD146BDAF3F602875C57E927C607CE7084E21F1680671F3E5DE7FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC3A5538CA053C2DC420CAF749B36D98D38EFADD5AFDE7DF3605CD284014030000000000000000000000000000000000000000000000505FE21BA1936E52AA6EA708F9E19D69DECA2E81381C277063C5895FE8DA090649543FD0AF132FF623924532129E3DC34EB757C67C12945F0441EDD4D6D5F111F4297AAE2C611B301DA8EB865FE9B5F207677726E85C76D6BE66AE498ABA140D52F6E7070915604FCB741ADE7830E2D2DF152E19FE48F75024FCA5358FD0DE13AD74B4F6C4B532672E04661C0A7A5E2634B4C72DBE4787725E3B49345FF4861EA3840E2DF4D519D90103A5294EDDD64AA491C3BC643C0A479ED6D05614140D13042C9925552C4C24264B04E5C30371064BBB97A1B2C4893E705C6C9F7D4828209FFD12F8D8A624AF0F670C7E8417A2524E2F9FCEE3E48FBBC1181B7ED726B5162044454FA3A5DDFD899273AE0B991909F9F99F2042BF71B6F9F16BB9B556B11873B9497DAC176BA2EC3679AB9C5AA6F55943EE3651E86CDB419586BC14552F01523E9B7CB1FAAFF881AB2DFAB4E02EF193FBCA22181B77CB44025042EEE03815075469A60B4F2CCDF1C4ED4ECA2DB5B313086D1964778C95C6BDC60695909B2CD541A1B3BB81AFFA34FB2EB4361DFD3B07AF0ECE10E78622A83A3A89EDC0E1167551A453BA5EFD957E3136FC4EFEEE0AB234E6B1D8DF278F631EA05C96545816 -smlen = 243 -sm = 7270463CCA0C47A6D702D5E0CE6C520B9D690A07C4C19915432CB1D1A105B12BA0EE811702E68B02BCB7F4FB194B3598EB00077909B007AB3C962D03C5C82A879A05E854F9055AB156535578DB19890226C45B0019A633540802710D0DB0777065412003A1A9191E3D3ED2F33705AC20A61E53695FE1F30017313AC4C96ACF026802F9C408C887E9A5D2300500234C3AB93DECCDF0CA82CA753C45F4F1040258291C34BA8B9F4A930286F8DD4148452300225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1AB2568209E46DBA961869C6F83983B17DCD49 - -count = 2 -seed = BFF58FDA9DB4C2D8BD02E4647868D4A2FA12500A65CA4C9F918B505707FA775951018D9149C97D443EA16B07DD68435B -mlen = 99 -msg = 2B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF -pk = CE9AEFAE606B0850CF021526889558DAE582A7B6B276FF7A2190849D7327EE2A54D63A2AAE32C9EAEE4C40769E634D52EEC8A780947BA2A3472DDD40B04FB020 -sk = CE9AEFAE606B0850CF021526889558DAE582A7B6B276FF7A2190849D7327EE2A54D63A2AAE32C9EAEE4C40769E634D52EEC8A780947BA2A3472DDD40B04FB020020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B3F9A5CBE6C5A8CA309943E4A546897422178BC0FB20EFDA65D15A93CC5F6D37F8856AC880B6F80C3BBC41CECCFA0000000000000000EA94CA45C9A4C8961F022F2CD07D90AF0D39E429C16562FE45F090B2984220F15C218627DFB1CDB0F39CED4C2440FEFFFFFFFFFFFFFF62CE14E0BAEC58421FF768278B060AE55236F4F143F7CD4134B17FC4F358FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD38C3C8404873AFBCE757687066E597509C6AF8AAAD0A48689DFC2875920B0000000000000000000000000000000000000000000000E10E61CB13D8C482405C95C86006C8E86E259477AF6C2EDD803D6B822DABD6128A4E0EAC79D7D28EEECBC55FFBC88396DCB677DF9F838FB0D3117497E9EC9A0E6114CDDAC53DE79DA74C720C7A810BACD312A555A7CD4C2765BC377DBA70CE0F453CEF85FDCE0D330C7BEFBAF074EFA74ED5C8EFF88BE0F5DADA38B81AE3E10ACB3D28BF30A01BD7B9F4DDBE75C759D56078DC099BF26FC5A73AB95D6B40DE1DF3906CC4316D2043C5183D94D2542079466EBA006479A30E61754A7F8C2B601A537EF629EDD84C0C8AA6B5C0DC362C3544D715C37A9FCCDC441F3B013EFD282B8A2FD82028470C247C57500AE0067E7D65B6D3E72258312C7167F4E0A4AB8F0D7CEA9234BA7C85C659A5CD75957667538D753E3ADD55F4A436C4BFAA37C402041058D3855CE4CC639FDB59760D2978DD915524E1CE04A63A68BD7E42C9BFFF0654540975E66DABD952DBC8EAC271A12AD57DCC89D107C31449B313D0DDC7B70C865983369C65C5BBDDAEB982B6F17DFA17C7313E38F9E8E08746D454F4D2B6150FC09C3D95B7CBCFD2E463DAF53DC9B2B565A0E577583103C1165AD291276D31FEAB951E35D1F33FFB71068CB51E12EA1F7D0BBD70CC34C759277F4172E34B27 -smlen = 276 -sm = 56A10E3D7683EECC9107762E263BC0DE81EEF0036778BF39B6F80595C80389722236DC225F39940334FCA90DD1ADE8ACEB01A1D42F9751C45A3F9301358DB5C8916508CBF805FB25097C9D65799B7105426445F1485841332805C784D5633784DF4F57030A7BC349E347B1844C06E4CAFD8EEBD783351904AC878061EACAC2D72E01880EDA53CC6EE4EB4B05008BCC4456563440766C945661B3148BE007038F89C4804794DC6A1206294EBCFA787D56002B8C4B0F29363EAEE469A7E33524538AA066AE98980EAA19D1F10593203DA2143B9E9E1973F7FF0E6C6AAA3C0B900E50D003412EFE96DEECE3046D8C46BC7709228789775ABDF56AED6416C90033780CB7A4984815DA1B14660DCF34AA34BF82CEBBCF - -count = 3 -seed = 58C094D217BC13EDFDBEA57EDBF3A536F8F69FED1D54648CE3D0CCB4847A5C9917C2E2BC4D5F620E937F0D329FCF8A16 -mlen = 132 -msg = 2F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE -pk = B30CDE6EA9B9AE3BE4AD3F104C7B2A15D15CA08CEC592389F74BB0E9829DB126CA2FEFE93D1FE9106C91D8B5F1123C049FE98ADF548B05F8D8935C9A5780AE24 -sk = B30CDE6EA9B9AE3BE4AD3F104C7B2A15D15CA08CEC592389F74BB0E9829DB126CA2FEFE93D1FE9106C91D8B5F1123C049FE98ADF548B05F8D8935C9A5780AE240200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007EC39805DA4E4EC3AB0A41BF1743B79190DD0129C48B49636390BE037343E94DEA451F5251918965D85113DDC2820000000000000000499A8854F01A015FFA640408A2ED0F94A7FB4C80E9A74DF17B3F96407C0D0741D13D6C2D4BC0412C9CCE028F053FFEFFFFFFFFFFFFFF19AAAA56B4EDD38C572E094AA6C284EC102C04BF1539191A43910E0FA262F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A2518631D9FF185F3566C3B3EDDF3A7DE123C951E5363C145FF7BD367800B00000000000000000000000000000000000000000000000A1EBA2775A35300FDCE3ECF11A51DD7927A43B7DE7538AB1E37338EFFF59120DDBCD823472D08286B42ABC71E93C71120EA19260F80706789469436B890EE317CBD9F7020C18FA1E657B24615A995CAEAD85C3B93726883DC44245988FF980A7038CD9B63706B08ACD28F7266CCAB7067F3D93314F9A73CEC72343DC8A6F90040F7900C2AFFCAE2DEAC87F579F98A2A4599F4DA0841E7901056FB4471D51F17D8638D1B91BC4F3E1C1B90780F573BB5C426343E59A18F4DED8C7FE2ACC7052DEE548634CBB4444EB7698DE9FD41494645288AC08FC7700DC549A1DB24941104AF5278F382F3C7F5FD1271D0203939018CD2B383EE94428DC62DA6900A51A71FF48545107487D05FC9ED3AD33748FECE943F08D624E903902BE862861950E02A87C92118AE3235FD127DE5F36B295E4313EED17B744296450FFE7EE9F29CCE1296F92546B88B190A9A72E9C66958CBE8B1EB2874A6D91355EC7E9716EC5A610D63DC2DB790329FC88DBAB8422D71C6556C7A2C101F230BA4F3EF743F2DBBEE0BA1B90FF644E036CF882D1483E9D57CF671DC9D70E5608EBA3C6B3B9D3B3E2903BB009CCAFBFF97D37B3F96A040CB6D086B8894D581C6B834047CF5F077319830 -smlen = 309 -sm = 52C9D739B0C4D1559A03CE2978F3ADF34639570706444B4A68E0F86C390595862A8BD291F4AAD705BBE7034DB78FEB6670022278197157404F71BF061591A6984C33FA4AD704AE5DEB4E71D4EE476B00C54B410549D83283A401553C11CF5B9C00906A006EEC63E3D9C1455C720774F2E88EA1C828C9E6071F975E74AD9D4C0A0C0151AADFC98156770673050021C848A2F64F596E84E5694FD5D8C4920502BE5972089252525A6D054708A67E864CA0012F7AF5B52A046471EFCD720C9384919BE05A61CDE8E8B01251C5AB885E820FD36ED9FF6FDF45783EC81A86728CBB74B426ADFF96123C08FAC2BC6C58A9C0DD71761292262C65F20DF47751F0831770A6BB7B3760BB7F5EFFFB6E11AC35F353A6F24400B80B287834E92C9CF0D3C949D6DCA31B0B94E0E3312E8BD02174B170C2CA9355FE - -count = 4 -seed = F1902A7815F37BC7F5802D8CBCE5B48D82EB85691718062BFB84D8C06AA41D6E9039B0A107245DAFA4EC109A57332914 -mlen = 165 -msg = 1CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 -pk = ED1863C3DEE98DD2F4E6F4387E2A4D1A399F850E6B728A6A8D7C40B935465B2643E27CA92CC88E5375A9C85B935BDBB87310C064EB8B28AED1F459CA9B05CA27 -sk = ED1863C3DEE98DD2F4E6F4387E2A4D1A399F850E6B728A6A8D7C40B935465B2643E27CA92CC88E5375A9C85B935BDBB87310C064EB8B28AED1F459CA9B05CA270200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004CAE8E03B2D1A3D26894F7EFD98C24EAAA3D0E568542DEB106D570A360A4424D19F2E3A33958042CA3A2C21C99B80000000000000000DD2B2D038FA938B37CD6CC81700B4683502A8BDE48774AF2D634853715B7688B42248A443ADC372FC085F777E30EFEFFFFFFFFFFFFFF1D9124A39423481FB8676A3F6B2C0ED71DC7F5356B60A51CA6161DA78A77050000000000000000000000000000000000000000000000C4BEF4CF75541CD7CAE82996469DE7C69CC2F8AEA384BC8341B6B6CAF0640B000000000000000000000000000000000000000000000021984C49AEA08F61C027FA94332C47FECE0DEDB36B463DC00834419BFC664134A81D897592F0AEF4F4DEB928FEE7B0AC4EAE3E7493F9C593E6A5086CAE4E4E1E977F55FD029C49FEFA33116BB44BEB6489912355108D4BB89657B5DB759C822ED4972B2EB6D64B8470E7A1D7CE2AF61BE1ED15E5BD57287179E18125E3DAA40681C8DC2B44E3E38A42E8DA295EB5CA362A77C68F75F84A1A0A919FBEC4B2F00A43ECB0C586707B7022644E2A0D485E127FF1254A7B826408356D1B2AECE47D01C413A56854B6C13B368CA6052D869DCFAE0AC3B7F8D3AD3547CBE45D071DA11F722975E26535B170EA55334FFA661FCC9047EE922E070336E29D5BA3FEADBB126588D36CCD0E1A72F2E83BCB2B7A9ECDC565C0DC7B39CFC39A96E6CD7DB8AE0FE03AE0382FAC79A2E82B9ADB434D48FA79AB0653AE0BFC5AC7D79A6501ACEF2C02802AA8798FB5FD584226346585FD142CB5A6B50193EDCF558995F145F5A616BFE54994A46B6E4B090D4B222BB5A321E7BB1B6995091D44EB23732F67575326307CFF447C6F873C3D025CA9C8617A221D24329B9C8F9330C3FF7FECCBD45808F378DABD0FCBA472461AC3043BF408C208C4BB0AF03A0E15D4217EB52598620B -smlen = 342 -sm = 28D3F1A71FC8A6A329036C804CCD42E360E0B50184BAF0BCACE126B0FD042DFEB14B6D7B5173EA0764FD7DDC0AD3CD521D04BE9B6E8F69177582D902483DDCD6DF130500F8075454D5A3D79818D9A0048421B662B763E9498804558B700208874A955B037D044A100ECB6133D300158DD212C4DB0771C6045AABA10D0DD233DEF001BA681FAB1B268524900001E31BBCE616CD1609A35351EFBCB71D140301816103E30C633821D10268FF167994531F011CDF0AE1124780A8FF00318F779A3B86B3504D059CA7AB3FE4D6EAE9FD46428D1DABB704C0735A8FE8708F409741017B723D9A304E54FDC5789A7B0748C2464B7308AC9665115644C569AE253D5205751342574C03346DDDC1950A6273546616B96D0C5ECE0A044AF0EDEFBE445F9AE37DA5AFB8D22A56D9FD1801425A0A276F48431D7AF039521E549551481391FE5F4EBFB7644D9F9782D83A95137E84EA3AEB3C2F8099 - -count = 5 -seed = 75224ECC026C18159FF92256844D0ADF953F0A4DD8D74D4EBF1DC5EE8F5630B011A447FD4DC34A2404D620CA0E1F273E -mlen = 198 -msg = DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD -pk = 0437684BA946B89FB8B7DDB2EE606E891EF01841C4B29D16C89C8DA36C340E0F825E3E9683A173D6B7EB7EF7016545F9CF982059EB509B38A02A33FAD9129204 -sk = 0437684BA946B89FB8B7DDB2EE606E891EF01841C4B29D16C89C8DA36C340E0F825E3E9683A173D6B7EB7EF7016545F9CF982059EB509B38A02A33FAD9129204020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A77DD78242FDA900E3E0DA1830EADD012633F28A9D27F41E5B2F19BE375BFDC17854EC3B5B3C8AAA57E6EC43C606010000000000000028537CFB7E231E7897C8728BAF1A7A6DBAB6353A5CDCD4803E5AC1BDD72066013CD701792D0C4989A858C83B2441FCFFFFFFFFFFFFFF6C551E70BD282098A4D96A9C1EAC6B23B8D1BB759378F0858A77E0E0A938F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF522A0E6539FA644BCB6FD52CB0E7CFC0A41DB6532EF5D2A1DB02342A850C0000000000000000000000000000000000000000000000BF3BDF89E40EC05CB9EFFD4078CD83E1D7516A3939E96FDC470E3B022560A409F70551DD1655C6B2A32BEA80AD92E6B8240F8BA24F5FB932B0CE0E7C414A650700BF08CFADF32DD61F0C06C8F7CE5B056E30B0B38DA93D99EC23AD6A7A4F381FD38BC86176AA5BCA543ED5BD6CEFE65F6BA9963D9788A99DAB9151627704121C1295BD5EB9DD57194FA549F0D8BA98F11BF69875E608D6AC1287B1EC7E4BE11A01014D5C34E925A3D972214F9A9F83A64BEAEF7675377E8FC3184E9DB75CCC0B4034A721D09933CDD155509A6A62F65F22CC21FB5A5A651F85977A926F59212D1A4FBE4D70C9C1CC0E001452FD9F4FD609E32CD78CE77A7BDC79F271FE703431E22AA79676F354C2702CFA69EDD9F1137C1D77E9023C120A909986548E8E3C2E9FD8671E6750DCB99FCB4B40C62C9211B110438CE6C64A6CDE62C1CBF1E9BA175ACFAF567132576C4F71E861552E31D3A21ABEFDDAA61E2C5B247CF567D35203B47B683CEA89E85883BFD99326233F814A6C66DFADB5497A43A20642AC0A311546DFB82C82D9E8BF962829CD93CF055B8DB9EDDC3A8FCCC8D3DC097D7D11D926E14664899000AAA94498ED0C180B1C11920E8767ADE1CCB4039031AA14B0692E -smlen = 375 -sm = D73CB109DE05202C0A064DB1E3FDE4E1BF8D9107ACB0293BF9F752B39E06C5340975C4653DF6F404A7E2F1CFE674B2D57A051C765CE0CE21C94C49047FDAF6705513E0BF8904D9AD20FBD90BB36F5105F1F7C8599248585B2A035B25F79B796F4B6471038573C08DC99AF7259204F8E031C12287D72F8A05092EB8CDD50101A0C30645965EA7BBF7B183830101FD8D380D9196789F2B218330F904163A0F01AD51F3EE553A6C1A2602201F79B2C505C201DBE5B6C299B44F8D60FA972A336DF789EF4534EC9BA90DF92AD401D1907951EB6285EDA8F134277AB0A1145001C34E392187122506AA2DBB8617D7943A129EB5C07DF133D7CCDE94A7CB7F1795C62493ED375353D1F044257DA799F7D112C174FBC35687E2F87FEFBE2D83D29D7314B30A749FE41B1B81095638F112BC4563420AF235280E466FFBE7050C4937C60FC18D1A6025BCBD489F0C538E088E906ABE8597E2C8EBB64F01D225C847AAE4B77BAE6EBA9269962C4B94A9732CEAA2CB4093D442FFBCDD - -count = 6 -seed = 447F03C8CD27EDAA1FA0436DA492812F57AC946479A9F1F90EC4F5E913A05F8AB0DD7645026A96510F6D40AF05D85B07 -mlen = 231 -msg = 0073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B -pk = E10C9D02125DF952B69AF450F6510E5811707F58EBF2C3580BD86F9ADC97DE24F789423EB58D698C78B5C166CEE5E1064C5856CAB21B5004300C7C5DE7B68C27 -sk = E10C9D02125DF952B69AF450F6510E5811707F58EBF2C3580BD86F9ADC97DE24F789423EB58D698C78B5C166CEE5E1064C5856CAB21B5004300C7C5DE7B68C270200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007835C9D892BB5827A99DC2965CA1E360AFFF1ADB98E42F327307E50E3A7305615382684BA3C58E8691751B5E192203000000000000004FCEF1DC83A41D2078020C8DC5584EE8620D14DA91BC063772E0726BB6F37CE05B4642EC2E7B60512A8DD95B5D90FCFFFFFFFFFFFFFFAF427EC99B962DFF995A032872FF653F78B5E67C2A6FF12EBE07BB21C6C2F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90792A160246F7755F8500E4915CD43C2B9E2C6666F7B6CDFC8B16BE46C90A0000000000000000000000000000000000000000000000DDAB3F4485B0845173133844521894485AAA6DF43607B0205F147FEA8277690FBC6C1E6A2C7383231F88FFCF0D8073F197E770E0875CAE86E9E40EF89500F50AD88D8A682A30BCAF656731B05D7F90002D5708DF6E9197A50A9D1997782D6A11E31930D0E39B6DBC96630D9D6DDE9AD36380CA79361A8D522234D19B97920913AF8B490D5FAC142C6D32B734BFFAA41A5E51089DC0713EA47F8112D72455A020D58912E0CB4CCBBCD33F44FA59DE07A0677C8AA5D95522F647669D6B0F4FDA15999766C9F9BFF19E0ECED4889BBE3236C147366F6BE1AF6697C93A60C784C5207BD8BFC58125D6965D26062BC2FA452495B40B32DDEE0175163598483A6D3F1998BADB0B10A0351314B1064B5D18C7C15D3C8882772B8B5CBEB7161F5879B21A2DBD9C2DB06C51BEA7997A34FE8D20D6356F9E9348183F544A040DF9E450083445DA17C91C07E01566000622016679B82541DF70C86BED225C01D75179DE2F0C06BFBC279A8D248177136CE83C227835857F708498E18692EFDAC528A99C7D1E770013506DC16903A2D1524C10DDCD34EFD6D2011C37784D6513023DD9B4B60A7E4750D0E47AE46CDC9E456FAD6CC33ECBDD89D3268F6251C186446D9E574D07 -smlen = 408 -sm = 9AC0987BCFEECEDAC20224A445419D9624C3D9069A1AA688F944AF0FBC004683E607823FA8B44304D1A70FE0A22BAAFBBD005948F8CF35C9B205FC009E0C15575AB8CC86FA0265ED04AA5B69C6457E05E7018A57C678E0FD7805045E8D12D0A1C13C79000E48C07A8A3FAE0BF6002BE689C3587E5F224905DE2A96CE935DEA3215019831999D54DB042A430100AF464BEBBC03B2A6D9CA19C7AC6728720F004EB9F4E3745D3752A5029B33A818379D11000073BEE97FC97C0FBC750D474AEB93189F061E1A5CF6600C04FB0464338EC7E85252F94FCBC7B2BD00E438480D9AF3ADD92A92E3E2E8ACB55077C3278FC7503988A76E9B6062996B20889AA55B343D5A003C8A8852D738F955799FA3426BE5CCD3AA6B6EDA04D4884941FFC0B69C5ACF12B347A74D0580CC3335BA816200F87674A4C1D98097C70F2F27C74E94A661850610ECF4847AB5B58344F958C5719E06BA396225BBE21ACB0FDC512B885D391E11B0C0ED5CE6B5DD8FAFF91F50025C69D43072F7706D80D9FD786E1104125D79A5F4B5FD838815D44FC8B1AB678078CC174DDE970D448B - -count = 7 -seed = 8C151C556DA912A82DEB32144C8A8C9090CFAF5C12AB822AC3C72618837A41C2453B715EEFF3724CAFE69B1ADCAE9DDA -mlen = 264 -msg = A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 -pk = 73CFB56391B385480C57041FF188A62A3BAED10497358A818BA3EE2AC91F9727A48CE7B29E0A89E99404AB2930FB67F61FDFB922EACC0E365B87D3C0B2BCF010 -sk = 73CFB56391B385480C57041FF188A62A3BAED10497358A818BA3EE2AC91F9727A48CE7B29E0A89E99404AB2930FB67F61FDFB922EACC0E365B87D3C0B2BCF010020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E86A54EC5F6ABD1FAE2C92C4874E24FFF508C5296A40710729915C9F8A96F5EEF73A5FF65BD903968BD83A4D8CF402000000000000005FDF2B4F1AA9B715547800DF7515E02BF72532B09B01B47FA60330D612D262C96ECACB992B1CA362387B1543602BFFFFFFFFFFFFFFFFA14D85890CB05CCC5D4C490831460FB67117705786F08B5764ECA54225E2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88F1D0B1EB38178AC962969C68D05A5780988ED43BDC4570C1356BAF537B040000000000000000000000000000000000000000000000E18A3D34D245E7B371843B9815A98117458428BF00C75108F0F490F797B479013209C9D0DE3F9D4C92E004653FCA5441E2D9EE0463B1A5C6FEBC86F2DC1DEB31BBB40BB131633E329B26683FD87067A53B82B04DE49679E40D6107851106C634284EC1A07CADA9D767379D1F40B24F23668363E3BA97C76B223FC2931D666F29C9C6377018C65C2FE78C2A326409AE06FE647DF1D391B44680AF476431A24A20485037A916C57B0F96DA3F4EB75DEC1550182D5EB02857420F6DD4655CEA970FF8A5C02CC5B0C261458F6F63960CC63A91870166AAE568D0CFA81E1BB969EE2E12FF0AC23BAC424FA937B2F1F3070DA0FE002874223469E6F0E0EADA04DA042593A177A525204464BC126FA859C42BD443D9BBA279D27836A6C2EDD001D51913A659EB74337DC7B6FA09521BB6F08D5F4FAD2DE135443D5F207081B7487944100DA143F484F027B7FEAE23D3238AAFA8458CBDCAEE2F971E56F7A51304EC4D1264F53979ACF7C3651CF6F85C2E4E5A3427DB8BC92C065C9222246E184822081C0643C46AA141C0A9A76B00EAE3A38D7F00E7B2AC588B280767F3F3BE4E7C0A126911BE05E10B525EF242FB9B00BFB8332091417639442E87B559C6499050860C -smlen = 441 -sm = 8E822C360F4B798B010405611808BA98AB809E04D6C1721B4314E96EE6023C972CB26548145D6604A999770DD63CAE333B0507C4842D3D91A6A41803F351D6F5E4A17B09DF00A85D4ACF8977201A080054BA8ADAC61C0D1DA606AD0CDBE881CBA54B0202A22E2AE77630C25F4701D1D013371DC775687402EF122BC62442BED4A107D98F701E9A052053E00400D3612AB652624938E370A748F1BE88E40403580E4B777217FC9B1B0042F421146AE30101A1586245D81F96BD8EE81AA30F10C0ADB343D74CF72C4DFF71550C12873AF89FA1874D4731C996243C3749AF3F6188FFE9FA45430549045134EB29EF3CEC37E72904AA082B1C6161E6B52361E49AF4933A8D8C0734F21CAFD7467B0C02876F43211D6122E3E735FE36064DF7A0C91449237C2BC7C3A78AC7BB0F9567F2576F05802C872ADF183A87AA3B8217188F2F3535F877724F35B29E545DE4BCF258F13BBC7EDD8C6587F733C9691F74B4151CF8C060C3AE9E8D49FE7C77BF477DC9F23FD0F0B67320275529034B84F94176730923C03AA50F9584D9C2D60B8DCCF85A13F243F30A51ABEFBBF2CDA602BF3D75E849EB92422B808416C7E56B046CE38E4677AD24D23D7237A9 - -count = 8 -seed = 9B42F41492530EAC81992F17613EFDF155F407D7E67F18AE193EDCE714D65D1031E7AD10839AAB46D0850EAF5997AB4D -mlen = 297 -msg = 9366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 -pk = E203B4632248E761633778FAD4AF27F48704B13D84CD0855EF81316EB0793906CF1DD0B396D09348794294E26A914260AB7811168F591D92A906F51CADED3532 -sk = E203B4632248E761633778FAD4AF27F48704B13D84CD0855EF81316EB0793906CF1DD0B396D09348794294E26A914260AB7811168F591D92A906F51CADED3532020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C56299AC3E57CD99C520858E6BAA500CF5892F54072AE4554D6F94D37E4212F966A70F739ACEA0A6C3C1060D57E5010000000000000076DB82653E7AE1BB2E15667FC220948A4B86BC2B648007554598D40A10DC01F68DEBF36F6B5367E706E534E6E608FCFFFFFFFFFFFFFF8E95E4A3F29ACA64FF3B8E134FF313B9CA1F91FA9B65CCB0928614D28EBE050000000000000000000000000000000000000000000000D5295EF9298B1EE86D5B6E0C44C92492710DABD89F213FF4507D716F0B360C0000000000000000000000000000000000000000000000FC78F06CFEDEB1E4428D11A58E53FA43AEF3D8687CBCF46D1E3FD0B1551CDF3158658785F48F2AFAF49C8E523D209ECF673737BF6ABC13FB6F1FB7F6B5C08F2556BF4796435E997095E55905CA711C47B1262C03A9278B7F21DB32623C3B832842AF81DDDC8E706D02AF4CC41E4B6FE18EAFD3B382B9C670A073E322B4093326A50EB6B7C7025A763984A980025A7BCE249B0CC0C6B9CE9718460AACEC2ED9193579536B19C31258E8163973E1165572D5254A22CEDBE18B2021FAADF1EE432A67E4B12EFFB97B5926BFB73ECEF262BE1608283616FF46F430D5ECBC667BFA27202D310308CE6B40F92C3E123992975800FAB4EE89910AA98316082119C3EF232862F6B85CF0E088474FCD009F18BD4ADBEEC1621545D0D8DB57B60BA260062515766D5D1D20AA5B1E32332F0893D7C7C0AA990E914DBA594373C63C4763EF2A001B219231FCC6AE6ABC3A597DBE68693860101CA0601918E94081B3B188D032EDFBA85B1C9E87146FE2F80339FCE61AEE913CF7D6F1D65077862E7C2A159422D8F8AC7FC0E17C1489B27C29C4AC1BECD85556C146DB7CF70A3D649AA8EB69055B40DEC6D770851DC6F6D78FFCA0F019136BBF2EF0DEA2906BD922206614E913 -smlen = 474 -sm = 6FE75F13B32005D2E5075FE6A364927D241A4B03D6B9A2CD3BD6BEF28400AA17C0EF8E7ED4D86C03D795803B30B14D7C7B01426918CB381419EDC904EEE79CD38CFF63E231027C0A885EF3857C269307C256F37A5D1AC3E9650372D50FDE570249145501A0A2AD03E22B3ED9DA040520997394139BF50605C1F07433AD5CD5920F0783CF713FB6671B228D07014D3A3238B586DD5F1E42CA53D600764A080336996045919143B611006BAB9CF3FBE5A2019366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750 - -count = 9 -seed = 11134936880F5A11ED3504CF7B273E55A351FCCB10943BBBD186623EE6C7A13A6565C3080D1F536BFDB018F99C4E46CD -mlen = 330 -msg = 0998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 -pk = 1823FC1E531869108472942BCD6CD8D099A085F182EF8DC0B2CCAC825469BB0088D2BE088E5D0F750AE5CA15653EFC7B08985436A1463B5DBCF920B2455F4608 -sk = 1823FC1E531869108472942BCD6CD8D099A085F182EF8DC0B2CCAC825469BB0088D2BE088E5D0F750AE5CA15653EFC7B08985436A1463B5DBCF920B2455F460802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055FE89BE50369F64455EFD55C7F15BA0126C5AF0D61F73C0E9532EA1A5B97EB05833E1A62DDD41187F7AD7D695F70300000000000000A88C95EC7B13DE047FA1B8E529EF01A371CA2F540803BA75FBC925B0EE64462F0D22A2F45E592450ABADAB9B853AFDFFFFFFFFFFFFFF9804950EAB01C5B7658871DE8642052A95F4A200F8E60CCF6738D2EBD867F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB9FD6478AE36E16A7C487F2AD4013DF15C87031F1BEC0D8F7353BBC1C67010000000000000000000000000000000000000000000000E9182B9D2C7F3E91949FDD1C206E631548F20E84E96051BE6FB40E2F228BC130ADED405B6975204C35F7F6D938C692F087A5E01A1D38A5CFEFEEC510B34A511EADE6BB822C059A6943247A77B00C68B5FBE87A3C3479B019520D9F468268D9205636CA492EDCC59863DFE2C766655784C008803B87692CD7BBE5AB590F2FD929365C9159D74CB40CACB1F642BEE1F01FF9EBCABC80E6A61D38B861C795BC2814FDBAC6F5E9F9733BBAC7180FD0073D99C95D23B7A8B787ABF23962EC1D8F6F1B2E76FFCB8DD6303B4660332FEF35D80F0C108AA36F59F237B328C24D5434872BB6AC640E832B56D7521E8DB834524CBB033F2F7833652A5A06621FC925069310DADD0215D818AE6B1CDF5A3D63E5A5FB484B4E8A4E94C6095B9B5DE8125B5510B44B804DB91997864F2102F57F6EF36E04007DA1A401BAAC1D5ABF6C43AD2A1BB5C33E22D1773566B5FEB20DB8ADB92EF63139A6557038EEF05B7739700E6A00D8A410E538D9519525CF9D91B4CDA57FEE522D069DEC56E2C2DE72CAFC609C1AAC0B64D4F0749D5EE421DC9F9753EBD3417CC8DAD1BA436C0C2A672A2240E027A1053D55BA83A01FCC7F5588197D0ECBA256DA6A5D619F8C9003046AE2DB2631 -smlen = 507 -sm = 34E655D8808F477B110143D2944341BD761BB1079FE7115356DF64D056043AB39E211F68EA1557003C524BD664660158D804934C5D4C2615480BC600796506A6660D51D2B905AE5EB7C4B82A3FCBD702E8F75BEB69CFC3412706A57EB8339B1291A155064A9B023EC921C41AD504856837D2459FCB68B004E03C779AA7C69B588C0275B91F7D29EBAB1D0F0701A56533353D05921DD545719A3B5D8AF4050080A0290AC8A0681E3004FBC53EF177007B000998114C84F84080E7EEBB47D248980FAC9D28F1ABB6DBAB3DD59A5CFD2C7CFF7F308372874DD5447C7B02E30165501C0C673128E4C543A414222BDF47E7F4E8DCA757B0F4A3281C0D10C4F02AB52AAF5B9A715E012607BA310947A60A5F62D6B8CFA96386D27CFA709189202421C078934AA2D955468E550AD4D0D4ACDD98B168A9568E232192E92789830317FBC959087FFFE353B6C168F3EFBE7164444F1D6CBA5246E31658C65440A841DBA78257E78502843EC1A6E9710229C8EEB85D6CDDC7D543285624AA1F756A5DD4F1A5D4FA52DB8C5C34880ED448FBB6D254509FBEEA0FA022F276B6A66BEF7ABFEA6049FF74291BABE781F718683397077B29FA9E2B46BC6B09251E587CC5B182195DD4060CC4A319BFBE251A5B660A739DFE5D0E5B93F3CB7E440194F1C8BDA922CB1A3EE3D27EDFD61C1D31A7F4534E84889EC83B51F1641892766434 - -count = 10 -seed = 98DDA6B97E89A479D5EE214E660DD6B5D8F6CC638A1CD4F462A0EC545F5B0B0A1A403AADF566F7B1C0C5FFCA29B36FCB -mlen = 363 -msg = 4CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C -pk = 04E8C226A2F87357E58E21F4B2C482A2140A4131DABD55691E66EF87EFB3F7077BB00BCA07D07ACC8C6FF8A3787B56631F921841AEEF0A82F27CC74122B7D01F -sk = 04E8C226A2F87357E58E21F4B2C482A2140A4131DABD55691E66EF87EFB3F7077BB00BCA07D07ACC8C6FF8A3787B56631F921841AEEF0A82F27CC74122B7D01F02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EB65F1DCA7C04CABE17F955388D20FD59E9D2D959820AEE995D4B4F43DF8668ECF497A28155A47202B3A8C0D8D01000000000000006BC0FAA922D617669A512ABC825A45795DE43AAED0694B53E1B39B1C388E3B99F4AC80645221BBC64101D88E917FFEFFFFFFFFFFFFFFEB8ED29236E9134F7827518543BEB1A0F5C78C73108630EEF27B6FB578CD040000000000000000000000000000000000000000000000107996B0B7E6BA6F25566F3C2A1BCDB9725DD3319005EAAB2DFCE853AD321000000000000000000000000000000000000000000000001C01EC0518155195DF7E322216798C2541C16FBA61F091FADC0DFA2E4C030E21066DEA7579C483AD0C31FEA39DA6789D8127C2C1F7A7F5303BCE3CE38CF65119A871FC5E2E99CC03981C3239284E0BF438A575505A558C5AE0470D061574FD16E57C2E7281DA45D14902A3C123A5D1E2757A99225670C68C588302CFB970CF2AB408C46AAB273E6613B9A350704FB084AF1C70CC96335BEB30E79A85EFFB0F0B9FF105498E115BCDE6A0DFBCBC55E8F8C75464EEC53107CA60BD4C43FAD91C1642CAF68BCBCACA62DE5E1A64676C27593821D0BA5A0D95AEF94B9985ED271E0664BB4F2AAC31204B4876BCDF371DA2BD81B1F4CE7B09F30AFF2E0BE9338C5A3213C95569BB32A386847B9E68D11DF2FEF869611B9DDA1370665EA26E92BB6F166E61974B1E2A8FAF2162C1797E3C3D39E582DD5F7A9532834B1EA1E42CFC73232BB77D3760937248E6D3F6ED20167FAAC3D89307F83839F8332097227DA0CD1E7CEA086F2A842046C39A653630C7B0D7759DCFEDC807CAEFA9BF1879161CA521950FF2FF959960B8DD95EA10C91DA4CF766B337CC4F7FA8715CE6E04E23C2F2D6E8AAB7990DEF6FC1E3A13F1B64C22F20E5D7C1DF82CA04DC46BFDC69078DA2C -smlen = 540 -sm = B8373FA5A5E13826DE04997C77F5C17F4144C301B1CD22C72C40DB95C1030B689510EEADDD6ECF04712AD5638A5C13491D03C2D5F0D04F90D80F55019D1A48A30190E61246077B6EBADAD27383DFAB05AAA359C44836BB4BEA017B428846662CCB3681069E0BED84E3D8675B4006766DF51FA05391E8B605BA1D1F3F464AFA98600797DD8F33BBBE2088770400A320B262A7ECD3FDCF598D1E3E8414260C03572DECA102320195F80166D0B0B70311FF004CCA95CB9F254C2EAA7DCFFEF662EE03320D5FC626A6484304BF62FC20F341FBE26E1537D7BD20E95440F7CC95EE84E1297C807A0BC9006DFCD5C22A5C1FC0865F5D70E5D63AD677FFFDEA52BF85D1A4F159F7ED16A745B4D971B620048B5F518EB2DC672CA35022578059E1ADAD7C07FE910A5D566B8321D9A12F34C250BE35CE964DDDEA23C90EA77C9C1BBE3532FEEFDA3637157786EC7D37775AE5CB0BB92EAB45A0FB1E833E8A6F3D06B85946E31A79B64A02B31FA640ED514A85882C89F693A06354DFDDB0B5E23E7792134C69C1D3908882DF3A7694A05B241B87FB2DBD1A4D9F26943B69F3CDF730301663089D1EBFC23299DA21300F735CEDF7B109F3E0BBE273776E6AAFA7054A6CD9682B967EB7903DE549E9558E62DCF3AC444DD7042FEA362EFB555BB97FB464AD7FAEABA3197C14A6740477DB50CE3FB8B762F48F880381D510FCC836E5880B48F08BD6333202E838AB73F2E106CFBFB218AAB802DA8A00F13F78FFB70C - -count = 11 -seed = D34A0AAD27ECAD31A5E08E9A2D7901A9B85F864D9B1B46F40CDCA0B3615B2CBA04EF82AD7BD8CF627C3E861477030BE2 -mlen = 396 -msg = 5C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 -pk = 0C9587EF316610E1CF51FBAFB2DB4EB8988A7E94F58B16877893A603CDC27206ECCC43481ACA7D92ABFDA0D5AA69F21C5A3E28C83F52844DAF3B7D1B20074930 -sk = 0C9587EF316610E1CF51FBAFB2DB4EB8988A7E94F58B16877893A603CDC27206ECCC43481ACA7D92ABFDA0D5AA69F21C5A3E28C83F52844DAF3B7D1B2007493002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003495BCB9DF00ECCC61E1292BB7F3C384C5605279102C622F59DF8CC4915383B4119BED9334950463AD72B354B6A01000000000000002407FEC41BFD4C788FA3DD85D87B867DD5F2FFEF5A88A16115648F8367C2DE94AF09207674F77A64B9B5135A784CF9FFFFFFFFFFFFFF94B9DC638C23A498CAC955AFCBD3705D424AA741F577CA224538617BD172000000000000000000000000000000000000000000000000BD1911E4997DDA5405B9DD4E89D4B62635F4074CD9CFA6F0DF9A573399DA00000000000000000000000000000000000000000000000067FF795C0DBA7DB4E3F30824C5A9052B4DD4F276F32404CFED9E1ACB20423C2C30C7283126293984F4620E56D03C28A85D61C13685B71DB748F177EBD08471329B422C3A4E776E894E2C5213BF422424ACD7BDA8287D46E9F58D29431A1F3B1BC7D95754CECE26D042F4512968445DEC867EE3F3D82B591B5DA1153F8E676730B18F2B092CF8B6B0D0767CCF46E91FC6E7589F0D4D68C5863B8394CC7386000BE479ED2801B40E02132A8B6C43864FB5E0FEEC238658BB49C9955A64BA5EE30EABB2F14B14B3FEFBD216D2D99AB179C4110182FCEF89376241A9B253501571057C98CC57C745DE97C377F30A5F2812C5AE689F3BE9C9A1E72CEBD9BA3CE5632B3682885D11B6FB3EA3AD8C0CEC5AEA943A0E2B7C9FA0C4419B61B3DC1EB5921B3138F89118B58352B91262393B2C660E42004C15ADC7BCB0A51EC34CB5B18205090C32170C580D7B8A40939EB85963C859E5C68CFA94A8D344EA2B9EEDAAB425EB4D7C79F71A96123511E9F51970C604829EE44790BA8ED026E9823C5AB24100B04E51CB4EA809097DAB9534976AA7159A4FB2A1EB539D624ED3BC99A580560B84610DAED2A552A7D84E60F6DCE662987A85FA5A9DB658B2AC372F132B14AF32 -smlen = 573 -sm = 691B90632D377369B0039784E6C7C77AA0CB35024436BAC62935328A2C00A623FEB844A5DEF42B05B4DDBE59DA795E039902DC5DF1E89BADCAC158075426C3BC63FF8BCF1103D7624D652A6C2950EC074F0F33D4B30C98596500F4024AD213BADD237B0666F3D880A3E7619C9701003FE266EFDE3C621603A5FF3DEC0F9C168A20029A753CE5FF4FB7AC410101E310ECF2816DC9EEA2BDD79FDDD817500C03AC27C58DE7C6740A9200DAE0020CF159BD005C4B2E1A344DA1418B0F4BE3FD99505FC30F2A1E5B696E943BEE2451D7B268F722E04F8E00FDD9E1A470F8C977A6D45A5F621B8815E352FA14F64977D1FA08082A48AF495719EA6AC1C0B3D898603B4CF7EC88E68DD7190884382896D953D612CC21ABECFB01A04A1BB1BBE8986D34625756396CCD84BD1A6B5454DDA98824CD4844D98F356AB485EEB19F9196ABB1C3088C0C3C5846C88760B696D91A232D6F4CFFC85BFF33DE1A3433A27A209A461FCF37F2289F98BEA7CCF183DB1FC42A7EDF958E7913F8711DC375E43F09BE7C7A2C2B1318AE2A9CF5988FBC2CE0735A2CD9FB6C8496C34406C538C01BD494193240BFF947FED47B7CCE99A1747973F1FAA5223AC564BBA0CA8973D1310B5BFA1452CACE9110BC22A8D4080A8BAAA8ADFA3CFB6685679B648484E3A43F9B1B2531949BBB8FAE1846F6D45D9272FC2CAA2913B5D9F8D322E9B18A685122D74634C60730C101578BEF2480711FEFFE02123E76D6C846559E2EA99A98923EF095630102A5573EF027E0AB6E52555A9EDE0D15A73C8B2FEF87CA6FD9F903F0 - -count = 12 -seed = 4FDA9FB6929E3F391901D69FA0AA2F25A9657D249A620F1B9E305A5965676BA76794CAD3355EB632579C3958CA7D443D -mlen = 429 -msg = 49755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D -pk = 708BBD331F4267CD5FFD69F77BD997229264EA3920D49305C152F493E7A19022DB59EB8E46516F3AC73D6B16D72EAF21998B40B76031FE60B95871CD80711300 -sk = 708BBD331F4267CD5FFD69F77BD997229264EA3920D49305C152F493E7A19022DB59EB8E46516F3AC73D6B16D72EAF21998B40B76031FE60B95871CD80711300020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AAC7E9720A0190B71FD111F84C4F27FB1903144BEAD7A2FBDD518F454DC451B6515795590D34A6697DC0770C71C9020000000000000019FBB6C1CF42C1A381279772877A480D9054E0B3568D7F2FF20DF4DE7B4220C3419D81C4686CD5D6BC3DBE67870FFDFFFFFFFFFFFFFF792B76C44B1F52E944067FB6F54FD6B5D8EC5AC415C3D575A834D4B51327F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8678722FEA9225CF275C3217B8824848733BE549B42349F8312633BB7F0A070000000000000000000000000000000000000000000000B6B67388564D089B3FBD94EEAFD8E70666F7D3E59CB3A3E33806162B46332F02A8495BE6D2CD1A319749D56FF9FD4C313F3581163DFE01A84EFBDF4A08534524AFC8A9859C6A4B8CD76B34DA6AC48F89D0FCCC08728958A64F18A3EE981B68048F3EF5EA267366BE9C03A592FAF4916E4E5D88137B63E8CEF8121E24BE7B980AC6425680FFEBB748BDC9674046F0EFF0301EE0ED06620C03EE5B690D4D9AF8277EF42D1AE60241DDDA8B4102A7313854524A1B11965178982D58B595EED1AD0B719EF8CDBE0ED72620B7961AD8F5DE3C3E7901DDCF3D9F16F0D52408257BD91BE9B60FA517D377729A6609D391443A0460F35B459FC196E1A2675153D2EF660D081F6352DB23C9AF4FDA6B2D06295F4F8100DB560E867CBF1C2AE82A05B826042578EEF41BCAFAB6DBA633BB8B144C3EAF09B76F0F776ADDCAEAE95CA7013C21BB462A0A770AD0110E1B66F8FBFED4B75FCECFABBBFD4B912B936EE0A90B4A1DA9D6B9FC2FBFC09835D3F4964AC59070BEBE136B941A6D01C63DF76487795B00F42A531AB26B108D51C88388359CF933D87F891006A3DBB3E040832C2A79E81CAC2E54FF6EC179F8CE83B84A9C4AA035B06FF066D0023D5548F49F6B7DBA2A1C -smlen = 606 -sm = D6E743946346F8BC3D016FBE22547597F307FF07482E3B6FFC5B107EBA00FE81C29FB940EB49DC02990B49C290A5D998B5024AAE894FCE385016CC0773FD237F5A2B39BD5002540C88F51CC48ABEB6052139B22A925EA2C94F0751F5F5877F82A94889078F80DF4FE3CB249CE002A42DCC3307815C891B03D7102350DBDA70DF2903337A7EDAFE1352F3AC0701317BF11DA167E40F149CBC45FA6A8071060145E8D5FA80BF95EAB105D4C33B60663EE10049755A7B1A7CDC5C9BDF5149968061D3C95EE67BFBAF02750C45094303A9D9CD23A08F19B9C768ADC63FFD1527186D09CA4E0356BB882E263BF015CBE3716C05B31A69DDDB790BA82C341AC9B6BE68A81B8BEF8D882304BAF0020D761A0DB04412033DC369961A5213B04E81736A580F1162780599CC029E262D67F31B2773AFB457A1ADAAA292163144F17DE384234F3303111FCD89BCB30333C6C6486F775ED099043C34E6C86450B650F1A02D03781B1D20691B767D166DADF1DCC4D8604D976EFDC9168373A7316DDA9B9FB02A4A321218D9F54E287B7167A08BC0153843BD6355AEA1310824DD5D5EC458BE694AF176119D9E588A29C650FF5500293659EA478B39A62149F819CDB7E7CB32E1D7B1284F159E2AB1B1EA41AF4D0AC94FF3111FC1CCD818F9B2CC7A259701405FDF6A51D2D3EF62789297BD16A659F14968EF902C4A23DA409BF13A4913467B5C991854B2CA6CC006D3F4197A6AA58BD5DD95C36928DA9583332C3FB134FA3890FE7E299F1C17205366C4F4230724C43E4803912E72B816658BBB1B63780865A1F66A2A49B96E93711B1BE97B827D12173402828B1A065B94310D5BD6098D - -count = 13 -seed = B0E6A23FAB10A7A333E3720BE00D31507917F39C5EFE1C98CA18BEB5C3101FB4479B478A1558C4C00398C55C9822FC44 -mlen = 462 -msg = 439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 -pk = E867FB07534CBCAB37895D2B31DE4FA91EF637E26FA1031058B9E8B2FC47052F015F9B96D9D5FAFFF284E062112CC67E48E55D1E4EDD4AEC091102B456453F21 -sk = E867FB07534CBCAB37895D2B31DE4FA91EF637E26FA1031058B9E8B2FC47052F015F9B96D9D5FAFFF284E062112CC67E48E55D1E4EDD4AEC091102B456453F21020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F5A3BCF1CFB87658D3C1AE9D27C09DFDF40B241149D7CC8386F0B9966EE7909E58E8A64ED8693C7FEA929AC7844B01000000000000000461432A1F94C6B3FEA71F8A846E7BF2C671806423B85AB064501702E68063FDBBFC5649C22559C0A15BC95C4BD5FCFFFFFFFFFFFFFF0898979C7197EF59D00C1B44F383613EC86002B76D767B0A4B7509CD453E0000000000000000000000000000000000000000000000009DA823152258C0A1275F914CC417D4345EA4099A42906A6687F984B7D8670A000000000000000000000000000000000000000000000025B7C5743642B0AA6739B104E27F4BE20FB3FCADD7D10081E9349D790352CB2C5B5AAAF90BCD6C96C9D17B7C0F86BEE7645C6CF27965D93CB9E1711908204F2B58C2C943FD04CA399BDCFD0E83B3F4DC3D471741D328EF02BEC64450EFF9A626E940FBDF03323E4A0EFF4E9C63FB5CE359F51EC0A6AF2B4D23F73A7F4F8F52314C4BB8A70CA6112961471D413F005F86AA91073D5954E215AF1C3F6F50B52A04B920C73AF7C105395625E4FFC3455E995843F696017D6481182ACFC11A7D701E9F8D8C7B386BD20C0041B32F956209A378E8D429DC318816B5B58B0BC0D7ED129DD494DB8E8494516A161D681FC91178852CDAFFF7E411101AAC0BBEBCB6B606C80AAA79031B620754DC333E9D27AA57DFD70EC7292E293C82FF0018EB789F05DF857DBC1CE65E24A23FA6028D9ED12350A255E24A09600C58A4BC0C4453971B4B7861E7F1FE900511280F9DCA24E19980F7877D92658932082EB975566D9823F460D32FB546D02FED7AD2A9F9D95332D639BC95CA18DC5FAD142B0A6B2E2A1558B08C65D7E8A5EB1911B005DED9D14AE115F76D08A2EA457ED508DFF5738C2E1F17B71C870D99326A003B1FF31ABC1E13849259D70304DCE8AFAEE3A046A30A -smlen = 639 -sm = DEDE3FDEA7FC043F56062AEF883C5C591A102E0571972F3A9FEAD7514700B566B90602A13C0B7901F52306C7A05AB20232033A9422AC14BC15685002F682206AE86FE4EFD10222049B269CF11BBB7602B5D139B61A3CCA287603531F0DAFED83E623AA04F9FF8C464CE3A0DB55011194F3CC36054EDF0705903D20B4FB1D4BE06401BC2F37047C718EFEC40300759E40D25735443E22BA5EA86D8BAD9F0A00580AD38C15CE74B4A800F0A36E3CE073A500439529DF1864297E33956AFEE00A60099B658A67830A6A6ABDDC329E87831D9F9B647917FEDF1AE182A40402143285516FCAB83F447354C72FAE81AC26E7005C2AA561763C152E66BD80F14565F47DEFA440DBB491E7994AB9FE35995D5FBB3800CA030B43DF611141637A5246AB9D9CAC02EFE14AF60736B6BDB2BABB97CF21E831E5D04D41C00F090B154977900EFADD3A9313389A3F84CB3AC38E8B57B70A43DD08A8243F8154013FD5CF29DE5A8DF0B197C12B17E0610FCFE3625CC94067E01E23D23A243AD1C1F805CC50E1447D1DF93C25B8D76396BB7199E64129522462C5FC8B30C132D4EE9E0BF6F52961FCE7ECF650647E7064AA5A6574649A323E144D7C5491DE4C0A1A76D08F93F87A2FC7F6955FEF86991E62E2CB42908E83B0C0A8BC180B7453CED293F1E20F300431EC1D395E8A537F0BC36A673D491F14381DEA90D8F176D06031B0A7AFB40EA8F76D37FA82E2572B9799A5FC7CF4C49BC20AD78EFA8CD989A84D72ED680AC3C0F64155C56ACBFD7C7D628B418A489F961357F77BD62204ADB079DD3106485A37FEE535C9CF82E832D8AADCBF686976B806B02AE733DB46DB0BF162E973931C3E338CC86DB38C66262D1B2EBC7691B8281E0B20BF36305FBA996D20ECFDC695 - -count = 14 -seed = 0A98A2BD2B9FF42CFC18D3396BAD052E1D0F3372854DA69A318B142F7A1AAC609C3861263BD8FB0549DA7266784DB8B4 -mlen = 495 -msg = 8CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A -pk = F519DEC5C20A272B7599F3D9A0F3763B4915BCCC554AEE0BCFB2A04A14419F26A02E6FB6BA8175BD3AF433CB519D9A076EE102FFD68B685490F6A184BB228A27 -sk = F519DEC5C20A272B7599F3D9A0F3763B4915BCCC554AEE0BCFB2A04A14419F26A02E6FB6BA8175BD3AF433CB519D9A076EE102FFD68B685490F6A184BB228A2702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072FDB4FC557EB1FEDFD124E63961C0B7910536327580134085523E96EC98273CCD057C74A583F853E018AFEA518DFDFFFFFFFFFFFFFFA3E3B4AE47386D4FFD14AF5FCC349C35E3D4A571E2D5991C522D038B8182D829D519B38F24BA0B8C64F0F3792A22FDFFFFFFFFFFFFFF73FA2310C18DF335237F20DD6C8AD4BF8872130DAF5BC70DEC61916DF040070000000000000000000000000000000000000000000000AAB0A3370626B7F6C8116FE2C42D281F7A508B8E19DA6D1C654239E09AE80C0000000000000000000000000000000000000000000000BDFAE0DEC1DAF3EF1691CCE02CF14D7F3D50C00A9F3492F7E5EA479CA7CD171070471D5C67FE5EB0FD947FA9FF6A9A558A67BB4DE65ED17F7236E798689F9408C5F5FC2FB3B7C2B85B1DDCC444F5B040C500E3EBFE1E9B28F6BE843AB028A404F1C218B822DEFB02ECB6BD617360710327C95F2E0A518249FE517BB3954D6629FC7CD2C84BEC84071057907C133C9D0C60C475D4E702A2897A591266F471A81BAEB54942E9E35BEBD28A8066A2AAEE68BE5C4852425278A28D5B5E2080A8F8269CD8AF3376CD94CE1FB48EFE3A1EE626C804D3DAFCE997A3AD26413C2C09A202589B57F7178A9BB6E850BE5EE4FE434312CA82A8D042F05EC087B09D51FE14033479F5FBB15C552C7662E92DA78A392A7C1BE0DCD79551B6112201195A321C0AF35B930765F22DA52FCEEBE64CA61E465CBEADBAA00EE3607B521AA114BF7F2A2EEB4B29849E7FB5412BD4C0E7ED37E6AB0C529592B701C086D0B37E328E8C1241355354A574E179051DB2311C21E70CF52863D36B606C50DC514E7F44BB800BEDEF5BECB35BF5870409F91A8873F019F664ADC81BA4AD4AF08B2417A98A872CD4D4D68D2AA3C13A00158BA4B03D56AE13816C92A7C7AD64E965293E71E85120 -smlen = 672 -sm = 066995AA5866E0AB4505A7AA95232C6EC0361303FB1B13FD4692B8B0C905223720179AB1065CEE04D3F3E9A0C2DEBEC68005FCF7F572A7FDAF343200111649A71184C322A104EF24D7E6DFDF59312D02432A12D6B7C003455201120D922E3D5819C41A0059120689A992EAEAB106E1E63298B0319B4B7B070A1BD1B681FCBB0FE70659497DDC5F0136C93D060001A94AA0B76F384E649FEA9F1D1DB0E70501180AFBF94BBFA93E6F01B06948E4A81279008CB18850E27D8416B88A9A71F4A66BDF447814DB6C82098C371B53F61600EF5DFD88E4FB34200207C3F6F55166AF4878D38FCA7E2DC18FE662E3EA491B58A86246CAE16090FB7ADA53B9A67B3D0E3787D3323EA921274C60CFFB19A889BCF0300FE10E242AAE025F374DD83FBE9D007C8B9D9D75574C74146331DDEC6F0E49C10DBAF15654897E33E2B4780DBA484224AA6FAC79015D5792FAA2D532BB7D239B11D91420B98690B1FBDE9632223927E0804BFB284368A426C414C3DB8EA82F0D246413861475ED2DCA9E80FB4F3C34FEF7528069AE1975AFC52AC5AD2CDBCA1459E140F655556093210D7905A1A1E6CEEAEF0194A0B2EAB2C1EE853484E715D2A1DB551FDC620D5331164C74CA4848B61D408D2F2A943FA09EFEB63D524691C99DCC0B22CC61B98E6FB8039E5E0B2D7DE2CAAA900A44184BD56C9F02141A3AE8AFC661E3E898ECD3004FDB0704272BA780CD5DE35153B6FE223843024273642DCF8E4B58BE2AB1F61668680084AA0B75A32E766C8AE5EB30D4E02A12E6798DEA40F80D8DDFAD2041A52922701C689F46F49F84CFC05ECA6D7D4C356D50B6A0BA61966245D45134D6A1F5197540A1C39C36BB0B78831AF3F5156E669FD9213B64E0CF1C5A31E88AE79AD61757EC67B551B9F0A760F646BF81F6B92403A62840CC29FA4F3949B3A9F0A9A4286EE7808A - -count = 15 -seed = 9887F1FD854241A301EE0120645CD8E119B43F7BEE11F77A835E9ADF518C3A51CB76D86653FBE73AA716264C146797EE -mlen = 528 -msg = 9B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 -pk = 7A701B7A7920BE50188CE451DE75CE1C02DA3F11D48139AF7B010A8F5FB7EB0069AD072C0C7A4E064504AD311C57E657D2B7D74FB63BE485FAE40B8E046E8127 -sk = 7A701B7A7920BE50188CE451DE75CE1C02DA3F11D48139AF7B010A8F5FB7EB0069AD072C0C7A4E064504AD311C57E657D2B7D74FB63BE485FAE40B8E046E812702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068D773CEC81C0CFBE64B1032EB967FF34C0647BE894F3446E4978F94C662FCCF38FAA63FECD39806E79C8A2B7B9903000000000000006BB10BFC4B5FE333DDB9DCE367B33D69C2088151D55B39D8B5433DFB9B935091BECB0613EBEF56CD7830A1E64F9CFDFFFFFFFFFFFFFFCB72A38580343763685440417FABE28368518D397C8A3D63E1D2EB783652FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC07AB8B624574046823BB9D8139D72A81EB713C52A98FF181D6ED1ECA77E0D0000000000000000000000000000000000000000000000169B09A96B6A50089800E35E5F582B08B04E796F5D9E3F53D67299DCDBE46C2336842E5DA22A63A63369439171FB7D28E353BB37C63260DC3D487E322264441AC31B7A7C1C977DF0813551549C02D4CF5B3516A8807109041C2B5979D8A70F133D28C81A5F7ED2352529BB0FC48470BA9A19FA60CA121884A95E283263093D019CB0708E5CC5873B56B171030B899C625AE5A33AC67B8D253FC8F203CF056D02647E5366734F2E13028876E45B47606B40134F71D9FF7BC0362DDDE4D60BDB1B7E1CF943E3388490D7478EB0FAD251263F9D2A65B3BCEE961D1C64E96037D60C372CA13872070DF8D6437B0159F0EA270E3250D794E027E6A07870BF590D9713F79C5642D2F52EA9263287DCE77B164DDF0BA19B1DAC04CD415062203D24C72E5B43C056E3144214DE986051D98FDDF0683E0D8EB97720B3ED1D5772B948CD2DFB0D4462A355588645B4B543A5ADB419CE2011C4AD511CC545B203BD95842B1A7E81C1F2DC461C912BEDDB39B085B08ACD77B83B540DB2F06975A22C71753D1AE5F0824EF8E95F4D6CC98E42F8F0386EC92F208DC0338FC59E041CE81B2959064909169B1502964A11CA95F286EDDE2EA19D5859DB7B4F721A5013B1C8374B16 -smlen = 705 -sm = 88C5A38A16C1744BB800AFAC617593A057CB1E0327EF0D3B9168C249590203FA21487C049DFCD102D5B581EA7B1ECB8C890540D4CD5BCD5CACE5CD0652B563BA11B9B86DE504683C1D91226D13385707EB106500B47DA7E30506B1B546150C037294190602EE52D3A4352F55130788CA732C135DAFED1B024066F65BC280D5271400F1EA6124567874AEA40100798C2A988F4C6979ECE36CFC6177E27B0200DAF589C67A216C6A6000FB113B2F6FF345019B64813C058F07A09A796FD764604EAF58CE144363702896DF0AB5FF26D5DE000D14BB8FD358FF5532D3B909AB62C18AC30F1900F84EBD3F4F18BD532D16C7B3470F0F8BDF72938C916DB18BCF1429DC1635B1C152C5F89A9EDB17116C11815A6C06273A889132923DA908FF39F4940A840D3CB575DC4D637AAFD37968EC61FC4EA04B4C320491A73ECFBDD8E10F1DFE902FCCEF93DD287ED872F67146BB8CA5A6ADCF0350E8BBA7F2F9762C4AA748FCE19748EB17334146C152FD63FAE3DFBB1A2C2B3C78960369551FDAC5D54643BEEAA59C1FEB0C21DBBB19977D848CD82A7AE0005F45956E0FE4700F14FBAA0C12FB8C65A6AEC95C5A5C8E79A6DA9C4E446872575C06AE49A31B82245E1757C7CE84D6D5DF3F642D3434B7E1A15A8B8A9DB460826B6CDCA69022DBF87595B582DDBB90A81E09A13C2AB1C125E4435FF30ABC9C56A00EDFA979F79D9C895E800D2DD6372FAE5FAACD83ADF8A6D55279D52DF547E9BAB39D99076AD7D297371344D35BD584E0FB5932F92FD5183B9250CD180FC645BEF6028C405B0EF35DAF783428173F1F2482AA1363640F66AF0FE8ECACC0DAB84ABD2A1FB53AF44445698CF1DDF4C2EA214DD339BE004E75BF76E95CA5C16981ABA5540689C1C1F1DAF4D0F89D62CCB3496340D61E7D5F5156FD3EDD02EDFEC8FCDD0B231697B0E66F4A3AAF46117532F5EE2CB4D2B3B82B0BEAE0A45A482CE9A976CC99AA82BEB0FE08CB68C4 - -count = 16 -seed = 5B485527C3B9A5E5B7579950049CD357975D4BCFEF83FE33C087ACBFCC10A0BE4225E7F8A5F77203B5FC7C0B5FC0E78B -mlen = 561 -msg = 922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 -pk = 39A93626ED82550288FEF226B179AF5C16F00CA5EF0A528CB1750C18B80122316D1E7E2A7CC157E98141B72D386295F2F29676E77C75A19049278DEBAE9B2334 -sk = 39A93626ED82550288FEF226B179AF5C16F00CA5EF0A528CB1750C18B80122316D1E7E2A7CC157E98141B72D386295F2F29676E77C75A19049278DEBAE9B23340200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008DFDE57016DEDBF4BAC2EAAF61B2B3EC00473260CECF2665988231180FFD5F61AD8767FC4C7109DB0508897501040400000000000000A05B3BEE0B93C0D00164E44F83E573E87990F0C1E33267082FC6F3778AFD4B3DE743F464B7088C7924043B03468BFAFFFFFFFFFFFFFFA8434F536571FBEA77DA7A3D0E9C75A6F4AA430B5F49AC01EFB46E0D1F8500000000000000000000000000000000000000000000000013D624B77B8B7084BEF2F1BA9133D82D88E3AC633F43C5ABA6E620BA7BE2080000000000000000000000000000000000000000000000D0FA8145506098C3BD1BF7BA8F26D42932ECF46082FFEC229C48FE4A07C91401FA36337B9F49C45135F3ED46B4836CE23F155CABA66F238A6970D64083FA511BF5F92A2B32E230ECFE7E7A373D8C5CD7EE527048176943206A652E3CC905C632ECFC28267E8BB7764CE310F7D1951250D992E3051F610B79BF595B05493EB90FB9555D1D8ABC4E0BB9C689D22380DDDD4152D53FE143CDABA6C99CAA618A0333DF9223975F3BBCC8C1FECCC1C245B8CBD6775D7ACBABD8FAFBDC0F8ADCF87E1858B77A1F5B355A8D2EB863E1379F1CE721A9D9A05FF5F71294741AB5BE141C2DCB87D8BB3B492B3DB343D5DDDAA1381B267DB41E1246E61E070CFD140D773903EFB84DCA2627D5400C73DF1C7D3D4CBD49197AA820F192EFFD7E38AE2D4C0C1A070AEBC800F8BA89EB7339715D23DEFAFCE3D1176E3D76CAD9FC3B954525F72A6DDCA9D30CB4FF518DAC878E34B671E874E117D139513FE151C31C167116E02179B7B15AD0F8437A82EB0CFBE3BA99D28E0608C2C52A8DFFCBBCF64028E4A129E5BA60148F69394D7B79B08300661652E0FA8F246EE654E411A02F40836382109D00DA02065389C14B1BC05A8CB41445F26FA0FCF1FFF479CE2EF15270EA702E -smlen = 738 -sm = 0E2C85AECE7C3A93CB0691CEEC20434C64125003D1DE9E9C11A906BD1D05BF5B77B96137E2379401941B33781F71B8B31F043A737330495A14F1990683E8A16F833670F2DC0361FEDC691E1FAD929300F5ED442333CB48B1FF03A6A6F3478A7E15700707BA4B06CDFF1A1AC07707D0991F28A2BD1BC43C00B5B6D74324C52FC5A80531A2B659ACEA796F0E060177CB183A81AF79C641762C29B2BE9E7C1002166F1D7967092CF5CD008C9A0573CEEB9000922320F7439E492F13C272A5738FF7122DD7A6B2832632E1F7A653FEF3B8639BCB9E84F482F22A948EA17DDE6958489593D2CB268BB52DF8ED612F2317BD6847D1622CF0532CB499ADC432233B93B6F7B1866B38975AC87859AC49F91E8D235846775F9E6E6D052339C741EF6178016EDB3D0B1E3F3536667B3EA2D489F88D254B8582421A31461374F465D7AD62E896BE0857134707A70477FABC09FE0A5CC3B3F32911F5FF3806B878205525AF69007F50535DF05C33AF3B0D00E297AC7EAA012E1D863DD5DD5FA47FB09467DBAD8BC42EDBAB42A9625BFDB9FE578343297506A3B71CDC8D5919955AF4605FCB0C7164D96A187AFF65D0F6210FEF2D11BA08D90C4458542BE72E084577BE9E451B8B6F4909884BCC5D25316ADCCD0925664D4D91C2E56433C1B68C632B0CA56D856DF1EDD5E113D1F026B30DAC4FD648A504F8F6809C701C97BCAC2B99286CEF5C1C923200B1BF6141EE1CFC51C5E14554BC02D7E058970254D2C02948360ABC4DFB439E66946A8AD615147BD8A6CB0886211E8B15DFF3C72B6F8908CE56BBC1B40E838103202E9F188D98E07555DB61778F895F76FBD838B6D14209D28EB393668924AC0E61072CBD9F93B864904FF4302DCEA131B2CA16BB04959ACEE096B1963CE07F59AB505FCC8D89FE08FC58751965F2F5CA753D76D58705652D3B1505E0F720EDE3142DE9776FFE4AA0C8A25E76C7A04843377C59F1002844E89189E22F621467B813A98BF07540A1649264F14A6844D65692617F7A4D93FA9A23829E256626 - -count = 17 -seed = 327CE565CFF6CD9A25EDD84F482FA0758B78CBC246567DAE98B818314AE28CD438E339043EB3FF16E1C2B4B104A717B8 -mlen = 594 -msg = 576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC -pk = 77E092A063E34A9F3644ACCF8CFFFA9040E314CADEFFFEDA2D33E2B36EE01C2EBA7E71419C1CC19ECBA856B0994FB5342D7B52CA532983DFF76F19D9EEFF9701 -sk = 77E092A063E34A9F3644ACCF8CFFFA9040E314CADEFFFEDA2D33E2B36EE01C2EBA7E71419C1CC19ECBA856B0994FB5342D7B52CA532983DFF76F19D9EEFF9701020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EC89D937FFE33B12FAB08E7E79C20A504A0780C1FE6521E48D3E8483D74830020638BC39924207014C61BD11F6E603000000000000001FAF5B304F7C1F78C9EFE3F63D835D203BB02080F9D0BBAAB00B83F4AAFCEA3F227A43BE3900BF45398CF4577BB4FEFFFFFFFFFFFFFFA158B94D859FAB91A4978283693AB6C3F16D4A105C48C1B5499C5FA355A2FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC8968753F10A237658CC40C684C87356643EB6CCBA9AF872E5323B64B980A0000000000000000000000000000000000000000000000B8F44910A0970354C25FCFED9570657DEDB76EEE87F0A70DE86C8C42A163FE0855AD94BF1C82151648B0D0BB010D77D81BBC4A2F5287123127639CBFDC2C030C90C708E60393E9857370762AE117B79E519EC5575CEF4BB966773103F0517926F454AE71CE5471CEA00755154E6D89B2493A25EED1FF3FB9CEA174DFBB7C6F23B82EE8BB0A4229004ABDD09D0F25F85EAD3079BE6357BDDAE0F6102F04061F090328F2392A5FE1F660E90BAEEE6A9E731FF9ACA9E0596FF8892D079F4F4D140AFD8B70BB07C31A6811746DF55B65A08DF310D3AC2487668D4D836A95BAB4192574C3CEBFB02FDDF82F1391DBC7923F349DEE05C229346F2E3D4F2FE02527BC0616C2FF905664186A5F662DD49FBA4363097030A92DC469509E407A0A56CDBC07F128F4E7A3299F60BB67A02D2AD12F5F2C464045D4D2DBD6E2A9769C36B1152A357BA894EB73F74C74421DF29DA835ED8BCE325E4F27C40344D792C1B1D2F61DCF4D8300786D336F841EDB344D0A2EB9AF9A45C1EA09A44B5FDA4C63EEE9630463E86EA7264429634430239D481D5564FB4636C68F9897BBA9BD739D37C1FF0DF8701652A1AC8212513FC23D897392B9696C33D9D609EAACFE3920347DA6512C -smlen = 771 -sm = 6FD29100790E618832061A2927498062FCEEBA07BB12CE3D93CF09EFEA060A4169D965741A5BFC00DEC9FE2FC3F33A34FA01CB646982BF626BDA56061189A55372A99D8C16069E7B1FA0CB3A2B58AC05218539C8A3721C046001254C0C0492F1A7DCBF04A2DC2E083DBEC206D106D486438924A2B3D3AC073B5F498DBD4ECA673901A35682CF0E6BF2940602011DA5046A69048A6B5D99980DA7170A63020176CE9347F925FE35A306A1E215526ED11B01576289D10AB03D5699EAC322D349F55C547101E4424BFA43BBBA3747B79F075AE1153A7A0AC8BB51D24FC46B7604E42EFE4343FA34AA4EB16D918F25E8A4D67C860CCA3F7480E1221ED3AE13A138F079FC252C6D7BEBC55CB81B86E74F339614BEBCF7E8F4440DF8678B01A4A41B3AFB1D112FE1C4C8D8C6BFE9D3EE2A335D477C60FBF43B2E5FFFE1546F5172EF51CFFB2A772E1575EAC79B24D49FD77F0BE351233E57EE6DCC7E2E29994873ABD434D34ACE83400C026E27E27888EA0BDD1BDE5A3E55AA8B5F2FEB57B8B0A96CD831906297C8169D04F15843A3249C50523CF56A4E19492EA16927DBA8759B88A99E0D20820E51FC9B6A6863115CF05C5BC3F4C869EB5A87124DF5DB102D737F3899CFAA5FEA4DD62DC4FEDB1AAFF67906ADAF8968020EFA5B10190F70E5F2C0F0457E4341BD449201D3A80AEB791254EC1C46DDCEBC3896C6DF702509BA62CD446D275806438EB4C03132B2E6BD01BD2F832D1D3C053C48C5A9DB1C4A22B130C4C9E96A2BF4C2A8F7DE0217A52D9AA5AEEE5E6A49708237EAB60B4019A51390C3EF10572A73D436875BB8D7D78543F96376E4BF3BCAABB92F89215E8D1093F3B287945708B5514BD7E62654D3BDF34B29009C64829A0CBF33C54D7AB0E81B81BDDA93028B341AB1DFF3D752DC4A1E5F9636A5C46E137EA35919D99E6571C5370C6E804BD2E2ABF566F035D65CF8F97E3E8F2ECAFA153BC6D8EC2831667A37FC96D1C2DA40BA84D0FB041DEF32AADAEF3F98CAFA957F6552F79D28A36B8BA20A9452671DE1BE8AF5D66714232507EDB9FF657F3D7E5FA7320FC0359A5F99280D446283BC - -count = 18 -seed = 790FC03F956D1301A735504075B67A05944A762E0A4BDA77BB8C036C5CF911E2B561EC1CA6AA355D5CEC919AED42A1D2 -mlen = 627 -msg = 021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 -pk = 3C4F0922CDE5443842D3EE0E546F376B06FE93ABA177D3639F5EA346868A5D06450A9398ADC8D4B33AC8F61F224EFD7755B10D26431A2391DC8A49F498B18D1E -sk = 3C4F0922CDE5443842D3EE0E546F376B06FE93ABA177D3639F5EA346868A5D06450A9398ADC8D4B33AC8F61F224EFD7755B10D26431A2391DC8A49F498B18D1E0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C3BE0244B076F80B79D83E22F002F6D9AE0A1752840888B1D568135AB5B299C1B1E65E16E24A7C9D4A4AB814726FFFFFFFFFFFFFFFFB57C26FAEB77FE0E7C52959F75F874E578D07CA933B95019AF907FC9D8F9D16C50BD394DA29410F212129FE020E5FBFFFFFFFFFFFFFF23F1393028C2307C95F18865D832D64AF99B0190EA959A63DDCE606426B7090000000000000000000000000000000000000000000000D8D4FB163A097010AE15DE62F547B159DFE5B33217B2E045BDB651F2979A06000000000000000000000000000000000000000000000034DE6B5CB57CBCE0C810A8E518EDF0C82E7898775528491DA81C4FE783070A01798294870C6978680FE41F3B3DA6AB643F642A59BFE702F82515201E55FF8025874A5EBB3F5D7133DBDDC980EB998F3B9780DDFDB2E3BB69D4207937B487E9181A7FB49F0798DD93206AC31E542E9F40AE2A7D3B28BAF1A7E6140C10CFEABA2C2CBC968879A8E6F55BA375AD83BC15CCEF727CB72E7052BCD003BE17C87BB40EEB4201E24670166AA2E2EB8736556BD2F2C255D6756E3FABAF40775AE531C312BBA12E9364FC15B32C93988B9549CDB3DBC583467CA675DF7AD124630CB3F4006D9119B986077F57025493F799CC17937251491F7430735B3E29A74E55584305D633D3F51D3441C50FAF3E7F859B965379F55DA391EDBA1E9EE7D59F113F4A2679A285D0C5B1464B4D6CBC81DEBB23E880E561CD2667D64A90BBB81258C47302B939A871A2EAC3EB92A808CE55D715E43F3E53F5B625DB0E643A39E9E3FA5D298BA57103B00EE5FCD8BEED95D7F4C75A8F89919C991BCB35FD17018E962D551C580252E2D856656E91332628B0D77D7E5C1CB7E99B7F94F321BB63E8C4F4F81AE1C81DDB34B52AA2AAC03E56C85ADC3563429D99005DA5166F373E4B32DAC033 -smlen = 804 -sm = 2BD5985AD72134D09C04EBCBA4FE4A6D6EA60305D3467287CCC8B59E8405C3E77D733629E7036807D7FD9C31D96E11C7D606A64898FCB0D9A8D74102151DFA7D8621321BDD07D7CC8A3A2E0F1E9E47025369CC4906C5E685FD073957B66039ED86F38A054BE81E696ED0FDC54105A9BF7454B04A3C9774062FF76FF9405478EBBA0787A253EAAC2867F2C4000147157F93BC49071044CA62A417E95B3200003A4E64E811D429A276009338671244CCD801021E9C06A2E4EF63D1A61958620C40016783879080D44311E04F2A446BCAEE5A486D17FF0F356BA70FF1C2B55BF957A59202903AE349878CB822E04275E0AFAABC0803BB6CDE3741E0BF9FCE0C5D5C814977474533DC63F9ED4F32AC3477A3EC9893EF55186728C85B03F4C2E61CA7733E1706766AEB8FEA80E233E8761B57FD5A3CEF700196674B34A3A55F68B3368B688FB1DDC976FF48BA6A98E2D66023F291A3C617A56CCBDB8732B8C34369ED11F4CCEA8FC8F673AD9FA0FD8990BEF70AF44C617FDFA096695D0C94EA8E17554F4461DC776DB2F416448B17680FE4D29B09E57603D8EBF55771AF84D8D4B9097302901C25CB6D73932E67C323D12C8ACB0E74CB89755F7EB3999D4EAB5E1B775E6B5C29D9733697030A26F3B93B3F286DB0F2DBDA71E1F103878063E77919D8892EB6A34F821B603ED4A898A9F30D00FEEF20985FEF1A7B7AF70DD29C269E88687F005D551EF05EB0603FD38745AED4F5BF4C2FC09F0604C98AE3A89E46BBFE907B87A1672DE547D651F035F392A8D4DB5E7260F43953028E312B95B9F25FFF2C0C579218390411D13D9A25F22DE4C7AA05FD11781DB08977160D48E02372C7D826F5CAC37D1A9B4230BE99A2D13CC2E9B2B17F0A1044EB9E0A2FBA376D35CDD2BC05F57DCE4BBC3BF07A09BCDE369929E6250EFDC61689466B040AEA376B09453A2C16813BBB685B54A225C49008BA6811E8BB5B3627F8C281244FDF5533216D126ED0E64FDABEC533424BFF77FE722CC438CA7587C19D965F0BF085D8692C27C5C84A9DEE53256D978948D89ABDF9842E0B765BE6A507D8630CBC5CA7FA0FBCA1CECC78D2E536AA7B2B902C4379777AC0920D69C57CC4E6032252BDE99E1A555E80D4 - -count = 19 -seed = 716354F7DEAE272CD26929C0932CA257AED1DD23D67260726B5213D82E61466FA99BB6A7D81DEE9D0EBE03DEEE4DBFC7 -mlen = 660 -msg = 7BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D -pk = AF96783909E1409902D38B8BD134BEB3B9E89728957970F53B945B6310B47617811D2A1DC4DD2FC425D7E4EB1BAEE96B1676D5431E8343CB0CA42978D3195109 -sk = AF96783909E1409902D38B8BD134BEB3B9E89728957970F53B945B6310B47617811D2A1DC4DD2FC425D7E4EB1BAEE96B1676D5431E8343CB0CA42978D3195109020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C5ED1C3EB84F8CE8DDEF1191A2AC02A82DC76F0A56AB58759C7E76488DDCF62560F9C4D60CBE40EE7D73E1636C16000000000000000042AA7D69DABD19E0CBD860302ACB0D97DD8AF36ECF29A45D98947E53F4C34C043498C62D59A33FC16566790C1ED1FEFFFFFFFFFFFFFFE24373B42DC827CDEBDEC8A84F4E4EA98A84E92199DB17BB59994617F215FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85F9A342FD2C14F77342CF55AB5B23484734C846BFCCDAFB99E9432151440B0000000000000000000000000000000000000000000000355A3949527A67127F0DC8156AA924ABCF59C9A1470894EB05291379FD665A12C9A8DF842B40BC29610F8FED0B2C88BA498F37408743BD97381EA7530F735C08A007953E6B183A2CCBACA120AF21E367C458DF737A04F31C4A204E0BA949EA0BD1438AA71D2A95A5737668EDDFA61A1A7BB30176CB68D36AEC214260E4E8281D02C0716D54CC341776A82ED8DFFBDEC12AE16160E3A30357A7C5B231508FB3023E372F10C20B628350850600BF570FCC1704DC4686B50BA3626255C430B4E82B979557E18490E50A4C5BF48C748E7939FC17CE1728A2275F101607D07A709208F8CC3E5A0829D5384E9F9C84DABA4185DD6CA4A874D7458D5AA33F78BA01EF0E6156790E517A3BC259BFF2C75B79C733F142AEC81A0BCD18271AA6D0B33E982F075A0975CB1ABABAF9F75F474BA65C3F9B7DEAA0D18E63D3B6D1BF1D9E8A45138D4F1B61EBA5E896D769E1F2D3D71AF8ABAC3A766367DAD96F9386A81596DB19C130EE5AC5D9F3501C10D3C87BCDD843830C19CF887BD273EAE3C7B3EE7AAA273D36D27CB4B5483CB02C3EA83E7E42B9F4DCAA52866801C946AC20C119A1801413B781F018E59BBAA23E152DB29C158D6DD569CF893F3F5C3EF10B50A897A130 -smlen = 837 -sm = F26128916BA30BBC0004024C4F32201854E03F0697CAB1DCDE7261C607045803754BF9BD4FD14A05CDD6F3718AF7ECB5E70076B052D34E68B638E3051F6F3DF4ECBDAA4F4F06434DC0E6E63DCE7A7700377A21FC36F49091CC011D94BD455B2D204D8805C8F03572B0DF85780A069410A5B1316B6A10A600E8C7363BBDFCF5915F039BF3D776B143D2EE830000AD9A715C227A57004354DB57C0EB6F0A0103E8DF29D9AF7606199101EE9602B2883301017BEDAFEBABBBFB863CE496475F54E69A905AFA45899C3D7C16CFC73E31597D2404AE7014612E4CBFA238EFAF5B396B0B7435ADA5DE817E013188C280423C68924E1FA2A33CA56E6B85B7CCA7F00D3A6151F0629C1B92A13573320E0025863BBA7F3EEB987EE1B1A6230B10765DFC1FEEA498AE4B83521188E7503B506259103CEFB370E3651B06DD4F08013FF3AB9E2430626B0BD584232948462D85C0F82DA07B96FC65F62A43CD2F132D1A1D691C085980DAD8796CCE2FA0B268395EAC3DA2CC400F30F75BE87316216980CE213B48651DDB9E294F8CDB2CA05D3F2A507E4A03E2849AA8062918AFB5BCE9E4C3ABF2FFD4751DDDCF08AB09E36A29B830F3BAC6FEEBEA084575472E6F4B239AF89965A72954769A83E391DE467934237B07D8884A6B14CAD034FBF9BD7531D50D742E234E227E1A2DAF77A2FFACC579525134B15186D81AE6E5538871024BD2897475D6EE5B11BC51EDBB928D98475073785A75B331BF3D2297165AE6CF95C3A05F06DF747498462054F58A5AC736F96014B1A8CDB319D030D06DAD9CAB2B913F35FC392E1FC4B027CDBE775D64B04F1076A7C8F44C360745F98E87B84C18AB76F84F373F635AF4C8A87DF08DD4507899BAD892FF8CC1EE534D3277B5B82095628B84A7D5582149CF46C50AA963B56B4B91966B106B4B2EAA45D83A10993E8F933370AB29C6606B7CCFC41B21C6B99F2B9AC643E24300B350FA199EC10E64E4AF19181F78E8C43B2FA796241DC42CC8992BDFCDC39E7BC41BE68CDCE4FBC47C996DB42E8249EEDC146C216B514430C705FC939B9EEF677AD87F9CEE3398551FA0DAF774302324A410F4A4F4FC035CFBE960B38C390441E92D9E5624A8745976BC88FA538E398712361B77AD4CA5FF038D9F6CE157EB8A6137420D4E57018275DCEEBC4E480A5D - -count = 20 -seed = A32E6FF879EC8866A5F5E4F6318DA8FE6743812ED2CF5FB94F5C3AA3EDF953CBC32665810B71B2CFEBF343A571CBC570 -mlen = 693 -msg = A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 -pk = E8CC75C89663914D7A2CD8F89618D8E0C63E6D44B30942C811449E0D2A507A2C4B2C247AA2CE94282198AA6ADFFFCBE57FC3C02F0D01D8C4D251FF65A6B3E82A -sk = E8CC75C89663914D7A2CD8F89618D8E0C63E6D44B30942C811449E0D2A507A2C4B2C247AA2CE94282198AA6ADFFFCBE57FC3C02F0D01D8C4D251FF65A6B3E82A02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084004C20D552D676991942E569D1065B2B0EC2F117D3F56DFDA09605CF3BEA5C369DF1776215BA8D663D5EF4C4E70000000000000000958C53F10935B228FF789D312CB436069C80E412F9AF888E2F20D036B03E0F4B2BC99EC1E9818FACB64A99309E0DFEFFFFFFFFFFFFFF238D85A00FE1562606BE829A3DBA120B4D6E87098801EFD18520BC28635DF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF007EE998B8E37B96CDDABCDC4A5FEF2F13BF084F9BED73143A52DA291D22050000000000000000000000000000000000000000000000922184C4213422E17E2F4CDC00F6C3591A3658B0353B4A92C2E685195B5AFB1CA1B669CCA0C1BF001F2299DC1C2CDAB4FF7EC74C179825208A2CEA4D1174DC30B2FBA4F3D000F80FB8B3460CE70E60BDEF3F477FC08D71E4814E36413DD8010C6E5DC7D13576D61880A1551DCE9E8B17E777844440639A79E9F967189D5E2023A83350071A3212A20CA22D3C52D5F24FE9F781890BE23F89E0CDC41C95815003ADA92500F1958610FEFC042E8D11D579C650C874C99366541D49BAA8F8918F2FC6CF65B348A8EB6C388A7CE3A2B7C899FB6985F0E13E174E187E9B050CBA2F0A5673C11CEAAB9CCED6A0D0A74879D6EDA08F496A95FD4FA24F59B62265A6D926A3F4580F9ECB5B59F12E0237A3B759283EC9E1F0320A6AA99C7D09DC5E17BD13DA61A968E09BB7CB2FF142E1BA64A96AA152331767390DAA3F57223463FC590F406DA903E88D9AD41F3C235D75EA63F3378E74D1A12829EBDADC0E4EB7388F059EC03AA6E39B7C37B09D19FCC36FDF3A7127D8CD1093C6DFA4287E0BE25C3A0BDBE5230DA53D6E99A2DCD6C22546188B0C7BAC8075CA4C9A4C63FC8E9BD0BD2BA49477F23AF56E68A3D08147146200B8B6157C1E3622524246FBB34C8E273005 -smlen = 870 -sm = F89924CD46AD23C2080589003A4E28F3A6E79105DB9A086721D2DE4C550035479644333A235F8A02208F86B7D5B0EC9AC3008F6B43437D29327B4305B859879C823569D3090231EDFBE881132AD164053C45F761B4BF3DB56E070122544AC2CEFD6A09011089195B551FE2302E07D0545AD9878FE839B5013D16E6A4503EB36A620060A5A2C919944BA9B603008155389B8E880E17FB5FF63F183E6C650D02CC6FD44E48EEB07DBF07277C85D0952E8500A86EE95388DF139F9C5A84108D1E63F7A7842909B818E9A0425C257649ABF125386FB5286031E7E6D0EEB85C452E254DA39BBDA51F0D2167EC0A51992753DDFA76874AA80804E705CF8BBADF3B82B6D7FBA3D1CAD130ABCC0B44D6D893356F3E94BF8E82AC532EF8C5E5F4200207BCF6B754F14E57A889FFB753F516EF8DE2A647FAD8E449264F0BBB4CF48BD01501736DA49509C3426A3D4108B98E6A4AA6C4430E8EE76540051FBD1DFBFC01750E26547F8718EF7D897A0342BB000FB99AA63B781C9A4B831DA798C014E58725E03D2F8B1A029C3337F4099239244AA320965B2CB5075052D901B6077A18C1ECFA5F272850A475B5F6BBC83F3C09A27072F80743B23EC6A9870913EE2805B4D296B2F81A9D733E5C8D5C0B477E51F9328AF3AF8ABED960408AFECD27FBDD08FEF50F4B07959646E0A02104A69674294A79DE0B25B65F4DBFA797E5FA56D66E8BC07D5E2E7C7D2E845699ACEA3BFAC60B2C0B988CBAB949A5B598D8E2F1AEC66196E115AD7F237A1C7FCFB95A1BBD6939A250E7BB0F4A02C23CB1BD81090CB770E3A70CB081D121BD0BD5ED1DC06D61282B98BF2DD7B13D2C6CF833891C67951D7D0F429EBDE3F1DA943ADB8AD285E6F13F798D6CD9A0A06BCD6125EBAA48F8F3BD5100A122F617817E3C42EBC3C3B154258FA26B9FD886EBFAD42DEDC6A2C4F9986BAD88A2A79D7EE603554E9CFC5FE33A3A171CF7BA94FD43228019B2F6FF96A8ABBC58D2098AD95A95442F6858EB69E131D7BCADAD81B9BB69D7682A978279B631E22927DECFFBEFBE8FB2E51D46A3FCA66225D30451CEF9953EF94F30B99F2B26EA75B84935EA4FB257DBE5734454B8087B3A4E115C6D31E72709303E9F0BB8C86FC6B11B93B53F9781BB92851A5CB5DC00D0B4E15683DBE4EDBE986966FE1F711F24DE9A0E1BEAEA8E835C70CDDC589773D31191B74AF780EB69867829ABED6D3FFA94D577 - -count = 21 -seed = 5A64401EF8E63AEE18E8CC0162845DC7AF388230E86728ECB330007F2546F949764273EA05B397FE71F567E1527FA445 -mlen = 726 -msg = F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 -pk = D0A42AB3EDF8452B043EFD136121219ED014CBD1FD8B78EF90FB4932B2CFC31776A57BA5BF994E176F72BF61D56F30B861D70AB122B84413523762769C334E08 -sk = D0A42AB3EDF8452B043EFD136121219ED014CBD1FD8B78EF90FB4932B2CFC31776A57BA5BF994E176F72BF61D56F30B861D70AB122B84413523762769C334E08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B21F70F76666AAD732C840648FEF618669C0DA25881161BD3BCF6D3CC650E005456EBA4FBFE34BF8F65971288F120100000000000000B51A335A7F79DD39521A8B3B4E2F1C43731A70F27BDD7994E99B7FE0D0E1ED57021758D4C7BEB9684D0BF1A9DB3BFEFFFFFFFFFFFFFF65DBF2815845D67350963EB3B2AB9AA15A1D85C364AE48B4853473A09C34040000000000000000000000000000000000000000000000EAB4B0317D206FE071A0F1121F45AD277A717AE682BA3A2DDDE3087D8FFF0D0000000000000000000000000000000000000000000000F72968950212BCB3059B7FDAE720BB436FF8F9946E885545A5EC8728FCE86C27FED7C3FA3699CBA2B99808415F594500412EBFBE72AAE0755E965FE595F7C02CEC089D68610D969E62ABA728936A3F85D19B4E752572533711BF3A0C548A160B11C35B3ED5F0F0274D1EA98471FC833D46A6A1B39BD3B140717040606089E1318FD03768BCE548BA4DA9D9D650977C3BC6C75E93C7D4E95BCF389E82B3E4A7155632ABD0534A79F0AEE5811A6F94C0B47A31B08190A6F051C07D31CECB00F51EDABD278F3AB4D762738572168AA197CE9C3576D4AA124985A8FA445769E0CB27D6298A1D5BB35E182757C83E406DD3BE9D06A4DA514048EB90A76C6E04AA5F2AE5B29655ED3F0028D80C9F5B52DEA0C23B5CC5A005C5E7CC2918178246DB6E12260296C58B32F8A7DC9A9AE8853C5EA281EFCE1E65FEDDE82C00F2DD41ABB1297D49951E9E29CBA5120AB2DA15FE4AB204D2C767D0C99C778E46051B7249A61D7DC6481AA9E311752CFB81B35017A26BD070F9914A0037B09824161D74BDC4155A757640320BBE0E09A5F3D8456C067BD5CC9FF98C7216EE159B14852C41E822F78BC07BED8A207D42EF77C0AC231FB89D24B4A22CCD37270330B25D6F0E8103 -smlen = 903 -sm = E20118912E280B3528064220D17A03AFCD391D05B12459933555123CE401644A79F41F1698D81905C322512164DE2DCC4804C953EA6B2B0D780BEC040288F633ADAD73C7B10296263529D8CA9B36AE01A43E24AD9534AC397F06A1DFE02BBF3770ECD1072E5DB7A70DF351B0520796B6E2AE31A90C3426018BBCD557940CFFEF3F0272F72941820C9C254100009F7C25809BC3FE602107FCA87AD35E480C005CCE0DBE585BB646E105317CB48CB60A7901F5ABE373CE1F6FB14F2014F5BC0071B17AB2C84E8845FCBF4B15C79FBF2E5E06CFFE6CAD9A283014A975F81C9216B261CBC79EDCD58D0E20C586D7C641E0EE97221BEFE54DBCC56A594DF103EC24B52DDBB6052D1644972640F39DEB98997FEE7A252A65070798B7E46707FA440375B1BA705B3ECC7EAC56D9C45297E585299C7D747B430F0D01E82081C70B4A87846F90267D5163181DED63E089A00AFD33B0E2B3ACE91182D8CC899223CE65A5D84B86BB3E8B34B13949BC800F2145468BA5411EACD6A6C331C340D4442D28EFA0DA959A2797C7181BD4BBE6E6DFFD134CEF373ECB0EC08590F06BE0CE292D3718E2C0EFC7CB40F1DB26F5F38FDC82A72F81AFBBC16591EE02DC818D63CAE69FF0A28F942F7E07F6B0A741F3F0EBE3D0EA5859024AA408462D3D268C23F95D717C0A685A4CA73AD90EE923DB57CD6CDD828B7AB0D4AFA6A9AD7E32D407A44D7515C0A6AF52A66AD72119BA1DAEC6514DE3F8B462EC473072226AAD61135B0F5EC646BA9A127C9894E51FDD1B2D38011A2A6D7497A55283133695D0AF9B3FF7C5A8FD667231F9E511E3B8C4C3ADC44D02DE08C47B2382DE67B32826754C6BE5231CE0FC657341E20247CC6CE574F3D1A9376AC8237B49E5030E877A4E33CDE25D838EAD659EB1678706C759707FC66CE84CC968A8334C18F1632348824A6985A0331A93B59497B70C1A03A6848F18F5992972BC79F07F4222D2612797F495463836AE6CD3858D5B9BDF744A1CF361B5D454D41AC899A4FA61081B937CBABBF0FFEC1B31C162224EA36CA2CD7FCE54EC1A504932ACC5BD0B17A156DA7488F7017E4916A687FDE7FCEBB2901813B07964084AB0447A94DAC3A0D3FDA05B9F497CC1555A8C74838E29CB8CE89D304DEBE419D26BA7F3DC6E9526BD895495A5FF1D7EC83F70D045E306E7C2487A52CD7553F062D31888EF7FD27F667FCFFA984AFE0B9A4C4E85CA943812CDC157C5486B0B5EA6DA05E4BB8697113190321A976D1806DA129101E60A28B7 - -count = 22 -seed = 3222E4B55D6767E300FDE03DB3D8227E19FB8B08EA9B923FEDE18D699DC3694EFFA7C4DAE2AF57E4A0162B7C564199BD -mlen = 759 -msg = 4C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D -pk = 214B8BFE6BA0393AC4514D496AEC99A0274D220DED192812B36267FF6795CB2419949C0639E3ADE3E2445874EFDA7C5C75306018E5F012DA882C6F7DF3233D10 -sk = 214B8BFE6BA0393AC4514D496AEC99A0274D220DED192812B36267FF6795CB2419949C0639E3ADE3E2445874EFDA7C5C75306018E5F012DA882C6F7DF3233D1002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055A45A06A1EF64BA0BFD4834AB4CE48595326DC13679B85474EF81EDE46D8B9EB08E70FD6479FDF9CFF8C644008505000000000000007484F6F9AC2E761F51F1A473DC80B3E6DDF3AE106BA2A4E1ECE1F86D80289195D59C1030FF19D21D68C871CDFED7FEFFFFFFFFFFFFFF141BCD675F0E90F90CA4FAFA7B90AAC3324EB22ACAA38BCB621E6B5B661DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B6473B58697E2FBD1377DC802F82BBA8B4214527AA6055A82B79DCD75EC0400000000000000000000000000000000000000000000000A23BB626DF8205C46B0DA5214A160FC28AC637BCED7053AA105E667A409B715680D7446CF49BAEE2BE6C96F92CE45094C1A8E825B54A8C60FB607403B701E23A5FA132C97D4C0D83486F83556D10A01942EFC04270263ECE120EF5E2975D52AD3D58BD8C424611818EB828B5BC19C69F9F20CB4915E80AD37BFFA7B0C5BF419AB6C3D5202B66FA428AAD5A98621192EC9D007678D7AC37176DFE98A6422A9007C5384E97B233818861840F0DFC0A53CB5EF445597FDE5E6B6416EB7D4E49E217C9730BFF7D30D1AE063CB99A4AD3491E69064567C1683665BE860121FF05E076BD8F7041DA41A4BCCDB7C128A4789A1EFE7E150D3CA2B39F42D37EBE4BC6833F678B35BA55BA0B69FEF42051B37BAEF7929F36D539B4B6F87150B48771DBA0E88B49BC47C76E7D843F5D167B1FE395F9538178B5546B5C2584E654BA87C210EBB8809329D8E3606318FF310FABCC6D6583CC8B27CF7473C99C9186862B56B069F89DE7EA170006075CFC43E969596D0B73884EB6DE1D525830B05B4338E8B191975B0851543D6702E5B86175EA5FD7950C048A95A329575CD4543EFB767991133B87DB2FD0C376302F4F87F4932CB885D7DE4D119E36FEA7BA7EC80064F0309 -smlen = 936 -sm = 3481E337344EA7BE660051501A5F928EB8EF1904BA8142F8E0A34BBFC00505D0E64CC67C75C18006BB18FCC3E9C44CD5E806237814DEC66784FD7705B22471AAD67A410A46007290F58EBBD7AF44FF02734ADD6BB2E70D536C03A3D0330F08023DEC1E05B13B5B651076C0AF280594ECFC0624C382E497071278D68270E54EE26E07F944396643BED0B33301002F52A0CE6157F1C63363738F3AB3B8350C03BAD6AF0712F2FEAAE001D59D60C6817DA0014C4697A7D8195BC7D4B8F2FCF3A7E9419E8FC9AC6BAFC5D658260511C697286BFE44E2CE98C21C98BE42E5AF0FCEEF8AA54C5770AF287A81C7481FE3391A6111AE6243D545B2A651599B45931D7640579F8659A8BD6F77260F235F71476ED64714FDDB70C549CBE089322130F7B0A21F530508970D55CBA55BAEACBEDF684C7979078102ECFFC2C3F182F710280CABC2DECD3D3B5D3CE908CB2307B00FCC0C5412A12AECD041B5F70CC0149390312B9C81592BB0E2ECE83D4495944E29AA798DE67FD69E2BD0695DC573F78D8BB48E6B8679E1C50D1E6E58E218B77EE51597EB43ECF7301D86F457353D60E98CEDC95B4A76844E889BF7E9D03503757569E40D55AB43D63293EDDBB579FE981FFD4DAB056F85006FFB5E759B9C16F5F6B235D7DD78458A73EF37118EDF599AA504E9DB9AB5DBC90B8E478F3DC1F35A7C4604A383BBBB410CFB2C5F746F83EF94BDB2F244D421818C26827D5B7D665B8A802181EB7A9CE95B6633E24D914FECA7E969F64038ACC3009B15168426EDB67AF2CCF4E859F5C616891D355F7910ACFA599C396BBB2D2782CBF1432E6259FAA77730B6B86FE0D67730152CD2AE0F9B0314048CCD25772C01FC9773EBF06618A8CE1E940F48663427775990CDC41C4DD3E9AC6EDA1EA50E04F1D329E64C8532A7AE32238C131753D60A25810A5FFBEAA9007A6984EF69EED92B777E079CE0FF48C2AEE9C18D1DB9F49B5419EC6C0E2212DDD2E2FDEAF0FE9F2B84D9C50DDE86A70FC28BBF8918A973CC67A36E97CE3027D73891E7AEB24BAF4B12A9DC8AAB5D6AFA380BFAC3703D2D32F1E40FBB532FD6D7D710DC0741DFC7EABFE55BA5C311A00E3BE55C2EE74155E3A06685071A962D7532AC76D59FC187EFF01F8D339F74323732168FA5D14F4B2A72C9164A04A6EF14BF5DEB1833E4BAA19A55AE590F542D4448E0EAFF0E0AFD2FB30FD671631B9325F4A0BAC9A43DCD2840185A2F601117A625B0DAD5503578537BE2A535D2F556F371536BCF68C0E01C96301F08E1567DBF9D8504096A8FD89C086DB695DA191099FD1E8EA94035276D1D - -count = 23 -seed = F41B3C6225245C06455272A6A073F363E5F19F09A0B146AFCDFC2B3B0EA64BAA3F90359F32B2D1017608B03064E90AB2 -mlen = 792 -msg = 72713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF -pk = A945B2017FBED8EEB058DF751B6832C33FE6EBF0295261B0E7977A39D4527C1599A6F5A7132CF216A59CE4C591F3433C7608980CF23EE635B8699614ACBB801D -sk = A945B2017FBED8EEB058DF751B6832C33FE6EBF0295261B0E7977A39D4527C1599A6F5A7132CF216A59CE4C591F3433C7608980CF23EE635B8699614ACBB801D0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D5B94D658563B5C3B039D3D343919EAAAB53795FA0010E4545CAE9AFF8910C2C0D27059526D3CBA8E9C61B6E2AA00000000000000006A15C666E391188981FB140725B761D51E7AC7882C9D296F4D6188F913529CA48CFCBDD5854CF56DB1A96E1A23E2FCFFFFFFFFFFFFFF5A073F230FE7F72D7D4900B7738509FD217706B20F102111FD1DB0F029ECFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53DCA272620A27DE392260ABAF41DD5AF84D1145273CABC4C75E9483B8FC0D000000000000000000000000000000000000000000000083F8A52CA0C508661580D56B687125ED18D6CFC13B1D882A229591AB90510E22AECF0808D68EBF79DDCEE1A4B5B32796DABA4F767171E40BB3633861D8AE143054D23797000D1360297259E98E0511CB329C697B1C95088DBB44407AF8C4B92449C02231D4BA26A45A8916640BD81AC354F9F3439660B42EE1DB198E83BAD6317D2931A95438D41A6694D15E63E8089465750AB30CAD476B21F1753828892D17787F2E3DDB2E3F944800E518FEA7DC1A81BD08A1EE567C9B9C23E9EF359B1133F2F1DD5A12710B2F1F58FBA9F1C46ED865391A2D7422CFA56564FA961D388F1CB11BB2D83D0EA4BFBD18D4C319C5C705E28ED3352E0B7778EEAE3C4C1FA6E115D4BE9D6FED067B6E69D286DA86CD47C3BAA6591B583D478F02DA6B3132D7FC0F3C206B737DBA5C6EE98A7DA290F964CB799C04052A39882C4AED3A443AE0722CEAA3725C70994450415394E4032FAEF978F2234E37CC5DD420879844CB662C0500ACD31B7C4904EB93918AC2AB468D129270CA901E8373143BC5EC47362CF43182AA4C27D20868C4F53AF0116F05F9B2DB4192F74D5FEB791DF569D819228E09FDFF528C6C2909347E6BC86537D261900AFD4F45B5F93C1E07DBAE8E54DB9026 -smlen = 969 -sm = 1E7DA14BBB8761E1D7077D29E20E75F72E68FC0774F30EB7CF1ACAEB5506FF47418B2AE8B025EA07A8E2FE82DF86DB4D910635EA9B59C65FABD1AA0107800EEE9E55BBCAFF013FE85FD2CB0DAE2E2602E51C62B07EEEBA6098027FEA27667E2724C35804292FFFE386BC06987204DCA43A95519F29C24701963A5B970913544AE604F2A65775FD186C63A20701A5C938AAD4106E485F94F1E212337EDE0F01E4B231FE9100724C2C04E196AB24B5A2260072713EA55F1E5CCD5787F172657C6F6C74081DE2D70816E8531497965DF02DAC04D91C4D09DCF8904CB152E2138F829386F4351015DA253A5B5EB92D96E537DAE3CE809443EA90332D9C754EB11F4DE586A83B5DEE7B1B9BD547EE7107530249B14279BAA04683D74B69D7BFC8BBCD447FE7706593C01188FE6AD8D0E2572D49F83E93986B380D4169BDD94E3311941DD2B041DFABC5AEA1297C65BB5C8352C99FF838D46B93B3E5F79E3CC5BE5408FE5E59A10D488DD65A997B086FDD96CEFB0247B2BAF7B490317E34330A879D04E374C92ADA33EE243D84DA015FDDEC243B00BD7488AEFE373E8AB1890273A7A2285988E9DAF9C4E7C5A17F54AD6195EDE2C79657E1BCCED0641E20F7EE26EAF53DD8C82827F2D2783D44FB030C95791F41653E628062267A5CF534DF00116C1ED1DE9F360B97555C65CDD80724104FB1BD4DA5785B5D9C24438557E48AEE58D57A03E06D553B05B67E1C8D10085C2F153647F174F7922FB8D2210454F7014BDDBC627756EB7CDEF99B6E3A2779F82088E3F2DA14C2DCB5B185AEB5D6ACBFAD43E286AAE8F84A58E8DF6ABC64E4A8EFD69FEA18DBFA6808F25FD418DE8BA923500B74E34DDA3CA6AD8DC208102DC4A876D8B8CD2926AEA4B3AE11A546F6235ABEA152DBDF43E0BCDFCDC83299207F294A707C8B4D1F56AA64A205C718ACA69B862AFE7489F11B324E7AF6BE68380D2CA6E0AF0E2E20F890F2CF98907A9D43135C03E85E86C9EE417140EFEE9054B46C110A84F1841AE3CFAFE5B4A95D6B2B606D8D0A70BAEA85C9412BC2D54146E9F866800E8E8615A0D64D1D595677E8C88699E3CA6097D47E9FE64050FB55033FAD4D5F226DA8EB5DDF99369ACC7552927ED3AC7368B9EFEA2443926DF26D1C172858FD8A5D4E1D7D39E7F7DF047385D39131184087CDC45B299BD1F7048E918223DA3F960608E853EE49EA667465DBBD889CBDA20FFBB540C9EBBA5C2CD16A22A57B561E01331D6EA6BDADBD6A5D2BD1441EF4E1D9DD11CC62A0FA5BBFFCBED0D27B6ACAF0889EAA5863DD9BB35920707B71A0805630D1769FEA320516E71CB2B125AC274F16F7A6876F4B922C7C006F38AE1F7183CA768715D2AF - -count = 24 -seed = A08AD391E0FC57A83B74CA8CF44DB67F8178262ED9B20AA0163CDD8274AC2BE05F558B112B094244370C1AAAB75077E6 -mlen = 825 -msg = 209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E -pk = F96BB0E92DEDB51E0205881C3BA093EBB285AD362F6D24A75F11B2D42C16A2055D6291DB5E026A2F8EB2B384CA410CFB33F573EBDB3D784556C2D69C2DCD9409 -sk = F96BB0E92DEDB51E0205881C3BA093EBB285AD362F6D24A75F11B2D42C16A2055D6291DB5E026A2F8EB2B384CA410CFB33F573EBDB3D784556C2D69C2DCD9409020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BD45C0773DC9795E7C25A0854AC47EC4441C2996307E4731F57C7424723D1D7A42355AC44BAF68A6BD866C161947010000000000000060E89B91C0F883D3839D62F706DDBCD7E2912ECE6F4E6B174F14BC257332C32CA0DB66AEE3EC7BDC51FE2286C34CFDFFFFFFFFFFFFFF8C791BE3018E511B7A8F0EC21288B3F76D1A85A6C014A2C4F22E4A3D02ABF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB32CA46E2E3AB9BEA66CB0E8A40E4A9AEE6DA9B87B63C15D427384872190E000000000000000000000000000000000000000000000012E90AA417B4F649CF646511A817DEA52AB953BA8BD57CCEAF8BD4A9CBCB3605EF051CFC1EB440B687C99F649BBDCDD70E60EC09EA59998B60A0704B083AEF2DD23929384717AA6011590B40A941111D72BD8A1D4FB39AE879BD9D259FE9A225F3EB86FDD46248E37E177DDE90DA7033A82A9E6E511CC048AB02C34A78A1B812B498776805EAB7056F19651FDC5B55BE323CD4E9FA3DBD9137F77833D426591BC8FEDF231683B80E4577ADAE623628D101FDB9B364B5B5AF53A4E0A22E36EE17059C3AAB1A0D693BF3B8AF0A9DBCC59322E268CEC7B781E9595B2CAE412B631655DDDB6D78FD7646754912850438444B21368BCB996BD05317C8EAEA7AD3F92B3346B9BB63C400344E9AD233005C72E0AC2E3F09E91850F2D404F23523FF4E14D84987791364BFFA733D2A7449D4AEBFCA8DB446B9794929C957A9B2F337761C406A0E33E2A1EC896057B136B53CA675BAAE7EB5E27B4C16119EBB4B943A5327CF38A3346974F3AD6C9E17A1C24E4D8935555571A0066D69AE3DFD678679D021CF83C023F48364828D80F913A8B27D451555527DAEEA5CA15D25EFFC67C8EC0293BC4469889B80BF27ABAE038A0563B2ADEDB3945C8644B406ABFC5931204E10 -smlen = 1002 -sm = 5D456B09F3641E9252047CE48238A6C41B8B0401E21191FD23B23E982701DEF40F65BDFC1647E704DC91A879CA4FC9EE0B022F2C97B259FE15AA3207FC645C23EE2111482007442C1914E65598D77101575ED0673CD60F395A045FD38F5874166969A10471D04537BE6C9D30B006892E947CCB23BA1B34048386E64DF7D0B2DEEB04F8B8B8D4668C7E2DBF0401BB70490DF57A720CA40B0B483623BD540C02E6B6C8565952021F0C07D5D4B3443CE70F01209658CD1D801079FFE8E950BAFD70A028CFCC35B9FB00D232C5603A1D51BA13E5DE59E0277962C4474E9F3F60FCD99C9B79665B3839D5C037B921A4DE8E144FA1D38182FBDEECDA6934E814D9186591F01C5E23349B34F4439B4D402C4072CB4D702966AB473D2C39443F41FBDD0C48E566D33E076422EE72FB47B2FFD661F367E9EFDDC988BCA02382EF93590D4FE3ECE8B1D9D8B3A653219C7D131B43E2FDE2851541F467C31129E6F9B9D124221CD52610B9F138EAC1D01F193148FA0415B29F5C86D15067EB1E26C9D51F05655E8545F734F8F244854AD76C6B04C230898BEA33EFDCEEF100D79F8E3B894BA583466749B82007067806E3A7B3BA954F6FC5ABFF0E099A24D14D865F6F4538736124ACC5EAD4169DDF2144AD558DA3C74CDABEC147D2AFA113EDFD1E2280766B18792310FB6B4FE5D0D9F65906B1CC43655BB3D6178EF9093AC9C8F1A91BF49008179394EEE79E1D8E3228F567770C1BA1E30BA4BCE2465AB68F53CE21C0D8AB2F6E535828F211D4DB957DC3AF8B7E00DABD8F1F74C959B2AFF45121C5B5ABD3136C6F55D5F5FFDBCEBC3CD7A430FF3813D23BCDC1254FE6949DA4E7694028B7FCB876099E91B92C65D85C39D4BE9325AFE81703E5B18CBD7BD9EB59A9BB9408ABD966ADE9A60303807AD1B2C14C04CDF8FAE6950A55B21C9EBB5E94713BF8C2890215C5DA94B59CB31EDC671093B15FF5014DB4CD3EA8060260DC1612E9FD6E5AB40F0656121F689C8E94212269A7B24305C83BF0583418755CE690913CB081F2893FB42BC4750F2C053C48C1552430793CDDE1A49AC9E21913210D727C4BEB5640AB9B7505EA4E59AF417A085394181784BF1BB0BC32BD71CC57CE77541581F14B8BA4B758500694796262B561A38C72893C77B548D779A3833EEB064CDDBA5471CBFFBC769E139946155BF376A56415AB743DE568CD21895ED6951B5BFE1B1629DD6510DCD4483F206954964E0517546DD96900A2540A51835818D1730B0C9123E7FD8B28E6843BFFB659945A273CEA944FF6E83C234B3E43DB4630614E0B67778EA760EE341FE68C525E90475A1560821AE6B2A85015292C36EAA2E041AC04FB55922C48204525187C7E0476A9FED04EFBBA96F369D8AE709506620127FD399613A9796C4FF96D7E - -count = 25 -seed = 6E0A8EF5156D693FD0140BC4A31084E79773A83F42C8D133AC8A9D62DE3CD74511F893DCB26041E6B35E2B175408FCE7 -mlen = 858 -msg = 8F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A -pk = 4BC4B8372F14C29566F6CB023EBEF5929849E241E761CAA03E222CF28CB2D807399235F2AD83CA3A86F893856FD4F18453FB8118E3E6B234721B12CEFB7EAD1F -sk = 4BC4B8372F14C29566F6CB023EBEF5929849E241E761CAA03E222CF28CB2D807399235F2AD83CA3A86F893856FD4F18453FB8118E3E6B234721B12CEFB7EAD1F020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000902330E7A9675E614986792B4AB0B008208B7020F0CC92F5579684A53723BDE65E3EC6DD0D3346A94993B76B558CFFFFFFFFFFFFFFFF9390AD14BB9B1BD2ADB8E893FFB2FAA1C42704AB66C48451701996774F80CFF4115641E5A9DCB720E65360858044F9FFFFFFFFFFFFFFDB6AA48642BC3154CF795B138443EDC8421156EE942F0E5FCA0C897D543E0600000000000000000000000000000000000000000000003C38D9DAB3C2EEB9D13E046F271ADB7CED69B83BBFE3BCC0854252EED625050000000000000000000000000000000000000000000000C5043D742507A39DB4550F6FECB287757858995E6696D753F7A791F3840639069750759441D9792DD3543AA79B4A313C0D3454278AF45707F67C78D25F4F410CCF27F017D02BC45D72B6F12EAED812CFD6999F62FE5A0559C418A64625EAEE2F05D2D95EC0516E975B22753CB1DD76893817B4242CF668384A44044281FA530717C86171148BCBD2E57D49F0384815F697B1825FE5FB3031124AAD1AD87C5A1338348F430DBB2F2ECBB78C074E342A1B60B632199BA713D6A54ECC6CE9EA2423A1FFC79FD3F566FC58DAEA6940AF5CD663D101C36E501A856FC033C3E0C6020339A282AEE86EAB9F0BD40D3E280F9A06969C394C8667041DC73DD3240E62A520083668C578171CB337479C010017D42E6F1362F45E3DAC30A0D98301543A551323B7F136C9B82E60F767D7363BBD31D1E7BD9B5561F71B3EB7D25B69F43CED1260F1D9587CB0459B524D8218BAE004D1042F09513B7FCD1A28F4DD4A449CF00E129429D0589AD49251CAEDEB4B65BB573F8FB3B381FEEA87E370C5C6F7E1C71021D82DBA532A0075EF5ACAADB51D5A958DA14169126FF5A443BC1CE5EC1FE62B5A03595959AA242A24B8EA8685062FD9E8D0D544FE73DE4CC3CE7A17F36DD91A -smlen = 1035 -sm = A494DFA78BABE79F2B01FE00B5AFFE05A9112604DC8368284681D64F7A03B6E30522767F7202CD05FEC17D9519740632FA00794C2BFBCD9662120705142CCC0BCB99E4EB1C04E49CDC32FA4191C2D804D4BC06CCE753A4B31301DD9112FA1A1E8E8FAB0003BC377BA05A4A74F0046B2D70DB45F103FE8D0111B8C49EA63BF2DF130475ED404C2AF188D96D03018B59EBE657486630B0AA3BAD01222F900203DE5D8D2C0E600C8EB6039342B6A11D089D008F37A065DD696AD437EC82909261B842EC0A3E66F8AC574105A3C82EC8B4926F2466FA550F8EA1B6A9A142C00AFA44BE6512A85350930DFFC99B95AA21012057051B68C48581AE439B9290A163AA4B6AFCF80FFB91A3321C7B9ABAD56D5DC1BE4E67E5576C9F3A7DB96071859B94EB22A73DD96C66AE67AB11D1AB62A86D826C682DFB8CCA3259DCB5B34BE635421CD4206E7D92147F14C36424EAA407B441F58E5C187E58A26B2AE144888A3CC1387AC7D0A681EEDDC3B7781AB282E8185CCF33FB27500CFD119E0415DB1E45237520A868C8457C88A1D3EE97EC9451DA35D7E74924F8902949E7EB14BA87C8AC672D7E4F3BEC1B2814DFA67A8DD2E2D4FF4661D64BC4C6D6A78D4E489689B6063CDFF5A3F1554501B424284A9F4B8FE777FE4E6AFB83A85E36200A9AB40B9C18678454B2A3F50A4862BA1E36F0C57AD004FF90192B5619614E37DBB38A1B8A65AC613F7796C70772128377065B84F122540106D1B4F9123C4E009B4C0A85D59B35F72DEBDDD154ABEC7F3FB25FD1FA04367386098DE610B26FA3ECB031A6072D14607E92FFBE195ABFF71E586A984131AF24E18AE94DBAB0544FD2AD217960F337111BFBD4046809EA03C7C47B7177757A4A43E1FD0134859BA735A8FC17597E593BB58322136602954D3A21096B0D1DEE5CF0AD17A5FCF561FFA21CAA70D33998840E4CFA18BA481704A8B82D2CC1C110FC9A6704751365AE9F338AFE4CF9C811697DDDFA8635A2F3CD02DD1845251014BF2F2D6C02A907BD783207C4773A937048A07C500D7C424B5F65A2C376523740DF9A0B60437CB8AE17D64DD51DD4E433AF83B20C4B6B890B97976DF09E3A86AC19006C229D59FC7A2923245B7B1F0ACF7C42E486D41CA1AC1D7051AEEF6003CE94182F97D099C74317F61EB47AE18C2BED6A3CB253C21EC835E435123E0A657ED926F880CE8E5DE3155272328A467278F52AC50A1121AE818A3EA3A2E1F7401CE23AAF66A4AC289748A7E98A5124C586D8957BB4EDD3F091492BB1A64D75EFCD45AD51CA420F15DA848B20DC6BB765E7B71359B3A9E95E121266AE4A40DC2E9A3D81EA1B1A643594B3D4E6ABB7D1202201DE92BDF0CC1ED977E2D5851822A01F48A6F23180822888CE345AC9BE0CC69BC448D41CA20B79C35B1DAD73E6C683E70C4439B404CBF07FCC39B0E5A1D33F3717A6BAD28A6DA4F091BC7A - -count = 26 -seed = 49CC05312D1DBE216FF03B60575017A6A1464C06D2C5A4A6F973AD9F275F7C66163A29A803BE759B117043862D277C27 -mlen = 891 -msg = 30D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 -pk = 536C25D655FE3BCFA9102EAFDBDF9C44AA066821BCC9DDE80871F2FFCC0AF224751531A0DF145B5AB63E54B23E94EDAD07E0384DA27D0BCA954FE140A5474321 -sk = 536C25D655FE3BCFA9102EAFDBDF9C44AA066821BCC9DDE80871F2FFCC0AF224751531A0DF145B5AB63E54B23E94EDAD07E0384DA27D0BCA954FE140A5474321020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B5FB7765F463863F624771EEE8794D5BE82FDC4A67286DFFEEB6158A8EEE8C3FE09BDEEE2ADB2FE5C305BEF159330100000000000000D083D4012E0B24CC86DD4896202255B571B27062F8D4FB04B51D4F49A074ED0B5C9389EF5019F7993DFAFBC0010EFBFFFFFFFFFFFFFFA84C001A69EFDACF0B410BE8AE462A7B31E4AE63031A3B937EA05D8B7C4DFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B6A68F9619A49D51E33090BE7E3299BAB3ACB0CDFF63C06197EE257C64D090000000000000000000000000000000000000000000000DF8787CD2384079ADA73669C4FD8C7CD4D2F855DD9BC9643079B19E5B7965E051A85599DD6D88F68D3954405F3E40E8D1A0E8FA6364116EF65B3856B9E1E7A2F191BFACDA5F559B66FF0317685C288BAD1A123D5FF2C06701D14E530B618E32F70245D202159954D824F2FFAD8AD2EAFE87062F7614984594A9ADD9888A9EC0A0491B50AA4D81999D2A85675B2B9434945B35EFAD4EBA6F2547E668F2F57531433B1653A60C6186EE3247A52B0FFE8B2025D95A4CC9079676A4491185730E32E43C1F7F78DBBB979841D9BFDC6E2E28DC4A7F128A860B9DA73964B61EC1C0F108CCC12DBFB3A40024DD6C73CD6F906B7319BC5313DDD71598FC2580780DD7D2118E4CA1AAC61E1B774D70C7C4382089112CDB3CDF261F7E1E8A27E464C936A294AC9C500327DB4E398972D8E1C8863F2CBC0C0BD59DDF15ED242DE61132EDC2CD810C139F6472D06DCADD894C0AEAB02F543A8ADEE15660EE9C965A26401DF0C09B8C4E28DB94F1737728A15F3638BA5ABC348F65EEB69B7668BB756083AB51E40FB5CD34977178A23305E388109E7A1594F266311C9E2E8E979F429736E2E26B837088D71FB29F421000A9BDD81FC10D02B86A4B3DE26E40EB7055C2929E904 -smlen = 1068 -sm = 039A0AE331048E5B400042369159581BA6A40C00DA0455E55F8C844B2707B76DECCC2329C339EA06CE239BB638F1EBC1CD075BE731CF7C15D3363701CEAC5B324F273E5C0F03D44B6C7C6FF91CFAAF065F9E04FA9537B30C6D005A6E5A577E53D78B5C01AE8BD15A583EA745D40666B5731060C57E550B02CE857EEF2E26EC914B0333C26E6A7AF31C7525070195BC0108F6C7E129BFE25EE1D4E64770050320CF4A6CF01EAECFBA048DB48ACB796E9E0030D61C6FBD64113FCED8C5205026EBAC0D9F3522182617CB00B6E70C8DA62ECC1BBC8E1FDAF17CC61DD01CE85A9072CC1D9D34FDADBA5B93E0AAB4C9C4C9E26D3F7F145FCB23673B6E0B373C0FD1A58F52486B72624EF91A539519EE5305772A006E49521744912BCF3CDBAD424F00428AA96CCC21D000EFB09DA5CE652E361A6FB649A060835E3B9DC9CBEC660C7531620115EC905DCA6EE2A1CE36554C0FC1D6DD6863B8F3843508ED5C214B6923E7F5C0304E9B0D5E5E433BD029116A33A60CB980737AC950577D0594BFE0AD2225CB8D3FA42F192B0EC05A49391632A32FA931C0FBD83A7B6EA24301AD0906E7911F9D900D19AE1247ABABB1C0E9B9BD165185D9D7413EA068FE8824CCE5B3AD51FE8E2BB2C4022C61B002C1DF4852E4910F38613787CA12371038B6364D920E07B4B417401253451DDC25624B5D038B2DFE29B8494EC960F87803CAA256A95C9868AF819747E4BF26FAABA6DDBAED93A7815C795AD5EB7FB4592DF678AC1375388CC7ED3A6230CBE80ABBB113C80B70C789CF0C66B943E67CE814F12D3D83F3B90A4320FEB7FB81DC93B05D7FE2D36584399214D3D7C71AEF322A5D04B5470703B3660BF86B0B17BA9FF23E45F7BEFEC3758786D2111C81BA4D81B83FEEA35A0668E5EB3694963BB4DB3ACCE4FCBA6F3F6FED9627580DD2D2DC103EF7E52BB9745BD42A7FBDB459B5C8AAEBA67686EB899E3177FAF0897C61B008ACE3304C41B4C79E2EF9C865E9958D8716BDDB69154FB33187D927B5296C1589FB1AE3D553F116FF6CAE56910CE6717C446B9947AB2A981A8F5999C1C6E517EB3FE584F5D10059910E22F40FBDDB709C9F686F51ABF7D7206A8BAB4A346B51523C362D749238D7EF6671A89CD86A8540604F134D760267E91EB92FC0FC275CAB69C776EF81DBAD35027E5307F1D34EBF5D6E4DF424D709666A1E649C044C4930098B2E6E3782A93976B55073C504563C7E052B6816C07F0FD54A759D2BC189FAC3FF54549FC4DE192EFB58A9E301863A77380967735910F63D35EF5FDBD8751DE4BC6BF2E3095628DC7F67C1F5571D17AA342593B2C7F953C3F0F22DA1862122031BBEAF0D00A029C043304E3E2609C4FED8A7404FA10E2EC846A70EB0E37C5BE61E698CF2296EC1FBE6FED75F6FE3113C23B29AFB5A6D7E3A9E46E2D89D8C06450CEA11492C1A97F7D6BE8FF6C014930043022B264FD32593952BC606F779598631E48EED86EC2A013D8EB866F311A400 - -count = 27 -seed = C33EE43A9CBB4347BFAF71147B7FBDD88D212462CB06FBE695A35402C503CD15732B7D0E8BF829A555B9167BCFA2F2BF -mlen = 924 -msg = C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 -pk = 66D5FEE2F267478778663A6C1A1E56373893B76EB805ED259AC974B6F448BB29731650D8D7659E3F7C82B0584A3983245644B0F0EA67517EF616867B19A6DF2F -sk = 66D5FEE2F267478778663A6C1A1E56373893B76EB805ED259AC974B6F448BB29731650D8D7659E3F7C82B0584A3983245644B0F0EA67517EF616867B19A6DF2F020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D12DD80A8959C15F435AE36143F4EC3B8A18B96B7B89E178AE88CE0CC6E156F15D009163400B74A9C47377A96E2503000000000000003A2358D9F97158D9FD3FB4856C287E458BDF0B08A4206039BBB3D51F19D60B3F42346A39B89E572162E13FE7C887FAFFFFFFFFFFFFFF324A3055A057EA272F4BC540F59C3DBCB9105A2B71041BC0FDB085BBFE3BFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71B4B00C7309BC110D4A3C58700C77115D5EB67FA25E4A91E441911DB90100000000000000000000000000000000000000000000003A620DDFA841FE44A58CA1561FCD81A8030AB11652EF4A431E4D55C43AFA0F21AF257EB67F0075FC36F584E8DDED0394092EA08C6567A4C4AF75C135782179324A53835D789AC541EADFC16F3A2FD57B14900B97BC5816F2D8D0B5D2A6F21B058F508F3959D63A4600DD74D5F72F2352CCFC506ACBD8FF5514E1EC1FAAB09602CAF6B299A095953D56D6162AFBA7919AD1FBB36D97F2DE0074E84D036215210C1D34514FB7F0D43AFDC49C778FD01A21FCA921A0239549FE521D7BD8FFD65609313EFA9964B71D5D01C7A1E81F80DC8FFA0391DF92D1034E513D3C0149790B107BF5CB2B7C3C8A6EE2BF53050A809A8DF9294D3C8BDB15E55F8AF95A2097EC260E98E615CDC5FAF9486E94B9245740899477109BDCF9F515481B4DEED133B115C3F577725BED7BCE42614DA70CF7FA5F0B0288B822212796D9BD269F99AAF532D30F1E18AE4F1DFC8E75410CCB0734ABA511F4122F2FE6D32CC6A1F087AF92137D256580D85442F7E63D7079AE6AC7E2F59C3874A9C340420947CDD13C5F7415223D6CC2A57E159C329C5F6F117BB74E4D19A148CF555FED0C82AE8EFEA3D414AA962AAB4DEB15EC290ABA0220F37D7C71E2CB07CD64303C0FDBC087ED70A22D -smlen = 1101 -sm = 859E9F6E83E5D83B7D035F3DDAB73625CEA779047B43D47CD1CA12DE19036CE9E8B8D240D60405048321E0E4BB513B599900BDC22361A79B0838E7075CFD6CE6EA16FAABD6026C32135E26DEDDC84A03CD9E90E2DE96BB835F0511D370E849F6A1286F04B1EEBC4A127552B6D902B87486EA7DEA509A46037DEA259A6A0D2C62EA0544E78E60D42B1AFFC70001E1E47B84D7E8CA4083EF7412D1B331010C03B41FBF61BA9ADAA18A072384C7AB0480EA00C83441B16B39BD7993766E7260D07751AF2F19A41E70689B0EEED0C118D9EF109866AAEF31B2D2962A25A3D1CA999214CDF0EB54598382EEAD64435B7122D275EA8879BD47B41EB64EA908867FD78ECFBE8E992A2636AA7477DE5058179565D3A2CEB8ACE5C0302018043C411D89975A64927B48CB622A13F1ED85CC1113897A68488161AFA1E636EC786A0AA37B928BA88A50164A9EC372523AA9EC8885AA9C95B29F7CA1BBF0652BAC195BA94E976D336B69A9F5346B4C7C81457F802DC9757C7A2435A617317340F764C1A2AE131A716318F00AF0EFA89D3B57D8F31E155598B3944D950D6A1D6485B509358EFB3745B95EDC30DCFF02574F54DFB2D31B259D132D18897DF868115679F06D41102CD4EED4EA290F711148B99B647B8555A4C0DCA1D2D0871C59AB1382A2D6417E6236D71E2BFA1A75CDA54F93E6C087D611878AC7670A04FD7D8CB0993F456E3BC1C3B5898076E22D2D9E0EEBC7D7BB8D142BD2B5F6FA42B40BF676FB69C532D7520A4A105EF0C1337F53D6E9B4BA17F1E76AF4CFDF08F794752D2BF71E8777E2A209F8891B1A53D7BF2A5786B00B9A0CD0FCE79408F26BEFA2535BE188A68201B1514074CD70660971F86E8D3E92790AE7AC591AA7A996149BCDF060C615209FFAB82E6000F41B2A5606FDAF4CD08CAB0C2F1103B2436B1FD7DEC477C6233FBCA3B07A0CA01BF3476BFE5334E32AAA2ED35D5747D673E7BB622E1AA7901C77F28A3AB2197C8B8253A1D28C969EEE73D17AD71C7919E7F217BA2BADBD1EBF986CFE981024FC347028C1109CD4204C7D53535A9B677E39A43193E054D0FD68104D88934DC7BA6CB3E942AEC744B935CDCFEEF4221784F96798E650FFB0FEBF2715D75339D0CB6C2E57C1E9D10F13E6786B7F041AB307B8CFA51A2F10B622995230FBA54B70D94AE278EC224D9D0950BA97BEBA7EEB0E2FBC4093E548D9EC09CA1A08E5F0483024D7C1927FF8DC270900D42D31B81B13A29839BD746CBB3591BC33817741A31DEA308F549A74F3A4E5478844183B8D7363AC1F4D4A5E907D9ED98AFD08FB8BAA84C324563495387A4F12C239FB63F0810447131311B2D2CA302C7DA2DA57C94C3B5E844F537886FB766EC0E977254DBCA8FC84AD77430428F0692E55D8E2CAB294B857AB51A2CE4A725433DF28D9CABA86C770743AD987BBA58C0565BD18590931E283292889294B607A5F19D9E905AA3940836E2A74A2E94FF3062E85A5C6C978B5EB2B254BBCDE128280E6CF02C11A0C2066F349E3C6C083965D5B8A9C000E15FF36C5BF3A6D42 - -count = 28 -seed = 19CB4BE2332F7FF0C078BC001FAB3C5FD8569A76EBCE373D1ED4FC8EB5D744C6464E2B5EECB9EE836CD5D87BEDA78BA7 -mlen = 957 -msg = 86D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 -pk = 50681F2E925FF5ECC548E9D6CF04638EDBB14D297EDD1D78F80C11FF977FB70F0007F6C2286801C1C5543B6CF0AFE3CB9D666D20A2EA9152B4801292AB1E1215 -sk = 50681F2E925FF5ECC548E9D6CF04638EDBB14D297EDD1D78F80C11FF977FB70F0007F6C2286801C1C5543B6CF0AFE3CB9D666D20A2EA9152B4801292AB1E1215020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000399EE08B177DB690EBAF0B1D119DB24E842446E91E61ADFE1DDE44B98786564288954AE321BAE117E3A10BBCC63200000000000000001A115DAA6ABF4CFCDEAA6D464F27FE9D91434D7E0B130A00B1CAFFD49D8D0AD22B346D49ABCE724E621B362F9FA2FCFFFFFFFFFFFFFFBA6C4E41C49B1460F9600073463C9F861285FED070C416C2D006B361022EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07AC761654BD9A4C0B377287AFE0C92BE73B310EDCB47342250EC4E8099D090000000000000000000000000000000000000000000000B6F450812ADC4DE3104B2594242C45027124CD684A9ECF867BF9E81287C78F04678F9556FE9C58938AB89D3E0B3235FC9B43F3A83332B0E709459BB119ED6B052B6F0C91B9FC2CCFFADA2F4D189F91579A762F1AAE7C348FEC5D7CAF6E24E913055E55987E2A76D98CFFDB97ADD0E3089DAA38EBA61A8B06E14A9BE75209822FD94C2972D9A0607D02A0A24E5D6E4A0893D49AB065D86D5E2D675B2CF7FF8A341230A56908E250749AC8B2EA9FAB6CD854F05B2773712F6CEC157F538C12F30A60AB429199E13FD0BCC9F3826E7D4359948B3C8F060870AFED7F75B89FF7570914ABDDB8E3A8FB9BE3EF1F6C09BA91673A0A6C98A1FA548D62CD1F4EDEBD2B2C5EC35A11F032AB692E377CBFF63D893A88C2442B210F0C4DE86088D850AE941ADFB720C835A74C549E74B457B9FD432167FC44D3E32FF855F7BC6008C703C51681F6554E112D1A9CCF28EA6DE0F34024B5F42194FDA7D2A3E4DF4847C35E4E11079344CDAF8244EF85F4FED777FEF84F6812A2DF6E21949B454C4F9B22B7DA0DB5451803C39FD88D7AAACBE39E01FA25052FEF4F1E411BAAF7820249E3FF1D1DCDC36B877DC4AF90048C7DC4EDD90A6018A294111DA5443C4329AD541F159101 -smlen = 1134 -sm = F0677E86BBEBA232140187B66C4AE55AA71FE407D72700D515837946A503514971F0C027B0848F07D068D1CAB7CC086DB407DE09878F0AC21F88240721738518B3A01E753607AC393E94CB33C973F305CD48D736E070E1D8DA00393CEC3B8DACD0DDD8053A041AB65A8E1BD81F0121D246A511E9F81F90073EE4ECB3156E71C523000B5A03A7188A75FB620001EDAE30EE00324246447C613934433A850E02689898D18E3F4AB91E0411B4F01D9246820086D27C1FCDB8164F8909073F590D0A280E5EF193B0C42863BA518BC8A51E625658DBE2184C3353FAEB674C991EED3F1B0FE3BBE50A21EC70E9F57B97C38D6E436D3DD577D7056B07A401FF0EBBBEFAF8212B993A39281190E309ED0C50B269E4852DEA85432A5941269FDF63766B21D25D8816DE5E87FFA051009D232D6B258C5F43F45F2D48BE09B2CCD8FC963FAD81FB368502057AFA7C865D62D932F652802A299295B29411439DCF832E8367A749B4D7ADF7E8ABDE3EBFB844A9B1D32F77B2BF96B5D29FC15DAE83EA80A990AEF6590776CE1CB81587ADA80B9A7B45ACA3BBC54DBE67DF090104FA196701280B97607A333A9B56A728710CC1CBB7569B79FF034572495181A92D2380A7EE5E9CD1B0F758C2BFBCC4E11464F1CC7D91F117319C30CCBF4C11E60B5DEC724225B8D77B71AA58F5FBD498A3F49115687D58393BE648805BA1737BB921A08D738243920C3834F8782A8256B7DD22CCD5F4ECE86B8A0860BFF21C5C8F0BE987F2D510ED4DF9CF94BF698680B7CFA22A575A3D1B5B431734B59A4B31913019C1F42DCB76A9FF32BFBC6E16D2FADE26E3C17BAE49CC415E4B370D1FB43FF652BE62D18B0AFFDF286765F4F30FC8D6F2C4A58CD17B3BDFA013BB2DAA075BE5F522EF9BFC2E1506CC1C4D381B3342EDC19C955A5FE48A712AF5ACE66A028D03FC859711C9D33231E48D41E58A2C2AD81DA77529AD5E6B73E1AC96F0C8E53F153FAEA7903F917492A1D2B1203174A08551FF0F9F91E32BD0F31D606C80A505D5EB55265542DB3653C2621E7EB3FD677F49534F261205F834EEF1645AF419EF6BE5CFC16D54C7EEEA12D2EB9458831F77FA558E4D5C7FE446DDAAC3E1D502C941C95F572AD545ECC7CAD21F0DD50845CBDEDF589505FD34CD8C00D57243C3AA3615D84C39B0A72C28F40AC72DA25EBC6987DF5A7E390399463786E75D524FFB6C961BBC9301264BFE3C699101D18ADA4A72D193971D54089E6FFFA684CD3D77570CE0BB9179A156D3E2DCF266358499BFC158AC9A6913F622CA861C968EBBA0A59A12674BFE39389A2125A02563B082259483E80C89A3763C0A9C3DB485AEBF22C844539EDAA28A3FBC0053EEC475679B741D9AFC16B5FA109399FDD1FC3574DF8A1292B8D7401AAC1BE452D38F97D531813369EE4C50F36736B95AE9C3E4F91AE85E2D664337DAA40F75CCED2F4A4D210BB4EE25A56DC217DD176DB5ACA43C002AFD63ED8712D89E266674D9736FE4A9F202A81D177970411DCCD289B25798272D2647CE6451906A4F7D46E87A46CF6CD048B6BDB62488A24F48D1EBD61FFA474321B929E0A7B6F9D0F6D777ACC14815F343E1 - -count = 29 -seed = 6BD93FD13C0299B3EC7403638673F3DBC449F3A617B691DDF73C072B62BF028913375D7460BED2CF9FDCA517690CBAC3 -mlen = 990 -msg = 56ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED -pk = ABFEDD9A63633BFCBFCDA05BF2ED4B19234FDE4C2F5A974D8DC3C774718C162E491844E83FA9A22A135BCC86233160CD4413982172578ABE73D6672FFC9C9F2F -sk = ABFEDD9A63633BFCBFCDA05BF2ED4B19234FDE4C2F5A974D8DC3C774718C162E491844E83FA9A22A135BCC86233160CD4413982172578ABE73D6672FFC9C9F2F020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000320D76498878B225C45FD8739BCCA720540D464B9DE59F4BDB82A0067F3505BD6766676D107A79D43597801C7FFF0200000000000000F1C3B0DEA1A8DE8ADC7540438C508E94C5E73BC161922FABAC16A55E17650EE5EAA0DD45633C6475887B72C39C48FBFFFFFFFFFFFFFF2FE1BEEAF7A5135F1938CB11595D932142A27DBC6DB7A49636888FB8C98A000000000000000000000000000000000000000000000000FE1FEE7224D432DE2FB54A5C62755D4713E613EDC65DF5A87EDCA53165AE030000000000000000000000000000000000000000000000FDCF99E4FF2B9F4D3FC19F728F6F12F0DDBD376A7B835A0D143319462D4B342BA6F47CC2AB60025C4B4E0A27D32E2D93E4CA34E4A12805394BDB7CD50C32BC24F25953A76B550DF8798C55B799B8ADE466523E81AEEB85152AFD1AFA69BFF60ADC2C7021A003B8C1E71A51C7B138E669B94CEE6FAB29BC56E30E587FBBEE102B41D418A89B3F6A3A5724AF944D4CFAC54E4773D512BEE74D0E09DB85F6B7CA093B1360DF9549963B6BD72F349CAA2EDDD914702FBFF8159227AD684B814924110D2F4D0B9573B9C4795ED0D070FD79880223E15C5C54C0FEC750E36B6605140692E31C8456E1ECB62B559DC5F7BE03EE79C02F860A448B7D23205F1B2A443424560FFA120ADB06D1EC14C25CD44465DBCE9152FC8B6AD12ACC2DD1A1934656049FC692DD3E7252571FD217B930DE7C4829178A31030594E5E0E3B676FB4B9D1A62DB054AC699DB131C1E2AF6DFBD98A20F945A88C7F96AA0FE69609BED9E4B294E257280E6661CA1B4C4872287D1E25C7ED283D75D76A6FE0708662EF2334A23CF7EDD262E7CFA11BC7E88B4B6BA340684D5E01C55264B4ADC04D04387AC4C0E09ACDA3C7627A54B44D56672A6C596BB35BCA4C74D7976D681D331E94AF5261A -smlen = 1167 -sm = F60E3EFAF1B484C85102E7A22D4D4465476EBA00B48DE0732B054F489E06FF0A933FF6D1E4D0650045C5DE2E8F4BA15BCC026F8F959B420DF26D4503E78C63FF906EE144CF057FB944D5B4CE7EFF5202F190E39223C17D758D0557D13199A9B8B39FB6066F8761F02E040733B8048BEDB74D01E047772801DBD209E87A130105E10406AC846A9E7DE8022A050097D409E24E280EA6857665FF01FBF9EE03036AF5BB052BA0F9F9E400FA35C7533CBA600156ED7708F98432FBC623424C2A3634780470A01784BECFF01BEA5BA192D02C33675084263C4315420A009579EF80DD15ECCBB812652421872A9577EF7D07896A727A64141BAE7173426DD5A3925159BFA927FF1039E70F729847B48365B4D3551476206AA049BA5AE8F605847AA03965F058FCFD478961EBEED06530ABE900042321059C297DACFE76CC12D52311B2FF8EE1231C77049E232D9FDB751FB27EB7EB6A373B4B1C06BD0FF46B1B208072C873E6F938E689839079E48C6D18F678769F5F28A903467F2FF2A8B02CB19DF675A8FC7560A7D38A918AB8BE083EC4E0EA148517AB90F38394833304F245BFFC47F9ECA771FB80B9C71CCD05FC3B0D66EB06D24B914B63D9F16AD2F2BC454B591D01ECFC527277AE71E3DC683161A53F129743F3428FB82A89DBD5D42F3EED237CD2F8D76DE2E56A2143AC6B2BA811F745CC72132028EECD4412B76FDD87A2E396ADCE72DC69B8FE053042E798B220974587AF96BA419DA6888B13FFE217C9D01434347F4162FD554B760883E8EB1AEE46C4C26B990C6BA10D2D939F513BF0EECADE8B5DEB8DE2BC8C8894ACA51E65AA696E390C11689F1C2CFBB70BC5F72C1872D99BABE8DE8FE2DBB446A8129AF0AB8D9613F0CBF3CFA6EA3CC409F4A97581D5012707756994B6C8D4FE7F64E0F0B85A85D0A5FE23224DFD7ABEBA8E3FB2E97AD87FA8DD477ADF48F64FAF486D0DF11AE9C3BD3A04ABC962C5B02CDA02D48F0B52D84D4920C116C22455DF291A96E6ADFF91E3CD35CB8B5B4E70E3DA8B87CDC969643A32B1F97131C5E0BAE7F6DFBFAC32218EAA596D444574EE85EF7C9998DC1088E5813D50A4377D29506817E4234F68B32AD68E00ADBF6462F8D4E215F15A19DFDE452F0A65360F7C1F20E11C42EEC55565CCB23CE248BD62E9DBE8A7D6639028A92B422AB444C5688B5D191A4BA8956F358D131E2FF6DFC607ACCC5D31AF9678F1A226530078FF9A73D681DEB697670DDC3E9096AB0FEDAB664473DCFFEDF9BE62A5C7C54FA2EB5059E9A1D38413B1A4FE6D531B799453BC7185ABAF78CABCF65F365B00827CEC5F29C4737047E3B2932A78757E9626A958486D1740ECF1EC17A01AAE6ADEC5104EB934F432207CE31D7096ACB3A0FE2F5DD7890C021892FE7D3F34596CF20B6B12FD55911ACB46D7386F99A9E9EE067A45C6A1FBB463E63D69CB582DA6EBD6330F4F80A1FA72F2ED24CE9BBCD967118CFC7E21F6BFB68A905F532BCF8B8BEFA03295D362B41D25CDCCFC9B41767858F651BC56AB2BB4A8675513C5D6F1C943A20A27DD29F941AD141DEBAAD219E056510BC984063FA0F389090D434157438BB1759690C453A2F55F72C033797A4B0C534EA2EA084B3B6F8966AC56B106FCC11EF08902F2ED - -count = 30 -seed = 1787C82DA9F2E6CA9ACF7D6CCA70116A1724902C81EDC1439F332C74807AF2BCCCCDC7AC1788BA798520B2999F39DC3B -mlen = 1023 -msg = E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 -pk = 35F372E13ECE4F496B7647038835DF7B9853C8BECA8364092DF55D412AADF90EE77B24E784255B123F21F4AB2EC1DD382526B651A742BD2AEF8CF889E871F133 -sk = 35F372E13ECE4F496B7647038835DF7B9853C8BECA8364092DF55D412AADF90EE77B24E784255B123F21F4AB2EC1DD382526B651A742BD2AEF8CF889E871F133020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000997E94F6BCEC1DCCAD84804C5A484F248261B74B64064084B4D449D1B6CB238E4736F2C31201B8B85B4514C2B7780300000000000000EC42A46D1B3C065D308C6CC3C71B671FE846EF47BE39FC3E7A2133C86E8C03C71CEDFADBED3E54A827B4A28BB9D0FCFFFFFFFFFFFFFF78962684B8304D447DB655BF40D03A549A248E822E1F0BBBD93A51C8F063FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61829554DB736549AC19D49E21F734766B3DD3E0AD05C5A8B29AA3CF54C4060000000000000000000000000000000000000000000000DB604675174B3298E467B10E68F274DD80118E89B6B684F90BAEC059A8C2CA012B38BFAB9B48D8BBD4A8D4C10E6EBD21ECC778C8D426A7360CBEC3E6AA8F7233C71AFFF30C742CB6DEFE3C666EC544426FC888E326CC47BE880424C99A0FAB0BD0BB87B43FC75CAC8E1E4A4476BB279898FC7DD2A91435154289E9FDC953FD2E97EC609C11C3AD60F49DCBA0217F6BB749CC1281D492B05223D892796418742549C2EC8AACB4872C3F39F8E0CF53A4B8581C4377237A45C3FB1A1F28F9B60C06C5801B2757C84AA93F54C9CA8D9D2C2AF57E34B92B1471A7CDD3BBEBB7835D072530333A191140A40568A79CEA4146F2883F65551E00D8720B5063E8C770C307514124E64BB96D970F80499834B9F97797A40B4C1D3205AAC9ABD6D60E9626027CD57B3944703EC97C89CF7EDBD6A8487E551C4533E351841EF5AAC740485934BBB5097FFCF03290FAF2F178FA02F6D04355B762C9B807056EF4F749BE8AC0107D6C2E032EABB9DDD373D2A60D976E70D77F3C46287E1C7E7BEB82975F082B06FB3CDF989418C071D24E08101CDBF3FAA10DE7A8B1C7C18E5A4D403698238419F64EABDD9A0424941BD9D100B672C954843E9C6CFAC577BB0AAE12AEDAF88815 -smlen = 1200 -sm = D575A64D9382B7BAD6045476D97B10785E9E6E07C6AEB21105205D0E130493980A681FF7E8E93F02B56AD2F732A6313B20033F9EBE78560C43399102B98F1DEB32F83CC0FE047D047D06F580075E30068D35AB7278A153105200DACAB6985053FEC9F800FFFCB9D8D177805EA400DD691CF376A1EF94FD0057E8AB09F818CF2F8F0342AE6463D1E1D9351E070193203AE7844FC9072DCB2F93B152F0EA0A03F69E3D25CA06604846068779B71DB9F72700E42C006F144B0B4E188FEBC82D63D3D37096DEEC9D3DFC3B421635DDDB73C76F6260FF1C53222A50D30B26E2DE3D16E3AA64C78604E1191BBC0E2553117A441159B2A35FC8889499A2EFBDD2F30B8B4C6CEA38EB5B2575926E6F22AB96DDB4B0C5C6D78C3754A1B6DEBA49FFBCFA7477BE9A0F74EC379D1C9AA59247C091611573AF765AE698D78152187B291717A9F03FE767BCBB12F52311215579352E7CEAA8654B5403F18CE82E0A73BFD5FEC1063B506F44EB1C9C5A03697D03DCB2AE15C5095F292B4BCB130B55C19AB728B3232EF77D1594611573CC6BDAA254F05934A329DC27CFA6CD8C02CB51C3C295C964C40502FE2B1A81A51C866F7C7380BFBE339B39C8F51F73722A05B5D1E9CB6313557B3656863803C9DC99BB1905D7F729B2DB8DA23D88200032F36FFD04DA11FFDF6277ACC69C5407289D00FDC3C56B32D54877F4A8DC70ABD37EC532B8617D9F3C535B8E962FB389E976B4D1AA12DE5C1C2FFACD50ACFFF65201104648E0C04CF7C1F880E8BDA1D68404BA67C4BF64C9D2ACEEF81B35FABCE58645E0F2F61EB4CCFEFDE7239BE408710D349987D849D40B3AD294B9D815A91848F9ED53B69F78D9E955F6D1FD7E38EC291664D54C2BC359FBA241BA6ABCBF5FC2502D93760D9F6B1F7FB766040E98BDC23A6047134A35327FE128AE24B4C7D0CDCF1801947A1821DDD7424892DF50E2DD5C1E2E6C5BFB4467524FB45C7D977604E7E0F1F98EB8C03EEE1D9A5796C8A801F082678940F076BF44D3496730C9A640FEFCE385865899FC33B5DD34D036F2FD5D07FDC0A40FB725E84CE403B46DE712B4B44CA8801A1CCF58233C5DA06719769823B5945849DDABCA56B0B4EF9327C8B5E5A445E6853E5B66B8D590759D6B2DB722C22F8C741CF3C6325A76D93F4FDE5872D5732FB19AAADEB7C18094727ED43B305B87AE2DBAAD67F90FEB86498CF65CC57EA635340F27AE5C5CD60AD3C763223AF877E65A005C488AA4AF9309E1AA02002B01DF8865FD481EA254015796985969997A53B06DF0355A6AB3C8219B652B09E1F86A6CA12D27C4BCB9E8D35E6889198C8FED71AD5642F5F9F7CE1DF270D68AA05467EF9ACD9A51347AF1EE9CA7C4A5D78189042900C6D561F68D410A77E79726DC123B196C78829F02CAE7D0623BFE9E7B0D8BF84033086295992B77ACF027489D51BC7FF006A8D4AB8079D494413A565E7F687AF40DD18B86AA4274EDB8845DF114C0146DE3199CB55F773A87FFB126B3A4D00D38835CFD2D6652C07F572F39D0397FCD62ACF6ED9F3E8951348AE7E52A669FA4E2BFCDA548ABB1989A1D74A27B73103770290E6ECAC87029359354EE4C87A77BCB5CEB10162DD54499905AC8ED442C173CACDE068BC546720D1284015ACB90CA19147694B53899395DC663D6683908F3CBA29AD37F15CD3903C4C7F4BD73 - -count = 31 -seed = 9E6E12F025B2A57B0F5A3A9FA70396FC332E1802608E5CA07CC4FBA922F1FE5DEA6721B96F1BA2BFB97825A19F08FF2F -mlen = 1056 -msg = 9C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC -pk = 9F0E16E8E82B12B366309738AD0BD677E42D2FB2719BE2A6C75C74FE2291D222F982311E860010DE69197888CE56445CB69BAFE07BA5C92454811952877C5F24 -sk = 9F0E16E8E82B12B366309738AD0BD677E42D2FB2719BE2A6C75C74FE2291D222F982311E860010DE69197888CE56445CB69BAFE07BA5C92454811952877C5F2402000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069F137DBF6885D811761EA0F570E6DC48FDA762913A54F5DABBBA4EA5EEB09EB27D2075D9153BB13B3B8C1A67C90FEFFFFFFFFFFFFFFAC8FBFED0BDF80B81F5556AC7DBB47E2D525EF3B1FA39D7466E49FA49DBECBA6BAD70A78FD94CBE3B04C1BC592AAF9FFFFFFFFFFFFFF784DA02B0C4CE473F96851735D669180E3EDC92F1ADCF1F18D5B43AC505EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB13B29F33B6B11F64B76E9B1F62E0B7F0FBB977C09A778841A7D7F7645640700000000000000000000000000000000000000000000001F64AF574DA5B6001AF36542B1EFD71A7115EB0AF7CB4273692D92B73307A333E6773A202DE4A8406387520DFF7CEA28F0DE96C60B56B07E9B6CDCB7BDA7EF1C351D78A1CD0440F0A6C2EBBD497DD908063DCE573F95190410441BF44FDDED0FFB7A4A723FC035B7649A0ED621C17E3AAC75AB72647B47552724537BACF4341A201A45E21D1CF558AC288411729636872A3CA8BE39A3B349D1DFD88C8D855E30922A032F8EFDDF6E887D27FBC15D550FEFD56CF44256B798220B140D0641E3056CA9AD8AE6BC3B92BAE4BC8EF152E383C5743252743E17D79695E732D2EC8C21C2537B4967B63601A275849A865A0F9759D37C333E5FD7DFAB3BC8AA93AFD014A32EFCF7652CE8C95994345B2A5EF4B455600F9F8C6E8B1A434FBD9744C9D431E533B8E3D0E76C86D07426FE9DD5B4CBE0672E898422A74889AF7D032F6AAF126E4B840AAA443E16C6D2025CD71BBAB5EF5AA8609F3D8B31B7B342D7127B90052D84CE6A811E253907A9D401C3F2E36FFE25C2C55E107B156F8675B93669CD337F2A1D62C55A61CB050CE9906B99893F6CA2A7A72655D0AC2C979F6BE5D63B05FB2F5C249DEA1A27B45552090D9B00C07D56186C0BA3EE042E10188697D3CE05 -smlen = 1233 -sm = E87E6DCCD858D7C27A00A817A04237D417F3F607B8611A2554F388742C071C4CE239C9E8C12AE403CF124D17A0C5C3616C01141267F563A7E850AD00E63B0AE79F3D86522D004F524EEE2A3C013DB007263883A118FB3EFED901C8A5D934647FC414B403BEDA6AA142830D5F000765E05325C6FBDB1A7106FA58E99F16B337FD8B002683C0E3E3DE9ACCA60101B10053D4D73CE813066C010C989AF5F40E0166091AE8C4569C6A9E0498C028B4EF1948009C311FF20F574CD9B7BCE1DF705AE7DCE6E7A621C935A6E57A59EB31FC443AB1E014AD332FA784583260AA6153C464565C4568108D60CC126F6E8EC3BC9120E5659C86CDA8A31A7131936DE7B3DB39A4692808DC3D2BEE8A99880FF9D1D5EFF1E825A0F043D908D62A99779E013845AC0C21ABE8E4DF0EE901E4C6BEB8BB36B30228B7756D617A8F30C16351D8FF91786F7406F75D9FB648830F88EA4537F42EAD62E8790E9CF11F72C31D718221049C9AA35376AD8FB065F4809F4383A23C2B29425836C2DBCE4680450896EEADEE6B83539ADFDF59AA4FCE709D601640EB9A22DC3B41108A8EE1FCCDE9945EBB1D3F676EC8395255E125E62A32149C73451F597E1C32AD979E5BE914FFC7C548D6AE92ED08501831E9007770A0233E5778F22ADF7F1AAADF9C9A7C82D2F42989BF21627D3EF8BD0377A5BE5C9F5A585A246A73DE4340E6B43B36DB775B34033962646C16F26A2B7179C40A721FEA54805B9EC42177B42160B1A67341235B5AF9F30B2703BFF8CDEEE5BD7CE506B0707A69F84225B6E5A92E80EDFA235803DBE2CEC47CFEF0D9FAC95C3379816A39F4550BDBFB45609C76D0351DDF8D61724BD5E8BE94673B3013EEBE172CACE247D79925B12B5DBA2F6FB72E797B2DA849B79DEE3DB76775F5F1DD4595678671C7B18BB3749FBB0C6A7135D639F16B3864B5A251114DE7E9F8CB02B4CC69902EC8D7D544D98E24A05F8ACCB182E2EB44BDE868B077B1FAC4726E8B01CDD0D024405665F7ADB60A23FDBACF421246354E824CB74DFB35E57902794E459493905400D0A0BAD51D8EB94EFAD55C67CD0C7CEFE7A1B055F06371AEC7F490FA685C611D553D8430992EE7B1855A9CB305B5CE53154345D7DEF6110DDBDB5CB59559EB664C6439E057DC022F8686F2AA0CA81552428437B0CEB5FBB5DF254036BD2BAE7290D947C963046771A39D2656312236569E775E7D2A041B7EECCEC99C1B9D2757C7370E474012AE707AE00AC37B73ED9C8E1A2774E54BACEB42E8B31BEA734463CC15576BD4F7A33430B1987D62E47473391938312F2481838F286C4DFAF701ECBC6EAB1A9F074C1F8D8963457DFAAC9A9A8EEA70C50CE70D1BA1006760AD3887605EC38861DC1A777D21E46EA169537057CDFE256CC08699D73B1AC4FBC62F863353581CAD358B9C573D77585DF6544E5D55048D66A352828CD1ADF5F42310FFAC022A25824430F741371027B2DC14717DC87342A74F0038674187E478D8ECEFFC16474A4AA8BDA0C8D41962EF2A4B64A036C888CCF4EA628E1CB9EE0F9A918FB1B22B9367FEEEE0218C83CC7E27C5CB2AC64DC7E111E3C85CA0E6BD4F685E5DDD428E028D192142CCEE3F0C8337BDF43CE4B62704AA53C703EC334FB56FFDFB81D7D4419535D17E5FCC0E6F558AD82149C591FE0357DA15660F61544B4041128218B6DE2B75D3801510669A3977E2983BCAF957EE2942E504C29890A81542EA208E1CEC - -count = 32 -seed = 569B8B9BDB707B19CD6F9BEB29F304D603C1509B9CF25987C280C342E870B1E13EFC7DD7E41DC85BF4F42D0493B84B0F -mlen = 1089 -msg = 7FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 -pk = 638346019196807A6E27912AEAB1FE30DA44501B020B7082B6035C1A400F223189974A605B85AD00EC7EF230DFCA479A6F0B9792AAC7167CA2803ED098C61E2A -sk = 638346019196807A6E27912AEAB1FE30DA44501B020B7082B6035C1A400F223189974A605B85AD00EC7EF230DFCA479A6F0B9792AAC7167CA2803ED098C61E2A020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E12A448CE46075878B7935115B1F9937B8643572680C412A1D97D94460C855853852B3B085DA0F14DF7963E7BE010100000000000000D827DA011FDAE33AD92F5D1DB4B29BDD5E8A5590DEFFC7902A33D412922D6B91BADD8B6960FE5DB3EACC34602E50FFFFFFFFFFFFFFFF30CF9C10ED024A1A7B695C3D0DDEECF419FAF4C4C993875F0FF970EBD9DDF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F646CD29E59967F0BB30B9952902378A8502A20CC8314C5F7284786690F0300000000000000000000000000000000000000000000004989AAA88BB59AFFB3203248BBC15294FB313E41CF95391E19B8CBCBA900AE0E0121732D9BDB22734BE8A003CB84067C5DCEF55D4D1F0E35D2D077B53A10D124E9BA619DC8532F95848E14A75C6ABBF24532A2966CC9DCFD76D7019B884899342D61279DD212006E5E658AA6C2E35B098A9805C6BD31C6172E3BFE297D87922040D1F0C8F14D591A32F2CF9BA79AE6BD02C08772B03DC0E6501FE0BDFC266E2F6EA658902CD878884EA26A1E98F03227E752542B6CDD6DC5378AE431DC728E01A711831939B4FEEAC38BEA8948DEBF9F1D08A27CD62EE0B73BF8349707126C2C00A0FDCDDEEE897922396E7A6ACFA3118210ADB18D88499CA9A8BA466379853055E907FE7DD3AC6B222294C6535947201460F611F3CFFCF58106548D8A1955349672866177040B323054C120C973A1ECE927027D7B90A5028E62D870257C5A0110AA570046CD0B9544B322D62D24F26A9D5366E23DE575DF5E2C9D2C48419825A70D779986F40C8BC4762C02095E700154627D9D9B4253F0F5A42C12F20BD131DE8992D7E3824B1BA745D782A08318DD7A51898DC49C47FFA4F722F867D1EC28BF28561BF905F0949E9D0ED01E701CB8F64A6887C072F8B4AD195A124384092B -smlen = 1266 -sm = 8ABD8DE41B124F65D20753DF1D7A69159CA123011700F859986025C5FE003A362B46EFFFEDF0ED053D5797C890F10C2BC602441CB3B248BD40C17E05D5A7CDF51C84FFD3E606A487201365E84C115A0687336DD3E3946BEE1C0323F4BCCC35911D539504ECF4B5A2A0A6D29BA805C6A5751538F4907EE10727ABAAF39AAB3A43E9076449CE2D5121A209D50001E3B7E412B830EA09823D73EF0F0F81920602E0878AB1C4B56B864D056A31DB04D7142E017FF38725F35312D75E58845FBC33E112DD95D5C1CF78119CB413AC839377C7051BF5F17ADD1484F5EE12F42B0587AB41DF487BA5E4D8836777B614A9931A5FEFDC4AC451662B342D675C940061C4FF01F747B69CFF585FC5317636E2A830140C0007F73C76FCAB96195C86DB98E5E65C733825DB0325407E5BB059490F2E9133F9B4AA328976256EAAED2FBC59D00288D4830D99731A3AEF36E5BF5239F2899C500F942B80B00C3B33307450FF0C105BEDB7DF84231C5D24C3C3475AE2F46336582DE93AADBFD385C824F21362C19B1C6A75F56B69297FB3084B6164204E2348CB1D7CD3AB494BFA7EC8FE346251C874085F803BD7F4DDE1995F0D3D17033C461D06B49ECCEEE0D5312C3A435AF5BEC9808ACC524599668AACD95ECEA7EF07C4CA3FAB1CF964FDBA987C345046E6507AC3D372BF07D72CAB816BA627C2BD452AB8DC3044A7F0A01D8C0EA47904A5DD66C6B7EF9130D628A4F2CEA5A0D05AEAB7DAF2729C1041FBDB3C2D17BD66AE293C03E77A0837419471C29691EDFB20CF69BC6260975089AA437628F140A44FA2E2967357AC1BF1345E4208C33CFFEDE6CD634B371E7745143FF848F77E5130D1E0F51868585509F9CD3B906EE0A5072CA2E908D6765C74D9B5C35B6BA784A3EA59D808ACBB1C24D6C088CA6C9E17BCEB18337A4DA0C1DAEB5D51EFB35712A475D6C5A2EA51E93FD79F7DEB127F3418F354DF06489E10B42BC1F20651660CAEA17F67F306F48E15DB7E67A1B56578BA7BE6C229FED9567E128D48551E6EEFA17AF5B95A716555571F44FBC41AB29208DB7C1846E130866D5C9BE6F73E601C55610DFD0F67D98933D252059DAA1DEC20AE0E5BED6568A6322322D8A40E6835FA66E317733E1B465434532EEA8FA76886B600E06EFC1DA41F8DCEC0A5E8BA8419F0B7879CC0A93BD14D99608B5BEA931D8971DA8D2D89053E1DE40209E257E741BEF48C17FA15467F1312A368D4A061BFC76C2B7BBD900B4A34DA51B7CB5BD6E2FB08806A53C0D60273167D822FB6982785F2C3B0EC7D893B615724D0193928D0EA8EA2A1DEC5ABDCAA904C754CB7747449E87221B3D86BD5DF26E11DA753E768A8B481C306E485EC91074377DFC68BE74A444906E420C2D8BCCD84BE13AA5CCD11115B669C89E9C0CE374BC4059C696E5F8344FEE467AC8C8ADE37DAF614992914C763D971327B60946943847FB6B82672CC376B780953B6F4433DF69AC61E110FBF1A35F6272561193D8652EBCE3291333FDD4D84B9CFBC60A57E1F8B817E84EA15D440D4A4B4F7E19C08DDFC5949FE8CBDDCD0296A62F12F53D48B1288B80E24C756FC38E2FAE9C7A3315D1C6DA42AE838AFBBF5569F633A68289EB7073BABCB210F4E08856FA65057BFABC70AD3B58C2C870DFB5E1B0D11B6FA6D5BBB68285D8F9C21BD89669781C9F4DC32EB1EF58B80B1D371334D36FA66A2B3DD4B3E4DEDBA7AA9FB7E0245F5FDBB66CDA653C5232A131EC1F0C21DB1C47B990A64A24DC8C4DA951F419F57C03FF506E0147C22E99461 - -count = 33 -seed = F32C3715B0BA8C1D0BD59F0645E9697DFCF9AEAF761A71ECDF9672215B9F138C0502D7214F6B1BB4D6612432F9FBED5E -mlen = 1122 -msg = 789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F -pk = 16A8584AA07FBDEDFA504F2FC00F9BE99A8A162BAB6262607CB12D26599C4311EAF61D8E45885119ABB449A1FB956C5C89EB3185CAC45C029067222CA4691F28 -sk = 16A8584AA07FBDEDFA504F2FC00F9BE99A8A162BAB6262607CB12D26599C4311EAF61D8E45885119ABB449A1FB956C5C89EB3185CAC45C029067222CA4691F280200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C5EB0ABC712628931341A139CDF3E3415D377B369ABA6FFBCB047D314667EB77FE42C674ECE56F510F38B091FE10100000000000000E7CCF0D1D7D17FBD73BF1CCA82891A6FE716FF5C98930C4C63827A5481EEAB29F9408BEAB6B5ABAB06AB23A42A66FBFFFFFFFFFFFFFF1F531BFF128B8080B8C45217FABE705A0013AE1A699B82D90C035D50617DFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF784E52A8EBD8CD8CF0455F109CA50B531E322D4939420EC9A8E4692501200A00000000000000000000000000000000000000000000001CD82507690FD0CBA435D9C83A35BE352A530565C82889F899C5176ADA0608080462311193871DFC5BB10A15BC0265F5C2A3BD32242887F0305E360C05F71527122928908FDC7E55F63B36B48AA98EB7CF922DC68FD5B6E87FD65A1DC974A00725957BFA6EFD88955EAD10CE0AF8E2205E97D048C107DE2D9E7170D0EA00A42202C96E1A0A709F55060C16E0CFB42B4E651738A9736C3A3AF47CB9348263DF10FB8D95A17530E185F750610AAE0E94251E71AF3E9332D9BD661E1E579A150D2F71EDC99F4C7B4FC73A8267CDE225EDB9F138E6119ECB56FFE17103D11E441A331B1A5BE624AC84DFA6D4BB96EC488DA5E31C1D0B4793F353C17268829D57B32E95655A56257A9E03608E5BB5F7709F328A8C67E933FC8477ABE777FD0F9DBB00B4C085929D4C19F32C6A61FD9296CE1C5C5839B878BAFBA4C6397366DED97F1226C84DBE961DE9EA8F14E381B9C208E249AEF01AF52DBC1D44C209511EA18C21A03C7440964E8EDEAB0D454EAF545BDBE202A2B8633982F40657E705BB2C7800DBB58F38C02B414579218EF851AE6F7B45B9079D27E7EDD11D03FD813760BC1CAE351632789618DAA0D0CD4EA46D0ED350612B656ADBA5C10104998E74840906 -smlen = 1299 -sm = 6FEAABD67AAC94F51F022A199C02E92152652F039D3A76773A5D57621C00A2BB745D671564481F02EF324398192E39DFEF05BFFD015B2221651BEE047BAC6568BC2C46508007D8132A84766E7AE38305923027A294423C6305009512920A47CFAD2AEA0740F0E0DE58067DBEA6011F13AE86D5CCF8B1D8016CEE08687E49C32EE801889FCD6E3C1B6938A7030101A8A592E993AB10C5BAD64BDD036C0F09032799800402928FEFE606503DDBF3673CC201789518EE21DC99CAC94DD5298B2F3EB8F6AB8D0705D24D9AA3012F217464E7F203E08E5CEA9E44F54A6F73E88D81592826E243B7F0B2A1B3A06E5AFDE23A2985183A0E430E01C3FA90E9F1DB7E69DD8E7DC6FB802933E04A18834C091ECD46F0DD423F532668CEE8A12A06BBC7E5FF3B9488B8F4A87A92BB8D6F313269AD95C574245E06563BB58BFF6169B8F4C333033BC128B91CB81DD41B831DF5103B295F744EDE95FC3A0C72F1134A9321836AFCFD563192C343040B943F69C0E98E8D740C06CCF840CBFC6BF777C9561065916F13D116D758A151E8FF4C355363AAE8E4F49D2A2E062A2BB213AFF25662D95549B4B025E70AA3363B50D25AF84A3E5B0FFA598CE074733AD191C86C351592299C26C0A4933573EF436B73DFD0C4EACF93D361AFE5F824B91BC178EE8381B9EFD52302AB8CAD6C08C7E090393B9B8ABC78AF374FAC6E60BD104BAABA524E68D75A759B94176105A9CFF2E5B9C3984FF61C5AFBF22B8E1B9E4F9BDFFEC0B19C2A5C8DB3B8B2C02115D101805C1BD6652F738F02600E38998CA41BA8955094FAD5BDC34133D4B523EDE66CF483F1CD5ACD9EFAA69703807410939974D6DC033BC696541357DA9881A4FD1385671B6E4BB889C68B544175C1E2EC1395DFF4CC87E037087C615CAF40804D5F44A2DE301961A59818173730A45CF4C2DF172614AFF7199A40C9FFB9957242A89FF86B36A4F4D60F15DB569C2FEFAF677B35FE5F12AD5A323397714286E338FF6B9080FCA50B657DB477A52A93B243BF28CE2743794C361F443AD81EBAAEAB2B237EBBC572D8586C3EAB1F42BAEC1C985D28BC58B296A11D96A04B0E1F7F6790B92E450248804F3F62B5865941BFD444A910F31E1D6B79D8906E7E9828618F960EC14124FBEED28E1F58A8BC9D31773442FEDC5A220F3912D0B41267D427C0C15BB76F9200C54B5F050307E13F1EB3DE92B864C994A3DF4CEBD1BCA634710FA342E23D7C8A5BAC1B58AA321E215E4418428206F05232E2BCD1B5EE1BB7E34E7D4C93088991EE9DD643FD08B0185A2F0AEFFB0EF0EEA3ACB4CE234BD5479A4F4296001305826F23083CC9DC99011864F250E77E42A0DE26AB09FF6E3F32552F6F913256729B357CBF5DFC825E91BB5D3FAC1F729803D431D339955960EAD69B1E54536CFD774341CDFDE1D1F527DA4E738B2E292BDC884687D1016DC193EDF34A37D284D026D33698295E864196E0BF16FA83A35F65FF2B38B7030E9E63EAAF594F272E07941313D538546BC84671739AF822391CA4DBE6A579A81F45FF51FA5B7EF49BEEE7BEBA4AE07452C13366668F02752923EA3653043B26C883799FE6352F95144283D946CA87143B74C8A009C024D073BAAB9BC4DA6C87D35FFFD753E1EEC7F01944639E566FE17A6F715F4197D1CBA58D3D153BDA37D7D2D5E19620FF0842527D109333FA2BA8BFC491689F4551BEE6C9D13BB9E69EE4F44B782BB05D1E48D293BC15B9FC706D52B021C7159FF7DF80E55627DD7555795F1FC616830A4BA2C02FE1A19DABE088E460BF3C5A88313C443179C593458467FAA468791CA74E9B1E759847B6939F - -count = 34 -seed = B0C7530A52AC9F561C2C14548D3A5F5053396B738EA1C7A5190F5AB01C9C38719C4DBE856E42D37A114FA24FD5DF5081 -mlen = 1155 -msg = A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B -pk = 8B53B0DC5ABBCA917C618E8C32B2EFCD604D29BE8124BE90C49601D389CEAA1DDBE280155167EAAF89A93385BABC4DCB58C524E8A4113E108CABAA696819E11D -sk = 8B53B0DC5ABBCA917C618E8C32B2EFCD604D29BE8124BE90C49601D389CEAA1DDBE280155167EAAF89A93385BABC4DCB58C524E8A4113E108CABAA696819E11D020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CF34E3B26765CAD7019AF031328604DB15D3D8E37552B6DA6AA8A23BE2BC17FDA96F332678FF24D75C813B32B0D805000000000000002CFDC2AF1B5F5177B6FD0C4342660117C52E4DB43EC374E578E08D65010F793B14216A51489C6C3BBBF0D153AA1FFFFFFFFFFFFFFFFFB8407A2F6165640B39C6E1596C37FFFC3B8503E1F8A33C802C6988DCE429F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7B0605C11FD99ED7C33AEC7990072B9DB78AFF677DC56F779143386ACFC0200000000000000000000000000000000000000000000006A952DC30F03738331E99D631B98CAEA8949F7CEFB439623EADDC9118E4B56047A5497137CAA3EF283256E73AC311216C34F5E155B47765CEEF6F8E5AD829F1EDDA000095A24242AD602027B476E6ED58EC99BDEB33A8C86855DE9AFB0F542230ADF8127B532B4273E71C9943762646444A4934ACE6F0290C009F23264627F00FFBB12EB40C22E171EF375FE9198F84C66F607F8ECF7DE52FB70C107B4A0BF1788791298988EAE6604ED889388379F522F52E346E2C6D8807652614B27E5D52681083F484518C3A83F491569A454A9BB31D570966566F213B8EFB5420831CE2C2BABEDA5E4BE452DE16EE3D11E7A427C267C3CA23039BC8B9A37F2AA2BB1EF0B7969AF00E041FA069C4D0EEC3CC315D1296976C960A1FAF927901E7F23A541158025995DFFFC74CDB8B18ECE22D6D17CD38010875EACE17883F69C1718C88E1769577EF38FFEC633A25DAD9F7662130D71F0578DDCF33D7BD2651C39792D681534E20D448F095C6F1BD2F6A8BD54D7824D8568DC7B821905BC17B74E3F6E5F08F1D5EB73A3236F74ADEAB9503DEC07DA1CE1A5B86CFAA2CE8121E436B2E7B60D7302F4B7546443F6C6270168A84D80CB02EEC99DCF6312B35D327E85685E641C -smlen = 1332 -sm = E1207BA34BFC0CCC5F07CE1FE9D404D2FE045F023B555C2490C023262005D724D726EA29F222FA052BE8B242AD032E264D079A9C9DDA6E643C1502076B886F91392DFBA4A0062CD310F881292308EF06E58CEE1D517E5DD9000339D54B63022643DC3103763BC1A4A8F50812E304B011E73A4A77B616A80382A11A31D97C74028D06347383408FA7D7BA8807019534EAD88BE7D62CDD43EF7AF14AC4B20F0312E028B9CD04E073BF016F6F098E46805E01A4117808D9D05B702483924E99623E778E7A3B7623739AB7AC488ED93E711EBDDEC383BFB7E06086FD0C374F4668AB744AD99B8AF1C75309B60F55DC03FF7BE6F23187FFD5CB224068568CE2D06ABE441557B04A5A0C2858C416F6F7AA89A96ADFC2AFC54E0F31416CEED005B7B140B342652DAC7BF401FED4D94D475784936FCEB4B4F334BB14BA55B1EA9A36E2B0591287EAF4ACED997162691A96E7F59853E609ECA9A225F615A49A12763D80B5DFE6F8638923C39BD652936B19B944D5116F790E866A61947EB60CD1F3A1F319710D0F40E487EFBEF51FB4D00F5DBB94810128215F72B1AEDD74A1B1D237088DE3098417714EEB67D6A3E6BB647B6B0AC6D0BA3089D4CF6252B69C414E2BD6614429B6FCEABEBA50A4B53C7394652ACF7DD9403AE14436ED5FD4D1C9E238A8399A763806FEF5C3742C55B7159EBF5A13B271428F91229C191D617808A26AF9190F9D445BFD3B273702BC3E7F610854C8E86066BE7757960A880CB6727CEF19DC7B464C464A7DAC9AE85B799747B8488A4123B6BC7F0F7C2A8E53FD4F8687075B4E25660F5107ACF22CA688057DAE0496FF15A3EB9379A9F6E22FA43C932F137E389478C05DB86060686AFEAFBCB9ED79AE194C4146A48CE5E07EAF585279313851CB864A50075AE46C1AAB3B3CB920DEE2652F5AFA0138051C7C980946E8D5E18C16789CD184DC5598F65875EF43418DD56E11DEFB5A4A6AFBCE041BB292E0E2EC563296BA4EA6CBFDCCA32A18C8AA395515A83D0FB7819413E5AE056FF0EC2F63F1D52A8BE0B334A628D00995BEC7E46A34BCD2DCA0E9C5A88E0FC8C43843D6AE074C699276293FD8DB2BE48885155688428C2F5A6C6C91BD4A03CDE2126205F9EBAFE319D1B4F80277FE99211A09628AD840046EB9AA568EC71252CE9F69827B677D9C0D99546DF5A48A8D253AC0036DDAF4D045A70F94EC54BF5F06296B2C2617F2B0EC0B8374DD28DE269FAF739B1E55AE1846F548FB6C0403C5ECEE3CF9D1927E317F0D07E11AEBA01C240FE17C6660F7CB32305AF1EB6DE4312FDEA6990DA4E9135DBC0B88AD0AE0847E1576F3C2711B785B846C7A4B823688E4218596CAED583A90DC46BB9B27E00E4C1110B65F77E602F043A8441563667691C07162E52A53CD76E2D74DCAAA2983BF2E8F02CC30B05BD4F9AC731931C59F9EBC038FAFB09FBC886F4C4191352206BB49ADAEF9D74BD08A5B780FF0FA301343F5EA81D36912ECCB0FF24BBF0BE6A8283EBDECA79CFB22639DA38C9C639C4BD66FE5A75F0414FCC1455702856E6FC58344BF02998E17E967183AE920B7E04F58AA09145D6DA79B65EFCD18EC55BB9CFD53914F80D73C2B08BB754AC63E4C82D44B72376A544D97394B7C99678758B15CB94E71F9FCCF674B29ED5AFDCE452959BE5AF510D57F9E5395A576EAA1FA7BA9AA4122A779727071FA485C005B447760410DEE20B7C2299B4A0D5D9E5E4E038A19C87806C3FB875EA5BD7F47D034D7D5FEC4BF132B04E47574172D392EA7B371516190AB81C67B45FEF6332848A51B6C7DBA90C410A44E9A88AC082FE296A7435E7D2DDFC645D5AEBBC29620525757DAD1B0222159D658C7225D02374EE6AF479FCF1AA28CD91B - -count = 35 -seed = B2FD7BFAAFB667C9DABE5915C3BC271EF41F18588666A6F4990C09D098E62DB590110DF6A56F08C5E0DE65B00F91D60F -mlen = 1188 -msg = E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED -pk = 54AA740AFC26815E681D45343D0FA48EED3AAAF7D19DF7F9F880DF7844EA4018841A41B46032DA09FCFC38A615DE4129EC6261082EC6949F6779DAA385654D29 -sk = 54AA740AFC26815E681D45343D0FA48EED3AAAF7D19DF7F9F880DF7844EA4018841A41B46032DA09FCFC38A615DE4129EC6261082EC6949F6779DAA385654D29020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DAA4C93EF60A909CD74076084606CE5B50DF911D5E1A9AC27F9BD2CBDC69B5728D3C5C6CA41C6DB223CE1F01C0E70400000000000000C73B6859D53852C772F7E29FC1CA943A3DC37198E9FA33DAE13C6C4A3A70F0E97B2806B7484E5959F5B6B03AE7CAFAFFFFFFFFFFFFFF67E0C0DE8FAB3964B5FF4F0D55D568B260841A12F446B8B52B1DB3E38D8E02000000000000000000000000000000000000000000000056A27DB1CF94DD8C8F0610DA0D7E5C053AA5985166D86760274901B141750600000000000000000000000000000000000000000000008DD29F22F0C07E6AD6417CC5BF5D0E3DDC970B59EBE80815E726492485225B2D6E41C4112D7E621284DFA6BB476B5A84736D74785F62612AD54F0F948E7AEE09FCC693C21A662673056771207F35B11E077B534FF696D28E2320CE256E3275289B76D82E38447119891624BE496E683AEFD53BBE49F93B456D64CA99063D5A306260A696A74D69F7259F8FF0399BC257648269E233A53E34C91DF52B9D1B092B00FD1D8B9D54084317C12904A11B72B8012F5E8AA3287E099183AE6E92B55C06FE62F407B6F1883581A019B9120212761769535FD944BDE7D21BF411A64BB20EC4B5FFB6D474A44D51F8EAE3254823D05C8135F058248053DF962EB631E1D11C98D9F9BA914FAE5AA4E3EA7E6EC53F66A23AE264C421580B2F4A91C46A1F9C1E9E963A3A74E2EA4C77F017A2F98D0B73CCAD25B5371C8772A2CBC3092FE50C10C5211ADBAA29CCDD9EEA8D3BFDB52097D492D4FAB918366AED61F5C810787A0FA042D643805305C7BC40157D8B4FC869DE29839FBF37BC0A146034A8E5ADAD2EB79261F4DBE844CBFCBAD80815FD1C9267288EFBBA13C37BCBF62205C78FC8085585F5C03831DED1E1A3E02593D8655EF45F7590837220EA15C84E901FE7F132 -smlen = 1365 -sm = 88DA789F2A7387E95E05F84B983499DD07793F031FF25F1D9779D9B14302BD8E15AE46232D8087007B7ECBA16793AEFAF704808F1AAFB51D0D828E017EFC0FF6AB7EFDA94007A3B7AC2259DA0A22AE06BBF32A7C54ABB0DE3D016A72D6D028699575C1032BA1415D6D74D494780313CDC071C7DA17503100E0A0D461FC5877FCAE06D1803C625CE0A351D4070029B0FB08C5A15A90063A57E51D3032EA0A03A54ABFAC47A5A730870290EE10F75FD2BA01E82F5ACC7C1A326D430475357629D568EA3D0DBE131114781D5BF8DAA32FDE9F3CECD288ACD14445678C5EA6D3AFAFCE48EA3957A6AF8D8F23F78D84130FB6419F706EADD430CC85AFF48283F15602265059ABB075E011E3941834EBE70787CDD55F1E604C6B86F761D94C4F5E525791333DF6D43869D6F36B212A8F35583D38A21D0947CBE26FBE6A36E189C73137F2F2D89F48566D04D2DD9125D2EA4E0B2A7E5C1E9D2EA036CFADCF7BB28F6DF3B7D6395230C9D39D1E7558EA25340252708BE23EC6C0C9A0946C5C5AF0FE037C254D1A5B2B70B8F916CF37945BEF76BDFDFB19A0DAAC5A83A6357E986B3155CFF31024121634C3700CA99E5ECEF1F2E411C6621FED6092C1AB59860271AC7F431E568075D59F71AA18096195F30BBEB1A6BAC20E034F83C72BE0536315879F1D1B7F31D38C12DD8E97819B4803D02BECD436B61D1296CEB78EBF857E34087EC8AE8395269B5B0770B3423B39638910D2A3DDFEC8502389FD8B5B09FFD10CAAD1A5C86E7E39629AB09A4ABCDD00FBB9821F92E7DD24DDA83D1D9762F52A89BED6C20648EA04FBAD4233E5920AE83FFEC28FDB5E432929A41DB782B2CEA8FEB40CAD0B27903050B650477E5D9443A536ECDFDAC673952810596F1985427359D9E4797CABCCD2FA0C0A2394D853B4E6F8E150B3E3AB5136CF476605FF5FFA9067C0FE58A143B50B18B09256657CF091132D449A6E7EE79AA870E9DBE46BF840EDCB983F585EC2856C059808E72B8C901A25D6AFD5372F168D533052A6D26418E035D87D0BF818ADEA19915047C8D824A425A8C7915756673E0F5FCCB1B4FE7C1FDFCE505F7E18F023FDD32A605906EC48E0FA755B6D87E47711E158D672C5FB4CD3B8D1D13FE9EECE58453987CFCDD87B621B870F3AA27E73B6FB7FC0A6757893B978C63B7723C49D1005A1E5B1A4D60C4A2FEF392DF7EF97F149B499164455633FA485BDF92F804A47C8703D124522D73887A2B032F10F45343993FFB009D69E80FB54B6999A5BDB2760F8BCCA648F3C52BFA1D887AE49862DB4CBCCC7213ACBFDC48A57C3DA1F1EBBEA828182432AA1C593C3E5591C825E5706A5F9503311E91EC3D8F4A9554C3DF915B5FBE0516A7A5597ECF8862A8DF286ADA96C90C9F2783F7F947A18EBBC64C1BAF24B29F77521A9EBE09BECFFDB902EFCD024046FD3E6182BF0C84BD3A0A5410EEDBABFC60114E5DB28B0943D79F58F766E2EDB16759850D4CC3A9A57AE073CF6F3B24D36A4365E2BC64674259170B6D11DFF63D0DEED085B6321C45F218E09351AA0D4155189CC98DE5627A03396A067AB3FEA2C133062E3823FB1CAFA5D592070C8E82ABE812979DBDCB6D2E595F33830AD0E8E2F9E6CDC4D9C74B8026EAD1815DE36772769C4E00806F79950A40C979C14A4BDBFDB79DF1DE01FDFCAAEBC93DDBAD62BA166843A121D2B144559064E9DE9E310DFC93D624C1061BAD3195D6C9F46DB64C65A31E90371F9B644E2A15E01C262395269A9AE83F50776F852903F86E5518BD008CF1B35E78F910D48C0B7BBAAAD5DFF2375C55D56B8F65B922229D5F494EDCCD2D676361619FEDFE6BF0BFD7E4C77FC459F181120C4430C409BA89D2E5A8C36CC6200497611D9D705DA6AE1ACA4E16B389D632A982E017E1DAD95DFFBC7A7D7191E7B8FA1C0ED - -count = 36 -seed = C08E846A8E039C8655651919A8433D475F494899FB617DC3B4715DEF0C992C195CE38158B7FF40E0684B30FD7E623265 -mlen = 1221 -msg = 743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 -pk = 3CEC01E8079754024D5DF0EE948930ED1F9CEECC82BC8CC9DB984B7FA340671749BF0335DB325A006A67D276DC79818EE2C90CABFB58A31ADAB54AF049B1FA17 -sk = 3CEC01E8079754024D5DF0EE948930ED1F9CEECC82BC8CC9DB984B7FA340671749BF0335DB325A006A67D276DC79818EE2C90CABFB58A31ADAB54AF049B1FA17020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B5D61283BA31772B1376F21AF4BE7B5405ACED42DCCEBDA8825DEE26C7DDC9E27CEDC297C607263E87E7732AAC61020000000000000066FD58C6BAD6CEBED977CDE360B5A2059CCF381C7D3260CCD9FBC0A16A7084E87770D869BC6A56124F8D19CBDA74FEFFFFFFFFFFFFFFA6E5207CBE723D777AB221A492F8678AA5EDAB3E2010C103165F1B1D2C5CF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF353B77C62E8B3FA2B63DE831782C663FED67077EC2B83E0E9C87AD106394050000000000000000000000000000000000000000000000DDCD004E419EAD9B410D0ABBA3CB8203BA5C9546FE9CBCEB612200BA2FEECF28FEA574A597E70F2F5C67B4C8CA0CE2901557D77CEAF063B26657E4B95E5D4C1B766FF27E8DC738605637B26132A60CBF7E27ECE990E676C46F7678EE89468A01D4BCA4CDA58C289C6A0EB88DFAB69F06FDF43C5BCE69A3CCF63BA85073D5852CA335EAD6F09711B69C1DD072D2F6DB607BE7B5F4418ABBD35B4B0954BD3A800EC2E7E0AE6383B31C90A71DDDA120CF9F5D92E299868D68B53B1F2FA1603C3A241D56CA524626BB9A89103827B2E0AD0C40AB57009EF9D6771591CC622F015F0B6C5FC749B1723572A0FD2030AAB61BDC7677828610985CF754A5715D81BE49010231C0C7640B0A898AA4D05C99659AB5220086A7B24A18A2359E1AE83821C026A12BE0C7A704604F39600F342D588D0E3AAB0E77721324ACB92BC1DFC46E29300134AD93511C0B797A92DDECA95D2A03C939073E5FBA01ACB62B425E4914912C93C827FAD7A4A999B0542297BCF62E266908E5BEA6C1EA9FD33173BB95A013168F9C0DA9DEC0A45CD92D7247DAAA940C0FC8E5B8811D47933B627865F34E700EC91B9AE26E1658DA5DC3F8C21BEE127107E6A6050F9D1A1154C0171305DCFD17 -smlen = 1398 -sm = F6EE252B413EE990BC07D4AFB440913BC5AAD200ACC066807E2B1ACC6601D3337B2A0460593C9F0408747C364A65A0135A05C4AFCD3D2EA0B5324B000E1220625BFB10A3840431363FF000FA8F49CD0588B44863F99F754C92029AAE52D02E44680856075CD8BA2911CD671384049ADEB94A5360CA7BFB058E5CBABAF8A3225801056572CB96A0F0A41F720401FD6705B52DEACD3564ECB269F42A09ED0401D409C8B5F114E2DD2702DF83E3637E879400743E5D96B9B4C1469E7AD2B3703F711FAF60CA335358FF3EFC8FCFF02CD020A443243B4169F9123351B6C36762B85BE5E5EDDF8D4B43D82CAA615788406A31CDF4F7087D42DB21AE48A069AA23A8F6D20A1C0762F973E526F011DEC737E986CC324724BC5336D0362525757410E21046A12AC54F2237E68DA036A5C1389E46A53ED8C21774906948D4C9E14F40519C54DBD02B7A4ACAABD24FFD7F6CA4D6D582EF48940296D2893415E811FE7EF0801B35F1C594E6FEA2C293869BBD45618B6F04FC26B55D55A0AE99445AEA12F851B7E58A49CC6A0044F28E3EB838CFA6BAC5DF53B0DB78BE2CA2BEA1BF2DEFFEBD673A783C91A6C9EE710B12042EC2863A9B52EADA5B0D32101BBA8338F7C75CDAE7B7FD6797B25F96ABD53A24A7647A1C91610306FFC72A8DA4D46B1778146A98BD59CEA3173D41D5A53F9A7F9E282B5FDA1AFB062D8AFB63CB19B0E76DF782FEB9F7FD50902133529CFDD7C51AF297895EF6E1871AFD4C3DE93DEFA8FCF1FE67BD27B7EEB0CF37A6A8E09AF1203922BD9B62672D4756519CD09DD9271ECD0285F92030A9FC81C09BF2FAE86F5F50596C628E0BE673571CBC2FD76C563E113004529B234FB50E9E3D6D1F814CB8E5B5CC3EA365D0BC7602B146CC0361397D9BEE9246FBA3A724C462E177D27836093EC009741ABFA28379AEBCF5EF09BBCE00CE449FEC3A3302FB9AD0F010CA338363539DA545F159FBCD3D6A0482454023587A324F5132FB6F4CA602FAB2CF6CD59104427264CC9EDE8D10CD9DD7FA6133E65693DBF744443AE920994226E21D98634BC7F0710DBC37C18203EFA5ADB467B523322E21E4E686B6B85B00CB501ED84153BAECD4D6CAC9D1183E38B510F7B1DBBE5995BCB717529B83FBBE969DFD8DE21183762FCDED692B16502834FE8E7A7C46F84ACDCD2C9975098CF0CDE8AC0EFAFA449DC26840180DCD9353A2F1B06962677C808B07345E8ABE95B8D24F21D751A4EDCFA0E02FF077DE64E6B992E8C8822682DCC7F03CA7582FE7C74E0A9822A02D888FDDE1FC9E73C2EDEDDF32001E918771E5F511EF8F88AC19B76FAC0C812F56938F814D712D99269D7802E47634E541B54E00F9EAF78A421506A88B4BF7332DFC7D79E8C41835031FB449507D19D5A8A512A5C527C95B6F21EE3E41FA43591DD9BD2E4293701BDAFB624E0EA290DA4B7A173003867C4CC3FD814E117B4EEE283C58F5FB33D653E410F68C8962155B8C4FBC13BB750A0343737D1FAB36EBC618A6A7C8E6F93855CB24937B01C438FA713D334DF335D0745582F680627D8B94CBC25F0D12E3B1C27A3ED72E2558B800C19DC6B719B961E0FEE43BFC34E999027CA1969ABA4C45FDAB9AF01B955E948DE951F5A1088BEDA43AC930FE99D8CBB3473475C444F43E928E1A44966265B38FADF9B1183700A95A81F85EA43E5C61DD9B2D67701C95583E8E3F15083717E1722D764B6E624505347C30E5E70163ED9A046C504FF534956E911294D2B9097BBEEF8740377EF0D6C4CC8086422902BF63556CE6DA8E33E68FCFB42707C00693A995D17680B76293194DB217EB5A928303DCF1814E4A881B057BAF2553AC4FAAC8E4BF23FD4074154CD4AE189FF7E204EEDB8EDD594CDC21B5B7D73A712B511D068F4D217C0F91F9D84C524D973D67AA741EB13FE922AFABF79CD2396181143783030FD2D0CFEFC877934D8037A4C32AE8E15B50A6FA4269 - -count = 37 -seed = 1D9C060EA0408A068BD982D9694D39D02BA5A473378F6F9F09349F686566F331E767263FAFF5DC0E823BB6F648843876 -mlen = 1254 -msg = 3382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 -pk = 96F96A9524E070B71CA37BC00B63AF4E47B7B4A2A2D273B62508C30E4C226327BB5BB065BA13BED9EB58B4C2B9E1BDD7A468F580B0742F256B8682F48179EA16 -sk = 96F96A9524E070B71CA37BC00B63AF4E47B7B4A2A2D273B62508C30E4C226327BB5BB065BA13BED9EB58B4C2B9E1BDD7A468F580B0742F256B8682F48179EA160200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C077E081CB36D7034411B86968042D8F1C4936EA31728E2B9B1AF8834A724C2F8EE885AD172FB8AF00AD9E9C68B0100000000000000C34876E10C0E3572168E24517BF963629220AFE059C472DB68F98465066CF2260ABA4DC4D789215DC8FAD6B01122FEFFFFFFFFFFFFFFDB0D05B1DB8D0C4A1BE91FA5A4DEE39B4994FFF3881B5CF03393B6393B3601000000000000000000000000000000000000000000000018F16A0C4CC5A9FEF2DEB49EC1F02DE18D06EB6865169EF68E6A1579EF2A1000000000000000000000000000000000000000000000002B23DA37D00CE33A072F45BD0703D77243177CBDB67DDC61D2FAF54B9AA43C0E6F875250B99E2AA9B55868F7E82AEB16CC9F6D782B60B9EC2B32982B32E4EE1A73D36ED5C1804D915A458FCE9A600A7FF2A24DF291F843CB19B06174661D57254BF57A3D99162EA7E0D0E26BA786FE2B07D51AEF011F3FDF1071129B189EA025DA4D1244990F362AFA792DDE5502995EE747E29D3A927F9516CECB6E4D574A0DDC3DDDCE9798CA83A232AC89E44D586EABCEF6FC5A874F76F86F21A083AC7D139E2600FEF2586757DDCD464193E9783CE196CB5A86A7B02DF7829DF44619F529A2AF840136E3ABE1CBCE62722348C020DAD782C927151E85C077505EDEE6AF2610AE07C65ECF1D6E83C0614DA4702E7586C57B5CAC91D986A5CE83CC4504B112202E7598D3C54922CBFA3863955C912AD0FDE0FCA9D583ED7CDAD90BA105890002FFC0AF1C6AA4D3C20F7B72CCBAC0BD5B344C05B69C2A08EE4A03053F3F97094FFDDD31FE312C5513F81E00C4D4F3695AF1791421A93EC515209753BEDF6A2C3773C69F20C748C551AE120B81607CE0E0520167813B43BC504A3F08A86B7332F033E9AED3D69C434FEFB4820B4DA980305A14F66BE53986F5E2E593413DC224 -smlen = 1431 -sm = CCFA66F4B26DC6B89C00D5D6A4F2EB4F4D921B0166615852BF3F1A68E807347EBA9EC551FFEA5A0120A7739E668C1D330B00819A9DBF2AD4D9BC6D01194F0F44CC76240FEF00A196936012F1BDD7D406CD2C11E174E038026B014AA597C21B7ADE35D7001AA7B87E64BB776E67045EC90610599639391802E00962BC98BDCE3CB20748B32C8FD6A0E24F3902007990E7F917E6E6AB586A78520E5CA35A0E03EBDE253C3DEEB25FA9035FA07786E844A7003382E87BA70EA986A044B0CBA2EAFC3316C1AC95A5F16F6368C210DBEADFAE6CF2382DDF5078AD594CDE3BD1A837C517B1A20A2099D938DF6AA02B6C0E62FE6147C904BCF3EDE51DDDA60DE7887DFEB2866DB402D23E5934A74C9CE4852D4B2F53CC9BCDDA312964A548F6F7C8320AF1D1BDBA7FD32EC6C86BC3FCB4205ED3DB092FDCAD9AC4D2B8575883E13F69D8C16CB18D1B9284B31823ECE917C905C5C8B9D180C1BD87975871014F773FB57D402B8FE16EE312692665824CF0BCE4509326A31957319364CD421E9B21BBC1DFF663ED850858A2450C2FFE64B65E009A3999CE4504BA5313BA0EE4A8843349C30FA6E59FD3ACECA130A37C04F9B64722608768973996112684B64D0C87BF95E5DD60661935831A6A1A9575EBCB2F64A15296BE788C775D80523D6BB4267D91B0C71BA5F90DDF1933DE898E79FC7E39D0A3D146F185214468DA50AEB47402AB542E52CEB768A70CB1F749E4164CF20E549B674CE965FFBB98D874D34B5B7851E575E6C1E4DE9C170A10DAB84940AF055A951260B0119F5ACBA320B55CDCE4F16346905A2073CD9FEFBA95734E4F4DFDB7A33F292D45698831F1D3E9FBF56D9692C14A8F9887265CBB4441AB331D977E3A68A1BC9F406AE0FB1C6E91205670641B9868E2A987BACEEE2364FDB089A63B53976D600BD7A8AE88A02872E46927269D281CEFA385C98CCDFA6609394943FAC32237368C6203AAFABDE072054AB5A14A91391D5A943F4ED4A4407F275CCFD15FD28F1AE0EB6EDCC6612E3436572919E4DFB57C049BD77B344D8E04152863EFD4FAE8FE3A7230AEAAAF82870820085F4B3EB5215111B6B8952CF2FF468B3D10F3AF849F16E190E9560F40B05E6E2204591B58A850E2710F7043AEE2A44A6D4A108CEEDEB2D216E51102DD08751925DE6A7F67BCA1980F0789B34E2F86729621F2285C5D3A036CD87C76102E9D607C37CCDAC8062CEB961053F3195B5ABD88BC64FC65F8BE34166841683F1EED291938F75DFDB3AF4FD2AA98CE95382ACFB5D5DFE6EF243C8A0B19B80584FC0CD533E38BD485D1C52E0EB5BFF90C0A947D9B9095AC1C0CE9754EABFC860990206B981235C7B612DB61C9FDEFC0F14DBF68A8A0EA4986CDC4AABAD6C218559E11CCEECD804EB98446FB33EAE47C0388BD8972DDAC02CE807B707D6D188CB31A1D76D44323E93DAC4F8ECF77E7896C052EF16009CE4D1147DF84FD5785D95D77310783F9AEFF1DDA693F4BED26457ED82A1CEA19D9C4919257E3050B25A7D1CE7561740DDAC3FD93A607C79875E050E40498BFBCCA95BDB3D0FE639DC7CEA80E3DAB3AD73A4265F012451C1BCC2FDA1E1AEBB7FB18407F31E7496E2A18D2C686B47120688240A2FB134A3C314D4CB422811E850524684EC485E061F7365494A6403AF170DA461A3BC32FFAF9143D5E9B17B2285C56977AECAF880CDD34F26120DAC4C950198233A50654EFACA6EA97333D2BBC024A5E668821D20333DF0B712510100AECAB6B484CCB7814178F851A3E6BA0B76F16C4685D5AC8BA48558D382ABECBDCF0B919C1ACAE46EBEB5011DD0B3C22B539810720CFBE4CBADB111E100C09C811E724A67C66A1B89EED1E7218861F55A4DC55E236C6E3521DCB374437A14E8000DBEBF0F7F9BF409AF952888675C11326D9E3E8A8828BF50CAECFF96075CF29446CADA373529D310660CBD60C042C143E1736FE7AFAF6FBE42791A8DB01EC0475145257FE2DF766D4EA972B14AE5110B8F8F42D659383E9BD76 - -count = 38 -seed = A4563D09AD21D3916BF4636301F2E64183A8F003DA186753D7F2DC3BE0089BA09C62B8A52B72C2C8451213606801FB29 -mlen = 1287 -msg = 67109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 -pk = B3B6D9AAD81BFB1206C0086CEC20DED59A8DA47D256202B0BDA3D6A4B15F221C1E7BAA2233ECDD25452B2A2325C9F9D7B0F4D21D2A34D7E852E286617DC51928 -sk = B3B6D9AAD81BFB1206C0086CEC20DED59A8DA47D256202B0BDA3D6A4B15F221C1E7BAA2233ECDD25452B2A2325C9F9D7B0F4D21D2A34D7E852E286617DC51928020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DDFBA6EDF9A8B8591EF70D8B86F124CF406AB7F62A9194F60DAB5D943A107DBA64BBC5B32C185B47B413CF1F5439FFFFFFFFFFFFFFFFEA4282EA9C7BC68F4CC2A4BE65D58074AEDD94D69B84675A08399A072E881A4A762ED3511B46C3BC33385753C4C2FEFFFFFFFFFFFFFF3223F1BC4A16528B797994953A947C2488C4257380E1126148CA60768839F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5367F55EFA0A919752E28EB96AC5A85FEEEA6D8DF164462F7DE10C306F530D0000000000000000000000000000000000000000000000096524A16B10FB6D482BE7DB041EE347CF375CAE7D01389B436ACDC9C7444A301F139172DCB03638C1852BD4C0AB497B72CD83F3AC66C582EAC3BFAD6FABEB28DE517186819519F5EE7BB4AB108CB3B01ED931FC7B22AFAA19F6C0BA0EB8F52DD088742688B21BA8FFE7CA1F42C0FF5F758453A13189D6D003D6A19A655E1B0C3D037597F2D64765A7CFAFC6B27BDA7F267A601027440B42DD812F4BAEEEF81066B6ADBF962BF5B946F9DFCBAA6A763E1B417310740E35BB9B16CF245CA48523FAA8AE83071105D217C3C17F6C9D6E96C5CC264B2CA8AA363BC7381759FD9B19064478F2610E90481E614693790DF84BDFEA3F496D4E5366D0634E4551EC460DBBE70015E16B867F730C6D17E6BDC967FEFD68A96ADED69C5A0CE172BADBB30FB323F0489E6448F5CC34AA9E0E84EA289076F1DDC1AE537864D1AED1BA025E299533C16A53EB4F95BDAC9E8A2732E1E509EEE0482B4B73A26057291F44693D24315AC3BC9D7750212A9FC5208AFD52F433EFDDB6CDAB44E718725391E39E0912E2B0CEC8B8B7AB55F34613626E649B4A7E5EF3B418D757FA92375CEFDBE09308028B09031DB858F59BF1299B8563247664833B0AB30759D48DE6EF5CBD7EC213 -smlen = 1464 -sm = 45CBC564765F1C73AC062AA8B43434B959B75300FE26D38D715E4FB94C07CBBE3ED216128DF32906289D67B66E24AFAB2604D5DBC9913DFFD744E20624D950DAA6B418C6FB030407466E431E99535F025300B36A5390BDAEBD07F746D64D523808D5BA038C676789FBAAD4DF9101ABD5B38E106DB0E930069577AE4505A412370303FCAFC0644091CDAE6F0001DBDFE202DD49DFFFB766E47A6DBF52370403982D0B44F49634F30905074BB47466F2630167109894C579974373CA0054ED5F7C373B7AEB810721C3D9CEFA02EB244EF6B17507300370ADB24AE0173C6D114C51E05F822A770318033C082B6502F70012283EDA2A9DC0A1381F145470E5D3729D201773D2AA63C18885A92C962BCD3628835391D70DC36273DFAA4966F65AD40EB51FB4B416A8D0B1DDF39CB932EC4503BEA23E3D9D3B4501DB426C6AD99C28D415FB565F62EB5C22BB043C8CAFC42EBD1C7190DD32A5B14B571644471453740C081F3E3305F9AE70A5BD505874382EC0F6E2188563E763BB8D1BB8B16587AE25A6252F51E4AD02D0483C4A6E8AA2849C44629CF4B7C6DD6A5FECDAB0F9B2F0B35E306C7532B64BD5A3CE67A0247D97024AAFE5CBC13E375AA69B8287BBA9DDC9AAAC2BCF41A71E373EE36B13DF9F829BBEE8F48802DD9E03BE42A5E290251BB130E0E2ABCC4E096DD0F264E5D29F8C2388A0C3010E78F2A03F5BA1BE13AA5E50F2BA67A031CE3F787754B8276EA1AF62BC5FB4DD9A9B9BB84217A37EB9FC7AAFB517337B30454200D6AAE491E50D5007EAC2150F60F640A5C4624CE6D8112119413731322BAD9762BCF72349EE38E2A41102BC5461D72033072A90E82D105E6FCDAED9C223A4142CD55920196D7B1B9278C84B67A2E35BDE3C9CEEBB8E9007BA8758BD35C875DD5FA0A8FDAAAA9A09629B9DF69AFAAB456E105DABF2AC5834B8D223B0A406E0D1295C876C447E8E09C93FB09ED1B3EF6E1F3B7FCB029F576A45A12620567E05F218BC3753109DD29AE0ADE1370C0F871AB5AD8A9DBAA277FB869EE552E8733E73886D6DFEACE6B35E481F37A516EBE191DAA6F83E4FF453CF9CC9DDEA8EE507AF0E62EF3CB8C22949CB828E21C6AAF3FA9AC301E2257B0A054FF0A237F527D53EB757820AF637FFC9F983A2B5AFF0B4CC493E610314432C9C2F0FF73C4240D520D1D73721B429CE41807B7424B14F5EB1CD23D5562263FE1D58CB1D52E5175414800CB090242E240C3A7ACAD4C84DBD8ABC2731FA2B1D9820DA60FDB6BAA7EA849B6A146E07AF7FC201B3A98E5194BB5826945FACA3690209E5726F070A71EE07AE76ADB7E6199FCCC81C8AF7A463633A58873B4F7E65F522FDA409979DE41CF54F659E66CD5950A3A3E01570526C46417A00EC2E8821DC380ABFA21384D141D259CBB9722F267E46272ADC5CC4BCE382B554226996F4A6A1605287276C18A48C8FF1A92ECD2815CA5452FD6157FC27532680022993535549BF9AB064052E6DB4E9F83B5D0D885B94A90F59E67B9DF0C321EB0F95AC07007E4EE33BA89AABEEEEA01FD1172ECA4E31FB02C507FFE43CD0D6C8570769A180E68A70BD344B4C992E7D3A6BFB96AC4D69C2D4F5EFACA1D348DC1988DE44B30DA76BABC307A88124F96F26737A85FE6047E7E485C7E4B6B99B575FAEDC9BACA3E080E2B074CFFCE1F716C6A1D08234C45706D2883C6E5A001D02596CFE5B260DE6134C75DF3AC8BCF1919759E15576CA147CEBE041D04E369BDE70CC64157AEDA311C8DA520EAE907C33E30DD89013E24B7B02E66C9F285BF7D5C3FD65BAE24AB20D40ADDB451AB4BC4B9772D0B9039461BCA8D3D2A4D71A2E6BFBE7F02325FD571FCAE1FB47F855612F382188A5FA3D61C3E8E59EF016DB0149C52E1C7DC84030E6C93C4F32DA6CE5F3B8196AFFDE834D2ADC26CFA05940055401891519386BCD33D85584D74B2F16D8E19556C272AEE8397A1741EFFC283DBAD317740C1B67F8F4B7D2D1EDD68D6615EAC3F8E3CD26AC4F8058667FB388B19C654711B5B2EDA75A9AB55174157CBE08C186A3D0963BB3011A9567BD499AD2A8 - -count = 39 -seed = 811A8A2ED2917CC616FAF246C5F9BB902E5FBF5430AB078AD6CE871CF8C160512A748216EFAB3A4CE1271AAFEA12C11B -mlen = 1320 -msg = 061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 -pk = 58C76A8DC0410CAB12B3623020F5749994D462F6B665F0BCF73E41644838E10FAD4BED3DD5D12A2079F9227B5CC3B2F60DD122A403BB78BCA78C5BB5CD465109 -sk = 58C76A8DC0410CAB12B3623020F5749994D462F6B665F0BCF73E41644838E10FAD4BED3DD5D12A2079F9227B5CC3B2F60DD122A403BB78BCA78C5BB5CD4651090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007F738155EC9EB2DB0D6FEF6C6778546441D86DEEB877E60B5E08E76463040A6460AC53A34BB0B9EC193A5193F023040000000000000080B12AE62B4AEDCF150928591D7004954A928E9E2875920DCCFF04C6A472A49011D3C2F37A0FC442CC9DE5C567BBFCFFFFFFFFFFFFFF584CD12A4A30361FF19CD700BC16762A79E4EA2F04C0CF050310808EF2AFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61EBE620399B07DBBE9AB7D757632B5319764F7AFAD8D00C79D191D6F7EE0800000000000000000000000000000000000000000000000E4B7E766624D28C49DD82D16B8E85B49F20DE65924868A06BB6BA389B0C710203B1CD1EDA3588E8931DBFFBBC209C8A584C6395C1D4C1988DD4B6865D95DF209DA14629D5FA4EAB66F13C837A148009F0ED761538CE8B507AB0F737C0CDEF2657C54095BA92F232187262601774115C58D04193D866DDAC6C7E5B12FB879818EC3DA106E8286CE340F4D0D600F2DA1D081001E4F40F6017BA3EC32A4DF7D0110647F8ED1A61A373E50F5C9FA1213B1A13641A48358AFB7703E922EBC8959626AF01313872F58D9D3280A385838583B99A6672DC8FAA5EF1272E43FAF219411E44CCA096DA854E43D30C1D0AE746B8E21CB3B91A12A337333718D71E2C19EE1F16B7BA96AEECA8B700120D4C4D6E344BD9915FD0EA15A8E6192B0C9DCC035A0EE7092EE07002FD6A3C50D3D534E9F82DEBFBFAE13D194BCEA34478DA82D5BA225425D5ACBE60C18D817869AAD41BE5BA2A85837FF683B76E18EDDBE64D686813F7EA6BD1FC94E131546EB364181213055011A947C5FE17F0B18C8439061858316834D0E416FE51C59CBB6244FA153013927B2E723BC51D3B6899E252F367D5022C689067D183865AC16CB57AC7FE4466852307267AE6EFFEE44980202A3F7134 -smlen = 1497 -sm = CFF6B0EBFF32C91F71077FCCC5984EEB717DC606E853AC54D936CE899207F57D428AA47785650506399F1BD56648776AB204E98D7536792A859E1C0769575F80E79C753C5202AA81D3479AF0B4564C04BAF7391E4632DB301605B195B1CA17459601F20487C595900FD915F365025D46DE8B888DC64AF503ADC2F457935EE9D5DC045F0A05AB9BEE13628105017D6A3F429BA0E341F85D42C560CB09090003AF406C8AE1E01888AA0510E454E0DE3B0801061934748C6758ECDEDDF3A2DF78574A470621496CE3F12E5E4555FEBCCC1A46A772FCBADEBA8B2EB5231B5B15DEDA5A38076C737E5D091A8CA8482F84EC4A20A51DDDA391088F2C3926F8E1D8B77DD0ABD606E9AC25A17A86A5C75ADC215C5030355C4A1B307C1CC80A3BC4A7D4B4044FD35D173A2C7C081318F707828A3438DABE0836C2D6C14E1643F05EF8405531D5594411AE4DAC6F3992279CAE379D7C1762B122037301D3FFE8EFD1BEB4E027E055527D485D0871F2013E7B25CC26531C2CA6DDB98B31F0AC2C3BDF400A0BAE942C9D4C4003F9952B67AF67E85F572EDC3345A84B6DC3CEBBAADB7E3C876AB2DA16ED0EACF4858033BF5A4F739F9E083A345C2BB5D8611DAE90D25AC45D8B3D39B4DE584CBEACCC6F5B6E61524349B50E818BB6B03C7E5B86795D49324CE6B1603791F20B3500A1B8ADE82359263470D777B35DBA38276096445842BA5D5E960FB2AB58730F970A15AA42D9737C33BE700127A7CE7CADE024D3ABCA59CA49F9A7EDF44DB62CCC07A595016868AA97A140178DC92530EFF864C24954464BA886DB7D74BE7B540BAAF807F1AEBD014680FF4A51E16E1391E32069EE823F3D23DB72244D657233578CB7D29A33E6EC31DF1FDD43B51742CC30EFC54BE83149177E7BCDE4450DCD142EB2CB745F8865DFD99DC84AB92750F1CFB0F3944E4E4EAA41261A1E8C58D9B230ADD792DCE20D2612823C0FF9F82E04B61E48DBB83F1A6DD5CC7F92BCD0A37AB3053803D1188029AA1FED9BA04F4C961588C9AD2BA7EF1CFBC50FA69B799898EB0DFE9668260CA5680F91A10D2BEF8F108AB28FCAB693ECDB942070D2B9B8BBB22609C8395C23D7482C31B69B0F555B7C079D3DEFAA5FB302ED92619C058ADF334E845EB1C6EDD903C0DE2AEDD3D9830943F8BCC5954B65DF37C901A17EF13FA75B0F2C8C1D2E38681874AEBFE90B463F2CC7831958FDC0DE0446991EB3C3612CC00188DFC1078FE458D2E5B80EFA7BFCE800C6B4CA0E570FA5858859633551DA28F36F1FF418A9B7AD18AA89B4612F9D676D5FD98BCE6F144CD7458CA9F2BC732A36A4D186EA290A009A870DA3C1F60617D56EA7554062367121F3E5E569503AA573B172C6278DDE5AA4CCDA79D9D8FAF41C6C9040C1D1D3CB78B41FFA8A0180395439F0D1B72E42471A9100973AB3BC7AEC559D94D2D6402374BA5A584DE168395A156324E1E4149ABD35C72AE0F79863CB59EE6BA22145E36E0D85D3CAF8A427D38C96CE489CD0AEA20D7960608C074CE3CD0494B6D6D5EC8895F0F03CE78982AD8FD6784BCF16825286C51325662F34726BA66D3A91EEB598124D6755DA090EF863FA31CCD5B08909A3279A35CFDCE24D2BA16F42AD280B029A0E27137A671C862B0E6F73FF4A1DE320C4DAFFB5CD4AC3522EF1C10E8A918005535F355CE6366B43A757938594366831DBF7EE72F311BE4953EDD1EA1C598960745D3DBB7F1E2D882CC063BC0791D18C6376A8497F2F91389A13AA96DAB78FECA081D761479848A5B4CC2E3D015F343B9000583E95E785A45A06842D7C6C0FE9AC4D70F085503D7AC954516953C497635AC8B7698BB784F73FE6E7F9D0AB9473E828168DF4EC142CC1FE18FA067525915ADF0764E44292A0316EF3C0A443683C92C4661409589EABD7B4DBD43F54317AE0E3D1C69C35A7868991FA0BC2F83430D89821B91A08DDC2D314A717F5BC6F3D89DAF163AF73E10C61630139E3FEDA723FEB2EDFFE6C7F364FBA22E6AAB75E267065B5E7575946C56265743816B2CF12A106AE21921E3E92BFB7FF80E105468F8409D6698E8660B5B05F3F4BB19A0BD4BE3569D24F51795752BE74C429AECA5BE737DE8C01 - -count = 40 -seed = 41CC9DB2E90239AB5158A2628E7478D0B3512FDF84CD27A4CA5FE3119A455C22045F198C3C5C39F491FB975BD1CFF7F8 -mlen = 1353 -msg = AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 -pk = 16D7202A6149138CF42FC07A4ED0AF0F5A2DCD63E0141A13CD5C9DFD2B65590D2B4BDBC74DE72732D12E15A624E5985A7434A46B085A6C0DCDE597509337C010 -sk = 16D7202A6149138CF42FC07A4ED0AF0F5A2DCD63E0141A13CD5C9DFD2B65590D2B4BDBC74DE72732D12E15A624E5985A7434A46B085A6C0DCDE597509337C0100200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006D3C5FE448D6D2CE633866F94415BA13E6D9CF4EE6F5E49D69A1E7711B4A66D039654F1D08E78FB1E3208AA28D8004000000000000009482B4B3DB7733F9E152F398FB1EFB6CF0244580DCD2FED7D8F1FA85135DE61DCD0F7BEFB45060285BE237DA9D3CFDFFFFFFFFFFFFFFF0473640AD89C0E299E3EF97C5909C92D5A3BD4D4777552777580874029602000000000000000000000000000000000000000000000035B08A91CD11B70D0F1DF17EB0F6D03713190283CF5B67CAEA11A70B2C0807000000000000000000000000000000000000000000000044AF099A89633C7F5F685C87844CCACEF950C462E348ADA8FE218111D12F4B186A9ABA9A9E438BBCB19DE60118B6DDD044431FD6BB1756BC608772445B5FF3308783AD33DEC51E94961808398D9A62C589B5A3EA26DF8765F5E407A950443007EE6E2B338620CCFECB26D8C6C8AA530A676F2781A90FDC3B35E022DF0084D41B1D58E2A48A0193FD166E36BE25056F77E342BA2C56A9BD21A077FDDD75F095155421845868D3E2E1A2BC0CEF494783625268F0F4E815DAFFF4F1B4DFD8B621294CFB2C8FF64550E7E7999556505EC9263258831697BB7DA29CE90D2F79D7E304A83D93E65EE27DD7510EB689E548821F2956D723A3C742623E6462216104082B21EB41D223818FD420533CC5A4A88751407D1950FF8E81A2E30841000074552A9C3372E22D3CCDC06C4127E4405EAD580BC060CF067A9E1C96BD33AF7ADE150F79B7F0B3376DBCDB81809F7C2553D0EC2A0662052C59ED5F5914BB16C387231324BE93C58392A4CE4E2809E701433A67D093128914AAAF2DD89DE98D721EA30001ECB305354ADF704BBFE59645A46ECA974BB07362BA36A6B230B1EC4BFC8D221657093EF979971540FD50FCF0CFECAB39A1FB67EFAA9464BBACBB9BE7A2F217 -smlen = 1530 -sm = ECB444F05851B2DCC500D761F9D786E3CE5CA9063B0F8C8C4F68C6086D0451C653D3ED7CB5A91D03EA8D5A44982B441AC5003E4E5A7D7F6F2C84F005CE90CBA2173949DF2706F773C02013AFB8FE510065EAFB5547DC08AFF10642807F2A6DB9920BBD066B67B72144BB51B124013ED175D23A2ECDAC8104ABC7E8A5C6E330A9F8073202724A3785E9DB9400017DB47F20674CDAD8E2E91310B779B2AE0C035EC66BB781F86DF13A0230548286938FCE00AE2638D944822298959F47B2173DE7D1E58AAA622296AD4A4CB67EC7EAD8220AC2F171605BA2D08AF3D6FF5849566EAF96209E9E00CC28EB9A517CF5061545AAD24CCE143A2EE1AB7CFA259AD9C01860B33B0036F2CB3A5086861212F408C5F055D226CCC77CC884452B2670D89548EC1C6E98FB311DF03979CABF725E78956AF185447287BCA2517F554E9F25E19D93790318EFC5D2602FABF262E5C7FC307E5A991E0122E332A803AC4A91B318B30D79394248521190D2BE326037A89FE918D139F763DC8DAA2C3BBCE53F04809F0D97303F2F1B88B572B3086ACAF38EEF36B4C0791B4918204B0E1E923BCE9E3BB1E7BAA07135B176E266AF174D5DF26C44842CEAC4AE4C1CFF05557DA3DB8651261BE78D766699B1891CB825FA9A418C45BB9F7F2D347F3F92F9529CA6DB94E2FFCC69337FB3690F556C5A44CBBD9D79F60AFF063DE68B14BD2F4B7E8CDF94F6C2F40219D27F71E8AB3D4D6872A5D4B82EAF8E3943A6D425ED04FBC5C7596AE929AD680B245E3D6A7C5CCD7FDFA1D14EF0F72B9BAAEF05B7B84ADC02913DDBC76D5FE80DE30527FFAD1825CCBA34F8587C5B0291471D6957AD99C5FBCF3669B4AE5930C8AF68305C2D3E84E714CB9049A9560A3C94AEB95A252F69B68F755DC0E0AAB52DD054B670A275BD2BAD7FF8EC0CDE6224E9A0EB537E95DAB992C382D6B03FA045DA402CE7C5B55138FB400D9E86AFE30923AFEE82C4528D1B38CE16D33BEB47A96C18428D919BA98C9782806D6F4A40B52F7F0989337C724BE24E9A5430CFEA470D02EA36CA479FAEAD94A74049898D1F1BE53D5AB8CC0CDD5438A7C55827131DE264AECD18E5F5F2F9FD60E8D2D6F55BEB27EB77AEEAC2A15432A5F1467483BE6073243D0165A6C242FE1BD7B7AA701A0827F286ECB51E4C2626DCBE95466BC94A7E2A09AB334FEE3959CA31974B6286E2A2051653341623CF3ACA65637DF657280B6025DB0C0377EC09E6E32010F0F59711A30496695D23728319DFD0AB5F3AA69025276E68808130659D912A53693584188E310B1CACC41AF4B19FAD8DA95D4B35E2569053F553A9DFCBB8FDEE1455DFA0E4F5E94324C86A24288AE27F3576AE15FBC8BED49BFD8521D77A61FB523BADF0E3CEE53799016C6EE4E1E5DEFC19C7717A5C41ED8FA6BF0E5811BAEA76676DE03767A607735C2A48BEDE511012EAF1F79E4D2C3566042FF2C63BB82FBB399CE20E1F268D3844BB473AD7366EF86D064C5BA080FC0C01BDD2AD343C5367D80D2A058CF40725268CD34123C219D9109780335611B008EE3F8848EA9D174D7B96BD2FD9A04FA2B550DCF0B301D64C0764299D317DCD0CA05718A1AC008D86FEA330095E81567E83BDE31A0D635098D7B86176CE6CC4025E8628C73B394D9A45B09B64BFD3A424162B16E1ADAA1AB60006847C6D5CA5733237A330147CFE6B9170D7B88834BB79F1FDDEFCC0EBB1D4FEF326E28C41C919607BF12AD112807BF8582933DDB096F1F3E2BCD6BCBD844DA317CEA2A7688A5FBBA14D84C537814EC2B171ADE28ACF83EA481631B968C26F8D2BF2C5AF7D61A93378E1E23FC756E2F0EE79199475AB4BA1FBC55D9ADC2B05888B2910049BCA98DEFEFE96CDCB67CA9D4AA5BBFC6CA0ECBB78BF29035D158DE2A1708D98BEB85C70AD1C64B39B387516073E2FE85BD9EFA25CB048C224E0EF76547DCA67FD66485A97EB5E56C06C78FFA08EC1C9C6F2380912A2585CBCBA2CD702CD2B51022F63EC920412989BD743A8A8BEB07241E3E8EB38CA14CD400C83DBFA6FC8E04F58529007A1477E9613291AF877692E4CA9AE118A1902AE7B4AE7DC2E992A6495CD19DF32CE64131A8D8C41969A8BAE1D870DD5F1360BA9278D5B76E746FAF99D526199E87A4B1D3A5C48A33989F103CFB2 - -count = 41 -seed = 1C13369824A3FDD41B1065E17297574715D9BD9CE5BB733D36D22C31B62BB1033989A604D78BFB1A0746BD4A2271FC0C -mlen = 1386 -msg = 9D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 -pk = B15D4CFA9052B7C8F191A49A272EBACE0511A38947E3050977B585A172B7711D9B7F5BB67E661E97940062F7955570674A76F21E19143F0B4938BC20581ADE05 -sk = B15D4CFA9052B7C8F191A49A272EBACE0511A38947E3050977B585A172B7711D9B7F5BB67E661E97940062F7955570674A76F21E19143F0B4938BC20581ADE050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009594E9019421B63F6A8F2AC5EBA8D16A78A8B89BB568075869164B0530B6DADFF069203533AD254411E56BC7C26EFCFFFFFFFFFFFFFF5C01486B21B4AD4D55EC37D9D80454D11D657887BF515F5969D1E79DB230C3DB0DE15AEE726425E8350A362F1FEDFBFFFFFFFFFFFFFFD0BA0C3C180FA646FB3E336DDC4363214E38BC7C037AA9D371B87361D77B070000000000000000000000000000000000000000000000DD8841D3077990BD94C1508616E8B2D682CE315958F109AFAD5C438E8CF0050000000000000000000000000000000000000000000000F32E5FF1CD2B1505B3FEBBF9D2B7770FBA522DD6617519A72A4EAE77E931331778F61ED00EDE5370A666FF4B8B39A14C6D4F70FE036C841937F4BF5334F95D23ACA9C7347951C104942B667D531A91D09AC59E5CBB7EBBC78D82E1ADADECD73110C401B7C3B116CFF204B6A845054EAF2C25A4C57CFFA789FEA4B5FF2D1326303E4306EFF618C1236506D9532EAC37097D260C9F4E4FC69C2B90BC3402AD4C1252FD3B20ACBAA53672184CE2CCBE7B0E10A495B051D7D59950C4F1E11F72E4280A3186AA1FADFE2FA4999C5BC11EA54309A6CFE7B9326F5A0B51EA9FED688E338AD11EB9566994BDF1F64E33C86772A9FC93BFC2AE0D42CF768120551C7D041FB54F46A0438989D274D130AA4D04BBA6B1F428762939FD9AEE34AB81759B8F1350A838DA409C81D2311FB901007F789241A97EBBA25CF744C1FCB65BA5E8051FABB6EB0F934F53686271C4340F0A656CFEF82B9F843F4460EEF497FAA0BF36307842E17329F4CE38A47D8D4444A082991E043C36A9CDE0A6E3DC2A605FD8580CB1A6BA2EA8B8D1A9E8CC66D9D2AA8DB1792002EF86196784B4DDB5CDE235DC0C93D61EB00B655596B47AA43FCC7F019ED138ED6891C5531375130AD78D58791E -smlen = 1563 -sm = 10B120FBD9FD0780FF00827CD7C2ECE8CE93B1075D4781D8AD446CDFE0004803FFC110B6ECDE6204BE70B2DA7CACD77B6101C13850D45E24F63E4406C0197A4AD234E4AF610637A3C7492B39D7740901A0D98A3370BC3371B907F6CE199E6A5A1FA9FE0428E99586F221A6CFFC039E4A100EB53563C77200FF4CC1F7E6BB7A783703CCB3EAA65968C611F105001FC4301CEB4037A33DF9D98D5BDCDA3D0803396FF627F972AD4523062F0B3A30A7BD6C009D84E1DD28C513987D5587A4427853762B7D7AF668FF9EC2E90211D6CF5C0DE6C7E54B298C1A6C67EA9A693CEDC4FCA1A6ADC2C6DD0E5BBCEE7266B9C6AC8FA8AF5E50078A6151F938161F1FEACDE4D8079B5A9D563423258CF3AE9E47D8E75740314F2FFA63865A8B30743F773A53E1AEDEAC45CAAE01993B75C8116FB0B431631AC001AA8BD02E5B83DE627AF0CCB3A3D86F66A7E5FB658F9226DF31095780A6E8262A247D70F4E7C971D108567FFBD7FED0E16B7FFDDD93F5764C3E02A61998C32146564D46589538B2E071AF86A26321A3523354F4F0C396B863FC8E9E2E3A173901D0D178A9D2828D0E0974B72CEDFB17937D6054F185A81D4F853787E6C3681A74FE25FAA6C256A9F9E9A9253F98B9AE4B8FA0068DC28BC7E8D5785CFAD20F7DDD643DAE6A2DDB02713C9CAFC2EB2FD18EFDECED05CC24913061BDC38E932DB5E8181FC0D3DE26A94E2138800B3C01E07E83B3B0BE187EDC75DA576AF1CC7B7122367EFFD6EBF05F4C2EEB0AB6E9F91201A4237910A87DE9FEF777981D48FBA28AB8D64D76380911F2A6621335DFA96B331AE8B3242EA1F2A260260244196B0B9596C411218A17D0A58D3B5735B9AD7B6259655CF6E2D0FE5B37D0A0B02E67951F5D3FB277B6E1EC87528B08229AB0EBD895CBA2D075A47CC8100E9DD17DE7D951BF0A68D710AAC21C8226D8CA95AC49FCBE9D493A8D3C7F93FA61685BE57FF422FAD036304F317A3DBCFEE7A4610C8C1DDAA79E37C19D6414F47230E01EF1CD5C7C2FFC319A29AE6A9C95B06C603F2CFC1D1FC914B036CDA6CF9A876946983B06123C2E5C7D09BC190647CDC0512F35DB9E214C77D3D7D0234C3F2590941236A367700F9C04D3AFB949DCA2067571BF28E78ED35FC026BD801C4AFEE9BF31C97580953950D2E81EE6426E78D6F8134ED19707473F0874367C86C9BE170BE63405A9BF7C46A420724B6CCFF9C21B015E21BB02C5A7AEABCA873B46571530DE56E47288C3424DA398517ABB6502A9A6A65D4983D97E479941C44CF0136D225991226F70837E2A7D1E9CB1226F40BF59D52C66549BF8E360096954F5875C466160A0C75A252E5FE6B8F1841FE210BF08520CE74D77B69692086EF50BB64732F19D1A49E5800F077700553290635D418168A6B9E3AE980112AFB9D58A18B94F972845C309E86FEC7E456191D8760A1C2106036E44C5C9A5F2CFBC67D741E8E937E99ED7820AB0787E39C385356EF0F05CD3E31C44115A8892224197B1D1F554D5098B72058FAD49C665F716A266CB4DB6204666E1DC07B6CFDE0EA00345661E0F94A5025D2EC98483CF482058D2EDDB018CEC11D91EB46B63971AB29367DB46137CD7690D5782E3A3DDC8CABD545FC1AAD8A9A0A39542AEC55CC3D58A5BB5E4A559DB1FCD2932EFF6E81C8B8E5AD5B4E0424A444BC55D96DF63C8971A5890310FE19DFF8ACBA72D96FD3F32D67D41A2F3D0B343489C7FDEE7556012C2D88E2BA9D512B71E7D04F92E6BE3A9386565271D755BED752C853E4539F95C3287A275004F76B9A93837C6EFC6760BE4A39B8AA92C7605AC369472FB29E11ACAD98FC91B1B9BB3505638D4D46A3AE3C10C8DC115C35725F06649BFB00BA1EF214B9F2FE98BE2DA99AB23E7B9F014F5C5D0248A9E0E088AC175C8048C6BEB5108DA59DC234E9EDFBE603BA912BEA22505C2A9EAAE766FF55AAC8392AEA5C722DF25BC6C9FCF9B0275DF71206A4E5290FC5E71D79928E357400DCB04EFD7CC9BD0B86E04BFED9BDBCE5787E40FCD6041ADDA615B5ECF03C30AB9B2809E3514E9AC87226C55F259C5F157945B0073431715E1740DCB319EDDDD1B5F2763F0439CC0D6ED5867D9D98C227CA3008F30D1B2AEA40DC73FF8289E4A21586EFF519520F888E7E2F6D29A269C12607D13D398F437CD7F0A07C94EE1E1E3D8518D0C97BE1E250D79C5AE1709AD8A638F55 - -count = 42 -seed = 7AD6C7DF00C9E52A75290D28DA946305D83CCF6DE2515C19A8E26850C34C8C2E545E2E32108F13B9C97F87AB68D10131 -mlen = 1419 -msg = AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA -pk = 50BC12E5F180ED07640A9288432EA8C6F3D23C1B73E06BE75DC1E659FB022031D3F1B6D6E7D70FED728953467D4EAB749279C5FE111156211239BE442A7EE404 -sk = 50BC12E5F180ED07640A9288432EA8C6F3D23C1B73E06BE75DC1E659FB022031D3F1B6D6E7D70FED728953467D4EAB749279C5FE111156211239BE442A7EE404020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BE3A307A207D530C57489C487F2148D615756E0FD835611C76CEEB9D376A8B226B968EA156D25BDA6A308E5C30B300000000000000001911364DF5A1BA743BCA24B2AD8811C3D2FA11BFEBD5FF00A389232E4BB595D74B9011D2254ADEEAAF628AE4C57FFBFFFFFFFFFFFFFF170C8ACC5C0AC80B5296D8CF9A4C8E937AB207BC25F8EBA39DB97CA089EEFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1C64A321280C9E481ACBB43A23E82CF94585632E940184CC2FC9B6AC230B0000000000000000000000000000000000000000000000CEE953514274AF37062BDD1808ED7EED5A8C7366FBBDD972FB32DB162BFD6605FF1D6E59853DF0920C2D965549D1623EB52E1B7D1A57FB1366B794FCCE8ECA1FBF4C4FFFFDFD06BBCE722BD4FB16686D029CDCBB889F21CC5E797D8D4A8BA911F6E263770AA3663675F1AF01C8F4E5D9432CFB8C602EBA9C0635237F4EDD030728053360FBF5B9E5E6D52EFB31489FBDF068397AB916C5B1B04E73D82F78D827030ED8A2572B3B6F3BC6C543313A516F41AE4C46EB6203444D80FAE3D8251C0B40E0F23FB5D0B3D1B1091793EE622F14510A172CBCAB07A6496842C8DFD4E62F582F72DAE9074341D42606B05A47D3864D02C582A83AE2CE51CF0BF4D41016241EA8BBE35807AB76809E304D0EEC09F2B7667E866BBFA9629328FCA3AFD685275648EE1081CE6DBBB0BAFA5D35CA5178310A4F967717E679B513386DAD478C09627B9F717A4F03EF4461696C3F4E6E3166FBAE1A70E7C84CDF7DFA16D8C4DC1933304C4B6BDCAAFA84EB8F908529A9E66860A9502E686072644F73B3AB420523E160094017ACBDBFE02AF45EC88065FB38A18F5F3E63A7FCE289A263CA16C4041E7DEF893B843CD34588CE1B73C0B04F436239781BE23A2C7EF7D54BCB0A4E09 -smlen = 1596 -sm = 2B40784671F51D25C3076EC2C39DBAB6DC6C0707DD76939FC5CD732C8A05F49290B13C188291EF0433DBC1B673A69C8ACB0695F76069937D1657A1021AF15B5F65118278AB01F56742806F6B828821054EC2C3B2AEE45AAD8D0204D8CEAB131FC2A07505A3BB98581F7F35C36404D6F249FE13A2F92E620483523CDD16F14D748901C6BAC26053B03F954D0201393811864CB0F999B92C96D1E6B2B8E20201052EF8E33ED12E23E90237512709397DFF00AF2860129C08A1A9C7A7BB3120B3E40AFA1A4A09050C8483E7511FABF3285544D4CE3F41401DAB8C17DA547F6777A72519F6EEAAC83016FA0E0FB0B33329DD02AB8EB1F291758074EBB5B7C4C102B75BA422821E6755B37B914D689D84808A89CF88F69A446F489A260BA03CA52A4AA14E8BCF4BFE5134DD2918A88D67329B9BADC6ADA4A3071FD21CFC45235FA0A1B82D91C5877F10AE087464251C8899732AA7FC8F6C0A5BEAF4FA41E64CA97932925A06E218272500249577705804C6DD9F0F61DEE6AAE096BE0AE5E67923137933FE4D61E9A88DFD5B3BD75AEEAF5018A5153985E2837AD1AAD5EED91620D935EB9982DD2364B5413F490BF251FC783503FA146300E6ADAE0682E0597C3839C645DBE855919BB1CB80C3DC6E233909017BB31F5ADAEE05CE442EEF594FC15FEC3A2B4B81ECAAD1340B0677F27009290AB3AB8788556389047F63C2CE9390658E151CA85BAAE45ED2FE12B6667967F6B772EE683AC2E7347C7B0EFA332B3354B5043CB86200F8E4249F68030844D00A86FAA7B79A4129AD676D1E9D58828A1AF4C6BD68C29CC23002E0A0313500BA717B8756D4A18E41E381DF8D7A999A153876DB876CA4A508486A4F331CAC9CB3E7C416C6329713CAB76E1C8B63A8CAD46F8EB1E65116F89A3B4EB8FAA14A73097CA71AEA3220BE7FB7FE64919893930445D962C309E23332E4B3ED8CA768EF0ED46EAAB199827AD628A1BC20CCD9F61BEF67F7FCB017300EBC7493A7CCDAEDBFCA5F91E80B80DECBFD9EAD9BF22FE16B563512C7383D34801C504202D7A0E19821EC8495016362EDAC165904D2BBAC484DE1D4112C3A3E6EA56A78785B7CAF2A44B5BC8BECBC50BF4B521C1D086086FEB009C06ACB8FA0F53E7654FB02AD7898E35E5F3A7DCFC50124BA1F30178C707F4D36E4E7758C4CF82747753CC30A836311794A6A9017F53ABD17A1C9647AB38BA56AAC83C1812DEE8A5A75C5CC958780A3E9C3C1F39729BD365948F7FCD8104CF09660060FBAD2BE9B8D8E5BDD22286EB0BFD4010681AE7928D0FC008E21C8F877D97B5B9C7A06C02530FBC6A9D6FCEDFEDF68A9682177757CDDDFFA6CB9086B8330E61851E2761D84DA37635EA8441E3B23FD165CCEA562B0A3616B30EE5FAE00F76D6801B22F2215D80829E01DB2C0743E3074CF26C96B0EDDF97D79FB9C7FFE9B5CDB891F9E61FEFE7E1CBD28FE25B7858921C8C99C45A84B50A8233037DACC20BEEEBB9B22089DDAF2EBF0698498DA694F75ED2463D09BA2C757A986B8CA556CDF46CBCDF288C078041D497242F66411F47F35A21918855F105F24686076FA21BC1283F17245A7122A848B4BC10D996B2C5161FCE0336B2EC747A4A07FA9851AC5423D1EFC4B524E795B2E4BFFD1C5CD21F5FEC954824DCC53BC3883A7F571A9323DFDD2682C4A4C54E8862F347C9A8897779170B257AD26D90121DDE722A3F214A44CF6C5A5DDB2452A2471EBE7FC8D0EF7F1EDC7920CB42A71E4DB49A0168D51843F47D17BADE50DCB340E5F7B7E5B6A6C3AFE0FB26B5EA172A4011EEE838E5634E521483C6EDBE9994B0658406ED8F4998C7B4E869845CD16CC4368DA3BC1B025A6FFAFBF540133C372D452DD831DCAD39D61CCED0A0AD193FA9886EAC749001E3BEAD5A7962275FC62298A1BD054F4BD97ACAB2BBFDC355C73509D98B6DE5B4CD774BDCAF1398532BB3DB56524CC047ABDE6880C3B282FCE0FB2AD7E4C5F7BC138B48D194E8C8036DF4B9F3949E912AFE5D2734662F27583193D0FBA2B73C1A0D012DB853BBBE4383F6C391F3220E1B5761C337A054FC9FDF09C01864B87324A90C776EFBF5D34A68DEE38EBAACCBB61B4C79A58CC848184F605D43CF9D40BE90C1FBCF6735270132B59A636B16ED28111246270AF32EA2CB7A42A084005AEBB6161002E65B37217361BC269F5ED12F7D50613C82934A6D1D98D1308AC82827B7504F3FD351E0ACA1C62843C9219023FD092692BA4B83BE198EA - -count = 43 -seed = 38FFDE9B60DEDB5BBFAD6C52AA02EF6D49369BF276C99E588D796A4F260E0FF0A65C96C35863BAACFFD9B212EC305E7F -mlen = 1452 -msg = ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C -pk = 924036157FED5C2EA6E25FCCCF7B885663D1B7DFC82D0E88D4B1699B644DDE01ABB63F772676A0764103D96DAB4CACFCD585ED119550D93ACCC96E1A15032A29 -sk = 924036157FED5C2EA6E25FCCCF7B885663D1B7DFC82D0E88D4B1699B644DDE01ABB63F772676A0764103D96DAB4CACFCD585ED119550D93ACCC96E1A15032A29020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000138B5B17B33133F0785273C892CAA9F24ED162F06B857549BE755CBE1027DDADEEF9ACCB7D5B63059BA537D5879E0100000000000000261A8AFCA61229375DB8C934306DCA99B04146071CF4DCC506BECFC0FB6492E27567119DEA8CA8D366C412DFEF8FF9FFFFFFFFFFFFFF1EA6E9E8A5398E62163047ADF1EFFFCBBEC45CEFBFC0D0A3142D29AE74DA01000000000000000000000000000000000000000000000043E688FE278FB16F2797B6B043A327B35B495998A3877084D58B7E8EF115080000000000000000000000000000000000000000000000CD6D446B1FE9745796AF63DE84E60A74D26859FE911742ACC574E8A9AC985A3324A096EC979D60D3FB4475008B75D09A2550080F34F27FD7C77479A94C04DD200281597783261B8FD0A52D2A7A8FB49DA2B5C15934B1BD8FDC5EF25D05D7E03043C4B94EE55AC60F1AF51F06F1FD7D1E2E597CE9CE56E35F2EFA3A1B62320F2B75F727539E65C06AA601D15CB24221762C88143976B80C6D4E8676B090387A3071A9131A75C9954E6F0F9DDE1E1A82E10A13BC1C1EBFE9DAC648FC8FA0757830A7027323176AE6E5ABA06DABC1691D15D6A535EDCB8D833CCADAB2F5F5590333D78BBF210FAAD54FC47BD80F0ED3BD5D70FD10F7921074E877D07E04CB121D0DEF8793E8F9AE5E4A8F00D1637DF4E4FC6755E5A1A48AC2662F3930A50C1EDA06C0B67DB0E7973E5A0EA9CC537AA551CD0715A318AC9030F75009351E9EE2E119A6CE8271B9F37A27DA4C5C7FDD1710FBA3EDCCDC15626520A80CA34621C9AE026F3AEAF5E6B07C85CE6E4532AF503676091830130FA8E0EA625BD101BFD9B924A4A127FA280374C8BBF4CC99E7438E3CC06DB1C3F702E6DF19F166E128E76E2EDE8F4A8F489AF2B049FBDAB41FBB37E7EBED32BFAEDD8CEF402D198DF032A60F -smlen = 1629 -sm = 2D9B41EEA5400A72D300D20B841796A156F20D0267B5A4D5CDEBAB019D0794269A0D09D435D829007D455D4A53E39DE15A004CBE1941CEDAA67837048984008049CC8FBF5E0564E81E351E85001AC704D6CAEC72038267833502EC39E8E09E4A5BF52D008C1F2465AB20C1273907914AFDBA873A5BC23202E64E669582AA11E413063575A9577E6EE5043E0001D1F1D3715149E8EF7182C37A231F2BF80703F9343FA453C915B22902B116A11EB896F101ECA4505D43235F274D902464F4E763312BD11060F908621A063409EB42FAA6BB5E20FACD87B8FF41767C20F69B1F7E05D5F3A957F48DEA57DCC91824FA48DA6DDBDE7E3327A0A8D46A47606EDA01E67CEA1F29BDC5FBA446DE60541DBED6F73D1FC5F49BD77D45285D3D8CA93F6DF25AEEF9324BEDB40E800ACB49794AB05E6D0AEB11A5994FBA36DABB9559CD93CF522174061C116CF31874A18C46689FB8C075079DFAF73EA0EA7FAADD47AD8EF68C06AF9738B41BE771020FEDB79CA3D0165427B58E547105FCF82A12B67579D1D3AAB29968817068732CDBC5A2E9E8D55D17468D03F38D564F5AC6EFE1538E4A680E9E15E35AB54D07B6B58EC9EA7815CCF29F4F880CBF1946F39556BDC2BBC78A5134FA7A086DDC146AD9D503A4CA837E0823BF0728453F6B053788C69EFF8D11ACDF5F07282A75CBD17F2AED58E39D862FF056DF17178625234CA7E03D22AAAFC4C07E3FB08F4297B511B10579934D2761FBB600C9454AC05FFF80CFB93DE3B9E0DDD0AB1E494DE477DA2B5635E48D5BED5CE359E66A3AC845826BE2B4BBFA6D825373BB2A4E93AA417648D1CEA755AA4978784D6D9489F6738B4DA03FAEDC659408D9395C934AF774749A498B1406522351F86838865F53CB0157247484FD37EA59BA72FF3226AFF1EEE353ABD34DDD63FCC89387B947027E04A6F4ECCA1EE5F6BD1CA758AA4F796FE839338164B58D8E5D71E6D5CDEEF6B279EF15A7BAD873B12F7C5B3E2817C37BF00802D2534D425D52D0BD5935BF8658E5BD39B5268CC45D0F27CEE5A57300F497E77AF5268970782030E6928281379CB14BB56D2ACD963D189C078C7A60E98A782F9483ECE7B4871A061277186A01E878087381704BD72C63C32CBF2470A561C22A5DD3A1988B7ED0D274182E1B075AF277920B362D612DC7ED82057EBFE51A3CA5A9A9A45DE015C460BE6A48CF67C820813048A1CEA0FC3D7307F802B4FB7E523E7C8555FA56DCF66237F176D3D973C47F55AF93FC4BC92B98B7DE89829B1471DFF53B649CB03B719DB58DAF824DAA2DE570DF6314DCAF5B705557F9D783559277A754F3CD5B783D5A577EBE4A065D320284B01F71540F1986BCD443CF4FD480DBE06EF7710387CB5185DEACB5C2A612BCA275950B8988F247C4B773D8983D87F47D60F5BF80E6E7BAEDEB14B5FFBC46893A81C63F99F511D3E24FA8F7B1BA66A7DB0C1D9ACC6B5010AD725BDC2282D8A24018C975C8B12ED3326F48194D4FF93EBF051204CD224EA39F27D63FE07CFD0162358B412DBFD4715AD049EE5A31638D3111AF2DB7952F3A973646612712A607EA35826249D14CBDE4380D8BC986067B1CC27503449FB128767986A406585C3D40DACA75C27BD36117D2487BAE82CF639ED1FA016ADD279D109B8CDAE59EB31E1F006CB7AF000A267E8582E55375CF6F06D1A47BE9BFA21C8428045B9DF96808AD74D054820A4D0873257EB318A3DC9B6D9585D973E26D435345B4D699A952C3092EEDDD975FB59474212080D03EC489C695F19CBA4D1CAB1AE8D2E2C730B06E657D33722D24222FF7B613B6E8608E8A6003E11C80239FF431B5D8FA52B84B867A581798833590524C7B84EAF6CDA9CA94C5AB8EF55A1262EEC5C37467807C89FF7D075606A3902E7247E9C6646839C18493584D33DB65D6DFC0F23E68C9D13FD57FAF4836C28926693DC3EE372DE27A9D3E4AB4229425EF48CC410F1792A51C9F6FA5316A1D9A7C99979884EF350B4882F6045921CA88D4E44B435C69C1AAC11660971C2A3F6480C79E6E146C0B5CD2371BF5E7486AD7D0BE88D62A2AE8F0D73C17CBAC86FF6BDA55A880B182A5237498E9CB343A9CD82D7784B72473D222E688D13CB81B2908BBA854B9624A11DBE8CEE9C3825C1BFBA476B4D23D0B0C325F1C498A65A3589EA8E8DF8DD9030B279EDE30443CF80367CEEA4A122DC8329E5AD42491CF57EF47AE2B15F9C54120966B95ACD727A4A2B686B00626BC808F43D82D20DEEBCA79B074A7BFF38D2531AB2F726AC7087236EB3FB4BEC8A2D4207DC84C - -count = 44 -seed = ACC98B16DCC9A50EF57F332D66255CA56C2BB679CAE705B4297F1418DA845861448DA6CC5CC458DE6C6E96128EEB2898 -mlen = 1485 -msg = 96E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 -pk = 57FB3B4F429480D4B3F3F73A7A7E012516DE22F524E50AF7EE53369363CCCE2ADA0DB41A2AF39E3FE324D197C30ADC389FE9C55389AC618A43A9024E5AC83325 -sk = 57FB3B4F429480D4B3F3F73A7A7E012516DE22F524E50AF7EE53369363CCCE2ADA0DB41A2AF39E3FE324D197C30ADC389FE9C55389AC618A43A9024E5AC8332502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045AECC2DC915372FB9F13F1D467E22DB193D453575577CF752473C4737E3D950B7AA966B10CA2FBAD71C85516241060000000000000068D52F9F70A953FED59696E0BC040D46519AF61281BDB990FC2AFD7F5B86F643C731A2B8086BA77E361C3387EDDEFBFFFFFFFFFFFFFFB0B1E5213DAE8B99B4FEAECCA8616C1F5F53948360756A97E6064E4AD9ECFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B63E772CF56EB3A5213C55758A5D2EE298A434FF6098C26E9C3F74578060500000000000000000000000000000000000000000000002F424E58AA4CBEB226F5BD9A7E3843C40689BFE79D6D0CEBF1D19CD165B78924CE63A83F7907540005F47F8FE3E9FA5EF50445096ACFA62990AD16160DE271028DC2B6E70F1AC805BF6636D1A8F318E9075EA5F0783EFEC9010D80F182E02628B6C150AC555DB84472ACB06DFFC41F07532D725A9FA12F45144DA214E4119A0E9A37B3B73966894264F0752DB53E8F035BDCDC428B0698B03493E1145AD9CC063F396DC8FA31466AE28ED70D66845204AE9E8C12CE417FF42163ECA947EBD013D1DB7A7E6FC4BA46D7B2578E835217FD57EAF85F35830A7997023227EFB4911D39F43F879E5BA8BE3AE0509329D37271065E1EDB3FFECED34F06DFB7DA8C6026E3F6BF77D91ED73C304D077AB27207B4C578B21D0C3443471D01C4C3B838D712C8B39F15295728727D57A12538AA64F1ACB52F587ABAC67374ACBEB6E858DB1951D96855FD52425212DEA233214CB9852D3778B9EEDCD3092A5CF5686C642812BB0AE24E60BC613277D0A581483B912E98D20619902C919FBFA00DA34ED7B32C2AD6B0CEEF7C20852D694584DD27C03BF0BF7B25BE89E9639F3C638FCA9F410EA5997DFCB9690564CCBB7A03F2719E4CFDB9528449002C328141B35A3F394933 -smlen = 1662 -sm = 867D48F39A8477C40E07F41A020A583B730E140732556A19026A02198B06DD9E3AA52785781583024DAD89615044C73868029D218D887148661340074DC1D7600904A59798054A5A08F961F6AFC95A06D9C636B09CE422017D04616001382D72C0B5DF05873CC642D60A673AD800D16FDBEBC7E237709200CD4CB8726246854ABA010DF7DC0CDDE5C898C607000971CE0D035539357A91A0478082AEB30F03F8C6C720142ECA883703AFABD69794B8050296E2865A0E602EA4E3C5657A7F761A6F771007989FF885261F5638C14C1BF80AADE34CB956D2B5FA1CE38FDE831423201D3692E8E6F40E68A68C085DBE3C4CD8E35394F74072F44DE98A74E42C9176A86AC06BED8C0CA937DB4C3BF92371106B7A68EA8FDE1D1E082CCF522A397401AD0F8DA6C82BF76EAB8AFE101C7FF023A0FCF015B40ADA0073363E7CB25260C18662D651222A4CCF1B290EE6F7B111B9A963211D67D7674B499449F760352FEEB9FB7265A5F2F7F20C0174802C7F48226D92620D3E009E85B104230C21BA2FB0012DAC4BDF9FD184E09CB3E593EB1F3EEB418A8BF3173E6CB91FD8080C7E80DBE6730833A4A9F22C52716731C7CEA4F70CDE0F81D2D9AAFB6B60820598A7F6AA1B963B7686528E6E7885AE085C3D26C4ACBF9FC15080D972CA841175B343E59FED79AE3CB4DBB4F0D7D463BD3E0C4B2090139145B8D7DB5DB10ABFA51DC909C5CF7809030D72A5090CDC765EECADE2B365F719127548CA601AE0D21E402E18050ACAED30EE13CDDADACC9373A87A218787B585319A7E66FBB13851F7AD0D2BBC1EFE6EFE4F7ED248D844F58B6A5A21FA9295E0044982AF6286DE296550F72B5E416373F1DAC006687DED1E7D40961E5177C207579F25E77BE808A6BA33DCE8A2A6F88E97AE98ECFBEE5296D4A170E3574D9BA592A384CB0545BCFC32B3831C0B736AB77440722299F192DCAD519523995F71F2983BA87AAD2261E6E01C19DCCAE00F8D6914501D1AC3D4AFF0C12FA125ECDCA34DCDD8407F0045F8E8BE0763E19EB007ED4DAE36E30AFB07F8DAA7431B72F4A0A8017B3FDE27123AC3E8EE575F8BE310F68F81B696DB1FE63CCB8D32B899B209B2205956D209BD6E48166BBB4372A607E83C47698DB5AC8F9B40D05F38EFC4A4A1309D999D5CE1E1A5828D56EDA4666995897C8E6362D0B5054F04BCCF79D03852D1003C80CCD55E9F4578D8BB2C8E220A4D7A4E2190024C85C718654CCF174AC96C1BC50EA49F961EE7697C88E6BB718679F1D1F1118376B31A4B8C0471F6D7AEFC5AB426515D1B2CF0EAE66246B3C4132A63C63D7E33EB9DF8D8807215D58F46EE832AD3EC893D74E00C73510B9625F62D4EB5B500EECDBC7D088D3D318077A4A0F7D64ADB13220232C08DA75D23CA7B20CB109C972B7C159863991C32508339558B9383DDFE7E7DDA740E5BED0EBD14ED300C634DB01F359F81A7133669183EB187C17A2C8AB855BFCE73E34A1F59ADB0EC39EC0C7573AD3620A819333EE79D5E09CB8449F91923EF4C5E21549EB7F56075C014E1C3AD2805E682F07BA8AA265745CB600A460069678745FB9638F6709D62D2DAD8DEFDD5A4D0C2AE7401292BD1DA5F40D4CF5D59A403932FFB677237AD74691CAE29FA31B955172EFC5E83C225F2DC0430AB0C909A97BFB468AE182ECF91E9026DE819F3440FBE69B9DE26F812FF3F3CE8037F124AB368B1153C1CC127D140F754C525D4799E1A19D93B90460E6518F0B6936DC6310B7E9E6534B595E00225978214EE5AEB12A6F45B5C73FE86771818843FF7A6B88379C37165D9DAD48AFFD6FBABD11B1FB90AA5A78918B317C5F9B2CED6B9647F130DA9F91E1B1CEB84F6E1618248F06D654E159F71033072F1517064BD96A5C138402771ABE7F39F53A798C2423B748EB7F310485D6376722E204FA33B9740E7FA68364289A677C5C78A19A7707D2549BF9329334478C64351FEA1634388ACD4BE57E4ABE9374A0E999B770CD81B1BF4A8FF300C297B116CEDA1A4A1C1BD5A2275581A0589A46142139FC596A1406D16293076527CDF9AEA2D0919F9678423B7D95B153DD1D9D62B72A12F6491A36604D19E7BB83C476D232769425557D3480623D40B7AC27C0F67D4ED5CA4D487BE915A68352DCB03A3929A4BB795248EBE2FBE0612833D9305A0A31D195718BAC193FC59B880042A7F61358104A919C7E7C210F02A856B8B1057DD8527FD4AE1EA81F9E1BF7C614ED8A312C95154873F86632CBD60C65176F13CAC695BB4C23675331058397D6E96E4F9DEEB859E3937553D94BEDE3C2B9A5EBF00964A49AB294BCCEE09E5A97381D2375941AA775A47F726E9 - -count = 45 -seed = 8BEA4E384E73C7E0B47381B3063334291A0F06D28DB61B5BF65B01D0A747722E0AA62B81AD46C00C8A5C31494E513836 -mlen = 1518 -msg = 047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 -pk = 88D9D0A16C5EBF7A0B6E40F55950417EAFB27884437B3B90773C33BF0C4E0312C82ECEF91D1215AC28244DC09AEB91804D3B688964A1BA9371417E61D9989726 -sk = 88D9D0A16C5EBF7A0B6E40F55950417EAFB27884437B3B90773C33BF0C4E0312C82ECEF91D1215AC28244DC09AEB91804D3B688964A1BA9371417E61D99897260200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004E44CAF10A16CBF7D188A4AB251EDEEDFBBFE3FA14A2481E7F01170235654AFD027DC9CAC2E9913C8DD665E5424003000000000000006790A634270655AFB5CD078F16312DA8AF61EA2D6FC8433AAB010945140AF11560619D51EF6266E0810897344B42FDFFFFFFFFFFFFFFD78C206AEEF292004067297043B19FFDE071E87243DDA7E96AAC4D507993F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF665175A2FDFF04D6581874A033E624946BED769F9AE1BB897EDC713380DB020000000000000000000000000000000000000000000000DC3C4DA9125A385E6F966DA9B23DA112693AB94EFD8A462F0A62BF78F1F9C330732BD1DAE45EB236647A72BD80997986F327687C1957CB168CC0E4CD73C6D02C3E45E0C47F2E9F46CD141FEF41DE9E9CB45CABDEBE08AE85FC3E9F2BCA170C1E2DEEBEC49C324381E09942052B2EC3EE4B9386C994E401A3E168E0797142370981B0C6F83DD0EE2F3BD002262B82FCB30028A3CA1E4705A97580A9EAD1A8DD3062E4F7DA230AE4EC0019356F5353EC3C676CFCF76462ECA85FCEE28F49AB23176C83470AC76696FC138559A7D4D689116DD293A3210A8F2E75C2211D936A640D61E9D890D36F55383B35706D7C00CD2473C633C2E27F1F5244F887A6C212F2331B46D029FE3A746D17D79EEC072A5EFC4661BD254763EF86C949C4F166FC4824271B03F456A8A8159DFE6BE95397D3FFFF3A397AF13888EB0E63550E3F0D0617F862ACCEA7E0E801C280C7ABBEAFCFAFBC28F1A91C4FC5768F8154C28DAEB905A41D6424D77B089438D20C9D3637EFCAB16CA38C6B09F0F72B026FF62747D126E4478F730CF30A3113FD43DADD64108E308EC0C248ED6D12695C180FA071A11E2102A8A112F4B0CC3FABB4187EA5E595BDAFCC777FE0E627602C4F033806BB28 -smlen = 1695 -sm = 406E109C1F01F2ED9802600FE270D42170F62E07B3CA9B11DCC1628F6F01BE804860A7D20D621207C0FEEF310C3622B6C6046586F7E7B4144E06F7043F83E81A889250C23C067364C2C98A0C2AC703074E02CA40168F23923005F3BC48E02453FC2145039311F1BCA57E8372DA03933E772C9B64AE65BB07BB23398B95B5A78A520569E7A63F6D17BC0A6F030115CA3D19E98C1815B514A98174632CB80103B8819069AF8EF9D3ED06F06A160136AFBD00047E2D484D798B3829CA6037D6C1588A2349DE09C5DDFBEC987652CFDA01454ED791DBFFA3D9DA13A35230ADBE1B39B042E3C70589658A03F75447C1CF3970DC10FE5A4A9E980F2A33B642B42E5E66E9AC4E7A56888FCD72913A79489B5B163BD37B8C3C8D242FFEB37D0C1ECE21034BE9E3685798C2EBC6B809DEFC02C6F0C2A3AD70EC0BAD12D57ADD63EC3584CA98E680267FA514B34DE4147C9D901B59914D49CE9E0F885855ED0CE7973F3307B675408F90B51C6A4D38A414D970EEC989CC7900D7723E19ACC4EF743F6D39EB1B563B8C13D42C0056B6C49732854925B606467F7BC662D17B924FC65E9C3CDC2AE73FF73040011A152B05ED7F96B2FF4CC39A22484AF72812EF02B08EF4DCB64C8936E74549AFDD5D876027FE2B431E61E52E8793888473F4C1E5C1BED2C4AEF8E5E300A735B302474FC6F54869984F1A62DAE29C7C9A0CCDECAA55FE137BA14B5C5C121E0C5EB33B035E01F3415529E0826B27498D7A71B0C086BACD140C02A5948AA54799D0DD0FFD384C7E68578247FA28D205B18ADAC94F7D3C8ACB7DAF71AEE347B577D97EE8E7E865CF4FC1C16640AD1E9D0192AA13AE81A71118408E145B6121ABB75B4BFFD1D403057D4AD5CC730452475A7F067690BB81E81E17BA8DBC31059969B20D387BA59CA8CE499E59A65C8583F29CD539F4F75DDCC68C7BBBC43C849802D8347143E2FE78C1AB6D7AB6BA9917301C88386B294AAC995C24AD680A8C3BDD7AEBEF21E84F5A1909A2D83A8DFE46A75F4B2B47614CD39BF3CA3460DE9BB5C37EB7349A17AB32214D031CE927806FA394470F407673B0CDC3D9A7E3749F09CA895D464A4269682CE6DDCB8FA0EC2F05372C73DC3D06FA6F58090EFBBC6D619A7A565D4EFE441AD7E018A7F5E1384B88EB4506FC54E0AB0A8B9EE3641760FFC08F6BDA78C12396473D1243BAAF6AE10316213115441C0B65C7E475B4E1578D066A47D9C6E92FA32D0F2C365FD15F5A2E88A81691F039DC642ECEDB6652D08ACBE64625B46083CE758FA96C142EB34477E065AEA04A45FF4FCC3E3D146ACD7041F5F7E4C6B26C8205BE7B66DB46DA55556CE02B48AF55A4710BB28B8CE102CB15C1A4AF59D9A17A2DDA6E2D1E96987F6AA9F4216D8D5E5CBFF7E2CB775E83A776063A4AAF937BF0EC84149EC1A7EE21F735D21625E85831B80DC11EBF04F30B13E3A7E4D4784C5F8C61C679E0B6863958F42ED31DEAFFB4C272A3731C1407445CA7673D225EB6509469DC6C1F0AF43EB00F18B3A210AA57D51169F2A9FC251BB338ED4E9DDB19282DCE871211D26482E13A8D533DEE00D36FF5CEA98DEA72D9F0B32DC398A3D5537A3373058FAAA3926C127A1EC739FAF3D57CC1A05D578074A3A72C3F2B1692C2BA1F1FFED943E7BFCBF1E664C4F52F7BF8D86174CA8910C290C06804A7748DB21008AC43E653D7FD7E0C982EDA9356F68DDEC26473956DFF281F7B767010C57F4AD09A05063A6B3CE078DD32F3DE1F40526C06A2D60E36E2C70502D5BEBFD2F3BFCACF8720CDE1657B9892406BAA3DF01E59313EB655B6A545331EBA01BCDB9C99E4AD7FEF7438AE8715FBE589A2F99CB9CA34B9610B3CE5BE38FCF979240698174348417420AAB069B8AD5F646F82958A136DC9F2F81E601056BB4AB5E10F4EBC4A00E18924C51D0FD104078471C6805C49D92C78C832EC3F10D8966E19ADD3D3B4516E12DAF4F63FE6BBD228062DB743D1F867800854F7BB7FFC2CAA0D01A0BB683E368673A8E664BBAA17A8C0C04BCFF05246F9C4F3020510A992EF26FD0933BBFDE9D042862DFFD33A6465F590A2287D8154777A89724FC3DF9F2F1B1ED8765E7C7B761CA4781006822065703ADE07A6E874E70928E1ABA29EE490690D24F6E73D96B85FB53ABFD1C1FDE439279E08FA232043B2344B267CFE5901C60E7CA14B0C85EDCFA2AB90F341821D2B4E25FE23129F2432DB932F23B5957706A433B308FB918D1C8D81EEB399BABE95E7229AD41F30460CF28671A4508B0BD1C61F48CDC23587BB9BDC6F565E76C86547CB71396661BEC8C7FC2223751F765C91C45C674C36B49AEDEF3DF2537F888904B507EDCD89155D40CB81DDA74376BC9CDCAFF8A368F1086C99EDE25526BC53F95F4017 - -count = 46 -seed = CFA713E4A63A6FFBA43BFB898956DC400507F68AD164C3D24A67B5F8D7548C9DB44DAA43E5E4A0990325A4233089318A -mlen = 1551 -msg = 6A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 -pk = 628CB55F3A3D469C2A5E163856C256C0BEB61775F240D5F3750D2EBE5800DA1CA586BDDE31186C8FD07E1FCDB5AAD66D9D7DE458C6BB39FA9DA46766B477F22F -sk = 628CB55F3A3D469C2A5E163856C256C0BEB61775F240D5F3750D2EBE5800DA1CA586BDDE31186C8FD07E1FCDB5AAD66D9D7DE458C6BB39FA9DA46766B477F22F020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000276675AE5B40C10BAB0227BD11676134C4D5F3B540DA9F35953CDC15EB627C565E1BAE4EB08A01264FC3F04D7AADFFFFFFFFFFFFFFFFC029EEE4164BB2CBCD55DF730DD5B0186A637992EB48438EE3CD8C961E6B1A08F921ADA283996E34033B32B1CB43FCFFFFFFFFFFFFFFE85B1E77D25E742C1317D27D7C2FB8F9D56A88CD0C7F488F49C4BF3BAB8CFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47065F286D79CCC27D779CF5BE2D55E1BB536930AC05DF90E83758DF18C30900000000000000000000000000000000000000000000007085026D451FEA1BA9E6F870355C9DF9CDD3411C0B9674ACB86A82B4C8B65A23FBB367890F7A57F9131C1E1C27B4B536724BC5E634D8C98B921A7228539FA71BBD1FBEF7D1A7C5CDBD2C23F8439CFE50379727E1FDFF5BCC372B8D91A8582D104DCFFD23CD5FF690D22832171BA040D8E2BE9406666324FC7DF4A20D52F6DD0DCB0D8522AD6322E2BB20DCC4BD6F9DD70D01695526FE2674F0704B4450AB9B1828B26C12D7517D3A746EB1B451FF2CD0F6D7E6CF081F5D7682069A9C731D15022581F3560B12A23C6FD9D0E1EE2B1D75A961BE96616790060DBA54688B0B7F29C69E7677B0B303560A609814D69C0D498BBB98F8F84C4F159212DF27372C9C2C4E47C0974E126140695880D08B2C92E2EEAC6516E856DC1ED9FCA7D3C2061F183F9388ED48B23380E642F9FF501D7540E7DC905A30795787B809CE500D05942FBBF39AAC34F5D88993E199B8574B5A4B0CC46FB3CE9A5A60B54C1C62028BC9082C6510E7292ECF701471AF09640F81A4112A51AB694DDD2E2F046737C2BFC809ED40FE3F08BADCB4DDB8087B4CBA73E6890480DCD5D5351A3DF6B54277C78A18AB5958FFB7C750D5FE0E2BF347F875974DACBA7CFD5B9A7259FD63383C5DEC29 -smlen = 1728 -sm = D061779D7012571E13058E19C9EE139A4A99FC03C09FC1D5FF68A7CB66015A846A67668EE3AE8A07DCD1EF88CAB5CB3D66003937C643EE5E17E22002AFFA36DD51574E27D304CB672C47A00A1625A0059690D3F2AFBDC8842A0270E434F81242F72E6405B099EA6997B6B00FC502E28ECFED79F4EA2CE005AACF90ADD862A9411D0087AF8383F391CC7C3407008984277E2BD8ACDC3B12F71F977839C10E0308320AFB926FB70C84006F0CACA351E4F5016A58AA820275A2F43D0F05DD0EE484AF42B665FFB8F21DB322ABD256A5C753BC8FF6A2C71467922E09726655F1A7218E736752065C871221C0B9DEE6A9D56B78A1C3B7357774396F6980226DCA1F91BA828E06BBF324D5CCE8D584D9D298261C7149899FC9F74D501E920F22AA34706A79213E35914DBF57B9642A42EF0D8226E31ADF89D18C5F3163ADECC79172C95650D764E3729EDAA08C207D930C26DF8EE1291C1CF889283B70AF00C0489175F799273C837B281A5D1284E4447ED72598EFAE23B523274644DA19BC0359BA59E5BE9E5828FF587C335E136C1D789257864D2648EF9C03D1C4B9809DD07CEABD865254D3D8D597587D71E374FC2DDE89C22C2330E8904F6B53F637348434A21ACEAB9892D5DF8FF84CC58229782BED739BFB13448896F7B1064B499087F7547CFC0A49272C2A670A9431B1B5A07284B6749EF834510A3EC0C61A43D5D0EB48C8F487947C4FCCEFCC49DECCB6111D617407C76A1B4A849C9A190310711B102F142F9E9CBB29F46447265E2C8DDB9174B780EB4A51003FB68483A265F2475D5BF6ECE18AF0CF31BF24CDD56583E777C4340086917B78068DFD380466F43D020E285CEED97A467DB96BFAEC22D80B4A6EC0DBB98CFC44436A41CADC85A90B214F00990D7B7010BBE4AC94809A0450C9ABEE5AA4037A44B0B4DEBD264120E762086B8D6F17AFD37086C93A8A368BE97E0F7546AF16D731C21878063E38DF3DCF3ADE6DD2DAA43C198F49B5D9FF5362333F29EC2F13CBB90DBE4E703EDAE9A4F7334A1C5AC60D5972C4AF2BA61B63C93BF719854E615D16BA4F704C55260A8838679815FA59BE08C4243CACC1A584CC1B4E777FCDC6E5A167C4CC9093749ACE4836AE058BE89CCA3221A3F63F07089006E4C44E40653BF262945A640D8C2A24E7CC3529E4BE76286C86CA2089CB8D4684508D1FAB81EAE7D8C731B65A22700BF9009A3190F5ED837EC22F9112383422027AED838F16A7740CF79EC101865D320E380D4ABA745ACC8EED376DC5B3AABE58DEBC35F8E983C92906AA2E3D8FBBE237325302E2A23CB1312EA7F532D64E79B9815996D28E0183EB728A37E19CB219987576C142F4B2F66AC6C7C77028ED59A8DF27F78ACD3910DDFCEB88888B4A604E5D07AE1B53EA6DF6EC2163DDC4BAB422D2438FFA543B22441E50E4087FDE4BEE6D79D90A2F72548DDC41C5AE07DCC87666EA3C4B89A0B14AFE03B585E7CA507E5F29997F2368B0C68C6AB6E344C082BD06AE922CD8089634918D9132DF9CBD665A4149C59BF76B0E94F66481766FD79054AA80C02E0AE04A6E2BE090582171B2A9AF455CD9FC302CA9D1EC837EE26E0E4D0AC8F0692CB9ABAC979B58CA92E5194EBE46B520125BD0B3ED1AC2BD817D3510E33CFD17058F865DBC64E9B99352B6CAF10F0A5A47449BF927A8EBA06D34C80D77A0B00B88B25A4C8747AADBB11BA15ADF9C959B05C4371CD8439FE5028E004A2E1D2F21190466FC7FD56E9BA0599A0EEDD98246AEB4B85994787B7604CB52F5515B42C2FBD4B5E9E372A36CC4E66483DD884DFE42AAA5EE7FAB200D8EC6E3556DDE0F9E9C7346F9967F8F3CEBE1E4D1CD8E6046E5E94BBC74AD3D51DB0DC704F4A4025383F0391B9DA37BCA8EC59E807593A4F040FBB186607280967E5048CAB92215DC783D9045F7A0922008628C771778661E97E9F88EA84BDAA8BA61126F71D193A2A564E3ACDE7ADF2C0B3D5B022EB6E0C629782B0025C9079D4545D88AA2BA27D10C5DCBCFB7CF648939155066518878CC54A4F611AAC21BD3A1EC628D3352F049915FCA55234B9146ECE5F78FBE7CFFB35695363202EDB9EC3501A93B4B6FC81B3DFDB5245FEEC8AA54195262C2467E15506B7D42A7FF61D75998722D0208BBFEA05CE7D2E66900A9B34F44C2A21257C220C03F9D6D7F0312A36F5C12DA20FB5290D5CFBC1DEC7D05C44820885C479063CA88783C5AA128829417EC4DD41CF83A1D991DF2EFDFEFE375E93F0371695E353EF737F4A75106211A5F70C82B4F360ABCD078C9E829C82A6B7A36D22B8D1F6E3101BA009C759FC83999D52E29B387A8DC1658A43EC4C4D9330A4ED2138E035EBEAE6343A76A82849E37141FCE34E9A41EB5EF88BBB9257017AD8696C3847FD77AE103A082ED1A05DE9420984C147AFF927E1950244912079BDBE5CC07 - -count = 47 -seed = 1F3193EBC58EF65E9E396D69220ADB8ADC729BB388A72CEC9028A094F1CBDED21CFB0C41356AF31E0CF66A3B0D843666 -mlen = 1584 -msg = 139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA -pk = 7C9D2320FA733C5DE28666BE3CF624B8B3CD0701973A4EB4AF8469E728E1201574D4C91450BE2971D9CBF85441855B6B2B98F17C86F7853637FD791C3B254206 -sk = 7C9D2320FA733C5DE28666BE3CF624B8B3CD0701973A4EB4AF8469E728E1201574D4C91450BE2971D9CBF85441855B6B2B98F17C86F7853637FD791C3B2542060200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004FC3877FEFCB64258931EF33C9403652230FE43A4AECC3C5C20127F06155652A126BC677F091F2B0B4EA0F461BF6FFFFFFFFFFFFFFFFD832F81535142B398B4B2CAA01E57FF1FF00CDE85FC0EE3BE2FC0DDFED13FC0D31CB50A6F956D786902B49A8D724FEFFFFFFFFFFFFFF8C1E14B62AEE15D9D5D746C461E8D75019A8155D389639DDB41EF0C6F8B3F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE96CA186111EB2F6E95F956C67D116A11F7E51017749651CAD90B4E07E6B0B0000000000000000000000000000000000000000000000069B6BD6394E1DCA71A1DC8A4A34894EA03BE1D9768AB03E8CDAA7C20FA6910B329FE44008DCD86DDC194F0A775D0161ED5F4B4668257270C3861CB16CFAB423133FCA35448B88BDA1693D4FBEECBFFE93A33F42B3222B44C8DB49550A7B9702A004D38AD804F9636EF37E9648BAF269508FF6FCDEB8C8DA4C6FF503A3E6A819ED2CDB0D2BDA74FAEFED1701EE784A3458D6D75D1983A905DCCFCC97A368EF2BBD8634831D92D08F31ACBC07F6AADCA12826957DB4CC9613F9B103387D6F0621B4F40A0B6B5408C1258F69E83B880F7240489EDA48CCCA68C14F4F954F8A7C22C4AE3CD8CD25E7BBD0E1EDC7888DD2F4060BF2117A11A07EADED40AE3CBFF132AB484D6C1F4C44FF241048210CB3C57B59D61F2F1E5CCBA25FB2E50F35005126C5DC6BEE41F50A5D20DB6AEB96E3AFC3BF6C05788DF5E228948312CB67C2091AB4CF29F2A6B468B4B430D43596829E0660D8BDAA985746483C06F39B9AB3DB2D58D66BE59BC93D9E2A3F5130DD30C89E1ABB1640502B22BB65250EE7FA164F1EE7FEE6FA8DF0C69C70BB5556BB0AF744FE49F484DAE8138ED3B29C0FA07E7407F69F6285F56DEC420C05DB71944F42C8EBD9652EE1151D01C32E68B1CE2E5C29 -smlen = 1761 -sm = 512297114E9ACF2AB300AA4B18050E42707C050135D8A2A528D3B24B57055197D5191E3B68B650003DA36A4AE208D396D506783813EE4299FAA242051CFEF7D62570BDFABE00B028CCC42D6F6484A70068BD0F5958B2783AA401EA1977B135703B48B30482144E39B29CE3D0C60590113EA1F5B3911C5004C4CD1E5391DEA2CE8F07FE993E3B4DDE80490904013BF5E77FC6E366AD368126D6A6E4E5370103270F92F60EF2ED54E0064A2BF6A147FC9F01139BA17ED7B476DBB1CDFE3C42B3A57AF5BBCB3BE19ED04D6C3072FDFE917ECB9272D59EE89EF83522531D83AFF8B9934A8423315C350D1481A4B02980DC29E1CB83B76623869649AC40EF297B153B679C327BB251C6E6BC169C48ABA2A439F9EA24EF94656A415C3E86D7BCB43CB3717D54D773F1937DC8B0E02D4E6ABBB1C83FE73F1B221C9A359E454C19DE5E71EA4CB8C560EABF1DA133FF20D81785D2ECD935B99F24840761446C324DF81484C5C05045C0949DF8D0F10F942E1B5B79074B358C25B6EC2B0B42DF65D998B666CF1BC568E7D737F22FF541807BE95ED85A9980E940E24D2C506BB0F9BEE32EFFD85A2017DE694F61BCC2B292595C97FF4C2145E48AF8F0F3D71763B4DB433ED7BDB8DBF8643475FB2B9155F0CC6A0048C5546900792BC01EBA4B06C83A0C447EA0CF05410DE55ACB8E5521829C89BFBC084CD86E7CA3D701283B70F78E1CE9C3888AD2689E0EF5593D656285066F319E155F86C0A71256484F42A0C40E7CF13AF0CF77C6D1CC7231A48538E9060A7863B774C9CC65E321E45AACC002C0170EDDD18CC1424159D46BF99D08A28D2DEA8917D28D91A1D6C409D945A5EEA19413A1ADCA40DE9458FA6BDF1E5308EF9E67E1E90E9D92BF19B5351FC49DFF0A31E035038AAEC651C0F20F276E4EF0EE35C14BB625EB34205516D95ABEAA06A7A3BB3AF2F12236406689BFAB11E65FC63EBC5B944818DD1D53C0E7B88CE7AEBAE581D995AE7D8423778DFE20D6CEA7AC0B1B4EFE2B9D571DE77BD8F71E89D9F6A2DC89103B73625887AB376BD12CE89A65E6280515A44A80D6C32799669260167DA0A214AD0FB803930AB1952D93360B54433CE8220B29339DCF2702581E88952A5A1549DBA11F4CCDB6FEFD6D24522F3207796C8D5BA9D1582F888F2500964F2B975AED5D5AF83409FF9720EDCF5CE3FE9B6B586B08DE21956E7970D8DC28F6208A80F5378ECBC506333A1D98C58EB0E2EB0CDECE0F5D16A069FFD742D1E589F546C4F2EA3DA0A56F984CFD93F5F2912FB1D068F2BD7C1B5E979ABCC62E3A0164445398F5C0208E82B99AED1200D36289B1FDBBF03E43995341AED3AD712CC7C7530C751B40B765073EE4E4CDD411AE543AD5E2793F294320E9791AB35AE1697F23EBFA0280B8041859909B0089C101D7CC429408FABD2E073FCA7F2C2886031E9F6A32F2B596A799967BA8A47E87DCC8854D45DDB6DE39160600EB4235F4E3424D75DDC8CCF041AA05B25B5A3811540EA5B77CD8D7D611A63BEF5C26D57475B28E961645AEE0B9C8D47954FAF634017787A21A671493E7C5F1A4C553E0A68DDD726DB1DED4321DC735332FEFDF2A84C22097AB3552F878E304598EC40EB349E1C1AE416F94112A2CF8E8702A4C3BDE2F58245166550FC238E153D10F90652518B1D84CCD3ED836F150F1FF103976E743137DA5A97A61276DFB0C11D071B240069582265A9CAE4987B6C6B017DCD1594024D7B1336FF141E59936EC4CE5410E1B73BA6FB42D35F8999225CB1A135260967F4F6EF2172D53FA6AB6D1A2E3174B46C24BC103BAF69C2128F093AECEEBE8753EB352E2804EE64AE5140DF1ACDACD8F225B3C9A61264245B8E5CF759CDDD75E25E2D790FFAE8421515E0CD6F279D0080A3F80BB2E0729C0D2626B6ACE31CE20BCDA490C7660D04D1D82E6403000578926C52D8F9A4BE7103D64E0F03E8F148BB2236781EC30F6D8BC827C107FCC40F26DDAD485E6135BDC3BB331BE139A07891717B692E23312D0E5B1C41F30C3B4B4700EFFB481A835AB54340269FFF365FF87F58245621ACFD83B7FCC6FF108132D8966F9836544354F7E216FBBB851F390DCE8A72362F0454730B90D35AB3859763AEE35668310FD501C7501F4599563006AAEE9B636B676F3DBB6787317885B0F4A64171BF19CBF2EA7A625E1563032C196E1292D82C7484817DBF78D8E9E478FDC4C92CBEF48D4CB4F0E6DCDCA6682DC0A56C3E45EA0350D9FF88073748305FD7DF3A3BE8C055CB1C55167560D5C99345BA80C21CE791C4A511E384A02833B78E8AA02B1B877A9B8D806978519D716C611DF54AE8EA2691540E87C6E79EB006569E02745021BDC7852E1FA4177E2C3EC89257618B38719CB07B0BA68F600236167F019694959C2AB6FB39D5890CB176F6ACC3B9656E495C07027E3D4DE781F48C1F1A8AA1B41449689E191E495FF3F263DDAAA8DE0DF6F1A4AA3EF1F5EDFE437BB74BA - -count = 48 -seed = CF5A04DDB5EBC45328F703D486D24443A7692D65AA55F054E3078DB76A7939590A3F35CF1A21E82A845445DD1B64A85A -mlen = 1617 -msg = EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 -pk = AD16DA18A2CDF25A3BB358AFE7E683A0DADEE401CC77161EC5A6967F32BB7C01CBB10B2F62394A451F88C43625A977630C1EC18E173C81C7437B8BDB28A23210 -sk = AD16DA18A2CDF25A3BB358AFE7E683A0DADEE401CC77161EC5A6967F32BB7C01CBB10B2F62394A451F88C43625A977630C1EC18E173C81C7437B8BDB28A23210020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000354C3C19025158921B718E5D2CC929C495CA15D8A3C5FBC8EB1688B18BF3120243758B0FA7D0563380B6F86311330100000000000000C048132E9F1AC6D2311E95FF81E2EA6BD6F0B20CF6FF9AD869A423A5C03D184E1C0E792AECCC447552B1E092F307FEFFFFFFFFFFFFFF40EF537F513D407737291FFFF370F8FA950255047DC5B21E61EB52668789030000000000000000000000000000000000000000000000354C5EE9C47906B19BD148C00E6706131BEB48FD8E854A6C7E8B3F5303D80A00000000000000000000000000000000000000000000004925EB0DD41854D03C4397F0925BF199BC7895822CFCADB92C59E3CA90C1931B4BADE5DEB568D68E230A580D7EABF197BF3553BB1A2071B01C15A0BB9D257D245B2813402820BE628D3FF5B21EF306B19827DF328F758C693F5B4D7EA26B982724A8B6FEDDA1A98C75018D10748D4E618B41295CD773B95D14A3305C3C1C600A6AFB17C8FB2987B66AFF8265606BECC600BF2DE73F6C4DBC52B6163BC880C428013897612FF2F71667B10689BF76AA6C833B8352A72ABF038C90A09254A0F7000C8DDA3868B3695B7F353291C182248EC32A84BCAE06F9E68F2BA05934CCA315B72B5805B7D50D2BD0666105D1C8344C9E7D81245FBA1D4E3A7A294F7B7D0113286C48AC4F78C279FF57547DA6163749AA68A942ADE47AAB17BA547908DE6201FC92D1E8801DCCE100A7BBF0B59B90D09984858C3A4C7C8EB66C965C25D0A80EA9C5D5087541EB2859596CC2A6E9B13115F41328F238D15EFF575D8828D0F92CAC6A9B3C68EB606687CFB6E94715C20A1C06060C8BBD000C0778C8F6A44AE31C06018E06CD502F75685C32317FC700F8D11420F539520A255B591FA706E88E007B219CEAD42BFF908F62B9762FC25B7ADC733D012FDD1400C0F9C7E63CAAE82E -smlen = 1794 -sm = D0B4AA821183F5041801DB83F04AC297F7CF64045F2D2E6646101084C100498A7D2DE0DA05202C019BA639BDAC933FA4E3058F5200A1BC348E51C90188A4D8CF24D9F05A7D039A1FBBEF8CB03AE52501C22A048275823F6BBB00DA50E9C253EB24E4AC018376287BDF1BD0E7F407021A4FE9142506E690066172AE32180D3D83E5067E7AFF8A657B21AE340700FB7DE0930D70BE087F2D26E0B99E4EFA0102E65639AD14FEBEA00604F370693B29AC3E00EDD4DA833528B0511534F77857FFD16EAFB1A2AC87E6844612DBB104B9F32025B7F54E993D65CE85A061B6AC6D70A15BB42BBBBB6E2E21AEA55BB8A556120EB15EF35FD9774FC7B5C2894B747D3E4965B77DD8D5B26F38D413662783DCD332765B4DE534D08D6514CA9DC6ED7F2BDB4B5C437178710B04491708836CF2CCA08F28582107D27AC305EDE6030B1F8AADC4A1D29AD16CB4D739D8F813D47DA715CAD6B5CDE24EA95DFF4415B527DD900442D9ED1CA712C58B206D6E79F8AEFB882013358BC578638225BE79B58FB677277F072AEBCF8CCD6AB61A9D98A3B260E60AA625D78058FAE6028E4C5562A0F3473C3AD530BC4471228F27502A8F8FE2D1F72022103C3A2DEA363E68248ED8693B3B066B495561CF4468E8EBF32B454E54DF1766468AD3831D56EF7EB9C231E999C4CC3A6B0EBBF2C4F22820E256F67497427F53AD22D42C9293DC8682D0BE3517B63C6E871910ADBB3406B6B3B1CAD980AAE47BF9686E80B6E5DF2DACCCEAF9506B4667271779D00B4C1065951E21F2ACF6CF3CCCB8A633D1114CE9D531D94420E4AE496086638F031C0BAAB5722A41A66788D3885EFC7FE1C3DB54BC69E35B7489A0237A37AFE5194B5F424F792CC1D696098BCF327D87EBC50429A95ED82105C4328D0095A9775589FDB6C262FA51FFEE4D99C6D1A68FA661D1B6A0A2E0693D73B39218A6895BD83FC1D54831B7DF146FE7BD2A91B979018787B9904285A35922E22A7F1761BEA541EAF21D74E3A2F3C6F2247B042379CA4C553FD9256DD0C63E4C9DEA60912D02FBE4CE7762069A86CDE02A4E1E311B2AFDE435DA0816ACA659BD8C0650C1F118C0EA3622D72A5E96132F8B0FF8458C757648BD46E58195FAA0FC4FF8FA44238E35A25C9807B6229000EE560D8E085F27375C2F659BAA5FDE302B9529BF4699505C28DE33AB5DC2B8C02967947CD24C6A599ACB5C2D1E7D6BF3BCCEA0253FBE11D8043FED532AAFC9EE1151243BB80B92BE239BC4FD1D1CAFF502951205F2E6393B704E67141E1218963F664FE0759C15E6C0A1B40602A73990F040502867A9EDDBD4DB0E554AEA4BB9597949D5FB32C2E3AF92CF7816BEDAD5EDE1B769C823CABDEFCA1D1B85213C79EB03E065146B58E3BFBE80B4D4683B65AD1E0611372729B99A0B93934D52DDE40C19FED5A2B3DC3030E0B5F26B66474A5CCA6D741AB294BBBA6BE516105C08BDBABC97BDEC2141D035BF6C3A71553D6F6350229CA2626B8B0B56A24F2D6EECE436ECB77A70D747B6A6F830578B4792DE533879B174353424E7D0EADF6BD5A74B36A4E6EA7E39A4215559557BCE7A00FAAF0D1F81016F913A10F3C9F406C7CB53282CA8FD5FE4F5FABB96F891583E0507912BA02709764694296A5248C340A1B9EC3DB0F926F438CA96FECD40C4AD8DAED9B8A29691601835FE14283762236EF2135443307E5F0082D1C2180AE96ED0DD99A6E9172088E8B94AA2952BA5E128B202B2CBC1966E69B6E6384820D9AB624BC71788EA84B4ADFCFAA2EFA1DDAA8855D1DB3F58EEF2D54FE11A8A5D78ED46B58460E6F2FBA6CB70640700A4520AA1A2A9B336AEFB17CDE8AC78D67F194662642A0107CE38B74D731380A72AD4A0A068F09E0878E521F15CE8134780C3FD0CAB2DC2473448654F88BF1FE2020901B90C0ED670866B1BC337881292FBA885FE2BFEF6FE74765CA12372C8CBD698AC41A4C337374587DB15AFFB511D8C224F1743498D7173897FF5B8D070B89592BEBE053D5C10DCE67CA8542781AE749F3A42FAD7E4A2004A565F81D5FAECF11115C270155FB8AF6AEDA138B9C71458D6D2FF63441130EE9107C39260469521E020D2B42CB5A51098027F23890DAE8B28BF722AF9ABA6224E02FEB47E40112CCB164E8CF174BC9AC4C11AF9B482DF9C9F7F5F1B826428C21BE395EB1F07DE511E8258C84F5F035F4787ACE18C190808EFE99FCB455A54D366DDE2E230B575ED5A4A75D57C9A38DDE3D91D0D1A1C4DE7F277CAF23E0C5DD8E3B693DBC66B6BF1679B0AF74A2B9065B64CF0978115CC456AF685B22D85135727A8AAD96338611DC109B36C85A92E4A0180AADD1D25C5B3D4C681A44BACB953E50F994FCF5281366CDEC0CC50976074D91840B5079180CF643184ADCF9E4CCB44328E7BB9EB2BD06DBB7A757C35EC3DCF795A5E05ED250159EC453A1692426F624CC0737F691E475804F155E44293151E42D3C0F115ECEE53C6EEEF69788F7E8E5C422BB102237499F2638244C0C080B3639A49FFC1730EBB0CFD8A46 - -count = 49 -seed = 8C3D2FBBE0D39E293AF2D2CC5A9BEDEAAE3752DFD19CDC1E186D41E717A0412AA429CBDF005445AFDE684656B5D17690 -mlen = 1650 -msg = D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 -pk = 1B0E43F7CF7209AD67C1C3C76AB3C341213559B7A40A2320AE242B5E35DC0D095E4F846D1C0FDDEA8F90096FBF42C1DDC6A5B0E2495435B2149DCBE2105DF628 -sk = 1B0E43F7CF7209AD67C1C3C76AB3C341213559B7A40A2320AE242B5E35DC0D095E4F846D1C0FDDEA8F90096FBF42C1DDC6A5B0E2495435B2149DCBE2105DF6280200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007166CBDC6E778FC88439E4DE1D708340BA167CD05B9735ACF10D13808A619D18DA543BD833735F476EAAB024BACD00000000000000008A62F4782287F2F24B2FFDA7880A8DA5EB5645949A6B8DDBC9BDAC3549D3B0BFB5F3D63831349483C840E096D549FBFFFFFFFFFFFFFF3A99F5590DA11B17994071F775CDC1245D1796F2A6CC57ECBCAB0A36456D060000000000000000000000000000000000000000000000EF082CBB572AD0FE5175EF5A96163ED6414F6426C221270A59BB8023D6D40B00000000000000000000000000000000000000000000006275E18D0CC6DB0A5AC15B2738F6FB007733A1570BAC9A1FC1EC81361947CD278EE2DBF44E41566E64377CCFD4E229EDA148282F3FB96C21D5986173F79767306A4902943D301CB70CA8F6F7315EF86A75E06EEED4E444BF828876B21E2A7D04D820EFF1E8A4E3B45A0FF30F5977FC07815110D17AC1067BBE0B776C6F134027A2B33286F147E6A160C855B179923CBDE289D7488F62FB853EB733760834442A6DF6BEC75A8820E0DA071039F2C924F0BCE3543A708977F3622002202C9B800F48510267101CE42C618434C620A1F4C1CF0B20BC7DDABD465C20881142664A29885AB9C0515E57FCEC43AF15D8B51D185F4CC9F2CD4743FD518CE4917683E501CA24B56C357BA236670209CBD3A5563BA2ABFC47C06225F2908D4E29DA1EC31D1CB4835D1532A6D597116C567FDAFEF46BC689BC06583AA532961D2199E5850A3BB68FDCEF17A125FD0E54D625414E00BB0A97CBA1AA919FAAD81BDF671E732D18906C8C2CD8902C5065F0B6EFBF74883A914FF2E22B822CBF9A34756252E9042BE604FAAB7CCEC571728DC3EFF0E6097F5DDE9B5F4C92D96B756254D6C5D21F7BF6D5D7AE77088C13DDAA82097C734F14370F5FA1D86905823C6827EB38A20F -smlen = 1827 -sm = 4CD62BB2639C5E8C3305001C8DE7725401BAE603D74541D5AD3B57909B00C3DC53576CADCF71DA079BBF6A2BC6BD0B172905BD800CB88A43A109A907079D0A5517CC05A7510421FBE6966AC291751F03FFDD023FE251B3041C037EB401B13598044F6A06060D86C3272C3B6620063281D7B395BD2BBE9401996AD2BF5A8C8ADACA040E36519B9F243C832D02013FD7AEBA09F84CD7EF53D8CEB8574E7E0E0107A12E1EF6B14480DB055ABADE52B95C3A00D868EC985F946F3C31B6CFE4811BA530EACD0ED061EC383C203B2481AC697B8B88BC0F72B635027E443AB1F54478440DE16E596D30A0F1252E0AF54C0F382BBF5655BEA8C6B9A2F6382D003CC7E4D4F223F8E35EC87CC543EAD52E0E1ED956CFB32E8075715C07CA4817C4B8DACE68C8B0DA459271746BE41D6102B3FA5E49AEE8D443E78AD3246D0B9BCCF6AB7CB7CF72B8A847CA16B435F0618594400037179441F3BF524231F747D920E86506E84C61D4D038D42E82D52D97ABFF896C1DB1C646807156324F7B68DB620EE435C7B8C9AC8B193B7C892565C3631E297495BD3B59293F9A9CEA5E29E23A242B81DD05C8DC9DD669424573298C85870B109C7B593BF864B56895D81386466CA5CB6071005781FB214F1EAE9672D0D16351A627A3FAAC49BE4E13D552340328323CDCB4703BBE07C2A39D75D7737D5C1BD04355B8694432DFB7CB4F1901550C7D6F41080C0F6A2CC49D63A69243D137A78260C06E7A53AAF4F4B086E0220EBC5361A6A78C9B2EC09C2EA4EC45A41065B4B2DAA866D9BABD71C8E6CB378595F068EDB258B2AD1F420B304E5924EBE273AD6D00684F75B6A31DC5290A37D0F9A848B1FC4A67DD9A4FB1F9B4C6CD45E87FAB4A09129C9AB95C44703B75B54C9EF9E825928ACA56527D79B338C5AC639D0265010F3C085D2B09AEF0E4F55D080FB5FF79F13E8E4E8DB020F4C095140D46A93F2E4811BFBC1393EC24F6B7EF31F13623DF0360B1E335FC42098CA1EFCD0306C5FECCE942F6E299AC9ED81054FE452D3F63991DA42D5680EEF749C02FCBA78DB5F4F7C734C6B4D99AF79711A0BAB723C24364AC85700242878CCA93465F286D5F7ADAD7F68F1D38CD6C6E0575A36F1E5521E420D348D947E745C2355FB5FB0F12DC6FB5E9435CF8E552C174A617151AF8D5E7D469AD5CD741E16EB88EA6D7C5806B08571697D22A525C2E30DFF608C921B955D2A990D9466829385DE0A81875BE564942AE740D15AC0AF46A876426EBBE481738BE19BE06F174D975AE8DFB52A94AF9A77E56267C0BB62169165ACE155041406CAF507146A02FB760629CC4C0E7D29108CB7C779455A3EF359BB6198AC75E16148998C16C9410DFF2DAE5F3C79DA61D371992D4A151BA91DAE8814C81EEA4F78D23871326BAFAA349C8EB57231B590F1AC13F599DF5B39DF36455F05E53CDC4D025410E8F8F8BB74854FEFE0C4F790F58434309D36C1E7F3935D4F896368C91AF95EC2DF292AE3166B83976ABD95089B05B461D4E9171CBB4747F3CD9BAB04E5A3B98095754021229B4B820EBDE63E463F2EE479FBFD83CACC61878773B129CD4B3E9AFBAEDB27C7FEDEC2F2D405B99933FE2C203D9949C567A7752AEF8A7788D2375900E70315823DACCD4F2A674196835C35EF813826B310346ABB16B0145CD70FD0A04611ED5AD0B8DDFCA6EBA6B93445038C3DD23D3D15E8899F9C889AF417E5662D538E466447E514A8897C21FE0BE2EF18948B66EB04051C0BC961FA485422A66D649DFA86D4B3DD504A89919A9928EF96FD467713DCCC1F19EE69CE3935F0416D9C5752B7DCF9272D2DB86C3EB6F4897D94DDBEF7C483FCC66232E535A8B0A5AA4BD443493FE539A32D433D9E89F7758DB5B0606A96455B39F92AA788FBBE43CEC8F1D36FEA3ADFD0353EA5532B49A7286381D985E018E6534005F605BF67AB4AAAFDCC499AC0882FCD9D90BD88053CFDADAF466E536F2FFA7F18B3DC254E42FFFC777E0339181473E2B7FC844B687ECCC0EB543A54211084B1EC06B0D9EB0A0C96B88D6585F414873C13EF7002AF2D47D5859A23D12A7D401FFD4BCF642DB96C70FDAD0CB03A6098437795BC9C7C6C804A26225EAA53F52747F01DB4E62471A21DBC1DED9C4DE2508812AB11F61F6364FCFEED445FFBA549E45E641A80FB4B58EE20677C7D6CF0526DBF4E26D9E5AFAC5429B4474DFFE709D09D766542D65E668D59C836BDFD0F78B846BC412F29DA00291871D94BB5E6557D833C8DB3D9BEB37888C3A70684ADC6B063FEC3D847C42E0CE20E05482DB165FFAC5D1F2C661B9DB6D19FB3E8909587351B25F2C225CB26BB137BC52D04AD8157F7D634F29A3623B4EB53B4EF9A78945280BCA8C5E1882FAE373EAC69EA366E2F13A9FEA75A6B7EB5CD4D9EB14F68A231BAC780F84200146CE7795282952382E2393F0C2A99DE830D3AA517DAC4AC97F2AAD3F7F8E3B49B22B078E3708C9CDD1B2A2A129656066C0030D747EDD646384611D4ECCC5B0B9DF4852AF7BFA94F6DD7584F6285CA2EA7ED3F8DECB534E6D31D7165C609FD9AD235F5AF8E4E8E58FD3D248D822C202 - -count = 50 -seed = C10427EF0B26328163F85D45E22EC5215415326F013FF31EDD58BD3E97B1A72FF07D275D4C1B517F4661B0638F75640C -mlen = 1683 -msg = 4BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 -pk = B9A851C48D07613AF466BE5C507F40C15AC251545AEF8FFD61090F01DBD9D8243FFA3AE2BEBC2ABEE43F650D35551229AB480E2BBD6ACC2CAFBBD9C965DE2809 -sk = B9A851C48D07613AF466BE5C507F40C15AC251545AEF8FFD61090F01DBD9D8243FFA3AE2BEBC2ABEE43F650D35551229AB480E2BBD6ACC2CAFBBD9C965DE28090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E0CB51419094CC1A785D4DB05AF34B24C142D74873EB7121E2721E3BDF3250D4AA85771A47A8A7201214795AFB402000000000000007D38B3DC2EF74B42F640A2AAC11ABDC80D78371042035F9DB1DF14CA8BEB8DEAEEA067E422DC00134434CC98F4DEF8FFFFFFFFFFFFFF2D969FA106506CCD38F61E0E817EB208C21C6829D883ABEDF35A5F3942610100000000000000000000000000000000000000000000000656B83864A9D8B7C829C1DD38255C8633659126233174F886B5F8577A770400000000000000000000000000000000000000000000002DF324876C8E98960E0A425537BFF3D663BF1D7AB7CDBABFAA7030FAC75CA80A649C00D1CD70802950B771BB5E582CFC95FE4C790F16F8113D8BF66B5D0C0325851515E4A0EF2E5AF19983426C0FACD92955FD1E8BDF5078B23AC6F93454CD15ACE2ECB4C6B42E32567B769329EA62C32DC78C1F4884218E12A20B44F23D5430993D4334F46F5FEFCE695D90A3129B3204A4BC3FD50835F03A0A83809D8885191C4DFC1D0B29B81620B049301ADF0499CAC3012D1972A9B3260CBC5AA1CA4C099CC7A92F40BFB89C2F4E4883268C0A2111F3CB7935382C600AC285816004350A971AC2F2F4B8536E8ADADAECE2F84ED0A2505F0FCBEB7D66A9AC63E84DF0281A1044103AEB6B96AB1956FA80A29D85AFE9A122F7CADAF8AC2090B93A690D932EE40B307D3870136004EC97C07A53743DB20195EBD636DF1A1A7AAC9205C9D71590D0C9A317ADA627B66E14F354EFB8A6A03955C5F6B22BEA87B40436ED4D5004B096F03FA989E5A85751E3A54A188A942AD4EE70354ADED58631C490A537290305D54A597FFBA9CD0F59C31189455D5518D5A7E6E9FE1E52C52AC865F6D1722EA1D5F24DCC56A5BA4406A3D2BB112D4CBFCCBE384226E8A9958125F951479613 -smlen = 1860 -sm = B02E48E0C233A02C07008630654894E4475F3704900515C9E0ACD7779C052114A86BFB3448B29C04FECF8FF0CA4229D30F009E8D93DA604897141C057DBCEFB62C17B811B20081ED895BC3B203A5E407EEA058E0B2D9F551D907FD582E54901D7B5A9B0415DDDBB9FA7423DB55004897BD8B7D7B3C76E606066217D9569B3609BD06730CBDE488D0AEB04B04004136A161878AB3CC7AE4EE1044D77FBF0A0314426F7DB90E46AC6506A279DB111117AB004BEAF8CC3A7C393932CD37A2CD8ED790F05E4038ADF1287E2ACDCC0BED9BDBF92CE44AAE95CAF4EB142B858E1421610EAFC47DE566182835BDACD4C836F19BD686D53C3834EFD928487A2AB3402C2E3AB3AF97AA802B05223CA6927722C3BD1FE3F8C20F93C3951F907314896CD21CB99306FD7E5B6176945C2898B10C1DF62FBB2680752CABC8980B5A0430BE39D34BB7DE9544BCCCBFABAB709C11BFFF5C958C8763D8D5830235B49EAD26C834E63C3F3F2D6BA944FD2688F6350EC99DAF4CCCC42C6BE1CB19DD46514D71CB6E887DBA80EDB580B27F1142A20EA0D497E0336D55F1FFD4BB3D4B3521F0A01C7BB09258971D1ED4A98EC052B24776623D7B9A83C818795E3989EAEBA8C9142A97AFCE855CC6AC0ABA15F0546684AB5C2F48B23BB72A88B6AF2BA9C73881103CB6FA99E3B03119EAB03BC3B9BC365EFCD7B9F49A8BAB6A34A00AA8F2C88D7BEBBA808BD97111EBB192D82AD244E18BCA732FE6F72FDE5BD533E4BCCD3F50332DAD3A4169EA85C324D165413F10888AC3B21B91DE09FCBB9B636ED00FAAA669ABF6429B78C3C04F239722F31FB0B1A20CB1A6B553908070AC13521DF66772A6036E6695CF66B9A90E2111E499BCBF5DCD19744F43DEB943445248A5E84F168E7BFEA2DC4E1D0A87FB4140EB7C72D2DFCC27923206054CEC870888A79938DACBAACF1F122B22AB5C9701D777BCF9809CEBC9B7AAC52468134FC4A92C2BAA9B8C0F6249130A50337F460A42CB5364A5E7408CAEF8D12BA6934AB645DE9832818F9DB71F5EB0B158DE6A76619E75245B56020E1664D8FAF1C1782DE4A688D4055E07D842410600E9454E28676D44357853FFA7740200C91EAFA16BCA21D0006F47FE8159A733E0E91549DF434EF316E1DF9BB97DA6A2C2E2F20A65B3C00041A903270CBB55AE2432AEE25C71CE73BC2322CCB8E5BD0E24820616A890B0851D825D79411C14948DCDF48776D72565422056FE75765E50736C82F71270BBCF229A7B7A45DC88AADF4F84238C896DAB889E16C17DB7BE551AB24873FDA82F102D0FCFC139C9FEBE9FA99819CEF0E2684DFC5C843A6D496D8A595D33C51E1FDE9A84059C7BC596D32D53E2FE046F23FEFA51D13F9C28E227F5E24429B851ADDBF578922AEB0C5A61BBB666D11D127BA45C9E6378C70D75643DE776483582E034E81FAE0A3F029C47FB192CFA018CE1F68261D77CFC9E05EF19438E47F3DE9A68C8DC09D07B1BDC6CED69592623750F72EC2FB8C5CA981DFB84B4BF0734377EE9DD8EF5DDCD96F438D30AB78F402EBFF2163D43345EE8CA119F3208E21AA3A2185DE967B475B9ABFBC86465275F9A634FC22015E94A298E9C204E9786CB1FF14A5E99F942D42AB5DF51AD09654083DF0259AA1C26A760CCFDF4A276600C5FD3A54F210B20731941EB48A79435F1F86C45F8181D9758A1835721B87D36C725878375FEBCB8D48ED2CE8892DB50965753A98F4E7110281DB40ED64DD8EB51AB9CE41042589152D8CD5876FF30536F8955172A7A8F5C3F5FFD22C9954903136F781F0574F45F909BDF1657FC1CDCB9C4689F41E462C8D39108B10D78B6892C8775FDEB139258F8130BD1D2A1C72B5026506409F9862AA8729B35C652074494FEB84A553CEFBEED19D6EE94758E800F5FCBCAEC19B6A00F33EB237AAA6FC0B3A08C1D8829C180BF95E7D05F919A929933B7A032CD20ACE82AA5A45E5B2FB09812F36974B5EDA1B387FEB13BD49AC374F821341282C8FE2FB0CC5C075356833FF8CC6B648729A4298ECD73BD0EC73957077AC65722D0BE23C1536B8DB7B0506DAE47C0070564E7D7F9444F47B22C679EB8ACA4826F974A42043863E498E5301EA162C4E96684ACC5CA26CCD083541BC4C1D2FD690E51F07FB08337450A204B0F4F2C17785E037424FD6E78746764584D5F19255496DF1E524BFF0AAC31BDE9254429565278A39ECE4627C023EDF18BC21BB523D44EFC259742DEE9FF7159D5F700D957CCBB505A88C2037629402C2A322D17647E430777B184FF7B4E8D6B94724ABC36A5CCFAC08E2479E8310BCB7A617A25FAC6EFD10D0A07248F7D4597F14309B8064FE3BC4A4479F905E832210D49363D1E5D58176DEC9ABCC0C5132FD6ECCEAD2B05B56C96ECBBEB0B803E43DB2F982AD9EFE1E2A49649ED8E42707970C93615D54A3E673559B996E48A3B73143BA0884E918888156CA78F793DFF990FD721DE0C0B7916A5CED736E31292C5AF062D7CCD83FE653294FAC8C50CF6BA37B37D5A9BFD1E3B92D1825C1BE0795F9B257CDAB91CE99C0C51BDFCD6C0AB5A3BC6E30F884ECB4F1F61A3259CD279205B2C21CDDB196360061758E67B1C3724F5CB6311EB4FB92E6C0D71E6D1EA45 - -count = 51 -seed = 4B6B73E042CE76DBE39535E45D3BB2F3B9F8B2BDA170E76CC88666844703E32B2367460A0F6A0A2E3F4E7A6CD32BE998 -mlen = 1716 -msg = 0BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 -pk = 914D5996263BFDE0CC9844D98487316FF66F5E1040D8BC1DF95E6C0E9F9F020A7DD96CA3925C3E71DA3EBA2B5735FDA117F81FD2B6748F5A5C00F55BE2704432 -sk = 914D5996263BFDE0CC9844D98487316FF66F5E1040D8BC1DF95E6C0E9F9F020A7DD96CA3925C3E71DA3EBA2B5735FDA117F81FD2B6748F5A5C00F55BE2704432020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F8539F7785BAF5DAD6F8155A3EC03BF57FCBE73C4FCA7AB870551F011BD8B988464473B81FEA7E737056F2D2C80C0400000000000000DF7F9B7CD6D25786D08A9DD9347A51A5FEA7BA65D39531BFF6ED8E1862B269C3691A60F9663D5F2E43FC70A90853FEFFFFFFFFFFFFFFA70675A7A4B0D1831524131031AAF788C361A250A5EEF839FC7244245F7BFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5419EE3D1973C7BA2DBA19A0F3DC3AFF9EE49A5B909310E6C70CA513CB0807000000000000000000000000000000000000000000000064A85AB5A9AF7AEACC3E316710DAF70CF6D4C1215C34CD1249C01A7955069901BFCC0D2C01323604F5C205DD5BF3CBB3EC6221AD0D60BFD6091C0E639A8D3220B71900648122B6089E1DA5DDA3D2A4487E78875CAD30B169818DD48EDEECD12D854D09D963F89B3E1B46577020273BA3BAEB9A8A086C83ACCD06989E3CEEC530D462D412D5A8C1BA3F5CA6EE338729B3B679E9B0591D9AACA79E05DE7C37D902FDFD2A6AC87A247198B933F2F3DC7F93343D942B7B28D077EFC418D151D4892D786F3D913E8C76FF39B4A78BCF1B2DACEC995C87B90621A4F618B345C9FC2600A1D1829B1E7FCC67A1575DF0731260D0FBEA32137C588649E8BB06E7AB3B7D17C85F6E8D885447A9889AA9F18AF18EE9B849D7104E94CB34C0720BC5578C0D30916BC2BDC1FE6FE760DF22992CDFAE971F2E9D90E1CEE33DE5136709D218D40F2FF33FED3236F915651D9D33E097B2B6F5D1F6B6BB8ADBDF4BD677280FF582099DDE07B57A3D03A1E594F29B63DA2ECE4FC30D06D436AE2C6CA01E99C531E323E64DC33215330FA3C8F931D5AEF464A1530C5F409CBE25C98A98624DF89BF302BC3F4FB9B77E64658448FD9FEF9FC7D0F8C67EE60816220CFE1C648619B0891E -smlen = 1893 -sm = A69CD77C5D80902E8203C859E1A8C039DF5FCC07F910DE9D34958B09C907E40FE7AEFF02122F1801E6EB865C910E64008F011B88C9C8EC5F5F405406878866CE2C2F17F6B3029F536B17DA4D8DF87A078E373E96F4AE716F11052FC3C28E9A2892D50C07DBC48F4583AD8F8C9E012175F644BDAFB571A404C48736AA501CD0EBF2042099F4DA6574CD6E40040059136A4B91242E45C3184D835926074D0803D4A2020D9449E6134D028E8A2BC2AE0EF1010BF9A7C0F63CDCF3F850ED7C5DB6191EEEFE29E498A19F9D89BE4698821ABD72EDC34317B4F8EC2736DC83C24AC195BD55AFF00E797A83DFFADC7970FE53304F16F5DD92E6EC362B9E283E41EBF121FB2FA2A3F60124EF3EBF836AE51FDD55CA9F59B085DDD660724C072B86041B50A3A446CDB20A45BA65380ADF007E005DF2D9AA16A9D22B11DCF6F0B1964F04F45441A923691A15D80DC85003B9AE281F2B5983DD1A04D80A4D9C4372D9820BBFAE3AF7735E7C71E9F085C0A6E4BC107D9E4BA222B38FB236B2CC3A19DD6067BEAC460383FF2BCC771A7F1AAF092FC72C292FC1D5C6FC6B9715F1E1272EB22F8E0B33A2830E31BD6C531677902F6A95CABC3E9C1AE36F77037A785FEA355137A581FC14E6BD5F1F7AD1A5DD19DEDD448B47B558C22DD0FCBF296A812A726E7D1B57F4688D3F577104CFB15FC63C27F7B6051C7AED7D645186FCA63AD9C2D68BFF442466EFF76BCF0E398D2BF54C2CA4CC614839E9BCA48AB2CC53865803710A98D313AFF1DDD06A65680EB83C640052DB807EB2F38ED0CC211128044D331FEC3E6B0B2F3B675C631FDADE62C16D1719278413EA3F8E54BA34EDE7E73F3D94802D2F9CB9794D257C46679A3F00015945903190B97071F8FB55F8696253AA3F39B3FAD344FB88224F5313B43889B768171895F7AABEFF25E21E525EA01A996C764A3ACF12BFFED08F3F751F5CC094B50B325F8B62C7A5B3256964D48543690538E634E5730354358534B65EDDD44A526BB4B15E2042B6210F503EEE06D00D615CCAD10D73CDCBF5264B526674D85C0ED31BA5EE584F21FE6D13F883ACE4B094768865E43099E54671240E8E2AF8A7D7D22335B3974CE860E7238A7C1CA8A009EB51C8636F0659189AC8EF01C871E9008957CECE0A367B63BD2852BDE8690BD74C6D956435D0AB82F94A90CD00FC840DFC7036B84D51F1FF5076CA0974DB6CF25AF42EF7DC8C30C2B04CEB2510E86FFC510BF4C931639478FD1520AD571FA17958CCF8E37F5F6360030300EDE3A33871E9582808BDA2233996C5005FD0C23D99261F570AD9027767F6FC96D18BA98E8DDFC2B79AC12CDA5F2367B4BB6B99A3E07B59882E49A92AECE85339BBB18AB9644D20A3B2A795240492CE4EAF09D9EF728FB82B1DE7B64B5D391251FFB0699335CED8C7CE642FF1A79F04C3EA0DC37EA101188361AFAD236EB218CFBD1D0EBD784CE27DCBA0266DDEB87B59B66A4F75BB44665643FA358DD3D0B69B49F45A752B5C410E2299A62BE4B57B32B0924A069A8E8C15D754CC34DEBB0D967E70693A6FFA58CF7099C2C2458B437C7B205CC7E815F6CB494080F9EAF3017E5FF918558DDE415FF72E954EBC2ED4C20C8ECE38CC916060D22E582D54F74C6C181C2601400110A683F4A365E45FF1387BCE4E152A740136BB762B03A99FB68F6AB42620B2E3C00FA8D150944230A6330409B27E4AAD1693E2C3DD12216C4E2DDBC5E9CBA68B8B5417A7B2EDAE7EB67D25F4EDECBB087F93DC9C927C33076B1C71A2B83B33870D602562ED378805A690DD2A427D86C2C46BA4741F3DEFEB91A05EACE975C836E52868CFFE52CA92F97DE94768161A3E953BAB6A28016782909EC53C02F35184AA9CCBD5B793B525204B72DEB63E104376893B9452C3F2C492F423CBEF1EC87C85788CF3073FFBBCD67FF79BD038672943AE4BC68DA131DBA8D7B41C83B4E9CFB6931987B270C74919BBD40612F823114E4BB148671F1AA62BD2BDFCC8B0B24010EC112E883AEC9746D0F5DE467ADDAF51F8C070A359108B1F91643071438F098233AD9A94D0FAA665A39291A98D14A861905ECDE4755D00E690429C57580DCB6D51BB6186CE72EBB1FA8413892CAFB8713E89775013E546FDA30AEB8AF9F7155C08B25810C80CCAA5E700C124CFF59FA32E0293ADADBCC7B1A99F67E66B28DA614C5A4CCD706AFD05388C65EBCE07A543D3DC1E5A5D1F307F675728D4C629A04E9E455B4DA35236C677F26EDC622C1FBF29568D509EA0690AF4CB5DBB4E418B6162888E43B458774A31324BFD5EE8D2152E4AD43A3007D7D4AF5FDA172C2779837AD3A09E135DE953CE966727A7183BF77ADFC76430666B526692991D3C9DB5BB377552A7801C548AA63F6931D3EE91B875CDBCBB7441A4FF81F86762332D7192FBC2F7B69A58DB6CCD3558047F1940A1CACD6FA28A000B9795A2860394BF05F0120E6D85F96B1FE9DE14E3ED66A31D747924B6FF2620778E0714AEB34B79A5D935A0306E55C36506A292C5DC568403551907E49A43A6263D2915108916F1E27CF3529D1B7BD1544AF83A7CBE58547F192A93CE5C5BC6D652405FFCB95345F522B2D34E8EE0960BB85537A46121BD9A408D283A125EAA745BBAB04E2231C19AE95E13901C69E5C9C4D70B104478F4A70D64F81269A8 - -count = 52 -seed = 3D4607399F6FCBE074FD2BEAB1A7571239D6BE6308617866B65B892EE65399E14DC7FA612CDBC5F7E23116FA86C3133D -mlen = 1749 -msg = DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 -pk = 806FA65D23671D28E92E1379D067FB9FB87741745DF778AEFA7ADC67EDA16C135B272297B5374C7471535B6FD42D3219979FB92B766E71B8C5D33C1C1646BE10 -sk = 806FA65D23671D28E92E1379D067FB9FB87741745DF778AEFA7ADC67EDA16C135B272297B5374C7471535B6FD42D3219979FB92B766E71B8C5D33C1C1646BE100200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F1ACDDFB45DC65DC9B940B56363EFC8080A20522177C372B8DAD2D032CB27A7A48FB1043FA468CF03A5DC918DA6020000000000000090D76A2557C55628E1703965AE80582BA86844481FEC5DF9FDBBBE7D20181F099AD508AE1355AD646BFD574B23E9FBFFFFFFFFFFFFFF14F5AB41782CA857BCF6610757F289C240CFCB1A448E4B28E63F639B8B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D5EE76D82862B86D04D207319F055DB9D7A2BBA1E777E73025071D8BA6060000000000000000000000000000000000000000000000023B42CAC5921B9978BE1241F9C4A9D2E9DE70C82DC55DB5C4B933BB46D8692C4227407861E0EC2D3FDBB5820F0F6F0B95021B51499160ABE25F2E636986781BB503BD91F771BC64D9CBB39BE871E1ECCDAAE79A1CB694E131D488E5C303E031C8337DC49A265E0E0ABE177BFAA8AC23C691376AE1FDCDE40C6F3E30A0C1312155F8BF42C4064620331378DE1BBF1AF95AF08B425742FFD2CE440C7C7387530EAB18379743F1242A275E89281ECC60A24A5AFA9DF9D4A794F6077F3FDB3DC50F9CAA75A7D42AFE41328270FBF1E23A1BAEAFB317C19B7D2B92946642F5B8470C2450F6226E650264103DD63C78A50ED68D41EC61066E95A284F5EEE3E8312C1267E06036308F9F2824497475D73A28A8DC14FE332E4C965A8274B2B9FC60900BB6C520B441B22F3CEB1B63098A50E58349E51F3B7EA1C98C547DCB6E0271E41FE04064C2358A1854397DADF32E17AC89E41C968D2725C9593903E70739634A2C5E45EC4971F896C23D9561EC3167BF085CBCFFC9E3D79915A2AE89E2A748EE0801CBE5DEDFC04161DD2D0F66340678DBA35A0E68A65E8205F9798C26998C460558A6C82CA4B8C43E2D9A243333D1475455E57D71BCB55C26E2EC91C922D6BF0E -smlen = 1926 -sm = 672EC475C2CE820E0A04791AF71F707E8F0EAA0300FE7390A6D4597627039C20AA581DA33DA1A104E7546724C4A08FAACC06283A6A4187A6D6EF3B0525D8A05526103EFAE00605E9461C367FF8817007D6E00CFCD82B51D58E00FE34C513F79F45FE4202C32E0618302C204B8207E2804854EADDA12BD80486591D713AF0CE0AAB074783AEE9B453AD8A7B0501E3F518FF9232DCFC0038FD8CFFF7A3C50D0012E2DD022EF8C1C5FC00DF9B4C0202198D00DBFC582AE98D8FD326FAE96A1849EFE729A1173339D90C48C3A2B867135F1DFF5B497D05FD55130694B5F9C62D136647D767AE682A0F05C670CEECC03475FFD39E0BD4E45B720D9D7E8DD04E69C969627682AD83F48609F6E66D0BE99064988E4654E3913B7CAF1475622E211BC247B98E5BABA1B804E2BF651713197D8A610CC111BA5FD98A053408AD155DCB756D28A283BF3B20E6F3785DD5F105F8D7D9F2956064860B097C675630EDEE1F17E2EB0B26B6C20E260F9A5915D63F1BE2C74FB0B37013244481A2D0C581C4EE12516E0FD4701E9835C8526A490CB39E99FAE07C40236808F9605A63A5106C19517C3711CA4B9E8EDDC77B242575D904DBE64223CF14A8E39FEEDA9D6C5F9CD0D0719A7EB5EFA71453636F78CAB8262636FF1E136C787E38A43FAF02699C1F260EC45B068EDBEEBBB8A0E08CE282BF47D27A33216856F0C59E743DEB13397656FF17FC4B3C694B189C35E516BE719CDA6542260D1301DF93A5D93EE118F7CB0AC94D0364C9EA66718A4BC7F3D7ACFFA60AFB7100F7D97E98DFFE167D1D8E46C912D41EA057362C13B078CB1D9C443C1A57AC18C4566F5F5388F47A40CA49CDAAF34BD4C9A597FFBF7AB20D7CE88DD76A639E09ADA323C588B08140E9350268C1FF76079093A05CCF5E1613A70E6E37CD257875049A767332E5F7420F319F9AC78F97C0C4FA40B1EEF8C8B48045C78F73584590FE41F9F274DEA838DE75DADE66D04E9D9308CB0A9948320D28D9CA8F1F51E39FF3DE20FD5A2A267D127C317ACD51FB779E597A8DC7359D920548B8BCAD761C6B8012304E12628A2652D12A8161E538C20D582BF567E9C2B46B4CFE2D2DA31120C6DF50DF45C80513AA9EEE9F2613A221AA1D23F861C7F26AAC7813B7ED7278EB420A5C44F2A5879A2F1F9F11E14602762E3389B152C014EA9DDC9DDDE9ED1D6F74E7526F690EF37E71D448342C012E032C00E480A699ADE617434C12DA0E69139D0D9036743B9E2B9134B5086FCB96B193330ACE8E4F77148AD0F532E72E1792795080B54D7172FB9AF1972D00AE24D0B3D86528675B3BC8C7B80598D855B95A77667AD0F671F00039C08CC99F5644BB006BA9356B9C02BC935212C43490C741B0845CD7B4247592374AEAA1B589E670AC62777293870963B5132DCC27088F5DA5B831FA570766FA81C2A07B88BBD45B81992EDFD2A7FE934219B1F648DD8A414FA03EAFCD39E72BDF7D4F6B9C1F31A0A67DF03F6709F2BE0E7D1B1690C92CE7B8C6B1054270D796B16D6E445D24CB11229CB0F92DD81190A37838951AD28BE2AEEE6C5F63DA60A911AE0A24B1D05EF2F814FB30AAE8CA3BD9F01D4FABE5B279142AF948B0E6BBCCF7560107C161C816A0D8E61DD908445079BAAFB78C14F68B8B2BB241FB03C237A4CB250911142D0B460ACC75E6B0F58BF28546A4779EA7342238826F636A510CC9CFFEE8BB0292A58A07694C05672B560B26158A8566D01D0EEA0773E81F3F84376B29CE375FC56A0689A7CA5CE94B91814B62CBB61EA2EFCA0CE6712A941D612B0F700C56B46D464C2AAAB3F64A89CAA8561A1DAB2869D79DA1720274D031946C4C7715FB9C243DC95CCA7AECFF55EBA4044467EB922E93F57E3E39B93876A03936DFFDD2AF48D055C6C188F2F229812EC94F3FBDF7D7DB62E4274DC91718710EEC2CE034AEF266207C5CCBA21552D6FB8DDBEE8E931067010594A9E0CB37250F67281C0A369965367424D454CDD05D3C8F35A15F76B4C8C3FEE42F4C9CAD68849837DED3BE58730B94AE3A5F9146F90E03B4C0836381B3F9CCB5DE6BD2455D241BE9132EB6D4937FF27663F4CADAA9CDA193919F4CB0D0F727F6C7B26E831C3AC8DECC234D79D1B3BD28305E3012A3733AD718FDAB7DD1A6400BC47F47D20F627D2449DBFF10E37A62299E22E408A28A806D403CBEE19AFF6FA9B1814B35B9573ADC86F829A08893CFAE4A0212293447D3086E21BBA28049F3ED383519917B169E8A1B7DD64CEFE0DA643A97950A205CBFF6BD9334180556E84199F0B60738715CD69AAD7C882430578F6FBA4579D908F863CA54D0B9862EEA6ABED31301D183CF465B1A256CBD597A629307A8A890F11C23DBFF895B932E9CD2F5F06A4183D6F2D61117126FCD2CE2B86BB44A9A5B402E3EEDBE4ED1DF11716E91A2302CB72D8F0DAE132E16311C80DCA041694AF1EF63F659959FCAA133D9E5668F94D0489311AF3BAD379DE17793BB3EE8A284529A72CDEC474B3A82D92C6CB21C63017F262E0D7DD47AA5C58F5E23F8A37F00D5438717F05BB974F18A5D3E1CA054EA053C30B34FBFAEE88BC0195F061AC32F5B71B2A8A3ED4B8BC4EDAB40A6396C052DCE72E10768526C00610E96DF38AA70938CF844CF445D8E2BF73C4F32A742812D8C1DB53AFC6B6C0A4BC67C3CF7579702312D6C89BF14E9585D2C624D07FEB4B5B57F8E4C5CFDA69A5E922CC1E9 - -count = 53 -seed = 7031BA806F4D8BC28529163B239E0EE836871C51D2D62B601B71D6F2B69B203C81440F8FFC09C3AAD94DB1D880160671 -mlen = 1782 -msg = 6103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A -pk = CB469F194097C0186196D092999712B7B71EEA101F1457A96AF6EC52D459231C4CC268D247CE44DA3221D1D60307B91ABB21807FC453305D024EF7C10E73EC0F -sk = CB469F194097C0186196D092999712B7B71EEA101F1457A96AF6EC52D459231C4CC268D247CE44DA3221D1D60307B91ABB21807FC453305D024EF7C10E73EC0F020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444A72EB67DA32BE0C904C9AEE8A3E63D04BE7AED433E1E212C3460B311C2EC8AF3D4F3E6AF2488E0590E23BADBAFEFFFFFFFFFFFFFF87ACB24A919257A8F794A40D18E648C79FBCFC65DEC8EB538102C99305109A8E21041DE7395CBCE179B5035CB02AF9FFFFFFFFFFFFFF07967DCC4A7256D93CCB45DF4CBF0BDE51AA5CD620CA7A88AAD321FF07D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCDC363EF92A8156480B5DB1C8ACC4FC0AE860E1642B0DC8234FDEA8215C000000000000000000000000000000000000000000000000F7690F10574AA05A783E64FCC350EE544077BA831FCE576A957A3FF2E6DB940FA9165CE3476105B066ADB2821635F2D6D164DE9856F7FEEF3D78D30A55E6D2067C39B69F46851D1D2A701671BDA8CB286445BD5E85A20D42EAC11CD3730C76176340762D97683EC97638667B39C3651985D232E36620893F221144BC72574D2EFF99F942986EC06787CB09BC102F248B3E465A73186585B88422361514181818411DA136DF19BC363BECE9EE3BA28FA2782E20FDA2ADE7B524C6C41A52793B2A59689344B222A01AFF85BEF52E0B6558A49D86A682369D3895EC47C113812C091FE69F064E769A3E6D5ACCD044D77A8341D9ED8657C23FC064FF4124A1CA55257CD25DCA2E872CFE82C252117F0A5AE379686D69CD19E3B3A6471A6C63F5962F1FDCDF59BB8999AE4C3C52BD24804EF0F966194695F76C5FF0A4FCDD317607233E8EA0857E0B02BB57A7545479DAA6460D55924975AD0F5815509FF2F9D06A19108B2DEA06ABC5CF9E1A7C1D90E5A9468BE662E3C613644675B0A1B95A43213068B2E57E32015EC3C87FE8F8BB0A85478199A72AD8C93413B3F429D6E0724107DEFBC54ED24FDBAB84A8EA74B924677492407AB684BF52DFD53ED1038B8B2A07 -smlen = 1959 -sm = 3A8641A09DA196BC5C06725AE2C4C4082B81F101443B4266CEDDF4E30F04BABBF9BFB0478CD87701A46AF7883EC9798491069CB08A361814D5B08B04872E576BA94C39D67D01B929C71DCE4F38554E061E9DC2B4C65F275B890261270570FA49DD00DB069A652168EF7AF367290637C187AD75F0DC57BD0687C76D24F3CC76923D0362112AA0ADFE8EDDA10200E3BEB74F445402D6CD089082DE33F5250903089EDFB6C3CBD3B7CD0738F74670CCE8DA006103E5B22F934203B5CA87337095C9A19267AFB9695D309BEB8A557BB7CC90332C4A03E1D416D397B945B607268F545928104CFFD71B02864E010B666CFCB68B762FA5EC839B5AEFD0407419441B38E6D881BD5218DF73C675DF101BF2C53D90FF86D4A3C7DB19EC9CAC044E0467A36337AAEEC32217FAF86CBD7BC2B663421754CFF1200A8A66E18F812868BC8D1C8CA495E6462DA4B8B96D4167F040F04927A7C27AD35CF174D42684ED55AC80D14CBE4CC2570642DDEC4F44880D967E9AF77EE27D0D3DBAEC9067FB6FC957AC4A136C1D564E17F59AC4938D43FB9050D810989907125C47FCEA6C162C723E79F68339CD1B3BF596988BD6E215271385CD50616868C6BF40FDC34BD30E5A00773E2C039723F2AC3A3FA45F4CE870841762D7435BD6CCC5FD3D58FE059EE455A806FDE89155C84797FBB73691A1FC6921859E99066A3239E31F28D1A46100DB1917621D9E61473CF1E71F9850B584B459D5690941E676A7DD56796313ED9ABDBE03DC75AFC1430DBA27FE0F8DF48EF7C339F462AF1A6D30A5F8B480DFBBE860C4C0BC136393C8FA0875AF454273C3CFDBA7EEA44EEF1A4060136948CD98B9D2C19AEA4934F3455F31DD15BE6545134F17A195B6BC409159C0975E592A15E86CA4943CCACF4B46719A072DB8C629B67768F1956F8158F179A0B645320489DEE404C8D0C4E786CFF39B324053F102C118E7D51173CEC0FDD017F213B2B07AC6B2C7DEC04172DD5396A020EDFB74ED86FC31952D241A7C3D139DEF543D90976AA70599792E73CF73AD0BD4A359BF60DFB2CE96A784D8DE5E23A95E831CA6FFBA6B187BC5F29A7757185EC06AC882572EC6283A1875B54FE4F295E1970BF311DBABAF9F894D3364D68F529C4EF9030AB934BCB09459D5AAC61919946FD28DF1AC85876F979E8B8528E9BBE69F03DEEF136EEA6A8FC86F31BD64285C8C9F49ADF53A8BAA7867CE52E72DC4A63929DF3BA2662DC77D71F88D8AF42B8D67AD54884EE11F5A6B3B794F7D5610909B0B740937587CF475DA903159994A262B6F32A3D1723FDAAE65E636B71CB0EF0A744F359BF08AC8231ED2970CE8C451266F703DA3B57F85ACEED4C1C174C50D9C226F028E972AC124FAA6F60518699CB4C499220EA51A538F9EDE67D0E98E1BF8FB4B24B1D8EF50A28A93E20076F8FB812CDAB04871D331FF434BA66DD4577B18DC3F471B3E96A174B58A7AC2470EB8463A71FFCBA2D064470FD2D4E15F9491DB09DF3E3BA376A3DDCC437312BE5848DB3B9079F2AE046798473BB970D725E1D7C6FDF405AE387DD7CC1735A7FC27D1A476592A514B87C9017E1E5D37E338F37916F3C72C5F2AF75185B88694D4E8E0A93FBF20CE81A7A0C10D55737B6473FBD92BBB39FEBC6167336BEB9C235997796B9C0DC18C353E80305175BB412ACC29E647813D0003F727ED0577A7C14BCF67173DA569320E887BDC8F5AD27FD8864261E802A6753C6F9BAC844B5900ED0D4274C0E6EDE42367079188B10BED5999501164FA4C5A818ED6EE229C3E0E0F7804B19EAF5D1132BE1D7FC18BE834C842B21F8DDB11F8CFAAC10D2E124981ED698EE7CACA211C5624F09C62E1D451429048B55ED0F8A714BB77A0D4B40F0A446EDDFB27602B7BF894805C4AAD9252658F6B21A05DC0CF6A3ACDC227FA867A4E5B1DB63A14DE26A79AACF1900A7B7D867C15CFD1DAA712F2A1E2A6C7B31B121465539CD0164E3CCF79A978B543AE9602996448C6F68069D044FC958911EF40B0B9AFC78ED014D94571F6771EA5E2306A7CAC32C135FEC0BBF1DCA3CB0B57DAA239C01671718017C907048E0D19515CBF430D4B3B4FF4FC9A391D15A38B39C4E528FAC04EBD3DC69144C98AFA75102D21FF961BAD2E1F25562AF92554814405C4EC08DAE4A0CD28BE592C9C9BF997CC0FE31502DD541000D4640D59654D26CA2A17BA4CAB0518EE097C05B2984FFC56E8182368E216768E0D07E17FB64003E95194D04C6E00E08386084FEBB6CBC841E8F3FE2A069C45554BC502C27591CA3C1DC9E6B1694BA2C1BC0713C1CF738DB22FFEEB7443D72D5BDB975D192976A58AB33DB58F5DAE497A0B24011E15E3256FF124DD99AF6FC300D1FECDCEE18DD4FBF25E901125D4E80EFA8E2A211701B74FD992E63376996994E054CC00E7E1DE7DB8E7D2898A735EC4920DBEFAAEA66B456CF6A12324C5D56762313A627B3523AB1E2C1C82E4FBAB136AE4395FCF2672A58011D96BBDCF2A7478305756D66B30A4AC44E48B18A5964AA89F14187EA114084D52B4BA77755BA04C34777409BDB782B7B645E93B4DB284525E2F9C9C38D73B475DDE2251277A2E6C3183D5DEA78414E22CC8FB4B2C7EFA797CD4A87AC81D3242EC8D2C2EFD6BCFD69C39F14B0B365F3151A96F75454A3A1400C76A4390FE9F2E7A22A0CFA687A5BEF1C905D3A893B0DFD35BDA184F25E62FDDC2A52B6A67E76F550ABE4CC8D1D63CC8631E4CC315E46D3015C3B8636B92B8D07075D401C654FB4A - -count = 54 -seed = C8671A5D752CC6DDF075C899797603A625C142485EAC3D57CAF14F2244D7F84D116B28F959912A758E519D588A6A07EB -mlen = 1815 -msg = 3EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 -pk = BA157721324B37434409945CC18CA52E584FA99014E15603F72AEB9A3726EE1F2246DE7895B250F048F1626A7C0D9E12CECC2D878AA577C52BFD8AE7BF53751F -sk = BA157721324B37434409945CC18CA52E584FA99014E15603F72AEB9A3726EE1F2246DE7895B250F048F1626A7C0D9E12CECC2D878AA577C52BFD8AE7BF53751F02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083FB4BB2330909244ACB38EF44D3B0424C01E601DD0746136DB9AFA7C65A85A3841C6D87D5A52BBB539F29256AB6FFFFFFFFFFFFFFFFCCF8675267962BD7FE85EF39FD36CA0324D3B37A686045E52DECF72427C276D3F661C779C315CE792B50D04D3875FDFFFFFFFFFFFFFFA01ACE459639A18F25648BFBD4BA7EB30279529196B2D98CA4E0A0AC783D0C0000000000000000000000000000000000000000000000C58E7E7D40A14F124A34537622FA8EE8666CBDE702DBF41F775F41A6DC2804000000000000000000000000000000000000000000000063547110592618B5CB3246DA1B969DB662866FB5C08EAF61EDF7E8BC4310C303C8665520FDE223098828ABA15BAC6734B2EC061454BC403F6463362F0D30631ED66A0F471B3622CB00A83A3824DB06B64AF0AF7535D2BB2B4C79533C3C87D313DCFF0406C4995F254C4102F697FD54A5A909D69D2C19AF886AA91390A068662E7DB66174D42BF36E1B506CDAF34CFCBEAACA35258AAD9CE65A5F9FC85206972F7AED5B6FDF34BB7A60FFEC9BCEEAA814235A59BD649503FF604123979D2A69166FCF2A92E76DC0FED377B2701343B30FA43D21ACF6832B480C29C2B2CD7C761275BA0408707A67998FDF49CCFFC0E17AB150CEEBB3548D34835D20E77E36B6009D1A5582CFB7116D9D0731FEA2A19F9DEC01792C1E2FF6C705372DAF32303710749D30A1F22DADDA4DE3C986FA092C3AAC18F569419F71071D8A992B6E077F0CBC2409226CB8D103720FF1369549D56F2B1F642B820B8C2843612191E8173B327383DC05CCBC10FA4F2EC728C122D9E85D31DC6FB887790E6642FE44F8CA622A5062BC10937C59EFFB2C3E0DE34746C281F1154871718E49A5DAAAC3D944560E9CFAB7C3F533D019064ABDF4E4F477FD2AA3F9C0082970533CCB60AA96A47C21 -smlen = 1992 -sm = 1257C4E2BB380D4ACD04C4A9EB59D8EEF345F0025918A9EA28B9FF9B9302B268FF1534A18D8A73036BDA6C1D7E74394EB6067D33B4FB0C121D2126045D05687B03DF6F00CD006F362896BB96B6937C062F750073D136600B5201A906CCBD026490A61F07EFCAE6A553C65550DA0173AB6A4C0789BFBE4D03ACD5F0E9D8A8E1B89201D54E4076CA57C1A46B0400D7EC3312F529F96E727A7C0249FD8FD408036999B4433DFED8BE1B0397464BA2AD061F003EAC87B3D642CEAA3DC904AC3C4245CB2A260E4B74D0394D33D4B71024144180A727F80B092305F31B2526998EDF6F98E46933FDAF0E8709E98D54F13C2701C58BBE35292FD3334C5E03D345A9A2EA1E01B2C4573567FF1FF3BA7406A16F5A5805EDD760AC78A3AB8602E415F67C7CEA5B36421C79F83CBB14FA775448A832A4B28851CE215C11DCBAEE652CDD7342B6B1204727479E6208FB556CF08BF7EE230F32659E829CE4FBCE0955D01D36624BBAC18C1D25A3E187722F8F74C88B56E518CF0E78B3B0EAC56D8F13C4AFC4DA3613A41CCC2B0B0E2EBBFE5799E479F81335360D483596E9AE926751EC9B956555F271C2CCD85F0F6C1BBB2C326C29B5DDF6B5C4C11F8EED15C0143993FEB626543E92CE4D66C0BD28C79ED1ECB793A3091D6B9AB510B0D41AA42D70C2D8F26EA0B826C8C375E1DD89B3E2A48FE5D88A462DEAC33BAC35AA32EBC010AF7E47B77AD23653D747760914E0CA12864CD401787EFD96F30D82D8907DC68578067703DD19B2377DF319EB540E8AE78B2BE86BEE1C915FF3B2F4B25C0AC22CCF89BD85371961944D8A4E6D20E2D3E9DF3A07D3BF6986898786F0667545275FAC3EB0F069B457D8EBBE5F60125F94756DB04EA203451A0DE160CBCE2A34650D92F200448B097691A61361AC487FBC3C82B2BD7C1ACCA02031311971C3CF69BA459A0B640A702DB4467973713A6F2466560FFAC0592D64FF1D4A935220826EB559CFE0144EA4B8E54EAF67DDF91988DD4B3749C865008C0C1CF98BBF76D929B85C8C426C15FA56706984E0F2E90658FA3CC33EC9FC700976870C94035ECF9A0534B18D07F55923663835416E40235CC2550BD9822F0912CF101F86039830AD9102AA4A3B6777EDEC5EBE621082FCF81A1C6A528F0324EC9D39FA80B6E87D6366E7EDAA0E14337D6708F7C3D2FB1978F4F5CD594FD35B267F9CD09370D3366DCE286CCB9647A1944F8D8BE63E5EF8F6108CC5E9AFE9127DA84E1913439EC35A4E17F7782DF042DC2F7C5CAD8A659DB282E61763539B56C2AFA0F2B507D549EC8C9E76C7DB306380CD7B46C9699B6DB8BE06CCA15E8E83763137B06BFF02DE2738A46C61B70EDF4F394D54D0453DABF689FB6BA41616BC589CB9847224E74F919B6E03672EC6A52584FE81456D6E648DD6F0F9B068EB72241F067BF6B891A498A9A59356C735E10EFB37B3ECF47CC5620A35442DD81E25D2C6DB0E9E871301ADD193D628B30E3B4345751BC17E0B5B05AF758A653DE7BED3763303FFE1AF05E407F296C736CA6F4C348B25718C7A814BD0730AFFC057842AF3D9B9ADB12FCCD740ADD16218AA57E43835821A2BCD70F1027F3042D4A92F10D0A1FB8323E87869BFA8DA24DA75F8743FA3038C24FEDC0C987065421BF4B300BE3ED3F6D6D590968D3EE32A8F5E20EA6168756AA18BB78B6AA48C299C36D0E78B6F84CACAB5946C69179E461F4C2DD201D8032A29EC6C52942AC37D9C76AB4A401C9AFF96284E1E9E39BFF6D912CA33B6118067605EA65D7F611DD963F4F75F97346FFFD1DF84C79CCBA06804B3017775D8C0BF614FCF4D824709557937B22E1805A0A961ECF226F26E3706362BF6D8D1DD30BE7EEDA481A64961641DC57B9F0211F8EE43578E4C2B6507114DFFF3C3F884586BFD1278D117F7C6014FD5980CDF1E2FD1F34CCAD170842B9E819C22FAB9890AE265C3BB6946FCCFE218544D00A6BA5BEF5224EAE24002B6E83E0B35E98C2322BE2EB3D8234BE8B048C54E40782C9A24D7A8B461EC05F38A94AAEF3DA3B46D0D85B0D949CF1089408189FF97C56C7DEE50A004AEAD82C15C7C0D0965F3C65A9A715A65D29CD3614954EBD91EEB4E74F862FBC944C56F2EDEC4D344F92E8154708AD0F5575880503EF0F107A9A9DB99BAE82357C16578F3E6CBDF9B427DA88DC322D11C6AB2A6AE6F5179C94454E09DF5CAA6A519A4C1903C8F2925639E12AF793695F256BF0E55E0D45B73880358F09719ED89A4A1A07868BFBF16095A20035D5D4F99FDA19DDAE3E21CB98308F4508B5CEE706C27898F03A2BF14F29ACBF055E4AB0713A7B6FC1A7853EFD36E1290E69587FEC15D492A66B9A4FEA6E2BCDE61E02FE18E06F59A2F4E06F177B14CE4C1CF1A8D1F49C554A8A4C68B9937B4C230320C80753D4B071BAB2DEDA89C9181820336F1E766E447EA1C44E15CBB7C002C1813D2C1726DB0E4DE289466077DA9610E5F3AA313B1B01DD79A4056A8BBE9D843CE5B0439325FFDFE91FDADDEC6CB86D5CEBB68D8F9C0ED237A4648C412780ACFF48FD9CE817EA70D950DCB989EA6B11FD87EA4F30347A27488C5C15BE7FD6D1280FEA3A7C022F8D9881FAC93176DB2025B4C7914A51099893A791BF5BE851F325347484CA6ED51B2BA71548A6046EA7EC85B31A9967E7D119D2CA3A51C1E14D5A3EEF0D41BDD615DA01D45979007A1997DE281BC340C3203D5BC0075B1AA38873A9DBB9D18E6E26971E70B54E41E2C8C91D2E60FBF85435C1EBC4893C45A201B1D2391549F52A1CA3E0440ADFB746FBBF0D9933F9FA0220B3E04EBEBB29D2A9AC1 - -count = 55 -seed = D780D7688AF364949A196657A066BD48FFA8DC45B4885279B6DEF362E5957F398CDCE1D20FC3F8F63A275C325FCCE654 -mlen = 1848 -msg = BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 -pk = 220635857658CCE6CBB03F469AD8A3570166C81096502587206F7D0331E2581EF7C2E53647FEECDD2B4C360C462B050D9594DDA28DDF47C2DCE5037F49651524 -sk = 220635857658CCE6CBB03F469AD8A3570166C81096502587206F7D0331E2581EF7C2E53647FEECDD2B4C360C462B050D9594DDA28DDF47C2DCE5037F4965152402000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069CAD17F618C9DDF1A6B04E7274DCFE21C9CB59F10B0242EBD6E61CFC4755088DD5B99FB601D1CDC62449D4E8CDCFCFFFFFFFFFFFFFF16E614DC480D33EAB6F15354D5C15A83C92B549CC9040963BD17939E97D953CA849C51E308964B6DDC09BF9F91FCF9FFFFFFFFFFFFFF86A617EA25946C0CD1A2FB7F47E0330F4D3223366C8E8DAD0E1D3FC6D4D2020000000000000000000000000000000000000000000000B7F4DE442D4D0F9FBB33AB77573DE3FCB8EF4F6D885DF454AAF9D835AE8E08000000000000000000000000000000000000000000000047515A8F05156F2C2718D9AFA64816A1F1BBC72086F92AA4546DBD27235474019BF99829789BCBBE52C9FA81D34B5896B4A2E09258E8EE5FD58E773DE2F3A31D7290167C56041B3DA8DB4B6B53170C5D1411A7CC1B1346341A4B6E1AA6695A2AA6E1E0D31CC43A1C46DE963C0C32FD9775E654073E3E6F2D897F6257853204088CD36A1B36AB05D0154E41599B5221B8EAC8F2FA3BBA11BBD3216ACFB8B3F61AE25F6993C00A3937F9AD053E700F43434AAFD8D0CA50E1BC9E189049F4E6882C83653CF67FF590F563A14771C51A0FCEB15C7706930D684B970964B0A4773D1F2A77E1A0611AD29E7058312C4F54778CC613D30D60A48EDD76982E0A1930382F41514A0704E63F4AD01CA803CC3C0F4163EB7212E6631E6FF5AE7C45FDE61B33E5C83C948811EBBA24A999CC9598CA47637DABEBABB6C56C294DFEF5D27F1011988C19655D086B96710300A43D90708D919F4B329D1D6CCD28AE759A9EBA090DB9564C00D1B3553CDE64A0D14BAD694AC877C29A21A428C7D0A8DCC2BDECB817FCDB0ACB84AF05C0EF2C6832DCF83F03F9F5ED087E2561EBC51039B288CE680AE6D378102624F2C5E4DFDAB92F3B4BCC8715D83919AF5905C1B3FAAF19D2E202 -smlen = 2025 -sm = 9AC667A6395F48487D07B6BE2198E338430E5007C53212727F8DC2EBD405005001E43987444272009DC056FD60ED867C22028C55DE72923429F60B01C5CCBE37137033E1600203DE0E1443DF4CB3DD04CA49D6A2E020BD514C009D8F919C5A73BDE1180306E79E8F8CCB549AA3027FB122CA72449E8878013BBB5445FB80EB9D7707AAEFCFF250FBEFABA801010508419A2EBEDD534D1F18E913C326880C034FCA4615A78C298FE5076B0B3A1BA6E5F800BAA4A41E4B68FE333FFA5EE97FD3DE18F0EECE8EB83E46A8E3505E2EF8AEA2C4040BA3809A764B681EC7449F41A2463651A8CC6DEF0E4A058EB843EF016E5CBA8D55F925E66524BE55CB98FC3169082E52E0D6CC3600C4E8A560B6D448A72CCC95620101323F98B43E28D6357414185ECB0263C7BB94E7F86146661FC897844CF52873114D39123260893DEF13516F982783B927864B61B56D3A8E5B4705DA3A95F6D12A6637C9CED02F07B4AA0B08B4924103036C2A93B31C91EBB6C5B77DE090EBF60A04191EB6CE9CC9B550F5B0C9104B74D15358854181C0C5640FC74CAEE14FED6577FD75EECA14070B6D02A9A421247A5BB262D6E62B04649E75BBD3ED8E72752289FA7C1A68096DD96A4BAC8A2DC27C44881DD2416387D74A005680A3D229D562D3DAAF8DC37B4C87CC86A8C991E9327CDD43BA930CDD8D1E44AEFB084B51111965C5DFB0EE2F09112B070CBFC545119ABA823EB3F65F26BCC025B39F79BE42C0396C5FC9FC924EF1B7EE9DDB71B6E69B579C0A64C5B020206CD3515B8D5F4FF29378B9580D282F7E5ECEEB5CE9C09A7B334E62151100CD658DFFFA66F4091231BEA6C9DE8129EC4F5FBE8BE0FF4BC93367DC69D9E38C177B23AFBA5C27FEE3E2B73C0037DD7C419C854DF7C2412349BAB43869469E80527C3AD3A7103152F9E0B03353A596002FF54ABA8B14AC393EE52EB5564D63BC2738D571FA3C255ABD20102BB299441B00EB988F3A5CFB238EF8C49963B4AE8877E6B317E208821510BF446CE6B06C33717C91C460924248382159198F09D0F5A25C1611B2D39CC6D2ED149FDF0E09A0B0B2BB77067182E386F5F6A55B68808DAD98E5CEB0FDFAE6A0315845ACC7B9C172B0E82190A5EB7C58DE4F86D883292A883045C62D6A1B3C886C345AA6158276EFA6B93AB2188E47ABDD25D332146E980E1B1E043CF63EE35A5AA01AB6CC62F77699DCA16FA30E3632DC5CCD3253D01E547746C78021AC307F0EF1A0119AD11504803EDAD933150981C4D9FD181835C507651DC92A86737E3AFD0EB4DDEF6182872FBD31BFC6D8427C2F4D3A39BCBE6B5120B8CF2AF5DC59949C92D10B1C6A96810564DD335E0755F9DE25EC26C102355688C38250DF8F96E105136855C8DE4BDCD86DF03F92977DA16908CAEEB4056F4A5F751A57BA057AC0309F1C107E594CF3C31544E4F1D93FB9AE7E1A2451E7082CF0C850990EE71ADE0498F6A3852DC4FC128BFDB8ABDDA3D759C8D4F83FED8509CDE5EED38410FB9F0A5F30EA45C9270BA2395DF645AAEE03F56158685A0BA65DE3D2C5209A7EF4BDD4BBE0CDC966DD1BDF1FE0BE06C7115F7CCD80F8012E5D17955AE0C9E4220076882F30DC5E391295994B9F809C09DBED8CCDFC89669F40492944FF20948080A4ED66AD8166B613AB2F4414762AE493EA6661950E8E56B3758A77CDBCFBF24FBBBF20EACD5CBF8815899A1C3FD20B1D04920025885388012D9C58EA842DB9530B7ADA901AB9CE46A12700687BDE07FB99BF66D0C775218B8454C936F03558B899B59361A0C664081CE8A7858DDBC5E7C5480280411C9ACF4D1EC45035D97524E9E44F963532CA5067609540C1BCB5627F99D5C61CB9A6D400F0BA0A74E45DDAB5A4E8A765DCF2F3684E3A2661A78AC069FA38163AD9F9713EB45C841C6617697CF8A72C54B550DBE9C22B04D579B09AAB0EF4EE8B70CA563F81EF9700C07761C944926F9A76A8C3EEE1CF7E7524D65908C47C35B0453DC10DB5B75123A5B26B9612C0AE18816A71F34638798DFCA21F5073CE771500034F9A71FEB8B621356C430B4D47CB1B59AD4677B5C679188D8861BEAF52558165F691F65A692E8CB8D24ABB74B8885EDEBBE52FB13DAC16E3A8EBC4EF192FD10D71898E93547C7A09F8642AA3B4FAAE23E48BFA809C5989D3462AA50FD4E5C4095542C45E5600926C2DECB4D18BB43B7274239A8DFA3D9DE1BB9CA099DFE56DEDFC9E120867EFCDA10B48F7E630506AA606D76E4537036127FA05FFFB8B8703CDC8DE70A78D014872111A431F393345D74E8866D9A9A633923072E93DBF47C54C4B205C60E67D5155B76F51AB49ACC7435525605DD43A10C88A03E08E257C68937BF2984BE63D40F8A60589D909F8F09688A77DA15DC7B4853339F235B1BD60AA845B4DB6B699325885C49DF9C40781CC56FABEA6201E2F8A9352C28CE321B9441422807E9C81C8F1EC85D240C9F1C8ECC4FF06D6E3682DEA3E6CF92F2B74C2165AF247CE0F5AB84460693254B523498A57E7442977F51F1C2F649BDF756E7F43AE543F5D8E692820F8A06322667A7FA9C1A5B10199A69CCEA22C74E172FED43E550C68C337ECC5E6AAD9F7EB997A7E619D47DF73CB917A705C3CDE5FF344F6FBCFAECCE6B734E09A385FE54B224A880704D774581074C59EB0A3B42C59B8BA4518E764C5A532F6655DD839862AF716903A118433CE0809376A88E88FA847B4D1C63EE393267B15C1E42A91DC6107CDE990EC9ECC7C1066E9480E90A22907C51AF47DA837438A90CC07DE8121691BD73802D5D09D18A2D8B38A28948735110891D1B559A73445838F359A6FB90A3CAB887486CC9D95CBA35B55693C890830D2 - -count = 56 -seed = 36AB8588F5233D15674677535A682382C29968FF824031AF646F58FCAF0E83C1C486B1E75479149FD6F4D9E8397CAF73 -mlen = 1881 -msg = 0707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B -pk = DDF22D737A6699EE8F2ECCE9C0FED8463B108D8D77404262D8C8B11925008014792200BE34448CCAB8DFABFFC1CF4249EE5193ABB7CAD762FA2631DE71CBC92C -sk = DDF22D737A6699EE8F2ECCE9C0FED8463B108D8D77404262D8C8B11925008014792200BE34448CCAB8DFABFFC1CF4249EE5193ABB7CAD762FA2631DE71CBC92C020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B25CD2E87D2E612F8412073F51A06AC3DC737219B3D8CBE8852FD7B2B6F8F045ED2C1B7664D9AA3C60AE8DBA78800100000000000000DF01C89B9D21C44D5062C038011224FF8F135ADCDCE654ADBC8DFD483FFA906212626D1003EB23DF869509E5E03FFAFFFFFFFFFFFFFFD17C0D8B20A78F3F68AE36926AE9CA97801ABEB8F1845A49FDDEE770A2C70000000000000000000000000000000000000000000000004AA92D263E5F709F9A4005CD560B5CDF0C0BA9D84D47A02665F26DFD0E46070000000000000000000000000000000000000000000000D5F1E4740159D3B3C5FFFABB86B0245592B32E2CBE4E9936BAD1F6D7D985362A957F2712D0510B71F1F17A5848C49D2E3EA95A9DD3BD599E39FDC9C1F3FE3607BAAB7545795FA0B3D94FF69F059AD37F5224FCF8334AB8A32C3719EFDE76621CFE32802C64829A3524E1EDF37FC5FFC22A6F4629092A3EDFBF99304998949A1607712E98F514A58663496B12CDB416DF81D7914803DA000120B1C15CE612B021A6868619149F696BB9E8DF85245A34122ECB37E95346464E673FF3AC34BF6D0F13D420A178DD3B08425CCBAB588B442F9350F434BA538C8BC87A8D89AA387300BBC3B2094ECE124F5FF1628E781F5CA116DF4ED1235FBEFC9B3550934B1D340232E6DD635A0CAD9523371289FFB486CB6094AB4C808863C3629F98A844F1EC2CFE6A951591D58B3E6E1B77275D9B337130D35FFBAD5025729C990E5F773F111F00BF6E4807F370069A2A8C2C7B067539558EEEAD2C31FFBC876955177E82E42A3E81F5EE7235325E7E9025B7168E34D3567D17DD422C553476E0E1F26BA7FC192C561E01F96B2363FFAEE7843E36EDB58CC7E9D7331B306A023B0783396ABC1CAB325AF8F0F6E9A788AEC3058BDFE47A79A267CB0CF2E8760B41F0F421423A27 -smlen = 2058 -sm = 6D0686DA81AFDCA74505D56B1E377F88540E9603A9FDD375DCCB0CC89E003358D69050C672A735028291FCCF4FE75295D6016B3EC4F0C514B29AC4005108562DF7F3F09CDA011F49CCC279B74123260032BC920511CB6B5F33075D1CD968DB0C9465AD05B035CB1F660373431105A3465C36B6233BF35800239FF4945AFDCA814006119BF0201104FEEA1A00019DB52E504FD2B7D545444B2B009D85701002B0B2687B8C2B554CB304BEFD85D39F8CA7010707EA05515798829F42A4CBDDB4A95C5750879E0A584AB503F778015F83BEBF6D63C3B48A4F478EF01091403DDC5A9662E39707DBC8502ACF50F3E06ED0199CC647EA155FEEF503BE045BEA4035C07C4CCEDA306B8187185BD06C14220F2B7401229969C1CFF8C36D499D5A725FA1CE7B44D71E6C0E4E750766183883D838DAE4F00B140E0AFCCB0E72F935018A6314232DC632C5AD3C26919D1A7925BF0F665CA0223439518143486CE92650DD145FDB2E97E0D5BC9D6806F442FE90C9C1F52992E670DB2603AD885FA42B3D8BEA4E470B7F76A367AAA506E931890B6E4607F59E87A7A5FBF3991EEAEE47CFBBFE3CBE028E67BB645D37A7BE5E7CBA6D7955CD62D1D8DB0D9772EA0185C25BC1AD40A09D3E7E9CABA72BDC3A6EF3C40C7ED6208854157914A80B5C66A6DEC2317FB5A529421C03CCA6FC0A3B3D51556E8DEE7C1EBFBA924FE2EBCE8A46BE96E761AA6749C0A9A2B2FC49B42CA47663EA3395DF22DE20947DB14FC1FAD03805955D67F8473BAEFE2C1E22BDCC7BB988DB0DDE4E83E26A16F10B93BD9CFDBA77B9302EDBA0C9AFBA7369A023EF763C55484F7425F842111CAE27E07A511A725F25D422D933F2EC201BFFE3291411AC3CD6E91018C95074C18FC780A73945B148154987854CFA1CF1199BCD03519C8F34774453DF90B71FEA6734DEA7191EE2A5735F7A191F527642D53C844B087E9346B07EDD0B78C36F83445825E60A13C424F72530E05F75DA8D33957FAFF004DEB549985790956A0E7D9B256298D56BC6206F1E4E1E958FE298641A277A2C8B6B9B7660DBF689AD7E1A19CBD965CBEAA4A0D30741586290576996AE668ECBAB4F06F2A1D542E32C5D3F042E7E29A41BF86BAE29E7029D997876CFB23B10986A45CA029739B2446A29C55561AEE8FFB187961E6E7401D726AF6D8A5C816B2CEAA9A1C9B780DDCC4F0E4003542B193AE26EC687F8C51451D2D5387D9C3B9EB95981DF2DE069FE741CD5C15F6D1B12C5B9B94230ABA33BF46DCE8AC7E26896EDCB4F87272C32D19E72C313738855C02C6F46F1162BE0A3ED2E76704B16169689BF532EAD7AE7F2B26F4D9B22712662BEEA1F46748FA4C27D1D825D3FE493B5B3B513617C81D21A0912D329C5A4E3A90EF5A29A4E3137D1CE3EEE99C42D034E61593A4076EF124BD6BCF8FC911FC9F6077D82C2980C2ADB955939441BC9E81BDF9D6996CE578114C01F9BA096D6EA40F4E0FBB18B3E3D25E7F6D6CB670AD26F604368ACB6190667B7B7ED3C1A1DA04E42AE0087852834B91AA072AD51C0193E5299481221BC9083118F7B5503559F1E2D9E22A8D57932CD0B59509E7D7F459E20EBF4C1D0DF71472340E64992C0485D593714D6B469547616DFEAFC95089689931E79944204A6D0A47A565DC325F3BE19FD44BB6CD4BF2B1D4A78C883154D70705E121B833A4A7E7E80FCDCA03F52C1F831AB0D989AC5DBB5CD83BABCB3EE74B69681818DC05E33234775123F552CFC7C7BB0B98C937957A2C4E86E3D775468A7CB8D33756ED7489D04DBE52EAA2737EFBC4C4D0F55B5A841E1453763E611BAC358FAD0B5778C6015D97CC42CA9FECC66CF844DFE55587C200DA5250B3A419791F57D3A4F672551BE885DFE2AA8637D6C890EE8E1063E782FD7E2CB356BF47B6EB93A155D8D64C9F6CCA3971C5A7FACC3C052A2AA9FB286750F76933261AFF5CE408BDA8382AF8535145F432F78B3B25A768B5DA2A211D1D07AB557CABC7A139F66EDBB744AA76E0FBF22092E31C92CAFC624EE1DC6732F27E8E7632C6EEE2D1F5C85B52D712C884B36C91DA383F0DE9E06E5EF63D7B7A692E5E91BA1A1D9298E26694FAAD9EF262F117DF8115E2E877197A8069A96210CE65D45E6AA7011654ACFAFDA810CCCC20C1985D54483DAE12B29D7ECF66376968B52FBD727CBAE7C9E3DBFEE7391D985228ACA9EB8EF98FAE32BD24552A6B34BAA581DBB03676A3A4546E10EFCEF269B18E1172F560FA0F0344149543551E079C1745BC0425B5233B7D7DC32F751D321638EDB1CEE56DF0359EB6D9863CF3E341A56060C8EF8486014F956C39B751AE239A493A017B2FA5210D374BA83DF5D799B7CD92987FEBB0B2CDB3EE42A61381304C5EAE2ADD4777011C3279BBCD1EDD6F91FF72B3C353AC35DA8FA843DC5561D3CDB507730E8BEF20CF09B0DDC36D47F4C10D82652DC2937D889F83B1DDC30E52B244250D19EEA9CF7A3B5D931E2E25B64A0A81B2C4FE933A17BEAC2E10FD888D07F994E4F2583D204DA126533F5E36B62486A00CCC317C4381A8FE11D36C43E71BE108E22A98F53729F05A5E0AA38D512423DB4BC1D6BFAE9117383ACF94AE2A737F6B8070858BEAF08E365CA84925F8BEBAEEF5AF77EB73A9D3648AAA6493CEBDDB95149F0DAFACF129FC321E558084A44CCA4B429D664D90DD90F2A04818B48D135952746CECA76F99B947A33A3BF7C535B187C1971AF4FCB1EAC841BE7E96F429DD38127B52FACC2DD6512D8D019E0080CADBF7078FC67E9AF170A2A00F70F407B0A7FF469E2F6EA165F8B43EEF1779A115089DE9ABE6B78C93E4B8E3B018686D16CE8EBC88CBC1D571372A3996C9E5967C035F9DA6E200E7ECFD1CF7158563F36A3AAC3CD8ACF52A4EEE29DCEB03FA3272A671CFC9B - -count = 57 -seed = 4E94DD734A371A7C6AD4A567038CF93BAACE2B9D30F3862198DC55D2F21F8FDC9A7AE5DCA1541712179E3AB1FFA3F792 -mlen = 1914 -msg = F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE -pk = 0BCF3C6B243A8F200A41BA2B24764AC252D4C2FA4E79767CDDC422A0D90FAC1997543C93F2B6914AAFF22CFC29FFA3D90FAB19CC1D91453F7B51BB3265B6E72A -sk = 0BCF3C6B243A8F200A41BA2B24764AC252D4C2FA4E79767CDDC422A0D90FAC1997543C93F2B6914AAFF22CFC29FFA3D90FAB19CC1D91453F7B51BB3265B6E72A020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C943315289206B33597C4C25AA82C0A812832BAA9E3BA4D9D39CE6FA7D275D549B4AA73BEF27E74DE2E325D3D25C03000000000000007A02A59A4B5DC3F8C0873311E58DFDF41524DF42146C396085126C46C5FA5F8584BEBDA7E376D2F4A783052DA481FBFFFFFFFFFFFFFFD67968015AA7DD417972F362C7399ABBE677E07D17159922E2C41152055BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6976AF12224EA8CB4EF0F5FDB3621C77D61B74A0DFAAACDA0501DB16A53A060000000000000000000000000000000000000000000000FCA60AB1787EA3D75176FF738CA06A45B09AC5B50FC1A7651B95F0E92943250AF0E34381DFB2B7133815EFDDE8C20B2F6861818331CE3CAB38FC2415D8D7EF1AE0924EEE39C803819080047750EAC4C82A75AC6A0726BA80311C7F5524CDE816A676E6D3037C8833149F7E71CF1966B1AFB0403F4CA2E07293E132506BE689297929CEEFB5CFEC9471C19BE75CA1B4AFFE745CEC3238686FEF45D2F6F8DC582C300E8580BBC441A5FD5D515FDC03180C3C269770F1EB882DA8073E0921B1602F5BF270B9568ACE7E936DFE48C03C2EB4B73A36DA21F477B6F7C74096CCB2463461CB8402722FAC932836D6F533C41D664CCA1534787AE0446A24B5801B790F30A41DB950234105545A7B8CCD9F7A1B3D5B1739DCCBCCEFE213EA3D12521DA62D8FE7DC18538A54823B8D4F7A76A0990301F1EA44B545E841CFEA0132B53A0E2712AD443E98D0B0C0728D60F78D316F214CB32EE9CAF88037DF90B994CB11F028EDC11DB0BBBD810031DEEB37B153D26D26209E35952FDA67668B14806FB8571D536532D71157C1A433CD5FE01AE10AC8BF2A42E4791230EC7E7C992168445A2AC66EEBDEC5774E02C3FE2AD7EBBC8B7D1BBA75394900D86936EC2117EFACEE2A -smlen = 2091 -sm = 10E1F328F6E3BFCAFB04966565577FEAFCB2FC033A202CF442C8F6DAE704DF61AF86051B073B1707596EAA4AC4463103AC0630D1C8133CD19E4F1704996E8C3A76E9839ECE0383AB397781BC3B3F020357B7D76CB56605EB1903038A8630BC6CF61FF0055C6655B5C1250993F6009D46B8D07587B8448D017AFD512212986A766104A3DE17C6820295969C0400EFAE7AFEF070EC1B1D02AF0CE826704A020364951AA04871CC361D05267CEACA9991F200F3EA695264936D537D86E545E132131442C2973D19B37F8C911E3ECEF4A13A8B1EDF5E5968A6198D26205FFE6B76CB14E353B5E2C9DE1BD44AB9BD55862BA1A479833335725EF52601810C778DA4A32C497CCFA43F91C72A1499E8D295AE7CDB43F1CA05F0D4A31B30D9A69CAB8288640F3F9E081E2C98CC8351C7EB9954D428DA4BB374B346A83EFF5AA3F455F2BB3FC922F901BBE5695E3AB9892A93BEEF90FC150B3BB47F6965C229F7DCC3100A4101840417A0E2547F9D42AB27216254A2898368BFC60E7D407271C213233B6913C8E48DF10967757BFAF5B5E2A284B8F67C70537C97583786B5185B45E2E36BD8B5443E98601F772829176C4D66F44A81AAE7C13F539490640BFC40B83E1C75305B06BE60E18A0AB568859435B715E15BA1EE4DE73E04E1B09DD15350AE423C131706F057255E9FA8FA3F9E3ADE7435A6451F7A2AAD0C0FE0F444C4A247DCBAA49E7C926DD52A33D3737B4439C1D40F861720E37BD25366EB5F34BF4B552160F3EB80CA8FB19304E1E4143090F8E965DAEFF17551A3931905B5CD991C6BC5AF5BE808073893A47FBFEEC0940EF5E7D2F2EE199847E1A4BEA447BEC40F86F6FDAEBECE6FF0F66E04193355C9576DD4AAB2D796CFEE5D432B1D32E13B8903A06FFD3AECB00C169A3AF8389848CEC724F647C6BA8DC3134CA18586DB3E4138601A16DF8873A490F23C4D27FD9C3D4FABF2BDCBA4AF3F0793E7B591198100EC97602D9BA572409EA49D7C8EDC646335FD4494577720EA7CDF3B4266FC201DE4BC204C0D35CFB55010BFAC68CA0DF3AC936C9FD2A9C532B8E3461D25362EFA37DA159B64670060CAB833ECA799FCF1342C7EE1B80BDE05ABAD08B9EE8908D50CD0D433DDA0B120D1980F690ACAD9C072502AB537EF71B691917A76D3098C27FDC6FAD1F1B29E307E17C87D9FA6A06CF8CEF6568D9E4E005FEEFCB5F41A46D91E31B41268367D636C4478921E690D5D57E99DA3448773D51B673109CFD3A58CC50C127F34F4963FCED6C216E60EA0952317FBFE88807BFF4223624F6126104CB46C8D39EE228BB4FC0002287E346E5ACE43E2CAEC07A22203FE3C4AA9008A94F7075F6E449FB89905BB955FA0023608C494F7B73D2AA4E2B0A8A7E3CAA889B6B6A6640F7222EF969D46FF6794BD97C5363921461BACDA17F2781E14419436E37610E52E3B7B7BF9C1A4B1D80876030F9A8981DAA4F06A432DBA739DB988BED5DE7F38378EC1F7D8A46B305896CA0CAA5D8AD74002863C6FF91EF25AE96450936509EFA93F94718E895A82B4616A965AF004038E0897A6563DBC91EB5A6172ADBA052250D06D210BCF5A250246FC3482E57FCD9901104C5AD58EEFFAC2860A4DA9D2C308552EFBDA2D4275F3F3651E9935A0E42869B9263FC7EA71079E604A4EC6DC61CEF6AC6CC06194DEF432C1F7CD9EDFB0C4B448DAE3C2A685BC818B2A90E17A4C1CAAA5FC2632F720E764E2B8DA314224498119A0D94CF5DCE24176421C2736575672B361119EC7C766265768CD9FF1957A17779C11244C1CC82D72D4E3C87107885F71C56DA2BC41008B0BC1375C12B3B2A80071EC03E377A93BFB227BD560EDD5E5D88F46F7FF9831F05BF262F01F62278D3DC13F4F0CECA0509091C25D20666D8D3527975CA3495F6843B46B5D5B6F5C650E981DEFB3943963E14F00A0F78CE785A21634C46B531B4F2AC5AD0F03D92372C334CE963E514A1891716EB5D5BB1B67834994EDA492719032E2A4F961DDD6D2002D8F52798C45A9DA8145BFD191E97D1FBA1B395858B0FC7D5F5A54E69FB3780635F70A763E44075075580778676E6B9705B40F40210E597B5AA1AA77BCC3BE5005159A4B68CBDC6AD8674495E0DF65A6DECABAFB993CC49C082D358DB1E5B3A8AF2FCB0049A15BF521986AD84148135CDB185FDDCA6802C2ADE9EA2E82047725D73F51E072CCD799D696D7530F61B16E9B4727C58CB0F552B188F9B451BE543BD809B63D66BCDBAEB7AA917BE6AEF05DF559B3AEAF65D5EA12E852D1370EFD6197F970F52292F27923A10D01AEB652A9A44573C137257B49D130F1DA48E532B3E33D4854B995534380B4549511B39A99145AF5ABE0CCD3A9DBAF673EFC115CB75A9A5A806679907BB525A2BD4507977329EB4C985B3575DE6533FC5D62358C21AF3DBDD20DEEFD7C417C77D37DC2A098A8FA48F7944B7EC6F929387BA11E3516C9EA681238650416FFB97EA343D5F227BADFDD509B94C1451C54F85E4539A8F70DBB5EFBB10B2D82A16FD0C997C603B8983CEB840A7C3B61918D8A97766BB8442C3B9EF2D324E28DC19748417D32F642874A8927688C74BF4F6F6724015C4DD50EB83B85F613FA20938F5C895F88830A40C9799C212B2DFB453BA0BC534F75CEDAF7A016F6744CB4F5269FBF0284EB90CF1023918078024C3B125CD9C7501224050B4D20B585472B42A0F494513ED131BCD8F75E223317F56B37CA48780750DE0BC81C74A3388C94D93A65719122E9D533274811B76965265D7B2F91EBE3C5924ED2D4DD5E327A6E7546AA2605E4C78D0208DB7A7F678CAADFB32E6BCF8C77FC7810F7D1D5D50E26D1A0DA03B8AFCF99904B2B3198670462451925381F0BC404C51F2F18FA7E2C1E8B0C6CF97A9A65E575373996C3E9DA15A18D15C93548377677DD713C9828DC4E4EE823A241377C65A2948BD29447BFBE - -count = 58 -seed = D9281003AC5F7673E0E9A7BC29C4ED75E6B0F228DF49D11A2599BFF2DA9E887163BB26DBA4F071FBCE02891540EC6F1C -mlen = 1947 -msg = 437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF -pk = 24D22F03612C543B96A5F21A7D5E3757105D213BC5EA45A13E9296451F4FBB0393C8E1D4E9567BF6FE807DC27E58CACB2FF43D0DC25FAE3E074E6836476D7322 -sk = 24D22F03612C543B96A5F21A7D5E3757105D213BC5EA45A13E9296451F4FBB0393C8E1D4E9567BF6FE807DC27E58CACB2FF43D0DC25FAE3E074E6836476D732202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057801B390B7FE1845951D31FB57F4CF7790209860793AA0E57F634D2EFB7FDE97D4773ACB5F5ED7186A0D2C93EDA01000000000000003C680993100D130712B4200EC1F51D8B1EF693AA3CE4A573AF4E6185001206A3E0B3BDDCBC0291FAB10A2B0DFC4AFBFFFFFFFFFFFFFF347E7E622FFB18EC8092C8C20A9ED28F271FC3CAB8F7CE70FE72240821D6F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF694B2EA7F46A96F9FE153C2CB880EF5AFB5ECE214A900252D460AB22C143070000000000000000000000000000000000000000000000B8FE2AF5DC336D6D835C5F28C18E64099F9B204B73DC42E02A8A208B2990330872D22682AD4E0B08BF1B44ADB930A8B86339F55F85300212F8926CB581E4770D452FC5A91258671C6EFA6C610F2A42A2939E328FB75F62BDE32DD258FE7C14233295A3B871C95A8563B69607F8AE9E6DA66A666102249DC85F18E0F6513D1D28DFD3191581FAE20E697A6A534F5F6C46B36C9342FEE3E6F2183E8B02EB32642420E2832A6848673257973458C37086A15A9DC401F2C3FE83A0D26E0430B5E2045B318649CA200DBD72CD515BF82877475A6AC0DC2BF398AB8D9980698A05080F80FF4481E3BFB4AD1264C8A683001075E062015F712394829BD07686900B522539F90D16FE0698C1898ABAD823EC082E40EF20DEDEEF0986844111519D3AF51CB6DF26548152169980B61F317FF83AB7ACDC5B847C9791E6BA207BE2B5D4C918A4C20CD34D8AB99DF02F771B6B6495184B104EB0D45BBB3E6EE64E5876F932088DC8A5086F5B897A5B70B8D18647A2CA6AFFA95772A5E4E0791BA9FA43EBB62714B5E9297F84FA2CDFA2C9A3E9FE419797F1812E1CB8CFB665AAFB6D4DE807179156771F5F64932C5D995597996886EB8A691F53C7D391E1E3931B2A533B4634 -smlen = 2124 -sm = 7047C61B24146F797E0746F84265FE53EF297C077B9BAA430325EDCCE806201EF72A9CEDEB18FC01ED284F91A4314948A503E20F3CB4E400DBC35A00313E6E69A77F60AF74055606D34B688BE712AB01921532B29BCFF64BED07DE219B3ADD77143BC300FB39944FC79D84FCA001990056789685783DDE0359B427C707B59D7DAD03F7BD9A77DC932EBDF201001768F705368A281027C43ABB5FC2826609031145FDDB94283FBD9F031CCB28422A9DC401437E0F77BD0E14D704BE86135119F39A0A65650C762852E2694AD9BF2EA45C7EE59DF915F5AAC128309847E944127294566FFB193D0361DD7111D32B06DBA60A12E053F424DDD70674E902E409BC6F5891CB9A76108322CDEC1491D3D89A74CEDD855BB0791DD6DA371A75AE979593B5159FBE9DDACF88506E6A184547E2A7395A46FBAAAF286EB7780B789FED86F257E5036A3555E777B909243695CE89957DF492C80050457AFD84AAD9F8918099AB00FD7AD3528A3D0AFE5B52300053575B839572D4D7CE43C255BBF5F16948D40BCC2E63714487AFD3638601ADF47A324482ECC99FB88574538809227F8C0A5FA7F20A0B2FEFDA38E6A665550E44B8D5630290A4815621A5DD74A2108CA946241C48661EB087240788808BF676B145442B2DE4C35E1A6B8CB1E97E54CB729202D8827A0D4994C6D7F3F406ED273B00B6590006AF069D69173B5EA8237B87705F362288AC3A50BBE7E70EB15DF6ED820D66290F57A87E51B2C5777C9C95C2A76ECF2E296A7C295BFE029BBE681B32A6D9F16D11C7CA2750E2F8877AF5DDB616D8A820DE998B0B2AF5B0C2C5641F498C99971932327EC2C73C0EF4058D9F33683F60553AD2962370AFC6725743C86E591D7D7C20944479DACA5E92D66A33CA0C862DC60DFEB5EC3C6E7DE356F6E43F06B1431358285398F8885176D60CBA218217DC7AFE4AD876D0890648052A56812BC3F8A9E6C49F9D70B0A032924B891A9410BBE2F214C842BBF0511EF9017744A0DBDBD500A4189B471930E25216D2588CF8BA39AAE7623966CC62D6C4ECC8B00B0613D912E60ADF613C8F55B778EFB93A513A776C64E8DC943E6272C0EAB4004B4B05CE9BCE9CE2F2B86FD8429E9A72CB16EC3DED285339EDFCD122150F4E7310F669B1DD4CD7E76D282D10314E8ABF61D53BF343F3EBF9968E1BE8F3785581F675BFC28C893729CF67345D0F7C11D6E7D6DA0BFF255BF706C986704A3B9C6FA0602C6DC108A59CCA70F624B08E4F5393E597459BEA4AAAA463A3B08DE147E10DE6B75A0D87BB79BA9A71E7F5999C8972BA992228B60912AA2D7A32703BA8BC02F774430A2B590911D48D3866396F1D71F19CA90EBD5277743A984E2156CB57DE88EBE91BCC09CCB5C687CBCD4E48E4EE110F4075A21F9A051700B0C2698FCD6A5A73372CA366A230A9ABD153E4DCAB7A33A8226F8458C5892098BC0A95619880156548F300C40BDEF81E8C1D8BD03031C690B7C3C000CE99675ADB4B94752EA22BC9E0278D0A53A2A19363A9388BB8D6C24A45B5DEDD8F7482E9C29603FF182F25856FBEEE2B41B88B352F99DB5F33D8EAB1A1A1FEDE60EA6CFB7478DB7540D3A286E88117503C4D0A2C13D32AFE3F1A31D1AF9EE60EAB8FE06248CFFFC7BB438B77D94B5644805CC276F19268DD1FFEFBAB3C796923288638DA1C15E014723A84F8C2DD9F55F7ADC2ADC13FA7CDC29BAF48CA438C882DA5F7CAA792B7CD984BB11EC4B681B332EDFD4AB4C132B08BFB688F81BAA3FEC5A079E2182C282A3EBE2AD5E4C59090BBB989E6A07D85D604F5FFDE0587ADD29A5175CE65D29FB9FDE3E8B49EDA1D88EE8DD64FA1498D33EBAF4A847EE9FEDD3376AF46C1552A150014C11DDFC5047929E2415D3F9D81186A685A1CAF2F004DE777760F0567E880866320A7B42E61CC994719DDC81E28525E50195FFE4E0467D9A9182B75EF57DFEE926D7744485A55E07D1BCD1C9B9B12A60460BFF016E9834848665F132E2FF87805E00154C7D9853DBCA43D005BB197EEDA3D2D9249A621EFC4177415BB103893C82EEB0AEEA056B40E98B5FE65527432FF33CE3E09FE1288A6E2641011721279253800ABC4B73F65B15B434BD34A573E77A94729A78C92F0E791570A416A0876DB39A8FDA8696FB12E7FA3BB11E7838054E4195164B9676DD03327810CCFF9586217AA3D50E7D3EBDB1AE1BF6889DF316047CBB278CE8C9741798452A38E48A7138E1FBA286B497FDB8B1E7BF6145C5F29ECF6D5430F8E550314DB3CF48F27897F312C6D9D6357A880B721E5148DA7F789238CE411F952695F4A878756BDE311BB4E62F10C2F9939B8530EF70D3FB431655AECA2AD36BB5DF0582A07F53F1DF8E0325E635D5A5E795C130106502A081F2FC52A9D97C5DAAF174F13D2DE1EA0F8860F08F4FD5B571E1AB1E84437F3C82BF19B96E46513C316BDCF994BC26FB8461F90594E08E6D4A032C1DA38481A1AD7BFB7D5270255BFF23CE035535CF478216E6D2E62E147AD93357D62636B1AE42C4E8433BB94CA91D0F8EC265F2793514543AA86B786D9760BE5C77AAD5A8449A7DBE92391EAAFC305C1267A68E6ACF0F044FC144D82C917992748B9232DEC4E33EC97534F2BF60B56EDBFF675F0343C9C78E8A8D0529A78E2EED9F998B360360352009F01905C1A4815A36B111CAD8E5B34688B99216171D4F57283CD669DC05995BB8D94ECBD3E7B662C4A603BD85251F2BA35FB6CA492C2B3E996FE66A1EB904CCD61B0900E7DEDCF136F50E4C3AD5FC312A2DE4B3E51F355D01763692C0722C700A544E681A316A1D261FAD727E557398E500F15DF33883ABE9D1BA645936891F5A91FF6C8A7B9B6FE5062718542DF4FC4BA50D7F513945482381ADC42D5A9D444CA211232615306D7241FC49F08912BACBAFBB056C018AD4D6021D99FD720ED6548A5A29DAEFDCE868D71A1BA72D9F998A3F89FCFE526493582C4C8AF5C1BE065EA29F6155428DBC955B745DF - -count = 59 -seed = 750A74866BE8DF4E60BC14BF36E6D83ABF6DCBB86792D125CF0980007C5435F40F87BA96498A88252D9C5C6710807652 -mlen = 1980 -msg = E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF -pk = 9E9ED6D1E63D4C48AC767517C3FED8921C82117E0CDB4AD051E594A209EA4909BB0223472B411F73612D8125AC9949A1A749AD07104E867A30872D14FEB10F20 -sk = 9E9ED6D1E63D4C48AC767517C3FED8921C82117E0CDB4AD051E594A209EA4909BB0223472B411F73612D8125AC9949A1A749AD07104E867A30872D14FEB10F20020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D0026A5AA9BF3E51F3EC8717A0F79B427050B721D92CA371993CE19E420D41D0E3C8682F83369687D29EAE95941A010000000000000099010FD0710D2A2843B45678B2A5A515905E53E4006D0C25E9338788F0A95517C36352E40C0DCABD80D49E68AF6DFBFFFFFFFFFFFFFF99899119E7524F1182EF81D3346622D77B2E5F093AE9BA08E96B85A9E32BFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50E23B72B62BF90A15ED316D9B054271696E736B111E5C78B9BDB4C7271C0B0000000000000000000000000000000000000000000000F04EA13D79C69F6634BC458F1D98C3794DB75742DE6839586456541B11D4B831D1320899F125801DFC1EB3123BAA210272AADF5B8D1929FEBF5B90B518883B1DCDFAF41FB4E282B71BF713FDEB3E7E6041D0E8696A3C8CF8EB22053AD78F85152050F76113E2685CFB5BB501B00B4B36A197A8F7BD96743138C4552B6425D32766DE957DE66A8F191100FB9C93FC9F837248CC7E40BBD80BFE41D8DB56081829DDBC91F2F750481F202F68909170B06018680611CE9224ADB4577534E8C139070B8958D24D43E524210AA0F727C3B67B3C01ED9E04F9B7334E76810133141611BE90D77826163424F704BCF4736A4BD61F02D5760B148AFB3FE2EDA4EF450600D4E4E076D085394F0F5632E58DD1119DD684460D61DC23D8D6587216624BF530502AB05362EA58D9ACF4856F5C26FBE4F421C2DCE4D662E50268B4EFC5043C0AE5D28EC2AF4FC40C394CB4FA70971D6EFA3FAA149EF30CCB3C45AC7C29AA43159AEA3668A1D0676B14D4676AD277E0E4A10ACC11FE82C564EFA1DD831D65FE2915249DDF5F0FCB3009BE348285CA043DFCAC3CC24697F25E3475294B788EFE053E513C0E15C60CDF4B854946787DBF1757B5A4DB49A84365C577D4B5A9790524 -smlen = 2157 -sm = 74C7F29370CA1E646004B382D4D79EF823DA9A0487C7D7807068864A740535EF6BB3CCD46B3F9304C735612BE631AA574F00B6D963D4C37D5750F704A269DB6753C6B5871E01EE16E71ACEF9E5D65500C958BCCA4D391213FF01B3B5B99EE129D56D5C0783647452B5B98389F806855074DBEBDFADAC570509F2CC5BCB6C3573BE05FB53B89553A65CE53E06014F3F2AF1097DEBBE477A276F59650D2A0201F49AFA7346818F8E7E031A3F49CB2CA10102E4E3EDCD70C4BBED033F402CEEDC2C265DCA10B2DE0DB00D454C3AE1A0D00C97E1DC8C6804B1777ED21DDF5145B9F9348A931C128A8FB03827F653C37CD95859868DDE356ACE682F627FB69FCD97757BBE8BD5A260A293D2ACF0BFA2C0A3548FE25A2BA1A21F95123D592B40C20A927FDB615E69878E8D7C98D261DC01958A088599D3F9BB5E14002192FC7DE417B1074B3F7B52CD2A699091FD9DC3C5929E51CC0259D2255CAF0E444EC11257B759978BD4A7C8E2CE8473325B7498681102DE6FFE9764334D862E379D9F2EBF9B312FA75D7A50E08B94BD43EEF78722D423928FB8E26FDA85A345EEED0326A5D694E4729154A9997B269407B7D03818025EEB2BA96580626DFDB3BFBFCE100C508170D8150E4980D5D386761F4E8311339B47852ACC2A0A01DAD90D3978DE6536547D4F203CEFFAA652E4F2F28639BC3FF83C485C28EDC0BBE21D17B8ECAF3794D64C36FFE7F07E8A906CAB8E7FC9067CA4BF9B074C7FB01EF99A05D7C0F35D889A63AFE5FF18023BF77F8A3DA0C3CECEA0E538A6DAB5C54F3A0D83151595AD3EC4C45132EC2F22F652EA5DD930E692A7C0D7C23DE84314CAA7C017AD50D430FEF42DE557073DDBA6CAA4A787C92E6E28368943CAD0974EDAEB7ADDF991CCE20BF51C5A898CF0A2104ABB810BD4937D23E5D43490A3194B8A109B745E0A365EFA59199B43835682E996794F16C5CB874C88D9697B189AC54A1BA1F459623C1563CBA7689EBB32DC4FA0BF30E064D119D40C36301A653A4F959C97873003CFF7E8E030A137BAFE0A60AD08E4F692DC107E68AB40EDD0C384875B8525AA0A5EC3ACEAFE557EC76DB5283672F9751AFE1166D53542D216186A3DEF4DFA94E57BFFBEBD6F4AFEC3C0F3F40F651A1251A9AB39C262D42313E9F22879645589EA54FE894AC005115A43DD806B2C8BE6222DD9F02189D4221A9DDE99ECB8C3EF4171776268C12ADC37E4CA92EEF09D2D1803DB1FE917521662BA7EC0C07292C7E2130ECA4EEFFE53EE0CEAAAFF6F4CCFD42186611AFEE79BC651B1ADBAD08458592D69FBEEC708C7537925658BABBE7E9867915C6A728EAF41B0AF2EFFE55207C01652891C373F7A14409D05FE9E26C2E72D688047DE9A0954516B85ED6A3230B6B0EA9C5F086720C26EFBF8B7F5C5D14651D54C4EA181A707C562239CFC08B2E09A2941D04D587B90134D8F670F734578534138CD9CB7EC04437A768FE65FC5B3FBE818DB423A2208E485669082B422AB1257C2529CBF7BA4CB30FA27B7F702418C2EF9C3BF7CDE53661DF716449C6337C54542EADC5209A0E030AD6577DEEACC6BE1813DB24BEC035CEE6AEE93749D524222535A0277600F8E4F4BEB473093C5A00B6666CB319DFF131AE4F004EEB1BF71E5D274E3DFBFA246DADA9D6F548907091045FCCF79B363E695AD54C2F791861CE04874EE8C3375612DE820CEDE04E4472BC3DC19ABBB91C42A1C3D7B467837570E7D20A2CA6405DECCFF1AEC03E0558076E988619CB0CDA9CC87A12367BD486B676A4F71D40B88AB4E7FA750350DADD1A8F12B70864792D3CC1804BE8B7CB9DDA532182C32582015C1788B43054B7010229F46BD39000440E7F5D22E4D52EED85B204B344680426AEF51F0CE0551FEB9672DBF391A9AD363ED090837CAC1E721878E65AF9BA92A0EE7C7979925FBA9F4E452EB4FE3AF03B9EFF0526FF0A331AC0B8CD27A0C49E5019B7025C3C9870C900A7FB31FF834E04B87DB77C4D6DAE4C3FEE741E923704EE5F294D8F881833E9137158D1EE0FBFCB4637ACB814A2A5346607BBCD6BC916235F7875334F2B75A7EA7B8B8DDCDF46C0B8007C9B3A014EC6E634D4173CAFB1DD09CB9ED4A123151F4F2631D4BEE1520C10C15AFEB17198009C2B254C1FF0BECAFBF69BE8C7DBBFC7E8F3F1EF05FF6A7945FF79ED6C317609B9238670DEA26D56D481F87CA171CCFD726CC0728C965D9BC38D376D707E6979908B19FDF7E74ECD2D0671EC338FD54AD6CC5F789E96018521882588F888D7D715104D65954DBA8907C0B7CE3F2ACB802ED49DDF1416C29E8D685C5AD879464819E1D53FDAC741F71E31AC0C17B6C8932A4A00E7164CF8BBFEC36EBBD30392145B292D355FB304A88A638F991F6F89A398B09F1DE4F0B29866029BEE75A12D724A52736F2B9F49937F0E51B0F2E1BD2C1BC9325BBD1061E0F7685ACA02DA735D8FC39646E0B2453BB9690ED1C4853A757EA9DC2F4EB4B5ADBCFCBFB0CD2587F61A24B77CA0D6CFCFF47A98C7098B986D4FBD0E46EF0D1F9DF842F4473C43912AB49F4117C8214A42F3083936C7E8A38B294BA081296A393DCAADDCD0D340AC62511E47DA6591836553EEDB466DA6285359EE831A952E6C7AE3B943636124E43224D527B7D394511CF31C50EC1D3E7A20E49850905D504F1AAE477830E3BDA50430EBD47FDBB0BF537D8D479CB799B0429C3F6591328299A09F45CF9C6D30D5C1C9203B9521D807875D7FB2C2CFAA688414497122161B1B4F159B66C0834E111DA4F82D5252367FD2DBFDC079333FC51AB0D34ECEBBE786F984852A596BE620EC6CF84ED596425B90316A13B39E5EBFA19B319BF0FD1D6C812F29970FB1FFE948BC0D2E057B1DEA15445D71B5F728C72DD0C69E277C58F031F90932994AC5A177926DCC1C570AC1B4B099ED66ABF7DDE5A5D77D08EF1AD7C6FFE018F56EFB07C737F33038846247EEEE147E4A5995BDC3352B73F15FCE5140410AAE3F0AF1764E5AD996D01608C5E6C6C96A20274EA7781B41FC532B01B52134FEE28F501EFD9CF - -count = 60 -seed = A832D4AAE8076C4EFE8319A74CE315928AB765BB629075254CBC63EAAE691C220F4B5E1839E9A99D8747AACD7C2F1EE3 -mlen = 2013 -msg = 84C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 -pk = DB1E47FD52D8B35DECB94A108397D842FA1E45A5ECD18906D9E39F4CE60EAF046AC58C82B08DA3D4BEAAC0797C2746284ED3EC2EC56F7108A9C9E093DAB6DF20 -sk = DB1E47FD52D8B35DECB94A108397D842FA1E45A5ECD18906D9E39F4CE60EAF046AC58C82B08DA3D4BEAAC0797C2746284ED3EC2EC56F7108A9C9E093DAB6DF20020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D1F0E4863946418E7B5B2E37C1B9CED094200D3261B5B6EFD89BC487145DD53B1E55269813BAEC67E0ED4C4CAA0A0100000000000000B0560A88A920A09A009A67C335344925114D0A26EFEAA50D9D5ACFBAFEDD75BABA51F53CE4E0CB6B7660467F1C45FFFFFFFFFFFFFFFF9C567AD674D225ED944D98A8C4CDCA0FD48565BF7949B229534493245C78F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D07894E83F5B60F95DAF92CCB21A76589F67123A190559758CF039951C0400000000000000000000000000000000000000000000005ABCE65C10AA2520F608739352DFC3E714A191EA1249F1F8EFB1407EC90E411FA4C633F7F926D7028D0215798AEA6C9298DC5697426E6EDCD9446276D50C0B28FB773F0F0C2BF8002629895A22D1825FA746E1F5896305EDBE564533EA96942C800069FF879D74A4C8AFE302198E2E46DCC04340750B7ED32A9D82752278341AF7611A326BBEC8482A49C6529462F1C152F6969ECB5F1754C125B7A890B8C32721EF6133917BDB04D08B7E2E6C9F7ACBD9D03100056D50713CE793B2746362250B14E4A707421BC6634185DCF4DECB92CFC38FF073515AA87C3CD9AF9B2E8D277D61A1DDAF0D2525EDEA666563F8DBA1FF1CA8ADE37DDC64EF9A3B776FEA7A099B6A142EE8C2467C2AC910F1EB5312D10E864D2E96EDB22331B8BE2F6726521EF66A5B6E5E653C43D61E05E3C69B8DB37B4AD701A7A2F8ABFE7860A63FF2692EB4F425978C20D9E2D8EEA3481D293BCEE6B675EC4CA05424B60D2B8DDF8B022D789C9E62316C451F369D34D388D3D920FCC02ED341D63D469C739E44CB53F819A81A19A4E610535C39196DE9EE213AB87DF2E78E131FC238F11DBCBB4A97772905DB0C16FF8E44B26D8B1988A1646A90C41AEBD0D9C9679D0BD3CC8433C9192D -smlen = 2190 -sm = 845D34D59DAD230594018A55EC61AD0A328DA202FA2D62001EA05C1A180653D6C8E5A5647F5617037434CA270EF5058AE1004135405D3B76B1052B02C1F3E4D647F73DB5B603987314B650F034A3D500EA4E4E1A298AEB9F9501052FBBA9B74B15A8D906B086C551F9A5463B1A05D760D3D6E1B6CDBD7C045DE58CA7F4D672243407F359024797A6FB775C0101A30EB49F96838498FE9C1A46CD6DBEB704033515950C2473C9C5E80453D195E79A78850084C603D1B5549C46964FF2987A1F533B4CED94E67D576A3B0BF1C8BD87A74AC7DB640FC9F7ADE44FF79B820846EB83367153F5DDDDF9DFB7848A13D59436916EFABB82DD61291447491D2CA04166FA8680E8E0E0DC98E79344534CA1CBDDB531797A61C291606200107002091ADFA927A763CF98CBBD631CFE890B0ED257AFD34AC0C5280AA7C70BD0C945D78E6FDA284CBB7B3AB636BDF17342F2BA28D707147F14D15173D9BC0B6D65FD1663C86971BE1FA59DA8325E1F3773BACC5B8D4158EF525FDE6E96631C51AD142250252A8E5786CD621210DF3E24CC0B4B60AC2F013D76DB0C73DF40EFAA05A65383A8892276B3D69DD511937D55D914C3222A2386D1BEC0A268E683716AF4AB709D2D225B86229095E87FE70D69E6A34BB214529CA3F082C0F2709E77B86B00B4A04BCCD343C862333B7C9163857B77E30551710CCC3A803323F5CD4EB5317CD2E6A24BFB77727E1C64D0AC47BEEA1CB35E5F2FF6024C06F2F391FEE76F2E69537673FC0124E48E4E2242E84D8AFFEE6803CE6EDF3A954D2C54562B8B76A4EDD91E24A8640AFE67255605849053B60F558B43DDB9F8A04E987D15F6292962D10AD8F7B47188D12D1C9090C0FE8710DC3937C6939496884BDE0BEA979839837C61BE4DF5662C724610C7FCB4631A0A2083417BE6A20F4EED094E2145BC72A83A6E147A655C481DCC906E63ADC0244D95B6085FC096FBCCE81EEB0497F48BB5EF827C0893E331795E3B301DC9F3A91DBA9FBC838E044E2AD9859F1DC67E9BCC375442B4EB59714B5EBBA87AC9A79C99CE74F8BC75740DDCCE46C4B408B91DD7D4AD26B0FB1A4AB874F5504C40E7363838D22AEC45C10D3CC2E233124A5CD8344249EDF388E37BA43598F2C2CF56D444BCEE04A335B154DFA3CA694DB481CBAA59514098CE6E0E4138C0A543EFAFEDA4AECC022C824259A06C3D57A70EA15A5DFC822449A27F58F9EF842DCBB636CE293684E1B331CD821594A12634E5594410B6C5E2306DC8BBE62C8B0F49F2F699A59EFB14D3CAD399F74ED893E1EB43FD770FD61E0C58E5D8CBC9435F4AD0892681A30DF4885927130432186AD4BE41F6FB7CFE660E23C5E55F60789B3E97C3B622599938B36BD1C0BCF6FDB7E4EE44C92B6A86CA2470BCDB8BAB8DF6079382CA314BF3A8B3C4286518C356018FD6F6FCDD9BE9AD9C228F29135544E723A898F483E9D9EE843E75ACB3FEAC447973D12461FEE3D984F3B4F31645FAEA56852D356C96CD73A6F185E8CD56731E83FEA145A2BF0C15ADC634DD9E2FFC799B59A0712EB4D2618680C7493F50A9BBF3F7BDE1025CD44AFDAF4A8C42C9254B1B34AA8559E1CEE9BDE7B4DA0FB3CB2289418110620E505B793B91F422FCF53ADDA8F7C96D55E26244E075D9A70004642712EAC377CE18F88F2C8581694B8F621707DAB6D292179B2A95AEC5AD6E409D78253DCC05ECCDB45683DFFFB9C629AFCFB0654725D650E4A283FD98E47F37AA9309E2933CC0393625DD81D4A02F9D5082644DE02B6472D5D3AAE110747E4F756973FDFCE8EA5F997E30B11EBD50B45F6889D227D87D9184CBC6ED40E96DEF8B9236763C9999E21BFC1A74457FFE5E0DC2B16876FE04C2E0F0F47012A767A7AC18D71A7FD65F8647A7E1AE2D4D255492A18AA81D17D390E381B1722BC3C38BCCEA9D5E73231D0C6E1A96CCB47079E36C994E94AF9A318D67B6408BB602A91D8E9EC6499DEED0B51A9AE31D9774A1BEF4C1DE0E7A324545B2AF9870CD733C2195C5ECDE386D298C33D492937497EA5F0E05C377A4D755DEA9D96C61FE82CF6299EB34B857217A2C6733FED64F5DAC5F95A0EF2294ECA844B96CEB5163363A31C58C88428152663AB0A2B310B1A9E9027CA8CC0DB6DFF528F9A421FA826A86ACB4FD1D79C1AE6123C9E685BA66F5FF109FDFF2497B1A50C2E4E7B4662FA11FBAA305A960CA70FF98E5290A8C3A27B4A3CF1705C6DF4290FA64F3259FDEDE7A81CFDE4214230DFB9EFB20049E905833B5D48923C8CE2F8A104946FB3356154519D950998677C56C8B2C80471A6117B142E26C0345CDF0634E356D80C3BE12F4AB89EB41DDDCF98188EAD2FF420EED3FD9287322F24C62B21F430D5F9B8592CE1CDC946616111C91C667006E47992FE2D5A2AAD82F8DD1AF3C1B8BA5326220645885CC94E8B2B76CBFF7E161E994C0CB9E489B8A5662E9D420913AF34433F5BAB10AC72C5EEB9249F3C102E1762E862C13CC882D20BE16834E54DCC323EA89A133F451B70087A8DCDC5B518EEF087A571B570A7966F1C49BFCDC70AC05034D1DCC56EDC2C0F57D1AAF16718C67D162BA330AA61A2875F90E2935752BFF1EC28A79EAD1AC18E70A833946CA6A15D8765E1A62AEF46BED232EAE89DBEC278297B396CF611448C5FD4B36B95CDC54E3394C63B9B0969D6488FF1C700B390E7226F99A945306C6504958CD43CD3D63910A4324BB662A0E5DB1622D90CE00E50CE7112193872AAB5CEE0B8D6FD42F26C2FB87FDF99062169C0BE75C85109D4E209DC8A640FED3EC71EF3DE8878B3D1729FF118F50F8A33361C6F707F6011454C5D744989EC1BEB644FCF99CB2E7C3CD20E6F1656E07C3566C4DE68593BCBA0EE9F7BD2E272C3D47A3E03985456F18CAFBEBBC1DE74964BECABDF3E9BBB9A10B29BF3B458FD50F19D63A6231CB51CDE3DF46E4BB6318E81E10AD1674A053C8CFE1E72853FD60E6E642642CB825644D6734AFB00329839F22CED734FA1421C4334E20F2ECC8BBC2652004203B3B639FBDCF5FDA1423F08C3A1100655E4763B8D8356A151D702124D30FDD87B34EC4D34BBB3639464E44A693690E193329 - -count = 61 -seed = 09B8441F47235EFC82D71933A0037FA4F69124C3BAD4EF6A3A7178B417A3FDA874081B7EEFD7EF1BF234C752458FBBAD -mlen = 2046 -msg = 92D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B -pk = E9B1B8AAD851EB684D54F7E28379EA7221B601705FE2859FD1A63A3F7687EE2BD29D99CB93E36E4A47B972225EA9ECC866A7E34C4514B63D1159F1BA2D38F729 -sk = E9B1B8AAD851EB684D54F7E28379EA7221B601705FE2859FD1A63A3F7687EE2BD29D99CB93E36E4A47B972225EA9ECC866A7E34C4514B63D1159F1BA2D38F729020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CBAE5CA5CE079EEB2A4459A7CE4F79B9DFFF62588313C47FFE29E2D488737529CE7E3D1F3D6372FC55C9482A33DBFFFFFFFFFFFFFFFFF0DF75613952816DAB26E512E814FD54676DEA2682B667BB2D8D0690D8DD620EAB3151C338085796AC061A5ECD1BFFFFFFFFFFFFFFFF5C1CC9A06BEDFD57F902A32A4CF2B9FF7ECF05BAC37BF34A5B78B0034462000000000000000000000000000000000000000000000000ADB01190E140F200C5B04FB483383756AB155DF25354F4E21EFB4529928D0F000000000000000000000000000000000000000000000043968A85303E53ACCE677813C072F49587C3ABF0160C00CDE8D2069D005626127F14024925D9F624C99E5B44B0F7E54DDEFEB2C9D5DEA2D791B01915A9DFDD1D26206679D85004F62C0E866C548E90916A53D6F9186C751885E45C3A3FB11C23BE3196BFFB9B85AB0A26DBB9AE29B1DEC4F483133C89C6B9C50C2EFBFE60EA0D17F7180EAC749F19BA3917ABB174F97D6C5BA0FC8D1D3BF060CC8555A32B5C3250DFFCE716F592AB9B707BE080D4F44A8EC4C8778F2FD9D71E751E6CC99EDD1EFCADF70CFC34D7DD757F1462CCFFF52EDAAE73743FF330FAA30C76F9E8FBAD00E17B8319221372D1822CA87E9F82D4DE217BB46F35611C875E9FB9D8897AC602DC12177F23EF6E283724224A755D0C782ECCD44908DB81C78950A08D7BF75A1AEB20D1BC99E14B318FB0CF1132B95FDDD3D9B34BE82EA144AF6D774C925E9A12215EE34A7A8CB57A57A482EEEE6C67BD4FBBB7405D961982E0BD3EDC0018A727B72AF2F112128C07E269221F950841B367D13CF0A89FF404BE9D19CC8ECCFB1EACE2478F3E233EFF64FB54E0178CD336B48FDE9DD7A20E2BDF591DAF17D80C1C62DEC0DBF384AB2CE3314CEC3C45CE2D1121ED66DE534A7A8CFAB76D71E61828 -smlen = 2223 -sm = ACF27E458CF10004CB050F17E0BA670857D2B100B9F4EDD4601FF969D502B70F6FB43B021B3DB303D888283BA542288366074979690CE1E1FBB325076A590916C36FCD701E0085F3A3C83AC0B0BAF504E763B7DF55D2AD198906B3497B7A8C67457FF001878FDAD8C2415840F0040DCF56C1DF9F978E5B059F864745B2B497C30B07E83AADBBA73AABCB9A01018575EF12E0FA74C06AF142FAAD39CE0E0F0350449D27BBF26AB65605D0F9E5B397B4060192D5FEEF68737ECE61C6E0078D77FBAE97B0B9235F40B97099C114B1586E107B5ED1308A8A2D20BE41AF129DA2E0B38EAF02FAEF733C7A1D1A387BC55EF008530ABC22697D0465AA3EB71F41EE72ADD236CEA9A25995F3689C5A451E2F03915D96ABEA10D356D549D68048977587326523CCD71C05FD57BFB3C7A853F535BEDDEADFB84118F6548860F6BA536277DDD7AB42123E93381A385FA3E6CC023C1458A9F94822D93248F36C48FDDC972B5D6494B26658440FFBC23B57363F3D82CCE69FEE4747A889E85343288D55D30FC54D2D0744744DBA9977720E8EDD2C0ACA1FC51B0C6A3C68BB9BB8DA0385DB1CA4E9CE660CF7EB2382E5E95D2AE19DEF904A8651DFAE53A4D0DC4D057AB1A506C3BD7E1D1EA3FC4623E7D7B410DCB312F037B7A5FDE5E0E604FC33270FAF1FFB6ECB3125DDFA5C49F25BBC98238C8AB1B903537CD67238995E81B814280A4CED61513D69A2178086D505F8DD1DF7E11CE66AE33D4C982F94231957031A258E0EC745672A57A5CE76D1170111B8882A9EB5388094EBBD53EE9EA1FCE4A275F9D7060C8DA79018487B452817280C63B01B05EFBF897387592E2BB3BB486FAE0AB09F46D9F2E176DE96C59992C10A14EC16EAC36102B1D15541607075E67C842A888C87B268E9809148A323C423220DC31566B62F45CCE1E2BC1B3BF43B87C998F00023890BCE517271BEC16EFAA33F11611FDE87F197852BC2E7A2B44F8C72A6F79B22F73BE0611B81EFE09253931545D2453939C46B6797CC5DC5A8F1AA3BD8456EEEB84EE76DBF2EBF32598750ED10670DF422C7D7993ACC55F657E6E1B3DFA1BD6C1CD55FAE97E69D2F8F5AF368F7DA0A63B4065EB6D8F02B19A34600252FDFFDF4ED8DE2EA9CD2E74D63A6CEF29BF02F92D346ECB9A61081EE5AC811F33AA5792F6A1AF570A8B0846F3E6EF38452346DD637B19ECA37BD1A6C42B20A5BEDE9A5DE3C9F169D04D8C6CF5376D3404F0C21DEAD53DA6C169F390EED7B5B54DBE47CCE0B2AD1179EA8FC80FDDC7281BD4FE31B9A26A00444AF0B4D40A1B72BE37501308906149DC6FC5CF02B6F60AFF82B975FC8F146961EBCCB4D126ADD524A9B33BB16F6A83C6F3727A72EFA2BAC116E493E07B2CA718A63FCAC8E9D52A1B61479B4EE52A5ED30FABCEA4D01A792A92676721286814F3B0F4E15E23CE0C5D59A0C3EB8573C0A2F66C25F2EB2FCFF787324721004979BE5EAC505DFD39F5538E2C1B2CC12D20C1C5CD87299766361AEDDBFFF743693081842378744879E6E6371B3FFA9DDF34966FBF8DEE91B7EDF6EEC3E4E2F410CB5351F847646C22AB594046DED63347D04A008FBF6EE9696C638ECE73B39A269DB239DF36443868AD44D26A5C40FC92DFFB008E436E5C18907F5B18B5E6C5900B41A9801DB070D2DB651187A4DA7E2647ED3E9B6E9781627EB576BEE8334374468760DD3B32985D42945D953D434BFD80D7F7BA537265FFCF27DB0DA1ABDAE89BBE94D98BC9CA197E41C0839728F964FE4CE30B8CC43CBDCDD9CCBE06FE99DEBC6F4024F3F00D43FEBCD62A1822A6D507337EE79D4517AA486870602D4F1C5368B0EAA1FF6C011A9A953AAE58C75BBD3DC78D263A578C75CDB1AB324D71B9A065A9AF3DAB854189585C68D499AE8DB887745E20AD9738705B9D2F5D429F12D6462E5E2EF9FFBA53CE2F4E75449D2A7DBC3C818E61DC546175A6E0C10AE631DF6B1EAE6D134C08466EBF6EB5F8257AA10EF8C6F27F4295F7EBFD450629F3EB4E0F4BE247AD7F5E80703B1247A4FC277311D69E5D62E0B0201A805CC4F1F807DE99420D563A703493AD35A56B2B2DC237112F5EC21C70BF139A9EAD8F7E921F086E001B4C449E42A0E3AFCD5BC757040A2865D0E5ADAF98E37E6F8A501FF39CEF0BC364EECDFFD03069B81F5E1978C397862FD56362835C059FCBE4D8E2A957FADD7D05BB195E21AD67B429621E1D6872DE2D8BFDC91544F9E6AE8C164A23255AD0E00BCB21456F8FA6AE018F49605736C81A5AC0945E2D965F1493ED5BEFCE512AE93AD91DAF6F5A151D6C9856DFDDD1F877945D932261DED67AC8231DC3CCD0B04DC1B02079C897601E363FFB9A3BCBBBDB0B0A375E69EE4A7135C094ABDC237FAA2E5F82D2556290ADCF82ADBA8402C4FC9D0724F15BB87CD7A75A1A7BF826896D8EF63C7A2A3C371756AF638706270652C376100EC42FA55196DF332820D377760448D3E7ADC42E9F5D8A7074BD0FA97433B0E2C501252DE6939AB948552663A17DD7FF05430FA76E29F0519D650B86FBB19FBED097143FC242573E3E6FA4BD4A2EF6D9CE6932A066B4F9FF935BA9BC26FC2E5031C20AE30A52970A2DF3504576108D5F26517F8577BE61E6AA9D192ED62CF36AA641DA0D274B1ED5EE864B549154EB4115658E6C60219CC5B2E22C49CE3BA76A85EFB549117E1207F6DF081D0761421262E352182239F1E34EDBEA4BCD8FA0027543824DD58A20324FD4CFE943AAE5E361C367B22F587E2F9BEE841E11875B026F12B9571512F72985F98F6D0C212DF36A60975429173E317F6ACF72E621F30654A6DEAEF9E9E455524BF07FFDF44642A1826F734D69F3EEF4D52F26C06376C8F71DFB65A24A4C57D74B5976950AF3A57B4248909524BEC47D858C69041EED34E0ED3B111BBC117AB112BBF947D646AB3B7172F5FB726DBC53AE37956E29F5B6B1E3C90BAF4E4FA544FF63815FDF4AC9A2A80CA0E8722383437B9A02F3AC538FEDA7A6D6C1635D3624A385D846E79E956DCE483B89C346C1287A1A7293168D8A885FEB6569EBDF3F47F8BBB50AA43941EB20001959AF1B9B358ABA13FD9BBC596EA42A9774A120AF091D544E79C50686C26B4FEA396BF1E4C25B8EE4929D75569A5FAC521C77B - -count = 62 -seed = D2629CEEAE5C95D3C34C1FFCC2338B4A97782BDFCD39111E18540B69DB035B352D012857111F816F03550BFE5F56ABEE -mlen = 2079 -msg = 7F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 -pk = 4762D187C409164FCE8D288E42605813E5F8912763FE2C4DFC0A67066E93131CFA8D5D5AC498F95CB1934E517F20111C72D1E5D4B844B36227C65871A8991127 -sk = 4762D187C409164FCE8D288E42605813E5F8912763FE2C4DFC0A67066E93131CFA8D5D5AC498F95CB1934E517F20111C72D1E5D4B844B36227C65871A89911270200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FCE18BDC2B73DA3F08CC08DEB38FB207ADEC5E2E8DAD3CDDCD49369BF83C460BFA30242A1CDA430E7D7081A1CEEFFFFFFFFFFFFFFFFDA16287EE72644AF6AAA52E8E82F4BC2831AF7DEF9F1DCF5EF414AB44A8E345854AD5AB25622E4FFF5146396F0A2FAFFFFFFFFFFFFFF7A84CC8EBDDCC8A82E905147129DA2FD75858AC5162CFF28FD977FEDAAA1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FC6D3D9B53F7E5990ACDB718F16277600B183C1F4A05AD99FE45245C9540800000000000000000000000000000000000000000000007C41D06360170F11815CE0949D57D44BB94132A7E1872837C7DE55D50A4D7006479C0C87B9B52FA583466C0E190E35B3994418DF517049FE00E0BA7AB9B96A12D69EC4AF545BFF09F4DD7CD5423A9835DF482F5E752FEBBCCC4B5445A67A5F2CBDBABB2776482B6B84E65575944264E23721C270D46AB98F2452B28BFC3516135B540FAB48B00A85693DA6F13718C8BC4CABED90D9C76FAC87E9CB165B414D130DAA896C2C1CE295912DBE9E63D830A8F1E0F912D78C3FB377B37801F52CAD33F3BC213F6507744D3AE0308CE65D941F1631BBBDACEFFAC1DF858B4D5063CF238512D04942FED8DB0E9F7A23CA2D6FD1DF2BDD553464D070F9344457B25E5A08F6B4D4189BEE146E4143424A71EF72446168484C5F298D62FD3EA72BBB0732241888DF438227D4B20D284F168A41E56C5B30A81F1DF3CE9336ED73EB73A3E029843C84112802D9247691B1727B09B952471DD0C69D89CDC9DC41F8B33E32E002B0BB59E0E59A802EA553C049D436027E20561C94EC9BCB31CCA0816CBC50921A0A09332D748E1185735DB88554F15FD4E29B857AE2CE26B61E04EF96767D9A0E0B6D345C8FAA7C1C196E188665258491E1A4216F7A28F06EFA3A4D8D541E7D2F -smlen = 2256 -sm = D7DA0CA78295F2FBBB0650BB7CD908AFD4168407076EFFF4BAF53E86EC06FD7E6757F4ABA431F7017565257CCB6462BD2B0058F68F159C54CA01970319538B90E2D05752F5061BEA2F4E7C6F8BEEFC0474D0E6E101D6061D8E04078983674B64741BEC052D20AAFDBEE6E56F7E00A1359916B2060567AC012ABFB9BFBE07B4EDC70337C3DFB8E48104635704011529C0ADC78276214DFE6BD8F75F91730D03C5D1C5C874F79ED1CE0039BC10C23287FA007F704CEF1C510BC2CAE9B70FD248C656226BD5686D366528F0D0BEFC0A8761EC640CD2DA7979DE5EEBDF6127F29ABB8607F8A3D3BE05BE25AACE7FEF3063DF28E22A522FFF0B6FF6A0C61F79B02A408E8E1C775AB80BE6841E9F8A9D030AE5518E3EA8A4E31E416E087D47919593598FD58122A9E601A57EF02DE183D56921811AE2253628125C24F93C84361C5EC99E7B16962BD96CA190C68F3AA9DD60CE3AA7610589813B4FB77A4688308D9BC72CBE918583E298E03AB95FC500209C14ABEB3A43BAA92DCB11CB523C4D17EB9C6697B56C8B61EDA05BF5789166F839291CFE2997B7DD462EDA69B0615F2AD82AAC0A32F4B30FE8725849C144A9C07799D6CE9D293C25D8302161757B8C8C8D07032D914EA7DAC275919A1DFA0D3348EC07FDC70266975722763EF85EC4AF9E14288C9659907526566BB3F2DD5DAFC0D422568CA3AE52486D3F2C18B667E5622BA7E52C56BF00F82AF2108CB4949A09179544F30758B7FB98C49EA160720991B14E2858D648F0585AD1BB1D08294F029BFE936154E9D328DF2E054004FC5C29070DF9EE50DCD0981D2BFB3AA7D6F637C4CE457C0C66D27E2670107A2B85D1F026BD970EF3FB7E32C60218D5E43A06D9CD26289A937B4FBAD2A831425728F3D0D30C6C602AF4B14411E9B3C7CF0B4D630614A9E03AC30BA2B024D496DA984D08854F1366012C2400A5C8268C2B126DEA5AEBA0DE7C92BE0AF08CA22E02604A753702BDCD642BBFA0CC91BD8375657A957306A76B6F139621481B6F15CB57BEE128954D30F552661F906D8AB42CF260F30F88993BB40C9679385F5C4639888973361216DF3C60C57D9B250F64B7634C94DDA3FD122713FD2405A7B71F476C263A781DCE271E7D0665E45DCB27F7293DE57312396C58C40E268F57ED856F536C8FEB4B0060488DE3C25949D2B7E64207576641B34920D04B46766AA2978D9352C2769D49F8599F3D0439C928532E0EE428A3773FA4D68E6052335C6D93368E321D750D296799FAF87B82C640A6E995D18DDA002887F141DB8ECE2584DA2FDDF848D38357D585CD619B1625A70A5D333561D6DE856ED9908D1E377EF7BE03B326594808BE58F7FB3939E939B73F11DAB3E572DBA41D43A046B8D2BB521728222D5A77DC886AC6F328D9A531118156D791D64F5DF8FF8BE8DCA32EABC3CB259B0F72B021CEB4DB36A6CD2FD149437B251F81F7588AE921456BEF1A79FE83447D80CADDBF20895667CA0E493A4731EEC901E03F66DE284400A5558922AD53D4E0FF7BC6C61640ADE0274C63D94E96BF6C642B790823109F53C3C27130A1EE38D448239187F5009373BE328AF866A9B8DD1BB735E8002296043C6FF641A432709148C707B900ECF46555D77644565D5998C096756F79B6F0E20850B8BF0528E78BF5FB4859BD655227873D289CCE47FEDA8414D09ED7E8D380FC4D580C7F44B01521E829E7B0CB2D2F345C517B65E2D476687EC9A4C160A3AC0B01CBAA588644D799B125910812790F06C1ECB1F1E64D5CCF92AE5E8147C98B0CFAD5626BAB5115844198E8C2AC1DF9A208FCD2D2891F4A29009F5B36D8E31383811A9493CF8E143B5AC8A14D48119CC16D2C6BF6826FC47D4B782FFC76B64401B8249777E32C1298606553DACF386A22809B599924A635796A1AEC3CD8568064852E54C95AD887D7AFE837F6FF676F69EE6288879F6D96193AD94A0418BBBA2EED5355876F2C3497448A5F8F3F83B136703D9A38FBB62784CC233DF448A5E88EB5F81A0BE97A16FD4CABA1D87A4BFB08E002EBA548F662D496A1478BB7C26C69CA4C100AA6872A4945D703CA812BDBA53AC86010AA1D2C53F29E46AD095936FF50DB8805DF4B08C9580AEECE3A6DDD828E7B5D4DABCAF112A6E35AB3C28A6DDC4D98AD1063C2ED72CAA50086E6B72090CC1F2AFEBEC6751F27EF51DD8557E53D928535D82A220F62BA0645E3C2618F3424EA1A339A138C9B8E26B14BC32D1736A4193C0C72CC402C3EAB58817335C1424BD6F38CFE16338611118B4100E4038D07DCA041C72E485C5290F0DDE601565DAE9CDF657A4C7839D3ADE72986AF396E767430125786E219BC5736F16FEF66B4014E5961CFB4CFEC4CB2A32205A92DBF1399E2710395BA1240D48277C120526CD9E2352F7D04D89CC2754379CE80A2CD1AC765718B8BA61EBB8BC6D0D407022E7AC672065FC8503BF5BC4138520CAE233EA997463D7C9E00BBD852F12EC17C6F1DB1914446AA21E156D210094B699B4117B31EAE6386DC0DE1F55CCEC09AA1EB38CDE4602598D452732C5EF8B07C477E3E2DD470737EAA7357E2E8B74C31A117B519BDCEF79B6B044148A10468E38B5A6B7B10D74C6130A60A268ED73DC9A25ED68AF354758FA3F57ED3558DA654CACA7150A8E4449D0EF640184A7A33D00BA765B01C442E88D9B4257B93904ACE04375679BFD8271A03073E34C4A1C0437C4009A9590CB98D0B5581DC83407F04A22C9B0246DE38E1A13F9B1191493818783950548BE562F940240CDECD4A50C94E406B1BAE04B50A3A19E7923183E3FD356238C45AE6559193E0E846DF0FC6878BE6C963AA8C3508DC31F766A4B29C78D749C89985AB8F580DBDF7993A2261CC4BBE489C3BBB38C46739BD2516D3C64A93F10CF559DB6A0EA3BAFEE8B43F696A5288C66509A57C642BBEAFB40F4CD0649B4CE25B6FB2EF5529B73556051213BB39CC4F1DC8004B1588C8DE836699C66CED567998523AD3AC303D9E13617CE6C1D2FC4C35B22A24504C51F64155F24D91D0E8785B40912B3DCEDEDE71A6933B36BB514FDD1D3D843AAACF2C1E79A5216622C20036C9C999DAC3A5A2D43FAC3B23119927806F497B4048F561A2276FDA0302423147D35579DD4411416F0F59273429AC0464AC49B230E29DC124115D18A045663D228BFDAC9F57B0C5B4 - -count = 63 -seed = EAA4FB8EF0290A499A1D92EE398A8D7E71CD3CBF01A36750DA4B7EFF175DA26D17AC4ECE49A84C88D1D2C2493563C26D -mlen = 2112 -msg = 2E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 -pk = D5529FA557C1CCFFE3473FE3E78089FB84A0072EE72D0F4398142C4A60226C0E8B974D701D0A5864C8B25CD4AED4F8ED6751F17EF554382DCB0310C64CC2FA32 -sk = D5529FA557C1CCFFE3473FE3E78089FB84A0072EE72D0F4398142C4A60226C0E8B974D701D0A5864C8B25CD4AED4F8ED6751F17EF554382DCB0310C64CC2FA32020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D0F2A2ABEB551AA4B239F52FC5C49E4624F694B83EE27B45A7AC88DBBAE93BCECA43395192DEA64BBB17CB0962470000000000000000E97491987F700EEEAA9EBCB34303FA88937FCB6A3F31F671B6595F8D97599C985ED5191AEF9813BFA6E41F451504FFFFFFFFFFFFFFFF01B68F9C1FCB5C885732A483D415D551FF420B0CB07A999BF5BAF94236DB0400000000000000000000000000000000000000000000005C4D60B8C968D955BF0797AE3191B1074C55BD5516686FE7C318C08BACC70E00000000000000000000000000000000000000000000003C49049DB258FE5FA0D0BFEC931AEAAE954C3E046E96F289677ADC224824CC3312AD274FA9D60AEAF15E8C402A4E6F78FF2DF58CF2B6277D64E81AE0924433214323F227E12E3901B7A9891140603801E38304539E3C7EE4354CF1D35789D7065871B280BE3B257AD8DE80525D77DD1D32DF8F3099DDC5450C859E63AC25D4242ACBE031130B5466809BB0CE1AB51E0A613F9F4A00E217B03BA3B6ECCB0A4030A4C7889AA31C81D8EB5F151DB8EAF161BA7BBE83DE14070109D0A2D870E8D1113E0DDCE0CF95E492A33307C0AD842921912FF710A22E0D25CF8E6817E7FEB712E59495B7CD730255C51E8B12A659C2C1D43898C73CC22F657850000EC4E33412CD4AC7B6F0ACE53F63D065877C2A00E876AC9EF6E05EF8D9BD8755DB52F9F41500EF3CC71DDE15097C653DFB4F297B2D355C6B8D7598784A3098BFBA7E20552E34754DFEF99A2572D70EC87826171D2DE7FBF21E7D55C5F8E840A7403FCE2430E0FDF02F627DAD79539ED688B8E09DE7E1968521AE047F1B07BD1DEC79F5F603D64C830900AFE5E0B05CEEF5F0FF0B5BF18E30E31B1B85957F5D75C0F046AE0410956BD03720298D3D2E250911A50E565E73C73F7FD099F4F9D9FE21BFFC6A15 -smlen = 2289 -sm = 04CC9069EA516BC99305862D5AEEC49E411B4F02A3A90DB10CACC2F3D6034BBAC3715C1787BE7801F287D9920B65E6810C02517EEB34FD586581EF00D222A3F27575F3F0080152FE07863D54DB583A0290564F1E0B0662C577009C3FB47E06DD5F539D047681C05C5F2033901C07D5048F3295AC4FDB79074F92F3A7D27E145C2A05D096DF5AE481EE2AF006007B92666DA4793093062D709B85B9305B0900E84FA03E094D53601E046CF79612257A68002E086FA0C4582E0C6CCB020F86A6107475985160BED201760D6489CB05B8D21452C81BD5D317F8857703DABA24E968F3164C82A4A9751DD88742B72141734DC0B4A77CBE2AE1C287A396A2F5804519456CF1EAE273A5C6361F52C35EDCE5ED7388D61D01AC040676522C9FD7B02A7DEAFDCB4169867EFB69792210A7069287C5DC958D0953C36F84D9A26989DD3B726BE8B94B41DCBA1B5374123F55A6DBD6360698551C27D16BAAFBB0ECBE116B44F11425DA45D7FE8ABA91697D83B6896A06A7888C97A91406B81B3A5BC8B68A984750893114B4011B9C8BEBA6F5C2D7D9F2C7A27030555633A0F90E30753A04B1958141AF7C1B95BA208DA36F729673D20DA0A83F913BEC8049F8CD032D9F9DD94B2086C61643AB2CFFDDB2B9BE0AF996D642B7A0A31CE0EEC8C61B343ABA980FCDACE9CED7BE4C9048B356D41002EEE0433428846BA4220EFB7F493FF57B0C706282EEE448CF7DA9B17B32D0EB0016983175469AA5BBA53489EC56BA3A92A70FDA2390E3A5D8C038F496E7C3180C6971A39491EAC10D828D44B3DE2BE64569B907005783E62710B9AD8EB8C9AF4B04993D40D1EBF165EFDEC748FE9F6B334DA6A30C568BCBAD095998A47242CA16803FE1720FCAB85233AD76EBDE102A5D93AB98460494BC886BB04C05AE89E157967747F8C050B33CCA52ED5E59050965523EC5C4EAF94CF2F2EE80C35AEEDD14E65D937C92855D03FC76ABAAD57A21A42420819EBB9AEB65F031F9C4BA0AC2EA27289E941DB89669A0620797091AEA3EBFC2AC354E94D27894F444FF9E604C8BDF7D6C00DF0E7FE9827171010445E737D0A5867636E3488EAACCCFCBAC1030C0DFAB639AB45C5AC5435E2C5B8244E58C3A6BAC81EEA408020BFEC66EF55FDDC618083ED737F4DD3BB65474487CADDF3AA2720A6931FC69533B6491DFC7E6E5FABF8103D05F870BFEFDDEFA20822A68A710B517065BD2478CE080E5DEA09EFFBA3A136C1BC9D7D8088F736C363B30E2AF2A6F2395EA8161CB64079340FA642C7763E3BF0623C968A16263CDFDF1B8334E427955E20C1EBCE8C8CB136DA8D002D8A9E5DA3B1F56668C1C59E20DC3BE026A43F40910D3A2B601D9D3EA2BF6D2C2781F976BA840FC986C8AF0DF84B8B0FB291D1310039D6914F8F7CC6B26CC33AF94150253E8EB410344A64344A5A0C06E0F3AA23C68617C6F4659DF79285782C89BEA3091083A069EF8F048371CFA054DE45E32C19A44DB5D435BC8FEF5570B68D80D5BF5DC06DA13C36E3AEA341CA9FE20047AC30683AA9D862306534EC93E79EFF79FE22E3BA15E2BA3F59F7B8B9314DCE31095D3015710C2927B54BA6F46D3981975229EED16C9B17813801C7D3CB3604DE9B7A4F18C2F91B2B50C1F43E87198AFBAC718935DB9CB96D9FE048D969635CB9F4DCA659AB1612A698CE45336B8D9FF5468301BF05D04B3558D66E88DE88427FE87E65D36D3C29FA3FB126F1F294E9BB391EE427001C34126C6622905514CE153682754D7FB1C985AE4DA600AADA1593A0A214332B310620B1B4E95BCBFD6EB8A241CBE848BAB37462224994E0D2F3F4B521DCA4A9A5AB10BEE741C5919907AFD2552D4AA300ADDF67CEC2862420C8D1D8DFFF60FDBE2D4A8D03C92E23BDB3400F5390EE4B141C5843B1E2C07C9AFDBC70E3FC08E2840EBF3B0E5296E1EE44D12E68240FDF063C07BEBF01C08586E8153068C1ADC744A7B54F53B0FEC3C752DA9F6F989A1AFEA4ADF1AD6AE926CABE4E0CB2CD864412DAEE377DE559A38047F31E834A6CE56D4041BA709945F07E514F96D783F32B0EFCC8B889FAF2B6D217246BA7C07B687E028F23D2409BBC12D6EC0D94AD9697BAB6395B7070B6FEB2E907A119209C9B7D86AF953BA7D2EA63982BCD794A5BAC69407BB7CEC5E027833B17420F146AE08F4B753BEF6CA0922F3294CD2A670127F9D2A2CA78A30F62056A425CBB7074C9A55135BD06CE677ABDF33B420F66CFDBE9461BFDF385A97439B3431CD29DECD9B5E59EC3ADAAE879A4E8D5E28CA13E73FCDBA51C828DE271207A5DEAB373B1B6677A29ACB87CBB01F10CD2C090EE66D472E8DB61615A5ECB84A7FF0988DD0DF9831BF43D732A12EC8CD50A86ADD12A5A2EA765744B05F73725AB8704ECCB08BD74517F21054E58903481E7A724F7FF24C43D6CD23DE84CD69C9E464E67003903C3858A6724247EB929716E170E2D2739AAE10B88BC3FB8FFA849E385B4113E78C24DE1673FC7E7285E6E3744F3843AC7BE7EC16BF74215694CE467A2E859DD4FACAB86250FECE28E0A6A31DD529D08566A6389B85C310C28A8DABBCCA9CD6A631EF0473ABFD6846D8326561CC9CB8181C1593D0F15EFB8129AF9E838AF518477CE361640169D9731FC139881D452773F21A3E79E514DDAA513D7B9F3399C0C57D21EAA00D44A7F031B79CAC9FC304E936E75A0CF8D204A6CC3C0FA7D037DD8ACC3A33CF5718061FCD57EBD06A607FE0BB0204E687B2A17B1FF47DA357B51A753076CB89422098D4F880F831842957E648C54ADBFCC0E488A95581E709B5A5A129DA7EC5B00AC9B18B80533F2DD1BD0F475A61DB18FC0C4EA655F602B207B572234230C831B26CECB7BC3284797C4BED5A977C3BFBEAFEA3DBFC4257D4C2C5BB8689830EE157F3B5AA1EAC09CFCE0555880A074AEB86062A8ACE19ACDC1A25F8D0E454F50F119D12E707D103F3C1A502D4E358D563E53554395B5D386AD49363978AFBCA2F8B673A693ACEF70D1DB4CEAA8FA580160924D4F18119BE46C71E09FDEE45EFB14A74DB1C688E99E24CB6025E73A3E7F0F7EA9C485274D2B6CF9784CBE39E388F9CCF1E2E8DBFA6DB43355391A369DEF645F815424253ABD0B6DE9C0A0AF156D9A4EB7474A2E5937F008134DEBC9FC7E54812967FCF5BCE28FB5CD43F1AA240BA2E9CEDD6F350D556DB1658868091E6034D7E1EE5C6645D0A345D46C42E23C6821C360F5ACD13F589 - -count = 64 -seed = 5909111F333F3E939105DFF8532548927EBF289F31A72F4C1B0C66816D8B68F64622F36A9BC85E63601BEE8EE7CB3DC5 -mlen = 2145 -msg = 5180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 -pk = D4F8587E96BDADB95988DD432D828F314B513B9903B4F65276E8B53B237F7714E4E4F8F93580FC151ECCF5F185DAB6711D595361CA8EBDB7FE2FC263FEAED111 -sk = D4F8587E96BDADB95988DD432D828F314B513B9903B4F65276E8B53B237F7714E4E4F8F93580FC151ECCF5F185DAB6711D595361CA8EBDB7FE2FC263FEAED1110200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C14D6929FDF29EE12C4E203C06CE7A942A5DBB13465AF58073385F1F67DFA44848D3EAC8F629CF5C1EA7E48862F00000000000000002FBAF36CFB9677257A0FF6E12253DD3003CFA6F071A29BA8DA3DFDC48F9F923C6C414EB28E29B810D28C9C935E24FFFFFFFFFFFFFFFFD1935C30EC8054FF358E8A995FAFBF46C6CF9E6F3BA541B54BA542DD9917F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC3BB0C6B300D6E1469DF06D0ADA95FE51C67E6C7C0E3FF5749A01AB378B080000000000000000000000000000000000000000000000680232DE2D25EA04DC29EC8F8EB28047C32B0FC262B8A2735E2E94BC57B97C12503DAA0D6962376BEA89A1603C6462CCA26B666EFE0BF15A373F421FFFF21F0AF7CE3FD4CE0179ECEB0DCBCCC3783FCDBA9C1FA6D104001E36AB681ADE232F074299B0A283BF3390F218551CC4EC7731BB915B1A41816728EE2EDFCFE840F3204FD1E0DCDF4CE18A65CD9DEA37EB07E1BF1F11318E9CC546020085A8CABE1B024B6E81B9129D4F28D7C15F47B0E6D6DEAA8C5A834ECB36D42E99F475BB067A0B1779A214ABB1F6838D352046EC3590B36367A6A199C726A58F39B2F2FB270B1A28C1AE1668A572ECEE2F0FAC437B86A551537B500925C1C69196EB21C1BD5021E3008D4D75B32140A71DA171B5AEC6B2E0558069E096EEB305947191B67814107490F7E31C5C66F7D9796AE45984AAD109E750442BF5FEC155A5BC9C921EE23090DC9A4BF067BBC173304122170783722041351368445241A4BAB80AE271581CF4EA84C4435007C61396D08EC7430D00A7CFF55ECF78A9CD8DE14294323F530D8E3E870ADB66517DDDD5B5333D6CD4C446BC0CFA34BE9F8B092EC5136E20F233A1C46BCE87C8BE6C92FFD8BA11C1DF093DF06292FC901D6D994831583C666517 -smlen = 2322 -sm = 5CD864F1074BCF832E074548E2AABB6024EE480491EC0FF2B589BC9FA00642E88A5D27C33949E0035515CD2DF46F0D18AB0306B9F04953610A95F007AE4BC22599A91CFA3E0000A8C91776611C8C9501A0B153077A4B06093002BB9F5CC102B88D6024042221323EEB34FB9F8707E75ED98A32D8A2E06F07285AF37A7417738C690629CA079DF87C1A991A0000E1A17A6F2B92FBBCC7EB189AE52AE90603038479F2FC16600A66E204FF716D3DC83412025180B7DE9A84F651DA10D334009B3D65582F3912D329FBAD4AE39A9EEC78943338C29DB4F49EF41E3C50DABBB530E99113440383F20D5A3A8AE279A6201A0C84B003F6717C709C21AE893B6E412D87F8E0CEE5A89E60A14CE975A4D42E4F43F4710FC9FA29E9B2AFA93441EF5570123AA88AFF009E2507A3E60A79CDA25652E3AC3AC0C10A816BC04739B6FC758FF9AC467879BB67F270E4EAB43F10A633E5932B8D6DCF23814DE8643407B17B5E2A91B340F7BF6882DB694DE4DEE4C480CE037B9F9A220ACDCE84B03746F307A6026531D712C0630E7DE3ADD3A8516BA602D2463E3478008B3252B658FEA54DE41265B5C81E4E913EA0E2A63309497ABF961EC40AC374ADC0FF3C6FAE9BFAC5CC2DF475885B0BC636702828489183CDE1A2934F2D63828AD1F2B8CFAFFA53151B0FFAE6224DF54C2AC47CC8844B76222C2A3B6E132071150049B6E46AA75DEA28C13477980315FB64CE500BF0C6F633AE621D65B331BA96CFAC162DD7897B8505257E228CB621BBA9176A7AFB3A2CC20D7804DDB3AAE4B87FFAFD3C8DC541D05624DB02BD62491067EC1CDF73147014FEBCFA5B561756D5E7A13B88D1E7B2C0375E1D0DE71ED20CA9CC4E6DACDC579F1AB024AAE2A0BEC9004E5DD81C046F00A2A4CB767C4EB240D205278CB863D1A61DEF16635C6A84C2406288410FA4B73B21077D8F7A4075A1DDCA3D0D334725151E434BDA80D3E73593338B07958D27337E32CDE0010DFE5E58B99EB27A97DBD1C5E6F9A552A02726AAD5A4AA63EDC336D83E5870DBD514193367AF2274804628B4EEDFDA3B2A155694E89F5A6798C5D6E036159C1F00D8DFB03D41940E775974B11C3FE4456E07B127CCB44E6FD6B2918F57A6523D7F77F32478D9F1BB539846793D4284E2907830E5EA76054802A266C85B122A389EAF4700629036716E2869C0FC9440856D562711E903A1853BC68582A95344B612E5CBC7C5B2AEE23CCE4161A75829B2048742FBD65ABFE2397CC7D66023DE34DF4F2DF8540CCE9781ED6482D29CA4E906716C8CC9596B158EB51BAB8C2E00253D6589A99B3D20FB494834B42BBFFB80E7B0441E356B541F83877736985F6330EA459C007CE8BF18D84E78E36482D581DC7DF97528CE15F68E604B4DE62422B3AA76F3E7E5B33A49CBA9D89FCF50DEB65EE45173795393A50FD4C60CF6BECBA7E733513537D13F89FCF1C4D6437DE0EAE608FB11D68B9ADC0C3A19A3565F6D62BA81A326EC334B239B212B87320C03A75C58DC8F828C4195ED9D7ACDDCE493123E235D098E9DC60F5D3A625E1FF66F245E9977F9630A40D26E3AFB6676F5122A88CE5507BD825757D9CCD53FE574FD0E6E728DA355403AD664FFDEAAF636256FADC3283D6F15B297F79216833CF2C745C4C5E17D03260A69178F2216168BF8F00C9889E1E35540254F150C587A884CDFC9E5F7D379BE474356C06943E416EB0697A1AE989AB4872D0BDF436D9FFAAFEC1631C9939FCECB84DB2846F12CA395F506687B4A5638085BC6EF58FE8E2ABE9F8D51F272EE855E2DB84A89D348DD66950B8F43939DB897C519FA302594FD1FBD6B6E94CA8FF63A7949432DC2D35C60803A570B1DAC95EE0A60C62FD18B3319601AD29A156400D392DC9A14FF50AF6752C1F6EDC2ACB7ECCA71097B6E82227DE429F1A29C5E38ABEA1C74DE06E6788CB1790AE9F0E8AB35AFE60B001F45971D42949263AA62519B0D630281A4C5788D5591B1EF5A003C58987E8665701E5B1C6063F93533094E96820F918C354903775CEB6675C4CE9CF940C4BEB8845B4F5E1F642BF505821E5A23122E2D1ADB82A63AD18CD1E4775A96CA9EF9493D75FF784A2D4A99F54DC3F87828BDFF4B3A3D98FA5A29B62A85CAAFFBACE4592A81BFAA5B8BAE6606AD25A92A43140690A6003AA2D617FC707A53EC9D868E33596E098773942D798263F58FE5A1B23046CFA136EA35203B90BEA2C5F0AAEB5EA8C24B8B8CBA14CDEE28F45D0278F193228484BCC7E08A75D0064D605D674ACA9019A0A9AAECD6AC672CB8410FEE4192E6DCA7855FBB1C584CF288BACB40707D7E6F8BA2956F6D099F52BC7B0AD72B5A3FFC03C7B47086330244EA5D393C6B9F256FD82D5CB9436A469ACC3F8FC237146895BE148749F82D39B7BA4CE47715BB393A96AB471665529AB9E9958B12396C1BA7529DBF289184FF0F635C2BA9DF301036C869D52D993463222B70BA778E81C8DC668DE41C0356EEF5C39F1BD42398BFF30F959E115C6B386E73F0FE28A2665BD463C781DA1C46D6D4EA284B152C8C12426DC9CC467809BFDA6FBFBC0BB4793BABBF6AD564D57AE9F5E2B7F651D6ED980F8B1174A126CC58B23C32BA73F5031B3FCABFE7BC360AAE412D799CC14D8B252D9F9EC9005B7FCA04A88CC8AE9F7AEFCA94137003D5764FAA3C7C45670585C84F74C4EBD1F5AD1F97EA093595592FB90E3CAB01F98F06E114F13DE67CDC36F3FFB01C3D51EA643C25A3F6AA2C57690E42B98583D925AC7B06A349782A1D33C06BD05A82A7AA3DD679326D948D74A1861926B45DB78D36070D3087AA9C5F4F42CA57EE9CE7035BD88A85CE1107C8E07E5BA3A62ECF012BC75FBF97C4C72331B55AB9A6EFFD78869F1CD3F330526F262F7DFCFA2B084B61E90772D5FCE8F038C0F72554467192CC8A27F1F53C8714DA1864815974B00991F466648478C5F9BF036DC4083D72E8D144AB10FD32408DA7677729347FEBC79E48E7B87388D9B59AEFC84B5B3B589FD91863811A6436ED76B43E657F7EE03EB796285A4D93BE9AAAD1E1A1E81687E42EC83F3DD059B78BB7F8EC70E6C831DB5E90C6B3AA511F36507DBC8E7A77DF0F5B9EF03BFEFE9471DE7C7FBE67B9922260D3703D95A5BFCBCB62D830E20C23C6CFDDC210E47CB575957D8C3514A2ED4561C738928F210057896EAEB1499D4DDC70F44E30661E780AAF5C0A20C8553F40D7D3FF6D120511C1073510D04F2DE544121AB851E98F666906367C21302EEFB1AAA723F6A531C454EEA0BE7D50 - -count = 65 -seed = 238461A224ABEECCF709AB6CACF4EDD372D45E5F4274095273A49AFE614F2BF713134ABF68B4DD058E6D7B612C3658C3 -mlen = 2178 -msg = 99B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C -pk = 7C5169BFBD87266C73D0823CD1913C38ACA58DB8D408EED86736FB0B7D26C12990E3A26F83B435EB4502BA6A38E6F4F1441F1D1A434DE6C0AD6630D7EAB4AC01 -sk = 7C5169BFBD87266C73D0823CD1913C38ACA58DB8D408EED86736FB0B7D26C12990E3A26F83B435EB4502BA6A38E6F4F1441F1D1A434DE6C0AD6630D7EAB4AC010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004C486EA41F6BFBAB396DC96B8F3138CE0680135DA4DAEB23692AD4BAE07540ED3DE52CB6083573A6BADCA3F85BA304000000000000006117690EEDA4586E7578BB9FD31F0B0EF24109B66DD01A0988279F7BC2E4E203DCC9502F7A796CBB69B877F56FA7FEFFFFFFFFFFFFFFE196A6AA0EA15BE3B5375361E3D7315073CAE34F0EE045BD0DACBE442C51F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2CDAAB0144B400E0CF33457676C657352366C3B3DBDF1CC526E80CF318FC040000000000000000000000000000000000000000000000DBC19642FACC6A6F7FE9847866715EC2A11780B3E4840C00FD42C63B744A4C32E88810FE355ED0DC74BFFD27D8688F3E610CD0D1E9A16D0740AF80FD53278F046DAF03BA35A7869CF710FF4A3588E1EDEC7F0831C30F040354F44B3C001E832D0CD3CE0168982DAAB4827B07E0654B8C139DAAFC251647F95A848A06A2FA1F1C5CC2886ABBA3A0A01979FB500885DBACA405283BE732D2FD926D5AD06E574134073B6436BA5E278459854CC3444EA428B3BB288EE62E59A5F0BC531BEAF5C81BEFF4920B17B68D09E8DE0CE5A2E3D61451256A55C6AC034126E8B4159F7EE810A07FEFE72140FA3B12E5B5B08A8D31E82B527F595404F2AB454FC82270E0A50DBC97C0D87CB447A0C96DD690E175CED4F53788C1F29F9779F1DFE9AC88FCEE27A1EF9EDC3224B9945E2FAD384A7920B87253587371C8A4433005A37F0D48A20472186847623B03D022AECC0E23A499767E6E89BEC37CC7677D9B4C652D05040B4C0A17C200EAE29ABE85DC93BCA7818FF20B2F76509A088077954A8958AB3900A72588FDDD06844112A3CDCE0EFCBE9D5AA44D4F60C2E5302A79BE2358F14F2F4CEAC2008DCFE40982725DB4AABE7A3472133FA66822BC7BA7FB514D8186D226 -smlen = 2355 -sm = 76513B191B1ECDB59D07B0D45E8C6578FF188B047017213D747FA3A13B003B59983797F878AD7A05B38EFD918106D135E503CE33B333BDD81F707C078D7C5C1052CEFF28080739DA931B75172505F906AA940AB13848C6FBC5026495929085D247E68E0797211545C291C9B6EC031D689AB30E635A2B940473D4CC5746058897AE067EBD31BD709E293BE6040125182B32A837A38689B0A8A9F7E32D4105034120E519304454DC6805167E2F6398C8000299B5B6FECDB52897A1958C5C3D1FC2F20B7D045F551856EA3CB441BAD9089C64CB9489DB6B63E0655AFC4C2FA73C7417FF1B80B9C7A1D659687D2C415B3A909CA30E96849D4BCEC6A9A6A4311204936BA972086B2394D86E840770D01550CAA6AD85ADC0EC851D2B3808E4A0E9830B99A70F6204ED4DBCB6759F6228126039607AD7ED8EAFEEA28D1C3E25A46BC18AF7E01F55FAD8244F15DE36F890416AA09548554338972C5F88FD9357792819E51A63D0B872B0A4D21EA3597405B52793D50C6CD70B52841D53484BCD3EAD004CEF0A6BC16CE74CB8AD0848000D8C5158DC16625112D1D85D17A3C1C8BBDAEA42C3A43E9930724655592116C4C6D0B8B223337EE4E754541A09D898F7FED71C3785B7F8721653986C525BC00F15590616437D11F9722824DFDE7E9615F1FB8488E5327E4D8BAF5F79D1FF5E808D154951AD87638910607B03FAAC3A61FE9916BA65FFD16986DEB4169BD24A72B1C8168FE569F3C81F93F3EBDD21D4E806F79FB28550912E9AFFFB52E97860C4DC0D042C56E1BB71C28B68E416874EC7043306A29BD1F4B9A3E612A6778315E2C2B850D6EAB9FF1905030FADA250CAF308735393C191134F3C493D00B5695775D82ADB9F2ABDAD17FC41FBD7A1DEFE337C2F8ADF69154CC0862FBD43035295B1A9C80B88FA8CF75B36CA08868F881966B41FB3E239EB1DB9CB51606A0A9EBCD552B2F4E819E2C30ABDECCDDE88D2D2F82F3585B5143943C929591D20CEF559CD2BAF2DC7FE03C9E4E084E8890FCE64A4AA9F13D5EB945AD7E3CC53E01FCDC192B97ADC1F98D9E773A0177E8D97405808EBF48BF17B689BFC15F4C515E38A855A9266230C9085ADC9A6DDAED93D80C3F38BC516695D202B4E89DA5B4EBC43788C848F8C4A72F79F37F857EDC105F13E4ECECFD09302711BC1993F5308B8F32AB96FB8EC3F5EA0531DAFD0AB3451F81F47E62C593C8D3E3BEEE79DB06909576BF876145856F5F716CAA436C98EAB28C5B85BC2E4D7E1653ECBB8BB6B5BD6981DC72D7F63BA06CAC8197ECCDC72C1481DB44724A3C21F7FC60661F11FDDE8122DA5D0B1D72A29952618B373423A892875E6AD24D0916109ED8E9A9A8D9A68ACEC4BB5EEB0D00EAEA72D8D5A76C2A42F18CBDB3D336B71C70AC73D39D7EB04533453779A1F210BB4FC056B4728AFDFCF46675C6AC76F750626D642E3AB117E5D6740154759A46C27D51306587650E1039054B876849882E7DFD807BD03E69021E337DD69D9B097722C6D2AEB517D773D2F7D84D69DABE1A1D6422EA1766C0FE7B8DD4D7283F2985D96D91A132B8BA03AD85F7D56095773222D0AFDC5A192D29F3BB0C2539A1C99DB4E711B6ACE3FEBD58E45E99C9F5A04CECBB309D50397F28C48BB9CC9F9CF75A52253B634EC47216A1FD6358AF26501821864569879BE1736B0AD242AB5B8ED16A7EA0989ED4CAE3567AFE1F8209A028DB46DB0270B3BC06668A9BF5E1BC1061BABBA00EC4EC37280379139D19BC6072CC6B7D260A816CB82F9BC90897BE3025475AF12191690F9F400A914789A860155EFD2D606A15895378C827F2A4FF700303962FD96DB2DCD2D213EEBB2460F0B753BC6902DA81D44C983DD027F1171D40A2039997241E09AE5B6165B4D55A8E4C79671A8B8BDEFEF2C21F81C541A5719DEB939F866B61BE250AF371CEA7B7525094C904698D412737F7781BD779365F122EE627D9CD4A68DA9D5BE1B0431998AACF824CDD864C7365C01CD5A5F480B6AC1E5FEAD8FFE40D87C1F9FCE81867157242285C5E76CF9667919C29A67CA0C0A61D7819D9EE6B792250A358F5691CCD80578F15288F3D5D6D7DD6DFA351FCF8DF0223F7D1DA1B76711FBE0E7FABD30377660ACE7B23ACF03ABC1D973248CDD0897773FB74E20481EBD3E52657C9296B980905AD29271EC128513284F1B78F38634BF84CB80791A0C5649177791CDAB87769D57B626F78A03435C758A207F52BD2A1F31E34B6A122B8701CD9FE478C57CF3535B6D51EB46CAF794BD69363D5A56ADDE6945E9788F1E1DFD045BFBD0A68834B13D6B9EC4EA9C860EEA0E9AC19C2DE14FFBD6B57E5992B08943EA0283813F3F15E4F928B8D0F13DE6863990F5C77F130C97D8BE12571EDCEC7DEEC4B6EF4835F136DA45DA70A11F9192478FD8B4846C507410FD11668365B05252E68CB2C972ACF50156E369B83BB85E62E4BD4D84C2E9FF41A5844D5D88AAAE7DED852DAA0AE5C14A5DCE64C7E236E9B7B60F5B5AD4D953A2D842A52929491BE3555AB8DF534CAD56DBBB86B28A8A86B7BD9AD1C58C87B8A089324E00FDE32F8186B2B74523A22904C18ADE02C3E965F94624F8DF57E750EA6335E3EBA705294B76CD6ADA33D90FEC1F48DE7BA9DC7D8D60A53D2563964188874810C45736C57EFBC3A3CEEE7238AEE5281882A554F2143BDF89ED4BD819C08239C187C12A8B6E763434B92C26FDD658B350F51775C60CBAB7A2CB120DB8CE8AE9AAF6AF559F8CADE84C4820209CBD27CC09230B22F013A0E4CF8041E4A789A5D20BE9914A624AB957318848ADDB39C9748C8922C54327048A2E46523BFB22487538363459035BA49858F85A469957DF1F4831BB7FFA0564C53233B99B596F5356089949306DEDD6B904433D25C4854A80590B964DF6B0703B4F9628D6B9A4D3F0A4096E9A0B46D6B32F66D563BAF688ADD18DE001DA62E33C503A4387CE0920BA5D1E8B69C38E3745B19F8D8B6CA5E1AC6DE90EDB25FC32DF04F0849D769FBED3F8169EA1D2252619A2304E055370B4443CD23E56D4934F9F3FC92F1C1EEC626657E6A89C1394E56061AF8ECE3E2A17FBAAA4D579A99A7998632A6AE2683DDFFFFD27A27C8815511855F09ADFF7BC627A7A5C95FE57FA3EF81F494FA7EA6E6CA2D14775A25BEAF1B5A3E35ECD4A306545D597E4E44301C3D1648F0A7D841F2F76FE59C6EAFA3F5B58907FC4E642ECD28D16A71EE3D295F1DE12DE1485B9CEBEB2CC6C9AC051D3D42B6A1A068533A7680A98D015B09C5B819FFC61688D441C1B7FD71180C4423E64EE940917C7DFAA19F3F51CB5B38D1B2B7C81D10E7C - -count = 66 -seed = 83C653708FAF3E5F6FBC9DFBE6FB5E83E572A7688645D75D2C4835B28695DEA4BD7093740D0FF43237354EAD1C978BC2 -mlen = 2211 -msg = E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D -pk = 2F43B584ECC591871205314C879D1021242FEE2DCA586A392FC51C69B60079268358726589D2B5776B9F53043C86C59C0BB93EA30A1F3BD823D8D8C746B12422 -sk = 2F43B584ECC591871205314C879D1021242FEE2DCA586A392FC51C69B60079268358726589D2B5776B9F53043C86C59C0BB93EA30A1F3BD823D8D8C746B12422020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EC87086203C6E5B0DD67C6F0CDA899802CB489A07E6A33341CE3680E666BA3B35D5654A5B2141C1BC63A230A7DE5010000000000000097A834C555F17312F48C391E0270DA4A55BD0E71058EDAFEA53DE212BD955F6B482B6B4CAD884BC9FEC3D0A27192FAFFFFFFFFFFFFFF177A87ED12B8B6BDC4D61E6CC6896C3A7F042DABC078362F768B239640250000000000000000000000000000000000000000000000007489E0DC1D76FC78930DBDFFC1F89CAC00B0E2D4B3840F85948615C96BAC060000000000000000000000000000000000000000000000E4F3EA1FD23D4375E48ED46D3A7DA5612CDA6713C83E561F8CDC226E8C958B03F4D3459F117FBA48E9C588B9DB8F2F7546204047B6C37B0C612468A555F5D50605AF355A3FD79B7F24CF17E0C96E66F51B78DEE78837619BCD00B0C32A0CB90B63F9B25F53CECAD1293FCF04D681ED8D8C0EB2CA620A6A954BE5E0F0E5761D20B8E8862BB16AF082FEFA36E7D27C6802AB0963BCEAA14ADEEC79C325FD4A46113B4EC5168EF2286852AE0E066CDB2FA2032FC032759FD31DAF8FD8885A8DFA2651F30234069D2D9CA5EBB7C9380EDF0FE4FAF8940A20C233F9D76FF61742C41F2C6B04B869F3C5FE91EFD6D665075ABAD093500CF7A6CE6BC0549C0A92D4783436749A877C341C276DDADD85B9ECCE48EC59BB4A7957CF06F0DB386D5BCF752220AA7C6C279344B1CC0CF8C60D591840CB36DB66F9E903B6232697F1F684BE0C75747B56599F20E06DD4CCB900C7993A50D68FC3CAB45217BBB5DACDEC0A69149C252C7EDB59BF6491EC45D9328BE80B8E997000F0BED7ED9D56D10CFDCB892A6C7581522DCD6E993F5336BEFFCD39388BC46710C8C90CDE8CB1D63E5257031B2871D7470ACCBB95612BD253B1B8CAA1D891533F8F0BEAFBA3B3A03178DDE309 -smlen = 2388 -sm = BCC51A90D548A003F805BC831DBC1B2398B14E06C7C6A1757B9FA6FADF042E53BE643B0A51907E020C6D596FDFAA15B45603FF7910EAEADAB5CD9B0627A60856F4DCAA46E300DBAAE59BFEAB74F9A704C8CD5A4864195548E3061269D125F3FFD091F506FDC00E5F8A981734D5015D92076C00D5336EB0077E892ADA687B2C9CAA04737557863C774E7EFB0300055F25956B9FB2FCA193317D886766C00C03558EC07B83A6A1D78D000E72B008DACAC700E3B57B208352A820F622A694B7C3F6F297239EF0A069615DC664C02F1822BBA48E11E37BD9749C98FACEFFFB0FE1792A386BE10CA7B98CC874C68C36F5096D3718DC93E0734D6D6F913E3B958DC1FD1424818C9437B0FD59728ED46A79FB52C737A1D1D26F04EBAC279A7FF6A971E2B69576B712D9224EA18FB9BF4E613A8935F3B36A073B01F37BDC0B77981C8F2804E93C395419352B85C8A32DD77D41DA9BF3ECB914173E80DD1FC06E8FF5BF0E4F7424849A15EB7FAF7DE77456EBB64D10DC10FEC6254070C7DF387397137372EA3A53DFDA7DA13414AF2DF16C1E38C5C70A5F5F44F725D622049256BB15DC04A8D846A1A0DAE7E765A7F00C498F1D0B2893B8405BE4A43FB7E97881069A49134A2A847184B82EB5A690D87BAF2F579619EE19A3D7A7C7EEA72D6E3FCCF0A8092BB8D3C6B551F27E63E762A30B4A4DF2DBC4D119139AE1B135D06FF827846901577700935E0011B65461C2EF9A7B71EEA33C8CA4519C7BCFB557C5E1D42D9243F2DC34057F5E0CCB9A457FC34DCB10D9B47F6EC3B9550D3AE4FD593DFA3E28C6CCA1FF1EBC9D98DA8DB869F8C80BDBF8AD4684ACB6A779CA9D0A106F26DA17043773862681C5DD2DEB1BCA2CA48D4FBB4BB7C1F765DCA3A1D991D890B9A8751CEAFF543997FAE5B128AB2EF22B3BE94499DFD9D8E78FB4C82CA8D296B0415E84CA8B5F2024455B5DECC8B4CCDC7BC4EE06B4F0C66E6748FBD07E3A3BC5B4B6889C40DC4A97AE3EB43C3914DEF976EFE3BFD84A093BD69102D7B37C89B458A55B98A1974A13A7685D26E9D816C79585BCFC1042C2AF88534A9FE8B0A6C8C44355A6D606F902DB40D5490264BF0F352C27355633CB095268D5B8BEC985A62D84B2323FE814053F05DEDC22029D2998BD0BCB255C162C4BC03F60E3580AC3AE86C37850110E9A1BCBD75F64A0DD60B941E2F57DA9D72498B3EA8324EEA53DA3895585ED2942B9140F260895DC6A1131A4C3AD2B64028BB8C0FD67E1BE4C07F808B47DAEF306FD9578025F9C639660075837B2C95473F7F860D6EA2C53F4BA677A2345CF212C7757BB94F1A4F76D4E96625F6FE051B8246D1B7611BF6FE325FFFF8514D2F9A3453F0E77AE8B958AB5B567E541F156C6F4D315B4C3C547D59BBD0D7403E2E6A49B9E7D3FDBA338ADA41875CEB03830A846A1FB266C0F1228AAD2B76A2E3404278DBE482907206FA66487AD2C999867F870C8CB7A70B83437E14B9E893BF6B391DAD75E84588E882246D161799ADEA63ADF1AD706C0A3B76BAE595D84B21AE9DA30BBC0856987F2C2C543D977747B8CBD5A613B92804ECC5284ED23650E9DAFB4B76D63F069710897334F18EA6B0CBF99CD590A78E3B050E1BB24C86D6323A17106F0CAE3F30B01E4EB3DB1B5F3A4771A880C8AC06BCD5A82D4103D0452FD7B54834C1CF8595DD77F82D4AD9EBC1CFD0C9A8CC787E10AA4D1688474208B69FF7AD4DA6986E5F62A34AC3093E0FB1EFE8AE3A96F6AAE09B0E8F6E7A2B65C7387999CECCA43CC33F026DC19BBFD867C48127CFF579D1D71AFF0C4A0E20F9FDFD599A6169DF1B85F6051E02290DF6F5EDE4F29BB6F0C8F806D6850C6534ECDDCCD75BB8E4A097C70445585740F822E5CEBB0E19EAC82BB78EBDE2CA60A810AC6C54119FD6427DA8A0155EF48653515A919B299A306FD3C62B505A6911DB2B56CA2F296E487BA02C546ECA2783ADE8E46A8C78EB1F3D7C04BB24548F92383E475CE6E572D8DE1BFA9B3E35D9BD6C79547B592C95693750010A3D22CBB31AA5A4ABE94897831B1ED9287631F006A735C36BC84A8C87497EEA4873801A733F35B328C7D2CCBE4A41C193D22F972571BA7630B33080793498CC85E6EEA1C412914459DA175A6DB8658D0BD7A823FAB286EDC20C785C40BFD539924A24AF4E3D37BD781353677C76D4672098F5BDD17017012571D9AFDA05A40AB56998E40F5E359C43DFE32CA10A45BF08F67D128C24B1ACC03CBAC46BA6CA5A532C105E91E0C77ED59FB534AEECD68735A4978177BB5A656B9F83B202BB604D61A24574C16656E512C0A4CC6F597B3268573E10539D1BA775ED83BB680BB9115011C6AD43FBB66FB37C467249060A1586DF27B2CEFA65265CCB9051E468000CCAE24F08BA941A8180A64BB624F146C8EC562363B32C369F62997C4B1375DD7DE64725A598529244273CAF8398913C6FC01522683CF1F9F965C491ABE7A554F0019514ED98D75EB8BB8565F77C195F629F98163494B4AA2674F92A41DCB67EDD1D818A5B98993D0B1198BB6BEDABBB486BC6FDE039433E842BAC568A5B4EACC028CC2544B57D8883848DDDEE2E967EA85A6102BD0ABDDA41C3D78447BEE1D4949449ABAA9B3377E8CEDCF04A500FD1A6916E26983E64B5E96FEF87B32A060444D374409262453CB1376C349A8B5D1767B1E2991A1A6044E0F58831BD11F12159675D215D7EAA74807C995FE22017E30482DB8A4B09CA7800822C75C92FF649FC0728F5A1D44EFE7D0FF147274152D5F2F60342C8F5F951D8C95F83C1D54613A182D9DCA68F54FD55047F1F90CFECC04D733DFA82CFF2618F29A4DB4F7E1E59DEAD58CA65D07CC90C25F804A895D6A82F9375451CC55506D276FBF783F7D4D53B9BFB83DBE4A8771AFE21AC543983D68034BADC980F9434527F9EDAA2E228646FDF75B44899E749CF4C9E5B345222385A4424382603AD6EFC24C56E769028F4394F2F6220A9B390D395E412498E57A08BAD927B8BD5D76E18E8FEB457FCBD3248D218236B07783E57FBFA03C292A9F5719E6AEF2EEA3FAB2CAEED5442E89BFFB236CB13DB2CF9C35A38C338C377C475DAF45F8EA822F9AAAC13425FBD43D3DD9229367F0B3687D7E82AC5EC2FC7CDB69C99A4EB1B8E45465C6A53F16AC0C4E0C970B8C732AF515C09EAF25596F64A04AE4621037B8841FD2B1BBCB310EA23E122B0B9AB96D8F7702952D0E96E4CF79C2A30DF0091ACDA91479EE2979B0054997C48F6A0E909BC52A943459AF25553969EB31CE7685369A7FB014561B4697B8BCE220983136E5EB2303CCA4EADD4C6CC74EA2FE69D448AE6ED953A80363DDED5591B27A1EA956DF081CE99AA59DFC789D9D8FAE952B0737099D467D - -count = 67 -seed = BC81485EE93AAD8B464B5199FFEF9FEFC06EA97645BDFE0B4E915B812E606A77F93917ED925E882161CBB909747AC4C8 -mlen = 2244 -msg = 89D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE -pk = 148455AA3A626ADB8B384574E7FF465DA0D8D5E8BE54FD6C25A519329782EA03D74185BEAC0421D19DBF5B99C0AFF765949A9EE1DAA15FA4C3DEEB3C9FD1542B -sk = 148455AA3A626ADB8B384574E7FF465DA0D8D5E8BE54FD6C25A519329782EA03D74185BEAC0421D19DBF5B99C0AFF765949A9EE1DAA15FA4C3DEEB3C9FD1542B0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007B06F7EB2BC45BAED686EE01C6A5E1B56CFBA8CD213EB4A92C372E18009A71D8393D446BBB4EF8DDF7036BC1308C020000000000000082E1F049DEE5AC3C60F90239C7EF4365EA2188BA9950C92E6ADA83F83BBD3263B2C16C2D57399CB234DFEAE9D0B3FCFFFFFFFFFFFFFF5E78CBBDCECA4FDDCE001F6D37EECB72FCB20600D933826AEADF52552811FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBA7C436133700180CE94D1FA8ED43607F959383A4B5F8A033A9208CC8E70A000000000000000000000000000000000000000000000026F5EEA0A874D304DC4F918FA4B9A89508B86E4D7510E1E5BF1FA167F5CEF20402B7AEEA3CE22D6D85A2A735F13F954802A6D9C14DC24C3564AE74208E8B27030E50F8527E2B24D0C29FA64C7B7078962C1E1B6133F31F4A1751820730ED7A1497B444BFF291386DCAF3C3BA6046873AF16E9822172E5B2ACF3B59FD6F19A924BCD6D40AECD2F1FA10C393251BF99976DDE8B0FFF2A601B2FBF5BC611857B022CE3671EC958745D3A509733825ECCE2882E27BCCC9CF81D1AB9EA13C2256F51293018168B37C973A7AFBA5A61101295F4C1AF50CC9D26660EEA8B5C74F028829A853B7B245EE5CF82EA6B2E3E855C1120B8D506AB01E2B48274540363E2AA918EB101A59573E7ADAA125E0C7BC6930DC28A610839FC042326DBF5260D3BF141805F6FAC5842E22FC45CD9EF8D9D012B4EA6EA16E7974422C478AE59B53B97328715EE3DDBAC3DDE6F26195CC195148661A792E628EB3FB74A043B8837D1D8921F086AE60EB7129616CAFB3909D12E65B80E281B8EBEC7208D5465C2AA9265822CB30DCB8BE1DFC55EBBA452083E74F387626E59747E6725F2BAD34B137C45D1643AEE80C3ED9ABBF8221B73F6320EA9B568E210875F0D053F387F4D3F9AE362D -smlen = 2421 -sm = BB161D6A381DE63896017008C7703D8FA6F633015F42633D2E5EBE571D00856E1652285BECB9CD018CA345C5D575A2092A01B871F900DEB7108E2C03A9A5878EB260188C8302B7CD5816ADE61AECE00457D2D1BC53BAC7A3AE0055028F5A7F97D4D30B053622E3BED51F4E77C00140F2BE901D540BCB070798068F463011298534027F0B72B6C2A07CAFC30501EB2AEF1B69F6CB74E8AE6F5A6F3A1A831003D30D8F97CAB5D1271E042AAEDD0202FCD10089D960D04A3DF6984276A3D17D59AF9E72B25418C8797170FA701A672C5835CEAA22DC35470D038C6ACC5082D2AE329F36697C91CBB1F9E42DA59A654462BF19E04352192778CB050DB6F4A656F6AB0BD9641CA8CE6C1EF8B020A3D9FD9DFF772F38926458BDA6E6072456E506AE464785399AD7B498AFD4C211F09D0C722FBD9E20890CDDC8C6EB9EE75390E6D76D0672FA64D8B97C65CCA46DD1F542B6D6014F035D2817C4B9430AC8DC318CF8642AB34F4C8D71FC0E3B1FC961E94B6A84622876250FDC21987777360784D9A58F35E1C9B71F30561ED6854EE9B112E7B20CE064272213BD1A46D0D19E5EFAFAAC7ADDF4D7B7A519D689398EAF1E67E64ACE8E5E89756377E1FE458D04E3DF7F6680F8B69815680276ACDBEE6C8E1AA909EC56994F3EF3B65FBEFDBC29AEB0EA906274E838CAC36A0607716FBC2B8DA6150A4EF39E1CD9CCA72915007723C5D2442F7133258234D18A257DA2C13E53B47DC6ABC2D607B98E351FCECEE8BA8886821985BB3A7BD02429ECDC5A27EB04D01DADCE88A324AE44F567593FBF730C284414056FA33CE90A6D6F146DBB1635BD26B4F883D4948DA47216C70D2AA58CEB3979523C6A4F2F7EA455A97C7ADB6C43685D63BD4C51D7DDCB81A06B9BAC31A7B255B94052D686128D234BCB63CE713028451B18B981B83DA1246281FC3BD2B06C741CF71979DAEFDFA0FD06FBA3722FF7BCB2821FBA964FBE9F6467FE583C06D3889A40360A7AA03358175EE75EB8FD1D3368C30B5691776C163764DB924FBA2362CC9572F642CDD2B11B40FA2683A529EC2100DEDEDEAA70A1E639A71D6A96AD31F70A00FB63875D0FD5C21E56AE57B6E74EECD2EF34BB3E20BE5A1F9F1F54955A18B4E4E4B9119973DEB76A2A603FB6410A350667ECE5C1C147DD00B07A88A7D0E86AA2D747A867AD90BA6660C7A0432E20849EF642A20CF5A20AF7E34D139B39DD65C65B36750F17F0B9F1DB06CC6E16F10EB289F567B647454A581604F381D66371238AB785585A4DA2D00810EF6851A6009025FCADFB77FF7996BA6B091FE4130733466B29FED46554FEBC2AD291DD966BEF4D79A9E04014D3003C95696E8BC39892AD32DB6D6AD22D33E931BC87F78114BBBD97B334BCEA676F9E9DB23C0485EC06D8F37F070C143117B1BEA49F06E1A2423D98C12883D32D29103F7699646E7091D393B21A260703E17380A1BD85452702C3AF7DF73AE7856A1C066013014DE62C3C817DD74C44AA436A71490E7BDC6B8B74BF61711FDCC541AD7DC49CF4C3EC154879E048FF30DF25065B5641367CBD3BBA19606A9A27A64055D5D3B538FC88EDA66FF9F26E619DCBA696866DE54A8DC8580B5B28144F952FFC6DC543E98CC9FD7F4538135C0F4DEB4BF892266DCC48A4D1DDCF407BE4FDF2A5AFE4A0105A20CE2B3D9F48D608DE2315240875F1FED696C49CD8D4A78AD26F51B3C804949C536CE35C3963DC1D238516B3F2D297F5C9939A946A0170E185C75087F37ACF907F9E3F87A2B15CF81C7ECBF2165F0F3962D11E9C6A7845ECEF432CE9E1FBE74C77EA1057D79CB595D47A8DDC1D911C6B97AF76D91F3515081B95CED16275DECDEDCED9AC790D73739E35973834503133510DBE39201F9B5C618231184B9DBAFAA7ED6623E8BC492170812444DB62D4F01925DC4F821C0896A746B4453E93EE51844B311B0A0A51601477BFF651EB5EE331227A2E9E49F593EB2988E449E750E990A8A89906EFAB00E0955C81B6AEB160313007B481C40908130597626935389E47AFCB0A20146F0C7B29B567E95D59CED7FA8023A2D69C89443A11E7150A03D09EE6B0F74358141D48E9BCAA3EE081C7D8F8C223F4D48EFB3DF8A4E287FC5B90B4FD251CB616687ED09AB1A06C42EB9D6A578D72E99D499882D216DDB3F35B0A33D9F2D3D4A700161A5C3B5A6729F197479E78009794AA1BE3C25E0B9142613AD2EA508ACAEF5EEE33DACF60CB7A16AB38D9F3CAFD2150081B63A3A6CA0163A25FE81206A37A0874FD55FA3068B4C1B25E6325FA56646EE5F3431D33D0BC691C134AB306B0BD2D1087F4D898A529DAE08B97683FE2EB8ABC9095D67B79CFF0E77404C1F7FF316C3CECBAB77C710FBF961008047AF22805D77EFF79F815B21D142F517DA2199F6627AD9FD85AA24E9B7F40C7796207A82901C7B5A3A42369A9BCEBC24ECE13A3ED064E4E748BEE2890BB21B8E4845362BE9AEE46E25418F7CA38ED087E46E24F12012A1312BC623AABA6ED227CEF116A3C2130B4B837AC77D86F8CA3553BA0CF5AD45E9B4E4E55059F1D4675291581D7CC9E5839212AFCFA897E90CB601CB33A4D2241A5ED5925F6416BE5A43D4767FA04F701076AD5ED5ECE2D09B8DAF11B00FEDD2AA2E748CBCBE365031394EF823951EBC52B3E4C79D79234C16575910C29A35EB67C624F7504EECA3921F461D7F95EEE39638C402481DF7B59310C4554450789DFB28ED1E485C0018512EB05F14DC7A3DB5C0606F9E28420D76B8F8534D2AE31AA01E90A20E248A7FB3B72EA859031C67F7B2B043D38F7183165A42AB28C6308608C530A9CA98F82C133BBC313FDDD2109838E970DC9989EC14DF781A518F6CB56DBEDFC1E381250C64F95D0BE5F37515437673425374D44811F4406EE2B5130334BA555839E61AE623D283C77247D2EF8B22ED138A526F7E41DFD41FC69A2839B77B51C6FD96D97D3EF8359E8725BA1AFA80278FB3BA9C697F7E2BBCC5D3F0F2E61BFCF542D3160EDE02CD6295FCC55865E7890342572499347DF80EC073A91E00193BAF804B884E9CF5C43269824D4CAF7EEF49FABD8BDC5496D190263C96DBCD287681C19B90C34635FFBDFEAFE0601BBB7514FD84896A22895E9B21FAEEA372696E350F13959FC23533F3E8C34B17B595F3C935E37220AAF644F3A565114C34C7B85F1A3E465470166A62B13ADB00A2BCD5A9A3ECD59FB772F09DD6A6E2AD12FD54EC62CFACE0022F2FFE3EB62DB0F4D0F0F9D1FD6F3F11D76DA868D2C1C4124915DE19EACFFCDB31F7CA018B6976260CA1BB2C4FCD6B9958F096313B608E208D875EA5A1FA89916D0367EDC4F8890E93F1E660AFF16EA79D1E583007E693BF06C172105B3DC24117DD921FB60D3AC0D2E5C89FEF17087D885A0794E496E3CBEA333CF72A507788EFE - -count = 68 -seed = DE9E2742591A5AF6A6153DA85A510C39FD31A2ACD8A8511F190A9A5E5753E63D9801A8019508E67DEB1E9219CC18BA3A -mlen = 2277 -msg = 8337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 -pk = DBFBF4019CC9127785712828808C0E71D2BD1FC78746697A8BDA94EBEF44D4120F4FC192165ECE444EEA802EF058C4ABCB2E627052592D7883EA0B9A6DF64A09 -sk = DBFBF4019CC9127785712828808C0E71D2BD1FC78746697A8BDA94EBEF44D4120F4FC192165ECE444EEA802EF058C4ABCB2E627052592D7883EA0B9A6DF64A09020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A49CCD185634267C23B62DC2535035FC464B763A1E1586892709B07CD190641694A5BA3B86A725CB3A56021B6CE803000000000000008FE56F415DDED50C87DF92CF8EC81DA523AFE4236F79CE8AE0A33E99F9EFC3C6AD8862C1ABB2D9739DFCDCC8E9D0FDFFFFFFFFFFFFFF4F38FA50AFFBAD05263ED7F359707B197FFEBBDF210E4CE28530720B59AEF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C525D62131984A7F22FBCA0A29F954445D1784FF1801A5DF5A6042623450600000000000000000000000000000000000000000000003882D4AE73D6BCD0BDEAC35A675010F1869892467D980B71FEA833ADF039C92E8394BB51BCC704611869FF621FC08A5018D77B346B0D1DD8C9F98742BB8AE907882505D30E5A41B438431C16B747891C3EB9B4427D47A0090CB057B63BB356169D24741AEEA0CE893CBFFE01E83C7FB67C220ECC1A9CDAF22C065AFF2750A430AD077AF807AD67881C427EBEAFC6C33C80B4B708971DB1977404700562A9571AF5E835830C989995F5EC0DE20B46C1F7EC0C61F07A68CF267924BAFFD90F790DF15007732EFC575341DC1DB50DD8FF0320113FE70264793BF843A274D0746A0065C29909A37FC5470D1A68DBC0B135D66AFDD23EFA6EFF52A9EF4ECB5F600130D021420F0A3F406B2BE4094CCCC3DD711C867CAEE09EF6AE89BEBFEACA048B06733E11A1ED0F44F97233C1760BF6CB58D43722C1310C4527C8703C7C81F8C81A58B725F78108D6DBE1FB48B9474475B9FB761A1D670D9E98C86CF61DEFC4BB09CF2EDEDE4F602C6BBE624D401DDE1B8CE82A62A497E648586F4FB69015CE110446332C2081521C96474CA23AC1D013566E2C2DBD62FFF0C3FDAF0CC0D3A34030F5C9FFDED0AA95EC373BFA80A52F5EDEFFE3D2BA69EBB022A9E2C6F210093611 -smlen = 2454 -sm = 1DA0DC96DECF104612069F0477A8613A3D43DE05D281B16E178A74E3280039EB9A90F3BA48FB4B044E419C5DA5E9EB45D80285F3D8DDC5D66ED71B070966C39FDFCD58B38F032C7744E0165FCEF42D04212522FC8051D815D60781D74524F4C40053C7062E6A8AD52E8205FC9E06BCFC96AE7A0AC2EB84010C51CE0AAA6BC5078102CAF1B43BB610B78DFB0101FF50AA4A613A6301896D497E92DBDA9B0003C96CE287909850D3FE004EBBA7727E4C1E008337940EE74590EB25E52E78E8563A09CD2D45F650F48775E3E61F9E3509CC8EB7E983310D0185359F66BD80E0DA1E45A6BEB53ACEBB9030E310E81A576D0F80C64FCE1D1FD77DCA27B7C6E02B0CC26EDBF496AD2E3CE8484E988E56BB28153587D7ECB02FD8882545E7BF79CC9966A7FEDE93F7E9451BC48FDBB481673D1C4135F95D68F40F4B4F847345A320FB4D736BF5F9FD347435462DD3A238E4C799E7CEE081107E11682C7B558B19177522427F1D269FAD81B565BE538E8FF2D7193579AEE51E50974BDC0B66331B59BF496C87E4F6E143754076DB516C9C538410FB38A930CB5BA1E6610441126D01C8EB5F34E2E58424B8B218D9E68C5D8B4F5258EEF07EE0AA5475A72CCF363D47D825FA524C16C7B7587C44864DA9E4B267F738B87F7E5701147F550CD38774B17DE48E6969A0DEDF334FA67470419059C4D1607880CB12FA9C0ED23032C7E0F325169EACE7DACCDD4C2E5097FBBA859970D7EAC4522C1FEA043C9278C1C89FCCE95203033B4CEA4F9F24B55BA6B79EF88F275310C6E48189EFC1EEEDAB66B56B6BB028726BC463D93D742492841E85D5C837948978D0FADD1C172F8859C802C6BE8394A05DADA7546EE1CC5BB909D3189088F4FA6D07C573ED7263C081720E701D5D4B027AE54BE175536F3BD5E91993CC040311A7D352AA26414CAE30D10408DDB44E8C9513F4619E99EDC894F963489876B24BB0B91BDC3EE5B78AC0D4046B2E864789C0C779E5AF97F8F84F09A26FF74B8BCDE66C007970830B70C2A1122DC9845905C3AA7810B40641E8BBB398A23BBEF52BEDABEC7BB54823E64177A73786992DD67D5C007D770938402EFBCB3A60281C5706920A9EEE4C26C0B251C32B9E1936FDEC2928110959E99255508250FD5BA84B4FB314187124072D30FBF2163D36F1480ECC08F7FB8093BFAA72F1914C63533EBB3A57420DC38DC93DD6AE4D197FAB790C1EFC1B7A2234522E0B408D0648C7AE782F2F08CB70B96CD76B5089AF1EF4BA3A4C2FAAC363A4DC1C6C421F6AE1E9B67461EB02F36C25E763F1A2B73CEED4DCEDDCE619CB313D124CE6F7AC986D6BC344E630F22CB654C1286FBC0EE01C968DADD1EDAD744C8BC828CF5F316336A5883166ED000FF98D6CE2CEAE7D3E40BBC5714F71BA9E25E1506D644FB2DE2FE190D327ACCCA79D9B6D9DB505CF1853E98F30E9BA5E568ED83E2567C936A64420C5D8F07AC4F65F38C28E88DD7B5209A600AEB81A6D2AFA4FAAEFDAFD9B7FD3AD7F49462CD577204184F9D44A45E2A909373CED24EC0EE56BF2E6675C506EDA67B1E6DAB75CBF1822E20E7A8A81A7729B42A6D67A1DD457FCD19B62F048AB97B3D694254E5C051FD2DAF3D12AD627EC37C22117BDEE9EAA290D11D56BAFF0DE1037EBA908FA03E2F869FA2B27936669306E8E70A0A4910A123F202797BF1C8FE47178BB1E8E8D7AB1C01F30F5E779B2BC99902DF15185FED4C865997AB72254162D00858E0908EA95A9ACD0FCE72E571C7A381CC33E06A27FE6A5922775EE82C973CC3CA8A05717608F8703946C9A89854D627744DA475DEFC1390DC44FCC3A23C47AA8AF17240EB1A1A00A062D258D471F31333D0356243DC1CECFC559378B4395F01A970EA4074D5666B44D49EF291ED15930DADA66765B165CB8331CFE549C38CD0672F534BE60F4D9B4C125FFE747670513B5744676899B256B992E15106B99B794DB3950582816612144649210751F3D0DFD5B25CD393E724F7FDEF00756D0C8540E8891E592507599B06EDFA6EBFE543084AC81858F5EB02D8F5EB8A72184851E8589A3AC6DFE1CDCF286723FC4C1202765FA4F783EE58C627ED494C7149BCA6A4DDB420827CDCA82DC42515BEAF46CE9D9ED524BD00EBD3094F770B1E1DD09FC431E4C244D2305619DAE208E65EF385EA92F5A79F12B99AFDAEA79C9D8D319944AC6CBBE3F1290EC6B87D97785E059E6871FDF239BC404021CB52064B88EB4CB3FB6A871B0F76C12D7B8C5E8FE0A65024AB5B25F4C67B6D15C22B0005B754CF7CBEC898B49F4326F1AE4034E5F5A446A96CE08083D48525A3661E10C996DD22DC34FE570A4C8817D10D750FC5C2ED0C24C7CBCBA5CD1B2680DBAA3315FBF2BA7457ABEEDC96B5D111110D4678EA5C7851D25F258926B0B028365799E940A6E17BB03CB332FBC6D713DEA7108FC6268C8D33E7A578C94FF75BE808C15FF7884F092C0E309F1AF99B1A7314FA0F32C8D8E32B3E9D92C9C8FF6B8FBB99111529C4BE3A2A4F62884373D0903180B4DEABE613DE5CF19415DFBA7F9A46297AE2F21D7EA420B41F628FD8DEBA55207606539D11791623CB325F1E18C98AAC27283BFAB2408F4FD6CC58EC9E306643BA1C0C77D84B3930263E5A76A1CE94F3D7721F0098D54E6C990C3AFF69B6A0D82C853EA2AF2D3D2B3E96DAD59FF873171B55D16CA9A7C68DAD2E918174D264919DDCB4B9D01CE622D56C599BF60711C74315C918A7BB97B9513937AFB6A652DA68B6B0B34E316D7BE9F5C282A5E8773C892782EFF220667A6A54069C37B88EB1CE676AAECF2015E59FB7AF4D30C4625DD8DE4805F505E83C877CD61D2A0BA65B32B0DBDFBACFC88CA43E4DDF7A1A4517DCE83B7B8ACF8DCAAD28284039747935865DAF8DCFCA29FB676CE2EBA2C509CD75588FA5E58CEFD0694626C9BB31C3AFC372ED313C9BB3ADC398E89DBDB108DDA63F9380EBF9DA17B378451634682F9823E209BF10E39F884ED270413152025CDBF4875C121B1E83E12C044453FFDA6D8CA2C240AD522577C6898AB6F2ABE1FE77F860939408CD193E605F87FF2248FA163AC2FC0F39BFC38503B23F5441E0E364CAAAB890073266B3B51217661F5DF41C0BA925BB425AB3DD7B6A3675B7D60D0290131EAD53A4EAB0C66BAA83F2FB77E74C3C123ABA7731A3F62FAB8EAB2A96E8BBC911E501CD23A088E7887A469284E0B5C27B5CBC1DE2B6938CF1AF58A47FE78141306CB76E8F2B73620BC4549DB6826D2D72873885F6C5311EB5B9462BB4631D314DFB9C836C6F4D9EEC6818940C04689CC4D8D11ED9869355617861340E722B2BE78197746E2759AAA8D68D1965888E89B6B0F5BF51F94E586B2CB8708F4CDB520BF31DDCCFB7CB69E29A7AE8AAB12C11F431DE40FB9E82EB5F2B6BA1F9757F1487B63255FA69A755601C2FE17CD1892D5A6799C35D05098DC133BDD71318667D47C4671 - -count = 69 -seed = 272E459EAB6A0BDF720E4C5B79E641C95BAB66C3CEE261D0E3596BB04D232ACE0A1CE24BACCAAE9037665A962C711B08 -mlen = 2310 -msg = 62215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 -pk = BBC5C585BD5BE0849C1822BB967B6D9EE03D19BEAA7EEDC2A8EFEAC959CB3C19E9F897D459EFAD0943939C6E2D0D358ABFF5EB950E2D8304AA26E5B9B7B5122A -sk = BBC5C585BD5BE0849C1822BB967B6D9EE03D19BEAA7EEDC2A8EFEAC959CB3C19E9F897D459EFAD0943939C6E2D0D358ABFF5EB950E2D8304AA26E5B9B7B5122A020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0228089EE56BFD1875A24506FBC94A5A3F67099A2C572B0BBD83FFF23C79C504F352DAFAE3AC386AAB51C25007902000000000000003F64461C47F0F683B5C98823B37B2E20DE469BEF69FD791408BCD060DDDA965BC0A92E9DC29DDFF7836DE5CC35FEFBFFFFFFFFFFFFFFA77E62C69D7B50E183FAC8DBD7C919143F198B664D9A98D231BABCC3368BFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B516989422A99D57EAE78214DAC173A5B1D752E220CFE8388B765B961908000000000000000000000000000000000000000000000020617BB72AAC7DDF437667DF8261E06EA4DA0EA26D54A9D101F20B9D771EF505B1E7E7ECAA45A8DFFD92FA69C04EE1065919775E61F1EC68C238734E30EC5D1C2AA36D01708EF37A6627A90BADF8D6F11842DFC9295232CF52F8A10128B57A0FC9E83ED504B9481DD2B13E61E437CE0DCEBF60B9A624BC931F7C4A765E2394100C279CD245AFF4904B86CBD48E163898A7BB844455C3214C140C0A175D18111793B36506349B071803F894B991A41F98C27EC5BD041E770B61ABFB9AD55ECD2D93420A5E82627EEFADD08C4B77F4E838A100B09EF0CA307EC22F23803EF189275038836A38726FD8CBD280AB7714066399F0E50D480407D19DAE06E921249915D9FD17A8CD57839AA8388F9244691082A068C51F1FD6E8FBD077692317343A2D23426AD5DD567AAB3A32A25B0DFC1A3D446C20BC6E7F558A5724A5755403CA13B5CA3A9EEC1125C34271BBDECF6AE1696C926CB7588EC4F7228DB241705E3624B1AC023C207FF4757C21B1163E17F930BF4A055E692D04F9C8BF186C9EE6840F7C205BBE56174E95274B2A65505C19FB349667DB4AEA26BB9372647CE181FE19729F4311DB877B904082FA6F719FDFDD28B31C7B556BA885EF19A64410A21A1C -smlen = 2487 -sm = 6E82EDC348A43E7B7805E08FCD6C92C2D33197057F671057B89E53C4C90212618AA66E30E2F27B03A07C4CDEE389C2A0E90249B1FFE44FE441C11806FC40F1026A8624C3B3055ABA703F27EADF0869020E23962CF520E39D1F014E34C8B11F5D429028004B7AECF765518C7717046217DC8986AA5C4D1002BA63EDC0CFAB0342F9050767E6A9EDD795DB4200008BBA5F75E94EEB9C11DD95D0B4C8118810035FE3EE933FEB67F62E05ED2231F1DA82920162215248E1F3AFB19849F758D742F8AFAB595040C4DC520D603C9A80FA9CF2E97E4F4BD7350551FB667D606BDC31A45D88836CD376785C01F9007D47DF95C1F4D1E30A927A13525409D91C9F5145C0B86D3B44E933CA81E4ED9559AC17940C61EB85B2D26D2C47924AB80ACBAA3D9B1C8855C13EE45F5C8047C161AAA5321839A01783B21A5EE90CF91B8285C4779465B7A89DE3D74D482080F68EB2D8B47429D5475356C50A92B3ACBDEA5786F4D6C2A304AB500490F84FD1D0F21ACBEA325D62D2657F3889B6F591A7F63D8633C061CB14B8266A7FE17642DEDF1D08D9FFE369126CD780D9F99FC6262B5BEFCFEF35D33498CB2CFFE55F2F8D567EA8687DFC6E7D49A61FDBFE768C1D11BF5B3B18CA52225B096490C97CB9A0B3B2CA0762DCC36B60F7D26FCAA4E38B1F3A6279D889323010D9CB0A97FC488E09B06237E6EB0166465C2CBC2B9CD06F155759B6C93CA0CD3178845E0F3A2D20A68757AAF3C4E74545494462CCF28F6F51EC0FDFF4F1E6D98FC5B63BFF068FA7BE1764BCF14497E71E424C9389C5DCF8C5CE1DCD40B82F1D75C3C3970DA433A92A04DE958766AC5EB3645F4D21882F7071383AF8DFFD6CDD91B549F143DCF59FED6674441EEB03D5013E90ADCCBD7E3DA115535AC855DBAAB7F51D70630DC00009E726A16DEADB12047D85906CFF315C73EE7D4E24C9067E3B772F3DCC44C25C7CB8622FDD7B8ECF5E9C877838D71D500F864A662619B1478F8AB4DB2DD09A111ACC99ABE737DDBCA06E88926C4E73B5F5D21EAFC4B11938FEEEA5F8D5A4C616A342B54C9CE371817AA2409A55A3237BE85A50F05B33D35AA86A62E85A01CF34EE7DC840A26FA1B8C6B307817C062D9A2E7163A3B036874D2ABF6531A772D4031FDCD59CA79FBF442CB9155F90148DC3B723778E699C6985634185C3FFDB966ADB80A3D1308150B12964142498466506BC0742783C27BD3472A5CB45021DE066C28143FFBC82B5742BE51E93BCFDE1A61E661B730D8760E108B80C859E4B3A07D483A6A8967E5F01B03EC8B63A20C6A03755C75F419558878A5EB8BB0B2120F183E4BECD4A104EB4DB62CACF5F9964583815334A25BDB75724E549211699AC3BC9B2B5F58F1FB33429905DF81C9422F8B84E95A7C36DEC6AE9B48D4F502D8AB59B69E9D112693578D143A3F111EF00844303950F65DDEEA6E30F1286DE16546F90C4364A5C09755AF3FECB13983C418B2FE4AC17BDDA57E4D597E8BDCCBFBE4082C446FC920E5145BBAFC67FADD9799CD8C7714510DA579516ED39B3E22DE319977FC77A9CA61AE8252795D11724AAA866C1FFDBCBC1FF91AF1B8713248864A4E8B9C59DD12863245F5048110DEDE7FE31FF9836715886C37E9642DBD6C668BA7AB8C2B706CDD58586EB7227B5768C3509C1F66493468859E275700EA38BA69064179F6036D7B50BD232B61C9B9659492894C0057DBFB80329A76CDC57B2A89BBB910483301CA0BF6AEC7D5DDF86644FF52F48FF6C7CD00406CACBC09AA251708BAF3276A52BE2C7B42FB6A9036C318529CA98940769A67DCD532C0000AFB5FC63AD2303E94E09D2CB40CCBE47FAA1DD22ECF528179AD40FD4BFD43717864149243D61CA255344C52743200ED8385A7CA6CCA24CF967D23D07DC2A3F9AD5F3240F4F022A6C6CD281B6C492E8D144A2F4641957ECC65B32C9F74BB468524FF58F0F3DA2F5A56742896CC8F99088574264F857DC67CF04C4B63C6A08FC534229CA8BA616CD504F969EA6E3C98A517355F98A9E884062805B77623239074206E01AD2F3FC9FE9FF8254A5D3525C3B2F0A692803500C967A2E18511EF5B8845DC4B0DEE9338C38C4B1B8B84EE63923250EB6F9E9C272617C7895BD538A6F34D3557812BBBFAB2B8FA6EB5E95B9BCE33AD3185CD90DD536A68639022C079B5CA7748864D37D45FA6780A45AA991F28BC0D3BF371EE2FF0C913CEA6DB38E4A278A4840EA1F255F8E83B6B6C5E260A49D727AA42095A88CB8120B51DAFD764E690102F7FA07CEA2EB86AC613E7BE2F498F5767B622D04E8A6F272976FB058C3334CF8CAAD1D180E3456C210763C974E431CBC3E25EAD8B9FF9243628D5B08D92CBF1D5DF29A85B1A04D2999B3C669227B33610121D543CF4A978F8D9365C0FF8AFFA92B07FC8C8604A0F357F3C669445685B6A29898301A5AFBE10ACE8D64A47009C8741D7CE82E9900643900A3B92A26FE5F24886C06AE0918C3F2523C320699C799CBF72F0DDB08A0F1F63D6DC2F021C78A9D44503209190EE4BE654663679CFD292292D71FC4BA6233A196EF9E95CB965852773404B2622B565BD91FCA6747AAF7F4EADED7BD3BB53645381B687AE04B8D8A9BEF1095EEB39A0BEB4EA89BADB4655A1AFC7EECB7DA0D670C192297CCE0B31BBEFEBFE94C84603BA8C0B7CC73159FF59C01A037CF2C866DC40D88432CD6C2F1989351A4E41343CACF7BF2C2B395C863709D6EC1DBAB2AF514CC771DF14DF095DEA8284BE2B65097D8E6F72EF3936595384AFC0026956E819F1657C901B92644E9D6D32D0D95549729B2CB3D5EFAC9C42A5F284ABC3BF5CCA5B08161B09D9A48FFB2996C3D4383D65B8D1F7FC3248CBE84B9C05464F4A76EFA005FEC342EDD56959CD26CB0DAE1B61B0493A4B68EB3D6335BBC280508F09D84E0C5F4EF520D92CD34D69E5BAB76DF5D2B72CB41A298D370EBEEFCD6C1904B956458BDA581EFA6B3654BE402AC3A971603F23F2B543C5BEEDA5F018543B72C146CF04680BCEA31B4A238460329E2BC12F14C804FDA3494C15452223D2477C9C8A497D04EAAE7DE09D7D7A879D3A5DBA565AE1A38F15E69C18838C487C0FBAD44A068C42EFB7D3F5EF488F91C42F25AC564751F0EFE0ECE7D98BB1B3D0FC42C9756F4B8F9DAF1FD0D414391155285C8DAEAAF380BD07E43570F14E9A47A87BC733F1E676233F17BFB71AAE464AED68487392D339AE064AE27BD57F8695F493AE56CA96C0615BDA8DA37133DD13C2B21DA189A7329773FD8D51381BC118645440B28FA4F402EF84C4091D3A0BC4D206BDCF9007F5DE9AA1E6CF7F6058AC6B69FBC703E908C4221F9065147766E48F54BE4B076406E2F9ED19C1BE982E636FD02DC26267C3ED989E6AD1CCE62E7B988FA7C1831E5126111A4C3C29C38A1F96CCB3A04132175FA46F73C634AC6EC741B135645ABF1DCEA18571CF9A539F5CC935BC6D32BEB1C7B8B3B5A141146EBC12DBBCC17BB4900CF0B95EBFAA52190AFC6D8933CAFC9 - -count = 70 -seed = DCC58DFC13B035323ED44BE50A7096F697C9C143518FED50A59181160960203831A9904847BA20B85E99FFA63E4AB0B2 -mlen = 2343 -msg = 954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA -pk = AF82447CC0ADDB1A14449FB2DA7C5A59023A56A06B190737D384D3012E36441DF79755CE72016906D688DD7628DF37B80EB899EE1744537072FF1CC019928723 -sk = AF82447CC0ADDB1A14449FB2DA7C5A59023A56A06B190737D384D3012E36441DF79755CE72016906D688DD7628DF37B80EB899EE1744537072FF1CC0199287230200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005346E17998E2FDF8548ADC13A15C02174AAC8C87C3BDA5A5E6D5FF44A8491F29A6B1123D7566AC29A416DF7B0DD500000000000000003A173B60211D2EABD338EA9D33B88683D1ECF6722B237E64DC7E5AED116D0C6DB50375C753A4275DF3700D55628FFCFFFFFFFFFFFFFF3EDA6EA0AD118FD546014D3A4464E5E53F8614D32F0F840A1652655E3AA9F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF832D9B93BA45C11C18A29C93AEB60DD49D573405D19F3A4F322A9FE303B00C0000000000000000000000000000000000000000000000C0D8BCE2A2670AAEBAFA05A86718F1EF34EDFD79BB1B796A55C6679AEFD20D1DB138362E2C825FE6070E444649B5DB86ED95015F75486AC618B778B1FA8DA51D99715657039785B58A39478345516EA2A82FF78EE47EEF9A389E452DB6AE250EDB8AFD88E398855829C9378492B287DE32FC97ADAF93D480830790C16B24B81479055E60018321758E0EB2756DDE0E1E8F82630229239D793807B6981E3D6F2FCA3F6F561B516691EADF19AC12F3E457B594E126A2D5EFA6BA37EC8CAB0F462BB5015995823E4BA51C55B5EB333C38C0B3877AB1527CD5D90215EA416FF4232E5A74AD7BBB3E1F3148A2DE36FD8162A1D603950B2A497CDE3BC77AC784D52C1A26DD4C94C4E48348A3662570169424B8B4D3B40E5D2AC3C330E0E6E92559AE2B84EEBD817989721193165C298FCF4E585D7910E4634F1950302FAB927A56AF25CDD5CD8B8B18634E4254283E5B6DC330460BF978C49E328BB8C258F63A9686251C276FAB0B4C94AC128ADA29F3EA33CCDDB609268B6E9026CC103C34C74DFA29C6083173F15F113032B595648055594DC3E521BF4971D969329AB8361A2AE02266C7F240CF9F9C2D72AD7AD81782AE6A9A93F9C91FC7C4C9106D22B11342320C -smlen = 2520 -sm = B6F43D6ADE48EDD98A05336BB37935CF60D09B04E368F48046E137AD0204CC446174BFAB2CDECB0337399B85A738E611FF02FBD3CEF1D0EEF9104D03736F2CCC95441D11DA076C59E089171FF347BD0335FF412F07AA8FB2DE0258C433B8D9A2BA4B92071BBD03926AE6EBFFCC0268FEEAB89C7CE491F407F65381E6092C7C279105CCD388C068C64A61210500B1D0D04382352DA52E26C0AD354776A504010D9ECC25BC1B73CF3705FD4FE0283DD00602954511394B9D10E1BA162861802A717E24EE42A346C9ED280C88E267A41EC09D6D73B6076E7E30257BF265B71A0B6E0CF408F02BA9078811BE94D0F38559E9985463FC9671D182286CC4F18CABCAEE1A3E5ABDBC384FB27911168B54A387171C0524489FDF512E4D8D2F65050CFE7405D8DF63A79C6E42A76F4538907EFF4DC5870095241523F56FE8E389EBF1A1CC47DDB9F0188513D5259BE257BDA5BE7381F22392CDC2406E0F2448A80F3824F2670F61920C667499DE899F0F6B397381A2DE66255E061AB92CD864DE75C9DB7CBAB9FE76AC38E0AB3389530B4004055268B289B40D79B32E5EBCC74353510BD1627E2D5DD0BE7D3DFD04138F6E3EE7526133DC70490612EAA5024BE6FBEFAB24E1E83D8941A113D8B871F3DBC3011869174888CB7A265D7DE9AB99B999C19AF9B442EBDC904FEDAB52CF40B787AAB35626417C5291F2EB892F43E698A8C65CBB6442A4832F33920FB2DBFC50B8E996FB227F2FF294C385A330957D2FADA9F86839235EA79ECDE6D9D94FBE7C79A38D40B9A8F241F53B921107FF1C72624C9600EC04DFA1160F1FA9E5D986A5A363E9CE8627276DA73F5DB47E4B90328884CFE93194CFFA6FA680F77886E4A7A0FDAF13A7DDFF6984B8855E1F58235BABFD5106338FE2B075D4F10A9FB3D3C5F829B7C61B02B34E9BDE6E62CBCC3AC9F467A6CA170EB43E632EBDBF6847F781E2469B4740FDB83DA34CE34A286E3B363A72CBB13EB66CE1DE35D8FD77DBEDBF45C44DCD16E6B58A1699694D9006947C8C20810E85E3EBF8FB2C68B967743642D86556AB6958E545AB83EC24B96F2B4BB99CC8890C3C1E0FECCE26CE09B6D99000694F870AF9F642374FF0BBF61EFC7CD5AAF5667FC3FE5745DFAF7F13FED70FE070EA4C09CB1A92D8B7F0DFD4B4A4B7DCF4CA6A97043BCEF6346F1570F37B0EB48DB8D15C8A82ED69B0C7833D6C830414C111C987471E84D2CEB5BD973DCA34ACD3A65D7B1A502368941935435B78B8F2B74C2BEF127D96651247BDBE68EB7E466B9EA2A64A13C375103D7C8F7D30A13CBE184BD1EBB19F3274E645F5C7B82EFDF09233D8AD146DC0715266963FD3CCE6F8CDEC20743BF1B7F57C101AC24C64D568923203E1A6AF03A700F5A401EC4572BBA528E284C151F1D108F7563858011FAB32B3776CF2B910D7B21180DBE75742032791018258F4D1407C9A213755C5C91205352DF919B6F14BE056243DF6AC2909E52C9A79F6917440667719185F1C5F1AAF40D873BA22956FA0BBAD9C35360853333A10A0841D9D2E758A0B1BC187F6BBD31C41B74F9EEEF1F7A28BDB7AC3D52FDC6FCB3EF0383A06A61188548963E552716D2BFBD6C2DCDE496D06615E86A5CDB76A03BCA2822ABA85EC6807EBB6918AD2948D193CCF74F4BDAF7090CD4294C1785DCEDB6B55886A848284A6A4A88A496800053E84A9F2DBF6B334AACE11A5A540626716302E259A64C6316ED543806B3BBFE37563897E83BBEFA570312DF908C1786DF0FCF55069EDC336501A5AE9D4BF212D56A9CEE811038656912238AE284575EF8DE1285B763AE54ADF44F91B6DD9E309B7A7A0AB71EC2E4611831B3CE1C9DC85CF907B52DF7406B06367E7A43DECE72DCCC57D268820EA021C27056E3C6B50E7BA7A59B53539A6B7B06B35051E3151C23F3BD3C889B25D0ECE1FD0DF1AEDF657FBB096CA1C861ACB0158501EA1AEFBF6DAD11BDC325AC1CED3739A40B7A83458EF4F3453C0F6EABC1A48037809A90480DF9DC4FF07DADDC58DF2733D49A4FA53C2A41E55A4A0167C6D33BA6E752AED3A125DFD6A0322CD235254505D7B3CED7A0DEE7EB662ACFD30F8B79D1A872998CBCF15CD86E26809E0D2DA0324DDC90FD12CAF9D8E4EDA437FE4E658D47D67C95927C4B5DEE965B940CE93E6743917296E10820A7101F8F633C93069E8B569F4625AFD4EC61BFE4549FDD06C2290A91AC0FB40CB1F55DC8BC1FE695C73AF603840AC0351F5256E00555C984E79A09E58C566D1A117B7E569BEB5850FB491FD9B982442B55BDF53832AA65180DCDDC2F768B1A1361994DE8C25F3608EC853D5982E0AFD1F9FA70170FC3589DDAF958DD840B4B502F8E2697D01AD7AC2233F6A16D540EF8D232887D2B4FA727AE2F038A69AF3DAE69EDA8EF6BF1E0B67D811160B75231543EC5A4D0778B7B42FC1DD6732385AA4400450B3CAEEFDFFCF147635CFA4AAA53DE4EE3035BC40CE8670016384BB877A86A15B59F3DF0C5D624D3D2B23EC46913618C745330A96C715C6F0BD096487E89B917384CC30B3D20A332F1B4056462227E98AF9874FF1D18DF2A6BF84AE822EE737F9E34EE8C69F23EEB9BF38ED056F499545F405759355C104284A6D08A9EFAD8FE28288B2084336A6479A6D42404F3E6FF3AD1DFC63C8AAE971AF11F2699F32F57AD29188492CE07BC1A271035B4D13A686EFDE5572353283A0F3138F6DC05CC35E5E5057C5C8B9E12B0164C0915ADEDF40A6E23848FA59ADC0E65BDD2120486942F232315FC94B4676751A35AAED2828889864C4CB7DD95A662A475733C2CA8F6997A9C822C6C8B9DC95A8B4C367E613E97D3EC6D6DDC2F81022EC21B3A93244E3BC8C2737A7724A3CBD480B26819EEB2676FD383601D79FA266ED3F9BAC2A98FF0109AD7E43E33E108D88C09BA82AFCCCFE98F50F789109D99DCD0A2C61947544F3666EDC621B5D5ECB7088B2430A611BEA52BE7F5EDFC6E2649F5E81F6DF72FA9A748BFF06AF766A60D2B751B23A8AA95CBF733359F7C0CD19B1482A6E6572D1570349C688D78CF8B8C7DD37576DC47A193A2C2797D0AF7504DEE303823A8B77204AE7B6E91D431979798A7EDF435056251D0E3F26B2CA16BFE3422CEA0398D30F0A0DC06DC8A93D27D13650E5BFB6BA04C93FAF0D7D06F99FE4F1F52A059FBE808179515FDA48ECA714F0947FE9A98F02D66FB0D80952411CDFCEAEF6ABA16D92B8F1B82DB151D7DCD7FB7781EC55F4A86C86011FBB9C5570EE76897E7803036E2FE3CDC2D5EA7A613897F3C69A6EA734E3811BFD15E90D7256A0C0C88CEB54EC6AAC151B435CD2A870E4A02087C2B847C75B00B44BB3CA6D4404C3052BD308B8D5F595277592D26F6D5A2193CD4D650BF931FEFB9DEEE61032B29EC0412F38E1CBE025B2891C59574C1450D9E3D8EF27940EF712143F06F38DDB86341A7FC781E0FA8971DAD13AA7E93F1858C70A71A40164211EA9F6A41AE90D19032C2EA52C23375CE3C4E59599ECD6855213AEA83F8DFC5CC70F58A62E4DCA17C09705C0C099B29056592986C03CF5D67074735F2BEA - -count = 71 -seed = 270BEDAA7BCD43990FD8B4F44FFB63A3AE8E991BB2BF84DA7BC2CCD1A079C579AEBE2082ACBAB7FF286DE795F31973B4 -mlen = 2376 -msg = 326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B -pk = 2D8C194138B3CB1DD49659525266989E96EF4B516573D33DD21A0801F1DBB9120DAD38F4945C6E32119D1CF5DACE8065E2AE392A9EDAB4C67238102711438606 -sk = 2D8C194138B3CB1DD49659525266989E96EF4B516573D33DD21A0801F1DBB9120DAD38F4945C6E32119D1CF5DACE8065E2AE392A9EDAB4C67238102711438606020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CE0B0E0E9497ED547F7C9FDBFE04F84BA9C3322C04774F21B7BA216C23DF91997086A486BE10EAD65304DD867E5C0100000000000000813B2A461EBBE2D4E7DF535B984D139325F7F13CC8D2D44CE58560EDF976C2C2065AB1000479D3DA89B595D33059FDFFFFFFFFFFFFFF7196918ABD0343331800EEA539FBC22F2338906C61D561FC89BA1BA16C41F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A6F570BB3110090C24DA83242811A2431A93E2C414013FC57C46E218C2F0B00000000000000000000000000000000000000000000001887A5588DD6CFC5977C4CD2DC8D863A79B17C9F5A38380166DE1D8A6769A022D7EE7F52F4B16AF690DCDDD03E825BCEDA8DA1767F6852036573B750E61CA101EDFB9203585DF166507029C4C522A41E526E2D73049298B21BB57B10641F622A8945A611AFC1FB69D9B4FA2A33FEA059FDDA9D6283EF06B75A863EBDD330D31FB19E48FEFF450CA1A18510A038DD1BD07564FE5C59552606D40D040302A53314387BDD0A3B199D005A1C207A790204FDBBE997BA9F4A2D56A2A979600D321314654396FD722AF95C317FC0FD3C19338AB4755AA5C476CBCC7FE63F686EE74E0C51EF1E00A624467A9A4EE29684BD98EDDE637904EFB2FB7727CB0A79D0200C28CD80A9EF0E5A8B7FAEE8421FBB080C13E113BE507CB5FCC9FDD0EA3259AF9C18E3F4E850FE2E624DB28D01CD69B94AD4997956DEFAB8FEE49D89484A650B672967F08B8626467B97B7E767C8CD5C8FDACC172F607F9512F34FAA1970F8E30B2E37F320BAB7F6B0C7C4E87E7E371DDC4C8473C031945422D0BE5801BF4620832233AF8D8F34070001082AD99390C8B03C57E00DF8EEDA1EFDAEDA7548A3DFDB2B8D0C1D29EC33FCC1AC035D091C012B499A2ADFAC86927C67E92B5E04C993C707 -smlen = 2553 -sm = 2227D70D041D807B120546D2FAF05B30BFC0AF014D4835145D2928A1320103531F7C558702FAD400ED40D280556FBDCFF701C455E3DDB48CABF2D1047441F663E62923758807945EC47B52DDE5F1A202BBE58EEF87B3AF22D701ADEDA36B941BD8051C0603BF7064DDF3F17E060759D2C9A6285D2E60C10260964B6BACB214D63107823D5B79349C3A960C040137DD13EBEE5E84D9B105B6AFA78D98820D03012ED986BF0DD05CAF01ED86EEDEAD900102326A4FE723BE9363ACFC000705A10B6CD8A7B25E99A34B4A354CBD6F50550BED30F6C4208490B4194AB79B24B093FBE132C299DF924F2FFCC2CDC6C2C9019EEDF4B72D7F0817825BD787135927102E1DA041E9A78B501B42DCE777A79ACE604E57DF11775D7B87E75E5B00ADAC90D1ADD78CC5AD348C7472EEC6E6E06F737E77115A9509A6AE6570F738DC2F21314A7CCB9D44ADD6E1434CDFE3614BC73A6B468F6691B60F4F2DB103289A90C4FB2BF5AAF87826D2BEB0880FA64E07E9BD30D4EDA00D6BDA01D1EB22BCF14EE797A859C9A0D9034E8C5316201AF91388C47E1DDF061C9F45E067A5F60B355C98F8734559B8F1B82F47BD9CEE0224A1D67D40706333523C34F3582B6C8CB47BF7D0E4FBC7D7CF3DBF21077E664FD59998338F4DD4A423C3A145EE1E994AACC1A48F81A7E9FE106008DB93A6626B8C8505043AB864D93AE3972675E69C3825304086AA3419216CCAE7F7D5117739E99D8F4A0B658148DE33FDAAEB9967EF56677D2028C3B584C5CC1C096F4DA16799408B2EE2FC3482AD2F49293CF4097A78492470099BDB90BCB4FE3B245AC8B3C53E05D7609E34770ADCC147033A8FADE81359FF63C3FB90C5A498C98B7A0E5EE9CF4D287759ACDA4BFA3965CA85E1D1C1019E7FE6D82E5E66A717F94890277E6DB1EAA6F3291FE1BCD7D437094749FF5574B8728E0DC21A143A14E382937EFB7EC1B0FB3F6F9C0F547F470E3B436DFC7986F923BEAA89583D8978C433E0CB0C4E98516AF1AC797C778662455A57FEF45BA2C7865C1DF5C502EDB01C8CC729468091BB96BE9DA9C298528187867EEE9A06141DAA15F60CF719DE2BD15010550B92A41F12D8F38B54692589AFF51A9D5E6047A0D9B707369992251DF31341A45B01B05FFED8ADEE5810824F903EA59F14FD500AEDAE797F8BAEB470C0B14C4EDA5C687E4848A85B30A8E8F59C45D4C9F0C65FCCB15F4D4209A55722C29B6CB09AECB4E53FA3AA602C56EE3BA6900CC12889E7B87D5EF283AF1586764519A30CF60833C82F0ED15E39A8BCAD5C6AEE9999E63D399C5CEA10AE1F53B04858EF7896AA29FA541451FDB685734C39470250545193CAF26C9891F7F965904AE10E8566BFF9B2F465BBE13D6EA4A79586E68844B9FA68B2F992565C8B0EF5FFDEB5878CC12A0571CA3AEA50ADD29DD06E13741A1AB215BF487BE7735D1634332F47E037253054A21E0AD8D8F011334CB5951F833D4D344D632BCAB7C373CB7DAFE8F3D79E7E13BDB1C6CFFA474A9FBB46F5736D55F3466534596EBD22B29107A8FA50C1D0E62F0533E343FEE038FC0C3040A6DF2D318BBC8420019B1B148D6D1DD2FE428C2FD617CA73F224EF9AF9BF6F83CF1006616235471B69DD4EAF9F32529EF3E1DFE6765E61E246B519C702351C9CD66C57065EC78993D793B082E3685EB06F2530B07862277D339A52813C99EBE16C06C4C8F547D9705850E770982E8FA0275A52F430FF2422A115ECE46A9202CAA0195789532B1444F1507AAB2E4303464E499989F21C7D881328F18DBC77D4B9B467CAE244A93053C0321DFBF815DA28B6EBF483EAFBE634E9947BB5383FEE3A31BC03A63FCDDA5E3E46D5D3184718C348A83975728714351DF43BAF91787CACA346DBB819602F18A4C4FE90C4CE307984BCDED89CD2E4AEB66318C10D95AFA5BE53393FEB981C21BB1411BB9C58818BCC141223D66ED5F35F90C05FD4848617220DD72F5E892292CE20AA9A0F9AD54022CBE94D2C86DAF3FC66949AC35D8E122B02E2D155E73F4CE24D7E85A5C301DCC173CA8EC090AF9DC7F443C983280DDA27ED4B9BC71F86E84F7AEE39E6A7E9BF5E43920AAC858F0F49A06216D9D3984CD2E3575C0FA6CE8A5E28B0F481CCBAAB450FABCE8A1084EF458DBE257CF09D8116136C2CF1EDFA6CCE31AED0F1F8278C1C8D9C79846886D48E3FD311C015BF2373F7CAA71AA26B011D0DF5A843AB53D7E7F0466CCF49C5D4DE872CA87B8895101EE0147A3DBD391BEED75FC16F65814D56CB29273A5F4E5400FCABF85040505C31D001DF0023726E9C1F7C29A37039FDDA73B9B99ACEC3A029F7C0DD61ADE7D5E835E1CD605AA8E583BF8DC99285E86CF91F4B4827A0E8956EFDE2B495A86F85E78B954341CF3AFEBE8DB71C26B9B1BA27B47284AA84E55B1C2AFEE733AC596A10186D9AB504F33E34A06CA931D7633462B04B9B2B0D4751B0343503BCB2A1893D944FBDB4BE63DE167348A1588E6551FD9CF2101B0B4CB61422655FBEB50D64CB9E87A23007A39821EC3ABA391485347624EFC3DFDA4A133C537D7CD8C3A549BB6BEF9A52D2EDF0A8892C6FC3EEC3EFC3C18741C85BF24CD3B36CA04EE77F654ED5595A0E4B9316CCFE4D2AA6B4A66B06F309337E363C9E39829C8838729F19811093DFBE962246473B7A19FAEDFDB0193F63EB85EF308CD3BE5831F35CED36D9448D0EA8306044F78946079210CF89FF78104BCB2964CE2AF9954D53885D7914E4FFA4AC7E9B3D103922FD1AD68C0A4592F885C5FEE51D52214E17035E8681086203B79B5EB176679EB3263B44EA7287262DD84BB98F6639B9657AC04E397D69C634A0C1181ECA485E467D62631AD2D9AFD5AC5B86ED4005FDBB7404B65BBB826F1A2334A481B9CD46E0CE9C414A162E84368089F24149D7D05EA6ADF40B25A708357AAA5A28801FF100F69252810188CFC6087507BB5BDE1CD43BF72B1B3207CE4F7E65A18E5276613D4BEDDAF21AF7B964FF69965C47CB03846F7CEDDD2C5133080FC632A4F0B3495B2D2751727CF7681F28675552DF2A0994E425A922BBFCF84189B8C9F43058D691DB3166C596F6BC480EFDE06BDAE7B9C2985A1F2F6441520620E193D7B94AB46DBA2A1ADE44E2B006734E6770F34B0E2122DD7F4EAF045164DEA8C2FECE7758630384C00A6B528A6ECF07045B2DC0281C936A540904733149BC65B0F57ACD9A5E41C2ADF83FD6A760B169BEEBF04644DB1314270ADF86D01CC2CD580C609E78BBCD9D2694A89F9CB6DD36B9AA2AA5581FF561B5417BE2B52F3EF2581E461CB0690782F33862C52590643BECE0A6141DC805D8F56C4F64C1BBC49A3ECF1E8827926796E5F9335DF47DA6D3E4C14795B547116FD1F3351FC55C28B543183FEAD8DF7DA4DFBCC38E224901FF7BD83B16631064CAC4A37FA632F53F004374AA19861FDCA515AF91E66186EF804366D5A1B3B4FAAA60A0C4B36B972A9579548B4CDACE7EB85F1F68A4E4255FD994C1786975E7F6F0BA87D0295DE72876BCE37146A09EDEBC0164B9C4911CE41EF4D48130A27651BD0DC315FD622CB6D03759D35756806332658B5B33E768860C1946569AA45130486AD49B - -count = 72 -seed = F151196F55A9ED88F1663AF6BD24B2CB9DCAF3C9B313CD8F0A27639D3CDAE72EA90D60ED5C7C6AB697A06185E5A2E215 -mlen = 2409 -msg = EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 -pk = 8751EB75B62E46920A9CA05B112C24835E886F0F7C59188799EFA139A2237902A266AC22F5B9FA664BD2A1612E602FE9C42BD4E859E3214A295412B132CFE21F -sk = 8751EB75B62E46920A9CA05B112C24835E886F0F7C59188799EFA139A2237902A266AC22F5B9FA664BD2A1612E602FE9C42BD4E859E3214A295412B132CFE21F020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000413E9416E2A408D8A9A5552F490E685B89693FB7B576CADFC16AB2EC19E94F2D3C439D379C549746C6F2C9F365EB0000000000000000D4C7B58E772CF8F73D546535C37271AC985AA4113C938AA790004BCD9F85C5AFD9D73934F749C348FDE36E5A50E7FEFFFFFFFFFFFFFF1451443033D2234DC8DDAE3D2BDDD771A281048C238C7A20619C9ED2F59EF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41CD9803C68BB8C3B7D7188969DB8C065928FF59C1BF192B0A1D702889DC0900000000000000000000000000000000000000000000007933C9219ECF638F6B5331140F3C5B176194BBFC3EFC8A0E910597A16C36F92353AB4664B46C46FA8060EF3DADCD90AEA12DFD6BD6F20FD21CC4316C06684D17A6B488EE8BDD111B186F28924435F4CAB768A4A0AFEE2CE6124B7B1FB3495026FAEBD96ECF9968E080625AD54611E35D4DF3AD383D17328057087E862154370966B6283D4D16E294CC8E634704877D1DE53D8B77054321D4C9BBFD7655596C047686D11AC6B680A271112C75F2AF70A091BD5D27AF5146D37DAD96FACA031B014AD18681356DD5FAC6B431045FCE83594D8F473DB8D5C6FB598511D212D9781FB68BA428023B3CDA72B915D0C467EB1F90714A25B7A5F191CE915E4BD995CA02481539E7A228695F7A0A48F5DEBCF1D240C725C71E5D93A0ED89E5F2DE917A05E9FC0C0448C0480701ACF4E1BFFEB4A09DC11F4E94FAD5B694661340A63EC0217B2A43EFD97AEE62F8B2733BF3A970F8EC5A3EFCFD6FB4BC376B7A012D4E4C277F34AC30DDAE1B3927F1C5BF2ABC7D99EC74B78163D4DA19346C13288A9A6A2B58532976D6D0DCAED327EC30A47928E45245EEC8378FBD25A19CDE261898412A4F79F9B435CD79282EE4A22C9539872604A0B824C78686BB5AB2AD634CA2160B -smlen = 2586 -sm = 3E3328F1AB7BED5D31024C0D66555301D7785E02A88DA63BD2959D0B1E04939E467524B38C26FB01CE31364DA7CB5AAB7B0503441EB8204876093303DE59C60FC7DDD6A4B501ED992F3EFB9A3E79020785E99C9FE310555B73053F611CEDB149F7F9970224125D9E33A1DFDE6A077720FCB2B8A6E1F35704C556EBF0FF2705B916043E23F1C7A269233C900300AF895A73B5CB20F8029CD322E0159BC60403D630A6396A5BA5404C04AE2ECEECBA169100EFC63DD588A7230CE08EFCFEEA534F5A0EB005480AD1D169C386E476715238526E936FEA7136E2D8AED60DE31CC91DAE4E764CE5F93624FA7F72B87562FB6AD8996B5E41FD478AF0AF8338A7FD9AA250EFD2F2D20364E8A88A8642E8E38F38583ABF8D3BE97F14C3EDE66EBF8EBC84385CAE646CDED8C5CE8F06910BA7FEC05D828446D558D6FED766FBA347DA2E84DA247C34266AA31C328804F4E3AAF6ACBB0AD50FEECCEC00D20B3610785B9F1BA06A0BADFB42A8F43DE3F7BAC36057EE0B4D2A15DB040A8903F767F7352995C8FC3E06ED1B1322587EEE5B31806192E04B09A7B433D08CB2A340942CB75C51E0F8409F907F69C5F8DC316A227942EDF7A458974FDA76C255FF4F1A85A352CD2CD2A21507E0F37451060D31D0847528B3ED5DA3E7168CBD0302F1B03842E63B3DEC6FB37357E37FC3CC26721F290726A47AB3D4DD8FD1778FE5133726C240E7B3E398F3D809C6C469680B9EFD25DBE890D6936B76A52F97AEF3F93872B76506A95685EECDCBCE203400D182252471B99B7F4C6CED4CAC8FACA7682D0DF07BC5904AAE042479855098CBC41534F0EF17F38F1BC8C272CF72C1AC4A5564DD132130EE676E7D7EC3CABB4E85AC81945C87DE08EC60CED3FA0AB3E83C18AE493A851434BFA2C4968B42ACCCF3609539C62A4E01F8BC159362E15EE91D8AA399D8BD8D67BA1E8FD646EEBB4583812293406B05BA5BE2B1DF9620E6FE3DAF8CEBD9652BB04494B899F407C7D9ED1C4E77FFADE24ABE56AD597BD438928E05B0363D6D2685D34D6B51D71012844415C46F13181B146A3AF25AE4E8853CC7C7EF6387306C45180A6EF9E97ABE1E7D5E10115752C3071B6A213367E8B1A3D1C3703CC1840735315623901D772C61D55EF8C47DB10F0EB7582D7A043018DC1363E93F315DD984B8002EA7BF5BED38D3F273276CA577CF99A635CB6ED9D6525520793405BE27C86E6EFFEABB1E5F84A0076BD151CAFC59853424DE4B3460C673B0820D76E15EE47B6505D2D5C179DB92A44042F3631C646D350EA9721B8984660A76018DCA5C6BB1223CD03CC844DC9371D32549D9D645F75D2683FDAD1DF6434BBE43200E506ED2A815FAB511172C70F99A85FA3970433E8955B2F9389F23C10141B5779A23B8671EAE8B91991B78F635FBE8E627D3E79D91FD1E6E90699640BA3AE8D7E4CF5145F1259CC76AE50B1FA150D8338A9450A5B6B90EEC9C94318BC78C9C7715A3EB215AEE6443540D211A0556813529023E5A581623CD6D19BEF0705A5F69AAD4833A57C308144E92899AC5683147CDBD279D5C3A55BBC5E8F8E26A158A3E42F8C5B858909B024B4BA4069E26DE66460FF4A7DC92BD54AC244007B6AC6CE07A31A2AF3323CB55F07B8F480D279308FE10F2DDB001DA6C4AA132B988AD03FB63E0EB06544571F5505CF377A81153D6FBD4FA2B7562074CFAF587CCF28DAC84AFA58809C0B296E0D2594D3582C28596F5AF7500E143BE7B49C63D04F49BBFBDF60B024DABA5533F945BA90659758E06984921EFEEF79604059EB808C9FE1BF9BC5351A406FBBA7F5D8FC9F891488E537DB14B216A0535C9FF7BF8D5C68A2453A8A48E58FA7BF6EB76448D6D0BD05BD4628C4B852A236A11BEC0F67118F1267CA42647F6F2303509094C9A7F3A07B2724ABD2D9B56B71FA7AC6CDDE456EC209BE76C419855A5151EC9EBF0E0CF1B86F4E8E81B8173960F8D1C8AFFED1AC7B818AF8E3BC092E2B209D693E80B11EC7DA39CA93223E1B47C6127E8AD40A78BDB0ECBFA1F39C84CB9ECDF960ABB39884627BC4105C53EE7BCA4802B92AF60241420CBB36C407F46CC2E953D7E3503CC82287A8D68D0E673E212173D80A12257ADD5256652188C00590DADCFB7DBB6B35507B853EA5FAD4F52E02230CB3D3BBDFC43EB74780583E8DBB851E0257117F4A39A6676586216220C1CA21DE16CDFE6E1CC99EA7C989916AD2FED4A8373CFCFF02207529BFFCB7B7601317450BF430BAC9CE111B0FBA8D7DE6627F863078D8E6286B2D34856426EA90FFD58705444D0DC12D4FEEAD0FFE543811E1EF306F40939922563832D06E6DEA7109087AC051A361EA9E755856FD4E51388BC7C40C63E0953C8413AB0CBFF70C466E15DE5B089D095E8EE8A64E929D26CA3B71EF0B2360AECDFA89284CCE08C666F4E0146362F0BB84B87A49FCF2324EBB96DD941F00E2586F7246436EB66B1E04AF84482D8ECD2BC8EF9955CBEC62AFDD754A7F235C7F3C41CD0B36A9024D426B7388D3C33A5A6E858846C0FB0D88BA5798C923F9B43D14A6661C65092D5C5EC0F97D84784FA336AE6EF57C7A5D04804B96D19849FF9074724A5FACA538E32C6EFAA5209317543159272CE50454FE1E7D068C8F5FF3797A66D5F87758627AB5D40EBE1FB7CE9D69287AE7A5F349A5DAABD8A8E7778BAA26DA0EB237034A3366448280237A165CBB303BE6B33C0F11C1E56C50A84384A0F6878F2A99B14CD3B6820ABD27D2011E0C37F8439BEDE65747038A5FF7F00DAEDA094331523CDB7E10F1063B64A584D3E9F0655268F89DBEF3EA3FA4C6E54FEEBF8F0046C6C811F0767CF6FCC9B3497DB05582774047A8DCFF6A0C1B5188076E64A9D5693195075F2A05E507A5A523EEE4537079F9E5E79210E4AF056D6624D45A0EBA553CA9BC92171451970102CAB57DCD89ACEBBD7025008325C61145264F42E4D14A76E5C2F1C129D4C054DA00501081617D1A27012A6E160750DBA73BECB5DC05105BFDE1F1D0CDC837355844B291B09015FD610628513C1C86EAD373730B99FCD4A552FBA07163CE9CF6A3D3AC0525593F0648256E8B33FBCF92AF58CE26D0F036E11230879DBB789507BCEEFD2960EA320236A224EA74DD2AAAC541664FA3EA9430D4FB09C878169A8AF1E7FD4BE5E7926CB0B6A352B25F452454474107286EDAA145C0A0573361522EACB618DD9C8B32BD1A8A5923F4C698CCA0139DC640C1D5D557CE889BB69CE32D85853DFBB0F34DA2CF18CC79472906B67F6BACBF287F31DE0B9E7A01A356EC9B64653CB922501EA1EDA940089BA0F293B667F482E92438805CD6851776CEA0920CDEFC4062C9B4E51F5AA1D7FF909CC2608B6F28CCF28D574BF67CE80D4DDCCE28F2ADE0162CB66894B5B2DA0EB975CD95EE7FE72FDA2736616C8B571FAC94BF8C64ACD1642D9431118F08A62328D99B2B9D90BBC915DB764C4935951A59C369C72060CD9F4273BDCA0C295294008C0AC3A149E8CA5E8BF21042F5F21C067147F3BB52B13975026A9DF7246AFB1D053670982AB316509F2850342913E1322758ED89DA02DD79126726B1C5566C1831CCB1D62B3E271875E62CDE0DF0715D404F95F580B63923F362D416F83FE5AD98EED584717FBC2CB7D1B00101200F4EB4CA5 - -count = 73 -seed = C7ECD1EC1A3D83F5116C0AA4345FB3ADB4D9F81BD79896BC4932EE2F9D2D1F179BAF7A002D88F4F69071A7931E7F7FAE -mlen = 2442 -msg = ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 -pk = FFE4882B6A2A0F91F36096D9A22DFCB0EFEF99580F4456BC48110CBFF2942730FD175C9D76AD572A4AB2BDD1F8A62C85CF5DABF0EA2716BCFF69132A3D49841D -sk = FFE4882B6A2A0F91F36096D9A22DFCB0EFEF99580F4456BC48110CBFF2942730FD175C9D76AD572A4AB2BDD1F8A62C85CF5DABF0EA2716BCFF69132A3D49841D020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A8383C3815B22C5A87216017802AA8B748B24A09217E3F2AE052B8B9FFCB2AD36506D31C3744E58FF634DA04859F0300000000000000512806B43B33D58178D89A322F7FF970F07B0640CAED484B6075672EFA40194B0FD4C41AA7B6A3FC64A7842B7D3DFBFFFFFFFFFFFFFF51018CBA1F1BC6707209DB94C13A0C1D144229A94F8385D70E61D8BDB323FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF382FAE4F1928777E753AD60702B0E62558E6B3C99A918CB5C2F5D4D604F4020000000000000000000000000000000000000000000000D5A4C79B122BF78CC2B121EB58AB52CFC809A95771BE3240A473B568A7B3EC0650E320053D82E4B1200E70755B065AEE234B82586578A397ACBC18F3F2DB270FD5276E4B5E266DEE0222CA1A4E7C9631FDA3893425B066DD4D0FE28E72A5802C33600D9577EBA56632140830563209984568C29817FDC7451D39C7E62BDDDB0BC1BA33936BE9CCD8FD72288C41FFE283F695300EC50B9F36FB7BFA7C22D0232ABB7A2B01D088480E0807C661B55D3C83347F8FF5F74311F61E63EC543C02CB2A437B82E98A2E767574E0B4DF7E1B2F0A0B361AF2883B504D6B30A2060A8C5D2176BF72A6368E725EE6F78841E034872215DF8D250D968A74F75FA7C45C92AC0C6F8CA7B8A7DC931FB64FDE5E315135D40AAC0982F46F280CA9D35B016DDB4D0FF2D1CD946C248ADEEA3DEE044A27A19A93682BAF08D366F04F13B6AEB276A0086DDF5D5D3120B3CA6B5087299942B8F2388E5E8A53E16C22640176CBA837A32A004105A3C69F89A43D1581DB1A3C5BA9EA78CF960A7ECE4D4F3B1917862B9917F9177C8B53282D5E63D036F8BF9DF7F256036033C09D252BC972C2C95895BB1463154F0D3FF17615054BF132F7226F5F58CCEFB182739AF615BA2D0A4B5CAE31 -smlen = 2619 -sm = A2408D2C859A3DD9B2002AA602C0155B45913E0523FB02CB9701CB4A6403B1BAC8B964EF0558EB07B9684D9B56B75661DE038F23BB2D4641400F7800F38C8D941753CCE59106896DD73B44579D5D92019354AAEF420594DD6705404C393FA4038A39E4011F32CB20EF42F00ECB027DB58F2A8955A8A08A06B222C4F188C605A2640103A4B21924D16F65BF05015D7798A51ED88F50E52591B433A35150080191D5F3C376A53BFC3504651C7E1F736D1701ACB414EB55AE5E49107BD0AC5975544F83104F7264495AE0BF0A6D9594C422C16B99469ECCDFE8B8000875B469309891EA42586A615D146DE64FE59277A61631B2C7F7379CD52FAB3871BADE120EE9558D1479A91925634578CF14D35DF3B5672F8B5F9F956FA9F7489D6E37E207FE556017736F6B147A8CF664D0E0521D94737E18188A1B7C30296CCC9067E7B55D6E0F2FBD875F42FEFECAC49510E324968B07372DEB10A31C585457E0C48879CE44BC78898ECEFAC7BCEE90D0F8925DF2B52D5AC81692E0160F8FD5808645498428260F592E29BB90FCB07D0424EC79FB081840CB827CAA4A9D562183D10EE41D281E26CE3EC0069C83E1E446EF82E2E30DEBE3F409E0A9E6D1550E224DB15DBDDA44341E4ED6F8B8984716CA87233197528547D090058607CA141424A13145F1E896555288C5E2877AB3B51C7F9248D2D56A8521975BC4EAE3D009988CBD73C66931BADA0725FB8A3448D43E0C7364E9494FC4E295A700E79972E1FFD626D1CBE0199917851638B192EF9F5C03223F2BBD67EB59A5E8BAEC3DB40616938274201DEA1AE640F6EE7E047CC4C13F80DC65E3FCB5C62386015F4EF1BFEC561E121F9BFA9B2075BC1C4730503FDD5DEBCE8A535ECA01B9D5B021C290854B5F3D49EFFB263DDA34C4E96AEAE9E71A686C009B205994B46CFDF1F76727CA67D415B9D21D54312CDC6A8ED0AEAB96B580D0B419E2058E5D843C17C96D156549962F81C266233ED2B795FAC40B1992B626457F211F08106AD86F5702B9DEB9323A0970AD86125ECA836E0A3D6CCBC380D474049BD96EA246B8BD9542793A66E15B319AECE6BEE17ADBBA7DB337D25F8F642774030A2FF969CB5671F59901CB109E661E55FD5E75EB2A96DC37FEC76A82EB89D020B4916271CFB0CB3342494FDB62EA0D253FB8FF2E91357B33D96D41530B8B5E9550FE9B3F9F34FD5A2A1A6A8BEB93CCC322622F3B5E8487DE19AF57CBD1481ACE02779AD928B17A9B05CBEB722C783B088B5912C2D67CE5073F1801C23170DEB1EB6DDFFC4C33DD25F94F4FBE59D704E478FB49DD2142801C37ED8F539EC1782EBD2F3253BBE19C5A048B9EF41824A811119F3A6AD2A0D4B77338E001358C61A9794572B0C46EB1E0E575D4DA141A415829BA8712B791B625B1B0EA840EE745D9FFE1E99EFD782BA25859351F443654995102CBEFAD7E59D03C9A502ED7B77144D0566E4BFAC086A7DEA356CB9E5AC02DBF7E81D6CEED4A33DA8D801D61BAB5C01F259EE3A99FF7F6D7BF8F2160C4BC3F890736074B000C4C58FA4615880F93FAD43D5657C76045D7C414E6B85F63AAC91F04A616184E04FF9AAD513BA767215FB0331A369D36C0AE9B1EC1268F1D0B43C42B786DB23DD66465B3AF17FFC68C67964C2FC9E41EABC45DB68CD2C3D95B8BEC787D994BB8E9CF1DD7D4C563FCA5D80B3F1FE8E3C7BFB7D171F5B9023BFBCC0CF4371B63C856EDBDA154B4313C47983F4027F9E61E86DA1E8CD787E3E6B50E1DFC9201B9AB92059F8B6D1BF7856CD55C5B1D6C4E6EBF818D481C56F66C79444F5A6544A64A7D78EAD33EB805A6AC4310CD46A2331E707B9B0950CA12092402D68C1CC5C3F269DFDB13AB34B97EAB50B0745BE72BB0FD2D73BEA5DD37802393B635E42A0DEF8544A96E7F40A8D9D06B64E38DC406BD59AC5C4E218591D20B8DBA2125978096517EC5C03F9BC6F96CB255E216EF82D7C7C873029F9E1D98EBC0D8E1312B84B8D02E8D680AA56A506C8668B5B9C56D04CF68E37C7CB1B9377C867240CD42FC7FBDE0AC44E3DCCFD3F877C9923AE9CECE0CBDAB00CA530F434A33F1C939FB88ADEF4D12ACBD8B2B5A139A3FB776D8223A9846465C0372B8C3233FB5280E936BBE9FD49058961463A4419D939F4F1FEA705EB63114F0A3533638DC4D3EFD620147770AD877E2354299CEC6E5C18924E78DD661697ADF89A77C7365522D3E8FC0855187139F7E43E9A0629EE321B2CBD9F007B05C22EFF56FE48045686B36C5BAC2267F37A2E3D4E03E19B1E422ACEA31C2E9F3E7541976D4E2FA03119DF9C4CC2D5418F0FC7A467CD98E290695B9530B91D5DF8C626C7236A5C0FBA73578B9A47491CA0AD26A144B0F23EC23D2C5B2DAA03BF40130F14B9A427CDFF1F232C9CF02426228C570CF1FA7C00A773BC0D70858588542BBF8F581540870897BFAC8387CBBA3416A846CF9F4F5D3F9DCEDD080CC0DE9F71B93828B835430898E82896CD3F30FE2AF8349DB294FB2A8FFC0848692A0B9E8A66EBBFC0F896F8D03E3C6A0C27E0F2177B85A2F6FE31E8AAF14EA5C1FDC54E80CDE47AE27A161264680107023CFFA961E913C4E6AF96C0BE37AD859C334CDB8BBEECB5443662739D027EF1B9535A5A46E2169933E419454025623FD6779F54C622EF81AB9289B50758EA34F868EC85AEE589B08962B85CF537BC733F62AAFA95FD81A60D5C2E38D6EA0DF7D1390BC5050E2463E3E2E3A769DE2A94ABDEDFA0ED67CC0FFAFC5A05A3B0FD37BBE6967BED8DEBF02A42CDC80BDC62158E184FDB6672F7947505E2C0A6C7762B1145C4BAF30E3D32434D22707044DC99D2CF2D38F15C43ABC8632382BBBC9E0F106565906F7D4948D30FB19EDCC3748100397F71E1548E58A5A01876D0A12DCC80000224221C4ABD98A5022506D24BF4D9B9108991AD3421D4AB9CC393DCB8D744F97822F95CBB2640E73E401F044FE20253ACB8B32A75FEDA640E190454BAB695A23B14AE3EF60B00491AB22F622DAA89B6B2E6D18E735672FE0EB2DE269E4E386C926E23B865E1BA22DDA688293DE144102F7030FDE6DF653E4106C08C2467AD7C54D1DF0DC5981004876C6BAA8720F70942700A154A376C8D45DAE1BE74910148EE3F2733E591E1965FE763B58C8B28AF25E9B3C633ABD83F1C0A4F68DA2E0B85083BF97D4E919340C0437A604416C4F629B33039BBF2A1F561548321780411D2E8AC0EDAE76FC3A19F3C84C3BE902A1E84FDF69B11A12DC8B78EF257B5FBB5D923FFD548451A52C6A3AF31C70266AE8A957B2BD72A51A034A2921B8E19321108AC303B0D2E269D032C3DB13F21D558C82BA4158962F2210E1C5FDD96C98D6639AA844F34E40C1B9C909CC6AF1E97A8DC83B78C72B30B7AE400F44CA60AF37770B3D9147F7D6F5A327F34DF7CB8891E71D41D723CB18E0DD324E5CD22AE0D9F2B1D2BFCED0288B7AA73AF4FE0A8181BA1AA7EAE966D0A240E10FE5735D98326A106D16DC49F3FDB19D3A8449C56A74153655600E4C9E38D302C6D4080017D93C628388DF94860329BAA289EFA4587F079C6F03FA03C54540A0AB4B067EE46A5A346F2FBBFF6570ED0166A55C258EABD62AD90F060FADE84E8FAC799F7928285F58557A72E055B535D00BD9A4880D10C05C07CFE7A6FEADFCDED880521803E339F6EAE3FF28A0A471A003358F952320F41A0AEF9D28 - -count = 74 -seed = 5DE03CAB3CBD81B8805A17E0FFC2105C3BCDC8D782EAAB161A15AAA543FED59353C1FBE03E7F36B955FC51C9B30F0C93 -mlen = 2475 -msg = 5F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 -pk = B02813B861876C64814429B3930D445CC28625BECCF3C60C969F5AEABCB01F035F2D9B09ECF9AF702F495D81048AA52F9F759F2CCD2E9504388D188E51156928 -sk = B02813B861876C64814429B3930D445CC28625BECCF3C60C969F5AEABCB01F035F2D9B09ECF9AF702F495D81048AA52F9F759F2CCD2E9504388D188E511569280200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003BC50A1177C94523FEC429520719F8DFA5D14369718A9E9890A25E9C5D2C6F8C9FE520E66B14568BAA7DB42956740000000000000000D80CE6FD8FB5F24F065531263F01865D47D946D2D0981C2DC551423FB733A49AB43F390D551B0E74EE7014DEC96EFBFFFFFFFFFFFFFFD416FBAB0295E9C29CBEBF0A34B0477196C026CC37B2676FC1E0AC9D6ACCF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DFDB2E239E05389A52C12A169B30111344A584AA70E9A089BECA0EABC690700000000000000000000000000000000000000000000003673AAFAEBFDDB1812280FB7A937ABA9DB28753465241ACAC89DB666932B63124AE88CDC7D6B45E135D4751BF25276F350AEBBA04BC02296B5014083D45209050B970B396C0B5568AC3B59EC07B7DAA98B12D817AD7D4B898C13AA9E6998D63076DAD566F1F24379681FAABA6F979DBD90A8C25BB1E7B89D5B7E54A5E5679A1314A6B4F777008218D5220884AF571B30BB8DC48311575A70CA63D331F40E2D0DAAF8610659B1716220A5D1945A70E0B459E9C083FB6DE8C2E0433F3B90DF851FF42541E55BD1BF234FABBC3199CCD225A4647B7DEDB083AD4843BB9FF997741808A7AE07E4EBBC31A19081D652689CA8128EC90681F7D9D7E2C025ED1994200E856738C6E7C3D32B81BBEE2B94CCD89A362DD9BA6E5F6766EE5D8990D019990E0B51C8507E567E4DA0CE12690553929B3AFC8DB325548CD5EDB0F5E9784E450B8B547F1863D0843AE4DFDBB91F885CED33D8AFD4F660D030D58D4064280F110055345E146A1A04CB524A6CB8AD7BCD56F672431359EF2F947B1DD67F7124D61C83DA7F0C4FFE8F3CA6040327D36C2B62DC8DF637DA3E919414E6BCF7AFF5720DCEE62605E574AA1A11165FE47024AA256CA693BBBEC0AFCE54A85F03B1841309 -smlen = 2652 -sm = 61418EDC9E6A2AF1BF0134C9A489DF79791154042A8498E148848EA4A2010740DF1E64B3E1898C04E446CA7EB4CA13EF2D0004F8A1F602B3BA877F0473D15D68C4CD3B086905BDD948807BB6DA4E3D0179AD4E32C85383C2860791EFFE0AEF08961FD907FED665BAC1A3AB6C7F02A119C7B2866E8954CC034A1EBCF9D17AB21FDE0716D26988157C1ABD3806011FA4E87F4050AC74CEDED27A784725330E0339AB462EFCF6F346F705FCA82A7C6D138A015F7522CE6BD0CE6321C27B9EAA6F572616201F283C5EC171D0BA47662C2320897805E1551ED438F3FCBDAF9DE6F3A19DC16FE9C167A65B6E52BCF512C919561B548496A4A80AF7CE25458A62EAE92EBF677872482D8647C30C12BB1F080C6B9A56560D64FAB73DB17487BBB007C66661EA9DDA14601AB27A100EF4CF4B7447E51418651C03211F8FB884BE91F3980FE13E00EA4ECFE6D54882059A436C90BCAD80E4101CC6C0754417545F2D167629F80A3C5FFE45C00AB2BAF0494D6C065872B03A987A5EE818B3EF11E47FE1747F49E2DB6A14410F0B1F9610A2D6114395EF6EBB231FDF71D595CC1171DB9C89D6CF202E42D4FB968AB8105FDDB2AACB15FAB8014B534CF468D77ECDE2072623B7002620B7AC3E78B62AD673FEEF9F8E97E91ACDAB171FD415B2D15605DDE00D074A770E36F2218F7130F13E91FA4C88DEEA7E854BCAA01B8458D40625A33E982F0955B83080A926EC240E31F0D9BF477EE3A016E146A3909683410D4D09ECDF32EAEF580402F0D416DFC082CF1362E8B79158BD57739AEE56DC41A549E534C7CCF3620C7D7D95B92994A747D5EFB8EC43CFA8189BAA9B75FD54694E512FCA388B71A5B9EA591AE9CFA34183DE59D284AB16B2EFFA4B26A24A0E615B38B83088A9827EEB5C29B419BC061B033E0E3FC809AFDD3DE948412677E0BB5136854532639F3CCB176D54EA1961B5C527EF66F4B3286A583E86208AEEB8ED07D9E6BF1BEB33995F76CA480039A6130775895F19E3CD4873ABE3BF2FA9DE81BF0CB04575DD6AE282720B152CF0EC6A4A04016DB0F3543D8272AE56B1152B02EAF22131420CB194021F97060D5CE52EB21B57CC93964DD21344786E3888617152D2ABD829799CE47D20158AA93F7DA85CA6146C5BB94B512DA053C35BFA8840CA43F6509A1477603FD50F5E4F9A7CF8D2369156989AD638D35D345BDC859C52688211BF7EF3F4AD4944657289406BF01DCBB49D560A11840EF35DBC0C7F9C96DBEA76300CF61997A87D70F5FF8C51AECA2CF0680B6FE8C4025E1E25B62103D248CDEE335F4FCD67597103362003206C507970EA6D78CFF4B68B44244019152DBF812675CF667E5E13C8596EB6FEA3903BFB25ED08F902722A37F8E460E37A03A2D6ADBDF79DA20052DE658390484B83BBAB28D039A303D7376BF555181680B7966C798A1C6CB215257E37739DE7B9706CD1CF3AB031F68C82D6ECFA507C104115040744D74A40C49245215639D0CF4A5A7A10098E9CE3564AC3C44F0683AE9D3094784D354DB1AF439BDDF63D5CCA668D8180264EFECEEAC0BE1B8E1C6418E45F9ED6C779ECF169143B034CD9F332989D445C83A8786398C507B9171B4D95728575539CBB29C5B804268D88F2B39AF1F9572B8DAA9FEEEF69C4A77DC64BF2DBB5E57F8B33AB151769B2D00010D67A2D6F188D6D5B35E5E1873FE2B327E42AFB8885A842D26C246F7C18E6BCDD6FA49B300C65A3822121E95004928104017CBCE2AB95ACADB9802BF4BB049B8E96468353D649654C6F69D774380A5A387D6414DC3000540BAB6ECCBAA088C1068CCEF20036E5C8342FD512F55E6794BF85FE15721D99A1BFEEDC218617A940C8C25D4DFAFEC677D2A719B2CDDCD302294B7FA41AEAB5606F859CC0D638AC94B99AC3EA48C687D278EEBEB396DC5BF2D2E89E880F76B533FA54EFD30D8EE38B34DC5F8AE62C637E9A7E85D99E011F62D261AB4D3DCEB98A8972D3482CF817EFF476B873AC56963BD60183B359713385BA82F6E24BE2D6CFEA6DBB4AD2E1B5B790EE54D23F64E740502E887629B346FC8FCCC3338D0F2921131B84590B32C7CB82CBA8BB3B81EF7BC5CB12F0AA0B3C6A5B2878DC4F868057C68460C71D40D4263AC5C8B8317D2D0B63403C7549439A9EF227268372EC3A54CF8EE97714BC4B55007F92B1A32238659EC1EE27D6F2987AB06FEE84C3AFDFA73240963F076A955BF3C19410E1DA6A19B3EA3AE2DD8766082D3295D35436597783DAFDADB905465D05FC21FA8AC2737A52FA8AAEFBD2ED83F12545C1FA3198FF225D37070694C9392738E89467EDB2DA3CD1734CE398E32BCB1FEA2E4FE1260A2D9F9EDC3607A8AC8A51D5DA36E99B31903025E0CB157FD2FF5B51C9191CC16A9CCB870B4060CFB0FD900AEF62738A58C5726F5164417F084EF14FC0953E3C6036B818C21CA3476B8CC5F8EBAACE257A0315031A03E64E7F749B9DF99BB56CEEBBAA4333BC7270EDEE90FA2715BDDC38D44898A41998B2374B6EE3B8524D3A385C03868EE9479355092C4D20EC32DEB51497F4FF34AE7E7EA4828C288F46E5148DE28A8C660EE132E5B5489833DC66205EC968B60DAB96C2A4452A7019BBA9FE3D19D5829129E2A9C75C39416AC8695145F2B62EB9468198CBD48D7670DDC6AF2F99F77E7ACD01A34EA8E0E974206FBC22656867D09807B980563E06A559B0C3A7E6F43CF8DB75B18C0F90C12FF3BD43ABCE7DF75D17E631C08C974322010648FE2E2BC940E6510FB8835DF8384EFF3FE6A264687256C6BC0A5F9D2DDF208171DB55C4446B03CF27796BC77E3C68D8F1252BE21877D7C53747404420302CA5AE1AB57E43B158BE8B707360A2F59D6A473F98B816FDE2CCEDD92385202C419278E8B840DBA4C05E9BB65F68AE2A635A29110329E8C0C02F6FB5EEE41ED225051EE975F92DA52F93EB1FD7C0A098F6D1421701537298651313514AD31CB333E9C5DA719BBA95E73878BA41F9E2512862A80602AA2DE1E1D086576531330CC7BB8F0CEC38050B3CFAE5C8B1D6CB849A579F2294F8CE80FDE5405BFA3E6ECB01D5117203A4523591AC4030397DE9FF81D5CC91AF3002590F5854E852B88667638B2D052F2A7852425C8EC026E48D9EF5E73D1993D7F3FD7F704760562C36D2278C9CE131EC6AA444D7B2EACA3EE888D9B2AE122688DCB35455E7DE31562BA618F1183308B30D07A5C34020546218101AD42AC5054D4703587FF60E860A60375FAB12734912058D5B0B06430FABBFE0C0B43C22814F56DAE9E2713325A31C682C13F008B9A3D4FFA8A454F0F64A9213FF2D557A4CBC64EC6E4ECA0A976CD9F27497BA544DBAA3E2ECA0F54C2634C719B9C3A2CE37BCC8158A880BAA72780F8B1D3494F589E2AF3044B4FDD86F4DB2DF0843EBD9F3518870F55488F41E234CE94E907A69D28BD83347702750DB1AE2EB1454CDCA37A8B5FC90091F548BABF489E57C8919646E977274FC972088A522FFF9F9306D2F0ED6C01FF92CAE8440D7F3526B8C186D5B96942CB08032886051DA2A9FE77E38BEB18F4FB25F1152EDF9D61347A00A844929976A327BE46FFD3E2EE0B6AB1014294EC5D40CF7071C36B11127FF90720596C1B3065E7DE8010AEA469BB4F4AC5A6EFD20591CEFB7B94B2006D85CA475FEE556F24CC41237C631B75EB594F8342DEB4F976D73AA46563C1AA6D0B605A16152315626BA08807DAA6025CF62B29176F3A85E4BCA483EFFEA7E5939 - -count = 75 -seed = 63742CEFAE9868C3C0B31DDE0F9D378FD5D71BE7CC3F0B6ECD393DB55FB043CF00264852C45D1836CC12B9C872A20251 -mlen = 2508 -msg = 9FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 -pk = EB6437FEB7351929BB7BE1D4427EED328ABC3B14F6059AD2F14E8A24164EC6343695D786C2B8ADA098524B5F2BD94FCFB60D519F2230668FD91159F7E73FF42C -sk = EB6437FEB7351929BB7BE1D4427EED328ABC3B14F6059AD2F14E8A24164EC6343695D786C2B8ADA098524B5F2BD94FCFB60D519F2230668FD91159F7E73FF42C020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000792571280CB6516FDE85C72A5ADE2C3EA2245955BB50603C172EC7AA8F08EA278418D0F5E8DE6656586AE2B5A2AA0100000000000000CA32213ABE2A437C3579D84BDCFCC0809A98025F95ECD7EFCDE5A5EDFF87592082766C7F61BFB3335C0C9101AE25FEFFFFFFFFFFFFFF52EE4A7652A2A002C4E96528E447D1F705C9F1C9DCC576885BAA0BC6A1BB05000000000000000000000000000000000000000000000009F4089F5E62B5FC176BB066DF44FF118EBF4BC178EA27B8F72BB9CAF2DE0C00000000000000000000000000000000000000000000009EFBB093129943F1843C0C1A9CCD3D64BBE7CF2DA894293FDD0FD1B50EC7301EF81EBAD035C14E0EA70BDD563232B6A893287D29117D648F8B75F2315DFA02102321B072756A1397DDBA1900965572166CEEC581302597261CE102EF094A9B32FF22765CD8A7C0C76B75AA6C4F4E67AAC4911DDE4EE8CA0E4A95B648DB0D8D02908E3BDBAA92A86A27FD01FD002428C1D8ED7A2C5FE4A41F8F5BB394700096281DA2295CF14BA02BEDE7E762B43907257F5E5F58BB44CE616EF4055F58D55E343FEF3E5A23EC16E2C6952B4D9F2FEEE725C36AA08F49049D932D7D3CD8E9CF2A44BAA87B901ABD2AEB9DB08358AEB83FF16321BD4D5DF7DAFC9D71424A759F3011197CB8CC524FB1615A07B615D017E8E8194CE1F49FCA9FCD59AC7B630BDE019C4D96497383E4368B2D3D9BA019441E3DFC920DDFD25AC3487A8A09C85F8D1F52EEB996E8E95FFABED3D99EB6031040B9BED3F5E3D6D51C6F9C96EB8A9B9A1FDD3086781B479C772219988C05A02E51478FA4D049046722AF6B56C9114A873175C6566F89E5D8EED86B045958C9DBB436321633F9D93203B050EE44C5B20220072F52ADB318FFC0E3AEAEC07FB6224D16F5B25B4C63426E0FFE921FEC4B5000 -smlen = 2685 -sm = ECFF9BD23611A28BAF044216D0713D20CDFFE40711FC2F5FCAFBA44A1003C667D4376F812742C103A4D401DC5E9A50167E023A4A778C93BB95135803D9467F5F25AD7A074F05D50D27B15AE499E43F010198E652EA0324D2D100181395233A1640A0A0010E50EA3FD00F7F77FF06B8DC8277E649119203070BC3D60C3FFA8E39D101CE4AF11FBA0B39C9C90700770A45B6AC320A4AC98A649B4478B5970701AE96390D8295D748A50625816913170FA0019FFA507328B2129C9F05A22B81A597FD1B8C27D554B36FD3EB150BC5FA0C6ED967EC5BE6F1E52D3BED1508DC3C841360020CFC2CA1B0713076251F2935EFA8500573CB4634C78A1D0F87D994E8E2B0BD265A877023B54D9A33282C12397DC74CAAB07AC2EFD140DF907651BCD1B37CAB2D03F77CC28872291F1CB28FD4BBB5331C2A18E02120BFD2D9EC0C8938A6D43681DC03527FC2BF59703B5160D8E25D08534EB5AA5CC9C10572257D9E4DB29235683BFE1776A2D9EDACFBA1ADAF66587BC451D32C524C7934556F94776F91CDDA96D2E5CAF91A39503D3A742DC5A0EFEF7C1A13666E200C5E3FD7652D200ADEF51FC5136281570B7832E0C6E7552972E43291F202E6F916C916DC3FA48858F3D92B1B7EFD42DE140D43648AEDD7C7379D7A4B71751A3348B6BBA3B0DB71B4C99C41E085E5536A3F0D2BDDAA88069249E21E2D9906191BBB5C8B45353DE72E00270431847AEB4FF6230CEBD1969A0FB68D6E302B78DA39ADF6C0E681117C8432E24820B9EBF38838545E95CF7AEFCF1E9436CF48E87B6C5181CB418132C7BC050B9498720D7D534792E0585F05DA2735B7E68FE35DEC358DA1BF1681F7F62329BEDFEA3D12BFB26AD9403F3AC1DB96D828050F39DCE4017B45C5DAE4D7DE9E9F687A9D7FAD1AE0E7197184142F6818A63D5617BE9D8D82334A12E68F2EEF88A0DA3A915DE63629550D8A64DF591EECDBD1B89EB40AE9F9D65815271693C85F2CA41BF45E4FA16EF8B17D945EC61E757C6C609D8AFAEE32B3CA628842DB255B619F6562E656F6125FB27195EC82FBEB9C14330DAB649CDB74F523F5A98244194581503356B5B7EC51E2B35AE889452D3457EAD713C0715AA7382DCC510B16E771B3A5A91949FAF5E29223C8F1F861BC3B4E77E095BB61ABA00EB29C065D6F9DA9B4413D61B2202547FB6E34671930EBCDCE4C541B3E2DC90073867A47197E08C96F74ED81DE5F10C37C062E8D82364D67EB185CD098CAC1BC3C522E4FABDF2FBEFB66B9EC6E848F732A737FA7B935EF2848C29B1FB94044996EEF006E251BCEB5BE356F286F0FC85E5CBA627B67398CBFD6C0F520C6F896353FE75BA323D8ECD9D3ED2997580E7E1E49EECD91982C5DA650D6B128068B8D3D72C1EC4BF1FBF121BA96E1CF5F247F9FDA7018CB609329B1C95E59E112C393C45EF7138905902227CD21A39CE30397FF017495BC98A968FB497E03DE5843E64923683F2E402DA63CC25AD0BA13B85E3E379B08DEB39542C06A268BBF44990447190A1F8ADF0D3ED9ED9917886210864CAD84E7C4D1282C4D3BFF9DC23E4FA68EF6B0480E76459D1B5E0A7CC0CFC17F59531C4C1CB1D416B7D009AB50173F706289DBB68201C305E39FEFAD87929EF933006598CE0F0242A2C60955AE487115B4C367A7E49488491A6F044FA8B7AFD81F6DA09D29D4BEFE1B3C9EAFDA4F17D22EAAE0B2D1646906D1CEE65614640B53479E23831C56EBE12B92997D5FEA725D78CA75F4509EEBD3DF4F741D6B2770521BE2AE63CA365FE1518CFDCD5088D58CDFB8D3DBA76731F74760A47C9D619A31B7E318E957194AC5ACC6867CF8C9C235043D5C09240F346FEA840AE0BB16094883FC801DA0BEFAC64A021F6F871413249E9C7F5CCA92F4EAB5713B0F2CD6C950F34BA6FB1CFAAD541BD5FAEA45EA5FB37258301A49D7BC4657E3E986D707213C0F836B030C21593F11518EAE3A8A95A2EFC8B9839E79CD8CB0E6DE59D5A43FF8F81FD35392F0C0659B7679542136782D559897FBCC0129C22F43A30CFB27E899A8CA52453F5459A281D0CC21F902403A596C7F69CBF9A64D97B935AB384FBEA5851D831E8420066826D7E11E34047D18CF08283BE8F29A8A79B0F477C27BC41B8EA4AA010ECF8ECE0D37389FF13E235A4526070F96F415D41AF2E053FD4440DDFFD69799456E7335CC6D9F4370008803F7BABB6C58B6996DC5A52649E25463B5267C188E2DC39B3258636ED8689E5C02E00574988B3AF881D30E9EB38AC51C1E00E1C0A411ECF37E314276221D7D8713F7A449E38371854EA26520ADDB58082287FAA1F77FC04095499A3C3A331A38852A287B24040C1CCC054086964FB1EE2B328F3DE21A986507CD20B4DE4898DFD15045324B93FDF85E5392DE0F32C3BADD04784012E97CB9BA19472B0C20EB0A71C89149EBB601ABAA4A853F2C75DD2622235AC30D97B9D7B1216089B9CC8E879660E40EBCD15203404A8DECADC42114715F4D8A6A10511BACC4DDC23520445A95FA3945BC95878BFF18728E64DE8B7767CFBBAA21F3EF2D92F3D7DFDA792BBE4E5B3381077658BFBEF8DB95B64F9F2A44917B38DF6F9391118978544369C882B218E7A7A31AFC3EB9A75A28095C4478DC81F9CFA127BB749CC53898409365170823D65A0B46BCFBA0E47CC0C5F6ECBEE09131F134EDD254F4F58B50C486DADA13195B1A35739420A45BE6558401F64C3B6AC94B73397925C20545621C7ECDC7DA9F71A755F84D27F2C6D8415D37F2BF1966A76845216E41764AB96DC2E14C12DF3684F7683FDAF5EC771DB7050F81A4B3E516C7D5C955201A18F436962476C1284531764A9397E0EDBFFA8C3699929DAEAF968B4524BD98EE62F9A0DB9CBF99FDA80CC6C57A5EE1099B1EB29799A5B5BF5593CDA26CE2C66DEA3D40545465C1D21F5B9373556B9ED0AE30E90B836003CA83F78E29BD8D49550286DC2DE6407860E9A9CC5EAF3E1B1C73FC2D248B81B1CC8F59DABFB5DAADE6F2A0B38E76D9E6D0125955D08DE7F334A56A8F362CC5D883D56BF7BABAE6D9E425376D34A05AB863A0D9ADF7C6FDA574FA8DC60965E021532C25ED4D568412D4143FBF2C4EC2F230D08337A4E546E01F7C1BFF4C97F2F27AF400CAA57BCF398AA5BFFE155B0F29A085D5053DFBEDC3423818DE8FC597EEAB2C1663D8C81C71CB876F73AC854286063A2E8BD8614D06B80F3BF56381179342143F4C89B8CEFE9168B6A96F416DC617B9F544F9DF65CA6F4F7A84A327909666B70CFFE889C86ACA706A0A1365E248D6B341A004A27D4EE344F03CE6E85D3573E272D48210DF7C3178EFB7BFBEF7765D24754673C9EEC14C7513FD8DE6386B0829EF0980B826EC9C77C81D1E3B8CAA65992DB9C2F8DD691C520FA6F233AFAAEDBF287A57A9A66D2330F4636F02EA3148C4BCD2C8B114D48A1027FB3BD5008D732C427ADEDEC9969AEAD451E166954FDC207C1A4EC409CAC60E42383385187AF44F136F91A8461E62EAFE6FCADD1E491162E46CFBBADDDB72E5B54B7C655CB9489E7F4F7E55C93D3AD50CF84E1F47A706FEDF818A5246BC755D6D18EF18702F5A90CE51812A67227C5E5A051133576E9EBC18AFA18C1B05C854D343727B25BB10E3B9A3645D789287858FA43734D66AD831E8646FE604286544238DC99ACFE3C8285230FC784BB73360F72ED34795B1C46EDBE32A346BFA7F534B500C6C9D3EC26AD7ED20D1500E3DEDF141DF3C2F92E981472F0010A48F25429329AE92CBBB918246F5A53212703C75DFA15D014801A830DEB75BAA36 - -count = 76 -seed = B887F07DB5358C3FDC2402947BBC87ABD064B02A859FE8DB37B5BCBB916020443DABA5534A0778FD0B1C05EF3ABE6269 -mlen = 2541 -msg = E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 -pk = F9A9A81E4AAE9A0E24D60C67B6996AF0F29037E4973A8A4BDAF3D31C9F531C1994A15F55558BAF4FD5AC2700F51FB1B61B8B1A043CBB7047BBEAF090D98DA21C -sk = F9A9A81E4AAE9A0E24D60C67B6996AF0F29037E4973A8A4BDAF3D31C9F531C1994A15F55558BAF4FD5AC2700F51FB1B61B8B1A043CBB7047BBEAF090D98DA21C020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A499C710EB7B1E1DDA2330D9E2A0DC9F0D203A9E5A8B20FC538B90E4D9733CE95C3689BE59177C204D69A683E3EC0000000000000000D73F31C5B33768A5D6C941A358C0109CF534059FC69FD5F2C084A2BC143C1DBDB869C75E7F436E416D5060AC5929FDFFFFFFFFFFFFFF6904DBE6C1AC607EC644B33F01EFE88E3608EC628A5DCB93B1BDD1840BE0FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C4DC2A36510C7B5CA2F61830CFCBFE86148A4F4A1733E071152F5A5D5FB0E00000000000000000000000000000000000000000000008262B54B2B682E7DC981B78F92309337CF1299CF3C7835CEF4355A879A368D0DB5F397742D482EEDC0946103C2EC620F167D9F9CC5E0C9E52809232BE8799E339575F860004A251FE1ACE64CADFA344B484B23B57B75BDF1074DF617C43E8F0C59CB1ADC07564B700A12C096677CB0F74B724E159E4105891CD3A7E15D34F22F2399444194195EAF511CA7C60975B2AEFCFFA1767133FAA059541C29885FF62DA482201091BD4FB17350B4D1A00E54686789823AC9669FA227697057011AAE1A14D890AAA5B2224992E257693C0B921BA2B33D5C586CAA59D53FD8FF5B096E0AF0490D4CD9E5E4D89B08F04CCDD3542B96F112096E72AC8F05714973D76BC91392B4F7CA117B4A144C5C2F56477DFEF52B48550FEEB94039C7575278DCE2260F93CC68EE14E9DABBA9255557C1DAEEC6B0CE849211574009E90E911D0C8CE323A9B2BE5BAC9D7BA269CC0433DE18A6408E5BEE1B6B32898D08D44C25225BC92D21A4AFC8089F5F4A9C36C27AC0A1DBC3E58225F58AAE039332BE3760A1C26E1260A4A60616AFC70D31BAF07E86814E6BEEFB712C7B8BA0E5E1DD90CFAAFBE812527A5B973F325E27048DFA6B7A8FC029D1B3AA08F398BB3DB7A8994DD2D0641E -smlen = 2718 -sm = 0519028729E6B61B97063B8EB76820C7ABA735017B72759F6790F834DD00C53C1CDB5B0653653207D8751F04E40CBF8C2D046F2840217F7F863BF20638321FB2B52428149505C456A8A97745FA746707A9196BE07E7960B4F80649DD6619AF744CBE1101B332BCE9DD17BA216F00E29246B6C7944F973104AFB9CDC5CA88E93853042E715A3BD2CB981D310101A12957A7475E47ABA7D8EF8771100E120301EFCCB036898FD0E7DA048759270BE8BC1301E7E845902E852B331EF9923416E492C1641236E4E72408D800FD70774BA32B6B4BE04B6E82237A247D26F9A33AFC4745C16CE0554774C68B33CFC6E67AE34E42038FC6C324972642338DAEA75982C71720F1EC9542DF94B38434DA34A2003FABD9DAEA1950B7751DA6C81AFF7D03390F5D63455D417F5D12A510337A16197EBAF921B6A7A9A9A58F9696418ECED6B27CB8EFC8ECBD9B68714F721561AF8553A0D84E30E009A8985D011CB994EEAAF88C76F7F3261B47FC174155C138DB2EADB09A06073B211FC0D27113E8FEA0DA56E181CF532BA8207F5D80D6A30D8BACBA540D49A81A0763A0467DBA7883766ED6358E809261AA3D8B757C839B532F272C5767671A3A8BF3391B14F5E97BF2668A4E98847F1ABFA21E2370870DDF24504F89B3DB71E210C46D66EA7296D65C926E2C955D899AC830CD9D06808A68E9B3722B86E878CF21A5E5D41D7F3CD95D23A6344C259859735AE1A953ADE13CA103692B33AF90ED0345C7B038D938F8F494D90CBD3933B2A80FEDC2BE57960DB23AD018BAC63017A04FCC510553226CD86C74AB90E13C72A1BE12E4D751DC670A98EC4F81E9F8954A693FC7175BA7E50D340FF7F15D568D0ABDED0BB1FC557B1E55971B4C4CE8CC1B4D9E239C73B1133C9E1672DEE36A2D9527F315C21764648643D866B0E2AB6D2DEE61D838BC5DAC183FC511C4501B6E535ECC54F3EDAD6E8EDBF0DE7CB70BEE861B2BFF0D41BB87FFC0EBCAEE9A6DFB98D31D35CFB6DC0442FC285AD0879E7B218B6E66453FE04207FE814C5F72E49406B48FCB1DB145753DC2A2D3E9793594F7EF1A1A6339619E1040CDE605648234A51B2F6774B31C7F9A77C2CE3B98819132BB725D288C65901F7001E05FE5326B6F701C337D41C8CF8748FF9C276ECD398C725C36C11857605F58C0B154DD9F3C1B4649AE677533EB0338B7475254E273B786C2FE7DB4C13468CAF0AA2AECD55DC1A5F868C8EDFFD8BE8DEEC20A9FAA621C4680F3EEF4DFE4A79794FCBC5F8C56EEDCC3E1963569A36525D4F6A5BDBBA5D12966FD8A0FCC70783FD9F61613842F80D000C9281CBDF28C01C6F6AEAC10DF1DDCD0322E00C4E3CC801EF091D9C1B01E84DCE725D57C800D38990251AA1D1206AD93A7DDA40F27726D6A03D973150F7A88703724E314C0953D56DA6EAC442A70C2A08BC66BFA2B0EE11E185131E352D10DD714DDE502097AF0AD155AEEEC2A6B93B149B75DBB898B2B3A7C5FEF2F48D9B12A580F54C4EEF3FF83A4F13F2F194AF551D4800AE86AAD6EFC82CE460D325CBCFEE3400AE939431AB4070D7A7CC005F270896051E32B1051E58941530E250F05AF19FF416E65CE40655FDA31D2E7A6158E07DA08FA61AFD5319B682DE44AFAE146129A8B769C1708A5D3479B6C910B2FF0FC872A4A41AA8BF3EE16F80011D163B599D18501335A2BE10CF117DDA094FE01596C404C14580A7075D04CEEF68BD8F813D7DE6599F478F3DE9CE60B294CB7CE5284A61E078939D08F3D4FD998ADD3B92532AA54E0C31087CF14BF4EC964EBAAD53BD15D04E37948E94917DDE181EE3BB2346335FFB403B000F5669019C5281D88A0E771176E49DD0BA22E719C0B731EC2AAE9C898E74B2967BCBDCE0D7D73057E004BD62269F4E7F3823DCC18CD6C551104B9B896B0AD138DDE7C3D761138641BD3EFF3DF1552659FD97BDADFC59A05CBC622A4492A1B22CFF72AC197D61A4C5A949AA9AC09D4C1112F4C1B1CAE353C70278A21663E11F27E9EC66ECD4AD56F2179A3FCEC37AC3A3F4B33C06BBBD4C8CE8E74825BBDA3E58A2E2D928C2C6E6D886274BC0E2175AB03D8721C664FBD6455DB2960E3AEF0BB25AFD3CB0BAFB71A2BD18A89ADAEE00AADBC7E4AE70ED4B534AEEAB88559194755F9656B43BC83E3952000D9E2295BF3391904218A015C786DE0144868EE4AED203B261FE743B7168788A0680F7484792A3F64782B2B1ED9217B09AE9845DD71ED363F18E8AAECD51A4F5913AAB33FEA3FC5F1E37E0CD6333D2A8347CF45EB7C4AD967FE6FCFFF3565743435EF09A646E75C7E968ECF4202A9B2C23AA8118A1683219B1155C2CABC95C696704F5B270C6D213332649363AE13EC811E9A1090D1603EFF745E2FA83379DFC6DA5EFECED556E46A8A5FF1F2A5C0D911B95C20EC2465AD0C96AE7E16FC36143762BBC0734CF4D6134DCB0D739F7822470E0ABF66A0AB15CE0D6096D3ABBA2CA4C81C1C68BDC252A8A4BA609B7C05CCD913EA56126F418FC0B06DE8F76EF651F8085604C16E5910F3B8651AB78296B56B78326E41AC15774E442017FE5B291E5227EF5A4B78CCFA96D6921C8542A8A984BC87E2678903869C52C2568FEE4E23EF3CC466CE270614E6472244A4294B31F9438F7E43437FC9C9C5F3EFB0F4F0AF2110A613661DC24A1C7F7A7F8CD14A943821F16F94BD874F1A32E305DB4776CDF6633446724CCBB2488B1B06F0177819D53885127E6EB717C0D6718366A8B8A089AA6AB17CB2581A75EC748123B7D0383F3900EFCFF77D2E022E90AA41491117758221A0B149C8EBC23CC01C17B9FD39118DAD413A391CFA0A5C614208060A61646C7CF1DFAD4ABC3A9CC5CD566DB2AC8FAF392C9D8E7DA0F84B941D792A8493FBEBAD30D0DAA0D683DCC1583F0C9019622EB6C92FBC475BABC8B626319BE2264ED873AC063F84B7F83688AC99D732A1E3FC12281BFB1E1E63D48BFBFCA619BF4B95F899C50AD0F5FE4673347DF2BBF2CA21BEF49C7F8440D95A83299960F1E42B457ADDCCCE236946DE80FD4862BAF36387E041DEAAC3C9751AE345512BB1F423A3B4CA8D3A5E3796D289641D3424FF22670A46552EC68D7D095E8636441D777DBE2E9DBF6B5FEDE5318516C3886B943F6ADF17D8B7CD40B20A48233C9FD981145B45A5CB8F6A88EAA36C270E93E1D876D7781BB92A1FD99727D8E0AE34C73398AB8781BB342F5AACF4081459EA5EC20C30CBB6122344C457F92B20448F78E1A2A291202003781EBDA1747061C6CE1F8BF882FEA4FB50BFE638685CD638EEC15BC24252567025FC5C16ED1F5D98DD90C76E720EF7B4E25A20D262E339C5E5BB5A9CF051BF5FD1F63E93452A179277B57956821CDD901F1C01E634AE18485708A6ED8F592AE2EF3A9D54C9734FFBADC6F0B86D0398AECE9374F9ACAFEF38D4B97BE9B932B9852F97AEEC435311A67AE344AC1985738C72F52B3D8B71F64A916240477FDDC5FAF02F8224EB35D310FEA03FD2C5933047355A438676D92EADF70DF662D97C2F5E00CB293053699D51D302B78145C77AB03F34EAF170EDA5215436FAF0238A4B0D41D29F36052A5278C7D8AF9A6FFC6E2B6FFC4C5D524F7640A7170957F3DE2451AC75589CE328B61EA7179FD990DA1698F5C73BB8639A4DA2AD67D364DB04771CA118C4055C25F1120A0643158C07CD22B375D5C1DFA26FFCDA44921F41D4A504B2279DFF03421CAD19960F87C6B6DD8C29981CB66C9731F931E43B0D97C6AC9862E2CF711DF0DED8E4D06F3957FFF9085A95D9FCC95610FDE22856B229A3121D8B81EE83DEE4A6A9FA3FE8C75351574CB000BF7F3746CA1CC5414AEB23A2 - -count = 77 -seed = D08A139CC7147ECAF4B1D1E434EB2EFA2B2607B0033D8BA989133E496DC9F3654944C7AF91CBB79866443E8C4E8217ED -mlen = 2574 -msg = 34FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA -pk = 8DE7FF8D49E5A799C6936E126C1690C17419EDEF1D8AAF1CE435842C6E7F0B22673E972BF3190F3028F5666E7D58906A57F3F51C4D7D5E0FECF530F36CF6BB1B -sk = 8DE7FF8D49E5A799C6936E126C1690C17419EDEF1D8AAF1CE435842C6E7F0B22673E972BF3190F3028F5666E7D58906A57F3F51C4D7D5E0FECF530F36CF6BB1B020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BE0DDBAB0AA740AFC2BC22842C4B090A4D46DB8DCAC84FB41E733C7133B3BD851A15ECA4CF2D066857A5B0CC1E4800000000000000005D9C7CD55C8852F91CF5652037F64CE3738FC5D1A55F6379AB9DD595C38702B4E3741D420C3342B91D23390928C0FEFFFFFFFFFFFFFF5D43254816B13CFB3E51D5B273BD82DF57E553A16A8437DD37D89486FD64F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2FCD03978D2051FF249850B31782668B020EB22CDAE830C1D348BC82F84070000000000000000000000000000000000000000000000AA148ABEB3427A7E5B153858079483CE557DC9181A93C00E521D93E6A9A64B0F3099398077F45C5655B10016FC2441154380B2109BA06F8CE620935107791C31255641B7432DA9E39C8A6FEB5268EBD14F384A8D4408F4DABA70ABB4513E291BE0B0CC4B4D535C268305918D94F3A41403CF7737471CE0529E770896A262B10FAE42EF1174D8DB9D5D9BFE95FF23F07AEB33CC0D6F0F7EB1D0D746D6E1035701A3B884D37FC4022BD9DB0A2D92D486A72722216E442266D670913AAAB442ED0C6F3E8EE196B8AC51A6E2D2446C31D3FB567802956F9D4F9965FD2199B98619256D274AA03101DB4458884D8C5BA610CB7D061175945B5E6DE98A094D0624FC1F15CB70E2C06B5DCD2DC470EB3AF1B0DE69B14A3F19CD313DFA3270CF24D15816716812767CD5E498757911B788CCD17A42EACDA60FC6C976E5EB2CBFC4CA381BF1B2181673E714353813EC51BDD3E980AD2E81E6054970A1E4B946CA66DC9D2A8B3D431109B459BEAD8C944CEBC5B96CF7AB208014C869B43372D84DBD43FB2E8CF12BFB9B965F6AABE57DA2CC10A21DEDA5AF8D62F5C36F202661E086D3E22DFE7F7DAB696EAE955E737C03F6E1B26A6D06CEB3C5FACA7EC6F75A2C296FA804 -smlen = 2751 -sm = D4F735A1A8E34BE70C037B33F37698107257A5050BE547CB1A395FD291005C6FF271DDA782539006AF5D6B781A5AB10E010407EA96F586406B65570719408EE318632B4AE2053D3F5A415755EEE255036590F36B5748613D2204DD5B008C7A11111EAB04388836422958C337EC047C24B3635FDE9364DC05E50A9EFC17F79E5BEF028E0FACC0853D18B89A040005CA1A1159A76CDCCC8C9F6B9D4F28B60403AD01E3632E6FAE5D6106D353E56E171FBF0034FCF4626248B979A7A8D306CB9ED69C4CCB5CC3729D2692E0BA679D5C2FEAAC54A4E06D4EFCEDF78E19357DAE263E1B5D107FB09618A9C34F54F19A738A66B95E6F88E20E01F879F53E8F4C371B571E1438FF70E0A8CD00D608976E24501B2DDD323EFE6C1302A318CAD821C6FFE641672BB80AC62286C69FCFFD93422911C46D43DC9A1F00A73E19EBE6CC09A9801F2A1DA708F0F1F98E7F1A18529010823230279F487911CEF1E784A229D9E311BCE5E2D368E6D613F791DDD617D0F37F604B786CA2BAB754E8BC4BD3DA37E66A54DF1D3B268A5A80379A30A52B1532E8CFABE24168D83CBFD61E2346F901C361F771E0BE3E03DAE8CC30614C10FB8DCCDCAA5B9A25DDD8D61E61F60F22308E12ADC137D3D8C53CF7B31984CB813758BAA19AC178F2F0CD2155ED674A7509A3CFA7FF66D2D9B1E60BE50FE7FB79591C500F66BB1D35EDB80263F4B696A3DDA0B9B2911D01E76E9070D99DB93D1D0C3874CFFA776BA24424A6B453526F7C44EAFABE13C0750F9DF33E82105930139E70B5CF1B09DC3913D6BF4A4859F67FE814FF038F0FDAB93522A35E7F81002A395989D68B8B7E4235A09837CC6402A5338DA08E7C73DC63C43BAC42054C694F4931B80140D6B104EDEC995CEBCC5629F85D09DED8257626F9FA4079ADEF81D044C18BF2277DAAA41931B62A6028F89F95F06D8A8FDEB95EB2EB1E90C0D8523E0B476B158E3040F212390AB2503021E8D6FC0733B963CC6188FB2532829925B59C8255D89F10B657053D0FA1D8E76C84826A4609284503D3A101EBFE7AF93EDC423EF5303CD946C8B570511E38EB04BEE0060E678D03E4134F84F279A570AAD0332417FB2099E3F1F279CE7D6DDB080C5D83064D107BB560B21183AE165CBB54CC75313DE72D40D1CF5173455AA55C5C356D7C40A2A7023DD95D3F89B515D7598F800DCB7BF68B707978ECAF55B794A17559BD1E913F4472B1830783BBBAB5F23A760C78C46157FD1B429C445494CDF92FEC8BF9FC217D3CE2697BB6C671BAA793CD0C1C84F579F0DAEC400BEADA799A9F417FE4744145F21C6F8559AFA7A514A0E951F03E5E68C17A8E5816F3FCF41774D26BE2EDC11FC3A42CFCF00F817C3D0FBF474FD7F30C9C3C6BE7F74FCC79FA6AB07CAB037EEA7D83866673A74C087B5F7542804071D53CE348D2E836749E35AF0FB884D5D53ABB195AE1EE6E9AE35DC91BE359BCD510A7801FC243C07DEE92373918AA4F8A89EDA3895A52456F7244D1FF007CC7B1A52CBEF4C1ADE1C2C0AC189AB24B3F260475E1D08E7C5BFA30A1CDD71DE5ACE80D5FBD1D0F17198B79C8EEA0365D139F2AE73CAB6FBC9A79786896DE0CE7FC747D68FA4ABAB662A09E0E409F7E652153352BB92F5DA1836B0E92B0B644C821B2DD2BD0AF193AC0F8CF5B8D88432F0248DAB09B46FBEF2EF1899B5981E9B33DE4E9927AE50890FEFC35F681E075D8B0169A2E16FEDA6392AB9858DB87ED18ACBA25575AFD1FEDA9FB3FD01ECAC13C245DF6972F65087513F505187C4E8EA54B6433FA092B6CD3AF13F4718693904435C55D273060FBB5FDA76074691269493E86F287922D074E54EFF04209B2FDD3417D8436D1395E638D57DB75D68F4F819141B6DAF4D13A9A18629CF5F84B0CD02E7A397715DDE5476BDC467218D11AACD6CE399D9D54645BB27CA43076B7E4E57FB4F7C4F4B8D0AA949719D731C3A927FDEF1533D773CF1BB562D5EA43817A5ACEFE9EB7E51029DEA143E8A1D5F76F9BFD74A26C6D38F54194319A1AAABC4DAF45EFBAE770B9E9D834C09FE45C15D4BBC0251D3DF2F2F23387DCABCE6CA7A59625E18FD997770D164C338D0692AF97C749FB746C0D3944CA4B2DA6D3AD7B8C3AA922FC029CF9AC5580CFEAFF50CB2E9044211EA522BB5769BEB7A7BBA0743F345FEEA9AA9DA6EC5F0579CF7A5AA4DEDC832FE3F65185A31FD49C0D259E3B7F8FA96E110D130F588CDEC30D0FD4860CA6673C46D961FC68A4020FB03AE24B1AE12967EC1ED19ABEC0808A7EF89521152033F70F406A7005819D28DFC556C79DE18584088F40BE40A555EAEFA78E3FA3D9360A7CEBD963555CF208DC408A07CCC1369F98BD840F5C940721064E6C7CB241ED0697AF0FACF36F05632A504870ABF90134A01AF00D340F7A5D548A8078C2049600EE454D15EB8CE58C26B3C8185CF9DFCDCA7D4B6DCDEB82230F993D51E701D8387B06BD45B4B61DC9DA6D3B4356F50C1D4AD2B467D36AC092442FA90D1DEB014475AC7CE90C974063459DC951DECFA30D2DE4C70FBA39A8B6931217D0924FFA783C8C3DAF048908E4AAEAAA3B7C98846278AFDD1753252F39CAED7D334D8575CE3ECFB2EDEC31AFEB2BBE67FA929A267376293C2B2F295CD8DBD66106E1D9518BE1798949F3315E0454D018C2B706FE836FB37AB908D9D698AF495BD285A74E4CFC7612D42121F43FDAA7DCF44DA82897B820514D66B92983A3EC819D2CE208D688B6F0AACADC0CDD619D815CD231AD8DD9B6DBAD9C47E16FAC098D0F4279AB52055D2FF765AF6E3618C4509FAE6AB00FA23980EFB19A26E0A6EA4C9A7DC699121388748449C429B28AD2779F5642F05FF58B68BA3E289F90EB27CE06392616C080D659338CAF274D46A90D58F2BFED25E8D4A8C62030A5E89F6B1A5F6112A38661E2F2B5A37BCBF050812DCDCE9C0A939ADF929C921E7DA0C30815DA318EB2F350F286441CC92060C970077623EEE68B8C6FEC9FFFE780A6FC85FD7AF90172951337AF57339E98049132A4CF58874A7418FB7ABA0628B6192BB2C43102EE6B1D7E824725D9C75D34A8B69DF4A6BCB1F96B57767046C99EC6352751E2FE1075BB4092672379B3518DDC884FEAD5BD062B0336EA88BCBE0D22E066566347FEB617A322BEC561E9AA9D2177EEF0DFEEAF6231AD56D0CD9E300709C9317B3D334D8D2AC97F96CF2F45B8582C4128D95DA8CA207AE34D3DAACCDB128C11694EEE6D3E8E6AB767B6886B1F7235D85A4D9C7C831C5DB8AD8323F63927A638E19497CFB308285A03CA2C1FE2AC4D919AD11511ECC6F28E7D0E0A614FE21B57BCCDF83535C7E2C40840BA0014247190C580378454751EB3F2361D7193E160B9516F7EE1D683B336B873C8BA22E97480A61F002A73844C78309C0A3B31BE30A192A62BDCC3D33A7A5BA1F6AE0404A8558740CAE46E5FD15971B41C0BC39665A9B92EEB3328C328B073ED5B3720D37A1C097AF8A6FDDC3B2B067680E6CAA760368B0E1C052E804E9F80F26B52596202FF2E0AF7215999EAF7D3EE3E8916744E40AA1154322DD068AA15960DC38671A4F5889FBE709CE1DECCFA80B9D33AD2FD963FE0581A2ED7718A27CA62819D05BAA3212EC7CC1C5472BCF579AD52D5E1B2BEE637D9827851C419A4CB91DB57B2A6CB4433C1BD209648F1FE170ABB964B272BCF0A263CE28CFA3A9D1449CFFDF643E37AD97182F0031CB334A1EEAD23D63A5C2D0A675D0ED000F37FD2153E1AFC4AC01692701014927601203ED2B8A477CCEC45C1F43190E4FBAF2295E32A9383FC7915AA76950A301ABE47BFFAA9C294292126934CCFC173115A6CA96F3945FD5F924A5017125AD5AAC705106EB852EF3190A24420196ECD37F7C67B57162CBEB97DFA - -count = 78 -seed = A315BCF0E6835892ADFA07C034BFCD39F80B62925A95490B20170BD29378E11559C7F1CD296377FF1E01284EC727FFCD -mlen = 2607 -msg = 96AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 -pk = 027CB5C2B4BA4FCDB8CB2929E97F2A28E4BDEF33C7F7AE2C6D8F7ADD19CECA115D46F52A87CF73AFE74071E569332FDDE88AC42E8B766B635879C1A64DAE142A -sk = 027CB5C2B4BA4FCDB8CB2929E97F2A28E4BDEF33C7F7AE2C6D8F7ADD19CECA115D46F52A87CF73AFE74071E569332FDDE88AC42E8B766B635879C1A64DAE142A020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CC26F33680ABBF21E17FEB77B87E14AC0101E405806E2123581BE5B69D7565137BE0F7D75EAEFE04E5DF7A7DAD1102000000000000008DC724F313B2B79F6674AABC3A1D9DEDDB1CE00B10276FDB7BC36E2D03B88FD39059E18C83276294D02DC193326BFFFFFFFFFFFFFFFFF305AED33C8B78DEF918DDA2BC43762AD5DFB59C04B0BD2A44C8ED293A31F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14429FAF4607F748565C332C8F8B2396764D047A9CB32C36E40E31A78093010000000000000000000000000000000000000000000000C14C0EA2AA5E9CE7C1BD07CCFC543C7EF7C0B517C8B8CC42019AED7774F438291924FB3BBF5FC6A5D637BE7D0305077978CB34757D7ACD34BD0871AF3EAB35202331D28DE547A2C1E45841F73A9283AA45CA52375EBDC6F9646FD8F208DF052D02C5F30EFB3973B78961971266031D0526BD9D7C204613C814D3A0A0F3F3CB0C26A955A0DDB71230C167E9913F04AAF10CBF592E6686A6A2FE25ED94513CC12230FC1A768283FD54A6AAACA60C55F8604EBFF55D632767F7F9BEC1D4DD71F2278195C91DC4E0D3B085B73EAF4B07563297ADE3C5133A35DFD790EC891E98E90E8CD8FD6B08C64A0049B7007C1C888A6C60E1EB9377FA9EC320FAAE7CA29F100F47403DC1336E621CDBBB2935391B7CE4AAF08F46F6A29A4D73E5EE2E5B39A4060D6DDE84DE6EEB3A595C400B0894D8F00F93B166E0C75EB634E80A83D33E57102BD1009F1C3C1338BC0F72ABE472BC63B618146CB4D6BD80EAEF62280F9ED20EFC5C46D6CE78DE3C8CBA921B66BB073E78192055D12E93049DCD7A5CF684682BCF60BDEDD92C37D6EBF8340A180E7A61F2664F6D31805B5FF45094D2CA75260B334C87E03783F97B0EEC2DE84CD38C2FA6A84CA4117D6ED4A27EF1A757198517 -smlen = 2784 -sm = 68F304F6C7CC60775D00DDDC0D980FEB2DF44C05B0ACF52B2613127AA001D6CCA67F72C267EA0202D3143E86C4B34A9C8707F967C2A20F11A50180052F78AB74DF72F8938B056308C3E6C981E5E0A90253315FD315C833641B02F6CD8DC45ABEC03B51031CE629402ECF7875E506B9CC0C510C0A12260F05106F0DE6FCC87D2A1F008C93AD3782D2295EB90401957A1B7768F7CD47B55E05809EC31F5608038EEC1A95D8D1E5FD6F054C8C44C8073D210096AD5FAEF409B8A4C21ACB1ACB596BADF387D26656BE3EB17987AF59737E324B7BF8412A306B0E706AEF73D79AF753D9B0064BA9CED8DCEA966543FE748E2611709ECD1CE6E4DD8FA812D485E91809A225936675369574B0D104A258E3353EE0E021683615CA5C7C531FB29A5025CC7F7323860443DC19C9858F741EB9D24A9F6F04FC839B67153214116E8B7FA982F338445830F915F7C85C88C23BA2A3CE8E2020A9D8DD7B18EFE95563E3924D2A341826AF51A8584CD026B1C433EF0221145BA8BDC8F73A467B33A9EB3E8CD2A4D671C17D7C28AAA539D1C5BF2F4138639AFB89CE791DAF0EF0281D52598F4C13D210974CFA1F099A0FC70B1DC120E5C00C33A2BD360BED57CCE069060D6380BE2204852D8BCFFF4918BA0B70B0BD1E1D55DC1D68DB1D20AE713B0093EAEFA1E33D40D9BD95CFF17568393E9BBF5CC1287325D2668F65DFCF44ACE2F6C6CEBB62F1433E69CD19E6C6532EA93682B22C4C4A62C6ABCFAED08EE64F32723E56205222E4AE0831AB8FCA8C265FEA0CFC66AAB1E367201752AEC11F752B963792C071E42A8A1AB80658A0C6960147ED740CD07F307CF6A644A98E1D2E56C625ACF458D0BDF6216A4F1B9C78EC3F14850C803A4207C894E61A8AA88840A27F2B439FA7CBAABBC789102A95323E06E2C324859DB92C6CEAEFDCA389F677082180FE3D6202FF60DAB9F87E3B84841C0A4EB5974D893333F7F1513E54EA4AE0731EC409F69B77089FAFB121300042880EA59B7927E9435EABFDCC1019A96E145D5D157998D620E7BC6945DBD6CD78E94C2D89589F8DC8A01CF1B295A26B091847F034937F764ADFD811F52B3AA187F3F49273EAE5949FF34B64BC86FF11EEFE378825D526509483E7191B33333E5465FFB025B269F898CE1F83EA549F1864B556C729F510118921B69594F67B8C229236AD3AEE55BD7082E027B5D342C976A549E01618288944DE0B2C77473A25201B61034B334968178AFAB7F8CD1FEB6A25CF8DCE3586FFAAA861471E2EE7F0C22538FB3C95D2145965C4673E6489764AE24B4F048DED77FE3487AE175F6D4898F69F9FFF276470A93DAF986A75F685919D98C9C609C795D4785AE941C782B551EF382F47209AADEA19066AE5D3EBA7BBD99E91943F1E62754A42FFC8048F7B87F128CCF6C96BD760B45F07F740E94491874B06CC3450AAF55BC664B407C57369CABD2708A9C478DFF64D292D96AB71EB997F8B71CDD6BA02F52C5035EC26E8111EBF8268CB00DF9ECD63BC0D557E2D2E77A6363B00DAF25237E77DAD03F929E5E9B39447A70D4E5F4B90958F312C80D594E1B1F3D0D23F2B0D9753BF3544061CF0C0F841C440319E74F9B9D15B91EBA1E680ED6AAB7D63A97B48C0A4AAF314E8E77E2EA6BE9DCFC7B5557FEC1B996A37C86CF6941325EC356EE75671726BCED7D2157BE8D4C62CF4BD0420BAF2C4223597C0EF75F7A7C9533D14BE0D21C37F06FAA53ED5EE0DDB025862417F98D2F188895395CF2FE72185ACBEA952F55CAD7EC2D684A5AB94B1257D7ABB565B8C07B88C6335FFB9D2FC6F6779CC24FC3CDF92BB3B12EC54360A7CF3579632A2A65C518E57015DF1C616C857F83F5F1AAFF693ACFF210DD1E95CE04CCA9A0BF385ED6EA2AED894E79D5133799393469B666209371E708D4D279E1AC5ACE28985D0DB2765D547C2902B715BAED5A4FA3E7AA42645F3BBE1E9F3CDB87B1DD8DBB5AAB08626591921CB49E552F8EBAFCBCF428470719AE40B9CA847F31848F39E4D42049C5D40B0BFF036E5409A6A12E7924148E60B64BB83386079B54486FFC8187302893B8BF826578D9CA03A1291983F21DE7F6E65458F8942DC1B135C6C8C1FEF4F3863A58DB17112419590AE57B9425592FF22E596191E5BA7C513EC315EC3476C95A149F6A5EC1CF24870400FDF46217A23F42E0B61157C3CEE23E7916B4475A94B96B917C171B1A34DB13AD98833E457343F94A76EE226FA5B9F3066C2FD69F14D3AAED1B31F5114780442EBBC88D0DE5F689CD910E7464D73423B9D4E03718C5C51871250D11E27E28DF1268166E3AF328A80D9D335F2D27D2E91DC61CDDC7F733E345D56C11B6130875D93D527F93542FB352407185E7AC07051AF7F642E34FA06B1376BA15A35D837C1BFE090BA67A89FC1E307DFF3F02A988ECD48FD229733F641F2609EC8DB14B1A5AC170B104F03C2509D2EE6844C716766D06A6A25D957530FD68A8DE6F1753F83EC19EA2DEB1A4F9C7986F20FF60A7508DED6547A85BABA70577062E8144BA0496777A5218595E021937FEBAD4BFDECAC29E3FFF2EFE7D598FCB86F93A734E4C573E1496A6282A3B40E817DD3C9D631939AAB350ADC703899EE3BCB1B5EAF6EA8420DD6EB2D4F64A1818AAFA97B73C75610B6005F1EDC1EC7D8F8DB1E5D3E9666C1292515105037D26F2C8D83FEE1F4EF5DEEB287CD7C1E11960218C1B8BB50453488BAB019435065AEDFECD8D218BD1E751FE736442E8D09CE7176A71C06415A30B070693A68BDAA5CDF62351AE665F37FEFDA9481E62EC181ED24F0D0649AD01C89AC422F1B7E27895E55DCC2FD817346D361FA559094B37894C0B478C68A1D7564D089D9D4417D5C7372A33BA475A81FC129F3259C5407BC7435825B415782CC84D85E69D9B44B32D78FA255A895CFD55319DAE677FF89D93A3884CE9401775563FF1788CF3AC11CF96DAA199E7F4579A0264378A323FDA64FAD2349C09465FB23BA09069C7FBC79E7288A82F9165268F6842E0AFF0E250C21BBAEEFB4347D4EF1CD51161DFD29BFAFFBEDF71DEC93F4157A5C18995379ADE8D15DB59EC4A8B308C2EADE1B7DDAB55CE2220F3B3AE8CBA7C8211CCCB3846A225B438F4B37DF54363A987C5C4E6B9D20EC3C0096317D11F982184B75D8EFFD168B7B41317D40F903A23A2649999DB36CAAE31BA5D91998A684D30AAADBD3B1EC154BB6C92513BFC0C47C673254F42B1FA36B995CB737668CBDC2A0D1BA838E74E0E50B22FC22DD048F48B6D1E89E1CCCE5A226F63AC7B8E6E9E8CE27050BF3DCD7D0F35F47BBEC1CAABD4D619CD77302AB4FF6F56DFBE9F5821AFF2D72EE6A628DAAAE4440EDCC070473BDAA54CCD775331AC2812FC5B9884915DA582EB36F85C7923F06D961594753802EFC5883CA484FC64FACE42DE6C3105E23CB90663A3B381D0C6A7265B740BFF0A1A017058F06E39A74BB07B63F883CF914FE675E7E5AD5AD44C9F90DDBE23A125D9BE02264EDC13972FF22BA48ECE8890A223EC13ADDBE055A8B4E03882677FC0D94C9053DA6CED34E132FD83810A793350446D60AE5DD0D174B534A3B6F5BC1B497F9406B5CDD414401B6DD881CEABAB12CC51425E88A81BD9E14BDA18273583CCE0849AA48DBA1CFC49CDF29242C73C99C87F063B8B739AA787570459C098405DCCEF78D6D97C21545F2959DF9CD62F9C38AD9A849507C23A51714565642DD76C9103154327985F7DCC701B795A7AF8625F06367ADC11A7FD7B6ABBDA5B2FF6A825DD43B64A48EDE4EFF8603A82159A6011F9E626171E4593C0E963595A6E068AD05FEB12378C71AE515A82C293EB7D2B01B333CBC7991B44685AA7513B3A58342BA5D094B773E6A27F8582F3DABF54DEF59974CB8A2499369B5B64C7AC08D32D75FE37371C578073DC83B82A828DFC325976FF282D3F6 - -count = 79 -seed = 8B47E0EBE786914C9A52D547106CEB4A3D3DE938B3244E02E5F9660954C4C95A23F2476FCCB487673AAD0513820905DF -mlen = 2640 -msg = 2447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC -pk = 3FA9E7DC950EABD66F7438D81DCF88F9D74A8649A982B15256FF89690911CD0B1BCFD5F1EC2B6564E62DD985A8C23D900667C82AAF6A4214F0EB1DBCCE784824 -sk = 3FA9E7DC950EABD66F7438D81DCF88F9D74A8649A982B15256FF89690911CD0B1BCFD5F1EC2B6564E62DD985A8C23D900667C82AAF6A4214F0EB1DBCCE78482402000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014FCC2C4DB9B648AA202AE2CB56E14ABA2C574754AE48C54E9137092BEA7DD06F19CEAACE439560C38479F2515960100000000000000AD423D43D4D96429055CB23D4A1CBB4F0336EF43E5E9A71539A5E2C64C33C6EC1704D93DDEC3AF7D1F6E2937330EFAFFFFFFFFFFFFFF8B31E50EB23FC01D355C3A6F86EDF6F2D956C85DEB45EA631C056EAF3AF3000000000000000000000000000000000000000000000000305CDD1571CDDFED7E604E1A4FADF905F2DD6CDCB6C8897A2549626CC2B80900000000000000000000000000000000000000000000007F313A842D9EAEEA135297F31B8C9171FAF54BCED13FED04665959847D5C602CB936D130F4EAF11A0D5E228DB38408C2B603338C28381B23153FBCD2BD8DB2142622060E0FAC5AC940EC565DB368A3F23881884787941C13E8EA7C73CACED7227B0832D440BC85DCE78AA957D149D9329689A430BA079C949D57C51F2FAAD70AAE958A5E1FEF4AAAFBD34A0F38D970A8F83D8CBDA97F60BB0EF2B109ECFC751C8DAD869182EA951E0D4FB62E8E081A17DADE8A16429E729CFA76841047A16D0DD257CEB9BE26A87D7FB3D387F52469101A326E3A2E93A4DFC00FC19C30465B0D2DA621A15EACB1B37A0866A7F960D85F84E3E24B91B78FF07E37483A6C3B1B2347744D0545B49E0BCC9E82E1A11C04CFB492082E96F4CB9F3F904138A92A44155A7BE64463164596CE209E872531161F76D70D14C7B86A09F187A55FC12BAB2A43A66DF9B188BAFD3E92B05461FD7B025E2D983462F61832B800B323327EFC32261D576CC65E40D181FB9C1CEE58CB6D856BF921B1E277C2D0A5D66DFB343628ECC9C00E6072B226AD5F36B2EB34B06EAADB90BEB4B8C28F39AF051EB79B3E00C97355D6338D8641C12B7830FC94F4C5D69DDCD113D4D45384A568C393F9DB29 -smlen = 2817 -sm = EE020CB0B45E9ED61207750D46CD4E8822BD6A07F841B0559C77ACC09403D1A8DDF1DD78CB0435032DA70C4F779E9593A403C156B5F0081C552F150180FA4770795A5D91CC00520CC768CD61132D0F036428981D62D61C874E0028CD03F6246ED8EDD2048502B75E5E2C26DCC104D03EE536A6BD4BCFFB0756F2BC3A557126B1DF02FE5E2C960C79C128E00201D98E56FD9FF73297A0B1131E116D7D4A0D030D626A28B6DD051125030F6982EA3BAC38002447D338BF1A375B66B77FB96CBE7742508B57DFF4D33A368EBB8451C2C67B980D3576E6588D8678B285EF288A8B5C9C2726C4A550E764E47FFFA2A128533A7653E480288447509E10013AE1944FFFAFBD9E2BACA0B3C7069C07A4186C056FD3857CADDADD5F891512DAEEB26865F5C89FFA63A64C85A08E41EBE7BD8786A8ADD571A4267D5A9E426840A0B988E197A09F3770B5B0D80D65515CD4D8390AF40E6150062DC4B8661A8238F232692C152C97B8CD5BFE7B5AD863DC92D99744D769087B3EDD81D2E475F5CF0224B10CDE6FAE8DFC3519EFDBE66805AD4468D84D3DD93430363677360DA8F56CB58A6B775FF6417C1F324380B15C9BA668EB0F25FC2A690B483E856F3327B2D79FA6259E30D7F76199CFD21152B7C6FFC3FC113F70D3930C08B3C1EB1BF25C100C5A930EEC2C52664F092B89614943D9D85ED86A2EF666A94F9826C3D116A2BBE49443E2C11748C977716381D9463DA8D09612B80A6760E5A6FC5F59425EAAAD6C8342C1EA4BEEDD5D73151CE213C0B155286FF22CD28E3BB88E0CEE39CB859900D1E0FC19F6A7237BDA8E51476F4844A316752FB347492A928EEB07AA39ABDCC0164D1921B61352ED4AC94B82C410A56505633BAD53A3E649ACAF64C43C1ACFCD4715FC594AF6FB9E85B0B7DDD6E8621BD12A2BEE48223A97EC8502C16B550B03087B6E87C1A860D36322064F8FEBC52F2B7C31DAE7430870259BDAA5889852E3AE6F61013F5AD0D38727CF9D90C67BD7BB3B82D303C6C35383ED86FD5B7DDEC824EA198EF780BE830A1F2679D24EA6E2FEEFB979563F511D188F409F0CFD0050FD418414D01E46DB3D23B3A90B24F4E96EDD4F863BFB333D6A826D29EED167738BBE22C516C59FDF81B032BB55473A5EA2A1DEFE71C95A1EEB5C028435AD0379896CBBC76877501B054CF1FD2F6D7A9DECCD70D0C07111147EF568DCE514DE96EED61600029C8D103B31C8B344A700DE630276BA2C5633419C59E66577659538A6381E45584C7E1D6ED978AB0AF89067AC83BB70DEB6F2C58E339A5A66176A54D985DA6E02002948C62BE6F12314240FE18B09AACBCE82EA462586B8316C3E0AEA00F9998922F8D956120E53B4178223F4D2934A20976FD5A72027C8F4CB33E9BBCC0ABD15395151266B6CD5B4A9E2FC1725D8E9AB2CBDA47B507BB25AC995EDD51EBDA5FD19CAF68FAD8EAC57CB5EF0C6FC861A73E64648EE3255DB4C3394438F49377CC4AC2FCE1B6BC812E5D282F122678713C6C6D452A33C632C0AA47686588752D72B0586FE5EC2464A6DB40662FD2106A19F67DCCC45692FCA03685251D512642B0CEE436C78D94C6F5F25BBCB41FC7E5B1AECD52B846A0B70EAC93579603E9870F942AD4C1CFC9D49B1132777C6F1C184C1537178E5029067257A2DA2827A2EC44D323D13DC6E4E1B9EDF5949D4324228687FD54F02CCC3C4DDA635FA546A5A6783959B1C48AA9D9C9F6381EBCCD979253460857D3CB1C70893EE6F04709E35923883EE3C71C7F33B8CC28B9136B3EBE5F52B9A76817F2F74FDC2F12B459DFF32D5A295BE374B3FE507A0995BCACF1E7B24F4501B29F1E8B4F2A8CB394B3E459A4296F6439BA59EC88305AB045FF40B1DAB4F672F878DE1F9E46B9326CB3E2F3457B83EAD8DEC28DD079AF0E984A69ED882E1CF21036578485DFC2DEBC9CFE82FCE0383B4039D147C4C7E31E315FB57B9093DAA811F4EE4568E32E5625ABE76C5A1AE42A03441DBE766D0EF4DF607406F7D489275E8C5D4470866F9049A4AD5C428B843DEC3702E86E177E4B60181D2B5F099BEBCB25F04C93D087C72436E87A9B3AFCE78FA31E2B892400B5C1071F8AE0F78EF6F7D71859A97C17EC0912D5EA27AFEACE739FCF66F489EC6355A3318F79649881CD6C7E96A881ECC4FF6934C3D10D99F1DFD00592CB037749B025BD4BC2832E206C1407E600FC2170C0BB57E5C7AF0756830C2A6913E2B9C60575CD4A394F2A65C50E40A43CF5EBCA6A8A32335707DDF4633BAC7375DD53E24DF20AF30203B514D3793392E38FA8429B050F58B28CAD0146F385809CC7FAEFF8B71B2BC93D2C6F72E31AE2D07CBB3CB7F43540894E01654EDC71CCF4F361A847EC5B1D23C2D4680E29F0E1F992EDA3AC41ECFE614FC010A2EED1BAD87A7D17468D6FA5356EDB25E9008A9BB328225F85202246816E1A542E1DD746A5FD3E064FAA1248579D31CD3D65F8FFF36F782622402DB328C7850D82D8D8A52B897353A2F8B95624D2D958FC1C3AE6466EACCA2A6A5E6ADD4A582D27E07633CCF697FA02E243A4FBB3DC727B718B5AC0FA6AAB217E241627E69CA46F05ED6B496A739A29EDAEEF76992A507130715BE555C68A7EEAD6E8FF3A378D8F4B7BAFDEE3EDB9EC094440E31BBA717A9C82A117D05EDCA2370003DFABFB2EFB29510466F74E76CECCFC41709FAC4CD8EAA998357170A7A293209EB0BB83DFE5E2F6D73C28D5409C55E95068D647BEC42DB8098F0089EF8A5FC5976BAC421C37DDA6C4227BC1AE5AE229F067515CEA3D794C8D85564AF208AE0FCF836B6C0AF41477F99C8773D9DD1923C5C07E1FD508C7436EA93383797F372EF3103546A5278A4F59614A5D182344F0431D065C35620D63D4D001D7F626993241362E67D1BF41419858EECC2626537D44E2E23619381E96CFA91B3D8054681D298509D9B99E7AA99CF8742E37637B24136F8E1B487E9571E4C24AE5DF307E4C7C62E55C47132AE404B33E5367C6F24D6680BE32D20BC58370145486FD5EACBCF98EB7E7FB6293044067AF11879E91444025FE52E24617269BE192BB71BD9F95356EDBED9DF352AB56A854F9F531889A88689D3F161FE6155C6C1E8011D60A46F59C7D08C477FA652B559A80567076B4EAC29A85D54C66B35D6960DFF75A696CDB17EC9A7B74DC6C3652DAE866E8758170D055C4BF60FA1238448CC9E29160DF50160C4B0DFB36BCA40AF0BC5F7D490E7DBCA49535742EECB90098A0A0FBBBBC7AF25C0CA9BC039DFB555DD8431AF188F7C1D0FF786D627C058A0B9A15F26B58AA2A5992BC8FC5AA14025FF95F294203B45EA081E28F094D0D4AD671C885E67B2E9E800F10048158698D56648F67BFA8CC73DD5AFA15C1E48936B2596DEE34459B484336C20CD77E58BF682479F9AEF2FCDA86E4F3A2FED7046E5A3828A9B3C0DBFFC25FE699F25629A2045A51242E310CB369B730A5E81167758D7FE843261A598E4541B02D0DB4BF5616BA07A440665F7FEA6213114B6B1B38BC033D70E845445DCD18E23D34D3D6F4A52F5F904AC5D8FECA5AF1123658D09613209EE19954174A1AC7A8C7F9EA288BBE5A0705F3CE38F30ED5EE69CF5208D461EFAD51C456507C3729EB338CE15C4C253BE21E81F082B0847C6871CA0FC8B3E80115FE2BB8CD8AFAE69A3C1429D21F149B7446888BB4DCB639819EFEE665B6D6F69E61452B9328B4887A7C04E9949390980A2609A667267035B11BF862C1131533DDAFA518221627E0EE7E4009CD48E4AA9D0753A9AE82AA0257B69D569B4C53F05A75A521B327322C60398DB0947D205D2A33AE51CF2CEA8C9162DD604F8EDBE91F5199D19EFBF9896A46389E7BCBA54B4AA57CBA0D4F9DA117F288133AD01A9A9B2A824D54F74D4172BE2B1E5F0D3DE60C13AA5B668EE6A45397C2E39573EBFABAABA48D1DDB2AB6453FBBAC8DCC05349404889C7DE23A16EAFAC8D5E541457C32CDCE80CBC - -count = 80 -seed = 07CD8F8AB7CD12EA7CC94103B8623D6F0FEA2BAFD2325BF6089DF5351BDBB9A94525C3C6B72D3820F2E4D5F9E7C849F8 -mlen = 2673 -msg = AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 -pk = 3FAC9EBA2C25A42ED51CC80F5FED8E83AB72D03AAB947FBDA13BA8B3444DE12AB96E2E87A15AA8002D3C6094C52910CE222715D280380363E01D9F06E6A13D0D -sk = 3FAC9EBA2C25A42ED51CC80F5FED8E83AB72D03AAB947FBDA13BA8B3444DE12AB96E2E87A15AA8002D3C6094C52910CE222715D280380363E01D9F06E6A13D0D0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006AC3F3C8094803908FA6C885BAD4315970387756205D49F3D3D239C1DBCBE6BC393E56E4E0D112065ACB36B5B20BFFFFFFFFFFFFFFFFDD4D9ABA1F51904283F8D275EDDD95C9DE3190006C65D078922FF7CC81A3CCB65EFD1CEA2F2FCE72B6ACC762B287FEFFFFFFFFFFFFFF63FB436AF90A2F1F9AED42CE6A72520DD309A0047F728C37D16DE09AC8FF0D0000000000000000000000000000000000000000000000F6CBA9ABDE0916E7998612B3434C0D436A2DBB9F0E993FABB30607E98A90FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DB27A30C42AF53AEA973516BD5E4DDF2FD4CBE15F62244335C0DF411805080B7C95227D39BEE6B4E61C36DBEE96421927CB26C45F3BB9ABCA7679522A9AAD04C95C4AF670219E0A2DF8F2B7550EFD7F20F3020801D3F0FB0E54C6322EEC7B3325BCE9289A42E0DDC0C2F131C6D06CDE28DE066BCD8B8B2EA6D9DE9A67C43E327A6F6F43605AA7FE74A0C53D1A21F7F141AAEAD7DAF8B6672054D6F6E291A01595D4D28427350EE9E7E2D3FBFBC4EAB1BF28FD263103E1EAD58E0D042219351CEA863C088224F46EF813700C6A3DC47209332ABACB781A4166265C5E60367105802FD9085A923ED6BBCB8CBB6F5711C16BCC4241FBF30F3400F7A3F0F1852A2C358CECEA4EFB98EDCB21431C91739B25C5783A1C7FB43F6E6CF623FCAF5B9D01BD73A3658BA22DE369B324487C53BABB7E256DBDB43FDEB702C5C2B054846C1C5F4F3D12AD6345950BCF1AA87E2A42D860F9B6A85EF16DF6BECBDB92FF9F9615F11813E1EEBDDE7737523F9D6D34C0A136D837DFC9D7B2B39DF6BCD3D9B9440E5664E80C326899915B3B1E8BE942FFAFD3C274539AF384F14F52F672DCA087250F817A338716674DF5AE57D47A366AA11FAE4D90D015FA36CCA021F0B46D8414 -smlen = 2850 -sm = 02BF9E0A63822E26CC03C3965FA7D1C0655B6B06FF6800019B0E1F3D20073FCE7F7ECF25A7D3460517494B00746FB53BD9076D85301E6D1ECDF6D805E7B7566794E64EE82D0625A10F10F286986178073D27EEC636534AE8240485D78A8890762525250299B08590D2E68CC26F00B64669CA0C7E8C4BE4026C14FD00A004FDBF0D03868B8E70A84F6D47A90401C3E86E3D45C0CA1D4D6B58753A5B22730A008EA3AEFFF7C76EFB7C03F52FDD8FFCAE3F01AAFA792BFF719A3B794B2F8198EBD1556889C8C61EE6A51470AC9B274CB162AF44A26E2BA5EA7663C4C78B4B66B322ECACA8F2EBB6A610B51D7C4399F4A64A870C038797CAC80F709CA5C3C9FAFF7D797963E60983B584130C1B99328AADB2D261217CB95A535B8518A78A6D2F6CB8400C2AAA2DAF451391F7B8AB0277A3AF88E1CE6F1D3DBC386CBAFF15308F073D29838692E645F566D4B3DB4186C259BC84606855EA88938CEC4F7211BC9B461E39DFBB9E44CBC273E02D4314A037E0A26D60985EF5A35F069D8B51F86E9B6801CA067AB75565D73581EBBBBD98ECB5AF47509C8729D82EA0B35F0A376EBE6D90108CD61FBD0CEC966C17264F6A87864457F41162FF7210049E6CE2B5354F8F19161E0866D6BC3935815D9267C600DC529521FD092B126EC440D49B8E3A166587657B52AE9E2923644F72876EE94A61D2DB0EF4DAB33ABEC0C47A6A725D4CDABD06D4F6A30BD7C90DB3778C17B7D8CE82A5123B798D8B47C7F3E968C9E9F82A6EB3C2BDD8FC06D282F5CBF3050F6FF71E2EDF7A109F23AB47F427BD75163162C37722BF70A6BBEBEBE8FD9C39152AFEB78C37D718014F739F20BAAD1597B1F9C4E0B59FD82B834D83DAFFC935DE4A3272D7C2454508C07502943E90FDB56128D6E6009ED09CE80A9B60D51AA2E4E162F7F0C362F6886BBCABE29EF6C7F38B742000B9D152FF709082FAFE809C5DC9BCBC6F300B0A7840D0D36F39567D14D8227E7145F7CA670EFE917E0F18B0570DA3E05DDE56883FF12BC0C76C2A1E9FEFFBB728D991769B7D0B0D34853C76FC0655AE200501C28755F57934BB9F46A3C6AB1DD8E0161C698133F4F2D7CAF3392576B4BD2B6F8735D80BCF60656E132442BB7FCFDAE160A2DFE3F3FB8209B5C933201785A7E8206096B84A222A68E62501846273F6A9145820F87F450D12C64FF79A843E897C8394AD54AAF4F3B886FB00A6C37B2EFD0F6D4DD639C9989E7CA30E4F12EEF440946B61D7A28904E1D74009B6D1AEDF2FDA8B5991CB37795A8EE51BBDAAEA34A4C7040944761B9B4B4C12F455C536992A0852F7F07A9AEDA8E522591CB4831B0C79FA977AB6BC49C9730186855986035D2C6E5A6D93DA43E8825753721978AAEB433CE2F2A7D67C1FFEBFEA6F6059474D3022817A7329D9DD0E4A292302E4A57174B9C5346E4B6D75D65882CA7339A48C6E7AF776A8515014A20E4390F6B4F4A19990FA725F5A69B9C3BD4E8BBAEAE49979AC19600A3CEC6DE154985E236C3D0684269974BFC82301AC7196675F618182D7CF15EE5CE3B7ABEE0DEEA5C72F54CAFEF203D556B31327089A0C0DE94F74458CFECB481ADFE3CBB5DA422BD3626B00C4572B4C2BD7584ACD9129A76C616AAE51F944BECC4682AACAFB8E3BB1A42A6A8E5FE7BDEB43305A34A98308EF2D49EDE4F41361446A9AE4DFC1EE13D12821BE0B01E55B865B563633E5A19DFB6425CB60159C147B18A6419F5085C5D0882656ED533EEDF97674D0BABB6CF32F696DEC0F9921CB3DC9E6021FA198D554B1D83C42A0BF214FE4C0431547384F45AED9190CBCF98ED8278E8A03D551FA284C8A26218F0B0B58D99879DB98449CC99B6B399DDDAD9924E6A7EB20A0F1FDAD2F8138BDC7B445BC01503C509066B1603CDA76FE41727AB5E027DCB15032E8F66BFA84544D22C501AA6F62B02C0F8764387163CCADBF1ED7238E7F16C80E6C37AFEC2E10FFB95AB0A39784F9FCCD8AE263758ABE392727E9AD442A44738D77CB61A6B1540ADE751130489015AE5917C927232EED27BBF88481F3CA0C5ED2C31DFA943B2EAD4A8C80B4946E3C138A61BAF43A72C7A25E16874CBAE254D3F14C154F7C60CCF665B566799A01E0F769B60F73C17C840E0018C6FBC10EEDA3E35A77586B3A5936B363B2D5CB25C78A3E3AABBB84F1E64DF47F97AE1645650FE1751A724EA9BF80744D0F33DA6F313A3CC17D8F261585B62A75C167126D899219A26210DC55AB6DB2B94E6993849B4986F988EFB07478D6621CBF4B8ED772E61B0246A5582242FA20339B2D6CB89BA1B9210A318EB4697FD21EFCFD230DE9680514A442A13B29D8CB2627A6970BB97BF09C79C6ED7A27247662B25F39C8D675B0747F1A6D9EBBF7CFA7BC51A7EA3A7307EA4FA2A463BF53A645FE701FBF26628731CBC18636567AE633A49E59F6F049447803FA3D4F1F79F38026DE9B07D8610C9F01BEFB7054AA46E523E001C1EC3A4E7084DE0CCE596DC63D9C1F1DC03F35F9B1918E62ACB2640102E1D520E900969D53E83D2DBDDC80D1DC54BEE99531FAA5A8D2DBF8346C7ED123587353DD63823453DE350545C176446845BB3522A862F5D675419DA901CF7D2D1F7050ABFA3237D42753203BE251B0364379232D2D9D8642D52A60F6F4CB09EF29FA1E6069F97A1175F8447FE98A813CC182E33FFD8B8CAD93BF32A60F1A9E63A79A7F7FB9162783B89BB57F3E73155CED1D0084D5BA967F76C89C61C1A3E944F3B6F78D6CD3D1139A315C5276493481F3FFF9B6A6B40C920EEED9EFC74108C6BBA5A15DA736680A23DB5672C5A32ABDA24B49F2011F44FA8FF9C73609EC195025F0456D753C848DC6296920FC32DDE2174D37BFBCB86CF618AA0D486EE46C5E1EA14A3BAE4952AF5D4837F9B8122A19D1E59B909ACEBA6C849C8B452CD6CEF877A65FD83E6D0C6EE35886688F1D877612CB8E671D83216A1F76693D6A4D6A2EC13EB6CA2005328B3C91F51B352A707EF8180F320D6E1685C1EF4D87E3CB77FA549BC12727E59C11BDF8A9631CC272998253028CECEE8A2914182B90F586D80E7ECE370979BDE683F37123090012AB9243A4C145D6349C2791DC44E54956C5E9B59FAD017D3EA27D85B48A896671A0AC14A73B5AB9145D8BA6AEBF9EA25AC2E8E2C4D16C5009A83D0E84CEB80E95DF2CEC4CBEFC7F5B90A84D408E8C4855F9AA2987D9FC9D8A451F32B367BB1DE5271ED35EA153B5D400A6D8050EE82F519BD930245A96C9727FD24D8B94DC53D4B4F00D03172CD6B7F2BE163B6D16FD6247B01988A6EE6CE7BFEAFF78E983B8DDFBA4242730E52B57876E3719D1F9F6CBCC81620F848D23C31E3FFF7EBF2AFE5011E6466B1889E7EF6281FAF8B18A012CEB96796FCA9B28E78335DFCB85BBEAFAEBB0FA75EE2D0D391CA97E05F0FE43475135B13613206A0D88438F17EC8E604B007AFDCB9FA1378B7CB96675E0B19DC6FB02508E05A7FDAAF09297A3884AA051B6389A52F921F8FF31970FB082DF554226C2613B80CC1ADFF770024D6BF011C0F028A012597AE56F36EB6B3E864D79639810B8BA7258B18192B5CAA80DEA4B140D3C6F1D707ACD2256D676AE90980BA80E10B44109211ABA830EE96E1BBD248315C804D391A86AB7D4B3A4A37FED90D9867DA4B93FC32E79403E5D78AE99AF1CD2ACCE65D4F3384D9CEAB71B1E93B99704C64CAF17B999234361E378B9362D14BE3FD9E6C268013CB1FA2EA8361749D635C0429F796EB15A685E31DFE7A76AE870EBA120331AC830F8C486F6C0C4F07B658EBB9274A463E0EEA101481DD6B58835A303ACE802AE79EBEF51ADD98A67B7FF7968815ACF4504B9D360F7C0120A00ABA1FC558E6CBD8324EC35E0985294563A8D7ECCCCD9E3D1557A09885770836ECCC7AEE0F18B81E30F85D695440B5BCE29945CBF60FF402B281942D38EA33A4B03E9FCBBBEFAAC2C455E8A03FF3F35154132C538EA16F0605EFB788C3CA8435F6D595F776433585094ABC75BA581EC59AF701F66DD6091623E4676D167 - -count = 81 -seed = 3D598F7C498D8A1095C40945975380554BEF6142578638A7627E2C0A21C59C579F8E8CDA309348FC54C764C899FB93E9 -mlen = 2706 -msg = 63EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B -pk = D6C7906687488E70D5704A0789692C20DF07032DA52EFB15E12ADEA8E0970D204C7D08AF01ADE16B4C14B5BE078DC8091D63FEA7FB41933D4DC8BCD10C460427 -sk = D6C7906687488E70D5704A0789692C20DF07032DA52EFB15E12ADEA8E0970D204C7D08AF01ADE16B4C14B5BE078DC8091D63FEA7FB41933D4DC8BCD10C46042702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015B18137A5ABF6E51BC89C474E1F118FB307997926702527A2FD5BF109A5E3723AE02A9EFD43DBAFF7CD8F67BAF703000000000000008E6F80D0976E24D89628AC5206D28436B9BB8651B3BA379FA255810634ADED863E1D981EB0D159B1B6893F7704E7FAFFFFFFFFFFFFFFDE72A66B55E90B26D51EBCF57BD01DD34A40485466B4622EFEDA68578279FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4BE8EF3C31080B9DBCD4BF30524F416DC041452D7CEB903DDFB4F1D3FB880500000000000000000000000000000000000000000000004AA018CE6A608DFB3037748B3D25A4769EF983B28160E51463D81B0C11CB90319E5AD5AB3614C73EB086FCD04E67F6DAE4284D97F2212DA793BDDB975704FD044DB9BFBD090E1903E3A5EFE31851355D2B0BCE46BBDC3EEE5696699588647D02018E1F5A3C58BA94B83E15BBA7C4C4BD2CE665EC6DA894A49A62345B88277000180AD93DDB6A90E31981431ED70FA8FC847E423C89DFA1AB692A56FF8E07331ACBDC9CB6EF8B2F275D4EA5BD8516FC86088F4EB68D3EBCE6515EF3EE871A0D0EBFE1F0DED11E26C2958FA43A80D910C87E6060AD3CB43E5BA642C19271A0E70CAAA95E31C9174DE120169F8455230AC9E5393613CFDF1EEB37808CA07350BB05B8FE98238820EC1BE17EDC7074D1796DDA065338D01287F3CA3628E4801CAB0B9702396BD341537A2675ACE76E28D0A88C84EE2D0C11837828A38B1840BF0B0637A8BDA449F4809E1EFEBF087AACA4F4F492BB6358849CA55857522A0DBC630A4265F4A0C2C370A61DF5354F60FD009B04FF0B919678FDC1D336BEB42230380B413D17C21596FD4DFE023B21A2616E442A1FB0B185E93E61B3884C216507D8238081BACA596EC0DC3CAA18CB862829006EAAFC352FE5F12228CBADDDD9952829 -smlen = 2883 -sm = EB688ABE2E2179773902DC347260FD7CBFE41905E36F8E996AE387938A07FC9CBCDC724A8BE07907476E4EC293C340714004990B6D31200C14DF370213FA6ED2D35CA01467011BF00B94DA3D6786E7073ED8CDC31D8E4787AE019C3E60CB5F111870CE03391F5077ED0A4CDCBF0244D7712967E3931D8606D2323A4DC02CE5ECC3053A26D297522CAADF620101F96618B86051FBB4B2EB8D5BC60AE2F30B025C0774A207BD4E52F305D80E48E17522120063EC08B711DDF5C66036A13F574BB7BE76445A1D1F83C7732B9F4C25FB9E799D4AFA55817BCB39B974AF92F3730767CE7D863B6A3406450DCBC5E0145D10B7D532DA6E80196157C38D1B6D3C173F74D67AD8DF24ECAD4D9B59921418863A38270B982C4392225EDD1845AED2199E2C38B36C7E0E5D2F3CC7F6803926D977C59ECDAC67CA290658E72BAD633358FCDDE2A4B9C40169A0C7CCCFDD93E4DA3C3838E9308533BD468A9128C5A141C4842840E45BC8E4610A7C5E7535834C5EC73312A50197C76AE984B3521883F549BE04E27D97580E6D85D0EE84CD0B8C65BFB1AA005C607DE82DA70021F8F90B7912C67DC5657E1882CFA6DA3DE1BA4ED823789C052649DEBC9085C74528162243133A6AE5C1C6BCA3F730525B167D816485E40C208AFFA8706E3D74631EB4413032730A7647548B77579323EB03D36C2EC37D2389D4A17305F607C78F3073A2F4B4395BBC94AF163ACBE3C990306BA3F89AF9AFFE785C3F6D102FB2BD55F0C1044034D6A871293B31A1B38E383CB926BAF3AB4B5F79A47E9FA7B77BCD58AA35A7F16DDD11FF642069A8A327DFA800049BABAAB4AFBEEC9FA98ADB9796FBEE925BB70EE9E96540436E1473E3AE4C56D7099D8DBDDE755A7E101BCCEB596B9415F52374C8A3A73EC66B229DFD8CD7EE7D2CF1C5E7F490C7D9381D9321B15F84F640017851ECED1DC80D32DA3A0A57ADC3EF37E021031866E278C7D51FF5CA8E9ECEA1082423B41D772C5ADC61A8C71C3D4CAAAA3433928D7931EE715875BDE2BFACAA0A7F799B45241C21BD2ECE4A5944FB6890BF24908DE58DD3C76173373254A36B0B2AC7D67926948CC0136DD9A5079D776C297FB6A585C290D5DAE1C45E91153299EEDB731E527F0F62E83C1E93C75FC74F9C7E63311562B0A55459A0D41E034C3AF637EB29BC789E5920DAADF265F42F2707DD1AD490B5F8A8D24A9968BFF11A0C364A779EC385A9A33EDB9CFC7DBC672BA60CE5F421B40634270B982D619F8E7960D32E1B8A76CECD13A3B0214DD34214CB5BB7FD530058D5DE1FB9E4E88ADCA05926CE1F5597100F55DCBF64D47FC177FF87C4BD9F6ED7670FA7B7D339EDCCE6FC1EAE069E0C303138689DDFD23396C145B79AFCF68125989C8477BFC318CDBD69D1AA6D3EE41F4B1F9BE4BE9FA58A072412078CB9196556EE56FB7B2A2761DD04120FCD9AE9736F599C8B96BF8F964B305530A6DF1F94874F36F07962F87ACC0B285EDA64D2E4857E26BED40E9A5DC0327F1D91259292C608D6C6D59804DC23A34D1F9F1B69331D68771E41542FC5D669CBC3CD7F8310F87E8FE8F6201E57B475DE2318EA6EF9F7D32A728A44334CC9DF28DF77038C37CBA62EA8CC5EE80E571879AD111F35B6A154FDF8D40FC93360D547D02F0743A37EBC4AF178C6CE36C92CE6B80B6350202D2978621684A19AFE1474155BB962014587B1F5A477092F42BC446D7811C0EB439A6829E538077ABBBF03F515F1E6AC018EFB05AF79069C2569D2CD7140C4B1B47886064DAC695D59FDE2D8FDDB35318D33EDAD94AD4FD988095B1156FD59551F0658EE666186369BFA84E30672E4659BFBF7963C377F0039E08DE2C2D9803FC12D97B5E67CE9536AF12DAEB3B9903D8D95F336FF53286284BFE8D7AD13EC21C2A9BA93C9A97BD7F6148DE7C8CB41CA75A9ECC8F9CC68D888FAF6B3E75376B5B16F41E7E6B76A686EB365365E2074FB1D7EFB1B285A2357B020FD3E47B89943FBC1596F3FA8289AD844386A691F33DAED4B7A6A6729526160F2D32BA7F68AE6678564FCA05BD811F208A8FA62F6731F23D46027008246FD4BF3C454A39EE225245E74DA5910E7937B36661548A55A2270A9D27114DDC94DD9B9D4122289DF0A5700222A977F15FD8E36AFA1C4870BD3CE9B658E2D83882AAC5F3DB814346240FF8C8FBA3F36E52AC9B441C76B6F104A0931BC45E202ADDCACCFB93A486A7734A6D82B9F6CA911448F988626846D413D987C5AC860FCC0D5F734269AEF88D41A055794DCE832BABB7E306F622E5EAEFDBE1CF195E320A1ACEB4834B3E70061EC2D624C12EB35B16E5AAE73053A3290D4BB1F51FFDF48C1A7218D365DB7FEC15BF0F710954CDEC54917600014BDE3A901DAB1DEC0844D7FF148EDED9788CC85C0CFF26E5895D91C56BA6950C0BA8FC6C773AB4A6091A5DE3AC335DDC2110EB0144FD89B3D815EF4A26F718C1ACB5723AF1DA5515442A03CFB9D90623FB21D78DAF441000E285E9E7C235C0F31E258E6B3FEAC048DB652B83E07848D2E9357649372B1A55975B2EC7FCFED19D0B6613BFDBB4B5B01A9AA3128AE137BDC1D8FFC3A38B597578042CF183BA8383C289C3D92F6B70AA9B3364E9FC5D43F3CD3F310D229912E91D5806C2A11E0BDD208A2AF438BE77B43680E2DE67918FD414338A763910E1316965BF96BBF7DF639266D075E90EE9C073011F6783750764FBE4906ECDD94EE9FB7E4AEDB23EE88EBFB018C44FC8BAFC66E6B454A3D0E332C7A6B34C2E8D1D26416FF43D768CC36CA9D3168355F1A281A6B2EAAEAC7B64AABBAD2156A1D781A78A896248C56F3491A5DDA8C22C231AA7AE14BD558F66E6280FA65F20B246D815BFF1D3C6CEE6DF9B4AA7F750307A7BF73850E6BCD22CA0AD74B4AFC13CD4AA2FB7E7B588ADB3A46A23EC88A34F13214B261A283AE8FBCE8007C6EF6BE255C33218AEBECD3EC27EDAFD252994B70BD67407620D26E8567F4C7F6D636803B6A27EACC3B853706A8D57ADBF7F7E142FF149C35119A6172D5884EDE7C71E6C34D1B485A684DD56C9D670576B75CACB870A68EA7FF2BB461D9E2FDBF500B2F200110265A3CF24370A3F480DA66F98FB5327B4CD796EAF0E559A5519F3C643B59E3B89D05D2A9F9DA6732CDC2996408B7FAB5A734310FCD73FA3FA5CACAF31AB04EC0B9734407C6DC575350212239AC9092DA5812137BFC40F7735BFDF9827F768FC0363FC8C5739C7DF828075EA2BBE6321D5A8EA2EB7E397C3D58A953C7F0BAA69A96AC8110B125EE2E9701F43EEB87FDF58A6E6266BE1136437599E26E8E6E853DBB6ED9DF3931C5F402FD09B7E203AB36EAA6EEAE72E908BD2B9CFD379BC9B407F0C882807BBD2E91F920EB24137002A48F1AAA0CBDF89FDE5C51079F1D8CF7A014207F1B40773321AD952D77CE18EC7B48F2CA054E65420C1132AB67C832EE22FFD8672803CCE3DE7E9FD0690E55FA1AF5F11611E3E2C71CED55E3E347F4CBEB9C93BEC2B98E48495585392471AF0AE589257ED8D01792112C798BCA5107030F207CE567594B8433490D8FF1811F21B03A42AD0678927183321355E3D6908DC1125CDCE038CD0469D72458B6CC5E67EB0D78C20819C6F3C4518B15CC63754FF8679915E329DD46FEAEFDA5249ED7E754E7BD55C75CB764B6CC36BC06267B2479CAFBB3F0BAE32A93558190B65C85DCDC080CD56D51D4105C5B0717691D4DB1893EF8AD550F55855B4123A38D18FD67B588A3A4C2A6604E874D721359352B235C17AB1DA2758712AF8179FF433211B93078735F909F985F557D0DE52CB9203DDC67BF9DC8632ACD8D4F90196AF6BD2E79834371C5E9FDF5992ADB04AEA186AF36F56271F763ACFFBF94DF4B0512CA6B7CA8FF486504E565BDA367E044FCD0F25FBC2A6C720867F95BFD92109780D2E6DD60CE90A4CA8EEB8C4CAB289DCF99E687B017B37695C3B99B4FE97D7E5D52BB9813C04D03C9AD71770FE0986C7F3A3FFD3A261AC771DE88C7ACDEF253E5CE2B50BC5C576D132B68CCC694BA883770B80F5ED7D527CEE816527F69CA2C101747A0088879C3663037DB5B - -count = 82 -seed = 6CDB757AD36DF99E52F535C2680431D5FF36C812D8EA19399F666F2FDD66D3A842A7A5AE1038359AB618FA58A0A6E840 -mlen = 2739 -msg = 7785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 -pk = C6F55DB0BAA8CB71251826E51451C951A140BC5CD107568F7D00425A1A8F0F0E9DFAFCE2225531B6F2F252E20B7953E8DEAA21D2A36E5563DFACB9AA7D87AB17 -sk = C6F55DB0BAA8CB71251826E51451C951A140BC5CD107568F7D00425A1A8F0F0E9DFAFCE2225531B6F2F252E20B7953E8DEAA21D2A36E5563DFACB9AA7D87AB170200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001592713BC24E82CB684E6D6833916456FE15D2CDB02FFB9813963BC8910AD5363B1671D080651D13EF088425A85002000000000000008A6E8BC775B8EB8FF8D7C65AFF3DD2DEC5F24BD804F038178A4EBA930A09C6658CBEABBAED268326053A7D776A76FBFFFFFFFFFFFFFF7E99A39CFF45E0FC20D3050C27E35AC59BAB4D6EFCB69313D08A3F3BAA03F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0533AFA866444420BB7F67A217666479C55B8EF6E1CCA77DA9E69C9DACB20A0000000000000000000000000000000000000000000000048E54DCE6082405C8157D8ED7FAEC2C9BA44FF701F775EC9BE566512F61BF246034D891E1E90D89EFCE0BE72624A64C9B688E34F7818206EC463C41EC9D5C16C463464BA2D752862B72D2E35501041E57053AE1340ECAC8D5BAD922F69C8F2CB5D3F331EF2C28FA6D2F7D759F5B05F4A26466E1877FAD47EDB8AF618D41DE2B1E7B85978071A3F522EF5857F5F08CB101B5405F6F0AB20E9B5F5B338555440DB42634EE6FEEA14A1B7B9978B77C705B862BD0BCE79532BA70CFC1F398EA4D2FE14E0EDABEC2528B3F6C2F8106EDDA47D47CA84D1F22C84ED2F677214850A934A74F5991DFDD9480D7782BB5DB67556271F9D0969FA13DFE08DFBC2A5B119D10088302B7F20F2ED5F80CD0D6681DE8F77D94B209F244BA58308007DEE2AE8631F1772B1A1F4E050613AB7690F6D32304C18A9D0214D8E6500C4A0EF61697D7346E82763A05431054D8B0D41F0450BC0A02EA46E83A692FD6C35CBC868F439D2181FEB423C9253981F623E9E80A534EE40EAB64C16DF81A06033250EC7DAE3C077C0FF4AFC13DC122480737422DBD2B2F716F83F7BCFF665B425AC7F74488422F201E67364732BF3AE0607C35DB670D457DD99FB518D29AAF24A8A577A9E6A214 -smlen = 2916 -sm = FA9AECC5C4E35272DF0715AC29730724AC4C4B03F616EA77EE05B031F003E1C7514E5857564C2D02C1275D26DDB2B078EF06465FB447A14E7D45DA053DCCE313D2C68F95E905E1BD829AD7257CF059009BCD62AC31EDB2850202E7E61E412594416320008F02E807DCB869F9F3011C818BE47EF85FB10D059FCCE2E470DAFE47C504D9B25259EDCCD39E0E07014B2D60EA86BC3A966A9A39C6469C749E0A034EBD9C153B6108393C05E08E4BE36486A5017785A08A3892C97D5EBFE52475298BA444674086D63E17E1FAEC96F6B10723447FC1B8CC758D1724A33E26518798183A4B3C99A7DA54038B86473DFAB8E626EB3BF54DE5581E04450B2821F5020C466505990B173DB9F030CFCFA505AA04B37CF0A063876843A042F17AEB1728787187428F8D1010D532C94C7AB2E1193994BFF0CB56415FCD2A96BE7F7FC2C57C8313E795367A22B6A17CE3B803083A74FDBCF030D91C957128099D6199686F2BEA618CEE111AA9D55A6F9E8966C102D849ADE596A1B576924DE0E92DD91FBB01CD93E24AA71EEF219A78430D84965672FE6AF091D46DCFA9AB906F6240913C1286EE0A152666ECFE2C154CD3FB14DC0F9C173E30FC9958A75AA6DD74822AF7ACAD243FDFB743E47E48280990C2870904EF1C902261D0BD6BCFDA91412BDEE9A28C628F218E7648AA0027D918B48EF30A9B18390331805C6739BF6A2CB69A0DE8766A7B3A448910D181F6449565A363430BA1C0FA8B11E1A151F6CEFA3870C3B1D8CD800983EBD41B48C5624269EFB440DF23FF9BCB31A4B02F6505DC862B2103F76137FC6560F893577BC3FCE92ADA27F291305F2345AC82A846854F172131B042735D4B76C6AB2DCFD32BB6258B23AC790AF2AF7624451172FA7A29E0C5FDB3DC3B719B274B2838FF7A8B25F272AC8EA90FA3C8010AC7F65633EB43FF7A0A95CE99717F35D3C416B0E0DA30470B5AA20EB9E2B66315B9407A4753DF8BF505B8066C5D57EC4CCDD2236B9C58BD7337925191ED7B75B92C9CEE626F13EADDECB07173C8160540FB9F6A4D43A1E9AB263B300C08966C247514647DFAB3B420202529E963A51F8D23BD0F689BBC4D67D5A603B876E8CD3EC0770F0D9694DFC30083991CF3989DB1812B4AC5452358075534190F012F7C0E47734C3BA748E04910783C0B845484461DCEA67A1EC731354B902557486B484F67183FC711D10F906C68CD01F46481D040F084271DD784E5B958AE05B65BF5D207EFBB5FDEB25366D6FF4161CA3A1CB71B2B9F90F86A315D800935AC0086D85D907A036C4333EA347000A0755550B68FE3DD7686E416483781B563680146697D6FAE8333C24ADC8A2436852DDADF6061E2B16FD3829C0B55C2E9C2C89F64CB8DA02A6706498CF0330742083E9AC4593A1762D32DC4E6CC2D9F4310014FB15DEBBEA324EBC2EA1E1660782559B9B39FBCF34C85FDA9AD350D195AD7587AAB621EF7FFB63277CE35AB43B01977C9F8DD6C2AE7B34FA7B35D5FA37D8B3719E736F18734CB3A2468BE9CA0832DDE0B958925A377FE6751C4EB8FF1AD295355302F0A5ED4E8F8C33FD5162542B8ED7CD985DBE3C84401830F6A7EB9D955EC74C7F98B02388B4E1353317CDB5EADAAC9025038CC01F8655C7FB9AEE940FC4B282748B39D277A7FEF462038833A9A8EB50A8719F68B3E858825911F294A80FAEDE9D4C1815844C2632DD20387950003DAB80B1A58E541A5E6658AF7D4CDD91FD1C08735B584F5C69C5CA94F6B7F97A4761B127DB394AC72E902DB9EB4B3E0B884C448FF2763FF9ADD530753263688CF92BB746181C17294BFFC2A0B3969A7BBA429A481C425B24745CEAD66286F5DF04F1E4421C56ACAA668E87BA58E3B07A062D1DA60CC6B411667BDE6F466B72C9169965BC7781DA78A818F779A9B3D7A577F71A1DF49AAC865A0D6F2668CFD2C77CFA8D306A14DBBDE4D3A3818B07DC89D5F51E117F7BFD007D60F32BB1B6BB01E76862398371FB91E0A3D4B39FD9146C47F627A066618CF83C32E5C82592B418BD2F5DCD8D42234625974F988A6F729C60BA5EAF18C77B611DFB187A581E3A10268A965F650FE242CE2FE08AA71515B59A6EDFC9CBDAE22DF3AEB22E773CC2EB373619E9CDA23C236CA3F7845C2136E93849D9F6AA1477F4513358CD8CB4E21444C9E5709818801EADFCA23F2C23DDFD5B4EBB6089DAEDD14A21EBF3F7A8C1C80BBF7D37973BD156AC5C4462D29DCCB7EEFFA22A8B6CE433B600532F33999ADC39196F01230614767285089FB262D8469DC66D24AE0B77FD05C3EC02FBC5EE328319409B8E2D7B0AC6801C1C8BA86F793C2037C71E2A25F114E9EE0EDB3B83076EABFDAFEDEFA0548DAE91E62CB7C29C03413235B8C6EB9F46BE29DE8F5D30E8D97DB6F45687DC4719B1024E48B7DFFD0D2B474B2032B4E69B6382E603D4777F3450E2E467C6D9AB2782C0AE266C320D36BF67BD6B86EA9721B22741684D9C0CCC774335430071A5410C1E34B4BC1A823A93A38F5AB4781CC593B13A593867FB634C0C705107CD278C6CCEE6D842748BFBD2FFD205C6BDFB3AC87F693C25C832C86D96B00BBA0AF88DCFBC8CA4328765DE27FBF1389C4EDE28317BD0EE447F030990E957D223A5EC66CED9D16400AF6DA8663C4E4111B4584F8F0066CDF8258D90C5D7B439503E3AB3FCC55FDF933E06D704416187AAF86E6C39695DEA8B8189EC1299670BE03B6A636889CB7F10F04CCD67278E77886CF3F6E2A05BA8D25AB8664EA817642ACF5DB4D9B3EF80E169463EDB6BFDF67172E88D233609B091BBD085B970DB8AE0DAA5048CA42D6A54042F42445BAB03F9BF1ACCEF341B7349109BA0073D3715A9073AD9BED258268AEE9DD5202E0EDFA5720A317EA5CB41706C0D235465BECDC8E3FF0D628EE5EEA6AAF1BBD3E18FE9217516893DF115E979C4CFFEC494988B6F9B86026610898C44AB1547C5F8ED5CBF3C3A837DDB6A444BD3E803E1824E6AB931310FE86B36587F1B34B0B48D358F4B97E9774213DE7D92571380BE2199E703119C5B9836DADFC826B71D588250AC37DE0EC05C5823573C102BCE44C9F044507671C4E1723950A3C0E14968CBABBFEEB049EB723DB9B23CDF0273525C29CC5165530A1F1CF830D3551DD6BDED53954947D5C334DC9C71907CDBFA109EBC52D6305477C14159257AF8C51C6F09D76FC0085C3D969EC60FB09145E66A8A7489611DB3FDEFC35202B8AAE82D3CDF666034BEFF49FE49A45C5EC438F4118F338545532CED916DE78E3BF82B4E55907474386B9C172F393EFE895334F7323CBB2AA7CE7718BEF5E7A23AF734BD4963FBC7889AA5C50F3955B904B5E577D71B21A293D766865E3F8C212DE5EA084A9D22748A8009A7D1858328A1BDF7BA0F4E3B83BE9707629252B3339CEF796696855A574B4A4896CA68C3D6A6824E3F593069EC0A571E61282F8A29BEB8BD788F7B351A8939CDAD9E257587A77804F2704F49DB3305514B85B449AEE56EE40CB2A75D51690194284AACD0855B02893F8DCD3091629DC548705A1085E5CC33DE7726A0F521C149003DF380ABDAE96BCDA55C44BF9BFA1103150F049563E848A8750625DCFDD9BFE02E1E57489B5B3AA28BEAA80F4DAA562DEABB4BB6A27125369415885020D237A92CCC3A23593FE2183225BFA2FF39B0BEF9CB0425375E256BCD572175483F713BD38F937F2B3D4C1F686C5AF60061E0B05CC3EBAAB0AE8BA21E47A8318BEE4A01516046363D152936A1344E17A65E08030522EC667233145A56001B8D065DC2FED0D2A9F02C981A8962F984916314805DAB644A5112CAA1564895121D8B1FD046F547BE282CF979752883EC79AF70CF59A88D960F3336F0AE61357877AAAA34699A876144B65CA5B77A684D850D09B3D42CDBFC4539EA103F8377CFE5F9E5432403FAB416662C4C83226191EEB7F82B01E0819C081FC40E7B978669C7856067E8B582832DD0B92588103C2616BA2C7774C46840318CA2B1A3798FF7ED9FEC087F01798EA2445B92E67E2446126A7406E82FF8D3711311BE16E9171531A95C966E6BEFEA34938E6F5FA660F7C7CB533A119377F1D26AE6AE51D805AB96A64C8B80D6EE137F634B384C2E377 - -count = 83 -seed = A97269579EB70D268C58D94FF744329B197F722A8A407B788510DDCACA34C8CD4C72FFC14B76300C86AEA1E4CFA66BA4 -mlen = 2772 -msg = AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE -pk = ABF26FE3A4F1B5A9B06626D3C433DB97869638808362A3850D5EED4255FC0301F51299094B8EE4C24AAFDAF55208C881E6D9AA7D13975121A001281A68B4D90C -sk = ABF26FE3A4F1B5A9B06626D3C433DB97869638808362A3850D5EED4255FC0301F51299094B8EE4C24AAFDAF55208C881E6D9AA7D13975121A001281A68B4D90C0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007AEAFB9A3234A039FC24D7A38B69F652F6EF5953412E03814AF2E82653773F3C7A40BA600F7CF17EB005DBC7C2D2000000000000000097D84EC1AE4B1E93D14E835A67E3F91D4EFAE962C401310B1476644E9D1BF68D1DE36B5B1040837B059B3108F98EFEFFFFFFFFFFFFFF89F6D39D73C5F6AB93FA6E7FDA8403F7A0F744B3EFC25C7BFE4A59753325F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA0080BD49A7A01563BD441B6652F69B885E0ECDEDEDCC2EB540E12F62AC0B000000000000000000000000000000000000000000000046440E8EDC05C861EA0D45D1019256E7B206345C2FD78494B6B2E24845E14C18383B53F7017ABCE6DB9DE0261729B5D3CAFE2717611A418195596B2138D301050992A0943554E8B1E940F90AC9648879DD1BDC08F7347BB50836FBBC7B47CF1C1B8A6996CB7A576842881BE849FC50D3306CF068721A3188B99EE942DC6AF22BE053DF7D55907BAE78478A740229DF97801E3F78D42AD0DB34A9CFA3A699A30D28E15AB9DF9FDF4BC682CFF9DAC7F59B871ADDEB3AEC175A74281FA5CD04A32A027AEE5BB8D87A8EA5AE76DD003981189A3D871FEFEFA457A5BE00170146952B6D3CD92E77312D070EB71D58699A17A5D785286BC2345C544C9FD84D0E945F15C72AC9C1E9CB3F85CFAD441A81C44BAEF4C3C25D38A2C403DEFBAA2825AA0221794A97BEFABB6B410098CD7D7006DD8B39869E5F5074056B627F279BD8B9F2245D624B8C738BD934D967600744DA24B79113F4907DA02267FFB42D1B2362D72AA821C4C9228AA069DCEFEFCE2C34AB96DCE49FD0BA348C5781A9181A4BEA38199D99551D70395B020E666B541EB330E86BA78FBA92F48EEBAE835BE68824DD0A4D267FFA7B4359140B4E86D898F936290F5C87701EE4316EFC00B050A0C23E32 -smlen = 2949 -sm = 8C0775EE9D5167A8B00717F36ECB5809BD555D0618BFE41EED14FF07EC0294DDD0A43D8D22495700FC8295E37A53FCC5720177F012C604CBA0F373040042B4EEF1277863370030F3A2B918D188C97500781CFCFC052431B9910136D2351121B621719F0211549CCB0E9B4297B6007DBD9509C11B27DFBB07C3F76E6B0D00B1DA860217EFDB893C255D6DD90101118D70B4883E5AB7CD3130F11090BA720A02DC96FABC8CCB456777037924ED68F6FF1102AE3DDE9E33719040345DF8EA7E4C0B5E2CBC5CB80B34FDDB959E2DA1D67D74D2FBE5AAB07C6357A9F3E5F6EF5379B4C75008E9077A1EB025F9023FE32FCD9076C8D2B291D0BECF2DC624F9E752B1EEA2CF0755FC9D4B2E4320DFD042C68577D58E61DAD075BC1C3931ABA78B473C0726ED495150D6A11A81DBBD1C840F5F1FAACD54E3470E0D994DEACA7E6E324A9FB4E581AB447A4EA026DA3DC3C7E6AD55E88CB841E069ECA63404CACE0E3D4C8B9CEC33BFF6AA6341AA1EB69AD799C6CCE358CA94555287D01B0192B1B49EB6F705E54FBC86465C4BA70134AFC9A53C1C3A732E21B010002B49B7CC6F5237B794BC1D1F1E30A7F1EB95D195D5F26B46A704F77F80B092117EDE1C340622FF32302DCA7E7E43C2A4D8852CB508403B1AA8ACA27A86936350264811550DFEF05D72542C74D6243AB9D259202295A63F54C836CBF610E40EB85E9704041A51BF68578B10F7985C752DC35788E7B7754358082AFEC9E4B271D36974EB90A46F7D703B0CCE941C3CD072A88F931A4FFD098634BE0921D089E46637F88F9625B7DF900A276B4BB75FC75921C8A8B6668DF9946290E11FCE4565A76D39D8FA55F324253FFBBF81536581621DEE664A9E9E4F4FCD3A9765706B8EA833125A825B1CB30314B7C6C78B301638EAD4311932FD4611D78572180EE441648F8BFAB869874611C153FEEFF88A45F7A98206D0B2D97CB7EC2144F045225AF5A9925AE7FD3DB017E37259B7A2FF6C66820DDAAC5651B2EC2E5767DDBBE18256B1D0D0F96CF5EE04266B8ADB29B0AC5D55B73E1ECA8FE724EE174B76EA1C0A54896E2BB565075F1669D3CCA171657B66F343A634F4250287F853B52182B9BE50DF29021673DB1841ACA45E7263DCE653F0DD84338E49FF5C6E3BB42F1A3C7164704A2A000149114D36BB9231606EDA06C712A904C1E323C4AA3EEE0BCE6062A9CB956E004407014ADB58EEABF486B38570955C30F2B5C28179F86CD5FFD603CD441A1FB06519368886BFF9C2C127ABD079346D762E51C311F196D5F825B45EDDD4A48C7C2123E10A3D369D772750987EDB96968C59441FB2F47F8E33FA4CED3006766C06BB6B339ED94B8FE57B20D96F1A27A61966289D8FF5072FD11D7EE53DEFE0014A11667D0A6C988BD16629FB53F269130B22A13AABA2E9F70DCC93D3BF6E611EFB006BA585FB8E8720357E25DF69C6DF388FAC792F87CCE801FA49A8CBEAD1698C11B82C4F85FDB4D52A2A808483DCA7334295BB3B2658AAC18857878730831622124F5A254A464DE459F3528C5194220E5BB1779C8F5E3866B0D60931A1A47502D99E2B186785658DEF57ABA676626F9CCAAAF449609B07AF7B57C78FA5BD06B2AD2927AB491EE461A94AC37A079D9BFA02203B09F7EF180C1C1C430518FF2D3F2A3582EAEB6668060A2B544E973E8A2B88733A902A0A80F8E4F30AC5D0223C1076482EB2CA5AE67039597514A4866061D5FBDD99694A060D0D0EE43A1B7290FFD7D796A9F1A2142DB6E0F154ABA8720396B6DE939E668447C81CC828FF9D2A014FE001CA718C1D6ACF4C08BC7796D344A29FD8913E4CE71E986C46BB66C2610FA797C9E1639DF423C338D7192638F621D83A6802E72E38BEE3AAB064FB606962329997FE908597E7407CEF098D4591E5E6011CACA701994E4ACF572F7C91057D3DA06058A7DFFD3248EE3333208BFF27473E6F1EA3914C5B2056AECD7AEE07F8DD26B3C2B8B9656EA4260D38E8D5F23C925A4476754240D0702C5859AEC2329E1CC3E426BD7665B2A4EE2E75B41B561FCE79690F64D1068DD35A294A8E8CB43A6AAA901109F0E09D985B6E323C30A017E75BF01D0AAA739102C1A6667ED48E60DD4499EAB862851558DFD17229878F5BEF0CC29FD19F59835579F3CDD4F85684E0D46D9618A205DE3B29B0BFA5FBB36745B989211E2BA711527D32CBB5E35830DF4549FEA652377EBBAC6D52787F9EBC3CB687EBB641BF51D3E22E98FCA48F99584FB1F3BED3F97F33EBF656C5795055268F49985CEA00819A07B8F4B0ECD7BEDA95EAF11E3498FA7AA414C54C38A08A841B012AE91763BE911DAEF803E2CA385C9D4CDC642A0B343DB6534C10D9E1755B7B2DE543AFE1D3C90981A7BD907E9CB14367243D9FDCAA8776AEE5F65ED6DC02F633BCF9F57DAE39E8E8261DC10029DF7B7124BEB67DD753B36892481EA7CC54DDC3A60EF8D4DCEC4D5796DDE0E7453BBF0FD93FCACE97CE5048D75ED1F34B69A392E1734E262B2B2A1E246331A373B5CF1FEE7BB46096C76349B0F19BE63FE539DCD33A8450BE894C2DC21BEFF0DE6A841A533F4C9949289037D161BB97DCE31CDFF4C1E0AE36B4192594DEC3B021E8F3D5B500C244CB122974F8CADF125DE0CF832A920DEC3A6F7150585D0209651B0FAAE0F74A36FC8779115B96136805DDD4F6F3A69C06AF472F369F481359FF834A0FD2F9AE899EA36B9B061B63D07C1D4ED7A373ACC40EAD808564B05FB0C6E656A80FA3865AABE483848D14D1DFD66D7AB1F353642EE3417869DA21622F6AF551659D07E6C827C18EA36E2C5E806A9571A7B05BBC1BA283A8984BFABC555AACAEAB2453573F782A4087F0F903AF34596E83282A2E54773AC33543BD353A3F855BC46810930C3635A9B70BA7FFBEEA95A129CCF9E9538EB11E119A072F806130D831AF7E57D332AC889D7D9E6BBD1C65D64E089722F6954F126E64EA939D98084D434EE74B55C549BED21D11264F8B5E023277DB52B03D7B8A8E75B12B11D62052E474E435707272D72D00D92288CEDDCD1ABF8E63A8A9963A48B54F492487B309F69CD90C9FF54B9C5A55CD2BAD4A2E0A6B00B188FD6C527A8184BB63670BF626A995815810CC0F280131F5F652EC20609C7D3B910E4168FE273626BF0E2CBF05BC9CCD178AD91BC25CDF178B387DFF0B6B40A46FDB6C975349B6CD8AD103CDC5DAB8D09D9A5B55622E74564C1E789C5C185CAC04FA0ED6065B9CCADB1D5DC80E90AB244CE1AAC516B346ADAEBAF7A030D66FB90FD070ED062A41E0B70BEE3B07F1C03887DE5F79D70F9955B25B8C8201602784EF8A60147260D1BDE8E152E8D3F992CB8255ADACE9D5DD2E9C856C47537742094190AA867459D20989DB11841AE44824979C0A2093D7EDCAA13C9DE25E6EECBC5124055F17466467E123E39034502BA966CEA873997EE25E52DE2DBBA874DC9AC222B49967B7BEDB5C81BE09827CAB782F458795B2903D72AB16F4423964F82DC69C138EEFA3273BC10376939E544964150D9DF09E14BE08CFCA06C10BB2C315B1B676C40762F8209C0EF13CFE5FAD76CFC17FE462D8330F78BAB072C5465F7A26D047FEC4BD3B918C9C761B91B02D820ED7EF345E79A66FBA61AE13D3050A27488CBDBE693B800F1E76C188EBD8118C9432EB9E7124D35A1A038D237918F1DB83304D10AB5DEDF58C6951A92AAB1A1A40E180254E730EB43B566A83CC71FB6B9749BFCD3A90B964966CAE90FAD7406A8A89B1E48C885BFE2DB41C1996F20DC9A8DFCBA1A6F2F307EF8FBA5EEAE9631C2D6328D90F17679DD9E8E9660D6BD4C8A1D79C47A5FD46BD2ACCACA2D5C6407B0F7F31D093CEEF0342C67DDE3F1BA5067ED1500DC45161B8636255924BF007C4C870990C5DCE098C5A26386AD84D0F0CE4860349A147A4E7AB80151FA63882590B91C6AD3E70A68E6FEC1A2CF65881A6DC38048FC14DE71C702C934C5D3C4CF4C474F906C3400364BC400A7DA087F94F1ACCB68439A9A6FFA8C6439B2CC5C0B17A7D649033798429F211D9DE12B24D117583E1C425C2C0348C625CC44E9B976D319E72D4E09D5D6F36EE243F5FBCB190E84DE56EB680DEC8566F5A2C7D5F595116C628CA09401D561BD78356C634419225FB01CB637C46A627F6026D39EC1C62E9A3E85FAE - -count = 84 -seed = 483A81716F91A43ACA6764C4BD2A57C9156B762E9174EA49730A6BEB9CB19A0B3755E37BA47EC524BBE2FA25B9FEF687 -mlen = 2805 -msg = A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F -pk = 10BD7BEBEF20867BFA68E380E0BC7A5ED222A11279FA990C92DD2A1B1CE78A1A270FF9A104DBD20C76CDA3575DEE0FEFC0EA2BA9AF72DD57809A8C4A5DC54905 -sk = 10BD7BEBEF20867BFA68E380E0BC7A5ED222A11279FA990C92DD2A1B1CE78A1A270FF9A104DBD20C76CDA3575DEE0FEFC0EA2BA9AF72DD57809A8C4A5DC5490502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019B2265E11DA1A693822271FCD7E39FB8CEDAE66BF406FC013A3FC5B259F159A73B5A1776A69D9018969E776528B04000000000000004CF91FD1238A1FE61BA067DCF33CBEC4823471D87FE27277EAA07827C4E2D08BF574C0C0D4638A9B1C0D4E0D7734FCFFFFFFFFFFFFFF70AD84A823D341132C39C90DBEB1C1BDDAD182E1E4BCAA9C6FE742EBBFADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DE24A8DA862B5765034CA0AA59E690463A3D3C673C76DEF02F3C24A7F060000000000000000000000000000000000000000000000FCCCAF1812F3CF8559DBDA1E041F0B510012CB31DC8EAAAE5F43A5EADC965B2DEE90FABBA551CAF82DFE85072F3B860CD22014F98FFAA1C9D6084C80DEFB381768F5CC64F81C9E3E97D8854979E62BCBEC2A21C388C6948DDF0AC498DF4EDC0890450D62C840DB1D9255E9977F4668AA068365896CAE2EE44A54C80F0E3D8B0ACB1A34B232827AD848EDFD91C6B4A08CE718440F749D2F5AE0D2B7FD35C0E7171319D16C5B8E179061B906C70E6D08255772CF3A2827A38FFCC391A059857B02CC999C87A43C4477396F8E3845DD09749A110E6B937FDEB9A26AB2B61742730792D42E4DF3D2F3262F6B0151E95D64528A5D643385DDEED4689D2E69E20934281AD878C1AF5D95A3F06C1F810919D38976A40C952EF7AACA510D930EB42E9909C8CE179D56C198CCCA31D6AB0093FD94D520E2B16792368589F76D835289CC1BEFF7C62C330A195E0F6818E6CDAC5F52EE691084304FCB7DC1C9791DEEC989205EAD1D7B42D7213941E214712B352E58C843BE55DAA180C3DB892F19F3A0202EB699FB33BBB992869FE3CCF9562F4560A41B78A978FA095C0CBA770E850E1F0CF135D52F4EA1670C2B44B8B5103E9201546FA977320D578017FAB19782D3A21A -smlen = 2982 -sm = 32B24F81ADC4A56FA3002461BD2F32F534BC390129B99F4201F4A7E96B04B048483FD3001897800695452024A422F9464406460E4EC69E2FFD6E9F0767971240B2A1DFF308069490DEEA79AE5A821902AC18869273FFC35EF503D3CF514A15469EA7590068C3792202C9A21E5007C32DF4E1A263DC406B062D0FFB8B44CA411D7C020B4D49E51167A9D4E50601EB4C1BEF0AA1E4D78357FA40AAF0EF540C019746E82967338CD45B05C18637F2819D0902A7E941D3C14E2DDB4F971C9955868ACA753A73E8EC6845ED6E9D3B444C826480F03AC771F92E94380BCA7E50303FB79CBA608E351A1A67BF217B9816E2AF9F89BE8A79F661470CA16BFB2C99EFDE97859AD1D217848289EAF543005F5C231599FF74299EC2A7C737FF94B7465DE11F80E17D4FDA264DE568D8767CE822B3AB9642D95BC89533CE05FB331B86E3C5A296E4EA4C637EA458BCED1F89355C0270D083D4920E72112CA1ED486191748B4F730ED52F9803D05A0F2F065BE03B2603D6CDB154DD7765847D656B919B08969E41B23F9D376135BD5D924529410392ACEB004849550E6CF2903181C9A395FD469B7DE2C5060ED22922AA4D7C782A33330714A0AF206B29B4FCBE0F12C18948F6634FFD7F2710138020E273CB0DFA735BDCDE9BD6CEC898C5E564EC71AA7880D97CC711412F28603DE293CD5E904E9156D4F6BFE2BE15347B9FF7848EB51CD0785D6A649EA3514E02695C7E3C4F021A9992D67BEA1D68E5B17DB2E0DC061CCB5ABABA49D110055467F9DEE61ABA8F3E5C713E94A8A96C3A8AFB698887C1FA4ABC5157CED33A834DBF0F5AF9EECBB5F2AD7B63B4C2CA94A117C2B92F3D51900926E26B101FBE6207AB0884CBFCB15F9F98F95B0D08E29390977F4D3DC710EEA3AE7433D5EA87A5F710F1FCEAB26D516FC19FD272F6B0F01EE167F06E6C33273481F280CA64FDA0549C8DB884FDD467B93998360766D4CAC4C8DE783752FB6C6D7B1E47DF23CEECA572F2AD3E2B628E31984B9054448ED1D90658BC658A9CAEC0485512CE084A535E7C8196B8BBCA5D26C105C41E083F8D56F1530A8C1B36A7F3E41FCCBAC7F342B2D026064B304444192D4873FC57978E44151896EA6C0F13D017F683B203BA1DE677ED00F2B737C4C69E53ECF16AB918939E120E9FE14B2243EFF0116B24C6654BE09C582F1E62E75EFD8593E62E45AC36F717815B854B47A4DDCFC91FC533FA85BCECB6E560CF11E46D2F334B396D68B275E7404A70F2A805A64CD458A8E5F114A89124BA1866F917749FF32E59EE71948BD97F2D4128BEAB8BB0B6B06D84C6D466BFA30FD8100E48D951D0B3E787EF9611A56FFD64D970DBACFB1B4DF064B1CB5DA9918F5C58A10F0903B64286B1C1AE5CBD00EB8B363BDD7A7AAF2111C0C6E86E15ABF6C1E761FBF027425968CDC19522B44FF3F56335C59760FAE6D9028E76B284330F7510F2B55B6F46ADF90311CC785D35C2BB49272BE514CFBBD7A2B7B2E8C0B6DC28CB683D3D581F547F83BBD3B8C7B76925E44E6DA89D5EEF17AB0BF4213EF9C05B7B473901D483C647F416B98478C7100919C28515B617A27321841BAA174C1A2D3494395294CEBD48EEA14BC3106CA9C69D9F6485D6ABF1C2B1111A8BC602454685CA61AB4EE4DB9F413CAF8F0F204F04D40CD36FA5DAB629CB53876DB3E16372E626B6BC892C63C6B6C503C9D22EFE113927395206BDAA4B83D4FEF4FEB42FA7A71F7CE2197FE282A02D0FE50F96B1F917A67E50EB79CD3FFEF064542F7BEB51AB05B56AFD7AEA5F4164CC9BA37D8FDB35A3DEACF0CFB555161E7E41EB798160798BE9D01E3DE0C4288E0BAB19AE398E94353ADBE9A43524ACE35830B82FCFD4B1DC2800CA4C38A56B7CD28BC3E2F69A0AC4655CD79B5789A2B72EAF93B018D4D6F4C983D08932B22C85AF6FB07DF0A786D98820E1B06BC17F62D6E39739790A13049252F1B9102DC692CEB20C270FFE9B902AB7EC5A4EAAF47F7E2D31B2195F5F48AD18D099C33384141DA14E151BA57F6B1BB97901457202CDB83B5C713BD8A13F6E3E276C7D6C130AE287CA8931D9EECE06AB7CCA124D6D02D497D55EA9151A95E8A4DCCDA72D3F51A7DB3F2879918753683B01BA1B154DA83E6D84DDC9492F2DD8C128A30C75174ED1A6B8D93D08645270BDE247782E882418EA158B2A2153B2D8F75C09932F324EC199D26E9F3C4C4CECD807367E3981E137858B98BD1268D2C894541EC99BBBAD19A6856EA16A1E56B7B193BAF79AB89D4E76327405658C4ECB5A8626302B3A4618AEAC7E11A1199C4BB08C60AD78FEA4827B59CC883B2CA7038D7845106DE9174B2B8C17267273D23418AF560265000543ED9886884912B4160FBD372FCDF706EF642CF1829493884B6CFE946ECF6140106DCBE11B3746E33FBD4B5852B732230B9047004F4FAFA0D4BD7043C7D6595ACCD1B2771AAA76FE05A0C80B7B221DBEF79950FC69147816CAD0E52C05E72CECCF55FB4DABD81ECDB476417DBFDAF3B555CC90573CBED9474266C89FC55FF0BCC55602A51A1B5F91E425A1A58DCD4ABD09BBC63933FB4279B9E21298F9FE0CF1A93C4A19695240E8978D604047ABC7239F5053EA650D781307C50DEC4D5E2360ADEB9AA02C0F6FEC5784784A271169CE456E1C32BF984C3323656CCC588C97E0ECE5A40FC7B4DDBDDDB764EDC512DE63270F07891BD160F78B8ECD3A4D11EC4C68EA0A0FBD0F23AF9AB261A110F431F926C4995B05462E0DABF29D9660ABBC660C9A675628270CEA7EC5AE9B6F298B17B2392263700B8EAD9C845AD29CCF109A2ED66ED5BAF9C935754AAA1B84BE2B5339F9BF3CF5E80AF16967863FA8DCA64F5FE873DA4A6D33E39A592749B721FEC203C0CAC527CA96DE7A96CE9A540F5DA1902C97F960A05EBF0C32934F9B81244C945A60FD3F176DD8C261690D8EC98D19607129A50EDD51135FFBAEBC04A0961ACC5A32FD058FFDF2C6866BF90A3E177787E7061BD2011EC08EC118EF0451CAD010B53C68D0BDDC701D10920D697EA3439B1A0F96E6256B7712F59C746D1C74C20B17D461C3DF635EEC83E3B8E098034F119B9D9A79ADA735158EAC3F434E805444D5EA2EC85CC8ED8F5BCCAB7DBB6ECFC2E385781579AF1263D9FD32BEE32E01DB94703B5C756B894DEF19783B12BCE2A1A8D29D96F329CB0791D697BE7E0F05DD5C9DADA52E1B8C1E5F75A0FC90ED8C05BDFF86644B1EE61989CAAA271061D4222818C894AE9ECA2DA7326E5C24CA1EEEBE3720D2127BA997B0C572AE30615F8BC4278057F4762D46A39B934DDB2A0903FE1568C1BCC6C37E1F7C145EB7CB20A6A4B3466A7ABA58B48BE94F7E14CD20C87B2768358D06E3F607FE5E9DD1AAA8477975660F1E379B9EA26CC00CEA8CFD6420F2FDC7EE6393AA17CEF88645B821F8F42FC7DD97B0E16C04631F86ECF1CB76A6502FD1C13917CEB26A83596B117D5336387DDBEA56162E8A5BF2FA35E697245BC7210CEC13BFA694AE884582924168BF8EE2F61A734E37876F363225E5AE19B7C65CA6AFC31C8B37BCCB308A9C27F3E9902DE365E288E6CC46E329E78BE914B85EB980C0BAD932C164671ED395D5D8317C133E2E000A10E0D20D0F408019B33D9A87ED7725EA4C5ABAD67E0CAFBFF31DD236E59DEFAB7FF2CB40F479B56B261A32656F016DECA5302A336CA15D10E0AFCD168A4B922B79C11CB21881220374492D64DF21453B41346A85174A0A4A3C1E973845C856CA70D6D25BB854D0C6BD3C75CD73998C7F64E35A58DCF593C85C2440A6ABA4E470F87E6F9B4ABE127B30F8992D8AAD0BE38F008D9D937582EB3AAFC68F516D5AAF2503ACC96E59A151D2D4B072AB6B38C54928D6656441C709F1C1B770CE6EFCECE11F8B3602EAB63E0C629BBD8A79A96BE4CDB072780F3D287B091FC94FF2C0D347FE280BBAC308644BDB15A3C653863EDD945AF0AE725507507B82C283DC9909CCACBCF357D7A19703401B6E4474B94A6CBAE575B942501A281B8166FDC70E6B4B60C2F57A4D66FE1197D301D0E0C7BEC12CEDF9496BCA2183D04632711A79C8374B6DE35C2EECB0239391C2019C720894BC7A635DF18FCEEB9AAE16B3CE92717E2C56903D20D0712EF80131B8C48635163E97EFB1FABD1500D061C93AD935BE9A65A45A92E4A4E885268E712EFBE5337214701BAAD4C73E81E73BFF19AF131F0ABA105BAABE849F - -count = 85 -seed = 30F0E117513AAF27AB2516BCEADD1188B4BBDE76E57DFAF43CBF2D70723D941E8F875C5EBF02BD7D67AE81ABCC54440A -mlen = 2838 -msg = E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D -pk = 72640A8F36A186DD365B937F5BF32ED2FD8D8D1CC7475EE762A3FA890540011BAD98F1327699C8841500AC670EB08A81EC1A11025CBA22A48F666A62574F482D -sk = 72640A8F36A186DD365B937F5BF32ED2FD8D8D1CC7475EE762A3FA890540011BAD98F1327699C8841500AC670EB08A81EC1A11025CBA22A48F666A62574F482D020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E56857CD172A93E2AE650889E6B07624522B1E56DFD476295EA3C33EF20E78427655F79E6C04C0DD7D53D29E3EDF0400000000000000880F5894891090334EF9F5769D8F0EBCD872B70B009D8B4448169A7F36E5D667FD5CAB9AB93FEB8AE9C43255194AFDFFFFFFFFFFFFFFE07DCD2ACF69C17DBB9D85B475E3C2B92D121D28E174E1187673CCE57DCE00000000000000000000000000000000000000000000000085EE85B6CF2F38EC0ACC0D35C3B4078C9A775070933BC014BDF16FD528390800000000000000000000000000000000000000000000001DFD451D69FD45737141B4C5AD92CAF6521AC3F4FE26ED448A12EAB104BBC52FD25EDA6C54330ADDE617555F19E63C9BBA729723294101AB96654C1937D7F00D63EC514ED240AFF60EA82846B7A1000E95A7B50201B04EC4C276FF0D0D9D31152A5A8325D768B69C661BB01D9EA9252B2E7772677079DDB01CBE919E9F3FB008C124FEB584715438ACF88EDAB24A0D3A135FDF6EFB07DFD66E01EADC160D411B141C5CF19D0CA7070350436D1147BC3217F9D389F0134A66B60ECE23299DCE02C115B3216B3CDAECB2B70FB6DBEAF6E3B00D13E6EAD410F82041E1AD927C3D2D304C5CEBAAA0EF7D9786EBDA299B7B8602CA91B7FE8AED1A0F2B66B397FD5F2A87E8A4E130F57FBD1D2EA8010FB4905FEF2969862E722BB0BDB19CCDA90A8E05DF46BB5143A15B403D1B87493C06120BD61937DAF77AFB29F677B60D7FAE2F2D3AFF8C9AFD9BBF05EACD83368AA859F38869AB8DE22F63307251B9FA47255206022A0ACD3BAB3E5B2068C6AB7EF010FC8AAFCDBDBF8DC3C3560D647A86DA5631E2C5C5BAD8C5F9B535C0AB836EFC9D85B92F8EA9BDD7B767B6CA5C28A3F70C29CE49E8CF26180E07C4738D770E4E1113619DC570C8F1481A8837B5F26B752717 -smlen = 3015 -sm = 9AD664040D76841A5700DA94B4E472677CCB3A03DF93B4A5601F1731B5041D2D3899521D2841D306AB3DEAFA3B1677C32803CD231310EEC2CFAE08035799A8199E250F27B40679D0DF7A020EF6DE3A006CDF52D934583BC17603646DC3BC53B5B8E016046790EC3DC2FD218EE807C429D105285EC1A37003A42F16B9501FEB03BD0254CE31A58C432E2FC2020131F07420C26B4AD84A6DB856311016DB0E01D915B64F70EED0EAB602B653EF7D58A95801E43EEBE157E43D9F54130C668A153907D65BB19856A1B7C2FD5E2C770FD6BACB13BAEF951EB758485C128ECE4F3E9377A58A45EBA1C3A9CA5C94B50714088700D6FDA933ECE3A6989EE77A824A9E99674748A90B7F227B589250C9E156A8E50B74A7F49DE036FCED86CA0D4C02E217EEFCAEF7234F651CE4380B86389D7331C7657AC283F58C781F904405ACBB68661310EC6921C1FB7483E74116378086D4A0C9A52AF9847BB3CE0FE97F5A7C2CF588DB3B6FD725CA83391656CB38FCB6D79531E56F5D42FC0CC20D04AD7BBF57001BF2F8E6B335CC57CA2DB23C247EF9B75BBBA3159030975D65B9AA7C10E0FA4F615F77126D5271129D8839A3F8DA30C79174373C4BA643E4C4F0CB26BD5B8B9F7EA56DE459EDA15037D8772478FD9F7F7E06F3B422DF0B425DBF1E91D3893CE20F78CDF1910C5D4674EFADF122F41D6C7D6290DF59FA029BD82E792E758AD4388F9D352E9D2FBE3E58810C380D1CC5768865D24BDD92145DBD1EE0D4724C769EF5CEE12DB2AE2708B4C8C7865E70CA31386388D991D46C4DC4DAFC5CE66CB24D455BEE01488A7C764A308C7054572FCA0CC74A01A2B1F191C54146FB1AAF55B834F998B50909F3D003271E6504985DC836B5C44655B938769639799F2575BCFA92F13D32B283A5BDA11177CE1F66D6B30788415BEF598773E87B4C8C41F0CE6633B6C945A3B4C46B74F30945EFD99CF3709FDAFAEB4BD4C6BF605F89C7A9B4EEA1A6599F0A32CE3F2C58587EA8BB3FE6495D92F2FEEC52BEA3DE2047F5EEA7EA1453C762201FF1291AFA87923107F7FF586E00D07824EE021649ABD2D6E9EF11A1D31726EA9277134341EC57D790949590A963D25D6FADFA9CA21E43ACB7E5ED4CB6E8BB36377C2618997943CD100A927D395376871ACB9619BDE9B1FFD5E48E271952613875FA3ACD3E1F2E872F1D672AAE6E2A575A4FDC4FAE2DC6A7196E7EBA94AE5B49BE41E7295433ADF49A6D2D945F43699D444A726423CD9164B9E28B0AA4485B0C767A9398DF5DC5F23D27889C14B1ABE98880E7BD5DF9AB3D1321D5493A0A8B91EA4827627A9B59308CB0104CD8DA7D9DEF2D47B27074BA007401415E900DF03F251C8AA425F0FA59D74C41BA7A9288C8E280141CAAF6C6932DDC4184F81F5C33F0FDA005BF3FB6A0A9169A709875AE475302D57CE96D3DB332188202597FF29D1F9EBAD2B0FFA27C14CE9CCA58C923283BA10E9FA1689D6C2B8804225D706E09FF97AE9CEDC27D256E8736DAA54382040648F2F6BFBECD6C3A9BFAF5D1ED23EAD00EAB351F1E0BB4C719AE6A1F5D12E7F09ECEA62A2F554B18397FE1400DA1EB6694635D7C9C626E0FC82CF8DF6AA4CA88B69F78CD065C53F929BAA58507FD3E3D8124C4BF287D452AF47AF9F4D926DFDB529A8ABB8BB57C5C7611A97053A0CB0B01C754CB479C6CD3A3E867BAC33E45EA0BB6BF77E0B2EC2F136DAC0E259FA309FB5F6D8E7005E1696CE203C5D054E5927A87A1B4E81E73F22FAFE61D7D64CBFBE519D39E716BDCBB37657E71B9390FF04B3C01C6F6842684115CD7F5AAC208EEA48906890248E58D1615634CC1263CD3ADC14B67F1A1A8ED2626E7237AF5488F5D269973F11458E3E4FC2EE35A4BF49C2F5F2361939FA243FA8F33B54EEEBA9B0453701E367A7BF4D698C62DA64732652C68C20A956522826F8E29A764BA93DBC98FCC87E59A1423886694057E131333C5DCDFF3BE7A1F0D344A2DEBB90051721E0226178DEED353A136F69481F83651BE3281C562D6127914CD24C38FFB327786086B08EBE89D03A33BF7B5DCCF90DE9C4D907D308E08A616C5343C116A098786383009DC70787AAFB4529CD27CF85F946B8B238AD2F00DF109FC84CDB48BB52B73E1DE066636176E8C6C76216105486C553511DF1F0664EC1E04EE0B0BD74A08070207486B7F326C3EE73188AB5BB7F8F5643093916491D62F0DB18675BA4CE90B2AB310BBA4705B65A581FBC5E76842A99D4926AE5BF7B8EABCE5FA30CB98C1BCF0E0708DA970096234D47BFE23A4F9ADE29BE5A8B6BBB748EA1C13D00388AC90B65EE10BE6A9AC422EBDDAF5482422AECE19E702F6D26ED954D4E489CC48B2E39A6F168E98E11C1DFCB4A843354F1AFD447962E5090CCF51DDF6643CE0AFAFCF3E4363187E69C31AB796132EEB04F2D4976A576B9BC8D9B1D491B74613C1AF32E3D2DEF408ABEBCC27E4A915C983E10B6090FB2DE6FF9E60C96CF4F940B09AEC048E7A174711798FD76DB15DCAE0E570BE3AC147E2F8777A522555B0898BCD7B04ABBF060FA72B04604C9A583FEFD02B2AF9FA035F97DE4DAA4EE777F9D6985149DB6C2F0A33EE1A1436B38DFDFF87F831E83399C6A884273E612433EE3958F37C99A748DF151E3EA011F4DF5F0050597685E0230DA1B1C7095E1203EA7099BA5C43E58AB0EDA60AF65291C3CC9A07257D71CA6C9EAB93CEF41294853A67A5B11F9192C96A36C701F142DC36B046218BEBAD9904FB765550598F8E2F49F5F0AD2608117196751E7E4C5CC4C3EF425A921C1EE15F37A1F80DF1E24163CA145EDB0FC4D988B8C7167ACF9CD94F919AC96E5469859FDAEC54E1970007EB9699342A9AA044A8EE478A3ECF8B59B0109EA7640C218ECC1E8CBC5E2FB61A1748B7C038EFDADC2D096BC29D95B1BE770D097AFD8B0FE02173A1B3D7110F80D6C849F1AFD1B01A60894B16140F9B34D96071A753545159C4FFA4DBAA938BDEC287C6B83751C5E699724AB355D1FA0E081DB286EC83343877C520E856C4ADC65322AEB39CD87B7D8E4FF9222E085ED84C58B7FF513AD77F8A9EFF2760A03F69AE5DD14DD92DD3F2D3D98E97B1987086B3EEF2F2E822C851B7ADD83903786C050F30C4A4F4BA9361E49ACAD503E2A07EA119752E12D4FA09DC83F7A48EE3DCC1F09475960B6839CA736E498A128F78E58279063D839ABA88AC9E5BC24BC07BBD2DE1CF2E1CCC5987E63F83780D0ECF07EAE21C8C752529735B37C980EB320DC949468C69B17DA8AD612825A84D0529EB97FF8C4CD225FDFD1563BB6C5360ABDCB3339434A298DDCF5F36188F3AB501E505828E8D2FD6DDA062AD415C56414FD7557170F0F57BC5A401FA648699F3C7F7FD8F1F058849B817FADDDC24726DF851D3644414F55CADE30A5764914675D574EAD4D4DB8725866A6C51BF0EB23B12FBA1E101A6F3BDB98A2884D0F2B8DEB3F279E9C38EBD0209DD05C0FCC6EA715257355D0D6BE2C8BC7835187CDAEA43A8EF9C59E88AF6AA667A697A3DF8BDE250EAF4341A835B5EF93CFF97656133B49E13213949A3F368D985E0D6C793319F4284DFADA383137DC5B000B7FDD85F27865DC633562949BBE4FBFF75417AB109F03015BD0F67728969435EFAE791AC72C6AEF99A385A3E8B4C35F58380149C653FD78391A7C3B26A3550D37F9639164979288BEEE99E36AC6F44D0FCBAF0D210839D563A6249059A30CE6F047F5D541FC8A90A18610A8BEFB9493C5AC804D34D40881CA82E673788870705BCD585044B11F1D9BBD6B17D8B82B7CCC0554D1E3AA7F2762FE01385571C9FA7A103D07C1A209504876189DE4B3C5910C26C5F33EA725A7D57CC30A6EC8F3EECF2409F1234A094556C0F7941CFB30FE86F208FEB73C8E8EA8623640AFBDB1CC589768A714CF945731DEBF4519B70870FB3A50F1FB368ADA3FB217704A5D46D879CEFF9BB72667ACC673CB196AFAA0DB1160CC2CD7B260DEB791A94D0988ED54B7E45F33E7CDBA0FA105F3AF3CB1521EA382B1266DF304C900BF53E195CED03871A22C50DA166BB9441CEC83607083195D6CFA17297B678ABB5E03950160130B47E25713B0829F64D2552EFCF404F65798A86D5899B72150A91BA00F7DFBFFE82531497B60C31C28992377A2DFD5FAC8A9C16C835CE4DC24D0389277E6355C655C8A33C89BD48F55C13EDE24B9BB348DEC89612F0905719743C95C0E8B5653855676CE171F812ECA405B6F96F2212D1A5369A11379282AC0C5AC41D - -count = 86 -seed = 070FFB907EE8AB7152A9D380DEA2C4C4796780FCFD80906C5E489B917A45D5E7EDFE6F37C4420E5480E8BB599FE36451 -mlen = 2871 -msg = C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 -pk = 5301B12CB2300346CB97D6CE354DAF31A057C67C48A9771BC4FF8AFBDCC577168315656A710AB97ED87974D5B7B050DBB6DF9AC175A249EAFCDA2132D78D0D24 -sk = 5301B12CB2300346CB97D6CE354DAF31A057C67C48A9771BC4FF8AFBDCC577168315656A710AB97ED87974D5B7B050DBB6DF9AC175A249EAFCDA2132D78D0D240200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F4A10CC489B8AAD2B0965FEFD96A49FA522F436A7417D2DFBDE245122C9E65D7163D5EBC44662C2D8F0359D13400100000000000000DAD026B272C29F6575E9894C5065235C00FB2D1D162C65AEF5745A804D3DBC56C76A5D7FA0ECDEF69377E0B55F62FAFFFFFFFFFFFFFF5A5B590DBBF8063D2FAD56433E32470F1A1AD8FCCCA7E6D035CE3E2A42870200000000000000000000000000000000000000000000000FEB1D68DA1EE4282EA093FDC6071FA416BECD377FE0E5F53D54E0CE286C0900000000000000000000000000000000000000000000003D90A46CC6F754FDD499565051F36D57A28A88C09EE91DB35E4476A262993A1B0B0F1EABEDCCBB181AC2F2276B37A5686D0D0AB56731D13841DCD6C8B3EA780B7A3210A2650B088CC6C7DE7D2F789F27D07E03DB166AD23BD23DDC87F43DFC1C6A334DECFF3D0564CD4A5EEACC4B58CFB777BDFFFD7007FB99C052E7C5540A32A1B3791F169C5E6852F383F5C88FB6E4561D615BF39894E1FBCB72EF871F1B175B7C613BD57E910F9238B2E1A29AF26E8C388DBF8AD44DB2E893DD40DF62530E0EFF29E376EE4DF999598993550059605F3142190DC5228E77E1C6B2F99DA5217C1E21457B0B6094C55C8DFD4AED7AFEC78936112720DB4CCBCEC11E8239BB03CD1AE3F843741FA7B895531AFB62F4E42FBC3DD3CF1C82F482DE97C68FC52730B68B1C32FBF2C0C72F695FE1ACE124744B12C9CF871FBF073B077D288834DA0C5BDB2FACD9C54E71CCD49F4B1628787082E6B2E110517D21B7FCC12FE7623E1ED36FD4B73D51B4C0395BC8E1AEBC1E14924F44CF2653E779D083BC6D17DB9609E3444B02D546C4729B662BB440F4755E20A87EE86BAE5885D770CB03FEC1991B2AC7DD83C4B2AB235492DA10AA96BFB5F676FA6398E106300B248B4615780514 -smlen = 3048 -sm = E24402BAC7111424260233FF1C534DA55E6DEB0267C7C3B873651354670042E2655B2D19E10CF30353B3F06B84A0F5B71706A6BD8CCD4E3D295D2C0075FC7CB41CDFBCFE3605D764A06E9C2595A3000612670946525CAADB1F067C09C3B498DBA9D827059F1464440B0C58802501560F2F7B61343B8B0A07FD97B63D5463FE6EEF00E6E232C0F42FEC9B840701D133858D15FF2B4638684A66A5F192FC0C03A3486F9CFF78B76109029DDB0CB5D3257C00C07185E0343DF2A4201649AD5DE4CFFA20BAF5DD43F5E4A6C81CD5143FE72865A7C036A2DFD617D96626995C12EFAD019FF44E0EDD7028F29E3657EE3C0D02E9CE83EF0A648FD7CF183A7BF7C15095E0F9278B14FDF6C983CDCF2987DD0CC085400906DCD0D14ABA60124F4B7494ADBBAE3A8D6052122575F99792F7240EB17864DC6D231721140E43F1110E73EB2E3C05049783B33AAC4E4CA0A248775BAF81FDB03D114508928BEC3169A810296B5A4DAC27E7C7F8D01CF5943CF4D8CF6EE6F9042BB300E50EEA3224D35C9628E38C368EC3B42393FC820371DB6557216A2C2D5A230FE3A7C6BCBDD89A2BE5CDBE7F783BA379B6A4237DB051E6256DCE14DCF641190A956E8E85EB2638736B899ED045636DDB7A351F5A4F4108D9D6E0413F92B9D392495299128A5F4ACCE8C7747C675EFE05ED7182DB51C515B345029440AB61A904D2A390122680C951ED4575515144C5CA80D6F14D1CFDBB5373B78E09D04D0544151CFA1240790CD31165048D1484DC4D11D05057071DB3433DF071B367E00FD38C386DAB689E4DFF6FB421B2A95FF54DC29375C9D1C18A76C79ACAE3D3F35D4CFC385199A4CCAF6C9F0421BCF58D296EC7E0D1B95A6C4BCBAC1271F94E438360A71A6440275591E41389B30CAF2626A865B9E59552CB198A1D4453EBA6D0F6FC491A8A7783B4A8BAEB81E54F9189CE493EFC1C5D830A4F637F2BF43CD86B91637611415C95685FE79966174312FDFBF33A646625F97521B5CB1F008135B824F1D6D8373006C7158E62B1F794AE34548A0C6DAC8B60C559D81580AC0D84034A501516EE36CB4082732918365A5AB787FACE591AB02BE6957AE4BB96B58E2B173DA019D3E0CABEBEBA0AF775779F14BFBA8F595697731522DF3C80CBDEC16F6ACC32659CF5DAF193178307887EF1BE1B48B5806D0FA9868A7FB853708B26873857786B974709C687D6597BCF6C7E476C1E47CAFDBF30B6311ED434C0F998C4065399C59073C1F2BAB1D46104E74EA6C976D416E58BDFD24CCD957CB431870DE5DA8763992EF68BB18075926B0E4E826095EB3B8CAE086FB1759C94B873A1F4DF477E0EE9EED8DFD7C77508B3F0C67F69BE04355ABA9344960639F6DD6B3A956DCD66370338617A365579C5993986B4F748CB7C990344B209785E22A40FDCF8F83061D37C9F1351B4473D6C74ABE6B3EB2A7D62CA0F0C88A0AA8A46973F781DF0126E8D55D3E9C41C2E3884F84FB0A06C484CFA0C9A0DFB8CFD573749C711C7C236B0F2F144E1BA4DB2525C093DEED29434FE43CB3040C5A374CFEF33214FDD2D660398E91BF070A4F5F9746C2F08C41256FD5E955891146FFD38B155987E6A0FC47AC2A5950509B9E2C86B9DD9929378F43EF3935F1562672498C5640A22315BE15B001D4B01418DF8EB41DFE5C570E850582D8916C2E7FC2B728048E24BB9D1E8283615E039C16A2FC61011631BBD8F2BEB24ADF9552CF5797CE05D9D1A7E7F3F5455017B127D9BACD32BAD0CDBD3991BBCAEA5FC988EE7AEC0B1003732F25489EDB0A1F9897247CBC40E60F1DD276259CE19DECCB90067F7293A68B683FB5232ACD2217B8929859109D6852A43892098630A67D72B1CF4BD5D58E20C5C18B85D69DF74EE8CC69BAAC7DA48EB71A160F03B68C6BE87A4919736F14363F004EA3F41DD37FD8E621BF433BCA71E17565E060F3C0F889515D0A8C17FE0D6D734FF756256B0A62058B95422257780DE000557DF289F47910CC272A14BEC737C0715F204C49F03150082DC904A5D170F7383F04F1E355F50F80D5461CBA53490BB2E9484806D369D61FD00ED1EE5BE518D04A24503B1C4C08C7CA084902A3942C04143807203287A985EB3FCAE3C5309410CD9B9A548F54DED44321CE8C2A04679841DAEF7FBB6AA11091D240AFBB467D9969C31C1CBF6B24F8CBFA20CB4CFA404B1310400271664763E9C1CD1B6FE5FF2A0FAE22AB14EFC016CCBB19C5DD5D047750DB4ADDEA3E7A193128A5F4D7BB6358F21B39A44259695904DE3440BB28CF9466B562065C387189EAC2F7522C9385DC2A607F6F9335FF8ADD47C7BA932659AFF69B1F26EC8655BEE4F97FBC846E48111CBE25524873D1DB2F2282D0472A2AAA3CF491C26DDC5E1BE77866A3B692E417E6717A4F4454C56F97F063B9E598865B6F71136D65DDB0F3CDEC57DECD5A57366BA96E4315A88B4EA3479321468FFFF508D23B0701A62CE0CBC0FA37C91CFF5C5A0433FD61AE11A922575F5BAA714DE46A58D6EFC79BDB10C9AF7E9950A61D44B3E17E3B5298501146485B562B1570FF5798B47641D67091CDF90902B2D762E3EFE94C540DE4A28269CC416EDBDDD4D43AC2FA82D638DD9BF11F3BF22FD81CC4BD4759D7D864EEA0E8E8AB71796254B278CF9B650D1FEF38B8437362B2D69ED84C54498331C6899E20C596FEE7CAD9ED8D83D86774AFA6E56A4ED34B0B0842B21CCB67035406DEDFF0CECB0CD089929ED5FFA0CE210822444808BAD99AF603082BFE5C98EE4653349F8A43DB64CF90190C96B0446CC9CD23E0D75B47F54A731E8BCB0A4C67401DEE87876011033D2A526067FB73786FBC1CE696130FCE5D5379CDAC6788875D27C04783B1E2EF41063D57E3D6560D1FF48882C39131C95BAE5A9C9392DAB6CD17EEFBCF61C464A4DBC08447443CBBF3FA80481F3BC1A5806042C07F7A7AD435875DDB1001565EB6B7B872CC6C853F771C1DD5D9C16BC27ACEB3C7690125C1907C7CE904852108CAFE76351269A3D3EA8812FAE4FAE35F0DAEC8E8B186F760005524998BB5DE475E4DF85209DA915BDC972218AE7DB7E2EFA05A7D752AE61CF2F3DC26CA2D282C8E32B4838524BE460971E077348290FA0043FB7616D821A71DDA3A5FB76BFCE0DC84AAEA432DF32B05133A26B46165297EBC45024777A868B8B1B0DD6F97658BE799BD366CFDF99861E916F7CF06C034E4F79594F1BB6ECD9B7347911488928E1E473C4B8C73297F7ED845B9EC59020373EDA57A436C1C9D1459C6114BB6258543D8F4F97B10AAEF5A2E082EA173EE69702D83711FEE6AEE8F6B260D03AB74C3B5D8FDDB81B208E16458511270DD1DA295F25CDE7E44A8349B60BF0C59D4B425C1FBA60D2BCBA47B906D2830D8D5C091DBA756E61620D78B2DFF28407FDC9DA9113CBE82219BB2CC05E11C70D040BDE821AA17B3E981558961CA571E5D5041F7DE047A1727D9C904DEEBE561DC6DBD8876BC77C27322F512D6171BC03871EB0FDECE70F119BACB41D1852220CFF26110EB0EB78E39AA1B2A4C2E78679F53683520C5A57FEA71A8E96E0AED33118DC4BDD035FD88F535B011D9C7DEB6F406A072AE6C091016ED10A5A4EE9827882EE27C535262D1D745AA5231736F2DEEC8A6017BF0DA36B416C98AB71C6824A6EEFF3564665007C9E850FD02A1F5E201B534627B92D21A493DF293DB9F24DE70C7B49A6E07ACF2DB6C90B448681666DCDA318C08AAD08D3E257AF7E774C75DEBE3B3C07AF683735E87F205B0FDE07351849C5AFD07D5722C6AA17B6AC2CC3551C305E6AC31E3601A236961F6618CD3A0F7DCF6F65B8EC82E27E44C8518CDC16ECF79374F796A3DAABE2D5005B25576B35B021497C5A8F9B98DA68D80E56A1CC1044C04DFB11D36CB147EABFDAAFBA0A93FCED8675D7D6A9F999785C0E7346F4C68EB17C0A2409E2F5BD4AC5551FF66A9857C66F642F2A385131377B6372884C417E01BFBBE1CA748AC8969BF2C0BD8944767746D1D57D862795E8ECF9E8A5CA122D0259FFBA822588C5ECCD14CC6FF4B7354CB572F5BD695ED9D85DE131FDD97DD5D6CE7844DDF9F3D112028B5125AE7A77A4AEB2EBB554682A26F457C43FE96D67C90BE7E49FF443478E82D3A48680D737D1260B8210BBE962EFAE6505E496B1B6D4F1042A7B971605E2DC50BE3BDFECC3010B9F5618D3A1B2C1F48888B859E4D6B63CA9D29990B6D502FC22B738B203A83D597B48D73C41860E4E99C57181F5B02F108CA193451025F3B368CF2741244F42B27CB9E57260D2E127CA166B32E0B9C927B247B31619B1D4 - -count = 87 -seed = EDBCC4F6AD0F30066947D678A368B960CCD164889D77730516B444ED2DF10B49C101902F5FA227377C3163A0045B34E4 -mlen = 2904 -msg = 836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD -pk = 3FB66CD85D5093AB4B53CC61C17C12BD1BC054578F7ACB54FA95CE3397DB21106DFD896379A1AE130AD1BA0B750FC19CCEB03C1EFC9AAA55EC6731303773801F -sk = 3FB66CD85D5093AB4B53CC61C17C12BD1BC054578F7ACB54FA95CE3397DB21106DFD896379A1AE130AD1BA0B750FC19CCEB03C1EFC9AAA55EC6731303773801F0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001EAC8E66DAB3483340C491EFC63B38EFE66F4CA34F56114857DC0680E1A35710B4087777D54A02BB5A7B2837CDA30400000000000000FBF0BEDABCEF993085FF9DD6890B2411C1804523517EB3327E57679E7E29C71002036B389B18A4D3F7FAB9489AD3FAFFFFFFFFFFFFFFDBAA856BA0F1B8F5F66E86D4D45D7682F695E49F1FD086A2CD28AD5D0711FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE21765739CED5FCE254C3008B970A613FB8853ECB0D8FC92D47EE5BB8EA05000000000000000000000000000000000000000000000060A868EA8FED58FC2A49426BB20035F2D32715300029A858136019DC74848527734006DAB2BCB3EBC7C7FEB6E4922D619A02C2C1AB1575E376789579F7594E1976D1E02AEC0AFC72C0D796337BBCFA53468302873B6B69D11BBE1EBEE5F5F20F2BB721D4FAADB9B0925DECE2438BEB49783964531F209E8E56012A44289174100A9FDF0C494865AE2AF3FA0E1106838D01D4D7286DDE0C30E62B2142A32DE01CFBFA59F81B24EFB7458697F074C50B0E2314EF1F2645ADE9C8CBBD72350226220E6EBD1B19EE7A10676AACF841B59CB528D8D3CB38A205A79342BBDD3CA2BE1BEDD41CAF42A317941FB68B258786BA320B389F994C7177396B6E1DB92A5AD11F2D49D63948CDB4E0A52C8B92D137876E2D7A9976B0270D39BC9DBDE4418950070E485979EDB78D54065A23DF85BBCAEFD6FE8177E05DAE79E6792B431E2F4D34F91AF5B6A9BC0666625323A4F5A510DE07ED0F737AFC43DF068E27E890AEC00956B2522359A6B7857D7DB1AF387EEF5C594CD04F15C746A5A33BEFFCF8DC1219ABB351618EEA3B0EC029A1E04CBF6D4F65954DA4DEE84A77CCBE4F62621BDC2D530EB9F9897D5D12CBE279B63C8DFDEE301BF66BC1E1A9EBD2DFF47F6649B531 -smlen = 3081 -sm = 022EF27699B07B120604272D39E901A2AB061A05CE8C53DAC58FB6025501ADDC67AB2DD34CC536002763214F0F2026D0A10053F4C13A84C3885C0206E0F48F895065FE440207420E1F1E65655893F2064355A0658C5777E08A004C64B84A85F882DF7105111BB5842D48CE7D9206511EEDBF99238F20E6031CF1A99B51B09E362302C40C25F3DAA45EF05405018D91A0A0BC706E0B73AF331F070987EF04023E3461623A6C01243D046E5636A838E80A02836254422C7D13F1120012FB9CC7CDAA1D8B72F6FA3943AA7DE75263D3DF814BBF2E80C3A204BC0F9AE33E4FA82CE893D35C57E41C7147602BE12455B00B7949A3195264A3281CECC3FDE34802B28C6E1F2B505AB6087D453BD6AA067B2370124840BCAC4605EE4F14EDFC4B4FF19A4D7A828E60156B49B4027AC18DCCD20294F89CCF03D0CF47BB2F22D3749EEE69EE17AB5D8E4DFCCF36824D23E3F95E959D0494FFBC712CE3975E3A661B3F9E149A0234F691C2D820000DE97CC016C43EFE958DA469F740610FD22B64D4BD2E30075E22BCFD4AB41D952D2394FC629F016EE1CD61AAB4581F62A7B8648F8F8CF02462C81023CBE2755C91195A5917FE5A8B5058ECB8DAFF91DD3F73FE38665666DBF79CF6F203FAF94A5CA3F3AFFAA2C2BD5F5DBC011DAF46FD7CEB74B5875E4B5D80B6EDB9817106B91865267E78731662218C8EDE73E588256FB1AD57232AA5533D25BFC54452612F0C2AECAE6DE19355E1D508B888D18FF9F6D7D68199755CF5C210172F65342269ED96C77D80AF8A244B43A99DEB49B97A6F358AADFCFF6AFF72AB39540D375165185F31E0F1A6F97722EE365620BC5D642F8CDC59F7E84FD8615F4A336ED340BE6ED8451997D87B7904C1B9A3A0BD1F8A01AFD6A2D9F5B995E3FD0D44DF8FBC8389B6CBB5537816C91F0EFC3D2349F15EEE747B254C5BBF9418BB979294423DD6DE4D13484408362582A86D082350CC79EBCDCC05B70110A038736034CE4F3DC1D17E5D11C9C7620D40730B61437906933193D1272F7C89C701D495ED682F1335B7E1C42C994E090A67D932A8E825F4B9EDA8F2A94B9A1F11F10E91396908A9D436DD01BAE1D1DE2C6ACF458C0880E3F81ADC2240A99E6083C9C188982713DB243028AB07DF407218CA6B3C4C93989AC96D92375834B915B724F2A105D6240E52B9D7003C67FF76F7A325D84ABBC229266BB40D1DC8784CE1A4A6BD17972CDB26C274B06337D525F61B5BF952D23FA13757460B7B8A3B99EB023831F4FBEF72D62931348622041FFD12634947579BC6E16BD1EAA8E8B2DFD54D74EFCED79EF4FF31AD42036DEBD0FDA3B7F3F8E7A3F45955F82936A67122CD42E38AF646CF565E294F422FAC1E7D274185896F58E9D0FA1FCD3F4D379ECF5B566586246216556939BDF86D6A417C3BF77C64F95D7DE8197EE25B44EEF00209D33159710DF001372C3E3D09F24B9B08B8938C522690674A7588933E1CA37D2C14DF50777806EF6FD2285771A44F6DE90475C6CC314DF140C3962DD9D70C54E58CC5FA3302D69C80C6511D9D42A51B7CB7FD7FEA8D8BD65A66FDB2AC80D945FB7EC72E138F5566CEB570968D84B60068DF20C6CDA2AD48372DC97424793FEA8D2136923070C25F47C3D10839D1747B613B93530968D5E97A3FC0F563BFFCDE7B42C839EFE66C3A8655D0CEB5AF7A37D23DBBB52D05CF6FCBFFA7C7491703349819AD94CE218912557D6C87937B2E7B0473856EC78713C29A02CF7B2B38E0DFE16804AF6C2BA8607026892138011E06B4AF179D63DBD97CB917B6507B798E58D74F485D3F063C044211E428FBFFD5AF2D7941900299602D3B15D5D600B435D9A21948B8D87A35205A3AF9AA9BA491D56573A93C35AF6683655E04A7A17F1B9709ED83E70D82A3DF59A2FB7C051ABE508601F322FFEC089C49DC666BA04366C038AD59D397022F0F6344255F4D98BBB17120441CC75107005A74DB35459C63770547A4AFE59F2703894DEB67612448BA7C4F6FEADC1717F6ACE410C6BE62AC319CD33AF285D17D55F500E364A0ABE71D357AE0802AF464B6D2732F3FB94BDB3BAA497F2E44727BDCCA5A4B65AE9DF189FF1AC640940FF4D479A8072D34ECC523DC8FC7C87FC89A540485AE7BB3F29B041446CA427C0B48CA7515A1E31788E8B53E1122D372B6557F8D2A97CDE893B20E60283954E2934AF340A358A4376DD0CFCBFE305A2CE7B72DCFE2DE105CF44833F548D1BCE88D34B60BD29B69309DD87F4B91DE10EBDD7D7F87D6231307D0AC784E0496DB725AB97656C34E60B34B230F37E30FE326296C4E1BB88C0BAC261DF0E5F45E6E126103EED6B1CA146D58140A8893D847E92D9F3A0A883E8BF830147CEDBDC7DD42C1A58A826A8A827F9AB26ECCF64F68E9CA6B68261260B659B47E0DEDBF5B077982B24ED9B36E8466DCB21EE69B5E2BCCC49A163B4860EC2CCBD65032776DAE601E18ECDAB8E35C2760D5758592F6CC074298A97FC5E82E7DA84036FD10E0725A0E4E58CC4DB30499ABEC0C7D95D88BAC2C58EB093312779BC1B8619FF2762FD1FF009273456D829394664C31FF6D7848B27174B36E59FB65D6BEF6D974D5038A28F49AD465B28857CC12BAAFFABF3652C2E22B46B040E579FB040A0FB4B1DAF0C157D35407C0B78E305CEEB232E7B7426C95639B1CF7B079E80521FAA538E51E69255576650C3A16E143D0F815D2CC89EB00AA13AF20394AA23CC6AA99A9F297D886AB9AF2655D53816E066A02CF21C277DADDEF3D7D0825D094FD8FBD5386139757EFD0B7F8501829725A4B70FF1DABF2958E07ED21DB76266A88483EE7C51A7D215E1B41D2464911ABBB1DC71F9613ED5446E4B0C97BDD47F22B372FB7662956FDCF3B108E0107F74301A054FB004925B041AF354C04C20FD370CE1A014EBEBD8311F3265A2F78B48124521A4AAE240D3BA9F94FD33CA4A92D24A029E0754831869B58F670435A44DCDD7BF75ED9FF06DBA52980DCE49C1C26BA0965DE3623F459E36127AC6AFAD4D5598FC45A95173D039CBBE2CDC7DAB2865FB6BC0FA8DFD33C4A826CFC77BB7F45CB5AA73377A27271AE41630DD3D4E2722581537FCFB233E5AF8F04CA824012B5C429EA498F4AD44AFC249DE2229FD7266FE84173A5CE44632B3650D6E1F278625D564B374C10C1AFA3F17432CBE4B65327C6B6E0CD2F99B68AB043C5C6C99D7FE7FCF940F4887D309D7BC0FFAA5DC4B90C79266514F46CA2D5477F2B84B04E30DCAFD0224170FA6D4BA9AD2A6DFA8ED73DFF9D5D40D43F02610032719A7C5646CCD453CEF409B4325F3FB6D9B9201FB115E4DFAA0B4D29959A44518774E94B2D4D6D06C7F065973BECD203F5CF6CB59F869340EC6BAF0121049DB3E1146234CEE4657C1B821AF817DA27BD4C9B1103C81F5B5161E6A9329D83D6E4DAE1F3299858CD201222D34A85E2991BDCF32E9771F3E701897F647D62729C9805CBF118C9FA727B056A7271A23181B92F033DE1EF113A856A884AD527B8DEB92085AF3DB509FDB0265FBA3376B31BF753DFA477DD5E247D939109F31CD430A692BCEC4D9FC7C5B4630CAB90C64B75496BC7CA54D5621FE3315AD03EBF1AFD6D436BD2DBCBE707B35F916CFC147BBB5B8AD2E80ABD692834E42E0724C8B901F5924212C4129F7451B9DD860A85855D1AC59F0B6B87A66B6A395DD81990AA3DEBF64C91CEA6862B5793BAFFF81677FA2928E950D94A6333B0E77A15AE461E710BE70AFCB9FE6E0C21C5AD188E439A6E5138A2C5AD17126E759D48491E3F3F93F81EEB77B7B3A6ADD96917CF0BEEA202EEA5ADB3D5593A3DC9FF1F8F05DBF5A2707EDBB6640EFF5B65A0003CCED2EB480942A13C1F1CCDF9994F1D11DBEF0D3BA7C3801AA508C17BCF287A928B635F475195D88ADF9F4C1CA7D3D1462DFD0F6939B89E5ED95F177BBB12253391876492BC01AFF1C1DAAF0A1C7821C2A4E33F52BADF51987E010B391FC984328E020206EE98E9C8E6763120055F99725E48356FD800E11CE973D00C800C353A5DF8B028E1E42F817C7433084C440E47532FC639172533DF35F0FF43257841C3E4EC7DD7F601EAA81E9886FA3253844C195A62F89FA5D292536BE8CACD80C94BBCD1A83C985936353C9233E512431A8863D7D8340E89307547BD10B16BF2C7E0BB01AB8093C70E4F4C8FD30608FA14FF072D81048391C07DDD82475A280D4EDF81F739AD1A13BC6483C3C37BF52ED52CE8D568AA81864ACABE225BC6467C79FBF43781F29B0C508E6825D4E56D25E45A8C0C6298765069FDCC66B2C5492FDDFFF69D6F5975FCD81041F30FFD7813BA3219B3139583EB588DDC57851E581FBD5E20127EBD - -count = 88 -seed = DEEE61A2FAC04E4D6B7A250124DFD91518D9B90A71FA02665E3088760BF69CB3CD7B6977F860A7026819D178623C9676 -mlen = 2937 -msg = BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C -pk = FCBAD41E0A19FC83B283455BC0898C818C9D037C56E44879F8E936769411862B3BA7FAEC90666597EE2E87427926E81442C48958E74AF7A60D9C1285B7276C30 -sk = FCBAD41E0A19FC83B283455BC0898C818C9D037C56E44879F8E936769411862B3BA7FAEC90666597EE2E87427926E81442C48958E74AF7A60D9C1285B7276C30020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089A16D61E802A77D6AB7D46126BDF7D4D983D8AE39FECEE75A831C6AA60BF3CE0638F71BE9A40031237F2096B0501000000000000007F40203B85B442A1C2755AD72A4DD013BA473C7CD2AAFF41E6480309D18F44DA0BC6676ACB3A7C0AB3FBA0D1866EFDFFFFFFFFFFFFFF07DFD8B14E2F0110F8F64B11D0F15C3360CD3DEB6D6FC44C03ADF7B71B15F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC026B283CCDDE648A6412085508DB30EF2CDBBC1F8BECEDEB37EF2CD1E90800000000000000000000000000000000000000000000005140177AE06E40051FF59960E2EEE3858689BE977AD9FAD01FCCF2E2081F93225D4F3D95339A9426147D91B0CB311AC4CEB663C35FE26C6294FFEEE8D630D02ED4E6AF22AF9478181105B333BCACFD8CA2BC8A07C562EF151E5D45C3898DF6224C267F739278943B36DBFD11D6023CC253DA024DB128ED6668B78B1BC9989506999E20F523F354DBFE342D3A4DD7DB0115AF5C06DE76DAE61BD6D188D66DB5235AE8F66143DDFF483AA4E6DABDDF49D6B1A818E5C3977ED278EDDDBCDA99BC02414D454808440CB32C4D02A674A5A4F4C19230795ED6E22558B1DF143529CE2406025E03D89F5B64F1FFE56B80A9E70755D4B99AF7ABD43A39379A40DEC652138A795BBB3C940CA49CBB17DBCA513040EE3C2D84C506A7E44E3D9437A9D62E046914A48A3E0417C369F7ADCB03A2AA49F2BF5CDE0B882334AE8ED36C5B609C06A5B8F595E6A454A55A9E7E6F4C2CF7F62ADA7E4B15BA2C9DC49C8A2EA4A23B1A0B65169750FCB5C2E89C2F6E1DACCD0838D4835FB27A05A6AF2D3A78670D860A1948C8EAC7AD79F797361B55C1032EA4C8D2AAFA21109A5368B893542F289831E5129F2F91CE166F6F2C5333C4D8BD02AF96B8C9D78AB5C01C95D242D68E052B -smlen = 3114 -sm = 4710E53CA199AFDC0502694D9F2F175BE45A2403BB7433BA517822ED30016E13B2D9584F67519504CB99379007100DE8BA01CB72F15434FCB7A3D407C0F73DEA33FBE65B0D03FD8E80F96B5980375B047345312BD57B203017015C40AA50D78DB588FA07D22046BEE4F10C0CF8073964D0258F817CFA09010DE5103E0439F0CD8005C38FAC33EB5C7146810401837CE8FF4024797ED2F0D9A6042AA81A0C037582FE055FB3345EFE036C7A368A2DA4D600BD2B4058218A15C008A4BBBA29592079583F684FEAD3E6B3F09ABFF0DBCA23670AE4496077D47945E5F1AC3CD4ADD5763581285D80DFB43BBA9C0730858293FF6A15915AB203FBE65C118B87EA37DFA1E06CBC0F24EBA3F43A8BE17FF1DAF4277CDA2CAE8AA924E852C9D60524B98306927746C4EB26DC9475E8A0D0F920F33E1AFF9D07EA5561E70865B2D8161B86FDD7638E7A72345DD72EE95BAE1EBD2C24D2A5510ABE3FC2CED397A067D215F6088D63FA63F2247427917E5C4FBA14F0A22A04FD0AC1D948507751F3523BE2B0A0CF2F96DC61F8187ADF646D6914667759D49A6DF9A327830EFFC9470CEC6C82EA127A8B0C6510203879FAAC4323145931E146D962846BB1A6E84CB2C31BC686E388C853413EA7D3EBF7C752C6AEC774637EE01F2817A5AF133928AF35F23FC3541FE7FA749A863A048EFED2F8CC2BA86520B97FDE0324C68D1DDDE1E430C30DED0B25664EA676AAC6B1F22925A40B319CAA37DD5DEDB99DE4D963630A6FB0E8B00AD8F2A2B9BCC497A00099A70A9DC190A2AB2A058930E63FD6DF342A625E9A095EE79137CAEB8885117C7A9FB8DF7A35D5A300D6F7EEE40578A7507EDC38A0D6522474E672F156FEDE7E1690C3BBDFF40342F1F3AD3C34325BCDBFF0A68249858C777551683A9F3AF225163C9323A4AD5E666E0A9F44C6496269038AAC5DC2767966C1560C5A09207406F3C47157D2FE5909346D8ACBFDDF3E3D19FE48B7C60E1C8CFB2EAAB19E736B2595D33A0AA034726CB6146A01EBF5CC72EB1182B9A4BCEF90A1AAF74079862CD775F8F773BCC490F6015B4D5469EE0BD95C1A32A1FBF283FCE1FBF6F8CDCFC1884F4D2A899F3E7A95414DE419D56462F502EE703CDBA007C3BB78F20243C35B882C90CB7DE3CAE3F0468079C546645977347BC183FB0A6CD24481391CBDF9372E2D6765B6CAF8EB0145BB269A47A1B4E2CDF9901D6AA284D919BA57163AB9929E715341BACD81F35BDBFF36D59A1EDABFF3CAD2C122386A6335348A3170337B94E4336B2B74E791981656CB5234A6F84DB4142D3F323000FA98BE61527F7548DAB6E83928E9DD2E461F08A5BB52F241BB42254E5746FCCE0F3620ABC69A6E275B5E06A333360F9B809562ED116AA6CC2334694AAA4169310ED6AF695678DE22D3E551DAF61C0A6C5F6C0F36FD3469A3B977F6D295E75ABB804A43E1E7AC4708208A94E8368DCA40856F1D43C9865D98F69F1C0BA9C8B33AC9CCD18D400D2559B1CDD82A0C875B5E136B97C02126C81A81EB5D1E421221564100450531DBD97BDA77C1B0186527ECF526CE6BCD0ADD5668382D984AF9277A21D40C06EB4BBBB0CCD6F64E90272FD632D47A388D301377EE745FBC9CB4C02E1F096DDF303BCA4E1FB4B6DF867676080CDFA6A29CEDD15003EE636DB8C74E7E293A087B1A5F62334585369D12D9876ED0F334C6711146643FD598F0D69BB3475D219D1F89066644897A9CC5630BC84C0CB5844087216038C8FB6750D0968D3D3E2D29D93639486C76DC045900AE1A13529E74BECEB3338684402BBC3EB36870E0B37584E9F309BFB0DD9B966F0BE1298DFE55D1A94A6767CAE5EB3120133B7D7B71C9F2A538A97F8548FB176B0E8923B14AF28AE26306214F1D392AE63C3736B9F9374CA10EBE93370C11BEBEB45D066477F374866C8A7208CE6DCEC404194BB1F833DE0AA4700CA29681FA0F72D98679DC3E1E142852347B01DAA08E5CBBFD242F7223600804E066FB5C98C8358370F5D390898FA44023A30F824F1C6A95B8E23308B4BE474D03E34CF72BE65F90D698DFE0D2828A797BBF8397EC87AB9EE00C76A1C7B3CED0100D3A1030136CAB9A69F05CBE58A4A56A9C700BC591B87783DE59369F2E62D5B885DA09F25835A6DC06F954C19B347724244FDA69E3356A4EF60F6A41CFF3BB7CB22ECB128415CD1B89A9AEC12B66F1EC23B14E7D7FD601EF7B000A0C96F386216F75710EB2C12817DABA1D1295E7535331CB90A9B0D8F7542E73DE2D93FE554063F57274DF27BFB39BC4B78B72A88473408086D8DF531E53B5BE018E076032D1F8EF86D7AFB8E8867B9D7728A25ACFB6856D83592CADA4494977678A9F4D134F49A8598A8E0F23D3B7A09B5308243410CA6F47E0BF8C43871600817460BDEB74E7D32C2FF7C40EA4BF924E795516FF7C7BC8E5FD5D64CC489F1894C6BCF0E9C312B1EE7E2BC68739372E7402E6AA2ECDCA39C18D7441F0FF373946559C475E37D4ADA64B98283E5A64BE7BC2D1A1C148D2CDB4EDA35F591D3A7E7CE15162F50FF1B025F87CBB82289FBE7F9C32DB8F23012CCCB87ACA7D758D42019B9A8C15F508CAC9284928F46F0DC1C1B6C6B4DA030DB9286FF8D3762EA4A83D096AE04F98E9416D3DAC59E04F9E4E4359AD76926BBD9570A3D5811F69A1C4345B646BD946D0168ED62A7A431D920D707D8CC7E840BB9CF13D8ABAE8196D9177E8C28CE0DD9EF647EAAF0D3C97E52CB31B560EA7067B45AEFB5EC2B7C7BDFA3996D1C7E467636BFA1BBE11D1CCF86B64ADE9FAF9287A23502E9FF711CA97D6CC09DE814A67BA6123A8E4E67CF6E8CB6F7B36621BC6192ECEE94D61860703AC8411B16E19644A6AB01813402629AF52301C9D76A94CEE22B1DCA49F13B130028991C8AB383C8461433383DA92AB34F1EBB4124B24C6C391EA44EE6E736BBC7A2D4660A878A600AE39B7DCCAA51ADBE90BD705EA51AD13C05E611749D43DE336D396352CB0673ABCE7473DECB0FC708EF28DCBE18C85EE0068FEF64685ACC3A7D0DA9A21DD0AFB10B95D81F6AE437022218B6094CE35D01248EA85A9EC6FB56A7A2A8453EB03E6CCBEA0F2EADB015D8BE3D09739EAC07AD9E3F17D13E5F71CADFA220ECAE90EA50BEA87B19CA6FC5DF31874D51723BECC80C8845C9EA718454D2817EF8AFD99B63090CBA6C8089AFA78770222FADEE3B3B829CF36A8153EFAF2CF28DC4651FF37A8921E402EF81A0F457FC1802AB06A759BF4071F082BFDC100AB612A4584B5AE19354854101AB0173D7D6A5A0637CCB58AE58978A8BEFD5A2C51D3D53150C336C0C0C2A27B442E2BCE120C4CCF8D97EA4584434A6F48C0245B63B2255BC52ADAD4EDA9279412D70BE457F7DCAC492FE53C06EDEED766B46EBC3419E6DA2A2847251F75C62A5FE7AE74F0DD5AF50A447DA6356DCC828C5F1A2C0C873E57041EB1158296C038B91F2E13D3D4B2887B284384A9ECB8BB378BB311F4ABB19E1B90EB3A399C03BFB4CCB29AAD80C55C1636559FC79A6C894B5BAD8D529BF680631541A45EB0E57BA5B458A05F456C60FBB593DAE90AE549416AF96642A486F10843482AFC3989BBD1E8E4DDF0791204F4B720ABD2D8995C87C8A388ECB14860CF83B7A4406FB6C8C9393475082D24E516C5F1AF91CEBA444D8E460D0695746BE057EA8D76F8C0C80358F3DB2AE5B996272737516EF5E4EF5A1FE5967304CB6D00090C9623D29F0D4BCE8CA3CBD54A30F9597E01E5845C1CDD8777E18C5D5D86492FDD0606F623D11A28DD9F02032E3A378C71B757B52021DCE6CEEC63792CEA24D6DD7150AC8FCFCA6554F7B08A5529D59628D0F35122504DD1542F6291BEDBEE09F81AA744A0F6C6DFCA6207FBFAB6B9E17E8A4040741F6508471E72D227D0FDC50C13F444310245AD17BF819FFBBC4E0485FA68CF1F0A4423F251538F25DA989ABCD008C803D368F626438432569F12D1612370E4C6C971079371081B37D8DF7EE709198AAA2FCBD443B96732AAA4E6924A461B60CA4F4CB13E88D539AAD709A3DB84D2D6D26671A9F3877125B7A358389BBEEA846A32E949DB9A7853DBC7D5ADD92729CE1B5C00680974F3DDC6A8235C7319B6CD1CE5E0B66FE7C2F1115206C42B4C02990D79EFA8BE94927543C19EE93D0EC8811F9330693696C878CFADAA2D56E877D42A3680AB2F6A576FDA7BF7957F781655CC664A0A4A0D16CE34D04D7C98A9E0C93D2E6D42870FE66864660B564ED4F881693D466BD68B6470AF03A5A6E703DBB40515AF5DCA7142C4C8D79F5BE4BB01A1B56BE9D0936396A7EED9A84DA86A4F00DCF676B4942D5DF6E1378EA26D9118A54E17FC623B83AADB417EC82F9AFCACEABBDCFE2F0B6AD4BC1601B4E24F547D61D1C1737ADBCB46D98287372C - -count = 89 -seed = DAB6C05E29342106CC34769BF419ADCC88010C05B57E673A503E63AE7A4EE55B72AB2CA86C4EF57FC8C02D2E0C8694A1 -mlen = 2970 -msg = 4D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D -pk = 57793F6CAD978E6C0E559ED359E4C288EAB10B68093F4AE41C2B0FC6152B2C081D2DD7961E8D8740E7BD6E97BF6A151F3CDF3384E2C0A5BF9EB0EB0FE3D1C120 -sk = 57793F6CAD978E6C0E559ED359E4C288EAB10B68093F4AE41C2B0FC6152B2C081D2DD7961E8D8740E7BD6E97BF6A151F3CDF3384E2C0A5BF9EB0EB0FE3D1C1200200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004AE0EC3B381EF2043EA373D3770BD995FFAB13B8F05FAE4058940E7942FE5A503805CFF239673EF7AA9755367A8E0500000000000000754B352653E21010224D29D6ACE5F3EE1256112B42983F626E6D669A347452DAC4EE329EC31B0BE741470CBFCE40FBFFFFFFFFFFFFFFEB0C0844AD578348660C7342A8ACDB8C3BA63F8E755A8451A3EC8FB6C7B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6283144CA099365DA03BB8B57E884DFF5DBB771DC9950742535EEF90A09060000000000000000000000000000000000000000000000137A36CC63B28950C7F15EEACE8945E83B9E7D6E1207AF094B43507F676EB62F5697D1429F286080A12A1B5198F55AEEB6BBE657F55FA5DA8BC213971BC8500DA73A2C8CBC62ABF9495F800323698FCA3702B962201C26064B6E2E093BED21002151050B5B1E4D3FA96122DA5E1AFF34C2E42A47FA652542E951166EFE13B1054B3144E82A8325AC947FEFA73065BCC1C726D7BDC8D557F00398F6379799E4025AE8208767B3A3DBB1B43D465F92D26FE0D6336DCCBBE62A9A1C73736FE70F0AF97073FCE65BA20F361B288DB44526F1092EB8D0718FAA82B62365CED62EBE34F92D18C12F9132738606C975C54C72B710CDC0D021F74C334C55ECBCA20B6E1EA97339C0AC56EDD1225D090097D81E3D7FCAD988F30F72E7052B47EB0DD2041928A054B024A9F299EED0F16DD607370DEEF7CE8B851EAB15D5942F2BEAC85E188C88CB344C5FC145FC2682AFD9EB2FD1E5667EC70E1F40818A8A8B15C663AA1C0E0B72A7E929879E6A2C84064F635267796875676F8B598BC3D316F6C0DDD0200795DD6FFDA2C24B5A8E44439D9118355E9B32D0AD5FF59CA4AD6016E7343A3223ED195000A4ABE3CD0E72D010BC1FD61595E025480BE925392FFF73A7BDCD1A -smlen = 3147 -sm = F94EE7CC9A6FF0836604DF7352DFE3177BE84007018A8A9A4B997FE9FA033EEFF2B2E03E24AD0000B58D381F0D3307919002F4EDF40B96AD27B406011319E2B3CF006E89380152BB0C689F76D2C67D03C6130B5DC6CE379A23040611175F460E495355072A535AAC616B8AC72203ABB868ABC9E0803FDA03C500B16D3EC1865DEF0052F4D20D9E43D2F77203019163A88F02A4DED10E1E7F75BF6F52730D03DC5FFD15F3CBA39DCD0008EBC18AFB17D0014D83349DD620DC2CC0E9ADA524B9BE9B195973A839A042F4342D69E6B38918507A9747FCDD8B751D7C75ABCE2B482B3313D4C74EA4E7A4A91F2E08A059536B651508307B7F4C3AFF5CF1579F90F32BA1E847778673E3956713C14661AFA2D11CCF61FD8F9BC914D4B6E6D09C52AFF7FEFAE325C180147153C9AE1924C9A2B8DE4900BFBBC6797558B000C5ADB9A8DC4CAFB458AD328F19A2C55D5434BBFA7BE5057E56511529709992BD6527E913B46ABE38DBFF90D4AB3C024A66FC0F8FB34AFB96E22535A0EA8F313A087AA65355D7D5989C486E103FD526A7A6D812C0E4D8C081BCCE4DCFBC64B68436739451BE0C4B67BFCA71BE955BA9F9A23C223C7D0FFB1B2196C9C9845B6AF341A363951E2008BDC4F3296DD0E1E3F480F2E4B0EC77A002ECCFDABCC58D24CB0BAA26EACE96DECAA0F6BF1CDE0175AFA65AD5C23C5E71B50DF778208EDBE426AA6E876C12440D7C4FCCB42D039A14509092784BAAD37D9B8EDF186CD4FCB3D9F8B0397E951777D602B8AF613060FDAB6B358302B3FD28437A06694F36CE12A035F09D677E48D077CEFD1676D8FE51541BC19E3A6D6A5D879C4F9EB4713B7C0F3A652F3A05D74DABFF79A302FDAF147531FDD57924F49E52B298219B03D6DF166B481F232FC85C7CF52838969CED2DCFC18DD8C95891C498FB49289D1A982922A0FC02C849AC3BB7FA92CF43A64464D5BD919F75ADA287FE657BF61DC07B3808C0FD0D71EA24DE5353268B2C17C989C29465BA49111CC479F51A8CC623CFB6FF68149E52C77A7D85B5ECCE66C05900AB9957BC7ED39E03649A103B5B6BFEEB168B7C1F30DCA84AEA509FEC2B215DD95558A2708839396552F517A8FDA28C3ED61F84E1B2E0DCDFA708DE50D44BFC65BD4E70260C437C8B5B7158EC7E2301D9C7AAA68E0ADEF89FDB601711AD2998379145B29CE3681B513DC3BA9B2EB668C1B53697833670466E21E767361C0A4362E5B8DDC38EE6A9C4DC5205EB808B93C72FFAFB635B4254E4F4496BACC753C8ED0BCAA88DB683CE77C8165E8DDDE665392CCCD57BC07573D83CB3AA10648281EFB08F92AACD8AB6F9B5D7FC66D29526BD57E421220FFE375B26C61A0DDBD9807022EB3B4B681A43E7719F5EC255C1E19AE6C542D6DEEF3B94B6960C18D0D7C8110B88F995826073B874042FAF97F1FF034B8257418CA269F5CA588223393B0179F9817E08E7212D0D410EA259EA66BC4A00E7FB1190A732BFDBF7ADEA0E4550BE90C3E37BF33BAF436955742A2632AEDE259235702EA2E079D99A22C9755ED34C1E3CCBE746E728A932B1852F692B103112B303033AD3CE1172AA066860DF570D21EBBA51FAB72D5AFC4AE8995F532AE384CCCC3C4A295AF76A803FE076CCC920A80D82A9B614760EC43208579EF5DEE164356D62EA33953E55195EEE9B2E2018E6FD9D19A9F49258702DBAF6EDBFD093919917B1B6734F012E2BEB4F758DD481FB8A8D7796E755C6647501E28862B9F5B16FFA1C5D80DCB07141806FC348881A5A8891BB632A4AE4292A102D71504D0FC12C79D15BCD0799D30C7B9E72625A7DF7DBC7ECF9EACC627CA9AE5D71E264F2F2A9D5DB8593F3A90F3915CE480ADF800C99FC2C8692F2B57B492BF9D84171F8C29AF8D5549F82D3730927096CA18FF0B0C0C0B8B800508C44D5749B92D7D48F7FBD5C86E408ECE0EAE639AF475073DF5CA2CD5083BC4FF8852DDF5C399946A6B21B0841D137F583E0DDA3A6046F082872B783ECA3E14B21A2AF61BB150847026F2371812B1A2BE72024226F4613DA860AC2FFC578DCB171DC27B896EEFE49F885F9BE4CC8766F37038E01CF20DBB661F507B2ECF2B023203A6259B0A018FC00B2CA9B3107B605F04388D5493AE7CC4BDD093CE761A92847C2A167739E0750B427B2ACEB3ABC5FF751A5F32D36B589787D4DA509C85EAD751353AB2C68A9C14B8B2C8166AEB6F27C7F101221C306AAC74AAB6B4E795525FE12038725D7AF3D2A6D60E1EA85F2B94EA24F1B72FED9DDAD4C8E5DA484E80A2150DE22E6ADEF41153D7B4331E8F011A3CD48DAB02876B067312D0DC736E465F99AC3C9C56321507E79ACCF652E3857C749AD92DAD15350A6B4B67229A3905DB18AB2053E2D4F92F156A1D76D0AA891364002C991E632B53FA217AAC1709F37F3402F43B0753361EB2F595F9FAE3D7D96FF050DCA0B9657F4C3AB49EBDBFE8816051C4E0AFF32C5137749D53B062CB61F7201171B5DD716E9CCB38D00E50955596845DFF602200B30D375A854CA4E9A7276CA1A1D9EE92A04BCD78854BE251F7080ABA6D8325D40B37054596AD80211A50AFCC1DBC177600A70E648D8BEB4FCB8919214894CDDAA6D63B6F6C445469A6866721D4BF1117F25DFF9D65FC8FBE5B0ACC8B9039C7F94B2A5CC6068A0489E2E13A731DBE1094FA8558A601ADDB9E4DAB04FA744CD5B95A9D57C52C8124AD950A5944DEE2C55E5C8540DBEE5823DAA624F57FD5BE994BAB3AD4E74EA9443F8B6024BD6B49ADF3972442D88E61E04FE8478FF28916584CCB65FB15686991D5781CB7EDA067745258EA671E0A2665F94FEA1B5490669D1EE8711518BB911094957586C8075E3BBEDC47BE059053A7658ADFA0ACEABDD46E0DD9647B34EBA32E56B6305653ED386C50E79E15084F00F003B1D12504FDD8E47D03D9F7572276047BD22B82B8E81F87C86E6F20D2A756B16F291179A97B010F993C0F839C9A1238CFC9BDE8074405CF1B35DF423C7566CE965681F21C969E4F3F8FDCA72A18D5DAA80287F53B5F8429FEA81612CF63CCF1B7A13512DB4D1DD2678FE1189398032EAEB4368332972C728AD726B7290302C3C5ACAB6E73432E825B9046F846ADCA9D93780A36095AA5C51E354CC6E9A910CABBE59130E98F4ACB3CB6D4EFDA9E2F78748ED58465937FC81C548AD038FDC32AEC46B078CC5A7207658A9706F1C9653359DE6C4457DBFA71D300F98F9BC5DAA14DBDD5EF20DCEDE7E9D3F7DA5C932AC3338BA40E46B17D89FE38F725129991983D4A81321B394F2D7B20D66E3DEAAEB6FEFC8CFF0B68A766E27CCFBA66DEDDB1F541DEB3C1892ED2AD5D073162F0DD06B82E8878477BC96E03101C9B5D9D0ADA10EC060B45E144B31E6B4DE283FD43538B47178398FDD15B01ED421EE2C65847F7A4E9AECE2F1D13971FFC0157040782AD4B591DEA0906370820DDE1000490AB1C27C03D02A0F4B4BFAB0E56D7257288441CEA63175CD6BD11382E6C873154332E627CE82E37C63889EFBD8537AC35C21AD7A09C986CFEBF13B19D5677C1104B373F3B55198D075AAC608145FF9D0C4C12C83BB41036AB32227629EEB4922F172281A66C23C35B8A3E92DE0A10D5E8C18B9A54D6C30230F3A8263986AC535B6BF63EDDAF6A02C9100B712EC4BD49851A22AF0E647F259C2E19B9ACAEB6147C476C90745A353F6252ADE8212A9F7C215C0B3053BF2B4E0AD225E8B344EC14C1B839877349C3743E8337D9C1EB128B06939C5A08F60A46FA700723EB6652FC26440D9BDA3C99C10AD0742C2F039BE6B66749B77E14F8223509365053E87ED870FE3906A16DA6C62945DD2112C96A23942B1E14431AECA7DFCE3FD4D6633E0B661FB34B0BF05C4D21E689CAC9B6ABD9F507F08E4AAB94BBEF1C629C0E1CF344E66D3A3E100B615BF762DFF0CEFC5E4CCE0DD908F46C94E7411A151E713FE0C18ED33C4C03E55E12C0AC366DA5C757C7090E0F94E2C34D93EA3B226ADB2979D23E071F18C2EFF33BCF41BAAF52F4B44E38675DDDEC89C7BFE858BFD1AE70D96D0487972D70F8D8681982656FF734BB6323AA91EA14C6330C71783D235D9F094CB111ABC4990319BBF163891535AA5F870164DA65FFF395DB68B390084D4F2448B98CD56103E49CAAEB6CD040C3ABA8290284E9B2BC423117F4104D89B1B1607C6D34AC30AA9E79D8753B97CAE90ECADA6CAFC6100D3D6D91E20393E0DC95B981FE0EDBCF88E046F74184A96705AC226FD26089468E432D525643293BDA781B64BACBDFD6C7301AC42AED7DBBCE7ABB9D67AF315BCC3509CF03523FC887E27EDCBD7C74DADFD0F126CDB49E28ECAD38080F18A775E6D824C18359935D921744EA72FE293F299B530D9DC9285EF174EE60E2DDFFCCFFE89960BABA90D955CD2C96672513C758142D29A1AD79CA9291BC6782B64717F11A71E6D65A1A71D - -count = 90 -seed = 0CAF47BD9AABD7D09FFAD404449BBAB2E1D48E80AC78550831A365BED8765420DBBE9A566EFDF20D4E5233D7848582E4 -mlen = 3003 -msg = E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 -pk = 316C028CBB0D90BC8B28CCC6BE0DC92D18D949F4A33FB9AFC5E4925FFB935F34C35116FBECF1CF3E7B7C56C53794FB1BC1EFF6DB2AB3552324388F264DE48332 -sk = 316C028CBB0D90BC8B28CCC6BE0DC92D18D949F4A33FB9AFC5E4925FFB935F34C35116FBECF1CF3E7B7C56C53794FB1BC1EFF6DB2AB3552324388F264DE483320200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002C090DD65C1F4BF097F333A41DC43C6D24B2065E22E7B6B5F6E1FEAF5F8BDC4BFAF5437FB4CA597D60B5192EC64A0100000000000000FD47246E8A09F7A155A530AA119C600ACCB616A8E72984486C9E01C49E987D80C300C05B4B4EAE314A17E41C04A4F9FFFFFFFFFFFFFFFDF398DE930EB28C052719D7A87B27D1DD436B39C0A34AF898D4A7A4DBBF010000000000000000000000000000000000000000000000D47372D6932A021B28D06BB8266D09CB3F0ACE48A5AB3DD641854774CE260400000000000000000000000000000000000000000000009E83AF56A27539CE66070C66741394E40DA092BBFF6A2D4AC14F0814E367F3112CB828DEA67FAA2EE627DD6D9EBDFC9E3D7A18F786DB152A703AD360E941650628F8A7CFD21ACD9EE274D806DA246FBF678A9CC2235FD23C3B079F9D57476F2C91D7A9B5CB31E87E45F26AB39F164AC0885371FC62C5054BF43D89EFD36FF60F77618AA8943B8A76F32456A907641876B50BFA31F01CF57C82C77EE2CDA7C5065418ECC9DFAD43A4A003CD04ADBF9CD1AF8D63CE8F7AD012DF05DAE010D417187520D983A29E00AEFA4D98A2C9E779C5F6E94614832B1197A26DED810276C1162F6D7B61E0F992A73E09370BC2884E16706E5A871BC9B3DFDB95D9C65523DE2475B07950E46B428C316BD62B8FB240A1F7645CA2A027C00591E61E99FA9883167689F605393156C1958EEE740AA5CD666F1F9CA439CE23976FBC5A1EBAD6312BA31C3ABDC10CA29F1C093A05FA408722A213940BD4821051D2B54E4ACE2F3B2B008BDD4117C07ADC607EAE9CEE2F2C08BCA8A6CFB9A2EBFB920247DD8629E11350D368FF8470F98B8A7ACCB57B77639A9FD839DBED87DA1A1A27E6F2EEF8700DD22EE9B7A951E9A78EF552C0227541480B1FCC7D8D4745836D007DFC98730D16 -smlen = 3180 -sm = 169C7F72B6F5B405D501BCE1006F275EF1EABA05C329AE1823DE51607100F19979A98555E6F02802A6D80A1F3390A39B7C060D6EF38F44674DB41C012ECF3BC5B4BC4EE29F0664021EF47930126E8E05AEE6B0F5F0B87011E606E4D1615D68829E274D014C13E25058743CF5AD03B6B93CFC13E15EF30F0533A595EB6FFCDCE35002C38EB018FBAEEDA0BF010037AD7EE4501E600DD81B0497FDA631A50B01457B5917AD609F6D5C0481C0C71BDC39D000E0F434DFA04EC225FF6B6DB802A047E221BC064E5BE89A5FC13937AE9D3F22B4439BB1C1BBA01547A64AB3E810BBB09706D01959E2E906A69FFDDF0C56726BDB58FB039D66AC5D77C7F0E9A8617B0C69176770DA328D38171F39B5220279186250139922C0DD0F7C3F96D48615FC66DB7568810931D257B230258FFE9CB35F87859E08139EBF7432E948EE3F962BB9015CACB8499BC69597ABAE4B841B606657E2E3C51FF5A8961AD42177A9E73950E3FA150439E2063B6555624A6D8E3AF4FD5710FBE722B8C6267BA5DF56846A085C56444573D692D5412CB70E443761751E58C41953BB9FAA3CE1F4564C825A02F0E1339CD659AB1480804DD2E90E3086AAA292DB39C6E2AAF1B001B47A21CC721C0C502C46EF0479BB7D8CBDF8E9C136397FEBC2D83C0FDBB3ED4FA6868068477206A26D2B7E0D20507AECB2756B888FCF5B446217DE14EE6A20CF7E7B732FAB22CA3ABBE81B2BE18463ACAA3132773ACD7476460536111CDCAC98B1CC9B2C36AEB3FB318340F7397B4B4AD6AA87EAC94AB7D98CC12EA5606162877465FA2CAD276CBB5D36C40A0B014C53D2D3A96825E237342DFEFAA6B9456B5FF1DCA859C5976F77C3D3CBC9DF355237EE9B4B4C90A9DD941294431DB76DBB539DC48669E7AAD21808332C8A4FE98B8F043FB756B526890452FA3C3527FCD584CD33E38FF9FF783538D39A184B7B3EB649E1C04C289FB65998F6CF5D5BBB0609FC3403D85C6DF269017032CD24AC540E1B294BDD3C3A0C7117CAB02B1A0063A174FF26FCDA687433A667322320C0DEC1EA3963F3B14375882B3478AED43C2C74DEBFE3A734F8B1A5CF92007F8FB627CC3AAD5C6AE4C31846B72E7573041270FF40E762C0F8DBCEB7512D44DC260A97D5CA7D60699981ED8476D8651C35C8ED498FC2961D1E38AF46F3653630773209A63838A9222B813C23DB0CF4196D6654126BA2B1840A7180E653B3D6E10C4C7AC3CEE93B0399D918A52E59F0215B09A119E634E6E8A9886C877F157BF7B7DD827ADEDBAF03C718AE037C0B262588171839E952721DE72180F8EED00B01F53E098B82165199C53129576036FC753A3D33AEC92060DD19AA078A496A2B214B1BFBB747A1EC64071B0A078D74D0212E6203C9698C7449326A42BCBBE8D9501DB916C64307D5F1083BCC36C0FFA18C0E4410B0B17D443481C3673D17BBD7A366A5FD1C3C5B3391A02EDA7596B4F869A91A32B5A02A05611371231BE035EDC716F534724B5225E1A72A2B2CD357F4C326F1DEE963FAB680721D40DD70B750A019E70885515F43946A0DD3DD042969139F61ECA0E9EE3107D3D28AC606AD53F236303E1FE986C38825318B7C4597B14E1A83B81295FEF49FD0F2C1E14A0B146540D853DB9706CD224B376343317BF7330B0C2721A409B856304FFFE60C24C441D5E2797D4696C0FE046D305AEE93CC6A2D89A81EB19643636A8B424B310034612105DF16516CE9607CC0A2BAC5835642C6FF9572191BC45E44D9B40DA36B607F570AE8C39D490342786F31CE6764F3F7A764665B6CB93E54922C6D89DB566F494E0EE069811AC82E8132F2F388D68490CB1C2172D2979FCE3659D7076B4F457232EB839172963F8C342E2CD18969F086F451D33BB774F3D00E6FA2BE02292F2E5CAD3ADF5DEC28932BD784801E69364962BF39E25455303E1F289052D2F0CD4964E0FFCDE29E7C074E5D57E43739DFA42AAD636C352D363E3A23BDD134BAABC7CD1621CA638DED7DB7051F0456641CA872ECDB4D3C2603DDBBCE16637010E782C4BD5230992E2EE7DD904F8A83EBAA7B4C3CEE15B10794ACE894118304BCDA9E9B1376331D2248B802557AABCF913E95F783715BB5E90A4436E4BDE7D651397A70A24257C39E0516BB1F548DA36C1F1F92A416DC1114107CD863F3BFCB360286E774B21296259756EA6040CB61738EEFE29A67895AC69797C640E03F0E9E731647C2DA93373920341FDFBD50EB6B737BB0D9FDA8EC8784920407D4F41486D8FC616430768D6431CCD789DEFF332B239FFD1900800CEDD9661A55D6D96089007E9089A117F03D7858EB4C3FE2D07E91D8CAB88D2BA5421846069FA6D4E5C9161A140CC3A288100BFBE61C3B0F0E820AB12D8FC54B054A0F4C777052495B45A7D1A883E67663DCF50C2230CA5319AB31CD76435DAE41CE1EE25ECD3FA0C7E83B0168852B2CAB674127CD7BC9DDF9DD4B57EB40128988C7C8994DC6A5FC939FF957F06C70A4056E63331F9AAD254EBF2B8FCCD580285BEA486D91A0C2DBD5823AC8F6846DDABCDE25A2252F8DA1AEB32E6969276BD2A7F94CD7DD3143F3181489272B1589FD385BA844F90E35982B53141DAEAED413054CDB935F3412E31D99C1147079CB487FEEE85E3906DAED18106B8C407BBCB7716EF9D4D34E2FF04709C7457997AD6FADC55A8FA70BC907815805578A11A012C521A1325754CAE2E3F7C9E1FFFDBD4BE31DC534961C318D1A894838E0C33806735DD11E408E500995B86B6ECD20D325347F792A3381D2A45587D9B6AE0AA27533732A6C421CA621AAC42335848D9C0DD89F14EADF2F92EC532756CD5697AD752B6260C598EC9F0E9976A950B22DAEA8B74FCC87F28B5E9ED83C0339E566259ECF06E5CE209065DE87FEEE5D1E9C466004B34583D6AE89B590EAD6A96CD2951705AC764F329E28C996AD6DB05F6C69AD2A39D3EE230F6501F1760AA41FFD936C9DBF20DE3996917322D32B946062A3C27D8BF35ECDA22403AB684CDC680DD166562D018D943369CAEFB9133A4BC4515CD5F9C08E7C22D153F0A7733EB4EB2CD8A74A4C85E40DADEF6858C5927B6EEB2B01E9B7AB02F7048C8869991068B00FC19B9545AB42181DD5CB5488222A402E827F60A8D87B09ECC88350032F998E3C10A88D4733227334812EC97C5E5FA85FAEE1A1E28A58641531B139AA58BEF49780DCEAA408986CF3C40E226C60531945A20F91E5DC31EC86C9F9A0545E5FCB79A13B9AFE9B133867BA7A38152ABC6D9F8EE10090BB71E6ADC6A6C2513B066F2565138BADA60B0BD339F9BE1AADDFC90DD272B4146D0F5830C6A53E295C849C15D001176E7774FCD7619D6EF1A30BA93CFE278AB4806BBF25CE4A4E94163F614E81DFF7EFCB015997F5138E22B80B2B00AD7579CD84DB5D1C7FB16E9E8C5D9A5BA0AD0E0A7DE79C18839D673632F3D2C7DA2062EAE844FACCAF23590B2FBF1861405AC347EB9D723ECBDE54CC96BC4D8EE2178F353310E5D69230C5DB2841D2A06A3A4E03E054D99DEFC6004A6E405FA89B198A901EA1AE9F3112A29F3AEC5698A42794E04D74D761E4AA5AD23DE271969BAF124450F4796DA1EB1C01480436AB0F5D0B1B2E6717DD87EEBF137420961F978896077E40B2D2EBB5664FD8AD89BB9333FDF46C33EF3BED21BCB5B4697451BDACF364F85462F5CB9F546657B4744EDF757DAAA4D3A9A2A6F281184C3576B1DB0B540F3B36310020BC6AC0C6454A7CC8EC1182422B17BDA202729C270194CD6044210D2B98731565812339EDFE5A0DAD79BA826D8C566C7D25DEA9BFF0BADF1E4E5DA2B884966E03FADC51C6D9BCFE877511157201DAB48AED1AB038999E5CC3FE58CCD37D40050DEE92E0BD5332413A7F0118724084EE5545FB51942DF1EF399F734FB9592555B5F32290C53D7E5017EFA2B61E29FDCE90CC3E7C1B0E545425B1D3E1ACB9089DAA786CB0122DB3FF27EA0367751A5462230F0F248147EBCCBA2E16D214E9A0BAEBE989BBA020F95B623CB14ACAF2BE6F157DFDB1E32627133F0D26C7B65A189F39955EE31D9B507B43126B06B9E4524732C8621D2274438DB7ECAF736AB7257CED950EB68BB868581649232793EC83379A16F40781E76F5CC57C48C3F5C2989BEA803E1B63768436D39AD19BB77DB46AAE6E8473ED5DFEC983F49E4B8E7CA6BF476AB2F0272C0C2DBEF1BCB064D7400BFE1B9ECCE13578A20B1D5B48133A74C5C59CAE0115BC3B50574580BFA99D58BCAD336EE2CCA5B7994C784BB90CC8F1B9A0E21B39D5EBA464DE34D46AC0BBE436C2F419D60D8AB13786F9A841B52710D1B49BEC290DE317B66B6855ABE156C07619A4B998CC582E3F54A7F457F1D2839BC3EBAC937AD3EBC6A9E6E845379CF1D66D7C59000E3F6CF6823B005728A95BFB0ACD044EB35D5ADBE8933A3637887CF91EE74BB910FDCBE797B0C6B1B056500542BD39781BDF13EBFBFE949D7BA0B7F31102E63BFC6E22693F97 - -count = 91 -seed = 9564E88F336C091EAD50C893F3EAA8351FA388682F433F7A72A34731020B9C96DFCF75EF5EAE47E12684AFA51EFB49B7 -mlen = 3036 -msg = 2601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 -pk = AEF4C91C99D59119DD266B40DB4DAAAFD1D228C8EFA5940A531B0287CCDDEB0C14E343A9E444294BA25064E60A2301D3676850570C09C53E865C5CCDEA80F819 -sk = AEF4C91C99D59119DD266B40DB4DAAAFD1D228C8EFA5940A531B0287CCDDEB0C14E343A9E444294BA25064E60A2301D3676850570C09C53E865C5CCDEA80F8190200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008CF45ACCCBFB7990652F53381C41D6171D73BAE6B6583B44C951D7CBDD80E3DA65D5384107CF57B218BBB8403B8206000000000000000D86F1ED0698EB65555F363352F3687EB0AB25FC295D147BCF5FA2167A766BB33DB7885D08CC6207CBA4E4839EEFFCFFFFFFFFFFFFFFAB85E1382A307B4E48CD16154D3BFA85B2C8EAE1F79E68115B870425E292FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD048F1D4BCC7F8CFA3F33D577D69718711096E910441C2118DE37FA2F956000000000000000000000000000000000000000000000000350951F865A18F3CFAD91EF3A7FEAE7F87DB46E88F8275903CF447476AB2242654AC13BB8885F2C71FF9EED5F64B9FB09EEF565FCEEFDDAC648A8B56AEB5A21D7971C6F1AB187CA53F68FA57C605C48A3E9A1C812D47742A22E0AB4A9A2265178BF8223480661CE78FD4CDE35EC79B60B4A34A38D45A01EEC0E8F35B39DEDD13B1C1EB916F595742065B2781C93F7D54A9220DBA67BDBD3573145B6508C98515955AC6E40C1F03C3B5D12ABC69C9B13182C3421F803F0963571430772F725A27EB0C91A4C8289DBF26C7CDE084EAB7AA6A313C6D464D165DAB80BEA4438F4D1B6D2CEA48722212B8AA765C2D02CC05ABEFA25D9F4853B0EAD2300A47DFBF4623C020A957B9F1623B589A74B82A5F178DA0DDC275951BA8B5920EACC3A76717066CFE9EA91CDF28B081FC21FA0F074E34410DD5D80B59812843EAC4F4147CBE0AA2BAA92EE8509C9CE3A60E7872620A8A1FB8654F6E94AF709E4D6EFA9870EF28F35D1C5E9301A50B841E9014C4FD56BCC045165A406431A4832EB86E8819BF1D68F967917CAACA99590716C934A6C3F70E3BBAD2174BB37BE3A78702793D402CA941C3E62348304F3B6B7278A71E3B936D8E7BBB81918371190BA5405AE5AF21 -smlen = 3213 -sm = B437FFECE2B83983C0017F1DE8EA324FF0A071023179ACAF6DC3D85D2106A9D94DE9B55787224805DD612FD70EE25478B302215082C38DD8A17A6200E67ED5808ED0117F020010BFBF3941AED1C1CF03BFC9EEAD35E46CA7F7076D4991A4AB4572180B03A2D4F6F86EFF862A6D023A4B6F11F03D068F8204B517880767D300EC9502DCA755EA22CE22BCEF050173B275E82DF77918B4A9B66223947598050082A1F4AF6D6DB5DF3402ACDA8AA2AFCE63002601A39B6D7D91DE539EF11C3B67AE3EB1607716F587BAD5F60D311A9F4FE7F04350CA085EDA6D41C4BB6C6E13E376BF8A314DDF791AE18BE2EC0544AFD3CC27BDF270C4550E9E78D497B92349AC07755BF9167B2958BDE919123439D6F49C3408E8D88021E668A0A5FB6799330188E35EC5939B77097E3737C4F664D01D85FAAD0F583B3E95EDE125587E2A79991750D5CF804325C72DC8DDF3471EE8FDE02519D2D0CA7EDD651EEE30B3BE335CCF7FB02059BC3A47EE3C056D4929EAD4FCD82C8CF49625D5DA460DAA299718556BF0F77CC5CBADB99B64C8EAD4474601FD5C79309D4E63AAC392853072619EFD7B958F0EBDE5CBD40ACD57DF269A8810776D6DFF2E637EA57ADBFAA08DF8D2581C38CB262DBB4D1F3C65A4FA068539D2056E08DCF03BAFF006EDC688023A20728B227A99FED3B8F2BCBED2E3E6ECD8B8665A2E4D233B78D7C33F6E3BD9D0A24D13C8EACCCB53A21DDA9E7A34F9A0F031091E65F749C9EBCCF3DDC4097A121D8C68EB7883405EE34F6A8B0208EA8D5A3FAB53FE2CAD1110BFA6E094F78D5314880BB67BFDFBC2DF8AA250F1D7200FF9A3247C4976DBD1BBE99DF02A3F246E5D466F85ED2F68E0B2DE06B0F2448A7B98FBCBF5872BCAE71BF0DB4E70105B020FF130141E8DE86DBE05B7D2A234CE2EA83A38E23A262E46FFBC837E8A71F657E443052E9A49DEA4E344D497DD2DE2AFB4009D681F232BFF4FEEB173546CBCC4C80C9F85B1CE125BE678E5EC62EF04433D55D4B8829B01AC165A440FCD6594F2C0CB456C8A47444AB05A0F0717B8185930D9738E885D24DAB98E11ECFF7D7A48A4527F94FC4C9D1B9D71F5E6BB39CF92B1A6D0509FFFD42E77AC9AD6F50F8FC649B96B8AC08673F78AE8D0BA2B7243452B33AAC44B06A2B9BE1AD6A12583D3590A3F9AF0E0DC35DA88A257170D315F32F3A889601D6729433B7ADE0F719386723EB2A008634749F5253CB7D9B2FC99A1AE1BBBE7F00A536CD38F8A7237D3992C3897DF412F5B1D45E1EF5B5DC974D49CF8DBF785160BC527543458FD9378B3D4D3124214AE5676185794209AD0EE73B063CBD5B7830D00F817CA0D5CBB597C44D28E4885D935B7BF426C1339C500DAF4F2033FA6A27A4196F233256650472F205D2C5E00E7087FB73027B0C6C9AC5C1D928CCD190B8A6BB33F512CA8E2369DAE6111156DE47A24469683F4721A25652FF87474DFD92A028B3EC5BCFC244CE442752A7DA1DA6C33FC22573BF0B13E371CA9FCC86C76FCF7A1654EEF4442E47399835A06336E62952770C6E61C573CFD07B3AB631B8831FE3F5DD2C6DF68EBF2F8E02EC9F6B90A371ED5E62C8463780AC453AB6F72D38C8F5212C8B650F63B98E3C0886B6A85AE8E7256C1EFB30969532CDBF72184AECBDE2A17B9811DD4222D080049C5D36C532CC0E910779D64AF93D750EE96BDA87562EBD3830FEAD07A3960CD6DE7146603199563693392D3CCE1332DF35C2C8A2C251911D38E95815CE5A4CE5596E2D77711D87CDD54D22E8F0AB431BF8B24CE9C7BD6D077E436543C70B02F338841AF0FB86B5EA4B6A47E27C1D83E1AB06801044F546ADADA437F3CE7D788A1C92A74BA540664658E70D4F2711979153FF1589792859C3BF122628479C7C35EEE951DAB8CDB0D4D150C2DA338346988D34F8C5E589B231B5E00849611BA09711BD3A0516FD515E6C4AE1E8A3657C282C8120C97AA7A2E3BAA22B6EABB8D8212A9A48E7759A9DAAA51B538F662A05FB897067B7CF9D2CEB47A1897214CCFC225CE47CD60E86F7DEA49E220F7DDD6894B30B66460DECBBCB2E42B31F4ADF0AACDDE544B9124EA5ECB04B03C448B17E8094D489F516D23164D2317D3A1332E0500F1423136C8535D69065E880AF34CF7E36DB5FF2C18122E41880585B4D188411E86B370A024BD6E28143EA2EAE52EB46BE334A21A02E21C6755C0182B9A055A7D4C7B056E4930CE63EDC79C9FB4E2FBFFC58F776086F3487F02F8D1E7C8519C7F452E75CE5686A037B3642B95D7526ACD4A81A47112CF96A8DA7548016A22E9359198E871DBCC5852FBE14EECF3CCC5EB2FB5EC31D10474DF7D63482A03E11F4AAA2EAEDB714786E21D03AF1CD644D06BB05FF7B3959601580BF50E5F7F82FF42E9CF2FFCA0C67FFC52CEDC53C7A5C9EFB6C21092DDA374D1CCCBC78BBD9F5EE0FDF6DA6AC60C95F7C2E96F17E3C379A52D5DBD1A92DD76D1F5DFA19EA0408E0E7F7867445445CFA60BCEFC016E68872FBAC9098FD6A8E84731C285570B1BEACCA6F4728958E7924F7A7B7730B9BDC9AAEBD9E045F464071843C650D06C96D487CF8397286F81D93D0CC2008A62EE32421E5231998140909474F6D98541D899EA53714AEFE652A3D792E4C72533332C3133707A49293E3B2E06AE18F2F81D601AADDAF2FD09EC59350E0979A5AE2B721771682A1BFB5748D000F9736031CA971288F34993DF10FC06A16A6DBEED8CDAAA8127F3B71432E723558F0281459820A0F4A75A3B2716F976BDEB88BE9C73F31623050D7C1A96C84988B01D847309E1B6D7B815883F83C9BDB7FCDAEFA8BA69E25B824812B7D54530A3ECC96611897661158DAE1B4AAC112E9AC13D07FDC03DC7D5AF23C08C5E4BBFF737238FD3F1C06F94215BF2351DCE9CAE14B4DD4745AC0CD626054469C6A5286FF821BA192706D47CCEBC443DD67FDDB76797A8B78DD0DAF850CB5D181C82298616E1D3A92F7FC82FD256857915773C7AD97CBB9710373299AE8516B8A1D647A13C7BE848E0269ED6C8A91DC50D0CAD21430A3BC9E718A13D1966A0182D9A24FFF7ECBC7876C868AF2BAF2D8B782172C6719CF140E8CB877FE6D78779E1BB31C70C6C9A6A77529C51CF78A5E4FBD7FF6153B5195817F80603E5C5810C38CF43CA812ECA52F73F045E33DF4E3D04EC8C5F8B4A7399F6CBBF0D39DC951C476B9BCC002720CE89F09C3885673BBA9C90D20DCCCA4A82CE5BEB38BCD60AFE2BA65FCFB01C8793B7ECC0F0B17A9DA74F2E0FEF4C90B5132FD6BAF8C010FCB5E8E7FAEAD7F2E0DB29BFDD1811072623CEE274EF2EFB0F7D4191F332AAF20CF36FF89A2EDF15F7B284CABBBEF46901271D8C1B180F736125C8A44FE164AC7E687E9A58C3B1775238BF1A11F99BCB583D0E3C44BF4F76DCF9496A06F80CA52E24D55B54AB849D3040B4798BF5292B0574672E9F844016A52A4D4E4DAD2053207BC97215BCC1BB93271C03C9AD2DFC7485EE2ED399236AA06CF9A12972E21AFDC587A6334CD1D71A7539362D714BA26214664E3B4BC39CDB1DB847583DB8E002A2AAB451B4E5BD6FE200730BFB2745D03C82B640F4CCF58701708F724EFFDF98CB04C78DF36B7A866CFD596BF5EA18445EEA0E34ED514D0DC2625039049A0CC82711DBBEDCE339C77F9FA1DC60EDDD8D58C8F144B0F3D00227AFD8710BDC66D29809728D7FBE85F08AA38AEBE5605DA29A09CC0526FEE84691EAA54DC3744BF5A95275037FA2F600B1F91E502D5D81AF48F8EC4C1834FE625FCDF2364067048727559047E07062B4D8A7D3851853BF28BE9D2C511451E5FDD9459270328A2612DBFF42E1DD34005A3DA1226A023162F454923C0337E6C74B44BB27A3B1AC82DFD68B0A6DAF93473D97A9E4591EC01A51CB6B47E2C7A85C1FFA73C35E5CE3003BC4534A2D9B16EBF9FED6464CB1E0CC665A451616A62B6A8481E4506A73883198C144A06331224D358196C815C811B103959EDCA35B26BCF86F41D9C7638547496787885EE62B14AF431CAB2AD4E0224D33476C58B8B0833BF13B50BE2B1D682CA7DD194B793AD2C6E4EE25AAF95459302F0B4DAED907A317BCC6A5F8D76CA9AA0D799F8EA39F330D6244BFB9F35E6223A0F665A65F55EAB9BCBAB446D7FCD424DCE87F234864D2C27EE84600ED9193AFEFB6E7681BC94F514FE0748EB32D32262CAB880D79CD4FE5CC963A4F688D448F2DB2DCC5B0CA87AC26DD8506512C100273B8D4D902FC054D48D8BF9EE818AD9619F68A8904B613256DB78C881CEA3373F0CBBAC336A78CD91AD9D60126E05CB8C16E9AA8482CF1B806B2F9C57BC8D63BF008AB2E49EDE8E788BF96B9F1DB2918DC5063F3F1D5B9B1C0327141ACC0B4B248FFDCB8BCC127050D27C805E154A4825DEE6BE9C8D4E42B1F5EFC1EECC6A45DBC119AFB15CCAD19789EAAFA8B1715111AE32E2ACED2278803B60E2FD63A43317498244A7CF7342342B60462510E19D83240DFF5D58E762C093DF326EA503FD347D2A92A5A4680D5E13B305671C729179FA21BE83B0D83144E63 - -count = 92 -seed = 4D0788DE958A707899D5DCC02F756A10DEA2EFE0214F5E01B3281DF4E013CA75523ECEC64723D6C8BEC0B92C4F821D8F -mlen = 3069 -msg = 9163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA -pk = A0DB853AA90B5D5F79B5503EFB7781915E6408475F9AA7F546D1D207FC26E413D7CE99A82979D7AE5D9F8D22A74849583B3E205287C3697347930619AEBFED02 -sk = A0DB853AA90B5D5F79B5503EFB7781915E6408475F9AA7F546D1D207FC26E413D7CE99A82979D7AE5D9F8D22A74849583B3E205287C3697347930619AEBFED02020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000288986B325ECDAB7CC2E0FAD61E4539714887BE4BE2A2111975E131D39D77B038C26A0B5FF4480951F2D703D26BDFFFFFFFFFFFFFFFF652C0B694DE9FB2974909913AB3D0F1C7F1DC194F450CB486D3F54A08D8DA5C10D2EA19DB5DFC456CD2F17B947D4FEFFFFFFFFFFFFFF6502F80BC3904154DFC50DB418B15D38B9696143F7DAFB1A69E51BE78AD7F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF986E6C095917B813377762422749F6A2C00CB434A01C99B1AF95907BA6980F0000000000000000000000000000000000000000000000DFDB9E5B4C6E4070F6DDD36058B371BE1DA2A956E9DF5D579FCED9844793ED2A99C72F86634689A95365B105D05500B69C673DE3E1B7722C27B008CB842199311CE1B94DCC162AC7E394151A0E735B617DA67BE0684F22798954C8BE6B3CB32B7DB9BD4A2A7E544FD6342DA8F9C46F41691B6C51542E0C3C3A85B89C0861F92FEF1586BE20F4A30DDB39F7CC756DC8A6DF57FCCF6535DFE10F678EB7358EDC22B1F04E91478A1C6B7FF255F0ED66B616D52884F044B291DF7787582AB4E0C013CFD557573FFBCE21FC44C3A3D705CF239A385E303378757296319C3504F1A22089133FBC79C57B009EE70BF717B44EFBBBA0D1CD4952C05BD62F3BA0F51A1E1AC882E50439510985E22BA3430F23FB696295BC5016C01204D2CC28D6A6FABB27094565AD99B81AFBDBE8E62C70FEA966057BF3F083EC104AEECB569246E3CC15ABD7242229914F248DD19910DB7663991A3AEC9FC1C617930F0AE6A9C3291A2CB07D6FF46E9F7666E80B9A0E8E909C41E332FFE7F422DEFA7B38E803E6466C09F9E9C04CE70D228E36933443E155C8DE765048A56C09C8C4A45163B3A46A912FF437CD19D2E3C9F31EA18EE9DC90EB4C7B8CF003E237BBD5C6685D53284B4A2A -smlen = 3246 -sm = 0AF6A9FC8C38AC7439072F185ACBFBE04ABB160675199E90BC7648B27B032FC0A4995CDAF6C52B060E843FDB745B6AF61B054D38FEE1FFC56B0A1700FA37A2895657E6586300040EEDC49878B5C2B10688F073073CF483518C043AED257E2051C3FC97034E54A881B71EA5AE66070A38EF1DD08AD1B0C901966A77911627462EF207A24CD89E5AD0451BD500011790BE96C1AEF75874632747F4FB4A1A0F02B8712709981BFA5B890177CF0885AB8B59019163116C86E64D90D35CB216FED71BDBE6A0797A48CB915F5A40FC8D31AD340767058B28CFF0C240720327E12E653C1F98B5755D8000BC01324DB2820781B94C4434FDA76223845E0613E2526A95F28FB4A768B1487AA34DADB28CBE8DF4FDB510DFFE672FF004F37C7AC32072A24C0F12A050BB396AD56346F4E0BA75C0EFAC162288A7EE8A63255DBA5CF451A0932FD56B05E40EDD491293E045A6081F6586BDCA10B41A6970D8F9A7B3B6B58AA772EEFA9ED22C9A24A384D6947770862BE4FE45C5E0E56FA4D116B79699ACE41E5D9F2E4C245059CD798DD986A3763F527E0C9D5A88A09C4D76D447348509FA7D9BFBF3DEA59EA57711A3B1A9352123D4A74DF273FA24A89BCAB42A6D455B5FE3C503F1FF638280F87C740B9E4C5FF20133CBDFB8D08CAEB7DE9F26811D437E6EC8C3143C0419C2F5135D25C7F40C7908C03F295FD26F1A03FBC7285196BE40ADC6FBDDDC912B3BC94B0BCE08DBC2185EE3CB766325068DB55C31FFEBE4B1F6848AD4FC201A5FD056916A397ABE6A66FF9BB03B037B50AC509E46CA441ED45812E3334FD7036D190A7991E55CB817EC2A63CD800F293277E7D15F086618B55AD395C614D168FCEDFB274FDF4FCD50CB976F68A266C5365E02A1ED0221BA4E13E70304824F94251249CA23C089B4D54E02EA03FB7C9841DD30404428AAB2519D68CF564D75D18530C7D062496C120A8F5305AAB23AE52255EC919EB0CD875422B144BF47F7472349558E746B0EB5493F1FC40ABDADD2ED84A8B31221A485052369FD0B552972C9FAEB1A78E826BA4DFB9E91E301DB589E9D7C256E7051692C48534C6A5E2BF0F45B78ACA66D5F53E549827E15D64E2F294F93D43B9F36BEDCE6CEBC05E56CED3F846635AE3C384C3FD55B969CA31E8C625103C2B24E7EE45E92984CA23A331C5B14281B20116069C619D82D6080C6FE35C3A3FB2E73B695CAD9C5D3300814FD65738DCC3EAFCEFCD24361AAD13A25B3570D2D509FA449612BDB5B49E0605D7EB78449D1DB40660AF0F3D8BCD4869B6F175CD28AD72FE2668C3DFC1D4963D0EAB309DD50B74B9D2947F86FBE9864AE5D0DC69B55B182AC1D914B11F631193F5F1F897CE52CEE97D7AE95631FC2F2A1AE9B672165432EB2E5633B55185AFA5E883268D8503AEC10774D25D39C800B74405414FB06C55B8C48835577884D6B4F2F128246563066F8F34D76213E0720E899FC1F11A3B0A591885D82C688E40D6B44B54D6C7C6973156E2DD50C40A28D2EBBA60F5117D64646CAEF72974F4B8362E4820EC04F2F373DA8D883AF27518567688146F16BF4E10969E70BE8ACE5D2FF6A135DB1DD738907EA355FB6D243904F6427D11592672060DA14443B55A9089167FC9D5EFB2C64B0069795C341F90DAFF684E566611EA87BC40A4C45F22C23AB6888A754B89E4C95BB54629CE74EC999889C82714B5AEC703DE7BC080B0D2E622ED53B645688CE164ECDFF4ED66C86049B2F9077F2A94CD685294F8EA9CBC1DE29A48D39F6B308288DFDB47731E39644B576A298646752F5C53D7943A5D0F7DBBC9604902B61B8EDEFEB5AB7E5BFDBC1E6723E6047894547E440E918038CC13B47424CCFE1A207E08A40524B553C750683F5F6C960F05836FB9B28C59E1B471FD5331F1811DDF3EAFF73798B7FFD6C9714978988C440CA906B4782A410372D70EE65A0A803061708003688F576E2D3A22580B706149A24B93A162BE9F1B546680A1DB2A8E54A576C28B4772C50A55161B2994514369C2192B2C90017CC8282F41D28099F38B2F1F0D2C0E46B444417A2078755591F00F01DF0CE72B1D1BD255A14D2BF67AB3E630F95A5DA9BD9E10F08EFBF6FE722CF000C32460FA3271F18B39EAA4487C1DDF828B6BEDF4523837BB3425BA1C1606E8D5D1E6182AA6A74F068F3E90B42641347CA755779216AFBC99603391FCEF4E8E5AA202BDCA24B83FF42F4F01232D3F2831CDA2DB76FB93A4CF6E9EFB71B5438A4B74C3190A8901D73566C50727559BA9BF6317D116E8F5536BACF064D3F86282E0F88DD40B63E75519C6A8E5664AF8E1029FAE87930F523E4DC7C2DD6DC3296A42A59F178D438866D929A70951BED05533EB1D818B7C7C595971C26B1D436D26897D6A6EB036A13511AC4A3BD724F2CA57FEF07D2C0730800D35683D745125F4237ADD64B538B7DAB0D0F258DAF7DE1A74F74A2FD010CDEE810F514FCF6045F0CC84E2054B5F4EC2772718FFB4CCA9C9BE77F8F007333860180D60EE4DD8CE976E63FF49AA11DD42FE6946515E59DA3E602B1861BD3F63C89362BCFE8438BC71959A617D8D63331A3D903BC5734B777FB14F7A2B063D79EA8637AC52C758EF88DF217B95FA8FDF1009AB28D8A4F318F78772568CC7AA9E3B3E001C0111B1751B698EF1B66383D6B3CA942FE4F66FC97613CFBBC03EEC9D0B7E08F80939D9A2EA1F72BDA7B0D655AC3A94B4C699D3EB1BBD6076E63EF5C1FE9CE258B55D21164CA7EE03BB53D8BA4306F695E648093542D769DA95A35FF3A2C071DD8ABD5A82E217D82317065D50A87B689AE3A2EC7887957BB243373CF986490961220EA61EBE12AC0287B185070E124FC518C300620B4B6D4F29402B18C2462A7985C00E2A87691053B1FDECB7AA264F33E27C6B201CA6065EF79E5266513AEA92E8D3E646453C089B5EBA66D14BC45844D0240D2E7737C16668FD53E38A93D6003146019777C03644C300D06927EF6994AC794914EFC5BE0CA81680CA8C9752908FBD2D56D7FD1FC1C76EED755408F1D7802F0D3D0F347D82B162EE6F0A2A890E083C20B822FA6C4AD627F4AB5D1526D83D897C244D6ED4A427B23B4A0C19F4E8889257C1373764AB7063B5DB8ED9C2443CB012381A2B3365EB568649D7CCD52271F25FD22FDC397E4C9C536EBB452CD2CD10DC5010BF433F88CB58D2B9EDF2BCBFA83B782FFD4388F1BCE3F8F9AF5AE6BE590BDCECB1BFEA846D2F0199ECCDB0C7E4D419F69B6A428EAEB462B67AA40340417BDFEBB6039AAB8242E39F6C11EC136D73FB315CF71414A2A1203AF08FDEE34ED0072C27462395815F7779012A41EC526BE53DA954E1F7A7EBBB68FEB15CBAEA8ADD6CD0F2FE3D3615991AB54F4C7884E8A80A9535F13BE2ED944B3BB315DE8AF2A70439294CD53F041F41D3562BE840C78EFCB08661B1731FEEC46A9091ECEDE3A9FBC2DAE42C72EBDD84308E95644373595DB62157DBA7DBF124BB45DE6C2837B0066673BFD215FF915A8D41637EEB029C345E444251ECBBCDF79E246A80AA4591976A00DA06C759C6160ED1986F8E15A562417DA55109174628E7B11D49586882851205755B4F99A875AB3599FDCC094E4A2164E1764D24DE805FD7B20EFEF2A8E23FEA4E206DFA1FD9C31D90C1FECF745D3EB886190827D952703AA6A99B5000D8EE9D51DE94A82DD053B6AA89CD7E94E92D4AA93A9224D3F688B5C834A53F2993638166A3DE78ABA7CB930CC5845F9915E6523683715A187E940FA2A978B5CA4C3B80DB62E96A600F1864BF0B1AAC23B1330B13EADD3A2F07CE7181D0A9497C455D228278E5CC3E4C00A2EA3EB8E5B9CE2799256302B0F8F1F829D3A3AE8AA7CC4EA229C5AF476C01B8D48A9F6987DF57C3469B6EF6DFCB488A3D5B91FE17B5798FE154AB8399A2E75F0D15B2A6AA91302056266B22A38A604EDC374E2D2155ABCA119C11DC6827A47E3CEE7032F6E0F59708DFACE221E47041CFFC59CE0334D9B7C5E91C2C320A70EC2F32906624128363C893909F47BD970DF652D5E6C2324033F32B1653A039F8C051D9DC8F839C50F5696E9E08F7F1CDAC4750B429AF03176FF6E643ECA1D8FC710C6CDB0D26074D85316F4C9084D5F453F6D36C1CEA0E389F3462E1478E2503C1DB99FC46F3F0627F173672C21F3CC3B483998192E81EFA689819D0007762ADBD141A058587E030A3568E412D25662C40ACDAFC3C6EE30C10CC23E3DDEDB6C73085C90C89B1218D67A328F06C3637A786D4715CB9F9D8B0B22D920B68B0557CC80A56FCE0B6E2D6627DE576E308757A8F37821898E96785AE323E413D3572205B0A5710143A2621C258C76C7C3FF7100A2FCAE99C84D1AB1CECF7FC5B1E4698BFA3BA2A0856A65F2D4F291A4A164C0381D70D1213F7E40FC4BA42C43EA8E70043E27C5AB0827559B7CF7F2587D0D2F93C6382CF54E92764D815280D68C554E5B6FBB351BD18635786299DDE39FCAF3EFA708A3F18701EDA1579BFB0BEE4FA1F1ED6E09D450D427E4B91F4552F87F31F06F109E74AF4BF301481452AAFA2146F6375DA467EA008BAFC3C8408AADD61B07C28C55249EC0C8BFDB00EA - -count = 93 -seed = 55A9C7A0B49706090BC0702ECFC070AB060427FFC820C3FE05B499B59AEB125F2DB4787A5910B88C6F8FAF0A69BE0AE5 -mlen = 3102 -msg = 02C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 -pk = 943345B50185D5A160F66015B9C8946B54FE7FE8686C989C78D4295B35AFBD11151E2DBBF6685345735FF47044719E8AE14BA5ED3BE4B19873835EC8505B8E12 -sk = 943345B50185D5A160F66015B9C8946B54FE7FE8686C989C78D4295B35AFBD11151E2DBBF6685345735FF47044719E8AE14BA5ED3BE4B19873835EC8505B8E12020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DC37128F5DA332E1E63F7D1E3181EB82C9B32AF07E6B21C9137CE8D3951F38CDA03E211406E4EDD36A227D6A2940FFFFFFFFFFFFFFFF3B399E13430FA933C1ED691DCC58EABD13D99AF173A5A940F778FB79C9FFC9AE8CEE3651B3361D3DB8E2E159F12EFEFFFFFFFFFFFFFF0568AFFCF281BB5AF3EE30FD2A9FC9B93BB6D00A6C4BA51D9A0BD851B586FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CDBADAC14EBEDDDC6CB2521260AEBEBF9135C9B9E1023A8C35945628E690E000000000000000000000000000000000000000000000033E0123BD13C0D3D80BC7C2B05218AD03E3130E360A80BAC41CE6447FC9F53107B9E23BDA72BF1C1EB28A9FFB506E1AB98072DD4ED7E7CB196D8AB5137253E1125FBA99251C58B2D6E6143C83CC5D4EBA772E2DDE38CCB20972EC89DCE853F2E32C6FB3720FE1E1526DFDF179A668DFBADC124FE30877427F7508D269BAA000E06C35ED82E6FAC8C15517FCD6EF83A2DD5689756E5CC0119B708CF64CDDB300EF2F6D15C25DA5867ECEEE6D5B12691871787989F920C17497ABD6A65664131216DF62E073EB551CF9692D7DDCCD743BF165ED24677D4161F6080CC5249C03F017EE3884ECD1C14DD0648F7645E455E7330BBEF9D2A522F9153F527D02A05E718ECECB21AC248A767F89CC85A30438DAF78A1FFB0567CF80E5571ECF9E3C44E08C4CA728E75EA253CC903344687BF23623F8CDA46C6D4D05A73BFC86564E06E06C4CCD704FF0EEBC775271496716681F6F77EAE2B3139B529CEBB40F2FBBF012E78DAD559EE10D1395F0A0AC1B357681B1378419CAF28BDE1792DFDE2E5E52B2A49BEBA94A3002255F82FEEF1B4C3081273B88ED29606CD43D23CDFA6B8125F183A70ECA16B35CF9FCE844CCCDFA042C71D822DFC987D98B2B40DB8E6C41BA101 -smlen = 3279 -sm = A810EEF34CA22AF177032A86ED70E1205E9107064DABDF2FBC73E7DD940050D963325E87476A750422131BFF3E70B5ECAC01C32E274763E59728DA0547C00DBA7424CE0AA5038E132FDE583744C8D801626F2C430AEEBDF09D030B06071CFB752DD0EB01C199A31DD9B9589338051D920004D23E28E03D04C3462A515A054978AB065B9499C2D62C99A75C06018BD780C1FEC13F1C1C7FE9BBEF0319F80E03848925A4B390BF7A7100D96C845734471B0002C7C4451DA90503C43FDED1CCB3DEE468A6A8D9E56670CD8F6A58E7941F1BC5EFA6E2AFDC0141A2F7E8F781D79E70B4813263A9DBC8D8A67F89371CFBD90977EC96461B28BEE4C644F2C91E96257B1909B84ECB25CF438A3FD6B835E20D5CDA56A1FB7995FCAA0EE1B5327FB1288E3C57CBEF0554CA5AD6FCD1F1865C6AEC6CBDB24495700AB5AAF078D8516CA4FA3A231A97C77BD150B127CDBFB42C03702C9027B2A5F6594B022EF55B63BF3EEC27EB0E9529ECCDC82BC6AD1F011F167D602EF1F175DA5DB4028BF08A053AF2C728ADE93B37EDC2A75B7B6C6CF38CD1C07F359C73B131B13DF76139DEE6795F1D85B47F29AE97D0E40CF5DBB67360044F78940A1E80D9D99FD5AB0185210D8769911BC471650DF0FCB9C3AF038F7882F677790E146E612FCDD6FB89F90B7E5E46CD648F4BF8F736D69F8A91E4806346B4366FD48D1481C0B47ADD82003310B0A99B779D63EDE1771F50221651B2D8AF40F48B92EE1327C85A1D2EF2D86378076BEB58556FCAEC6029649A0EA5FDE517A85D87704210E071FCB6F63317AEAC3EB3E9746018E1028C50C790A45B1BEDA6EEA2D646DCE401AD5D7850A5F69CD85301920DE77AB0D01B1361EFA3E70AC05881BC02190720ACC75A691D6064F9D24C79DC72476309E58CDDF5FB2A253D857A79C8E898AB6ADC300EAAF208820CB02F5F2CD317F4052D40DE28E52C55A0349DD855D64E8DA8296D4F572281E221A3D27EF76FEE67FBE5484E6460C99950763B801FCE828E93D2A633A1CA5D7EC582D7C463DA5A9AA8056BB2173306F3820BD0A3273742789B61AF89CCC42B81CC68745800D2A59231D5D28E832F443A871DE5B6B10B58A8AA7CC9816014D7F3545DDF1F481B7F0C9DD41B4D96E5DB767B74776C2253FA230DF65F3E0B944B95ECD4138E2847418B084D9F9E0798CB5247238EC12B88C10A5C0C645E1D09D09059C72E33C28A472FDD8B88EAA93C63BE7D980A12195C2EC3105DF2BB81CC9C3009F7771B6B813CD12303E3A9961D6731AF55ECFE5127BAC68D06F835DD5F2D584FC0E648C3A4256E2A3D4B81966010964657F33D1FE0400724C488D5AACF9F2C0B802CD812C8452E5B8E2B17FF4A1289D33FC405F5DB4ECAB4A73FCA3634756DFBF9012C413B6F64788FD0F68F8AB7620477ACD3C14009377F3DD54B9EAF2784433D63341323F54D113FD63D7456AFEF885F13C13172A37A5DC82336B9515F8F7F4903EF6DBE9CB34930743B6ED11265CF94AAF406DEA9802D17BCB369AD0D9964792F74D338DAFE47EE88B3B74EBA8E70774EDC1F16FA876FD62B0BFF880CE252EE4435B1DEBF36F0A06A4FB406F01D618C135E6103E2A39F4C9CF41EC93702BA76BA753AB49B5836C20F67D05943EDDDF47AB8C5B81F4BC22D773305076F7E5B697A7B25B016190072F756F19F397884E0521595326CA591672684A3BE17C9F5CC8E8F4848F7136762178FBDCC7BC6A6C6A31345FEE687B0505F72BF1AB7EB87BFE5F896CFD42DD67A239C70648B39BC0C84DA33CA17838FB4213C38B68F22914FEC3DC50194E883720719E9B5F8D037DEBB726DBD899ABD97853C54B0BC347A322BFAF961C6CD6209C98AA81B8E2595FC151B1375BF4FCA2DFF49DF40A3D1C694EDFF6E9687E73EF62DD42AD7A05195A7F206F097196AA0E4D68F8132D4A00CEDED940C4F6AE02E6D3763073462C7A4BB11778290E744471EC554A05917E52C5263FF02C07BEE055234EEE10B79175DC164AB2051B03598DF1D4311E87ACF4AEC45C55B1A58B0F05EBDABE248A27C0187643CB8F9529D31FE0AC4A28D780196DA00DACFF5F2DD64FB04E7C159DBBCDD3343BCB7AE188DE15D923D2AC0AF232C5389DC9C949FCE554F7A0425D4F9B28DF2EE4B81740C2B5A5B93F0F7AB75EBD360CBC78B11C28608B5BAFC970CF3D4455A20A198392D876EDCF89E2639B50CD84AE21BD50FB077050EBFFB210BE711D8EA807CA66493650E909911FD3CAD99AB94B2AB2EDFF192D9D75257818272E147A9C54E06C53210FC091BF4175F2F44423669716FD9A6C4F96A0C4BE17839769A806453E55D7357FBFB3D7A458E70957D524C0E896398E135BFA68A0CC136FB93EE7D30AD463E32E152FC32CB8E7F0B05A30EB13C0DF98BC187EC0A54856D2EFCDA10A82B89DC8CD21C67D9B6DF3D7005EF3B2BC9DCD5D55B64DB40B74FD322CDF9D9911A00B5A02E1AD5CA9BF65D90DB709FC1E5FC84BE97574B09C83B49963A51228A667BBD84BFD8E0D90EC161FE5CA73BCB8D95FD7AFD982AB7EBAB51BD2B24CD6D356EB850D2C65593313D8EBB97E7DFA450AE982918582F86A356F538EB05AFD460566D79F040D36C93D3C645B636560007D51B121DE3FAFB3ED70B475AFF9617DA4B52937C628678B109C3B76BC15BD02B766A394893D8EC966DFD8033D12A8D98AC5BE201134325E32CB6786F4FAECD7DCD05AEF5F3739122B817824A672E71DEB312CB7DD6A77116B30715076384297B1962EFDFEE6D6D2B2ED2EA4DD802F4784872D825DB828557D4D927B7232682AD91CEC3E508854F529853A8797B7BF7BFF8E3C180980DDF4081E96A12A495ACDE0C73282AC78617C68A55A94573E5A37B859858D1E19ADC82821B316B9D346ECFC6DBFFB3779F692A62D20D1BC4E730FDE2AEE826E76638ADE3DFAA11057B0BC8A80E8905B15E41D9A4105109F18E7E1362149AE9C568D1D642D65B94253BE2B13E7230F8BCF34DC87241D1DE72A65BBA111C111CBF5BD618CD02E0A06E37F60B3736631073A6BE004C1AD5F0091A82C87B276F7C5AAF6938C886A6039DF23482E2064F6AF05636B4C6BA6B24A29AAF2174AF4BD959177203AE9B160F81CA6764948AFCDACF6BEC0B987C6DBE178DCF47C137C64809483019C5F2072D0301C19C500C60B5CA913C24A8F28F50E1578D806FF9F9B810CA14BF5F2268FA18DEC67D973EB1D975AAF871ABC980D06222493D900CEBD8811FA20D5DB8F8036430F8BD7F9554F7CB47F9EBF389F66C3CCF9F42DB57AFFEE074FFEE4EB3E11612FD8A8FE02CC4E9D2F8BB36C505CECE9DC87512AEB5D8EBE33328C5217CCAF2E1AF1E38BFA84C0035DECD8D8C250FB4D964E8F0AE448AAB740D9EE9D794390686FE9A95183F0D5166D479C51014F1F29D8FEC616E1A4E7A9C86E2AF790BC7BD7BB6F746A2266332E04AFFBE6B9512E6620681C3317DC846E4FD7974E8AE87E370ECF9DFED574E339CD7E8A663ECD1A7BF5842391913D98686F7F2145BBC420F2F58B89131D5F3BE41C85752E13504BCC549A8F690CD2B0E1E29E4DFA3CC76BD398BBF28F33A00C3915DD719F7CB985E9A0A7CC8190BFFC8BF47310C71418D7A6C629C491EB8E455148BD4438BA6B7014608B0CE6A1BC5B035BC174C9BFFD966D8305FE9E5619BCA3FE4B39E6732DC652531819AC828F86EA11360678E786EAA741382D713AE26A608D582A3E4583D45744ACEDD32670B5AD4A1310301B28A174DC9858A55F0C1B7486CD66CB0635083B0C63016E40DFC533AB80C9CFAF1378D00769DCBAD56B09DA3A4E6CDBFD8F3FCB951680020DCA58647665462E42F42DC14E7B20F262D3CEB0B1A2BA807B98D66232AD7D3839C298564BC36A134CC2447B1B9FE69271960459C0A6F897C1878140690DA7D41FD8AAA05A679FDC3037EB2885AD3C82374F4BB991745351292DFD8E54F565E0093776B7EA65DDCD500BEB4D15AF6029F2630A0062F2D4FB331B47B6A5E139D385016E1FA490EAA209636B1383B7D7DC1148F07ED2CC2C03FA7FEE09305F34C57B3CE899C18462B4F1EF88C1AC5259440AAB48C5849652AAD9D3CF3D31F36C7F64F918868182D36345BA5BB7A4EE088D8B081EB78FE977F5A5295177AA427215BB26D1DE33AD4B2D610A47F8C672EEDA703A04D0FAE4C5961F13AD6FCA81863D8A394135565D8B27904A511FD0621A532F84A47CCF4FCC2114D4C369B7A76822959F8CAA25A6495081CA9EC3AC3348A981618592C090B6439CDA2FBC932C8697B3709323E3388AF8EFA1B9CDBD65A65C8F0C302330DDBD10E0235F8030562452EDE447EE5A5A9A636AF6F615B1210AA7CBE69572B3467B643BC5F5EC3F9AD15B3AD918993355E209ACBD0F1393076DA3B0950803295B6571E476ACAA04D48A4627367CB7FAA83796C4178CA9071DCCB8D3EA70381B61F0C56D515E0A765E266DACB13056317AD8737A1AD541AACCEA1641946E331229F19BB54C20BD51E63D63BFFA13110A552FD0A95AB984EF53BD639EFA0568C6875B2798E3A0578C940C0C4197D3587BCB1CC45A99F5D37B1612DC1A4178A3E288FBD79DDACD049159D6A5416F9EF3F38C74449BFB2E6A894566C5C17B4555E154F29A93241463690 - -count = 94 -seed = CEECCCD3F7BB922650E3F6E8F20C47AF17C1C1053EA8FE08226F167D67C3B0781BD774C4C7AAD23C6AB0B9F3E3F96F97 -mlen = 3135 -msg = E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 -pk = 3D3789AAF3C7E4283C5EEB2F3FC53444732EBF3A6D8A448F7262809A7C9454270842E72ECBAE6F57213704D281E2EC873E6FE7D85D99E1DCADAA5777846BA625 -sk = 3D3789AAF3C7E4283C5EEB2F3FC53444732EBF3A6D8A448F7262809A7C9454270842E72ECBAE6F57213704D281E2EC873E6FE7D85D99E1DCADAA5777846BA62502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062822FBFB12210458F166381D233B4C87291D535008B163631278A6DFCA71FCC94B6B97BD4ABD22924BAECAC5A2D0000000000000000F3A7CFFD40F6F57874F6351E4623AE73BFFE272405845F891A7C0F23EB175DBE884243F0AAF75AB736058E64FFC1FFFFFFFFFFFFFFFFFD1BF4BB20A7CAC7E9DA3BF3A11EF6DDCD778F450366D4758DD84D9AAD90F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A3FF6C7B9E6C588E994111DEDAA720153661011472D01E9416D941A10770900000000000000000000000000000000000000000000007352D39317D497883B67C6E696274A04F32DDB516CFCE1B8C38E75C3D40CF702D558CCA7C76063055144B39A7BDFA3E31545D3D1DCC823B41A752C35F617FB30AF320A4A5CBD6C7833315AD7BB668BDFB34A28DA202FD72A8EED6C1399808305892CF91C285350E5951BFA29D6B037AB36438573BA162F4F40611BFD6E537D06F6222521149137D5319F5A5FFB7A1BD0E6A8DF5F40C9B790DDD6A7F1C6C8A405F1C8B7811F512EBB2BDCDF2538DFC22ECB0FB3B8D0123E301E02CEA566AB0918DEBEF115B7322A84D812B6FFB87E896F2F20E2F58423C660BA07EC078FF42313925D3153CF18193326428B7E7B5418008B3CB001829C1E361C3A6B45246C6A1A88ACF02A2EB4D6A1C7212F476CF0DB9A4D1D73578288031F348A9F624F3DF00C6C2AF8BD056AF4C5C14FCA12AAA3B7E62CB4ECE51B5C9477801F942FFF4D410FDC0FB5CB6BC1412CFB151FAD7C9925C60235CD18C6DE908851B2BD91851F260328F7AD3C845AC143DF6B84938E3D96E24A0C04FB811AF302A9A362B81923D52169ADD8EF295E708684E25713B166DA972E6DA5EE309DDFEF8AFC8A1D0E012E07950CE29FF47350E19E01433827DCF0665DC4F159493E037DAF694A0231118D1F -smlen = 3312 -sm = A495C77108E1A48D7A0419FE61C37BB3D84BC9063BCB88FD43AEEBDF98042F62F109BCA9D142C207FEFA2F73A9BF71544A049290EC611EDF7FE39F02DFB8EB45AECC361FF801C20511D34E3DB2A01504DD83F771C7C4D834FE06F00B01A5ECB43C0FFE00FB660698E6B3984030002CE925DB1D1C4C58AC033FA6A27AD381C8E78A03C4F3C3EC4E723F573A020095E94EB3391BB25AB9C86395B067BECB0403C5ED6CF3891FDF169E05218B4B17C3A4F001E13692E3CC06EBE8FF9A292D890F0A34DFE9A4F968F196B475AC4DF553A30E2FD5DF008DF4D7508302AAF6389B6A5A9135E9BC8A5ACCD2BD2DF98FF662B763101D31E24E8F182FA50840BE27F76BA5ED645BB4D3F7F2F6CE25179A47FD7B6441A9B3A28783CEEDB425B2912734A75D7D03811172188253BD8F0F52EAEE84A9FB025F95EA1B566C53297A6A090F7FD8B21639523E073ADAA750D63DA61631F933FEDFFB2819E0EB3074E9E11E10B102AC88E2C8D6CF408FD241AD301F9B8E18A88B74CB4B0DAC76347635DFBB3EECFDF84229BABCC003C6E4EFB7394E25667DD7FA47D36E027559F53E98789E6E732E6AA23A71607677FB975C2852367C5BA5E3D10B3017AD26F9A38CE803929D08A43646FFBC3980B359D8BC2E9615636D4E5DE8DE6FB2465A983EB1696E98DD33FAEB7AF8C2D30506B22390D7F9FC21C7A016FDF22D21ED2EA4175FE9F5F44598EC26452700DC9A495675431E1236865F2F4AA5BC9C9A10EEE9E29B1FC4FEFCF8F24BF94342FC7E19AA6534C3B771D910AA419EA2BF70E2C1915891CC630A3397551E4F34BD2192B70EB210EA67CF152A35A3F5D0878E153579B42AFAFE5068B2BE2B48127FFB54553B7A9B6F845E7D72C43938AE42BC03E33B836AB212909510AAE7DBE8EE6D0EB8AD84D60832F3151273A1E09C514C3AA4CACD15564643F4255F36059022B91BA4137ECD97B34BE3308D40EF06BCF4F45EC625B54C7347F52A21815508199C8B7A6212779CD171894DA9FC3DE2A6EF5D76BFE03B8199ED1DC92B2A403E4DA009CBC0FB597C5952BE32579EB8E781EB12D935848C051029C528CBB68CBC1DE0102B42561E21F48E72E028C2CD8816A9027914571B49D2F94C9189E1A7F18D7D3D0A09B3A36EDB8A084ACE5FCCC77E3E42EDA0FBAB8C81EAF170103CA757981839C9448362BCAAAA3F20C8DC653AEF36953559F3597E1915F02A8D33D0E46201FC794EE055E6D9955B91FC7ABA1F136C280367404725CB355FC2F129413581401F98236D2A6F8BED7FDD7EA99060DABE3F0E8CE20B0E98EA80994D1673E8CCC6A0BA4A9D544F3D31BD95C9D3847527A978C1F155EFD84B6A7BECFB749628CE82E80285FC7272EA05F953404E437AD557F38FD9BBF77A69B81E4441605B23F2AAEDB00C7519D8E9CB4CAE5F8C3FA74FAABF6C12595BA045F647ABA7168C65C8A6006733D1341435495C7088C3361B50C43787EC24C24F57323466B5C088E8097B44666453010DA38AD65B426E72140AF78A5448B2F93DF3820F013FB9DCAC49604C86F2B2E4EA565463917285F148E8BFA9E11943AD3B86B14ED59A190CAE097DB26DAF8FD2A642676A37DD90C23B52C82CE028B80A805D9BA05457F7B6CBAECBA4094822E16C14D6E2291B731D581B12FB16802653360AAA6A7989D61C80DEBFCCE81A36D9ECC84039C4F086A5579D36FF5D0CBE61292E4FC3D14277AF380A9C1DBF36C2D61F59CFC0D62524E042710BFF5BA719E56BA367FFE849D660B9F7F3B638E113BF2E1A4DB1B8F65A0FD680BB2A168A4FD5B4E0EDF3208AD47F1FF4AFBAA726E38763CB5C84C03DA3D1E32CBA873B9A0C750922CD3D0A10A4877EAFEF602F5C875FBF0EE2F4F0AF7F308EF934F7E8E74FDA62A860BB594FD061D1B2BB32BA613339042FD90E749ACEF450D204072ACF58B18C365E4F4B815F1E837453C4255D53BB68D50F3677E7173FCC23D2B592149A9F3DD615868AF91F705387547862D34553FD45B8DF643F596DFDB7ABA47BD5D91445826C86FD4D30365A2F9A3CC0913DE19707D072F27A09EAB906304008875B5BE3526210D6B8BC8663975A1F78EAB9CD7F7305CDD4C00D6277622E50606E1CADD639730101D088BC2BAB295AD86BA8E26F5EBCB3E9C7C543E533A7B3C20F0F89001775F714825DC8547BAB06F5B99C5305EF18372A184569323FE269D45B669B9A222C9DEFBB0B2C84F42A57EF343A5C12F5712EEC33985DF8F0C566D471A9403FC103A3EEED42829D8E3E5C517BDE29447841CE96C8AC587DF3E4B6227FAB386140DB0112ED0D2846355C4A45E94F3A0718CEEC13FD3CAAEEFDF0B7F89F502AACF8C9D96D01B5549157B7DF2BE65BC30C889E69971700286C561DF91C8CB923001E5F0E21D2C7A3DFE8D1AF07FECE1EDA20C031B29A4389F265D2C7BE64EC37B2884849EF30FC8A82D2F766ACE68C72F0A4B72F3B50884749814387893DB2370A3410F794C64CD24BF0D13E44AD500BA9816F9BAED72F7593F758592C2E974D1207A664B869130BAA1FA71DBC55875134E7CFA276E36568F79483886099A1070C14C6E4EB87523E04C0154A2250624261211723453CFAD185298DE06D08CC25FA18BC58B34ECDF5D9DBB02541BAB4A2AF110AE09130E12439F1CECC34F9AB5D7BE36C827A6F2F6708B543D4AD2E424805E2A74895742B0A5DA30CABE4AB45F40CBFCCBEEBDAB9B8EB8F78781168B5BC79E04EFFE1757AB0547B9BD0D2625673CE528D2B4874D46DF0E09C24FC413EF9AB4C3D2E803C1E316D77FF5DE3368BB925B2B1F6FFC340525663931F5595C8AAAF9FB0DCCDFA4793519A66D4FDE38BD2044C60FD1DE15D60BA878FDA570E7AEF6DB69D2527A1F1481A9D05FF2F6F621238939ACF5D2C37B2BC3A194A9E65E7441764A5EE37B1FEF3B8C9C425BE1B5FF0D05BCB6A3B91876EC04ED89A31749FD443C2B85F8F388E7070D77DEE37E2B666628CC9A961236DD24AF2769C1F613B4E77F8E82D1F410ED59F63F1DF19BC53A448106DE4F8EFB8CC37E40144B0F658A4135E25A3CF36D8692DEF2677E4BEA3A9770F19E44D55080625421D5BADEBEF3B39BE71C08650B5718A9B2FCEFC4BECB26C4B63C43F6557DD66517D103907F82F9C2B965B7C5E36059D2159183F5ACB8B5FF5E6B92E94D53AB25AE955424E80EDEC4650BE293E836DA6148392C500FF4B7672932E90E068569B81AE335B2E5013CCC95F571948D58127EB1269A08D6E897D2D9B60F3E49847C05D0B3AC230A67EB6D38FFDBD4B8D82D7B9EC803429C701F080BE86FAA165C0111131712DB4957FD84A8936AB55558C69D33D5890CADD08D7F0D4962CF9E2F69C7517E79DB14B76E6E188F5ED95169A2A7E4C0EBC2175EC2DD44ABCF239CEB3E22F955ED25DA41768CA5FD9A9AE15FAAAFEB431958A679249AB8BF879185E8FBF9986B96A92972153B4CD0D1BE001E5AFAE3AD1F0B1191F1483738E728D4AD240538E5EF7BC9BA4D5903929D74CB64241306FDBAAAE17B1C3134AED2CC394D3EF9653CC62A29C4B0B9BE04E95E072EC98F7A80A7B575DED4A1993AA884C1EDFFE056EC475D934B4EB0EBF418975728C6E9CB3919B2B67D2C71228A4DF1FE2C8388E3A2BDD75549417FE795F1947F857B1C0C9CA021515FD4D79E691493B988080943C394BF29E4190082A94F224AFDE5853323EA51C06B41547EEC0DA5CC202A048D77C7B91E794C51E72B02EA7C14578C11D9DF48E099465783E496029EBB6D42D9CAA52902A4694355DB01DD7F5D7C113AE06E3F712FA577E937CD4FB817659F93964E194FE7D509A81C258C69C3415A8F11D35B414339FD1CC1D4F50665D9111592D1C3A3D69FCF6A971C285A94F5FFBFE8D2FD2746DCEB3B218D970D670D10135126E479D92000D41EABDEEA4C04D1748A4908DD39C60A52AA5FE29C8ACED50DC1295B5C2C4A98E3C62EE4F370F4D3E500FE27B66F65BAE604FD558D66B7F09CE36C36C8B5B4FED193EF56D1D8DF0FE6FE0031466A1C633203966FE83D6BFF843657DC0AF176AA8D5CB7312CB4E072BCFF24D5F3828E29B2037E8D1FB63537C70C27011E9A97E3F04895F4E84AC69C55D450B46D5792A5D790557BE64F765FA243AFA98527B976783E7ACDF76A7E1DCBDA72431FC30D7B05197478D8D74077626FF7409F95B24A1F1BB6B803B9F1B9AD5B06883FAE6C4B587C309A63F3B2FC9619032157B98C1DA9608107E87F4FEE0DAE995AB86AC9869446CDE92441F0B9F8240E6F7F7AA9189D92B7FAA3280FA749BA8C7729F8974049C5CBCB8C6650CF1C16B8194C7AE1A82B40B8B04488FCC69E674362FE4821D4C1846CD9BC49234BCC464013F5F9A082FB83D63098C331D4B1C9129F52259CCAF4A9237F8EC5BCCF06F230C08DDAF1D0C21C5930F55D3D5F60CBFC447E7FCBC75CD199733F8D17BD043B67B0C138CB0C9C8F2E477728F27DEE573796F71B013689B537AEAD4991E67F2F5EB94BFAD9509D7C235C9E55F68F26B9CE8AA90834D170F8B700A40AE9A817D5D17B1644D25BCF1172A5CF0C755A6EC04FAFC39DB06AAA05F5988E187B9E110EEDEA9C84B99AD29A4B31950F2C870A1F91DAA6A5817FAEAE516FA42660FCF56000F7365D8C6CC11D4784C6FC02E4D0C727806E9D43B957BBA124C980C31F81FACC6D46F6C38D227EEF8F0 - -count = 95 -seed = 2489C04BA57D149A60F446670C13C29998B52F3BAD548A751D7134B694DB25ABFA034FB4BA45E105AE27D575CBD02B99 -mlen = 3168 -msg = 1F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 -pk = 8E6621EFC75A3D0C63BF6A1E1733FF0E5C352FCA60941205B84AC9F7A70675265DF557514E0861C334DEB68CBDD677C8083DA516D86772B3C33B3708F3642328 -sk = 8E6621EFC75A3D0C63BF6A1E1733FF0E5C352FCA60941205B84AC9F7A70675265DF557514E0861C334DEB68CBDD677C8083DA516D86772B3C33B3708F364232802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060D3F7E879E477EFC8E11716EE22874736BCAD3629B0BE01548FC9257A4D1E10200115C5D55F2FE08123E0558EDFFFFFFFFFFFFFFFFF7BBEFA4AA4CB6419454F025408DC7915B9FC8A0EC8C4A246EE6CB676D67CB21227F8BD92FFB7A16C6307FF3D1D36FAFFFFFFFFFFFFFFC33005324DF32AA8083D7D57F33D0CAF842E0ED7DEF13D49E52B3BECC8680800000000000000000000000000000000000000000000004C3FC20743B1260B2900154A49D225941BEC964ABDC9B3D75618C7B2B5B4040000000000000000000000000000000000000000000000037FB7F2C4272A55790E860E88342817B3282C27AF55F973D115F9D3C79AE90D0916DEC492634FA14E377928D85A688B99DE6463B6C494FF40C2D8B9B6D96D21158D0608FABACDB628BD872A63DF6126CF83B3FBBD052D9DAE40264CEB066B0095115AF17BF65D3E93FF9030CD4F57501DEC9928A04DC456C39D5E2074218823EC035A7A562192E25290C548B9B10E87477C15609EB411DF2DE6A122C2F4650BCDCCEF466941944D4C323F2FBCDB3AB72BDC6E1AE8CBFF933C40CA9A3AE8472D415531F42D31C401010B7AF1841408A6BF168C91A933DAA9AF1A072C98C1F51426F91913532146840D4591BEF67789440132D1400E79E065A4AC9B7484C8F30AAB72B4B36F9959E8033F0ED8D981AB29ABAAE0C7FB58E339B3B45B4392F6AB1B2B0E76AF7F031A055F93BF59DFB0CDEF1727E4DDFEB71A12766F7690A8962002EDFC8FAE278EB7DF31F0EE554255A26DCB2BB81556222AB7553879634E37902918FC7BBA7C515773EB13E518C2DB4C99E01B880288CDE8D513AAC735C20DFB1BDA94DFB9E74D8699AE94F0E00141E57F8A7B92BDB9FB8E8ED7766E441E400F19D451D0FA4677FDE110ACD1AF5ED65887564733F7548BD2D4BCB62DBE86CCAD07 -smlen = 3345 -sm = 16AB1FC5CDFD799255042E017EA8694DE2B5280331397B38157BC2770604558F9710F56E65F40904341DE409B1B4E1A8C0010F819491226C44065501EBEBCB47C1A2A0614402A365A6AD7842402AAB01FBF779AA34BA47895A0078AA36514E3F849BE0023F9E6AA2655F20A9C9002469C424641563223100989A238C73AB331603012735F1740395F791530500AB96EEFDFFECA278C3ECBB953BD928D90502E0511F8717B62D72DD05E59A84E35D91B4011F7AB96E8C14D1A5094672D7034FA8F81703A2CC18983C972CC66736CD98B031AC8A479CED21A1F634938DF85F3E83161646DB81B9AC3EA22F80980B8E2EBA4E9975714E5A98985817F426C41F3968349686B69AF917564A2648401B8FA127FC3200DC16A9E663D1D345EA83131E21229DD39E70D7270DE7577A7E9635602FD2C30EFAF204A9234F0A73D21375658B0B0B04927E67F3F5534614EDF5137BADFED914A49AA301000092DA93B3FA4A0FF592CC3A53F4A75B54FEE775EFA421EEFCD6E0D32FB5CDC096886076DA940B26C6E07F12F6E08FA7B3E2DC42055308E5607A2732717AE592A6909C6E084252A5B08685FE8C6C1DA387B0AA9800B67CDB3EE2FB21B9BE5E6B79AB545563068441C0C9C1E68CEF6028A5CEDF27D3CA47D95094C9E1E68B8449758BE3FF8FDE148ABC420295DC76E3EBA8E11433217FDC3136551A5A41C1C7E7D6EF43601946897FDA54842D8F73FAA7EB7ED0DE544FEF2A95C6FECB13C8C0F14B5B22493F54374184B73D5BD47383BBC5DD7BC1BEAC0CB8E66D2F413A9DCEB7E1D0EE2D63B9EB28DB232C33A95B792AE67D2591F5AF59DDC45771A0E7195C4D25E7F4079359597678B0C0A87DF3D66A686A9215DD566D4722C212AD05A23E1377E37E18A6AB3AB8BF5CD47BF1BAF06EB05E4C150CA67D7E52BD297A08CFC97B575752E686B83575F425F3A450BB0F596A60E41F7183F463007FD019EE255BDEF1D98B7A0A12EC33B3E2BC9BF0CC8F4860DEBCFBBD5E40B2ADC2CD10EC35A341BE7A49F8D204FDAE86921B7DE5BA700A61E2B041A8EA7040ACEE844892E5CF025FFEC5322FF6D765BFF1107C967A12ECCB0489F64F8C13BD7057DF76485446641AA7A560C7E73008C46572628E1A225A8D3F6D68DDC9759A952FC07CD43DE4434BD3391089E900275E9EBC92563AC1403BB7DFDD182092130E3E6AEB7B666F4BA66C38BBE1F726F40A07DF6C42079A6054399519E26D765CA065F4DDFD27A29CBA292699CD826FA9D3E7EE31B0D76813879DB5EC5C7F454095DC3BD27323DABD2DFF949AC760D6137334507816330FA67D886021661ADC69AEBD882A07E01B4B6E5492399ECDEA99222EE785C810B30409DFAF2A3CE5A05D699C2368249C9588D86FEAA778B4860D6DD442088A21D2D9D0B49B15EC579776812AF8AD582F1C44BB6432D7472300B5440A382ED87AB64B20373A0ABDBCE391D0BFFC9C543EC686449FCA9D04B7141836A416720BDFF250A06D7651A1F98EABE4B340B2303591D0847AED6FFE423B6DD8C0C03459C381DB506F531343F82C116323899DF1E5D8DB8997BEC12EB70103F0BF2B3D53C4D4694052606EE32BE4F5B35450358D7D85062DCF7F0BDB51364700BAF92CD6ACE4E2C10E6CD9A332716F5F4BF7598466A99238357798A499C9B8BE77690635C57E7D87A904B3F2278C0B1B23E5860B0532F152E1626C86FD855F656B5D070BC81CE4634A87C8EA6D6A433C02DD2E6D6561B25968B149A6F3BBA40B749F188B84314B5778A000CAE91A53D59860EE6F7DF38CA0935CD64C08A34BF19981C17951B9C39A847D0637441452E38CE5E1D9B99BED51B86705CEBB8D3244C40BB8D70F846936A2BE29C21604A7E6BD3E655022B929954F6C9A5743F5FC2127B49956D80128DD582CEAA06FC174813E5F5E6A0A4D7D26756FB28A6588E9410722591CCE2A6C6ED0976B98E1FB0C642D5DF8F08E96BAE1FE10375FA1D7C70806101570FEF1EBC8F58664281E2B61DF2081B655013AEF54616308504F5F4A1E8F156680163489D3FE7BB0A514F1D2D57EE6302853D7D03C767C7BDFB79E2B8C80403F26F6EDBDD6A890A0A0B9B76D334E0F729FF9C47BFE960A1C3FAF77E81B9AC156367423DBB4D766A1F3B1E67595EFFD76287F22BC37DA4F0204633E804002EB7C1AD0836FA4D01E2FCDEAB8457DFC3D8B7F1151BEF3574F8F4653AA3780003787B8891901ABC8250A974C15F2DDDF9E1BE6798647EED710D06CC3FB4C276BFFA585680FC632D8EFD1614745BC3C72B82C53FEAE935EA5014E2B321F69BADF570FAD878C9590FD20FB7BF1B31E373DA93D1A8C63EA45E698CE060FE70ABA0FA84F37E836F2AD2998F07101D3FC7CA2B08B1398E1687ED5A8CE860EF9B4889FF436B74D13281D1F6A7EDF1DBE8989BFAEEFE6A475E65217643E757006871E664099F5B3846553603CD9EEF8FC195807361FBFDEB8DEE6A0B79F009C10DF397FFB865F4EBD0473D458D553358029C6B5A95D6FFEE9B645311D10A8F479B7E5249AA87E3DED08311B4DDF3A458FE61AE294A22643861826ACBBC9B0EA8B73157CE15D1FF35098AE67159B07CA7499398C26776DD9884B5D3786C87D48E864D8BBE2B73E2890F217E135BFDFC4DC5E805D9CEFEF5268E33DB611ABA6A5D57EC82B7246A63DCF3EAF3A51CF503D65C206D2362421DE774158AEAFFEE45A6B5AD5CC0B1DE0E2EA74E97913729A69E9C00A309DDCEB7738BAF4757EA9CC96E055BBDF692B12D8B01B92CE5ECF3D52187402CB7FD961A2672DC1875B6EA22AD7F5F42B1B52BA2D780F2E6C5B25FC7E30B1B663E3A09C8FF0B5C302E0E7F984DDCC62DDA65FD996E17DA72F02A16C354BBDAD44C5B5044759BD53789B98BC58CC25FCDF10A9CBBF0FD6ABD58A4CEDD92C5D85EF22B3C5EE5D9440CE42995517D2F7352CE997F51A36B9FA5703B4C6491AD01F406FD1B5BF85321026D28B51354DADEDF057B37743499A986469F908A01F3C1B74DEF5D8E2F57ED25A80720B540333109A0A65E7984B557F65429F3D3BD7EC3732A10D7AF36DD5D2414A09949A0F57F37BD9021D2C482E61437CC15E9DFDD92D4C212C4FC6C22C54591E5AFD48210FDC88040135E433F50E45874E0D5EE2BBC857F2C80E2FA4FC7ACFEC8EEC0CAB351F677C790787C715945C21BF923EDC0A58878AE09ACF5FB5A003C9C0B6E30A450CE6DAD4B626108B88E89F1E6A7BB3843E1EC8AEE35AF69E81773CFF71190F819CCF24142D60AC51B80B61019EC7ED2EFB6C5F18B499FC9727BED2E3324F8B94A522092E0A98241E29F8F14C6561DF3FEA0824F9CB0FE10BB497E427EE62085E7AABB2900FA47BF27C1638BD116C5555C076DEEFE9754E8ED333D72CE9423E27EF640FD5199C0CAFBCF2DA1C5C34121A69E7E0DEB3C268FE60C6797056383DA43E6F472D225116F63124498271D3D43AADCC5871F2349CE040BE068D72EB57B7827A7D9AA01405BA0AB07E684B91EF05418948F6713AEF1F4948399E0E6130740CAE3E481A6366295422BE3EE2E892AA9FEE86A6E23E2EBCBE654989FD93D1C4E7D62910E1223BD66B7C54F8DD7D373986E5D4141BF0BDE98DD13AAB7D598D698660F11FA4BFB0AD09D5C27B65386C8673E6C4AE9E8E30F8DD1A5A3FE557A3C29DCF99A7C376200AB595C49445E740E3DAEC07BC047FD6EA4FC6CFDC23D7449F9D1170FE635CA36D3DE5B57F1CFB182DE240CD4C1E480600C449D1A8596D8315906A53954201929E7665DD2E27D590D481DD394CF2E8AE19217F1FF0CB511DEF7460DC9E49C21607247857BA744B1384344B4C2D8CE987512376F66F1A279509281242A7A2A58ED500395418138ABDB9C5572A258D157F4D3E88ED216BBE9CEE3BD054FE61F94C59A4AD19AA62E456B86CADE61622A6FEA877575EEAEA20C76AE8A89E7B44396BAE0EEEAB1C23F221A3DF2B2CC683256A4E5C8207EDA0B235562AD3B510F9D3FBE0B51CD8F238A0ABD2EC182681606C8FD111D8CE1EC1CDA6DB4572303DDEB925AC1FFFD75E321468266790DEE6BC0E85070CEE749D9E46795936324DD1388E1B11AA617500534B8DAF2DE12B035F73111B770F5F56F5C6A4152C45CE0E112E650FAA9F3C7E59E3410745C29FA59CAE5CC37FE4C6594990E50DF1576B69B2B292AFC58A804743F49DD7C98C1768FD19AB4213AE4FB197492AF5BF7FBC6C8B507673539D8515DD527FAFDD8CA3EFF629CAA720AA11E65922678447AD4DDF5FF943873DF5203AFEA4130CA5F633E104AB083EC690CF092D208A98006E91BC7E33731D18E592869E564E6D3FF8BBBBB9837FFC1F1B92DE0F5DD4A029C51E3F64592CAC3DE1B4CA5414F894B7B0B7D73D6BF1DA4B908ACEAB47771DA56A8B0536301FC5FD270CAA55CE171332F7DB2EB4619C4B2C1971EBC0AB8B0B11FD54C24285DA8428AB9E0150D8897216B133ED554DE8CEE532024DF8B8D9314D7C9A3EC60464F9C7BCA8C3D4FBA23A7B543AC111ABA8C8F1BD54A243D565DC062F84CCCEDB0A03375FDFBCEF8AD8CAFC440D3E6F988DC607ECB947673DEC4AD48724C91A6BE22A0027E42AF6D94D26D188D0B7B3A5AF012880FC0105DD2F11171742321DD41A0401415C58AD4DC445642A2CBB466788F54D270BD8DF25602B298B62B6D0FA3ADA97008A99B73A807092F8957F17EEAD9D53B1128FBEF1DEFCBC607EA92AFBD353E95F52D33AB7C1EBE2 - -count = 96 -seed = 26CF860726D4DFA38AE07399838BB336F1BEE59E9F23AE4C81E73D49964997EF21CB5F5412F9A70A1EC39FC6228C36CA -mlen = 3201 -msg = DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 -pk = FA4232262E658FDA29CA03BB3C71263C89A15BDE5774A119BDDF05D5D450422381A04FAC303F1EA8A12BED8496AD3CA31338C42EAF1AB2413191451284AC0F29 -sk = FA4232262E658FDA29CA03BB3C71263C89A15BDE5774A119BDDF05D5D450422381A04FAC303F1EA8A12BED8496AD3CA31338C42EAF1AB2413191451284AC0F29020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050FB26312F9C2BAEE6CFAC5A0C7974B2E5FAB26DE56F12E7109AF9DD9BC13E9E50962662C3E321E980A9AF300C60400000000000000926E8FCA59065A6A82120292049FBE65B06A597D67B0AEC7DB530C2B78644D5AAFC3C5CC0B3729CAE476E8526D8CFBFFFFFFFFFFFFFFF6C23B3D812B934C344FFC8A014383F1C1513A8ED005A839A46C07D5DA4BF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3545D0A15A0604FA750833AEF42205C8178CC8FE613879B2B9858D0AEFD004000000000000000000000000000000000000000000000070A48024A8344C8BC8BD4F8BCC3807A8E9058B57D43E51B2F9543DC6817983051609F9A860AC213B2B2133B1E55A93AD7CBA3EC7F2BACAA65B1027F70B10281864CA7C61E7BCEFE7FE0AA872C7D399AABE123B151CAC483AE01D470EB612231A44390AE8CF31E800EC4E581AC15829DE4A7E041AA9992102C38D77E76BFFAF22FDB29BCCD892AF7B718EEDD3B8D8B956A9E7F654FAE9CC712E20B135DFE2FF282E92252ED4BEA00A21300953AE18BA5249A004642C212C68EFD2A79795C0B423A2B0E5DD767C88F236D3B3D79C761B00CF5C044E1851B2C8C4BAE908A8A5A505399D3B503DAAB8527371E2A2E4E37E50C377C6951D24C8679EE937491A8D7E3147EB5B46AF8C7F648D846AC875BFD2EC2C735EF0DFECEDC67CD6C008C30B801EC0910800CAA7027055ADDA49AE1CE649C1FF197372B9FB51CAE72C44D715CE2A2A19F71EF3B7823911F464E9AB2A77AB51885A59DEE25F5578502BD85BFBB415F3AC58C6C1309431EB69B483CB2890F6E42CC40B87A78961836018A5A61BA209DEF586F31B169CD3FFC0D52313628488BD80D3F2284F32D3016488BECE1AA62420EBA7998EFCE95F47CBA22475F62A01416806D16C277D9A73B5B8B900C43E00 -smlen = 3378 -sm = 0BD8ED298A5F96A5C300E5AEDFC40FB6768B52064C2DC81723D82E887F05851C092F498AFD88FD06CB50171925DCDAFA92023E9B4232FAA1D67DE407D0895C20CFB42433FD04076F5FB8FDB806A83F0544AFD2602AECC0C40D02B7458A1380BF1DF21403CAEC976696A1D780F4006754A5D908B31450F500B7C1CD3EF17BC3143F06049A647891A9325F1201011BFC209E0A7B0A929B50D70E1AC380230F029232DA266CBFFC3D110506C7964686E7B500DE897F02AE7292ABAFA6A0CAD52929113410F2BA972B4184E894C4D31081420751560956F49CE2B772635625AFC3CA6698FBFDE4D0A05EF243DF190BA1CE780EB572590E01E6E283E1963F2B0722B0CEB365552F65BD405F1A284DDBED07BA61C4453D30CC28C83E41590E09D7BB6932D231285205D61332FA9263B8A2D3D7F7FA20F521CA4B49F249896780E08C2DC41669BF0777278F87BB1F72CDDF4B998062B1642791F81AD474D6D8F963DCB4458CE11108544C41CDF19145B77038C7E8ADCD6501508C53B25BE6E787313018620D1BA647CCA4A5A8399E11815EAECEC6AE66DBC576699BB0AB44DE111AB6F252256389EFDC0546E641DE87FD6A3A724716257A9174F39542539A593864441EB79D499FCDF2F1D053CEBB3A1FCC09419D2C553C2265B3DC3943E0341BB49130E9981EC59945FA0B23E9DBDBF352ABA0D925C4333F2EE1F2C83C847EFA78BB13263B893D7CAE029BF08CEA2A5D1B5B997E403A489C6D9A124FB8386FE58C2476894E7754B8E5A162102A119482B5E59F8D89C8B1DEA70B6C80641C77BFD12D45C5B3CE0021EE500A1665ABCF740794E0D3E7E8CB5804A1E0D0C81A107DEE80BF63BFF8CE2EE2DD602DF279DE39C579B417A758356D2B48B41E83495DEE9ADFE4506E03F19DD096E81405264D408B2FBCDBF41DB5CED6FBDC2645DBEFE5BD038382993970C7686DBA3FEDC24E1F91BA4B6CF70B2E832B97BE24B6393273A519DB0B4446E98D77E86CCACFBECCB18939013C66F7A29B10DE2E88FCFAEF656B858B7DFACC4F21EF5F328C0EF604FEDD993510BA40530B79525FE8D336DEF0E5C303539E664A9360EDAD7268F70DF4DE199AB3F70EB2BA65E2752BF5FDB1E853E6F4EFCAFBB31D8CC23155413BE31082DA958B01682894A9057CAB66D4D64A6F3B1D81C5B75815A3E0CAF6486B17339174276A84E11C117B060302DC2EE06A03C0E15395C0DD32661638F059A385578C1B792349A41C511D12AC7185B060A831EE296E6626459C2750FAF3AFB579F6F6836D566C00C979B5130E8E50431E914834CBB3D26F6E5BA50BCF05D50F699FAF10767AA2831C3557A53AF14BFD9F23C00F76C2680C7DBF4A9B2A425E34C943228C3EBE55A0960ACC757D7878F7943E2E8A1CBC8C0D2139A6A6459D3492A1A7757F71E90A58A78E0FF9B04D059C5D131F6E3C30742FDE5506AE7860045A4C903DE96DC43AC6A69273BF8EDAB7E7FAFBAAD9EFA8FA609961502EFACCDE63A6D98D8D017075487C608FF701A7E3381D7A2ACB134B198950ECC6970A75AF5625FAA4EAF968CCE48FFB673F4F365802A984C609C33BA312140A60A6F0924E945D11BAACFCD643C874D352A90367EA4C59B63665364832B1A9A9A01EDA92C64F393C357158973FA7C6047B8B5E27EEDB28E26359402B63032F8B230F5AA968272819CA486A8BAFD3D66799AE951CABF04EA81E1E7E4632B915D4E8387C7D1F4FAFE1C1FC8666FE0318403EA0027487E947D844A7FA28C0523A64EBD95D2A8ABF6A71FEFB5BC059B2CBEECD4375F3A3F109DEAD98539244DDCFEE9E42DB3ABDAF943C445712EBF19508A1FFA6133C5078C1DA69A32CBE729A8876C4C73CB232024A87D87FD5F9456D3D4A936CB4CE2E00EF415406D66D344000A4A95CC9651425A16021336C4BEFF310210324C754BBE13CD0066C507413671C80CF492B4655D898A18A2F4DB5A393400C6AD821580B0712D6C919C62E87FE212260EAEF6876C409FCA1047A67B223E0766144F3F676F051FBE912C4CE4A9F7B85459DA031EC47C621F6EF06CD1621421FA52B047B51C944DFA94807083B4ED40D533B19813477193D1E4E96C8D76A5AF3100FA44A985A6513060B08A7F3848159B3CC551D43370B223037753B824A099A7C7DF59305BE09E2E79618C83818BD542F39380126A927190EA5536DFA63B664AA7601C6D82CDDF4CE4006E1AF2601EC453971828CD09C29D2F3EA6392B58D38BCF40BF6B6497F6B848CB853B187610CD23880CB09787C76087356C66565C0399BE746A81753442E4AAA54E84F1D8C2CCB2D00A551E960203D61E71A72E131ED1967DD06E72C99264EF2EE5BD156FC869B5031BA23A6D354D7CEC58F339F6BC2DD1C547F07AA733994860197DCE5BCE6024A74668ED89A2C9CAFE1F78B31638C3225D96009C260FBD28C1F0423E75C9C01A0F9E62B7F265FA3817F441F56AE79BA54A0C107FD7946A2DDDA60D0EAE428715FE2B4FF93BEF83CD10E5E17760FE028F1AAC8084A43EDCC12BFD3265D13FA94D9704809A50881D48F0080A976C5BF31B353B9043C0F0B69AE6F2B8BADD056752F2FC9E90C4B35850C2D45B9F354B41ED7826B976528875547A0C389B83725E26C006CC8240E380E3EB554DBF2133A131743539B1D174CCA6B135C59F81D499631BDA4CF90DED836E8C24C074A0BCD83271309FFEF320791C9030FC2B1F53FD2DE870E54EBA20CE9930C279B48B39CB481737F012F65933650374BA39E2222191B0E3C7DB9632CE9CB077322CEF97ED832DDD8AAEE53C52C03D2AAF8EB5597D8D6467A406BF428E2F16462E0C0D486A1C1C7348CBBF92633EC4FFA75945025A3C92095317E32290D4CBAA6CA40F3F201975F3FC8B733D1467C094E075E8415352E3AE51A6C5169A4AA430BCD66FF39B184F5B7174042DFCC6840EEF60CCDCAC12D012AE4F24F7184A038D8D9964AB405366740600B98CFE2E4737C8D846FD4E9B22B5047110D85B37BDB9E7E3BAF5298BBDC1050AA20F14E34DEC283830F5FA9C570C22CA659C1276BE8FFBC0AC3551DB8488855AE7EC21E239E88A0F68227D17DD87FFA3B3D0535F9E57807755DE56A65C0DE9F4A79F8746B20908BF9416A86F62EE2C2545BCA2D55CD4D45DCDF06DC879E1B6270A80778D0274AA658395D800EAEF367DF4F4D838EEE0A66093E0F419B9EDC5F003E31CF0EB7E1CEE9ACCDA7A2DFC920A4B5222389DBF12AD17392850C434A9B3C260159B0F52E78E7A66D28DD5B3C77662CFED2CB3DD5BC3CC26A34293EBF1FB3A9BC59BB0C104C5A9387F3893A65D145D424CE741A375F9C65E733A024E78FE274B29FF4B0EB6F21FAFC31453EAF7E48FABEC5711D3898B876F59952C73123281A8E85148CEF5A166BF45DF36053D57AE6F29D3E334BB2395FA236D4DAA8A4FDF99D80A9BCDBED36154BF4FA3D463D51974032D7B88B2504317E14165B1C3FE3D8FE366FC8284321D80F9CF512F418C63F73B7C29C07870332387BBD1A870AC39485F64086006CFD68C8299347615A423736C01FAEF2DA56CFB6FC966948649324E22D4551B9F50654EE505547F7D0B8481ADF6AAC3977F49D7E6AE5C4248DF7B43BDA7F082AACFCDCF1C1BC04F2D45F5E028498ECBCA47EC4D1DDEB03A2AB27BE9E4B80585145676F8AE7A5017BC5EFA317A576ED6E423D5A0495B8DC619712A2C3E6162B04B9BBC7DE4BE6532F6C1C019E702C014C60189A2612594BCB18317804C630264D07B7396DB562777BC305B885E00706FF6D0208737BD229BC7AEEFF5FB770A4C057B347601F1F6C16F60D4A53A0B32631AD2D41FA307F6630228E1807D22475D5E331A50A680896DC606F3941AC08F8BA46DE5A49F5ED6A94965334FDFD69C4A6C7973D9615B3FE576B15AACB9B98D9E498D2A3A89B4F8EEE715ED5F29F13DDE7629BB386F7CC800F16F3B5BA8BD0E14CD8D9BB0F0AA615BE9D7557F6EFD00F7BBEF9989E7F463279408E6AD77E100AE4457D57424F2B1CAEF43052C5B25C896BAA1C2FE67D1D6F669311F17D39460F0B176A7727F53257A36FAACBF3DFE623D8F882F8EE41BA1CE387E1D1860F4BABE26ED678395B9979D84DEA5C7B38905D4C7FD867ED7722D066BFF3A833D3282BB40D1CD310DC8DAC9270A49B65B5181EB30F166CAF0832A8DC56B9D135550B506D98D036BE7876836AAE669507990DE6D03E78A38139CF64F65FB410F192E30B045C93FE259C10E0C5B56A2B5F0605DA0851104C4BEEB4E3B30135CAE5A6C68403C63121B0993832834A3B5EBDD345C41B26DD219560B624024B8B945A10D385B3CE4E0BD54E10A64ACA59D283302028A9592120D142CCEB1CC30E1F96AD041F1E17BCDC3C68C2EA2E0D65D6BA3696166CB365CC461ABC4D67D504E8290EB452ECB77F6D5FAA5053D01317646242384C5C510BD43C5780BBD01EBC3AF33D29D8A09EF39AC85E70398D2A64DFFA72B3EFD8D6D57AA2F9DAC0CC6EEAB27B69FDF2403A5FEDE0BFAF441619BE03FDE44C49FF0A34E9C37D2B9AEB726D56EB646A67BF349323F397DB056D71DE72A2597D780942554C8F8273E307DBA6BD02E944E0559509E1F28B511BD709D03EA2451EF234DF6F077E06AA01E2806D5BDF89DF29F1B3D8C6D8014496AD83857F7465F1072E88709D0194733E1FC8C9F092DF5B9802FD2DDDA8B142217B9532D8604E2F32D06F6400025930DA2BE9B25529788E6BF4EB7F84C272DF455CE2ADA291CFDB5FE815129E4AED59625C879E99B3E3C1B6C5D7 - -count = 97 -seed = 13F1F446D9AA5AC853278BF74C9E6447A6CE4294C037867F43DF554370EE261D05C7260EEBF46D6694D0850B8343FBE5 -mlen = 3234 -msg = 525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B -pk = 4FEE08D6436A83982B066BF804A065FDAECB14D815CB7C21392E9746A72F893409FF12473E43553D034D86818D41EED8E3724E9BA01FBDA35CEF1CA5DAFFD029 -sk = 4FEE08D6436A83982B066BF804A065FDAECB14D815CB7C21392E9746A72F893409FF12473E43553D034D86818D41EED8E3724E9BA01FBDA35CEF1CA5DAFFD029020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B65D65B40BC377DED53A4F1458E2EF78BDE7D59F8CF16D6881187D77DEC830E8E746AF52355CBC9C24BD43B2007E01000000000000004B9D696EB8B1B67C220BDDB3CC689E6FBF9A9971FA382DD711538BCFD9CCF5BE9C170CC576830CDA308F8AB7D17EF9FFFFFFFFFFFFFF3B6E9C816CFDE42221FC907573DB6C77A512712A3772E2B94768EB1C4484FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E527027F53DF727CC619750BBDAAF1054A9D8EC926FD0F68F2D19958F6105000000000000000000000000000000000000000000000040D36B0C04CA54E146DCEA99890D3F2DCCED09282B284BEE4727BC72EB39F62A2B3B9584746AF58B8C0F4E6C062E6F49936F62E48CAE012EFEA09BE41D7098037C4FF6F3A90CE7D560C1C7764503E870E9DAF14CC9EBFC2B3A0F6D2F1BF81A226633E02792770B280884699A9CB3404770850692B6EAB6FC5CEC04005522C423A3DF9B7C8D0520F67ECA94C63CD930229B88F38DA0DDED1C1C95787161147D0CDC7351BECB33778DCB4528976BBA33F48383D760606839E9AAF4219AA9BA46121E101D0928B00475DB60DF055BB399898229BD95EE70CC6CE47C28DD15A2B0188B8570C6FABD04B88A767295493F2A5486EE44E05CE8CABEFD1F73D03FD2432BE6D8FB5130AB6D8BB2DB0E5DB2671885A6441A521E9851875C329A0B1EC2491BB311F01DF5E747D42713292E1E8D117441B5D99F2B1BFCE85A4AB8E0BCED4731FB4BDB00F92FC4FF91C19FBC30D98D710D2DACB9027A50C80780C656559BA129471FA7430C02C6E7A82E29F3609520A056E7F1DC293B2F4F526EF613D61A711B14E8DED577D36E6B3564EEC74972A7C7822567F2CD8C6C227A28592C2F695F1BE26FA766AB601BD178AB7C72C558DCC55D35C59EDD121A4A4F6D42B90AD4FD08 -smlen = 3411 -sm = 4CCBD42A388AE0220805230B0695CB151BAE640119BA9752A82358FD03072402CF548E435456C30095F9C8252EF3A47FD407E8C34C2E6E45457600009584F6D501C0EFC00E04810DD459DC57538C5A067FD5B01A3B8581CB2B062B4AC12E665507253B018E6FAB8E57C2AFB763074BE28F65389653F3D0027A7DED650ECBCA1399032D504A7B8FC063B636000175F70ECCF37B792A7B13FAFB5B20D48A090387A44976AE33DF66DA021921F759A8532A00525E8B98C55864849FFC71EBC953F7A0ECA6298F6AA15A83BF6923BD5921B1C86DBBFC544A39C364EF6D9281481E946C994F96829D6639727A5345560D8641E9A510F913F7FE5592C2A40CB278F5AFD8D4504B5387C20945654F08168247A98F56A43A5020955F882D2D93781F4A83676B08F50341E953A5D1B67DE7F6D1BE3D78D5D060AA85B5EE4271763C437CCD595890DBC8FCFAF2754AE9349BA2FDF89847A15188716C0EC672887A4B9A15176AE0C5138819CA232D012BE1DCFFD29F677442083087C127CBD80B0D9CC0962BC8318E734910D1E2653BBF700C84BB0919E12DF331CCDC7128B41F0666F6419AFBADAF673BE16C9177D3CF113C6488504DE088149BFB83EACBBC400309B7AD753F7B2F5AA89F070C9D14C084C32DF91C5F7CB6A7D869D64F4A05AF80A98BE7517ED784C17B0D7DF96B9987B7EA7A398CE018AE6E13E1C0F7AA040AC3FFD273BB9687AD6FEFDB211061A6228967E9DFEF69BCC1C5D02EE56D49A93C8AAD46D08322A2CA246AE8C3EDC071D063AD605A97B8AE94D58E897A4A6310BCBF55B0CAE1AA81769D30B46F883EAF29D4B5FEA32F2DBDE49360CB6235754BDC305ABB5E5395360097378656E2BACE675448889B0149D6086C51E9C3AF07A76563164864F131CF9C0CD475CD4A58726AD237CFB76ACA68032351FB24711DA635871386B4BFC94B0DB6D35F07D0196F75CEDB92EFBE7D653E0FF9326A596F9166FF6CAB73125DAD27F361D6122CA531D86910187E75F849EDB52DB26C96FDF05925DCCA232480D3F979EAB07CCA68FC9069965D12BB666A180989AD1FBEE3FE65E746C5A8F64DAB2E370F0487D001121EDD0D0D760531AF46DA65C75DE11688EBF31DD2AC95C188BCFA07EA798609F3EA8E6364A43742A2825144FAFC05ABD17476480812EB2483734B13D075B3EE3AD510B67CF7057014351B2CE5357E3F12F43BA74CED614BE3A9AC0E26763E9AC596F87AE98F72ABE0DE213A81A9A03E2B82F2312C1A186DFCFC3DB346FEB132931C793ECF837F57D8E326101F59705B77A3083E712CE347C2C29C23468B0C5857EFA410197833987C61ECBC2A855EF78B3D7B1B697AB9844AAD07C4B8EF666BD80DABA5FCAC900C5D358A11676FFC89DFF4F36F29F14D9F9B854DCED41FFC4B36381449D22801C19BF8E8BA1F07A1B38FFB527A34D009C4064A1E606FF2AB90AB2E05C156150EC14D7DC792578A16F46650D0ABB61175D1817E2C38F109EBC01A3ABB358673561691185DA32EEEF566C1BA1C72C1F08CD1B427B552425501B8783116F2EB0CFF73C5D2DEF18D291C106980135821A77428FAB20A935AC8B6DD8EDD1A936225344EB103DE0D5879CCA09359B5B882291C0FB1FCCF167C30DBECFC324AC315713CD10F35B72F0D4871A7CBAA2B4CC2BC2598F23DA607C94A063C9E2013B0EDA5F3BD5AADB2C429177A4BFD7B6181ED5F9A55C1F043DA8155C9E7BEBDA7EA07DEA49938FE07743DF2295C220EB53348310842B1000B7A02AC025C3A94FA82D46ED7E2712DE71B149742731EBE62E225D21A7F29D5F3A8A62B71FE16258570DA412C07CECF82B2064AB5D98761C69FC5E899A8E174875B3179DEAA0BF4A0261DA9BF39148440DCBEB0C887E41FDF751505DE79AA1F8593F45482B659F5B5F4CC3E7BFEE59DEF49458DB195A1A692B8AF4AA44CCFB00B753AC761181B8AAB39DB82385AE776CFC585F7873613B62DE55BB10A6B2F27E631CE41436C3FE390163E6F4EBD6B501519C96C06FADCAC8F75920FE1435542FDF535EAD6C0E3F41345996063B95A208DEFB6F110CC861580979BF4422ED395CA218CFC3B22C0BA8B31CB9EEEB51C3DF35FECE92795CAFB8440F522B44E21B3A18D5CDBC296B887A4B927F36715E4AC2CAB043D8B69A8704D6BE24C725B0C2E814BCA7B040C27FE8F4C14911051039AF13F44E0485EB767F5404CFB6FD19DA24D82FE24B53033C83DD8634E2E28AA330A81F14BAC1C57DEAD7FFE39994D9D094383E14322E146A3DF27A776E2F09A11EC9014C809F8E543594D6B4814918A129B36FD25015A044E04D3F081D4D201DF86A0FCAFBBFC695088170B8246776B6A28E59449C646D1E706CEA96B12683CD3A7C60459D42989CA46694B0089CF88E9AEC5E110F69FE0E3FE20D18309D1BA72A83A34813B771484505B08548FE5D376AAA0C414260EA4BCE5EB81F6545CD5203026264938905BE1E252574F4B4E71C6E12F99F6EFD35EFFD64183CD0665FE89D6A357B1908E083511DCE2CDF792A608044C31418C433F86719E156AF3FF98D0F54EBEB9F9FBF24588A5557D310EF9D7CF5DD8A68512D8CB15114773C69D7B40C927858AFC049F7C6A89841020E1C313C5C38B988EF505EBE6C15FC1D6CCD8B472F90ED64DA895D06AC01BB99F455A195A670D22DBD5E3F03AC84A08831E9842A566E9785A0FD4C460C5CAC154D705DCE1E7FD1C45BAEB23976AF881CF5628F3CD92AB19BAE8D45A03A859518E4A1E558FAC2B48A432E46CF274E6496B63874CA4E4571132568AA43EEC3D2A3948F40D327976A6D28CD816CFBEAF8FE126913384061D219F51179F679081503371EA0B6BD7E9524B0ECE2573304ECB4A16EB471CA0817C0C6EDE751F283ACEEC5A60C2796C6261FFC6226E4813241619F465DCE67B38E1D5A647B079503144907307C7D6EB6E6EC1936B5C94FCC08A882B4555B19B33A9BF22384DB38473A313966D157DAF8AAD41EF67D3A5FE723559096AB1768FF69773EB9D5C88D6F35F00DFA4473DF71C7E9E35393638DED05D05C105CBF37711D38E3EEE35E8CC0029B3761241FD1E56969E09E949690D4FE25735D774E777A2CA17FE058E14AE6806F611FB1E9FCD516E20499A704B67990716703A4287B50AB45D155D40EDC0AAF97F5B87551C236CEBE9CADD562B27957EAD251F79CAAC6433F228B50167FB1A753306FFF08B53A8A3CECC226857A321700EBE23AB4D6C35415CA79B682D6CFEF6B1341E7CE00CB9870F432B63A2D9A9A43C87D28A95C514582812DA37738BDA6CC76142E08F69EBAA5ACD0403100C2343E2FA088441E9A55C720BB509BC3600C27C1D39157E049650D1749751EFE55A72349E2A5B714556CE2188CE972287BE2152C7E58D3FCAD43A214A4095DE55CAE9F627D8B9018DAA01547842FA1AD14D67327CD47EB9B90CD94AFDF5244DE57E527F17894A410FB4210E06632E88A398400B0AA48CB3FEB9A90ACC668615D193D5A98158092FBB59AD2D6D4FFEE433A2A6A971A228685AE5BBAFB3AB28242C630AF4656C5071C545618A0A765FCE41B19970C2152D44C349D0CDFB29673D1A42FFEC139D1C9958B0962F7B57F80CB8FE6331553B0DF93DA9BFC722B1C001F48FF9C0FEF032610A1118AC9EBAF9202DFFEA605272A50A90768F031C72D570C0AA5B0D4FEE4AD568895274388104C0BF88D03FADC3159D6CF28AC6A7E3E5CF6FE5C6658128CBF81456DB8C29A76F9C75230F3837F1A94CB83C3AAABDF4B29C9045B45AB9552BBB6C0844BF2926267C0D74D3337249D5C9610E0F6FFD0278F12F39C48650C048D61A3FDB8E1A2E08CCCA68803A55B39BD39160B0420CBEAC7D8A55F571F490F694A7AA8B725BA84238EE1E711864AA1F74AFF252C088E36B79B09C80278DD442EAEA8C7D5833CD1BAA18BDD866689E663EADD0EAA6E0C78A3E09DFFE5F6F1F4003DE24336586B25DC5EE45D56F31D8BB2DE31B24E87172F3F1B26D400B08D50FF624E456183F269CBF06B3707260383174FDA152E4D0C528A90C54114C4F278D0FB35B74DD3ECDA14EE89D38E3227A7E18B068F134B22154348867A61719C926EA3320D1BE0B9ED78466B2DED728CA04C15AC144185FB2F5084511A38CFD765659351AC1AC3E5F327D9F3DE9B2B003758DA78DFD08FAEF3625CEDD87C8A55A3CD0257AA71B3788FD2449EFD1F48948CB304468E3CA07EA7044FA185A2B91F9761C6532B9273DB74C66B2DE95AB19E5102CB90C719EC85671E2829B182BB6D09323248D6584F0CA67D422BCDA65A0146D8DF27AB4AE651706D5FA33B5BB88ADC2A1A95105D55CCA8439A5060D110760DEE8B855D0839053BE595278EAE66542736D25C93D8544C6E55ED51AD6E7029C2E6D32CFA8844BC14972809E31754AF84BB479C504EE77CB65CEDDB6BDA613FEAA2AE6598D1F4975D0FCF9D9DC787EEB5C03F8B0BF438E83C38E2195EF1D35D40F5A14E194BC1BCC64D02CA722E7DA28334E91FB6654D708C5B07946CDF58747086EB3CA59D095EB27F1B7E6806D3A35335B2265031A1120F28EED8B4C5D9AF268502727C5D23152149C98E6970D4DCC4B9D0FECFA6A79FEF82CB233E71FC8AA999DF66EBF5A1DB2ED1583C65803FA8958F49890D13BC05C6A991F26C31766BDEF9BAC601A47C8C3C5E395FD8F47E56F04439E9BC8E9B1901A529395F2D57495D70D0712881D298A60E3E013326CD56BF9F1319EA8D6A6511EEFF373F081478A51E14F0AA4A33C6C5EA7816380C8984F7A5DA45B0C4B6B550644E65A5B2DF059ED050936FE6F073B4E8056ACCD3EB65A0B - -count = 98 -seed = 6F6E47E8336ADEE99B2C52CF2DC8D461E0A54C3DF2F08199A9F0816AF8455381054CE47A7766726D3AFC2E2F2BEAF8E8 -mlen = 3267 -msg = 00769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 -pk = 5F54361DB8F3CC9EA17B8F4C0EE209A364EA149D84E9FEACA918D4A4B9BDB02DFC8B0F81819AD6391C03C8D3D6DCEDC2EF9565BC92420B632FEC93937D61BE07 -sk = 5F54361DB8F3CC9EA17B8F4C0EE209A364EA149D84E9FEACA918D4A4B9BDB02DFC8B0F81819AD6391C03C8D3D6DCEDC2EF9565BC92420B632FEC93937D61BE0702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001DEF273E62D94E770F727726781CB931709F4FCE1068CD6711BA090F4F9AFCC3E083AAAF29CCBD1DAC0C669AA490200000000000000BE0825C0876705DD2227229EF1B7DD66F6F2401B8DC82B1C785A66C5C0FDD2199177F001607C348916DE4EBC625AFBFFFFFFFFFFFFFF56B788480CEF5F061BCCFF4182D05519D1F05AD2A268FE532DA61633B56BF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91B3F132AD4C34CD7E09FD3F521BED6B4F83324AF43E2D285CCEA2A1B73B05000000000000000000000000000000000000000000000098513ACBEF217A30DF0AD76B0506A85C384C473006805EAC211C0C96889EAC30BF13174640FCFBBCFD004216503A29E3BD1C26EE26082AE95804AD47D172992E257CB17D5AF43E187CCB856CFA016A4F98F6D24FC4489012354B6F1E8894AF01CCE0DD91E21E75E7682C273FAD048CC6A90856617097B1CC80EFFFD4B969DE19A7C93C3E64E6AB2184B05656B4F94EB5D12DD877C6341C9AEC3121FE3B261208484CF4F4A55813F4E14C9488D85BE1D442B193DEF0E99D821A114AB4099C9C05D1791E85A3C0FDA832C7117A9298A80307383E30E999343BE12CC087277E242C103FC2086A8306D99B654340B5A0A200EB0245EA08176799EFEC8A1E0BAC041FA6608D037F033561120CD9001D5943C248BC5B2C0D34B7F2438C05BEC58FDD21AE91B9868E781313B74422B1450F3C4062DFC8C9EDE45540C2B3F8CF567C3C22F157F77AC7EEAA637E406DB088359E17DB6B0673A017C7197572A9917B975108D6D217B65477E03C68E679B3E4EDE0C9F0E605B513C1C75B9850683B85049303BE06543633180DA9C20910C0EF1F692F9BB461F702B76394BF139AD15B4DE62AF139C63C7B16EF29724EF45222AAADA07958CC7FB5D13323FEB449D17F12EA1F -smlen = 3444 -sm = D73884A8DEB46282FB04CEAEFD8E86555A504E014EC71D1F2E3E0DF09500E126E7EE13B8CDE4EF079AC804F4E61A557590003DB614D2DB6A16B8E50078566102F231FB79B2069FE6F5FF37890E6DE203572D48EA94D60C36260456719205258CBCE35D005D8BD1D5024ED1F040075256FFBA16B1DAB0AC02CE63FDA4B92E2DCB310200ED608399A225B6960601AB59CFEF4C7B970D755F32B50EA5584F040335D96E346F02B89BA0062AC9B69A2E2DBA0000769683FE7BFD74B3ACD21AF3898B74CA73DD126C8315538937CAC4EF0AD4588765A26DCCE1C90C559CE691E7EB3E0A497D357E1AB583C761439C0A66D1164518F01B6894067925753CC2866A91552FCD0EF029C2284C620CAF364DE6C56EB41EE0E4431D9BE22B76451D132A3F9AD91A53449BE820A7ACF56F6ADBC7107C7C729EC8A64FFF6A24B4CF83FF4E945DEF336DBFEA6067FCCBD1CD6B5698ADB1AD6DF03FD0A553457B8E9FEB4A1243FEEFC2DF7F66AE3ECA5BF169F7891ADAEA8D5C59012C7AA00A5A86B0A33D0006F8AD5A01C60ABBDA6D249D3FAC7EBFB85103A3A747A45D0ADB7DEF52ED3A5F1A620EE383A9C0CCE1900E413FC74A7A97646111D54783928B15BCA783D01EFC67F49CE6F781E82D25D3F30561F507E3831CB4EA5B4A08D5489830017270B63D8298BEEBF48EB56BDA5685D5E1E06404EB9A6C3790E9B29C99168B10BADF8FDB03F3C568672773EEC96428149CA272EA5A8083F8208BDCE361E7D40BC4DA75029D4A18B0B6AD615DBF849935D4755CFFD270A52FA290811CD55BDCA38ED89F0066ADB9BA7F58366379FFE1CAF3A9127E147C3AF3DC27279391E0C09537E81E20E7B9FE4FE3DA970FE50BFC96555233CC9E61D3C356AAA8EED5A8AEA2327D7036EE03E7EE40AA35E9DA4544B121514C261EC1CB0B2D75B1D5CE129E47F89825F69BA8254163179FC1331A917AE9C5A18556A10C5F983871B1258CB6FC8AD207F97A220C5598860B6C56F1EFF09DE6000241E901A89E107FEEC15833D34D6EB12DB6B188FAA0B858A5B9E32F84F783B43B6F8A3B2E4B044CFF8902E1EB0C527BB4E29C92ACC9DC7E0D9AC6B3A021415768B21DD9695983EE89C871C0EADE0BCE4FB72E682DFB5A2BB7498BF4D2C01240F67D1B62BAA4E587069C16E3032114B14A1C4288FEBAEBB4C75C3C05924A358C4BB7DF95ECF81D67147FAE3F605EDE61B7BA164EBA1AB36ECE97DB0ECB32A673E899B24557D8987AF3ADC57A9DA609914C9B2D6D8AC58E5954E0DB5AA9E75B444700B8F704E15A6A7BBA81809FA8801C6CEB5747A44CEB8F99CFE6D8A2A03C03451E5F3D392725207F3DD28B2C00004425B7AE05FA3769183AB60857B27AB08BCC4321D293C93D1D850D4E7A81B14564D7B15AC0E3BC1BFE0561622C6AA06923EEFE163629EDE8BA1732DBFCAD52D3BAA6E11E569EA790B36A8472B2CA37BD5C0EDD37D8F164B874952D00D592FB705C6B3110A12B03829C157191D33C579593E7828CDA5C24A284BA2F5A42F0BFA601A8F6D3DB1CA6D703ECBD261629C9F96EBC0458737B9951219E5B1F86192E2A85B47D80610A0ACC8B1A70DB2916F89CDB2C7F8943471DDBABD2A3536C5DC8A73CDEDDEAAEDC86FA148D2EE479F8465558852FCBEA0DD8017F1B976281A5014319C2C3CACCBF571D9550215B24134F6DAEF32716802E7945CB3F97AFC1AB1DA17D0C41B545A750EF345A6F88AD5FF52D512AFA6558335B5EB8979D8E6DC1DA562BB997E7D152D9FA3EAA09119C3474E11218230D8A56C19AD87FDE483FBD6DDDE9ACBA813BEBC8505A323C601E5B5251650DAE9334562E3DCC38A28BD7DED6942D0CC2014235C1B66CF4A57BA3010B83CC7050309F57A27207512D195D070DB3D10FFCBACDB47E4231142BAE588F92C5B0A71ABD67CA9390C2E05FD2CF7A1FABB14C5A7AE3773C66DB1F055214479E388B5E6ABF0DF8FD1B0E4F90828ACC397643CBC274143FB4331262A20634877BE4C7489C1AE9EAF90BB2A177A6B5AC15CBDA27DA0616E5F87461554F5686A7BD6D047AD0B98C8CDEA3DB78DD2970C78FB861F2A92DDC277876791C4A30F525659557831F4377065D19ACB384CC68340152A6DE6D84CDB58F433923D1FB8CC6B10BACD95B9AB1B45563998620D192032269FA8301C09A29C4B5B20CA0A3D63A4F5984B7DB0F5B17417DC7B939B9B177BF423E2F3D57DFF296E6E4FF0FB1744B13731206EAD54EF0AA1DA09BEA8B0AC0EF71B73D009D30531DE9FDE90D86BF5F20D8E5A9E324E657A98F8C0031ADAC4385157BA4E28B48AED957A5B36C3B49057F8ECA7F56808F794014DAD170601070607010E004F42D01CC63B2A1761126BA045F1165E25FDD05901FAC6B76E777FAAAEE6F5ED94302E2DA28046B4BC60228E1B9E194F364E377F84681B3011583554B76FBF8D7456DBDEA665ADAD6AA0556C8CC714F217A518A98615C4C1CFC8ADBBD4D12C5BC23AD7A0F849E32FE2005334B55D7BCB43D1C95D4793E7C3882740CDE8DD24B367294496A3E2F3251A66CDAECE9E0A73D853F8D4E3A4637836DED68CB28BA4FCAB02D61FB5CFA581792E636217F3238D78912EA0863816FFB2F388823174B19433C2B14BAB69E12C3B791FE683744D4519455A52555AF0D7E12749F6094AFDBA00FC6A609C7578C531FC4C3C3065EBF78414F112014726EC2230F9BCD9C15E36283144CCBE0D1785B65CF49BA8FEFE92EB6907C0330BC98AC172EA9E8DD4DF8974DD6B6772BBC6CA8E8562C5EC0B6592DE7440AC915C35E0AC8087F22EBA110CA3037B469B1D5BC92636D81881E38D8BBED01A29B3EBCF0C19EB95BF999EB848022592AEAAB649CE19824ED9D3A32D75FBA556EE07606A306D1FCEC2E24B38274C361B7BC96CE37B7F4FE434EBA17AC2A097051A92E4EC32E4C678F7762E8B96EBFD2600C0F224B04B2CD7E9F4AD327D53603828015E9CF45969800F02FA5E0BA26B8C844BA1FDFFDE44303AD0389C1B31D582877CA6BFAD4973BA35FBB90ECDD95F430078BC39AA89434130A5FB8321E51F9624090D0277A9F112EE8FF65D3DBA999C7C08727D0F08DCF00CE22F62C955D6A822F247C8065AB94AC442E1CB5F31254816794CC2556891A523B8AEF09D3B9E07AA8B67B3B87567ADEBDBDFB93BA9A082F72052572C97E73AF16CFC42D2A51A3683F84748A338AAB56264753BA4083D356A27C71F47221ED8340C50AFD46CD207C4F9634AB5A44888A4234770C46232C35EFF83FA950B0A6879137DCE209D5A1F26809B411F046F51FF084F15BFE03292EE845D3044235ADBC299925235462E67F803DAA1426F0E116B93F4532DD2784F7F87AE360281CE21F70D230C242E1A98DE8FE1D6147AD71EDEC89E24A5980C45FD91E23516758AF71DF8E0DD96929D4DA61A3BAEABB96C9378986DEB4C9101175E3AF1E102B52A8DA27D916EE4A28263CA485CFE87EE5436249C1A2F933669F6E3274E9BD93092F4A798AE85D6592EBB54DC65C28BA08582E275972B0A12C22A7792CCFD4A398E504C6FB2CF5EF1F9C268540B4FD7D07D59C49A559D86A56A009C4C18A3FCECA109FC7A45C6E842ABC22053E84878C4805D96AC96BA00FA40FC3B50407141105845055447CA94BD27F234183C2B8BF37F5CD249ED0705AFAEAE59C8BE8F6B38069D67FB23F74284E8185C176B58B482900A3E09774383C7ECACF4FE5E580DF99DB102AD4018DB73C73A635D3FCDC833B000C948D846AACC92ED54FFB3ACAE1BFE205D6B2312658F15DECFA085D13BC3757C754C5704D8089563E0CCF52B04A49DF293CAFBBC2FED5D9551B5A3897EC7BEAA56A4034BEDCEB4840A9BDFBB8BF47D66DD3A4E3EB1666372C6B2C39A48D52761BD36403CB130A087685E2EABB8711C11005EA09F90AC49665415C56CAB6FD2719C45B6800DF914F8FF327EED29D9B9A5BBD6B80B8BB31AD1522803B2C8D89166D5C6B2ED47BC5BBBC4ABE6709D46B856AB81DDF15F098A9AB76A8257E7E5C2E7DAE53FBD691736F0D6BAFE0BB939172614E99C7D7E37754AF6C3C637D076A43DBD70E5EAE910C8170CECFF1621E382D2977635B67F4FAC555419F8A0BB76CCAEAEF4C7385D293C9595AE10E5201C4A31B4C3ECB9F3B304EFB1886F9C58A4EF04E73341B95D9BDB85D706B2A8D3FDD153743A8BB7B3289D0FE79F6A3B9E0FE160DD6700FD64FC87D9AC96858A6D395FEF6F3D2193EBAE7C3A92E18746A7F12B244FBC5B1DF0086CC7045036519D9D7BF8E92B850EA0D3D1E775DEA362362462DEA2D3501D39203E2879070D1F7AC92FA1576F6D12886D5B979E3C788C09A769EF4EE45E14CD8E7553EBEEFCD31FF3D43D4988DB08F6630BA8AE8C7250AC42A3D78EDB967D59310A4A224567D8797C42370CBD2302A3F49ABEAF85FAD9455F98B61EF2B5E34A5C552583872145E191BBFFCAA526F5E38E497A1A1E1220A0F283A935ECD366A9069D5A2A80BABA3A22FA85A2557DB72D7E29EB4E33E8ED8BB4EC2EC7C2E9CEDEF46EA955834ACF8C9AB23B78052446FD73C9D61683D7FA0088DB97D07CC350AF0B6B2AD7E66A493AF814C11F8C0F2FDF0DF40AAFD0D218C00319C367E98D7F10C74EA06D31276F3F216E1CB2F12033915008CC83B00AC60FC9C2FB7F97D6E8CD79650D0F9D82BFD9CAFEF668021D3D165F3FE84221998BC8C29AEA0B5B7E0F1F25A0D7447E806CC3FC39E6038BE3DF9AC01F46222D3A609F8A026744AB4F58A734E3782BEC301EA91F2D8E2242D04A11E82474002143223F29656B1A7675AA5AD181004C4F1381DF6A0F95A0186E82C04B4DE881209E9CCCA3EE5B1DEF0B02353738D92A07314403A1A2721C256121FBA8B8CE9B460 - -count = 99 -seed = CB2E6226615393FC3BD4AB3A412AAA030AAD40E8648EE6B56D2C1591D8B97915D88F2D22F7221377B4B04CF2AE9ECC4E -mlen = 3300 -msg = D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C -pk = 485E9B357C331DC26E628DC67FA265D52732434597DC5F88A975485224EA3D34AEBE3B9C941AA468CA22B6DA957B8931F6B0025AF827019EDD1EA9147F14CC1A -sk = 485E9B357C331DC26E628DC67FA265D52732434597DC5F88A975485224EA3D34AEBE3B9C941AA468CA22B6DA957B8931F6B0025AF827019EDD1EA9147F14CC1A0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004DB7C119AAFB5A8BCF7930FAC70E82CA9C9D45638C4797BD77A7FA9F0D37077C1CBC70DBC1EEE3447DB802A6D1840000000000000000227767F57B7615DBFED6C4860896AB2B6EB3BFC0E43CB36E2601EF1F2037DA9D094CF1B34779A25560A7DFFB6345FDFFFFFFFFFFFFFFD656364AACCD496835992541CD5AB60F1AC8A08D1B5F8E78DFC06BBA4656030000000000000000000000000000000000000000000000DDD28198856C57B51DBF66369B7E3AEEF4B5CBB04FC0D7130AAEC2A68A190B00000000000000000000000000000000000000000000001587A540D84674CC0F57AE57936778D0C1BEAD85FEEB624C78EDE74A66222F1A674E5D5BF18F0E3F3BFDC9DED076F3B4690428401FF6A1C1B4E57FAE76AA5325ADA89D301C59F736F820EB109F924FC9F92A1F4709CA0C1A7C19A9C699A68C16E7F0CAA2333E8CCB27E11BE040DA07244397CD5C6CEC918BEFCB418ADB40741A9FFFC341AA81BEC8B23AD8D3771DC81A20FE95C62DD9B1A44977ED0AF0F32D2A5CC9AEAB1B3425CBDA0A3C1C49E1192B1A87CC756A33EBCCF25C862B3A0AF632765A42D56B72CAFE1006A5A3E6CF7A8D747B86814B5FFB4EF5A4A52F93E3AC0DF22F7CBD1C85EA75E164EBBD088B9419496072F6554905A5A2791432D0EB5525AF8AF1BBD5AB78E941B9F6C6C3BEDF82E2B76C1B3666AC14928E48DF25588B1E142A2E148C04929C10028F43778AE11EBB652B8A913DF5A377D386A7F2A6AA312B22703610A9569A3AD49A56271DDB7BC278292B82B6EC3D9DE3E891C739702B5DBE96A34641F8BD98BE8B2354B52B435267D4512AA342772640DFB5204A10248855740F35CD4D7535E40E0B610C105D39B8D9907C0534412382A98AA22FA318670446C5CB2BAAF6CC55F467B529B04AF2B834C390C65146BDA205AEC4382200 -smlen = 3477 -sm = F2514F68B591C38E54054DA19687915DCAA97D032ECEC0DE2155C16C7A02A931981481FCCA8C150253AFF1C179D6446A740107B321352DA0CAB1B6068CCB630C85C797A8E505D074E4F7C38D9CCAF60354667F49B935CC2B48066AEA928C41CA559677072101A8C43F44B899D4019CA3BA3EA74ED0701A0199D6967579FEBF3D0A044D946E717C1251652A050027327ABA02D5B7890E24CC57A0515158020026F9E7B0968F5033D9052A20CB8DECD4E500D21A6BB3A2356805E678673C45FB055FC5266E3F692AF9935AEA307F14A5C41B979966A5DFE42EBFED1487E4822B74AB5AF28995E085EC8007ECA4977C63EE5299FEC63DCCBC42EEACAB488E574249E9D856146750AD97C8A443485EC1C5820BEB0964640010F6407140791E74684DBB91052E2D8BEF7BDCD78B2EC03C97A53295D683BDBE32A70DC19A2F75B8613AEA9616AE0E280179492820F73FB7FA4121E673FB5C328F41B67FF8FFA7AEE6564ADABA046D6E1D6AA13FB24965390F829246DFA8763851405075F76CF94C66FFC3308214DF0960C649AAEDC22926CE9357D3875F8B71D68D75999AA3663C30A9EDF07228BF7DFF49EC1E6C7A33D2053597003B82392E826EBD701B4C981AAAC9951C79E08F592C2C0637C8E5A7F9DCDA599E859C317D4888B4098992E0E2D979E41C703686D577E5BA6001EC4F587140711293D664963632F87EA0461E0E0C5E9D8D292FB409F9F9AB172EE17FC8AFABAD06E42B437CE22924EB5DBD3A80A06962F3B37946259F9C75A233CB2B4ABDC5CD1B648FAEB1BE8630DB40D151B8FBA693DF2C5BDCAA14DC4783F450B6BC407515CEEBC5C9A47BD1A141384F0B596CAB1135C075651CBA989C190F3171DC1D72330EDAA01656813C4B7811715060B023FC426745C301B2A91E0D08ED3BDED438C4CE6799C35F3981C882A0BDE4A2FEEB1A52CAFA47B0C48558FC43F98FE08F03A71128362BB6FB9DA6A22249F4D4352AE7D3DAE85DE497E2411EADCFE5BF1A3C075C45811E0097ECEA255FE15BD8321FE8B546A8CACFB899EECF5419DB363C7567C2FE7360B36DE14674F500A31D3EEC71451A7C0D5576A8939C0F6D4D9F2F03F3C516CE25CE73ABB35C73AA94F6AEFAE6AD87052D6B195FA43586817F5BB974AAE7F1B8608922411AA5B0D7D574016CBD3DED13395623470A108FA0E1D3F9FAA7E1E5031843F2A23DBCE8B196315290DEA5795E4115D53DC570A444064CFA3C9457DBF3EE323B1966ECD2270C32910F8F430522471258A1F1955A6E1DD8C84ED9A566499BF85628615351ABE84B401421DA2CFAF575E2644C9304C075ECFC374066CEC713FA4C0D89043689FBC59FF54B8F97EE0A3B0989BC5E4EF83CC9833E75BC8B67BB5EE3C06EA156611CDA95A6702416807530EA206ED89835D20805EA988B1958569CDF7F809996214DADAB4E20BD44917E3410EC6BEAC98FEA07F764E85B66AED5E17CF675D2ED8E63DB728FE75158CB31779E31379648B43D68CCFF3780854CF03535C57122019456E73CF06769BF1FBF558542241CE665BD10F921828553585E0CF664CDC6160F9C47FA5330591B74194F4716056CA83993EFEC4A52DB9A1FBD3B2F504AC19667325167407375B6D7DE739F07947B511C8D475744E5C29D6E286A37F1FF8317BD0178F0E306A38FA6E75F4A80427FEB2C91235D3E7F20D8101CFC03BB73F44EF59AF3526E9AFC580027A1DADE37654238B8EC7AF0105248FE30784A88B72E11FC1BD807E47A349BD29075BEFBB29730EF8E85E3ABD5105559BACEE74AA27D90D360A8D629DBEC95EB34C7F7CA20096FF7B521E40D3944A975436896F372EEAB6B8615EB91697965BBF955779DD3047F7E3BF029E3509A5780247445D6223D085AFB4291D976EFADC41E42DC2C0728D18F6155654A332FEC72EB6AEF8B92C1D177E3DC28C31971BCAFF76DDEBFD9588BC244B116D409E58DC5ADA1648663D603C47FAEB814AAA7EB9B6264356F926C18B9357BF426B89DDC8EB9177ECEB5C6CDC64DD8FEB7B326BC1BA89BD9035235DA0E644EF959C58DD97B88D5C749B36931AC2694C67151DB0894652E99254222D37CEFE9E27B3DD663A152DBE29A3639AFE42F4578937076180563AAD6AD739255EA012A17D2A56627D84C44FBAB261D392A966CFE19278799CF1634D42384323C496190D4B9FB662694E3887EA66AB9E8B195488C8DCA47C8BC0424247759137CFBF86DEDC3641904CB6FACBB30A9FA84ACF69A67B4AFDF4C2AA420FC0D90CEFA0DFBBCD3072D9F772FD6058E2BF0E251BE93B00DC43765B53DB51B22F12D3ED0CC5655E4AEBD9D923F99A43E4461DCF5992030E66A1CDC3A65558D9BB3A39788D92328387D144850DD3706FD7A079E3D2398F542F91A8AAABF0C5068DBAF1FCC5160398ABECF74884BEB04F3A3EA38BBB80D798F5981B3F2DB6C7B33F867B7DC06A4417E30F94CDB4F523AEEA0BE12BD75AAED57520DB0D4B4F013BE3A1DC7AE5C58FD1DE9637F7D82F697B7E92DA427A78FEEC6A5C0255EB57A43DEA6CEBC8805BC04E04FE789E222B1E2642D26EDC14FB36ECC6092B3060E45EED6C5B35DE8741F72933930ECBD7338CF39474122357365700CB50C5EB176FB92814FA7F4032570CCEE6B859236AD5DA5F1730129EDC7BE218BA9874620F6F0EBC45E0BD622F8FD1AE6974994AF95C6519EC1C46650C073D194FA6EBC62F405F63A3416782A47872C7D77D648D0A1C802FFDFDE5FDC112C94CFC68F401889EFC522FE488FDB5384C0D93147AB6587659D936F98ECFBCDCFBF8B352D605F18C855E2559743ED97991C5D50DF44A7B929303835654A3955ABC5BEE6327400A7CCCE460B318D8B5ECE5B12F606ADB3D7B5ED59563B8E675E78029AABC234442C2463256FE02B04F556DA35C4615D14A9F4EFF17DB0DB81DE4BDD894F6628A120BE2D4CF3E1F46D53817899657035A76137E23C0B0E8DDD29465D7F15628FD435E6CAACA4194FDBF85FDCC31D5DAFCB52568B7C0CFBE713BC85FA424BA3ABE149E4035FC86807A8B876D2163B447CAD5EC0E6EF38A1D591AFB46267F9DBF142CAB1CAC1F73BEBA212992FC6D4647EC17848D1ADBB1901277A5078DD72D9C9184E893C0806E9B4AFF0A824670D438620F2A7E8D2965B619D291E5824C014FC888A36FBBE17356431F0039038F9B497902AED969F9C488390B7087763638E976801127BAF1F53803C4DC9649F0EE85D67B239E2BDAFB2BD75F1D1DA22A56FB3AF10A9DDE7AD306C4AF8681029316C0E1949228E6BF5ADF942F1C0EF92B2BCBC0C70D49E5808851444240A78B14D21B54F66271482F49B85F5180B268050327368496CFA8B54ECB97EE6D28EB74A3742F68583DA046809002C22F7B31FBC0566969F9A15CDCA892C4BEB101A2AC3526C76E9D30982C9B4893450FDEC4001D2431828D24D8B1A67DF80E2E10ED2EA8D723227055C48006665F7DA8E032EFDC70BC7EEB2B369B551FAC542AD6DF1A23107E2B3C0E3CCACC25F26404C085CBF56E52D35D7948DB9FDA6DFC24709994719D8CED41A2CC9B3C4B2BEF0967CB71861CF0E6AEA9BEC9395726AA0E2F1A7247ED0F6038E3DF4BF566786073590DCF97F8F0A99658D8F630A2D130C46CF4D26C669360D0F70B75F904C9F923AB285D5DB129F6C25AD21F9E26AC844D07A8EED86C4E224EBFC5B3F720D6F94B0A01B1433C46B40CF84E80F7A6AFA7BB8F9ACF818AD3CAB2DDD6904C067BEA4F1FE79B83CB0AA8FC75B6B096BAD6FE94ABFD48F8EFC0F2B9A02EBDA8FDBDBE1C77F1854EDBA18AAE7F31CED9CD34C1B355108DF18A8953932F7554AF05B203A96A9BB93E0EFF51D7F93B56E351562CF85A2D35EAE2C2427B89A8662A1C723D4F14E6EAFDBD636C2BB7ADE29C1A6BC8A463734C808BEC68B1E9A31AF6E29B412F1CB8C90A9911AC5C3EA71E46113D2D7B1AE2D8802B06A770FD0E9E4652895E42181AD09BB541E9493F258711BB7BEDD3E7CA8B8CE875669CF80A6880ECA3F13800DE7011EA67F443E505C4FB455608AE586F922B3C83FD33B306BDEDB86223C33E3AA65EDC93CBCF3A03ADAF9F328997951D59A9200C0BA2618E3596AF176B43122CEDC52B1E006EA6D12DC236A6FCD7CC46825F2EF7ED71683A731D746FFF2FE54E0B392A8CBFA38873196BB2B835DCA7CB7C3ED9A004C7A329B9734A111744BDACDB669E69E9DF1E52F07C513E3752A0CCD81D7DDC4A64868B7BB2BBBD2095373480522BE10615248A179DCB61DAC90F7FA5FA9B84F190A9C62B5FF9CD473A940F03E7107157D7EB60AF1E3E384FFE8A67DCB2389B3B0FAB7C789CF100CA95CD6A85442CB9A2C243FB9D454B20BAE5762D72B8FE79B4DF81163D61DE4578CF976992D8B9989FC68089F811F53DB1E1092B60220552876B818BEA981571898CD6AB7B5F13C46B0A076526E3241D65014F855EFD7BDE08AD91F259DCB64E94EC3DAD97811EB024EE1D341521DC92AE5E93C73422088976F2D27D64E1D193B955E6736AD2BCCF3C1A53D590576434ACBC0B687F27F255FEF354E68ACA47160EFA7126F908E08E4548C11546D9C412D685FA84D2EB4DCB2BDFC48E2FA8023548198EBB072A48044F4391143E3BEF4FF9066A4B0D03ADC826819D67588BA84F99DA27424103652ACC039DDD3B567851CD78E4117A8B93AFE01FC8EEBDAA1ACB8BA9D095789E76B9D5AB9EE177A15D666EF171FE1D4BDCCFE2E58CE669B561F63028C6CE26DB5C8182FE048680B175C7AB407215FF3A7801C950D509867AB1B0BEF89B3E38A387915225EDE76F91AAD15A85D8C46EFD588BB3BAACBC52C036211512473420F3F061F5F53E9353DE0780425745A76439B3811511C86CA503251F24113384E1A24A9367536E796CE08B896F572489A2339E82A856C - diff --git a/NOTICE b/NOTICE index 355ca6d..6eccf39 100644 --- a/NOTICE +++ b/NOTICE @@ -1,4 +1,4 @@ -Copyright 2023 the SQIsign team. All rights reserved. +Copyright 2023-2025 the SQIsign team. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -11,3 +11,11 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +The DPE Library is (C) 2004-2024 Patrick Pelissier, Paul Zimmermann, +LORIA/INRIA, and licensed under the GNU Lesser General Public License, +version 3. You may obtain a copy of the License at + + https://www.gnu.org/licenses/lgpl-3.0.en.html + +or in the file COPYING.LGPL. diff --git a/README.md b/README.md index d37cb51..b6ae56b 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,70 @@ # SQIsign -This library is a C implementation of SQIsign, short for Short Quaternion and Isogeny Signature (from isogeny graphs of supersingular elliptic curves). +This library is a C implementation of SQIsign. ## Requirements -- CMake (version 3.5 or later) -- C99-compatible compiler -- Valgrind (for dynamic testing) -- Clang static analyzer (version 10 or later, for static analysis) -- GMP (version 6.1.2 or later) +- CMake (version 3.13 or later) +- C11-compatible compiler +- GMP (version 6.0.0 or later) + +### Pre-computation + +The constant values in the `src/precomp` directory were generated using the +pre-computation scripts in the `scripts/precomp` directory. It is not necessary +to execute these scripts to compile the project. The scripts have the following +requirements: +- [two-isogenies](https://github.com/ThetaIsogenies/two-isogenies) + (`Theta-SageMath` version). +- [deuring-2D](https://github.com/Jonathke/deuring-2D) ## Build -- `mkdir -p build` -- `cd build` -- `cmake -DSQISIGN_BUILD_TYPE= ..` -- `make` +For a generic build +``` +$ mkdir -p build +$ cd build +$ cmake -DSQISIGN_BUILD_TYPE=ref .. +$ make +$ make test +``` + +An optimized executable with debug code and assertions disabled can be built +replacing the `cmake` command above by +``` +cmake -DSQISIGN_BUILD_TYPE= -DCMAKE_BUILD_TYPE=Release .. +``` ## Build options CMake build options can be specified with `-D=`. -### ENABLE_TESTS +### SQISIGN_BUILD_TYPE -Builds a test harness for the library, the default value is `ON`. +Specifies the build type for which SQIsign is built. The currently supported values are: +- `ref`: builds the plain reference implementation. +- `opt`: builds the optimized implementation which is the same as the reference + implementation. +- `broadwell`: builds an additional optimized implementation targeting the Intel + Broadwell architecture (and later). The optimizations are applied to the + finite field arithmetic. -### ENABLE_CT_TESTING +### GMP_LIBRARY -Builds the library with instrumentation for constant-time behavior testing, the default value is `OFF`. Valgrind development files are used for this build option. +If set to `SYSTEM` (by default), the gmp library on the system is dynamically linked. -### ENABLE_GMP_BUILD - -If set to `OFF` (by default), the gmp library on the system is dynamically linked. -If set to `ON`, a custom gmp library is linked, which is built as part of the overall build process. - -In the latter case, the following further options are available: +If set to `BUILD`, a custom gmp library is linked, which is built as part of the overall build process. +In this case, the following further options are available: - `ENABLE_GMP_STATIC`: Does static linking against gmp. The default is `OFF`. - `GMP_BUILD_CONFIG_ARGS`: Provides additional config arguments for the gmp build (for example `--disable-assembly`). By default, no config arguments are provided. -### ENABLE_DOC_TARGET -If set to `ON`, a doc target is available that builds API documentation. Note that a doxygen installation is required if set to `ON`. +If set to `MINI`, the mini-gmp library is used, whose sources are included in the repository, in the folder `src/mini-gmp`. In this case, no copies of the full gmp library (system or custom-built) are required. -The default is `OFF`. +### ENABLE_SIGN -### SQISIGN_BUILD_TYPE - -Specifies the build type for which SQIsign is built. The currently supported flags are: -- `ref`, which builds the plain C reference implementation. -- `broadwell`, which builds an additional implementation with GF assembly optimized code for the Intel Broadwell architecture. - -### SQISIGN_TEST_REPS - -Specifies and overrides the number of (self-)test repetitions to be run. +If set to `ON` (default), SQIsign is built with signature and verification functionality. +If set to `OFF`, SQIsign is built with verification functionality only. +In the latter case, GMP is no longer a dependency. ### CMAKE_BUILD_TYPE @@ -66,183 +79,138 @@ Can be used to specify special build types. The options are: The default build type uses the flags `-O3 -Wstrict-prototypes -Wno-error=strict-prototypes -fvisibility=hidden -Wno-error=implicit-function-declaration -Wno-error=attributes`. (Notice that assertions remain enabled in this configuration, which harms performance.) - -## Build artifacts - -The following libraries are built: - -- `libsqisign_common_sys.a`: library with common crypto - AES, Keccak and system random number generator. -- `libsqisign_common_test.a`: library with common crypto for deterministic tests - AES, Keccak and CTR-DRBG PRNG. -- `libsqisign_.a`: library for `SQIsign_`. -- `libsqisign__test`: library for `SQIsign_`, only for test, using the deterministic CTR-DRBG as backend. -- `libsqisign__nistapi.a`: library for `SQIsign_` against the NIST API. -- `libsqisign__nistapi_test.a`: library for `SQIsign_` against the NIST API. Only for test, using the deterministic CTR-DRBG as backend. -- `libsqisign_gf_.a`: gf sub-library, generic or for `` -- `libsqisign_ec_.a`: ec sub-library, generic or for `` -- `libsqisign_klpt_.a`: klpt sub-library, generic or for `` -- `libsqisign_intbig_generic.a`: intbig sub-library, generic -- `libsqisign_quaternion_generic.a`: quaternion sub-library, generic -- `libsqisign_id2iso_.a`: id2iso sub-library, generic or for `` - -The following test apps are built: -- `sqisign_bench_`: Benchmarking suites. -- `sqisign_test_kat_`: KAT test suites. -- `sqisign_test_scheme_`: Self-test suites. -- `sqisign_test_prof_`: Profiling suites. - -More apps are built in folder `build/apps`: - -- `PQCgenKAT_sign_`: App for generating NIST KAT. -- `example_nistapi_`: Example app using the NIST API. - ## Test -In the build directory, run: `make test` or `ctest`. +In the build directory, run `make test` or `ctest`. The test harness consists of the following units: -- KAT test: tests against the KAT files in the `KAT` folder - `SQIsign__KAT` -- Self-tests: runs random self-tests (key-generation, signing and verifying) - `SQIsign__SELFTEST` +- KAT test: `SQIsign__KAT`- tests against the KAT files in the `KAT` + directory. +- Self-tests: `SQIsign__SELFTEST` - runs random self-tests + (key generation, signature and verification). - Sub-library specific unit-tests. -Note that, ctest has a default timeout of 1500s, which is applied to all tests except the KAT tests. To override the default timeout, run `ctest --timeout `. +Note that, `ctest` has a default timeout of 1500s, which is applied to all tests +except the KAT tests. To override the default timeout, run +`ctest --timeout `. ## Known Answer Tests (KAT) -KAT are available in folder `KAT`. They can be generated by running the apps built in the `apps` folder: - -- `apps/PQCgenKAT_sign_` +KAT are available in the `KAT` directory. They can be generated by running the +apps built in the `apps` directory: +``` +apps/PQCgenKAT_sign_ +``` A successful execution will generate the `.req` and `.rsp` files. -A full KAT test is done as part of the test harness (see previous section). +A full KAT test is done as part of the test harness (see the [Test](#test) +section). ## Benchmarks -A benchmarking suite is built and runs with the following command: +A benchmarking suite is built and can be executed with the following command: +``` +apps/benchmark_ [--iterations=] +``` +where `` specifies the SQIsign parameter set and `` is the +number of iterations used for benchmarking; if the `--iterations` option is +omitted, a default of 10 iterations is used. -- `test/sqisign_bench_ `, where params specifies the SQIsign parameter set and runs the number of benchmark runs. - -The benchmarks profile the `KeyGen`, `Sign` and `Verify` functions. The results are reported in CPU cycles if available on the host platform, and timing in nanoseconds otherwise. +The benchmarks profile the key generation, signature and verification functions. The results are reported in CPU cycles if available on the host platform, and timing in nanoseconds otherwise. ## Examples -Example code that demonstrates how to use SQIsign are available in the `apps` folder: - -- `apps/example_nistapi.c`: Example with the NIST API. +Example code that demonstrates how to use SQIsign with the NIST API is available +in `apps/example_nistapi.c`. ## Project Structure -The SQIsign library consists of a number of sub-libraries used to implement the final SQIsign library. +The source code consists of a number of sub-libraries used to implement the +final SQIsign library: +- `common`: common code for hash function, seed expansion, PRNG, memory handling. +- `mp`: code for saturated-representation multiprecision arithmetic. +- `gf`: GF(p^2) and GF(p) arithmetic. +- `ec`: elliptic curves, isogenies and pairings. Everything that is purely + finite-fieldy. +- `precomp`: constants and precomputed values. +- `quaternion`: quaternion orders and ideals. +- `hd`: code to compute (2,2)-isogenies in the theta model. +- `id2iso`: code for Ideal <-> Iso. +- `verification`: code for the verification protocol. +- `signature`: code for the key generation and signature protocols. The dependencies are depicted below. ``` - ┌─┬──────┬─┐ ┌─┬────┬─┐ ┌─┬──────┬─┐ - │ ├──────┤ │ │ ├────┤ │ │ ├──────┤ │ - │ │Keygen│ │ │ │Sign│ │ │ │Verify│ │ - │ ├──────┤ │ │ ├────┤ │ │ ├──────┤ │ - └─┴───┬──┴─┘ └─┴─┬──┴─┘ └─┴───┬──┴─┘ - │ │ │ - │ │ │ - ├────────────────────┼─────────────────┐ │ - │ │ │ │ - │ │ │ │ - ┌───▼──┐ ┌──────▼────────┐ ┌────▼─────▼───────────┐ - │ PRNG ◄────┬─────┤ Iso <-> Ideal ├───► Elliptic Curves, │ - └───▲──┘ │ └──────┬────────┘ │ Pairings & Isogenies │ - │ │ │ └───▲──────┬───────────┘ - │ │ │ │ │ - ┌───┴──┐ │ │ │ │ - │ KLPT ◄────┘ │ ┌──────────┘ │ - └───┬──┘ │ │ │ - │ │ │ │ -┌─────────▼─────────┐ │ │ │ -│ Quaternion orders │ │ │ ┌────▼───┐ -│ and ideals │ │ │ │ GF(p²) │ -└─────────┬─────────┘ │ │ └────┬───┘ - │ ┌─┬──────▼─────┴──┬─┐ │ - ┌─────▼─────┐ │ ├───────────────┤ │ ┌─────▼─────┐ - │ MP BigInt │ │ │Precomputations│ │ │ FP BigInt │ - └───────────┘ │ ├───────────────┤ │ └───────────┘ - └─┴───────────────┴─┘ + ┌─┬──────────┬─┐ ┌─┬──────────┬─┐ ┌─┬──────────┬─┐ + │ ├──────────┤ │ │ ├──────────┤ │ │ ├──────────┤ │ + │ │ Keygen │ │ │ │ Sign │ │ │ │ Verify │ │ + │ ├──────────┤ │ │ ├──────────┤ │ │ ├──────────┤ │ + └─┴────┬─────┴─┘ └─┴────┬─────┴─┘ └─┴────┬─────┴─┘ + │ │ │ + └──────────────────┐ │ │ + │ │ │ +┌─────────────────┐ ┌───▼────▼────────┐ │ +│ │ │ │ │ +│ Quaternions ◄────┤ Ideal <-> Iso ├────────┐ │ +│ │ │ │ │ │ +└────────┬────────┘ └────────┬────────┘ │ │ + │ │ │ │ + │ │ ┌───────────────┘ + │ │ │ │ +┌────────▼────────┐ ┌────────▼─────▼──┐ ┌───▼────────────┐ +│ │ │ │ │ │ +│ Multiprecision │ │ 2D ├────► Precomputation │ +│ integers (GMP) │ │ Isogenies │ │ │ +│ │ │ │ │ │ +└─────────────────┘ └────────┬────────┘ └───▲────────────┘ + │ │ + │ │ + │ │ + ┌────────▼────────┐ │ + │ │ │ + │ Elliptic curves ├────────┘ + │ & isogenies │ + │ │ + └──┬───────────┬──┘ + │ │ + │ │ + │ │ + ┌───────────▼───┐ ┌───▼───────────┐ + │ GF(p) │ │ Fixed │ + │ & │ │ precision │ + │ GF(p^2) │ │ integers │ + └───────────────┘ └───────────────┘ ``` -There are the following sub-libraries: +## Cortex-M4 implementation -- `common`: common code for AES, SHAKE, (P)RNG, memory handling -- `ec`: elliptic curves, isogenies and pairings -- `gf`: GF(p^2) and GF(p) arithmetic, including FP BigInt -- `id2iso`: code for Iso <-> Ideal -- `klpt`: implementation of KLPT -- `quaternion`: quaternion orders and ideals -- `intbig`: multi-precision big integers -- `precomp`: precomputed constants -- `protocols`: protocol implementation +Verification routines are supported in 32-bit embedded architectures running on bare metal environments such as the ARM Cortex-M4, but they are not directly supported by the build system of the present repository. The [pqm4 project](https://github.com/mupq/pqm4) is supported for evaluating SQIsign verification in the ARM Cortex-M4. +pqm4 assumes that the full NIST API (keypair generation, signing and verification) is available. Since only verification is supported, the remaining routines are mocked and must meet certain constraints, such as sharing the public key, signing a prespecified message and being of a specific size used by the testing and benchmarking binaries of pqm4. Therefore, additional KATs must be generated specifically for pqm4, which is done by a dedicated KAT generator for pqm4, found in `apps/PQCgenKAT_sign_pqm4.c`. -### Folder structure +A copy of the most recent version of pqm4 as of the round 2 submission deadline, including an implementation of SQIsign verification generated directly from this repository using the procedure explained next, is made available [here](https://github.com/SQISign/the-sqisign-pqm4), in the `sqisign` branch. -Folder levels after `src`: -``` -SQIsign -└── src - ├── lib_1 - │ ├── broadwell - │ │ ├── generic - │ │ └── lvl1 - │ ├── opt - │ │ ├── generic - │ │ └── lvl1 - │ └── ref - │ └── generic - ├── lib_2 - │ ├── broadwell - │ │ └── generic - │ ├── opt - │ │ └── generic - │ └── ref - │ └── generic - └── lib_n - ├── broadwell - │ └── generic - ├── opt - │ └── generic - └── ref - └── generic -``` +If changes are made to the library, the `scripts/gen_pqm4_sources.sh` shell script can be run, from the root folder of the repository, to generate a pqm4-compatible folder structure in `src/pqm4/sqisign_lvl{1,3,5}`, which can then be copied to the `crypto_sign` folder of pqm4. Note that the pqm4 KAT generator is automatically run by this script. -Level 1: Library (e.g. quaternion). A `CMakeLists.txt` file with entry `include(${SELECT_IMPL_TYPE})` takes care of including the implementation Level 2. +## Acknowledgements -Level 2: Implementation type: reference C (ref), optimized C (opt), ASM-optimized (e.g. broadwell, neon, m4). A `CMakeLists.txt` file entry with `include(${SELECT_SQISIGN_VARIANT})` takes care of including the SQIsign variant. - -Level 3: SQIsign variant -> generic code or code for a specific parameter set (e.g. lvl1). - - -Other folders: -- `apps`: Applications: KAT generation application, examples -- `include`: SQIsign public header files -- `KAT`: Known Answer Test files -- `test`: SQIsign test code - -### Sub-library headers - -Sub-libraries can define their own headers, which may be different between the implementation types. These header files are used sub-library-internally and by other dependent sub-libraries. The convention is to put the headers in an `include` folder of the sub-library src directory. For example, `src/intbig/ref/generic/include/intbig.h`. - -### Sub-library unit tests - -Sub-libraries can implement their own, self-contained unit tests. The convention is to put the unit tests in a `test` folder of the sub-library `src` directory. For example, `src/intbig/ref/generic/test/test_intbig.c`. - -### Shared implementation types - -It is possible to share implementations between implementation types. For example, the broadwell optimized implementation might use the same code as the reference implementation except in the GF module. +The reference implementation for finite field arithemtic (i.e., `src/gf/ref`) +was generated using [modarith](https://github.com/mcarrickscott/modarith) by +Michael Scott. ## License SQIsign is licensed under Apache-2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE). -Third party code is used in some test and common code files: +Third party code is used in some files: - `src/common/aes_c.c`; MIT: "Copyright (c) 2016 Thomas Pornin " -- `src/common/fips202.c`: Public Domain +- `src/common/fips202.c`: CC0: Copyright (c) 2023, the PQClean team - `src/common/randombytes_system.c`: MIT: Copyright (c) 2017 Daan Sprenkels -- `apps/PQCgenKAT_sign.c`, `common/randombytes_ctrdrbg.c`, `test/test_kat.c`: by NIST (Public Domain) +- `src/common/broadwell/{aes_ni.c, vaes256_key_expansion.S}`: Apache-2.0: Copyright 2019 Amazon.com, Inc. +- `src/common/broadwell/ctr_drbg.c`: ISC: Copyright (c) 2017, Google Inc. +- `src/mini-gmp/mini-gmp.c` and `src/mini-gmp/mini-gmp.h`: LGPLv3: Copyright 1991-1997, 1999-2022 Free Software Foundation, Inc. +- `src/quaternion/ref/generic/dpe.h`: LGPLv3: Copyright (C) 2004-2024 Patrick Pelissier, Paul Zimmermann, LORIA/INRIA +- `apps/PQCgenKAT_sign.c`, `apps/PQCgenKAT_sign_pqm4.c`, `src/common/ref/randombytes_ctrdrbg.c`, `test/test_kat.c`: by NIST (Public Domain) diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index cdfbd09..bd6b941 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -1,15 +1,58 @@ -# NIST KAT generation apps -foreach(SVARIANT ${SVARIANT_S}) - string(TOLOWER ${SVARIANT} SVARIANT_LOWER) - add_executable(PQCgenKAT_sign_${SVARIANT_LOWER} PQCgenKAT_sign.c) - target_link_libraries(PQCgenKAT_sign_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_test_nistapi) - target_include_directories(PQCgenKAT_sign_${SVARIANT_LOWER} PRIVATE ../include) -endforeach() +if (ENABLE_SIGN) -# Examples with NIST API + # NIST KAT generation apps + foreach(SVARIANT ${SVARIANT_S}) + string(TOLOWER ${SVARIANT} SVARIANT_LOWER) + add_executable(PQCgenKAT_sign_${SVARIANT_LOWER} PQCgenKAT_sign.c) + target_link_libraries(PQCgenKAT_sign_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_test_nistapi) + target_include_directories(PQCgenKAT_sign_${SVARIANT_LOWER} PRIVATE ../include) + target_compile_definitions(PQCgenKAT_sign_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + endforeach() + + # pqm4 KAT generation apps + foreach(SVARIANT ${SVARIANT_S}) + string(TOLOWER ${SVARIANT} SVARIANT_LOWER) + add_executable(PQCgenKAT_sign_pqm4_${SVARIANT_LOWER} PQCgenKAT_sign_pqm4.c) + target_link_libraries(PQCgenKAT_sign_pqm4_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_test_nistapi) + target_include_directories(PQCgenKAT_sign_pqm4_${SVARIANT_LOWER} PRIVATE ../include) + target_compile_definitions(PQCgenKAT_sign_pqm4_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + endforeach() + + # Examples with NIST API + foreach(SVARIANT ${SVARIANT_S}) + string(TOLOWER ${SVARIANT} SVARIANT_LOWER) + add_executable(example_nistapi_${SVARIANT_LOWER} example_nistapi.c) + target_link_libraries(example_nistapi_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_nistapi) + target_include_directories(example_nistapi_${SVARIANT_LOWER} PRIVATE ../include ../src/${SVARIANT_LOWER}) + target_compile_definitions(example_nistapi_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + add_test(sqisign_test_nistapi_${SVARIANT_LOWER} example_nistapi_${SVARIANT_LOWER}) + endforeach() + + # Benchmarking tool + foreach(SVARIANT ${SVARIANT_S}) + string(TOLOWER ${SVARIANT} SVARIANT_LOWER) + add_executable(benchmark_${SVARIANT_LOWER} benchmark.c) + target_link_libraries(benchmark_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_nistapi) + target_include_directories(benchmark_${SVARIANT_LOWER} PRIVATE ../include ../src/common/generic/include) + target_compile_definitions(benchmark_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + endforeach() + + # Fuzzing tool -- signature generation + foreach(SVARIANT ${SVARIANT_S}) + string(TOLOWER ${SVARIANT} SVARIANT_LOWER) + add_executable(fuzz_sign_${SVARIANT_LOWER} fuzz_sign.c) + target_link_libraries(fuzz_sign_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_nistapi) + target_include_directories(fuzz_sign_${SVARIANT_LOWER} PRIVATE ../include) + target_compile_definitions(fuzz_sign_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + endforeach() + +endif() + +# Fuzzing tool -- signature verification foreach(SVARIANT ${SVARIANT_S}) string(TOLOWER ${SVARIANT} SVARIANT_LOWER) - add_executable(example_nistapi_${SVARIANT_LOWER} example_nistapi.c) - target_link_libraries(example_nistapi_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_nistapi) - target_include_directories(example_nistapi_${SVARIANT_LOWER} PRIVATE ../include ../src/${SVARIANT_LOWER}) + add_executable(fuzz_verify_${SVARIANT_LOWER} fuzz_verify.c) + target_link_libraries(fuzz_verify_${SVARIANT_LOWER} PRIVATE sqisign_${SVARIANT_LOWER}_nistapi) + target_include_directories(fuzz_verify_${SVARIANT_LOWER} PRIVATE ../include ../src/precomp/ref/${SVARIANT_LOWER}/include) + target_compile_definitions(fuzz_verify_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) endforeach() diff --git a/apps/PQCgenKAT_sign_pqm4.c b/apps/PQCgenKAT_sign_pqm4.c new file mode 100644 index 0000000..2352de5 --- /dev/null +++ b/apps/PQCgenKAT_sign_pqm4.c @@ -0,0 +1,297 @@ +// pqm4 KAT generator + +// SPDX-License-Identifier: Apache-2.0 and Unknown + +/* +NIST-developed software is provided by NIST as a public service. You may use, +copy, and distribute copies of the software in any medium, provided that you +keep intact this entire notice. You may improve, modify, and create derivative +works of the software or any portion of the software, and you may copy and +distribute such modifications or works. Modified works should carry a notice +stating that you changed the software and should note the date and nature of any +such change. Please explicitly acknowledge the National Institute of Standards +and Technology as the source of the software. + +NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF +ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, +WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS +NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR +ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE +ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, +INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR +USEFULNESS OF THE SOFTWARE. + +You are solely responsible for determining the appropriateness of using and +distributing the software and you assume all risks associated with its use, +including but not limited to the risks and costs of program errors, compliance +with applicable laws, damage to or loss of data, programs or equipment, and the +unavailability or interruption of operation. This software is not intended to be +used in any situation where a failure could cause risk of injury or damage to +property. The software developed by NIST employees is not subject to copyright +protection within the United States. +*/ + +#include "api.h" +#include "rng.h" +#include +#include +#include +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +#define MAX_MARKER_LEN 50 + +#define KAT_SUCCESS 0 +#define KAT_FILE_OPEN_ERROR -1 +#define KAT_DATA_ERROR -3 +#define KAT_CRYPTO_FAILURE -4 + +#define NUM_KATS 2 +#define MAX_MSG_LEN 59 + +void output_header(FILE *fp) { + const char header[] = + "// SPDX-License-Identifier: Apache-2.0\n" + "\n" + "#ifndef api_h\n" + "#define api_h\n" + "\n" + "#include \n" + "#include \n" + "\n" + "#define CRYPTO_SECRETKEYBYTES " STRINGIFY(CRYPTO_SECRETKEYBYTES) "\n" + "#define CRYPTO_PUBLICKEYBYTES " STRINGIFY(CRYPTO_PUBLICKEYBYTES) "\n" + "#define CRYPTO_BYTES " STRINGIFY(CRYPTO_BYTES) "\n" + "\n" + "#define CRYPTO_ALGNAME \"SQIsign_" STRINGIFY(SQISIGN_VARIANT) "\"\n" + "\n" + "SQISIGN_API\n" + "int\n" + "crypto_sign_keypair(unsigned char *pk, unsigned char *sk);\n" + "\n" + "SQISIGN_API\n" + "int\n" + "crypto_sign(unsigned char *sm, size_t *smlen,\n" + " const unsigned char *m, size_t mlen,\n" + " const unsigned char *sk);\n" + "\n" + "SQISIGN_API\n" + "int\n" + "crypto_sign_open(unsigned char *m, size_t *mlen,\n" + " const unsigned char *sm, size_t smlen,\n" + " const unsigned char *pk);\n" + "\n" + "#endif /* api_h */\n"; + + fputs(header, fp); +} + +void output_rng(FILE *fp) { + const char rng[] = + "// SPDX-License-Identifier: Apache-2.0\n" + "\n" + "#ifndef rng_h\n" + "#define rng_h\n" + "\n" + "#include \"randombytes.h\"\n" + "\n" + "#endif /* rng_h */\n"; + + fputs(rng, fp); +} + +void output_preamble(FILE *fp) { + const char preamble[] = + "// SPDX-License-Identifier: Apache-2.0\n" + "\n" + "#include \n" + "#include \n" + "#include \n" + "\n" + "typedef struct {\n" + " size_t mlen;\n" + " char msg[" STRINGIFY(MAX_MSG_LEN) "];\n" + " size_t smlen;\n" + " char sm[" STRINGIFY(MAX_MSG_LEN) " + CRYPTO_BYTES];\n" + "} SQISign_KAT_t;\n" + "\n"; + + fputs(preamble, fp); +} + +void output_pk(FILE *fp, const unsigned char *pk) { + fprintf(fp, "const char kat_" STRINGIFY(SQISIGN_VARIANT) "_pk[CRYPTO_PUBLICKEYBYTES] = {\n "); + for (int i = 0; i < CRYPTO_PUBLICKEYBYTES; i++) { + fprintf(fp, "0x%02X, ", pk[i]); + } + fprintf(fp, "\n};\n\n"); +} + +void output_message_signature(FILE *fp, const unsigned char *m, unsigned long long mlen, const unsigned char *sm, unsigned long long smlen) { + fprintf(fp, " {\n" + " .mlen = %llu,\n" + " .msg = { ", mlen); + for (unsigned long long i = 0; i < mlen; i++) { + fprintf(fp, "0x%02X, ", m[i]); + } + fprintf(fp, "},\n" + " .smlen = %llu + CRYPTO_BYTES,\n" + " .sm = { ", mlen); + for (unsigned long long i = 0; i < smlen; i++) { + fprintf(fp, "0x%02X, ", sm[i]); + } + fprintf(fp, "},\n" + " },\n"); +} + +void output_implementation(FILE *fp) { + const char api[] = + "int crypto_sign_keypair(unsigned char *pk, unsigned char *sk) {\n" + " memcpy(pk, kat_" STRINGIFY(SQISIGN_VARIANT) "_pk, CRYPTO_PUBLICKEYBYTES);\n" + " // We don't need the secret key\n" + " memset(sk, 0, CRYPTO_SECRETKEYBYTES);\n" + "}\n" + "\n" + "int crypto_sign(unsigned char *sm, size_t *smlen, const unsigned char *m,\n" + " size_t mlen, const unsigned char *sk) {\n" + " for (size_t i = 0; i < sizeof(kat_" STRINGIFY(SQISIGN_VARIANT) ") / sizeof(kat_" STRINGIFY(SQISIGN_VARIANT) "[0]); i++) {\n" + " if (mlen == kat_" STRINGIFY(SQISIGN_VARIANT) "[i].mlen) {\n" + " memcpy(sm, kat_" STRINGIFY(SQISIGN_VARIANT) "[i].sm, kat_" STRINGIFY(SQISIGN_VARIANT) "[i].smlen);\n" + " *smlen = kat_" STRINGIFY(SQISIGN_VARIANT) "[i].smlen;\n" + " return 0;\n" + " }\n" + " }\n" + "\n" + " return 1;\n" + "}\n" + "\n" + "int crypto_sign_open(unsigned char *m, size_t *mlen, const unsigned char *sm,\n" + " size_t smlen, const unsigned char *pk) {\n" + " unsigned long long mlen_ull = *mlen;\n" + " int ret = sqisign_open(m, &mlen_ull, sm, smlen, pk);\n" + " if (mlen) {\n" + " *mlen = mlen_ull;\n" + " }\n" + " return ret;\n" + "}\n"; + + fputs(api, fp); +} + +int main(void) { + // pqm4 KATs use only all-zeros messages, one of length 32 and another of length 59; + // arrays whose dimension are the length of the message are declared the size of the + // largest of the two, but for the former, only 32 out of 59 bytes are actually used + unsigned char seed[NUM_KATS][48]; + unsigned char entropy_input[48]; + const unsigned char m[NUM_KATS][MAX_MSG_LEN] = { { 0 }, { 0 } }; + unsigned char sm[NUM_KATS][MAX_MSG_LEN + CRYPTO_BYTES] = { { 0 }, { 0 } }; + unsigned char m1[MAX_MSG_LEN]; + const unsigned long long mlen[2] = { 32, 59 }; + unsigned long long smlen[2], mlen1; + unsigned char pk[CRYPTO_PUBLICKEYBYTES], sk[CRYPTO_SECRETKEYBYTES]; + int ret_val; + + for (int i = 0; i < 48; i++) + entropy_input[i] = i; + + randombytes_init(entropy_input, NULL, 256); + + // Generate the keypair, shared between both KATs, as required for pqm4 + if ((ret_val = crypto_sign_keypair(pk, sk)) != 0) { + printf("crypto_sign_keypair returned <%d>\n", ret_val); + return KAT_CRYPTO_FAILURE; + } + + // Choose two seeds (for the 32-byte and 59-byte KATs) + for (int i = 0; i < NUM_KATS; i++) + randombytes(seed[i], 48); + + // Fill m1 with random bytes. Note that the memcmp check below for a valid signature + // compares m1 with m[i], but since the KATs use all-zero messages, the comparison + // may suceed even if m was untouched from a previous iteration. This ensures that + // memcmp will fail in that case. + randombytes(m1, MAX_MSG_LEN); + + for (int i = 0; i < NUM_KATS; i++) { + randombytes_init(seed[i], NULL, 256); + + if ((ret_val = crypto_sign(sm[i], &smlen[i], m[i], mlen[i], sk)) != 0) { + printf("crypto_sign returned <%d>\n", ret_val); + return KAT_CRYPTO_FAILURE; + } + + if ((ret_val = crypto_sign_open(m1, &mlen1, sm[i], smlen[i], pk)) != 0) { + printf("crypto_sign_open returned <%d>\n", ret_val); + return KAT_CRYPTO_FAILURE; + } + + if (mlen[i] != mlen1) { + printf( + "crypto_sign_open returned bad 'mlen': Got <%llu>, expected <%llu>\n", + mlen1, mlen[i]); + return KAT_CRYPTO_FAILURE; + } + + if (memcmp(m, m1, mlen[i])) { + printf("crypto_sign_open returned bad 'm' value\n"); + return KAT_CRYPTO_FAILURE; + } + + // Fill m1 with random bytes for the next iteration + randombytes(m1, MAX_MSG_LEN); + } + + // Output rng.h + FILE *fp = fopen("src/pqm4/sqisign_" STRINGIFY(SQISIGN_VARIANT) "/ref/rng.h", "w"); + + if (!fp) { + printf("Couldn't open rng.h file for writing. Are you in the correct folder?\n"); + return KAT_FILE_OPEN_ERROR; + } + + output_rng(fp); + + fclose(fp); + + // Output the header file + fp = fopen("src/pqm4/sqisign_" STRINGIFY(SQISIGN_VARIANT) "/ref/api.h", "w"); + + if (!fp) { + printf("Couldn't open api.h file for writing. Are you in the correct folder?\n"); + return KAT_FILE_OPEN_ERROR; + } + + output_header(fp); + + fclose(fp); + + // Output the implementation + fp = fopen("src/pqm4/sqisign_" STRINGIFY(SQISIGN_VARIANT) "/ref/pqm4_api.c", "w"); + + if (!fp) { + printf("Couldn't open pqm4_api.c file for writing. Are you in the correct folder?\n"); + return KAT_FILE_OPEN_ERROR; + } + + output_preamble(fp); + + output_pk(fp, pk); + + fprintf(fp, "const SQISign_KAT_t kat_" STRINGIFY(SQISIGN_VARIANT) "[%d] = {\n", NUM_KATS); + + for (int i = 0; i < NUM_KATS; i++) { + output_message_signature(fp, m[i], mlen[i], sm[i], smlen[i]); + } + + fprintf(fp, "};\n\n"); + + output_implementation(fp); + + fclose(fp); + + return KAT_SUCCESS; +} diff --git a/apps/benchmark.c b/apps/benchmark.c new file mode 100644 index 0000000..dd8542a --- /dev/null +++ b/apps/benchmark.c @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include +#include +#include +#include + +#include +#include +#include +#include +#if defined(TARGET_BIG_ENDIAN) +#include +#endif + +void +bench(size_t runs) +{ + const size_t m_len = 32; + const size_t sm_len = CRYPTO_BYTES + m_len; + + unsigned char *pkbuf = calloc(runs, CRYPTO_PUBLICKEYBYTES); + unsigned char *skbuf = calloc(runs, CRYPTO_SECRETKEYBYTES); + unsigned char *smbuf = calloc(runs, sm_len); + unsigned char *mbuf = calloc(runs, m_len); + + unsigned char *pk[runs], *sk[runs], *sm[runs], *m[runs]; + for (size_t i = 0; i < runs; ++i) { + pk[i] = pkbuf + i * CRYPTO_PUBLICKEYBYTES; + sk[i] = skbuf + i * CRYPTO_SECRETKEYBYTES; + sm[i] = smbuf + i * sm_len; + m[i] = mbuf + i * m_len; + if (randombytes(m[i], m_len)) + abort(); + } + + unsigned long long len; + + printf("%s (%zu iterations)\n", CRYPTO_ALGNAME, runs); + + BENCH_CODE_1(runs); + crypto_sign_keypair(pk[i], sk[i]); + BENCH_CODE_2("keypair"); + + BENCH_CODE_1(runs); + len = sm_len; + crypto_sign(sm[i], &len, m[i], m_len, sk[i]); + if (len != sm_len) + abort(); + BENCH_CODE_2("sign"); + + int ret; + BENCH_CODE_1(runs); + len = m_len; + ret = crypto_sign_open(m[i], &len, sm[i], sm_len, pk[i]); + if (ret) + abort(); + BENCH_CODE_2("verify"); + + free(pkbuf); + free(skbuf); + free(smbuf); + free(mbuf); +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + bench(iterations); + + return 0; +} diff --git a/apps/example_nistapi.c b/apps/example_nistapi.c index b11571b..4daae3e 100644 --- a/apps/example_nistapi.c +++ b/apps/example_nistapi.c @@ -4,32 +4,53 @@ * An example to demonstrate how to use SQIsign with the NIST API. */ -#include +#include #include #include #include #include +#include +#include + +#include +#include +#include +#if defined(TARGET_BIG_ENDIAN) +#include +#endif + +static uint32_t rand_u32() +{ + unsigned char buf[4]; + if (randombytes(buf, sizeof(buf))) + abort(); + return ((uint32_t) buf[3] << 24) + | ((uint32_t) buf[2] << 16) + | ((uint32_t) buf[1] << 8) + | ((uint32_t) buf[0] << 0); +} /** * Example for SQIsign variant: * - crypto_sign_keypair * - crypto_sign * - crypto_sign_open - * + * * @return int return code */ -static int example_sqisign(void) { +static int +example_sqisign(void) +{ - unsigned long long msglen = 32; + unsigned long long msglen = rand_u32() % 100; unsigned long long smlen = CRYPTO_BYTES + msglen; - unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); - unsigned char *sk = calloc(CRYPTO_SECRETKEYBYTES, 1); + unsigned char *sk = calloc(CRYPTO_SECRETKEYBYTES, 1); + unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); - unsigned char *sig = calloc(smlen, 1); + unsigned char *sm = calloc(smlen, 1); - unsigned char msg[32] = { 0xe }; - unsigned char msg2[32] = { 0 }; + unsigned char msg[msglen], msg2[msglen]; printf("Example with %s\n", CRYPTO_ALGNAME); @@ -37,53 +58,111 @@ static int example_sqisign(void) { int res = crypto_sign_keypair(pk, sk); if (res) { printf("FAIL\n"); - res = -1; goto err; } else { printf("OK\n"); } + // choose a random message + for (size_t i = 0; i < msglen; ++i) + msg[i] = rand_u32(); + printf("crypto_sign -> "); - res = crypto_sign(sig, &smlen, msg, msglen, sk); + res = crypto_sign(sm, &smlen, msg, msglen, sk); if (res) { printf("FAIL\n"); - res = -1; goto err; } else { printf("OK\n"); } printf("crypto_sign_open (with correct signature) -> "); - res = crypto_sign_open(msg2, &msglen, sig, smlen, pk); - if (res || memcmp(msg, msg2, msglen)) { - printf("FAIL\n"); - res = -1; + res = crypto_sign_open(msg2, &msglen, sm, smlen, pk); + if (res || msglen != sizeof(msg) || memcmp(msg, msg2, msglen)) { + printf("FAIL\n"); // signature was not accepted!? goto err; } else { - res = 0; printf("OK\n"); } + + // fill with random bytes + for (size_t i = 0; i < msglen; ++i) + msg2[i] = rand_u32(); + + // let's try a single bit flip + size_t pos = rand_u32() % smlen; + sm[pos / 8] ^= 1 << pos % 8; + + res = crypto_sign_open(msg2, &msglen, sm, smlen, pk); + printf("crypto_sign_open (with altered signature) -> "); - sig[0] = ~sig[0]; - memset(msg2, 0, msglen); - res = crypto_sign_open(msg2, &msglen, sig, smlen, pk); - if (!res || !memcmp(msg, msg2, msglen)) { - printf("FAIL\n"); + if (!res) { + printf("FAIL\n"); // signature was accepted anyway!? res = -1; goto err; - } else { - res = 0; + } + else { printf("OK\n"); + res = 0; + + if (msglen) + printf("WARNING: verification failed but the message length was returned nonzero; misuse-prone API\n"); + + unsigned char any = 0; + for (size_t i = 0; i < msglen; ++i) + any |= msg2[i]; + if (any) + printf("WARNING: verification failed but the message buffer was not zeroed out; misuse-prone API\n"); } err: - free(pk); sqisign_secure_free(sk, CRYPTO_SECRETKEYBYTES); - free(sig); + free(pk); + free(sm); + return res; } -int main(void) { +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int help = 0; + int seed_set = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + } + + if (help) { + printf("Usage: %s [--seed=]\n", argv[0]); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + return example_sqisign(); } diff --git a/apps/fuzz_sign.c b/apps/fuzz_sign.c new file mode 100644 index 0000000..6c7a8e7 --- /dev/null +++ b/apps/fuzz_sign.c @@ -0,0 +1,151 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include +#include +#include +#include +#include + +#include +#include + +/** + * Example for SQIsign variant: + * - crypto_sign_keypair + * - crypto_sign + * - crypto_sign_open + * + * @return int return code + */ +static int example_sqisign(int iter) { + int ret = 0; + + unsigned long long msglen = 64; + unsigned long long smlen = CRYPTO_BYTES + msglen; + + unsigned char *sk = calloc(CRYPTO_SECRETKEYBYTES, 1); + unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); + + unsigned char *sm = calloc(smlen, 1); + + unsigned char msg[msglen]; + + FILE *f = NULL; + + int res = crypto_sign_keypair(pk, sk); + if (res) { + fprintf(stderr, "crypto_sign_keypair -> FAIL\n"); + ret = 1; + goto end; + } + + // choose a random message + randombytes(msg, msglen); + + res = crypto_sign(sm, &smlen, msg, msglen, sk); + if (res) { + fprintf(stderr, "crypto_sign -> FAIL\n"); + ret = 1; + goto end; + } + + // This string is larger than necessary, but gcc is not smart enough + // to detect that iter < 1000000 in the snprintf call below + char filename[sizeof("testcases/SQIsign_lvl1/signature4294967296.bin") + 1]; + if (iter > 999999) { + fprintf(stderr, "Too many iterations: %d\n", iter); + ret = 1; + goto end; + } + snprintf(filename, sizeof(filename), "testcases/%s/signature%06d.bin", + CRYPTO_ALGNAME, iter); + f = fopen(filename, "wb"); + if (!f) { + fprintf(stderr, + "Can't open file: %s (have you created the testcases/%s folder?)\n", + filename, CRYPTO_ALGNAME); + ret = 1; + goto end; + } + + if (fwrite(pk, CRYPTO_PUBLICKEYBYTES, 1, f) != 1) { + fprintf(stderr, "Error writing public key to file\n"); + ret = 1; + goto end; + } + if (fwrite(sm, smlen, 1, f) != 1) { + fprintf(stderr, "Error writing signature to file\n"); + ret = 1; + goto end; + } + +end: + if (f) + fclose(f); + + free(sk); + free(pk); + free(sm); + + return ret; +} + +// Brief fuzzing tutorial (assumes level 1, but works for other levels) +// Assumes an Intel Linux system +// +// 0. Some OS configurations required for AFL to work: +// echo core | sudo tee /proc/sys/kernel/core_pattern +// echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor +// +// 1. Install AFL++ (https://aflplus.plus) -- on Ubuntu, install packages +// afl++, clang, lld, tmux +// +// 2. Configure CMake using AFL's compilers: +// AFL_HARDEN=1 cmake -DCMAKE_C_COMPILER=afl-clang-lto +// +// 3. Build +// +// 4. cd to the build/apps folder +// +// 5. Create required folders: +// mkdir -p testcases/SQIsign_lvl{1,3,5} +// +// 6. Run ./fuzz_sign_lvl1 to create some initial testcases +// +// 7. Run: +// tmux new-session -s afl1 afl-fuzz -i testcases/SQIsign_lvl1/ -o syncdir/ -D -M fuzz1 -- ./fuzz_verify_lvl1 +// +// 8. Optionally run using other cores in the machine (e.g. for 24 cores), +// for i in $(seq 2 24) +// do +// tmux new-session -s afl$i -d afl-fuzz -d -i testcases/SQIsign_lvl1/ -o syncdir/ -S fuzz$i -- ./fuzz_verify_lvl1 +// done +// +// 9. Attach to a specific instance by running: +// tmux attach -t afl$i +// +// 10. To get summary statistics for all runs, run: +// afl-whatsup syncdir/ +// +// 11. "Interesting" signatures, in a binary format understood by +// fuzz_verify_lvl1, will be found in syncdir/fuzz$i/crashes; to +// reproduce the crash, pipe one of these files to fuzz_verify_lvl1 + +int +main(int argc, char *argv[]) { + int testcases = 10; + + unsigned char seed[48]; + randombytes_select(seed, sizeof(seed)); + randombytes_init(seed, NULL, 256); + + if (argc == 2) { + sscanf(argv[1], "--testcases=%d", &testcases); + } + + for (int i = 0; i < testcases; ++i) { + example_sqisign(i); + } + + return 0; +} diff --git a/apps/fuzz_verify.c b/apps/fuzz_verify.c new file mode 100644 index 0000000..376a867 --- /dev/null +++ b/apps/fuzz_verify.c @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include +#include +#include +#include +#include + +#include +#include + +#include "encoded_sizes.h" + +typedef struct { + unsigned char pk[CRYPTO_PUBLICKEYBYTES]; + unsigned char sm[CRYPTO_BYTES + 64]; +} signature_t; + +static void crash() { + int *p = 0; + *p = 0; +} + +static int load_signature(signature_t *sig, int iter) { + char filename[sizeof("testcases/SQIsign_lvl1/signature000000.bin")]; + snprintf(filename, sizeof(filename), "testcases/%s/signature%06d.bin", CRYPTO_ALGNAME, iter); + FILE *f = fopen(filename, "rb"); + + if (!f) { + fprintf(stderr, "Can't open file: %s\n", filename); + return 1; + } + + if (fread(sig->pk, CRYPTO_PUBLICKEYBYTES, 1, f) != 1) { + fprintf(stderr, "Can't read public key from file: %s\n", filename); + fclose(f); + return 1; + } + + if (fread(sig->sm, CRYPTO_BYTES + 64, 1, f) != 1) { + fprintf(stderr, "Can't read signature from file: %s\n", filename); + fclose(f); + return 1; + } + + fclose(f); + + return 0; +} + +static void verify_signature(signature_t corpus[], int testcases) { + unsigned long long msglen = 64; + unsigned long long smlen = CRYPTO_BYTES + msglen; + + unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); + unsigned char *sm = calloc(smlen, 1); + + unsigned char msg[msglen]; + + if (fread(pk, CRYPTO_PUBLICKEYBYTES, 1, stdin) != 1) { + fprintf(stderr, "Error reading public key from stdin\n"); + free(pk); + free(sm); + return; + } + if (fread(sm, smlen, 1, stdin) != 1) { + fprintf(stderr, "Error reading signature from stdin\n"); + free(pk); + free(sm); + return; + } + + int res = crypto_sign_open(msg, &msglen, sm, smlen, pk); + if (res || msglen != sizeof(msg) || memcmp(msg, sm + SIGNATURE_BYTES, msglen)) { + // Signature was not accepted -- check if it was in the corpus and, in that case, crash + for (int i = 0; i < testcases; ++i) + if (!memcmp(pk, corpus[i].pk, CRYPTO_PUBLICKEYBYTES) || !memcmp(sm, corpus[i].sm, smlen)) + crash(); + } else { + // Signature was accepted -- check if it was not in the corpus and, in that case, crash + int in_corpus = 0; + for (int i = 0; i < testcases; ++i) + if (!memcmp(pk, corpus[i].pk, CRYPTO_PUBLICKEYBYTES) || !memcmp(sm, corpus[i].sm, smlen)) { + in_corpus = 1; + break; + } + + if (!in_corpus) + crash(); + } + + free(pk); + free(sm); +} + +int +main(int argc, char *argv[]) { + int testcases = 10; + + if (argc == 2) { + sscanf(argv[1], "--testcases=%d", &testcases); + } + + signature_t corpus[testcases]; + for (int i = 0; i < testcases; ++i) + if (!load_signature(&corpus[i], i)) + return 1; + +#ifdef __AFL_LOOP + while (__AFL_LOOP(1000)) + verify_signature(corpus, testcases); +#else + verify_signature(corpus, testcases); +#endif + + return 0; +} diff --git a/include/mem.h b/include/mem.h index 0c138a4..ab8f6c6 100644 --- a/include/mem.h +++ b/include/mem.h @@ -3,10 +3,11 @@ #ifndef MEM_H #define MEM_H #include +#include /** * Clears and frees allocated memory. - * + * * @param[out] mem Memory to be cleared and freed. * @param size Size of memory to be cleared and freed. */ @@ -14,10 +15,10 @@ void sqisign_secure_free(void *mem, size_t size); /** * Clears memory. - * + * * @param[out] mem Memory to be cleared. * @param size Size of memory to be cleared. */ void sqisign_secure_clear(void *mem, size_t size); -#endif \ No newline at end of file +#endif diff --git a/include/rng.h b/include/rng.h index 7bf4efa..0a9ca0e 100644 --- a/include/rng.h +++ b/include/rng.h @@ -3,6 +3,8 @@ #ifndef rng_h #define rng_h +#include + /** * Randombytes initialization. * Initialization may be needed for some random number generators (e.g. CTR-DRBG). @@ -11,10 +13,22 @@ * @param[in] personalization_string Personalization string * @param[in] security_strength Security string */ +SQISIGN_API void randombytes_init(unsigned char *entropy_input, unsigned char *personalization_string, int security_strength); +/** + * Random byte generation using /dev/urandom. + * The caller is responsible to allocate sufficient memory to hold x. + * + * @param[out] x Memory to hold the random bytes. + * @param[in] xlen Number of random bytes to be generated + * @return int 0 on success, -1 otherwise + */ +SQISIGN_API +int randombytes_select(unsigned char *x, unsigned long long xlen); + /** * Random byte generation. * The caller is responsible to allocate sufficient memory to hold x. @@ -23,6 +37,7 @@ void randombytes_init(unsigned char *entropy_input, * @param[in] xlen Number of random bytes to be generated * @return int 0 on success, -1 otherwise */ +SQISIGN_API int randombytes(unsigned char *x, unsigned long long xlen); #endif /* rng_h */ diff --git a/include/sig.h b/include/sig.h index 1a61316..4c33510 100644 --- a/include/sig.h +++ b/include/sig.h @@ -4,7 +4,9 @@ #define SQISIGN_H #include +#include +#if defined(ENABLE_SIGN) /** * SQIsign keypair generation. * @@ -15,6 +17,7 @@ * @param[out] sk SQIsign secret key * @return int status code */ +SQISIGN_API int sqisign_keypair(unsigned char *pk, unsigned char *sk); /** @@ -31,16 +34,20 @@ int sqisign_keypair(unsigned char *pk, unsigned char *sk); * @param[in] sk Compacted secret key * @return int status code */ +SQISIGN_API int sqisign_sign(unsigned char *sm, - unsigned long long *smlen, const unsigned char *m, - unsigned long long mlen, const unsigned char *sk); + unsigned long long *smlen, + const unsigned char *m, + unsigned long long mlen, + const unsigned char *sk); +#endif /** * SQIsign open signature. * - * The implementation performs SQIsign.verify(). If the signature verification succeeded, the original message is stored in m. - * Keys provided is a compact public key. - * The caller is responsible to allocate sufficient memory to hold m. + * The implementation performs SQIsign.verify(). If the signature verification succeeded, the + * original message is stored in m. Keys provided is a compact public key. The caller is responsible + * to allocate sufficient memory to hold m. * * @param[out] m Message stored if verification succeeds * @param[out] mlen Pointer to the length of m @@ -49,10 +56,12 @@ int sqisign_sign(unsigned char *sm, * @param[in] pk Compacted public key * @return int status code */ +SQISIGN_API int sqisign_open(unsigned char *m, - unsigned long long *mlen, const unsigned char *sm, - unsigned long long smlen, const unsigned char *pk); - + unsigned long long *mlen, + const unsigned char *sm, + unsigned long long smlen, + const unsigned char *pk); /** * SQIsign verify signature. @@ -66,8 +75,11 @@ int sqisign_open(unsigned char *m, * @param[in] pk Compacted public key * @return int 0 if verification succeeded, 1 otherwise. */ +SQISIGN_API int sqisign_verify(const unsigned char *m, - unsigned long long mlen, const unsigned char *sig, - unsigned long long siglen, const unsigned char *pk); + unsigned long long mlen, + const unsigned char *sig, + unsigned long long siglen, + const unsigned char *pk); #endif diff --git a/include/sqisign_namespace.h b/include/sqisign_namespace.h new file mode 100644 index 0000000..14fd51d --- /dev/null +++ b/include/sqisign_namespace.h @@ -0,0 +1,1022 @@ + +#ifndef SQISIGN_NAMESPACE_H +#define SQISIGN_NAMESPACE_H + +//#define DISABLE_NAMESPACING + +#if defined(_WIN32) +#define SQISIGN_API __declspec(dllexport) +#else +#define SQISIGN_API __attribute__((visibility("default"))) +#endif + +#define PARAM_JOIN3_(a, b, c) sqisign_##a##_##b##_##c +#define PARAM_JOIN3(a, b, c) PARAM_JOIN3_(a, b, c) +#define PARAM_NAME3(end, s) PARAM_JOIN3(SQISIGN_VARIANT, end, s) + +#define PARAM_JOIN2_(a, b) sqisign_##a##_##b +#define PARAM_JOIN2(a, b) PARAM_JOIN2_(a, b) +#define PARAM_NAME2(end, s) PARAM_JOIN2(end, s) + +#ifndef DISABLE_NAMESPACING +#define SQISIGN_NAMESPACE_GENERIC(s) PARAM_NAME2(gen, s) +#else +#define SQISIGN_NAMESPACE_GENERIC(s) s +#endif + +#if defined(SQISIGN_VARIANT) && !defined(DISABLE_NAMESPACING) +#if defined(SQISIGN_BUILD_TYPE_REF) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(ref, s) +#elif defined(SQISIGN_BUILD_TYPE_OPT) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(opt, s) +#elif defined(SQISIGN_BUILD_TYPE_BROADWELL) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(broadwell, s) +#elif defined(SQISIGN_BUILD_TYPE_ARM64CRYPTO) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(arm64crypto, s) +#else +#error "Build type not known" +#endif + +#else +#define SQISIGN_NAMESPACE(s) s +#endif + +// Namespacing symbols exported from algebra.c: +#undef quat_alg_add +#undef quat_alg_conj +#undef quat_alg_coord_mul +#undef quat_alg_elem_copy +#undef quat_alg_elem_copy_ibz +#undef quat_alg_elem_equal +#undef quat_alg_elem_is_zero +#undef quat_alg_elem_mul_by_scalar +#undef quat_alg_elem_set +#undef quat_alg_equal_denom +#undef quat_alg_init_set_ui +#undef quat_alg_make_primitive +#undef quat_alg_mul +#undef quat_alg_norm +#undef quat_alg_normalize +#undef quat_alg_scalar +#undef quat_alg_sub + +#define quat_alg_add SQISIGN_NAMESPACE_GENERIC(quat_alg_add) +#define quat_alg_conj SQISIGN_NAMESPACE_GENERIC(quat_alg_conj) +#define quat_alg_coord_mul SQISIGN_NAMESPACE_GENERIC(quat_alg_coord_mul) +#define quat_alg_elem_copy SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_copy) +#define quat_alg_elem_copy_ibz SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_copy_ibz) +#define quat_alg_elem_equal SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_equal) +#define quat_alg_elem_is_zero SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_is_zero) +#define quat_alg_elem_mul_by_scalar SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_mul_by_scalar) +#define quat_alg_elem_set SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_set) +#define quat_alg_equal_denom SQISIGN_NAMESPACE_GENERIC(quat_alg_equal_denom) +#define quat_alg_init_set_ui SQISIGN_NAMESPACE_GENERIC(quat_alg_init_set_ui) +#define quat_alg_make_primitive SQISIGN_NAMESPACE_GENERIC(quat_alg_make_primitive) +#define quat_alg_mul SQISIGN_NAMESPACE_GENERIC(quat_alg_mul) +#define quat_alg_norm SQISIGN_NAMESPACE_GENERIC(quat_alg_norm) +#define quat_alg_normalize SQISIGN_NAMESPACE_GENERIC(quat_alg_normalize) +#define quat_alg_scalar SQISIGN_NAMESPACE_GENERIC(quat_alg_scalar) +#define quat_alg_sub SQISIGN_NAMESPACE_GENERIC(quat_alg_sub) + +// Namespacing symbols exported from api.c: +#undef crypto_sign +#undef crypto_sign_keypair +#undef crypto_sign_open + +#define crypto_sign SQISIGN_NAMESPACE(crypto_sign) +#define crypto_sign_keypair SQISIGN_NAMESPACE(crypto_sign_keypair) +#define crypto_sign_open SQISIGN_NAMESPACE(crypto_sign_open) + +// Namespacing symbols exported from basis.c: +#undef ec_curve_to_basis_2f_from_hint +#undef ec_curve_to_basis_2f_to_hint +#undef ec_recover_y +#undef lift_basis +#undef lift_basis_normalized + +#define ec_curve_to_basis_2f_from_hint SQISIGN_NAMESPACE(ec_curve_to_basis_2f_from_hint) +#define ec_curve_to_basis_2f_to_hint SQISIGN_NAMESPACE(ec_curve_to_basis_2f_to_hint) +#define ec_recover_y SQISIGN_NAMESPACE(ec_recover_y) +#define lift_basis SQISIGN_NAMESPACE(lift_basis) +#define lift_basis_normalized SQISIGN_NAMESPACE(lift_basis_normalized) + +// Namespacing symbols exported from biextension.c: +#undef clear_cofac +#undef ec_dlog_2_tate +#undef ec_dlog_2_weil +#undef fp2_frob +#undef reduced_tate +#undef weil + +#define clear_cofac SQISIGN_NAMESPACE(clear_cofac) +#define ec_dlog_2_tate SQISIGN_NAMESPACE(ec_dlog_2_tate) +#define ec_dlog_2_weil SQISIGN_NAMESPACE(ec_dlog_2_weil) +#define fp2_frob SQISIGN_NAMESPACE(fp2_frob) +#define reduced_tate SQISIGN_NAMESPACE(reduced_tate) +#define weil SQISIGN_NAMESPACE(weil) + +// Namespacing symbols exported from common.c: +#undef hash_to_challenge +#undef public_key_finalize +#undef public_key_init + +#define hash_to_challenge SQISIGN_NAMESPACE(hash_to_challenge) +#define public_key_finalize SQISIGN_NAMESPACE(public_key_finalize) +#define public_key_init SQISIGN_NAMESPACE(public_key_init) + +// Namespacing symbols exported from dim2.c: +#undef ibz_2x2_mul_mod +#undef ibz_mat_2x2_add +#undef ibz_mat_2x2_copy +#undef ibz_mat_2x2_det_from_ibz +#undef ibz_mat_2x2_eval +#undef ibz_mat_2x2_inv_mod +#undef ibz_mat_2x2_set +#undef ibz_vec_2_set + +#define ibz_2x2_mul_mod SQISIGN_NAMESPACE_GENERIC(ibz_2x2_mul_mod) +#define ibz_mat_2x2_add SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_add) +#define ibz_mat_2x2_copy SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_copy) +#define ibz_mat_2x2_det_from_ibz SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_det_from_ibz) +#define ibz_mat_2x2_eval SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_eval) +#define ibz_mat_2x2_inv_mod SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_inv_mod) +#define ibz_mat_2x2_set SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_set) +#define ibz_vec_2_set SQISIGN_NAMESPACE_GENERIC(ibz_vec_2_set) + +// Namespacing symbols exported from dim2id2iso.c: +#undef dim2id2iso_arbitrary_isogeny_evaluation +#undef dim2id2iso_ideal_to_isogeny_clapotis +#undef find_uv +#undef fixed_degree_isogeny_and_eval + +#define dim2id2iso_arbitrary_isogeny_evaluation SQISIGN_NAMESPACE(dim2id2iso_arbitrary_isogeny_evaluation) +#define dim2id2iso_ideal_to_isogeny_clapotis SQISIGN_NAMESPACE(dim2id2iso_ideal_to_isogeny_clapotis) +#define find_uv SQISIGN_NAMESPACE(find_uv) +#define fixed_degree_isogeny_and_eval SQISIGN_NAMESPACE(fixed_degree_isogeny_and_eval) + +// Namespacing symbols exported from dim4.c: +#undef ibz_inv_dim4_make_coeff_mpm +#undef ibz_inv_dim4_make_coeff_pmp +#undef ibz_mat_4x4_copy +#undef ibz_mat_4x4_equal +#undef ibz_mat_4x4_eval +#undef ibz_mat_4x4_eval_t +#undef ibz_mat_4x4_gcd +#undef ibz_mat_4x4_identity +#undef ibz_mat_4x4_inv_with_det_as_denom +#undef ibz_mat_4x4_is_identity +#undef ibz_mat_4x4_mul +#undef ibz_mat_4x4_negate +#undef ibz_mat_4x4_scalar_div +#undef ibz_mat_4x4_scalar_mul +#undef ibz_mat_4x4_transpose +#undef ibz_mat_4x4_zero +#undef ibz_vec_4_add +#undef ibz_vec_4_content +#undef ibz_vec_4_copy +#undef ibz_vec_4_copy_ibz +#undef ibz_vec_4_is_zero +#undef ibz_vec_4_linear_combination +#undef ibz_vec_4_negate +#undef ibz_vec_4_scalar_div +#undef ibz_vec_4_scalar_mul +#undef ibz_vec_4_set +#undef ibz_vec_4_sub +#undef quat_qf_eval + +#define ibz_inv_dim4_make_coeff_mpm SQISIGN_NAMESPACE_GENERIC(ibz_inv_dim4_make_coeff_mpm) +#define ibz_inv_dim4_make_coeff_pmp SQISIGN_NAMESPACE_GENERIC(ibz_inv_dim4_make_coeff_pmp) +#define ibz_mat_4x4_copy SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_copy) +#define ibz_mat_4x4_equal SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_equal) +#define ibz_mat_4x4_eval SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_eval) +#define ibz_mat_4x4_eval_t SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_eval_t) +#define ibz_mat_4x4_gcd SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_gcd) +#define ibz_mat_4x4_identity SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_identity) +#define ibz_mat_4x4_inv_with_det_as_denom SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_inv_with_det_as_denom) +#define ibz_mat_4x4_is_identity SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_is_identity) +#define ibz_mat_4x4_mul SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_mul) +#define ibz_mat_4x4_negate SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_negate) +#define ibz_mat_4x4_scalar_div SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_scalar_div) +#define ibz_mat_4x4_scalar_mul SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_scalar_mul) +#define ibz_mat_4x4_transpose SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_transpose) +#define ibz_mat_4x4_zero SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_zero) +#define ibz_vec_4_add SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_add) +#define ibz_vec_4_content SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_content) +#define ibz_vec_4_copy SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_copy) +#define ibz_vec_4_copy_ibz SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_copy_ibz) +#define ibz_vec_4_is_zero SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_is_zero) +#define ibz_vec_4_linear_combination SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_linear_combination) +#define ibz_vec_4_negate SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_negate) +#define ibz_vec_4_scalar_div SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_scalar_div) +#define ibz_vec_4_scalar_mul SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_scalar_mul) +#define ibz_vec_4_set SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_set) +#define ibz_vec_4_sub SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_sub) +#define quat_qf_eval SQISIGN_NAMESPACE_GENERIC(quat_qf_eval) + +// Namespacing symbols exported from ec.c: +#undef cswap_points +#undef ec_biscalar_mul +#undef ec_curve_init +#undef ec_curve_init_from_A +#undef ec_curve_normalize_A24 +#undef ec_curve_verify_A +#undef ec_dbl +#undef ec_dbl_iter +#undef ec_dbl_iter_basis +#undef ec_has_zero_coordinate +#undef ec_is_basis_four_torsion +#undef ec_is_equal +#undef ec_is_four_torsion +#undef ec_is_two_torsion +#undef ec_is_zero +#undef ec_j_inv +#undef ec_ladder3pt +#undef ec_mul +#undef ec_normalize_curve +#undef ec_normalize_curve_and_A24 +#undef ec_normalize_point +#undef ec_point_init +#undef select_point +#undef xADD +#undef xDBL +#undef xDBLADD +#undef xDBLMUL +#undef xDBL_A24 +#undef xDBL_E0 +#undef xMUL + +#define cswap_points SQISIGN_NAMESPACE(cswap_points) +#define ec_biscalar_mul SQISIGN_NAMESPACE(ec_biscalar_mul) +#define ec_curve_init SQISIGN_NAMESPACE(ec_curve_init) +#define ec_curve_init_from_A SQISIGN_NAMESPACE(ec_curve_init_from_A) +#define ec_curve_normalize_A24 SQISIGN_NAMESPACE(ec_curve_normalize_A24) +#define ec_curve_verify_A SQISIGN_NAMESPACE(ec_curve_verify_A) +#define ec_dbl SQISIGN_NAMESPACE(ec_dbl) +#define ec_dbl_iter SQISIGN_NAMESPACE(ec_dbl_iter) +#define ec_dbl_iter_basis SQISIGN_NAMESPACE(ec_dbl_iter_basis) +#define ec_has_zero_coordinate SQISIGN_NAMESPACE(ec_has_zero_coordinate) +#define ec_is_basis_four_torsion SQISIGN_NAMESPACE(ec_is_basis_four_torsion) +#define ec_is_equal SQISIGN_NAMESPACE(ec_is_equal) +#define ec_is_four_torsion SQISIGN_NAMESPACE(ec_is_four_torsion) +#define ec_is_two_torsion SQISIGN_NAMESPACE(ec_is_two_torsion) +#define ec_is_zero SQISIGN_NAMESPACE(ec_is_zero) +#define ec_j_inv SQISIGN_NAMESPACE(ec_j_inv) +#define ec_ladder3pt SQISIGN_NAMESPACE(ec_ladder3pt) +#define ec_mul SQISIGN_NAMESPACE(ec_mul) +#define ec_normalize_curve SQISIGN_NAMESPACE(ec_normalize_curve) +#define ec_normalize_curve_and_A24 SQISIGN_NAMESPACE(ec_normalize_curve_and_A24) +#define ec_normalize_point SQISIGN_NAMESPACE(ec_normalize_point) +#define ec_point_init SQISIGN_NAMESPACE(ec_point_init) +#define select_point SQISIGN_NAMESPACE(select_point) +#define xADD SQISIGN_NAMESPACE(xADD) +#define xDBL SQISIGN_NAMESPACE(xDBL) +#define xDBLADD SQISIGN_NAMESPACE(xDBLADD) +#define xDBLMUL SQISIGN_NAMESPACE(xDBLMUL) +#define xDBL_A24 SQISIGN_NAMESPACE(xDBL_A24) +#define xDBL_E0 SQISIGN_NAMESPACE(xDBL_E0) +#define xMUL SQISIGN_NAMESPACE(xMUL) + +// Namespacing symbols exported from ec_jac.c: +#undef ADD +#undef DBL +#undef DBLW +#undef copy_jac_point +#undef jac_from_ws +#undef jac_init +#undef jac_is_equal +#undef jac_neg +#undef jac_to_ws +#undef jac_to_xz +#undef jac_to_xz_add_components +#undef select_jac_point + +#define ADD SQISIGN_NAMESPACE(ADD) +#define DBL SQISIGN_NAMESPACE(DBL) +#define DBLW SQISIGN_NAMESPACE(DBLW) +#define copy_jac_point SQISIGN_NAMESPACE(copy_jac_point) +#define jac_from_ws SQISIGN_NAMESPACE(jac_from_ws) +#define jac_init SQISIGN_NAMESPACE(jac_init) +#define jac_is_equal SQISIGN_NAMESPACE(jac_is_equal) +#define jac_neg SQISIGN_NAMESPACE(jac_neg) +#define jac_to_ws SQISIGN_NAMESPACE(jac_to_ws) +#define jac_to_xz SQISIGN_NAMESPACE(jac_to_xz) +#define jac_to_xz_add_components SQISIGN_NAMESPACE(jac_to_xz_add_components) +#define select_jac_point SQISIGN_NAMESPACE(select_jac_point) + +// Namespacing symbols exported from encode_signature.c: +#undef secret_key_from_bytes +#undef secret_key_to_bytes + +#define secret_key_from_bytes SQISIGN_NAMESPACE(secret_key_from_bytes) +#define secret_key_to_bytes SQISIGN_NAMESPACE(secret_key_to_bytes) + +// Namespacing symbols exported from encode_verification.c: +#undef public_key_from_bytes +#undef public_key_to_bytes +#undef signature_from_bytes +#undef signature_to_bytes + +#define public_key_from_bytes SQISIGN_NAMESPACE(public_key_from_bytes) +#define public_key_to_bytes SQISIGN_NAMESPACE(public_key_to_bytes) +#define signature_from_bytes SQISIGN_NAMESPACE(signature_from_bytes) +#define signature_to_bytes SQISIGN_NAMESPACE(signature_to_bytes) + +// Namespacing symbols exported from finit.c: +#undef ibz_mat_2x2_finalize +#undef ibz_mat_2x2_init +#undef ibz_mat_4x4_finalize +#undef ibz_mat_4x4_init +#undef ibz_vec_2_finalize +#undef ibz_vec_2_init +#undef ibz_vec_4_finalize +#undef ibz_vec_4_init +#undef quat_alg_elem_finalize +#undef quat_alg_elem_init +#undef quat_alg_finalize +#undef quat_alg_init_set +#undef quat_lattice_finalize +#undef quat_lattice_init +#undef quat_left_ideal_finalize +#undef quat_left_ideal_init + +#define ibz_mat_2x2_finalize SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_finalize) +#define ibz_mat_2x2_init SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_init) +#define ibz_mat_4x4_finalize SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_finalize) +#define ibz_mat_4x4_init SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_init) +#define ibz_vec_2_finalize SQISIGN_NAMESPACE_GENERIC(ibz_vec_2_finalize) +#define ibz_vec_2_init SQISIGN_NAMESPACE_GENERIC(ibz_vec_2_init) +#define ibz_vec_4_finalize SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_finalize) +#define ibz_vec_4_init SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_init) +#define quat_alg_elem_finalize SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_finalize) +#define quat_alg_elem_init SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_init) +#define quat_alg_finalize SQISIGN_NAMESPACE_GENERIC(quat_alg_finalize) +#define quat_alg_init_set SQISIGN_NAMESPACE_GENERIC(quat_alg_init_set) +#define quat_lattice_finalize SQISIGN_NAMESPACE_GENERIC(quat_lattice_finalize) +#define quat_lattice_init SQISIGN_NAMESPACE_GENERIC(quat_lattice_init) +#define quat_left_ideal_finalize SQISIGN_NAMESPACE_GENERIC(quat_left_ideal_finalize) +#define quat_left_ideal_init SQISIGN_NAMESPACE_GENERIC(quat_left_ideal_init) + +// Namespacing symbols exported from fp.c: +#undef fp_select + +#define fp_select SQISIGN_NAMESPACE(fp_select) + +// Namespacing symbols exported from fp.c, fp_p27500_64.c, fp_p5248_64.c, fp_p65376_64.c: +#undef fp_exp3div4 +#undef fp_inv +#undef fp_is_square +#undef fp_sqrt + +#define fp_exp3div4 SQISIGN_NAMESPACE(fp_exp3div4) +#define fp_inv SQISIGN_NAMESPACE(fp_inv) +#define fp_is_square SQISIGN_NAMESPACE(fp_is_square) +#define fp_sqrt SQISIGN_NAMESPACE(fp_sqrt) + +// Namespacing symbols exported from fp2.c: +#undef fp2_add +#undef fp2_add_one +#undef fp2_batched_inv +#undef fp2_copy +#undef fp2_cswap +#undef fp2_decode +#undef fp2_encode +#undef fp2_half +#undef fp2_inv +#undef fp2_is_equal +#undef fp2_is_one +#undef fp2_is_square +#undef fp2_is_zero +#undef fp2_mul +#undef fp2_mul_small +#undef fp2_neg +#undef fp2_pow_vartime +#undef fp2_print +#undef fp2_select +#undef fp2_set_one +#undef fp2_set_small +#undef fp2_set_zero +#undef fp2_sqr +#undef fp2_sqrt +#undef fp2_sqrt_verify +#undef fp2_sub + +#define fp2_add SQISIGN_NAMESPACE(fp2_add) +#define fp2_add_one SQISIGN_NAMESPACE(fp2_add_one) +#define fp2_batched_inv SQISIGN_NAMESPACE(fp2_batched_inv) +#define fp2_copy SQISIGN_NAMESPACE(fp2_copy) +#define fp2_cswap SQISIGN_NAMESPACE(fp2_cswap) +#define fp2_decode SQISIGN_NAMESPACE(fp2_decode) +#define fp2_encode SQISIGN_NAMESPACE(fp2_encode) +#define fp2_half SQISIGN_NAMESPACE(fp2_half) +#define fp2_inv SQISIGN_NAMESPACE(fp2_inv) +#define fp2_is_equal SQISIGN_NAMESPACE(fp2_is_equal) +#define fp2_is_one SQISIGN_NAMESPACE(fp2_is_one) +#define fp2_is_square SQISIGN_NAMESPACE(fp2_is_square) +#define fp2_is_zero SQISIGN_NAMESPACE(fp2_is_zero) +#define fp2_mul SQISIGN_NAMESPACE(fp2_mul) +#define fp2_mul_small SQISIGN_NAMESPACE(fp2_mul_small) +#define fp2_neg SQISIGN_NAMESPACE(fp2_neg) +#define fp2_pow_vartime SQISIGN_NAMESPACE(fp2_pow_vartime) +#define fp2_print SQISIGN_NAMESPACE(fp2_print) +#define fp2_select SQISIGN_NAMESPACE(fp2_select) +#define fp2_set_one SQISIGN_NAMESPACE(fp2_set_one) +#define fp2_set_small SQISIGN_NAMESPACE(fp2_set_small) +#define fp2_set_zero SQISIGN_NAMESPACE(fp2_set_zero) +#define fp2_sqr SQISIGN_NAMESPACE(fp2_sqr) +#define fp2_sqrt SQISIGN_NAMESPACE(fp2_sqrt) +#define fp2_sqrt_verify SQISIGN_NAMESPACE(fp2_sqrt_verify) +#define fp2_sub SQISIGN_NAMESPACE(fp2_sub) + +// Namespacing symbols exported from fp_p27500_64.c, fp_p5248_64.c, fp_p65376_64.c: +#undef fp_copy +#undef fp_cswap +#undef fp_decode +#undef fp_decode_reduce +#undef fp_div3 +#undef fp_encode +#undef fp_half +#undef fp_is_equal +#undef fp_is_zero +#undef fp_mul_small +#undef fp_neg +#undef fp_set_one +#undef fp_set_small +#undef fp_set_zero + +#define fp_copy SQISIGN_NAMESPACE(fp_copy) +#define fp_cswap SQISIGN_NAMESPACE(fp_cswap) +#define fp_decode SQISIGN_NAMESPACE(fp_decode) +#define fp_decode_reduce SQISIGN_NAMESPACE(fp_decode_reduce) +#define fp_div3 SQISIGN_NAMESPACE(fp_div3) +#define fp_encode SQISIGN_NAMESPACE(fp_encode) +#define fp_half SQISIGN_NAMESPACE(fp_half) +#define fp_is_equal SQISIGN_NAMESPACE(fp_is_equal) +#define fp_is_zero SQISIGN_NAMESPACE(fp_is_zero) +#define fp_mul_small SQISIGN_NAMESPACE(fp_mul_small) +#define fp_neg SQISIGN_NAMESPACE(fp_neg) +#define fp_set_one SQISIGN_NAMESPACE(fp_set_one) +#define fp_set_small SQISIGN_NAMESPACE(fp_set_small) +#define fp_set_zero SQISIGN_NAMESPACE(fp_set_zero) + +// Namespacing symbols exported from fp_p27500_64.c, fp_p5248_64.c, fp_p65376_64.c, gf27500.c, gf5248.c, gf65376.c: +#undef fp_add +#undef fp_mul +#undef fp_sqr +#undef fp_sub + +#define fp_add SQISIGN_NAMESPACE(fp_add) +#define fp_mul SQISIGN_NAMESPACE(fp_mul) +#define fp_sqr SQISIGN_NAMESPACE(fp_sqr) +#define fp_sub SQISIGN_NAMESPACE(fp_sub) + +// Namespacing symbols exported from gf27500.c: +#undef gf27500_decode +#undef gf27500_decode_reduce +#undef gf27500_div +#undef gf27500_div3 +#undef gf27500_encode +#undef gf27500_invert +#undef gf27500_legendre +#undef gf27500_sqrt + +#define gf27500_decode SQISIGN_NAMESPACE(gf27500_decode) +#define gf27500_decode_reduce SQISIGN_NAMESPACE(gf27500_decode_reduce) +#define gf27500_div SQISIGN_NAMESPACE(gf27500_div) +#define gf27500_div3 SQISIGN_NAMESPACE(gf27500_div3) +#define gf27500_encode SQISIGN_NAMESPACE(gf27500_encode) +#define gf27500_invert SQISIGN_NAMESPACE(gf27500_invert) +#define gf27500_legendre SQISIGN_NAMESPACE(gf27500_legendre) +#define gf27500_sqrt SQISIGN_NAMESPACE(gf27500_sqrt) + +// Namespacing symbols exported from gf27500.c, gf5248.c, gf65376.c: +#undef fp2_mul_c0 +#undef fp2_mul_c1 +#undef fp2_sq_c0 +#undef fp2_sq_c1 + +#define fp2_mul_c0 SQISIGN_NAMESPACE(fp2_mul_c0) +#define fp2_mul_c1 SQISIGN_NAMESPACE(fp2_mul_c1) +#define fp2_sq_c0 SQISIGN_NAMESPACE(fp2_sq_c0) +#define fp2_sq_c1 SQISIGN_NAMESPACE(fp2_sq_c1) + +// Namespacing symbols exported from gf5248.c: +#undef gf5248_decode +#undef gf5248_decode_reduce +#undef gf5248_div +#undef gf5248_div3 +#undef gf5248_encode +#undef gf5248_invert +#undef gf5248_legendre +#undef gf5248_sqrt + +#define gf5248_decode SQISIGN_NAMESPACE(gf5248_decode) +#define gf5248_decode_reduce SQISIGN_NAMESPACE(gf5248_decode_reduce) +#define gf5248_div SQISIGN_NAMESPACE(gf5248_div) +#define gf5248_div3 SQISIGN_NAMESPACE(gf5248_div3) +#define gf5248_encode SQISIGN_NAMESPACE(gf5248_encode) +#define gf5248_invert SQISIGN_NAMESPACE(gf5248_invert) +#define gf5248_legendre SQISIGN_NAMESPACE(gf5248_legendre) +#define gf5248_sqrt SQISIGN_NAMESPACE(gf5248_sqrt) + +// Namespacing symbols exported from gf65376.c: +#undef gf65376_decode +#undef gf65376_decode_reduce +#undef gf65376_div +#undef gf65376_div3 +#undef gf65376_encode +#undef gf65376_invert +#undef gf65376_legendre +#undef gf65376_sqrt + +#define gf65376_decode SQISIGN_NAMESPACE(gf65376_decode) +#define gf65376_decode_reduce SQISIGN_NAMESPACE(gf65376_decode_reduce) +#define gf65376_div SQISIGN_NAMESPACE(gf65376_div) +#define gf65376_div3 SQISIGN_NAMESPACE(gf65376_div3) +#define gf65376_encode SQISIGN_NAMESPACE(gf65376_encode) +#define gf65376_invert SQISIGN_NAMESPACE(gf65376_invert) +#define gf65376_legendre SQISIGN_NAMESPACE(gf65376_legendre) +#define gf65376_sqrt SQISIGN_NAMESPACE(gf65376_sqrt) + +// Namespacing symbols exported from hd.c: +#undef add_couple_jac_points +#undef copy_bases_to_kernel +#undef couple_jac_to_xz +#undef double_couple_jac_point +#undef double_couple_jac_point_iter +#undef double_couple_point +#undef double_couple_point_iter + +#define add_couple_jac_points SQISIGN_NAMESPACE(add_couple_jac_points) +#define copy_bases_to_kernel SQISIGN_NAMESPACE(copy_bases_to_kernel) +#define couple_jac_to_xz SQISIGN_NAMESPACE(couple_jac_to_xz) +#define double_couple_jac_point SQISIGN_NAMESPACE(double_couple_jac_point) +#define double_couple_jac_point_iter SQISIGN_NAMESPACE(double_couple_jac_point_iter) +#define double_couple_point SQISIGN_NAMESPACE(double_couple_point) +#define double_couple_point_iter SQISIGN_NAMESPACE(double_couple_point_iter) + +// Namespacing symbols exported from hnf.c: +#undef ibz_mat_4x4_is_hnf +#undef ibz_mat_4xn_hnf_mod_core +#undef ibz_vec_4_copy_mod +#undef ibz_vec_4_linear_combination_mod +#undef ibz_vec_4_scalar_mul_mod + +#define ibz_mat_4x4_is_hnf SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_is_hnf) +#define ibz_mat_4xn_hnf_mod_core SQISIGN_NAMESPACE_GENERIC(ibz_mat_4xn_hnf_mod_core) +#define ibz_vec_4_copy_mod SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_copy_mod) +#define ibz_vec_4_linear_combination_mod SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_linear_combination_mod) +#define ibz_vec_4_scalar_mul_mod SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_scalar_mul_mod) + +// Namespacing symbols exported from hnf_internal.c: +#undef ibz_centered_mod +#undef ibz_conditional_assign +#undef ibz_mod_not_zero +#undef ibz_xgcd_with_u_not_0 + +#define ibz_centered_mod SQISIGN_NAMESPACE_GENERIC(ibz_centered_mod) +#define ibz_conditional_assign SQISIGN_NAMESPACE_GENERIC(ibz_conditional_assign) +#define ibz_mod_not_zero SQISIGN_NAMESPACE_GENERIC(ibz_mod_not_zero) +#define ibz_xgcd_with_u_not_0 SQISIGN_NAMESPACE_GENERIC(ibz_xgcd_with_u_not_0) + +// Namespacing symbols exported from ibz_division.c: +#undef ibz_xgcd + +#define ibz_xgcd SQISIGN_NAMESPACE_GENERIC(ibz_xgcd) + +// Namespacing symbols exported from id2iso.c: +#undef change_of_basis_matrix_tate +#undef change_of_basis_matrix_tate_invert +#undef ec_biscalar_mul_ibz_vec +#undef endomorphism_application_even_basis +#undef id2iso_ideal_to_kernel_dlogs_even +#undef id2iso_kernel_dlogs_to_ideal_even +#undef matrix_application_even_basis + +#define change_of_basis_matrix_tate SQISIGN_NAMESPACE(change_of_basis_matrix_tate) +#define change_of_basis_matrix_tate_invert SQISIGN_NAMESPACE(change_of_basis_matrix_tate_invert) +#define ec_biscalar_mul_ibz_vec SQISIGN_NAMESPACE(ec_biscalar_mul_ibz_vec) +#define endomorphism_application_even_basis SQISIGN_NAMESPACE(endomorphism_application_even_basis) +#define id2iso_ideal_to_kernel_dlogs_even SQISIGN_NAMESPACE(id2iso_ideal_to_kernel_dlogs_even) +#define id2iso_kernel_dlogs_to_ideal_even SQISIGN_NAMESPACE(id2iso_kernel_dlogs_to_ideal_even) +#define matrix_application_even_basis SQISIGN_NAMESPACE(matrix_application_even_basis) + +// Namespacing symbols exported from ideal.c: +#undef quat_lideal_add +#undef quat_lideal_class_gram +#undef quat_lideal_conjugate_without_hnf +#undef quat_lideal_copy +#undef quat_lideal_create +#undef quat_lideal_create_principal +#undef quat_lideal_equals +#undef quat_lideal_generator +#undef quat_lideal_inter +#undef quat_lideal_inverse_lattice_without_hnf +#undef quat_lideal_mul +#undef quat_lideal_norm +#undef quat_lideal_right_order +#undef quat_lideal_right_transporter +#undef quat_order_discriminant +#undef quat_order_is_maximal + +#define quat_lideal_add SQISIGN_NAMESPACE_GENERIC(quat_lideal_add) +#define quat_lideal_class_gram SQISIGN_NAMESPACE_GENERIC(quat_lideal_class_gram) +#define quat_lideal_conjugate_without_hnf SQISIGN_NAMESPACE_GENERIC(quat_lideal_conjugate_without_hnf) +#define quat_lideal_copy SQISIGN_NAMESPACE_GENERIC(quat_lideal_copy) +#define quat_lideal_create SQISIGN_NAMESPACE_GENERIC(quat_lideal_create) +#define quat_lideal_create_principal SQISIGN_NAMESPACE_GENERIC(quat_lideal_create_principal) +#define quat_lideal_equals SQISIGN_NAMESPACE_GENERIC(quat_lideal_equals) +#define quat_lideal_generator SQISIGN_NAMESPACE_GENERIC(quat_lideal_generator) +#define quat_lideal_inter SQISIGN_NAMESPACE_GENERIC(quat_lideal_inter) +#define quat_lideal_inverse_lattice_without_hnf SQISIGN_NAMESPACE_GENERIC(quat_lideal_inverse_lattice_without_hnf) +#define quat_lideal_mul SQISIGN_NAMESPACE_GENERIC(quat_lideal_mul) +#define quat_lideal_norm SQISIGN_NAMESPACE_GENERIC(quat_lideal_norm) +#define quat_lideal_right_order SQISIGN_NAMESPACE_GENERIC(quat_lideal_right_order) +#define quat_lideal_right_transporter SQISIGN_NAMESPACE_GENERIC(quat_lideal_right_transporter) +#define quat_order_discriminant SQISIGN_NAMESPACE_GENERIC(quat_order_discriminant) +#define quat_order_is_maximal SQISIGN_NAMESPACE_GENERIC(quat_order_is_maximal) + +// Namespacing symbols exported from intbig.c: +#undef ibz_abs +#undef ibz_add +#undef ibz_bitsize +#undef ibz_cmp +#undef ibz_cmp_int32 +#undef ibz_convert_to_str +#undef ibz_copy +#undef ibz_copy_digits +#undef ibz_div +#undef ibz_div_2exp +#undef ibz_div_floor +#undef ibz_divides +#undef ibz_finalize +#undef ibz_gcd +#undef ibz_get +#undef ibz_init +#undef ibz_invmod +#undef ibz_is_even +#undef ibz_is_odd +#undef ibz_is_one +#undef ibz_is_zero +#undef ibz_legendre +#undef ibz_mod +#undef ibz_mod_ui +#undef ibz_mul +#undef ibz_neg +#undef ibz_pow +#undef ibz_pow_mod +#undef ibz_print +#undef ibz_probab_prime +#undef ibz_rand_interval +#undef ibz_rand_interval_bits +#undef ibz_rand_interval_i +#undef ibz_rand_interval_minm_m +#undef ibz_set +#undef ibz_set_from_str +#undef ibz_size_in_base +#undef ibz_sqrt +#undef ibz_sqrt_floor +#undef ibz_sqrt_mod_p +#undef ibz_sub +#undef ibz_swap +#undef ibz_to_digits +#undef ibz_two_adic + +#define ibz_abs SQISIGN_NAMESPACE_GENERIC(ibz_abs) +#define ibz_add SQISIGN_NAMESPACE_GENERIC(ibz_add) +#define ibz_bitsize SQISIGN_NAMESPACE_GENERIC(ibz_bitsize) +#define ibz_cmp SQISIGN_NAMESPACE_GENERIC(ibz_cmp) +#define ibz_cmp_int32 SQISIGN_NAMESPACE_GENERIC(ibz_cmp_int32) +#define ibz_convert_to_str SQISIGN_NAMESPACE_GENERIC(ibz_convert_to_str) +#define ibz_copy SQISIGN_NAMESPACE_GENERIC(ibz_copy) +#define ibz_copy_digits SQISIGN_NAMESPACE_GENERIC(ibz_copy_digits) +#define ibz_div SQISIGN_NAMESPACE_GENERIC(ibz_div) +#define ibz_div_2exp SQISIGN_NAMESPACE_GENERIC(ibz_div_2exp) +#define ibz_div_floor SQISIGN_NAMESPACE_GENERIC(ibz_div_floor) +#define ibz_divides SQISIGN_NAMESPACE_GENERIC(ibz_divides) +#define ibz_finalize SQISIGN_NAMESPACE_GENERIC(ibz_finalize) +#define ibz_gcd SQISIGN_NAMESPACE_GENERIC(ibz_gcd) +#define ibz_get SQISIGN_NAMESPACE_GENERIC(ibz_get) +#define ibz_init SQISIGN_NAMESPACE_GENERIC(ibz_init) +#define ibz_invmod SQISIGN_NAMESPACE_GENERIC(ibz_invmod) +#define ibz_is_even SQISIGN_NAMESPACE_GENERIC(ibz_is_even) +#define ibz_is_odd SQISIGN_NAMESPACE_GENERIC(ibz_is_odd) +#define ibz_is_one SQISIGN_NAMESPACE_GENERIC(ibz_is_one) +#define ibz_is_zero SQISIGN_NAMESPACE_GENERIC(ibz_is_zero) +#define ibz_legendre SQISIGN_NAMESPACE_GENERIC(ibz_legendre) +#define ibz_mod SQISIGN_NAMESPACE_GENERIC(ibz_mod) +#define ibz_mod_ui SQISIGN_NAMESPACE_GENERIC(ibz_mod_ui) +#define ibz_mul SQISIGN_NAMESPACE_GENERIC(ibz_mul) +#define ibz_neg SQISIGN_NAMESPACE_GENERIC(ibz_neg) +#define ibz_pow SQISIGN_NAMESPACE_GENERIC(ibz_pow) +#define ibz_pow_mod SQISIGN_NAMESPACE_GENERIC(ibz_pow_mod) +#define ibz_print SQISIGN_NAMESPACE_GENERIC(ibz_print) +#define ibz_probab_prime SQISIGN_NAMESPACE_GENERIC(ibz_probab_prime) +#define ibz_rand_interval SQISIGN_NAMESPACE_GENERIC(ibz_rand_interval) +#define ibz_rand_interval_bits SQISIGN_NAMESPACE_GENERIC(ibz_rand_interval_bits) +#define ibz_rand_interval_i SQISIGN_NAMESPACE_GENERIC(ibz_rand_interval_i) +#define ibz_rand_interval_minm_m SQISIGN_NAMESPACE_GENERIC(ibz_rand_interval_minm_m) +#define ibz_set SQISIGN_NAMESPACE_GENERIC(ibz_set) +#define ibz_set_from_str SQISIGN_NAMESPACE_GENERIC(ibz_set_from_str) +#define ibz_size_in_base SQISIGN_NAMESPACE_GENERIC(ibz_size_in_base) +#define ibz_sqrt SQISIGN_NAMESPACE_GENERIC(ibz_sqrt) +#define ibz_sqrt_floor SQISIGN_NAMESPACE_GENERIC(ibz_sqrt_floor) +#define ibz_sqrt_mod_p SQISIGN_NAMESPACE_GENERIC(ibz_sqrt_mod_p) +#define ibz_sub SQISIGN_NAMESPACE_GENERIC(ibz_sub) +#define ibz_swap SQISIGN_NAMESPACE_GENERIC(ibz_swap) +#define ibz_to_digits SQISIGN_NAMESPACE_GENERIC(ibz_to_digits) +#define ibz_two_adic SQISIGN_NAMESPACE_GENERIC(ibz_two_adic) + +// Namespacing symbols exported from integers.c: +#undef ibz_cornacchia_prime +#undef ibz_generate_random_prime + +#define ibz_cornacchia_prime SQISIGN_NAMESPACE_GENERIC(ibz_cornacchia_prime) +#define ibz_generate_random_prime SQISIGN_NAMESPACE_GENERIC(ibz_generate_random_prime) + +// Namespacing symbols exported from isog_chains.c: +#undef ec_eval_even +#undef ec_eval_small_chain +#undef ec_iso_eval +#undef ec_isomorphism + +#define ec_eval_even SQISIGN_NAMESPACE(ec_eval_even) +#define ec_eval_small_chain SQISIGN_NAMESPACE(ec_eval_small_chain) +#define ec_iso_eval SQISIGN_NAMESPACE(ec_iso_eval) +#define ec_isomorphism SQISIGN_NAMESPACE(ec_isomorphism) + +// Namespacing symbols exported from keygen.c: +#undef protocols_keygen +#undef secret_key_finalize +#undef secret_key_init + +#define protocols_keygen SQISIGN_NAMESPACE(protocols_keygen) +#define secret_key_finalize SQISIGN_NAMESPACE(secret_key_finalize) +#define secret_key_init SQISIGN_NAMESPACE(secret_key_init) + +// Namespacing symbols exported from l2.c: +#undef quat_lattice_lll +#undef quat_lll_core + +#define quat_lattice_lll SQISIGN_NAMESPACE_GENERIC(quat_lattice_lll) +#define quat_lll_core SQISIGN_NAMESPACE_GENERIC(quat_lll_core) + +// Namespacing symbols exported from lat_ball.c: +#undef quat_lattice_bound_parallelogram +#undef quat_lattice_sample_from_ball + +#define quat_lattice_bound_parallelogram SQISIGN_NAMESPACE_GENERIC(quat_lattice_bound_parallelogram) +#define quat_lattice_sample_from_ball SQISIGN_NAMESPACE_GENERIC(quat_lattice_sample_from_ball) + +// Namespacing symbols exported from lattice.c: +#undef quat_lattice_add +#undef quat_lattice_alg_elem_mul +#undef quat_lattice_conjugate_without_hnf +#undef quat_lattice_contains +#undef quat_lattice_dual_without_hnf +#undef quat_lattice_equal +#undef quat_lattice_gram +#undef quat_lattice_hnf +#undef quat_lattice_inclusion +#undef quat_lattice_index +#undef quat_lattice_intersect +#undef quat_lattice_mat_alg_coord_mul_without_hnf +#undef quat_lattice_mul +#undef quat_lattice_reduce_denom + +#define quat_lattice_add SQISIGN_NAMESPACE_GENERIC(quat_lattice_add) +#define quat_lattice_alg_elem_mul SQISIGN_NAMESPACE_GENERIC(quat_lattice_alg_elem_mul) +#define quat_lattice_conjugate_without_hnf SQISIGN_NAMESPACE_GENERIC(quat_lattice_conjugate_without_hnf) +#define quat_lattice_contains SQISIGN_NAMESPACE_GENERIC(quat_lattice_contains) +#define quat_lattice_dual_without_hnf SQISIGN_NAMESPACE_GENERIC(quat_lattice_dual_without_hnf) +#define quat_lattice_equal SQISIGN_NAMESPACE_GENERIC(quat_lattice_equal) +#define quat_lattice_gram SQISIGN_NAMESPACE_GENERIC(quat_lattice_gram) +#define quat_lattice_hnf SQISIGN_NAMESPACE_GENERIC(quat_lattice_hnf) +#define quat_lattice_inclusion SQISIGN_NAMESPACE_GENERIC(quat_lattice_inclusion) +#define quat_lattice_index SQISIGN_NAMESPACE_GENERIC(quat_lattice_index) +#define quat_lattice_intersect SQISIGN_NAMESPACE_GENERIC(quat_lattice_intersect) +#define quat_lattice_mat_alg_coord_mul_without_hnf SQISIGN_NAMESPACE_GENERIC(quat_lattice_mat_alg_coord_mul_without_hnf) +#define quat_lattice_mul SQISIGN_NAMESPACE_GENERIC(quat_lattice_mul) +#define quat_lattice_reduce_denom SQISIGN_NAMESPACE_GENERIC(quat_lattice_reduce_denom) + +// Namespacing symbols exported from lll_applications.c: +#undef quat_lideal_lideal_mul_reduced +#undef quat_lideal_prime_norm_reduced_equivalent +#undef quat_lideal_reduce_basis + +#define quat_lideal_lideal_mul_reduced SQISIGN_NAMESPACE_GENERIC(quat_lideal_lideal_mul_reduced) +#define quat_lideal_prime_norm_reduced_equivalent SQISIGN_NAMESPACE_GENERIC(quat_lideal_prime_norm_reduced_equivalent) +#define quat_lideal_reduce_basis SQISIGN_NAMESPACE_GENERIC(quat_lideal_reduce_basis) + +// Namespacing symbols exported from lll_verification.c: +#undef ibq_vec_4_copy_ibz +#undef quat_lll_bilinear +#undef quat_lll_gram_schmidt_transposed_with_ibq +#undef quat_lll_set_ibq_parameters +#undef quat_lll_verify + +#define ibq_vec_4_copy_ibz SQISIGN_NAMESPACE_GENERIC(ibq_vec_4_copy_ibz) +#define quat_lll_bilinear SQISIGN_NAMESPACE_GENERIC(quat_lll_bilinear) +#define quat_lll_gram_schmidt_transposed_with_ibq SQISIGN_NAMESPACE_GENERIC(quat_lll_gram_schmidt_transposed_with_ibq) +#define quat_lll_set_ibq_parameters SQISIGN_NAMESPACE_GENERIC(quat_lll_set_ibq_parameters) +#define quat_lll_verify SQISIGN_NAMESPACE_GENERIC(quat_lll_verify) + +// Namespacing symbols exported from mem.c: +#undef sqisign_secure_clear +#undef sqisign_secure_free + +#define sqisign_secure_clear SQISIGN_NAMESPACE_GENERIC(sqisign_secure_clear) +#define sqisign_secure_free SQISIGN_NAMESPACE_GENERIC(sqisign_secure_free) + +// Namespacing symbols exported from mp.c: +#undef MUL +#undef mp_add +#undef mp_compare +#undef mp_copy +#undef mp_inv_2e +#undef mp_invert_matrix +#undef mp_is_one +#undef mp_is_zero +#undef mp_mod_2exp +#undef mp_mul +#undef mp_mul2 +#undef mp_neg +#undef mp_print +#undef mp_shiftl +#undef mp_shiftr +#undef mp_sub +#undef multiple_mp_shiftl +#undef select_ct +#undef swap_ct + +#define MUL SQISIGN_NAMESPACE_GENERIC(MUL) +#define mp_add SQISIGN_NAMESPACE_GENERIC(mp_add) +#define mp_compare SQISIGN_NAMESPACE_GENERIC(mp_compare) +#define mp_copy SQISIGN_NAMESPACE_GENERIC(mp_copy) +#define mp_inv_2e SQISIGN_NAMESPACE_GENERIC(mp_inv_2e) +#define mp_invert_matrix SQISIGN_NAMESPACE_GENERIC(mp_invert_matrix) +#define mp_is_one SQISIGN_NAMESPACE_GENERIC(mp_is_one) +#define mp_is_zero SQISIGN_NAMESPACE_GENERIC(mp_is_zero) +#define mp_mod_2exp SQISIGN_NAMESPACE_GENERIC(mp_mod_2exp) +#define mp_mul SQISIGN_NAMESPACE_GENERIC(mp_mul) +#define mp_mul2 SQISIGN_NAMESPACE_GENERIC(mp_mul2) +#define mp_neg SQISIGN_NAMESPACE_GENERIC(mp_neg) +#define mp_print SQISIGN_NAMESPACE_GENERIC(mp_print) +#define mp_shiftl SQISIGN_NAMESPACE_GENERIC(mp_shiftl) +#define mp_shiftr SQISIGN_NAMESPACE_GENERIC(mp_shiftr) +#define mp_sub SQISIGN_NAMESPACE_GENERIC(mp_sub) +#define multiple_mp_shiftl SQISIGN_NAMESPACE_GENERIC(multiple_mp_shiftl) +#define select_ct SQISIGN_NAMESPACE_GENERIC(select_ct) +#define swap_ct SQISIGN_NAMESPACE_GENERIC(swap_ct) + +// Namespacing symbols exported from normeq.c: +#undef quat_change_to_O0_basis +#undef quat_lattice_O0_set +#undef quat_lattice_O0_set_extremal +#undef quat_order_elem_create +#undef quat_represent_integer +#undef quat_sampling_random_ideal_O0_given_norm + +#define quat_change_to_O0_basis SQISIGN_NAMESPACE_GENERIC(quat_change_to_O0_basis) +#define quat_lattice_O0_set SQISIGN_NAMESPACE_GENERIC(quat_lattice_O0_set) +#define quat_lattice_O0_set_extremal SQISIGN_NAMESPACE_GENERIC(quat_lattice_O0_set_extremal) +#define quat_order_elem_create SQISIGN_NAMESPACE_GENERIC(quat_order_elem_create) +#define quat_represent_integer SQISIGN_NAMESPACE_GENERIC(quat_represent_integer) +#define quat_sampling_random_ideal_O0_given_norm SQISIGN_NAMESPACE_GENERIC(quat_sampling_random_ideal_O0_given_norm) + +// Namespacing symbols exported from printer.c: +#undef ibz_mat_2x2_print +#undef ibz_mat_4x4_print +#undef ibz_vec_2_print +#undef ibz_vec_4_print +#undef quat_alg_elem_print +#undef quat_alg_print +#undef quat_lattice_print +#undef quat_left_ideal_print + +#define ibz_mat_2x2_print SQISIGN_NAMESPACE_GENERIC(ibz_mat_2x2_print) +#define ibz_mat_4x4_print SQISIGN_NAMESPACE_GENERIC(ibz_mat_4x4_print) +#define ibz_vec_2_print SQISIGN_NAMESPACE_GENERIC(ibz_vec_2_print) +#define ibz_vec_4_print SQISIGN_NAMESPACE_GENERIC(ibz_vec_4_print) +#define quat_alg_elem_print SQISIGN_NAMESPACE_GENERIC(quat_alg_elem_print) +#define quat_alg_print SQISIGN_NAMESPACE_GENERIC(quat_alg_print) +#define quat_lattice_print SQISIGN_NAMESPACE_GENERIC(quat_lattice_print) +#define quat_left_ideal_print SQISIGN_NAMESPACE_GENERIC(quat_left_ideal_print) + +// Namespacing symbols exported from random_input_generation.c: +#undef quat_test_input_random_ideal_generation +#undef quat_test_input_random_ideal_lattice_generation +#undef quat_test_input_random_lattice_generation + +#define quat_test_input_random_ideal_generation SQISIGN_NAMESPACE_GENERIC(quat_test_input_random_ideal_generation) +#define quat_test_input_random_ideal_lattice_generation SQISIGN_NAMESPACE_GENERIC(quat_test_input_random_ideal_lattice_generation) +#define quat_test_input_random_lattice_generation SQISIGN_NAMESPACE_GENERIC(quat_test_input_random_lattice_generation) + +// Namespacing symbols exported from rationals.c: +#undef ibq_abs +#undef ibq_add +#undef ibq_cmp +#undef ibq_copy +#undef ibq_finalize +#undef ibq_init +#undef ibq_inv +#undef ibq_is_ibz +#undef ibq_is_one +#undef ibq_is_zero +#undef ibq_mat_4x4_finalize +#undef ibq_mat_4x4_init +#undef ibq_mat_4x4_print +#undef ibq_mul +#undef ibq_neg +#undef ibq_reduce +#undef ibq_set +#undef ibq_sub +#undef ibq_to_ibz +#undef ibq_vec_4_finalize +#undef ibq_vec_4_init +#undef ibq_vec_4_print + +#define ibq_abs SQISIGN_NAMESPACE_GENERIC(ibq_abs) +#define ibq_add SQISIGN_NAMESPACE_GENERIC(ibq_add) +#define ibq_cmp SQISIGN_NAMESPACE_GENERIC(ibq_cmp) +#define ibq_copy SQISIGN_NAMESPACE_GENERIC(ibq_copy) +#define ibq_finalize SQISIGN_NAMESPACE_GENERIC(ibq_finalize) +#define ibq_init SQISIGN_NAMESPACE_GENERIC(ibq_init) +#define ibq_inv SQISIGN_NAMESPACE_GENERIC(ibq_inv) +#define ibq_is_ibz SQISIGN_NAMESPACE_GENERIC(ibq_is_ibz) +#define ibq_is_one SQISIGN_NAMESPACE_GENERIC(ibq_is_one) +#define ibq_is_zero SQISIGN_NAMESPACE_GENERIC(ibq_is_zero) +#define ibq_mat_4x4_finalize SQISIGN_NAMESPACE_GENERIC(ibq_mat_4x4_finalize) +#define ibq_mat_4x4_init SQISIGN_NAMESPACE_GENERIC(ibq_mat_4x4_init) +#define ibq_mat_4x4_print SQISIGN_NAMESPACE_GENERIC(ibq_mat_4x4_print) +#define ibq_mul SQISIGN_NAMESPACE_GENERIC(ibq_mul) +#define ibq_neg SQISIGN_NAMESPACE_GENERIC(ibq_neg) +#define ibq_reduce SQISIGN_NAMESPACE_GENERIC(ibq_reduce) +#define ibq_set SQISIGN_NAMESPACE_GENERIC(ibq_set) +#define ibq_sub SQISIGN_NAMESPACE_GENERIC(ibq_sub) +#define ibq_to_ibz SQISIGN_NAMESPACE_GENERIC(ibq_to_ibz) +#define ibq_vec_4_finalize SQISIGN_NAMESPACE_GENERIC(ibq_vec_4_finalize) +#define ibq_vec_4_init SQISIGN_NAMESPACE_GENERIC(ibq_vec_4_init) +#define ibq_vec_4_print SQISIGN_NAMESPACE_GENERIC(ibq_vec_4_print) + +// Namespacing symbols exported from sign.c: +#undef protocols_sign + +#define protocols_sign SQISIGN_NAMESPACE(protocols_sign) + +// Namespacing symbols exported from sqisign.c: +#undef sqisign_keypair +#undef sqisign_open +#undef sqisign_sign +#undef sqisign_verify + +#define sqisign_keypair SQISIGN_NAMESPACE(sqisign_keypair) +#define sqisign_open SQISIGN_NAMESPACE(sqisign_open) +#define sqisign_sign SQISIGN_NAMESPACE(sqisign_sign) +#define sqisign_verify SQISIGN_NAMESPACE(sqisign_verify) + +// Namespacing symbols exported from theta_isogenies.c: +#undef theta_chain_compute_and_eval +#undef theta_chain_compute_and_eval_randomized +#undef theta_chain_compute_and_eval_verify + +#define theta_chain_compute_and_eval SQISIGN_NAMESPACE(theta_chain_compute_and_eval) +#define theta_chain_compute_and_eval_randomized SQISIGN_NAMESPACE(theta_chain_compute_and_eval_randomized) +#define theta_chain_compute_and_eval_verify SQISIGN_NAMESPACE(theta_chain_compute_and_eval_verify) + +// Namespacing symbols exported from theta_structure.c: +#undef double_iter +#undef double_point +#undef is_product_theta_point +#undef theta_precomputation + +#define double_iter SQISIGN_NAMESPACE(double_iter) +#define double_point SQISIGN_NAMESPACE(double_point) +#define is_product_theta_point SQISIGN_NAMESPACE(is_product_theta_point) +#define theta_precomputation SQISIGN_NAMESPACE(theta_precomputation) + +// Namespacing symbols exported from verify.c: +#undef protocols_verify + +#define protocols_verify SQISIGN_NAMESPACE(protocols_verify) + +// Namespacing symbols exported from xeval.c: +#undef xeval_2 +#undef xeval_2_singular +#undef xeval_4 + +#define xeval_2 SQISIGN_NAMESPACE(xeval_2) +#define xeval_2_singular SQISIGN_NAMESPACE(xeval_2_singular) +#define xeval_4 SQISIGN_NAMESPACE(xeval_4) + +// Namespacing symbols exported from xisog.c: +#undef xisog_2 +#undef xisog_2_singular +#undef xisog_4 + +#define xisog_2 SQISIGN_NAMESPACE(xisog_2) +#define xisog_2_singular SQISIGN_NAMESPACE(xisog_2_singular) +#define xisog_4 SQISIGN_NAMESPACE(xisog_4) + + +#endif + diff --git a/scripts/Namespace.scala b/scripts/Namespace.scala new file mode 100644 index 0000000..129b1cc --- /dev/null +++ b/scripts/Namespace.scala @@ -0,0 +1,148 @@ +import io.StdIn.readLine + +// 1. #define DISABLE_NAMESPACING in sqisign_namespace.h +// 2. build (cmake and make) +// 3. find . -name '*.a' -exec nm {} \; | grep '.c.o:\|T ' | scala ../scripts/Namespace.scala > sqisign_namespace.h +// 4. cp sqisign_namespace.h $SQISIGN_DIR/include + +object Namespace extends App { + + val PREAMBLE = """ +#ifndef SQISIGN_NAMESPACE_H +#define SQISIGN_NAMESPACE_H + +//#define DISABLE_NAMESPACING + +#if defined(_WIN32) +#define SQISIGN_API __declspec(dllexport) +#else +#define SQISIGN_API __attribute__((visibility("default"))) +#endif + +#define PARAM_JOIN3_(a, b, c) sqisign_##a##_##b##_##c +#define PARAM_JOIN3(a, b, c) PARAM_JOIN3_(a, b, c) +#define PARAM_NAME3(end, s) PARAM_JOIN3(SQISIGN_VARIANT, end, s) + +#define PARAM_JOIN2_(a, b) sqisign_##a##_##b +#define PARAM_JOIN2(a, b) PARAM_JOIN2_(a, b) +#define PARAM_NAME2(end, s) PARAM_JOIN2(end, s) + +#ifndef DISABLE_NAMESPACING +#define SQISIGN_NAMESPACE_GENERIC(s) PARAM_NAME2(gen, s) +#else +#define SQISIGN_NAMESPACE_GENERIC(s) s +#endif + +#if defined(SQISIGN_VARIANT) && !defined(DISABLE_NAMESPACING) +#if defined(SQISIGN_BUILD_TYPE_REF) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(ref, s) +#elif defined(SQISIGN_BUILD_TYPE_OPT) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(opt, s) +#elif defined(SQISIGN_BUILD_TYPE_BROADWELL) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(broadwell, s) +#elif defined(SQISIGN_BUILD_TYPE_ARM64CRYPTO) +#define SQISIGN_NAMESPACE(s) PARAM_NAME3(arm64crypto, s) +#else +#error "Build type not known" +#endif + +#else +#define SQISIGN_NAMESPACE(s) s +#endif +""" + + val EPILOGUE = """ +#endif +""" + + val x = Iterator + .continually(readLine) + .takeWhile(_ != null).toList + + var scfile = "" + val allFuns: List[(String, String)] = x.flatMap { + case i if i.contains(".c.o:") => + scfile = i + None + case i => + i.split(" ").last match { + case j if j.startsWith("_") => + Some((j.substring(1), scfile)) + case j => + Some((j, scfile)) + } + + }. // removing duplicates.. + groupBy(_._1).mapValues(k => k.distinct.toList.sortBy(_._2).reduceLeft((i,j) => ((i._1, s"${i._2}, ${j._2}")))).values.toList + + val maxFunLen = allFuns.map(i => i._1.length).max + + val filterFiles = List( + "fips202.c", + "tools.c", + "randombytes_system.c", + "randombytes_ctrdrbg.c", + "randombytes_ctrdrbg_aesni.c", + "foo.c", + "aes_c.c", + "aes_ni.c", + "ctr_drbg.c" + ) + + val genericFiles = List( + // quaternion module + "intbig.c", + "algebra.c", + "ideal.c", + "dim4.c", + "dim2.c", + "integers.c", + "lattice.c", + "lat_ball.c", + "finit.c", + "printer.c", + "rationals.c", + "l2.c", + "lll_verification.c", + "lll_applications.c", + "rationals.c", + "normeq.c", + "ibz_division.c", + "hnf_internal.c", + "hnf.c", + "random_input_generation.c", + "mem.c", + // mp module + "mp.c" + ).map(i => s"$i.o:") + + val groupedByFile = + allFuns. + groupBy(_._2). + map(i => (i._1, i._2.distinct.sorted)). + filter(i => filterFiles.forall(j => !i._1.contains(j))).toList.sortBy(_._1) + + println(PREAMBLE) + + + + groupedByFile.foreach(i => { + println(s"// Namespacing symbols exported from ${i._1.replaceAll("\\.o:", "")}:") + i._2.foreach(j => + println(s"#undef ${j._1}") + ) + println + i._2.foreach(j => { + val padded = j._1.padTo(maxFunLen, " ").mkString + if (genericFiles.contains(j._2)) { + println(s"#define $padded SQISIGN_NAMESPACE_GENERIC(${j._1})") + } else { + println(s"#define $padded SQISIGN_NAMESPACE(${j._1})") + } + } + ) + println + }) + + println(EPILOGUE) +} \ No newline at end of file diff --git a/scripts/cformat.py b/scripts/cformat.py deleted file mode 100644 index 21e8dfd..0000000 --- a/scripts/cformat.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 -import sys, itertools -from math import floor, log -import sage.all - -class Ibz: - def __init__(self, v): - self.v = int(v) - def _literal(self, sz): - val = int(self.v) - sgn = val < 0 - num_limbs = (abs(val).bit_length() + sz-1) // sz if val else 0 - limbs = [(abs(val) >> sz*i) & (2**sz-1) for i in range(num_limbs or 1)] - data = { - '._mp_alloc': 0, - '._mp_size': (-1)**sgn * num_limbs, - '._mp_d': '(mp_limb_t[]) {' + ','.join(map(hex,limbs)) + '}', - } - return '{{' + ', '.join(f'{k} = {v}' for k,v in data.items()) + '}}' - -class Object: - def __init__(self, ty, name, obj): - if '[' in ty: - idx = ty.index('[') - depth = ty.count('[]') - def rec(os, d): - assert d >= 0 - if not d: - return () - assert isinstance(os,list) or isinstance(os,tuple) - r, = {rec(o, d-1) for o in os} - return (len(os),) + r - dims = rec(obj, depth) - self.ty = ty[:idx], ''.join(f'[{d}]' for d in dims) - else: - self.ty = ty, '' - self.name = name - self.obj = obj - - def _declaration(self): - return f'extern const {self.ty[0]} {self.name}{self.ty[1]};' - - def _literal(self, mp_limb_t_bits): - def rec(obj): - if isinstance(obj, int): - return hex(obj) - if isinstance(obj, sage.all.Integer): - return hex(obj) - if isinstance(obj, Ibz): - return obj._literal(mp_limb_t_bits) - if isinstance(obj, list) or isinstance(obj, tuple): - return '{' + ', '.join(map(rec, obj)) + '}' - raise NotImplementedError(f'unknown type {type(obj)} in Formatter') - return rec(self.obj) - - def _definition(self, mp_limb_t_bits): - return f'const {self.ty[0]} {self.name}{self.ty[1]} = ' + self._literal(mp_limb_t_bits) + ';' - - -class ObjectFormatter: - def __init__(self, objs): - self.objs = objs - - def header(self, file=None): - for obj in self.objs: - assert isinstance(obj, Object) - print(obj._declaration(), file=file) - - def implementation(self, file=None): - print('#if 0', file=file) - for sz in (16, 32, 64): - print(f'#elif 8*DIGIT_LEN == {sz}', file=file) - for obj in self.objs: - assert isinstance(obj, Object) - print(obj._definition(sz), file=file) - print('#endif', file=file) - - - -def field(v, F=None): - if F: - v = F(v) - p = F.characteristic() - l = 1 + floor(log(p,2**64)) - vs = [[(c >> 64*i) & (2**64-1) for i in range(l)] for c in v] - return vs - -def xonly(T, *args): - if not T: raise NotImplementedError('is point at infinity') - x, _ = T.xy() - return field(x, *args) - diff --git a/scripts/check_namespace.sh b/scripts/check_namespace.sh new file mode 100755 index 0000000..cbae335 --- /dev/null +++ b/scripts/check_namespace.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -e + +if [ ! -f "include/sqisign_namespace.h" ]; then + echo "Please run script from the sqisign root directory" + exit 1 +fi + +if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' 's|//#define DISABLE_NAMESPACING|#define DISABLE_NAMESPACING|' ./include/sqisign_namespace.h +else + sed -i 's|//#define DISABLE_NAMESPACING|#define DISABLE_NAMESPACING|' ./include/sqisign_namespace.h +fi + +mkdir -p build_broadwell && cd build_broadwell && cmake -DSQISIGN_BUILD_TYPE=broadwell .. && make -j8 && cd .. +mkdir -p build && cd build && cmake .. && make -j8 +find . ../build_broadwell -name '*.a' -exec nm {} \; | grep '.c.o:\|T ' | scala -nc ../scripts/Namespace.scala > sqisign_namespace.h + +if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' 's|#define DISABLE_NAMESPACING|//#define DISABLE_NAMESPACING|' ../include/sqisign_namespace.h +else + sed -i 's|#define DISABLE_NAMESPACING|//#define DISABLE_NAMESPACING|' ../include/sqisign_namespace.h +fi + +diff sqisign_namespace.h ../include/sqisign_namespace.h + + +# Check the exit code of diff +if [ $? -eq 0 ]; then + echo "No change in namespace." + exit 0 +else + echo "Namespace changed, please update." + exit 1 +fi diff --git a/scripts/gen_kat_files.sh b/scripts/gen_kat_files.sh new file mode 100755 index 0000000..9ee5a5a --- /dev/null +++ b/scripts/gen_kat_files.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +echo 'Running Script for Level 1...' +./build/apps/PQCgenKAT_sign_lvl1 +mv PQCsignKAT_353_SQIsign_lvl1.req ./KAT/PQCsignKAT_353_SQIsign_lvl1.req +mv PQCsignKAT_353_SQIsign_lvl1.rsp ./KAT/PQCsignKAT_353_SQIsign_lvl1.rsp + +echo 'Running Script for Level 3...' +./build/apps/PQCgenKAT_sign_lvl3 +mv PQCsignKAT_529_SQIsign_lvl3.req ./KAT/PQCsignKAT_529_SQIsign_lvl3.req +mv PQCsignKAT_529_SQIsign_lvl3.rsp ./KAT/PQCsignKAT_529_SQIsign_lvl3.rsp + +echo 'Running Script for Level 5...' +./build/apps/PQCgenKAT_sign_lvl5 +mv PQCsignKAT_701_SQIsign_lvl5.req ./KAT/PQCsignKAT_701_SQIsign_lvl5.req +mv PQCsignKAT_701_SQIsign_lvl5.rsp ./KAT/PQCsignKAT_701_SQIsign_lvl5.rsp diff --git a/scripts/gen_pqm4_sources.sh b/scripts/gen_pqm4_sources.sh new file mode 100755 index 0000000..0a95409 --- /dev/null +++ b/scripts/gen_pqm4_sources.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +# This script should be run in the root folder of the repository, and creates pqm4 files in "src/pqm4/sqisign{1,3,5}" + +if [ -d "src/pqm4" ]; then + echo Destination folder src/pqm4 already exists. Delete it before running this script. Aborting. + exit 1 +fi + +for LEVEL in 1 3 5 +do + LVL=lvl${LEVEL} + DST_PATH=src/pqm4/sqisign_${LVL}/ref + + PQCGENKAT_SIGN_PQM4_BINARY=build/apps/PQCgenKAT_sign_pqm4_${LVL} + + if [ ! -f ${PQCGENKAT_SIGN_PQM4_BINARY} ]; then + echo ${PQCGENKAT_SIGN_PQM4_BINARY} not found. Build it before running this script, or change the build folder in the script. Aborting. + exit 1 + fi + + mkdir -p ${DST_PATH} + + # Run API generation script + ${PQCGENKAT_SIGN_PQM4_BINARY} + + CPPFLAGS="-DRADIX_32 -DSQISIGN_BUILD_TYPE_REF -DSQISIGN_GF_IMPL_REF -DSQISIGN_VARIANT=${LVL} -DTARGET_ARM -DTARGET_OS_OTHER -DNDEBUG -DDISABLE_NAMESPACING -DBIG_PUBLIC_KEY_TESTS" + PQM4_NAME="crypto_sign_sqisign_${LVL}_ref" + + echo "elf/${PQM4_NAME}_%.elf: CPPFLAGS+=${CPPFLAGS}" > ${DST_PATH}/config.mk + echo "obj/lib${PQM4_NAME}.a: CPPFLAGS+=${CPPFLAGS}" >> ${DST_PATH}/config.mk + + cp include/{sig,sqisign_namespace}.h ${DST_PATH}/ + + cp src/sqisign.c ${DST_PATH}/ + + cp src/common/generic/include/{tools,tutil}.h ${DST_PATH}/ + + cp src/ec/ref/lvlx/{basis,ec_jac,ec,isog_chains,xeval,xisog}.c ${DST_PATH}/ + cp src/ec/ref/include/{ec,isog}.h ${DST_PATH}/ + + cp src/gf/ref/lvlx/{fp,fp2}.c ${DST_PATH}/ + cp src/gf/ref/include/{fp,fp2}.h ${DST_PATH}/ + + cp src/hd/ref/lvlx/{hd.c,theta_isogenies.c,theta_isogenies.h,theta_structure.c,theta_structure.h} ${DST_PATH}/ + cp src/hd/ref/include/hd.h ${DST_PATH}/ + + cp src/mp/ref/generic/mp.c ${DST_PATH}/ + cp src/mp/ref/generic/include/mp.h ${DST_PATH}/ + + cp src/precomp/ref/${LVL}/include/{e0_basis,ec_params,encoded_sizes,fp_constants,hd_splitting_transforms}.h ${DST_PATH}/ + cp src/precomp/ref/${LVL}/{e0_basis,ec_params,hd_splitting_transforms}.c ${DST_PATH}/ + + cp src/verification/ref/lvlx/{common,encode_verification,verify}.c ${DST_PATH}/ + cp src/verification/ref/include/verification.h ${DST_PATH}/ +done + +cp src/gf/ref/lvl1/fp_p5248_32.c src/pqm4/sqisign_lvl1/ref/ +cp src/gf/ref/lvl3/fp_p65376_32.c src/pqm4/sqisign_lvl3/ref/ +cp src/gf/ref/lvl5/fp_p27500_32.c src/pqm4/sqisign_lvl5/ref/ diff --git a/scripts/parameters.py b/scripts/parameters.py deleted file mode 100644 index 8b7641e..0000000 --- a/scripts/parameters.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python3 -from sage.all import * -proof.all(False) # faster - -import re -for l in open('sqisign_parameters.txt'): - for k in ('lvl', 'p', 'B'): - m = re.search(rf'^\s*{k}\s*=\s*([x0-9a-f]+)', l) - if m: - v = ZZ(m.groups()[0], 0) - globals()[k] = v - -L = {l for l,_ in (p**2 - 1).factor(limit=B+5) if l <= B} -assert 2 in L -L.remove(2) -f = (p+1).valuation(2) -if (p-1).valuation(2) > f: - raise NotImplementedError('2-power torsion is on twist') -Lpls = {l for l in L if (p+1).valuation(l) >= (p-1).valuation(l)} -Lmin = L - Lpls -Lpls, Lmin = map(sorted, (Lpls, Lmin)) -Epls = [(p+1).valuation(l) for l in Lpls] -Emin = [(p-1).valuation(l) for l in Lmin] -Tpls = prod(l**e for l,e in zip(Lpls,Epls)) -Tmin = prod(l**e for l,e in zip(Lmin,Emin)) - -Dcom = (Tpls*Tmin).prime_to_m_part(2*3) -Dchall = prod(l**(p+1).valuation(l) for l in (2,3)) - -__all__ = ['lvl', 'p', 'B', 'f', 'Tpls', 'Tmin', 'Dcom', 'Dchall'] - diff --git a/scripts/precomp/cformat.py b/scripts/precomp/cformat.py new file mode 100644 index 0000000..36378dc --- /dev/null +++ b/scripts/precomp/cformat.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +import sys, itertools +from math import ceil, floor, log +import sage.all + +class Ibz: + def __init__(self, v): + self.v = int(v) + def _literal(self, sz): + val = int(self.v) + sgn = val < 0 + num_limbs = (abs(val).bit_length() + sz-1) // sz if val else 0 + limbs = [(abs(val) >> sz*i) & (2**sz-1) for i in range(num_limbs or 1)] + data = { + '._mp_alloc': 0, + '._mp_size': (-1)**sgn * num_limbs, + '._mp_d': '(mp_limb_t[]) {' + ','.join(map(hex,limbs)) + '}', + } + return '{{' + ', '.join(f'{k} = {v}' for k,v in data.items()) + '}}' + +class FpEl: + ref_p5248_radix_map = { 16: 13, 32: 29, 64: 51 } + ref_p65376_radix_map = { 16: 13, 32: 28, 64: 55 } + ref_p27500_radix_map = { 16: 13, 32: 29, 64: 57 } + def __init__(self, n, p, montgomery=True): + self.n = n + self.p = p + self.montgomery = montgomery + def __get_radix(self, word_size, arith=None): + if arith == "ref" or arith is None: + # lvl1 + if self.p == 0x4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff: + return self.ref_p5248_radix_map[word_size] + # lvl3 + elif self.p == 0x40ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff: + return self.ref_p65376_radix_map[word_size] + # lvl5 + elif self.p == 0x1afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff: + return self.ref_p27500_radix_map[word_size] + raise ValueError(f'Invalid prime \"{self.p}\"') + elif arith == "broadwell": + return word_size + raise ValueError(f'Invalid arithmetic implementation type \"{arith}\"') + def _literal(self, sz, arith=None): + radix = self.__get_radix(sz, arith=arith) + l = 1 + floor(log(self.p, 2**radix)) + # If we're using Montgomery representation, we need to multiply + # by the Montgomery factor R = 2^nw (n = limb number, w = radix) + if self.montgomery: + R = 2**(radix * ceil(log(self.p, 2**radix))) + else: + R = 1 + el = (self.n * R) % self.p + vs = [(int(el) >> radix*i) % 2**radix for i in range(l)] + return '{' + ', '.join(map(hex, vs)) + '}' + +class Object: + def __init__(self, ty, name, obj): + if '[' in ty: + idx = ty.index('[') + depth = ty.count('[]') + def rec(os, d): + assert d >= 0 + if not d: + return () + assert isinstance(os,list) or isinstance(os,tuple) + r, = {rec(o, d-1) for o in os} + return (len(os),) + r + dims = rec(obj, depth) + self.ty = ty[:idx], ''.join(f'[{d}]' for d in dims) + else: + self.ty = ty, '' + self.name = name + self.obj = obj + + def _declaration(self): + return f'extern const {self.ty[0]} {self.name}{self.ty[1]};' + + def _literal(self): + def rec(obj): + if isinstance(obj, int): + if obj < 256: return str(obj) + else: return hex(obj) + if isinstance(obj, sage.all.Integer): + if obj < 256: return str(obj) + else: return hex(obj) + if isinstance(obj, Ibz): + literal = "\n#if 0" + for sz in (16, 32, 64): + literal += f"\n#elif GMP_LIMB_BITS == {sz}" + literal += f"\n{obj._literal(sz)}" + return literal + "\n#endif\n" + if isinstance(obj, FpEl): + literal = "\n#if 0" + for sz in (16, 32, 64): + literal += f"\n#elif RADIX == {sz}" + if sz == 64: + literal += "\n#if defined(SQISIGN_GF_IMPL_BROADWELL)" + literal += f"\n{obj._literal(sz, 'broadwell')}" + literal += "\n#else" + literal += f"\n{obj._literal(sz, 'ref')}" + literal += "\n#endif" + else: + literal += f"\n{obj._literal(sz, 'ref')}" + return literal + "\n#endif\n" + if isinstance(obj, list) or isinstance(obj, tuple): + return '{' + ', '.join(map(rec, obj)) + '}' + if isinstance(obj, str): + return obj + raise NotImplementedError(f'unknown type {type(obj)} in Formatter') + return rec(self.obj) + + def _definition(self): + return f'const {self.ty[0]} {self.name}{self.ty[1]} = ' + self._literal() + ';' + +class ObjectFormatter: + def __init__(self, objs): + self.objs = objs + + def header(self, file=None): + for obj in self.objs: + assert isinstance(obj, Object) + print(obj._declaration(), file=file) + + def implementation(self, file=None): + for obj in self.objs: + assert isinstance(obj, Object) + print(obj._definition(), file=file) \ No newline at end of file diff --git a/scripts/precomp/ec_params.sage b/scripts/precomp/ec_params.sage new file mode 100755 index 0000000..01e3c95 --- /dev/null +++ b/scripts/precomp/ec_params.sage @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 + +from sage.all import * +from parameters import p, f + +if __name__ == '__main__': + + cof = (p+1)//(2**f) + + from cformat import Object, ObjectFormatter + + obj_cof = ObjectFormatter( + [ + Object('digit_t[]', 'p_cofactor_for_2f', [cof]), + ] + ) + + with open("include/ec_params.h", "w") as hfile: + with open("ec_params.c", "w") as cfile: + + hfile.write('#ifndef EC_PARAMS_H\n') + hfile.write('#define EC_PARAMS_H\n') + hfile.write('\n') + + hfile.write('#include \n') + cfile.write('#include \n') + hfile.write('\n') + + hfile.write(f'#define TORSION_EVEN_POWER {f}\n') + hfile.write('\n') + + hfile.write('// p+1 divided by the power of 2\n') + cfile.write('// p+1 divided by the power of 2\n') + obj_cof.header(file=hfile) + obj_cof.implementation(file=cfile) + hfile.write(f'#define P_COFACTOR_FOR_2F_BITLENGTH {((p+1)//(2**f)).bit_length()}\n') + hfile.write('\n') + cfile.write('\n') + + + hfile.write('#endif\n') diff --git a/scripts/precomp/maxorders.py b/scripts/precomp/maxorders.py new file mode 100644 index 0000000..51211e7 --- /dev/null +++ b/scripts/precomp/maxorders.py @@ -0,0 +1,88 @@ +from sage.all import * + +from sage.misc.banner import require_version +if not require_version(10, 5, print_message=True): + exit('') + +from parameters import p, num_orders as num + +################################################################ + +# Underlying theory: +# - Ibukiyama, On maximal orders of division quaternion algebras with certain optimal embeddings +# - https://ia.cr/2023/106 Lemma 10 + +from sage.algebras.quatalg.quaternion_algebra import basis_for_quaternion_lattice +bfql = lambda els: basis_for_quaternion_lattice(els, reverse=True) + +Quat1, (i,j,k) = QuaternionAlgebra(-1, -p).objgens() +assert Quat1.discriminant() == p # ramifies correctly + +O0mat = matrix([list(g) for g in [Quat1(1), i, (i+j)/2, (1+k)/2]]) +O0 = Quat1.quaternion_order(list(O0mat)) + +orders = [ (1, identity_matrix(QQ,4), O0mat, i, O0mat, vector((1,0,0,0))) ] + +q = ZZ(1) +while len(orders) < num: + q = next_prime(q) + if q % 4 != 1: # restricting to q ≡ 1 (mod 4) + continue + + Quatq, (ii,jj,kk) = QuaternionAlgebra(-q, -p).objgens() + if Quatq.discriminant() != p: # ramifies incorrectly + continue + + x, y = QuadraticForm(QQ, 2, [1,0,p]).solve(q) + gamma = x + j*y + assert gamma.reduced_norm() == q + ims1 = [Quat1(1), i*gamma, j, k*gamma] + assert ims1[1]**2 == -q + assert ims1[2]**2 == -p + assert ims1[1]*ims1[2] == ims1[3] + assert ims1[2]*ims1[1] == -ims1[3] + # (1,ii,jj,kk)->ims1 is an isomorphism Quatq->Quat1 + iso1q = ~matrix(map(list, ims1)) + + r = min(map(ZZ, Mod(-p, 4*q).sqrt(all=True))) + + basq = [ + Quatq(1), + ii, + (1 + jj) / 2, + (r + jj) * ii / 2 / q, + ] + + Oq = Quatq.quaternion_order(basq) + assert Oq.discriminant() == p # is maximal + + mat1 = matrix(map(list, basq)) * ~iso1q + O1 = Quat1.quaternion_order(list(mat1)) + assert O1.discriminant() == p # is maximal + assert j in O1 # p-extremal + + # look for an odd connecting ideal + I = O0 * O1 + I *= I.norm().denominator() + assert I.is_integral() + for v in IntegralLattice(I.gram_matrix()).enumerate_short_vectors(): + elt = sum(c*g for c,g in zip(v,I.basis())) + if ZZ(elt.reduced_norm() / I.norm()) % 2: + break + I = I * (elt.conjugate() / I.norm()) + assert I.is_integral() + assert I.norm() % 2 + assert I.left_order() == O0 + + O1_ = I.right_order() + assert O1_.unit_ideal() == elt * O1 * ~elt + idl1 = matrix(map(list, I.basis())) + + # q + # isomorphism from (-1,-p) algebra to (-q,-p) algebra + # basis of maximal order O₁ in (-1,-p) algebra + # element sqrt(-q) in O₁ in (-1,-p) algebra + # basis of connecting ideal I from O₀ in (-1,-p) algebra + # element γ such that I has right order γ O₁ γ^-1 + orders.append((q, iso1q, mat1, ims1[1], idl1, vector(elt))) + diff --git a/scripts/precomp/parameters.py b/scripts/precomp/parameters.py new file mode 100644 index 0000000..c4bb8b2 --- /dev/null +++ b/scripts/precomp/parameters.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +from sage.all import * +proof.all(False) # faster + +import re +for l in open('sqisign_parameters.txt'): + for k in ('lvl', 'p', 'num_orders'): + m = re.search(rf'^\s*{k}\s*=\s*([x0-9a-f]+)', l) + if m: + v = ZZ(m.groups()[0], 0) + globals()[k] = v + +f = (p+1).valuation(2) + +__all__ = ['lvl', 'p', 'f', 'num_orders'] + diff --git a/scripts/precomp/precompute_E0_basis.sage b/scripts/precomp/precompute_E0_basis.sage new file mode 100755 index 0000000..d403afc --- /dev/null +++ b/scripts/precomp/precompute_E0_basis.sage @@ -0,0 +1,38 @@ +#!/usr/bin/env sage +proof.all(False) # faster + +################################################################ + +from parameters import p, f + +if p % 4 != 3: + raise NotImplementedError('requires p ≡ 3 (mod 4)') + +assert (1 << f).divides(p + 1) +Fp2. = GF((p,2), modulus=[1,0,1]) +E0 = EllipticCurve(Fp2, [1, 0]) + +from torsion_basis import even_torsion_basis_E0 +P, Q = even_torsion_basis_E0(E0, f) + +################################################################ + +from cformat import FpEl, Object, ObjectFormatter + +def Fp2_to_list(el): + return [FpEl(int(c), p, True) for c in Fp2(el)] + +objs = ObjectFormatter([ + Object('fp2_t', 'BASIS_E0_PX', Fp2_to_list(P.x())), + Object('fp2_t', 'BASIS_E0_QX', Fp2_to_list(Q.x())), + ]) + +################################################################ + +with open('include/e0_basis.h','w') as hfile: + with open('e0_basis.c','w') as cfile: + print(f'#include ', file=hfile) + print(f'#include ', file=cfile) + + objs.header(file=hfile) + objs.implementation(file=cfile) diff --git a/scripts/precomp/precompute_endomorphism_action.sage b/scripts/precomp/precompute_endomorphism_action.sage new file mode 100755 index 0000000..5c42a7c --- /dev/null +++ b/scripts/precomp/precompute_endomorphism_action.sage @@ -0,0 +1,303 @@ +#!/usr/bin/env sage +proof.all(False) # faster + +from sage.misc.banner import require_version +if not require_version(10, 0, print_message=True): + exit('') + +################################################################ + +from parameters import p, f +from torsion_basis import even_torsion_basis_E0 + +################################################################ + +from sage.groups.generic import order_from_multiple +pari.allocatemem(1 << 34) # 16G + +if p % 4 != 3: + raise NotImplementedError('requires p ≡ 3 (mod 4)') + +assert (1 << f).divides(p + 1) +Fp2. = GF((p,2), modulus=[1,0,1]) + +sqrtm1 = min(Fp2(-1).sqrt(all=True)) + +def compute(q, mat, idl, iso1q): + print(f'\x1b[33m{q = }\x1b[0m') + E0 = EllipticCurve(Fp2, [1,0]) + E0.set_order((p+1)^2) + + if q == 1: + E1 = E0 + P1, Q1 = even_torsion_basis_E0(E1, f) + print(f'E0 = {E1}') + print(f'P0 = {P1}') + print(f'Q0 = {Q1}') + + else: + Quat. = QuaternionAlgebra(-1, -p) + I = Quat.ideal(map(Quat, idl)) +# print(f'{I = }') + O0 = Quat.quaternion_order(list(map(Quat, orders[0][2]))) +# print(f'{O0 = }') + O1 = I.right_order() +# print(f'{O1 = }') + assert I.left_order() == O0 + assert O0.is_maximal() and O1.is_maximal() + assert I.norm() % 2 + + from deuring2d import Deuring2D + ctx = Deuring2D(p) + assert ctx.O0.order == O0 + assert ctx.E0 == E0 + ctx.sqrtm1 = sqrtm1 + + P0, Q0 = data[0][1] + + for deg in range(1,10): + + print(f'trying {deg = }...') + ctx.e = E0.cardinality(extension_degree=2^deg).sqrt().valuation(2) - 1 + + first = True + for suitable in ctx.SuitableIdeals(I, attempts=10**6, bound=10**3): + + if first: + Fbig. = Fp2.extension(2^deg) + ctx.E0 = E0.change_ring(Fbig) + ctx.P = P0.change_ring(Fbig) + ctx.Q = Q0.change_ring(Fbig) + assert ctx.e == ctx.E0.order().sqrt().valuation(2) - 1 + for _ in range(ctx.e - f): + ctx.P = ctx.P.division_points(2)[0] + ctx.Q = ctx.Q.division_points(2)[0] + ctx.P.set_order(multiple=2^ctx.e) + ctx.Q.set_order(multiple=2^ctx.e) + first = False + + try: + E1, P1, Q1 = ctx.IdealToIsogeny(I, suitable=suitable) + break + except Deuring2D.Failure: + continue + + else: + continue + break + + else: + raise NotImplementedError('Deuring2D failed') + + E1 = E1.change_ring(Fp2) + + j = GF(p)(E1.j_invariant()) + X = polygen(GF(p)) + for A,_ in sorted((256*(X^2-3)^3 - (X^2-4)*j).roots()): + E1_ = EllipticCurve(Fp2, [0,A,0,1,0]) + try: + iso = min(E1.isomorphisms(E1_)) + break + except ValueError: + pass + E1 = iso.codomain() + P1 = iso._eval(P1) + Q1 = iso._eval(Q1) + print(f'{E1 = }') + + P1 *= ctx.P.order() // P0.order() + Q1 *= ctx.Q.order() // Q0.order() + P1 = P1.change_ring(Fp2) + Q1 = Q1.change_ring(Fp2) + print(f'{P1 = }') + print(f'{Q1 = }') + P1.set_order(P0.order()) + Q1.set_order(Q0.order()) + assert P0.order() == Q0.order() == P1.order() == Q1.order() == 2^f + + assert P1.weil_pairing(Q1,2^f) == P0.weil_pairing(Q0,2^f)^I.norm() + + if q == 1: + endo_i, = (a for a in E1.automorphisms() if a.scaling_factor() == sqrtm1) + else: + iso = E1.isomorphism(min(Fp2(-q).sqrt(all=True)), is_codomain=True) + try: + endo_i = iso * E1.isogeny(None, codomain=iso.domain(), degree=q) + except ValueError: + assert False +# assert endo_i^2 == -q + + endo_1 = E1.scalar_multiplication(1) + endo_j = E1.frobenius_isogeny() + endo_k = endo_i * endo_j + + if __debug__: + R = E1.random_point() + assert (endo_i^2)(R) == -q*R + assert (endo_j^2)(R) == -p*R + assert (endo_j*endo_i)(R) == -(endo_i*endo_j)(R) + + denom = mat.denominator() + coprime = denom.prime_to_m_part(lcm(P1.order(), Q1.order())) + P1d, Q1d = (inverse_mod(coprime, T.order()) * T for T in (P1, Q1)) + + denom //= coprime + + extdeg = next(d for d in range(1,denom+1) if ((denom< = Fp2.extension(extdeg) + + P1d, Q1d = (T.change_ring(Fbig) for T in (P1d, Q1d)) + P1d.set_order(multiple=denom<', file=hfile) + print(f'#include ', file=hfile) + print(f'#include ', file=hfile) + print(f'#include ', file=cfile) + print(f'#include ', file=cfile) + print(f'#include ', file=cfile) + + print(''' +/** Type for precomputed endomorphism rings applied to precomputed torsion bases. + * + * Precomputed by the precompute scripts. + * + * @typedef curve_with_endomorphism_ring_t + * + * @struct curve_with_endomorphism_ring + **/ +typedef struct curve_with_endomorphism_ring { + ec_curve_t curve; + ec_basis_t basis_even; + ibz_mat_2x2_t action_i, action_j, action_k; + ibz_mat_2x2_t action_gen2, action_gen3, action_gen4; +} curve_with_endomorphism_ring_t; + '''.strip(), file=hfile) + + print(f'#define CURVE_E0 (CURVES_WITH_ENDOMORPHISMS->curve)', file=hfile) + print(f'#define BASIS_EVEN (CURVES_WITH_ENDOMORPHISMS->basis_even)', file=hfile) + print(f'#define ACTION_I (CURVES_WITH_ENDOMORPHISMS->action_i)', file=hfile) + print(f'#define ACTION_J (CURVES_WITH_ENDOMORPHISMS->action_j)', file=hfile) + print(f'#define ACTION_K (CURVES_WITH_ENDOMORPHISMS->action_k)', file=hfile) + print(f'#define ACTION_GEN2 (CURVES_WITH_ENDOMORPHISMS->action_gen2)', file=hfile) + print(f'#define ACTION_GEN3 (CURVES_WITH_ENDOMORPHISMS->action_gen3)', file=hfile) + print(f'#define ACTION_GEN4 (CURVES_WITH_ENDOMORPHISMS->action_gen4)', file=hfile) + print(f'#define NUM_ALTERNATE_STARTING_CURVES {len(data)-1}', file=hfile) + print(f'#define ALTERNATE_STARTING_CURVES (CURVES_WITH_ENDOMORPHISMS+1)', file=hfile) + + objs.header(file=hfile) + objs.implementation(file=cfile) + + print(f'#endif', file=hfile) diff --git a/scripts/precomp/precompute_hd_splitting.sage b/scripts/precomp/precompute_hd_splitting.sage new file mode 100755 index 0000000..1ecb6e8 --- /dev/null +++ b/scripts/precomp/precompute_hd_splitting.sage @@ -0,0 +1,158 @@ +#!/usr/bin/env sage +proof.all(False) # faster + +################################################################ + +from parameters import p + +# Field +Fp2. = GF((p,2), modulus=[1,0,1]) + +Fp2_constants = [ + [Fp2(0), Fp2(1), Fp2(i), Fp2(-1), Fp2(-i)], + ["FP2_ZERO", "FP2_ONE", "FP2_I", "FP2_MINUS_ONE", "FP2_MINUS_I"] +] + +################################################################ + +from cformat import FpEl + +def Fp2_to_list(el): + return [FpEl(int(c), p, True) for c in Fp2(el)] + +def Fp2_to_name(el): + return Fp2_constants[1][Fp2_constants[0].index(el)] + +################################################################ + +# Splitting Data + +chi_eval = [ + [1,1,1,1], + [1,-1,1,-1], + [1,1,-1,-1], + [1,-1,-1,1] +] + +even_indices = [ + [0, 0], + [0, 1], + [0, 2], + [0, 3], + [1, 0], + [1, 2], + [2, 0], + [2, 1], + [3, 0], + [3, 3], +] + +splitting_map = { + (0, 2): [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, -1, 0]], + (3, 3): [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], + (0, 3): [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, -1]], + (2, 1): [[1, 1, 1, 1], [1, -1, 1, -1], [1, -1, -1, 1], [1, 1, -1, -1]], + (0, 1): [[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, -1, 0, 0]], + (1, 2): [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]], + (2, 0): [[1, 1, 1, 1], [1, -1, 1, -1], [1, -1, -1, 1], [-1, -1, 1, 1]], + (3, 0): [[1, 1, 1, 1], [1, -1, 1, -1], [1, 1, -1, -1], [-1, 1, 1, -1]], + (1, 0): [[1, 1, 1, 1], [1, -1, -1, 1], [1, 1, -1, -1], [-1, 1, -1, 1]], + (0, 0): [[1, i, 1, i], [1, -i, -1, i], [1, i, -1, -i], [-1, i, -1, i]], +} + +# 24 2x2 maps used for normalization. Applying a uniform matrix to a level 2 +# theta null point ensure that we get a random theta null point in the +# equivalence class of Γ/Γ(2,4) +full_normalization_maps_2d = [ + matrix(2, 2, [1, 0, 0, 1]), + matrix(2, 2, [0, 1, 1, 0]), + matrix(2, 2, [1, 0, 0, -1]), + matrix(2, 2, [0, 1, -1, 0]), + + matrix(2, 2, [1, 1, 1, -1]), + matrix(2, 2, [1, -1, 1, 1]), + matrix(2, 2, [1, 1, -1, 1]), + matrix(2, 2, [-1, 1, 1, 1]), + + matrix(2, 2, [1, 0, 0, i]), + matrix(2, 2, [0, i, 1, 0]), + matrix(2, 2, [1, 0, 0, -i]), + matrix(2, 2, [0, i, -1, 0]), + + matrix(2, 2, [i, 1, 1, i]), + matrix(2, 2, [1, i, i, 1]), + matrix(2, 2, [i, 1, -1, -i]), + matrix(2, 2, [1, i, -i, -1]), + + matrix(2, 2, [1, i, 1, -i]), + matrix(2, 2, [1, -i, 1, i]), + matrix(2, 2, [1, i, -1, i]), + matrix(2, 2, [1, -i, -1, -i]), + + matrix(2, 2, [1, 1, i, -i]), + matrix(2, 2, [i, -i, 1, 1]), + matrix(2, 2, [1, 1, -i, i]), + matrix(2, 2, [i, -i, -1, -1]), +] + +# 6 2x2 maps used for normalisation. A subset of the preceding 24 matrices, +# that are sufficient to ensure uniform normalisation (under Γ/Γ^0(4)) +# when using the Montgomery model +normalization_maps_2d = [ + matrix(2, 2, [1, 0, 0, 1]), + matrix(2, 2, [0, 1, 1, 0]), + matrix(2, 2, [1, 1, 1, -1]), + matrix(2, 2, [-1, 1, 1, 1]), + matrix(2, 2, [i, 1, 1, i]), + matrix(2, 2, [1, i, i, 1]), +] + + +# Format from dictionary to list of lists +splitting_matrices = [] +for ind in even_indices: + # Create a list of all ten matrices (represented as 4x4 matrices) + splitting_matrices.append([[Fp2_to_name(Fp2(x)) for x in row] for row in splitting_map[tuple(ind)]]) + +# 6 4x4 maps constructed from the above +normalization_maps_4d = [] +for m in normalization_maps_2d: + M = m.tensor_product(m, subdivide=False).list() + matrix_elements_list = list(map(Fp2, M)) + # Reshape into matrix + matrix_elements = [ matrix_elements_list[i:i+4] for i in range(0, len(matrix_elements_list), 4) ] + normalization_maps_4d.append([[Fp2_to_name(x) for x in row] for row in matrix_elements]) + +################################################################ + +from cformat import Object, ObjectFormatter + +objs = ObjectFormatter( + [ + Object('int[][]', 'EVEN_INDEX', even_indices), + Object('int[][]', 'CHI_EVAL', chi_eval), + Object('fp2_t[]', 'FP2_CONSTANTS', list(map(Fp2_to_list, Fp2_constants[0]))), + Object('precomp_basis_change_matrix_t[]', 'SPLITTING_TRANSFORMS', [[x] for x in splitting_matrices]), + Object('precomp_basis_change_matrix_t[]', 'NORMALIZATION_TRANSFORMS', [[x] for x in normalization_maps_4d]), + ] +) + +with open("include/hd_splitting_transforms.h", "w") as hfile: + with open("hd_splitting_transforms.c", "w") as cfile: + print("#ifndef HD_SPLITTING_H", file=hfile) + print("#define HD_SPLITTING_H", file=hfile) + print(f"\n#include ", file=hfile) + print(f"#include \n", file=hfile) + print("typedef struct precomp_basis_change_matrix {", file=hfile) + print(" uint8_t m[4][4];", file=hfile) + print("} precomp_basis_change_matrix_t;\n", file=hfile) + + print(f"#include \n", file=cfile) + for i in range(len(Fp2_constants[1])): + print(f"#define {Fp2_constants[1][i]} {i}", file=cfile) + print("", file=cfile) + + objs.header(file=hfile) + objs.implementation(file=cfile) + + print("\n#endif\n", file=hfile) diff --git a/scripts/precomp/precompute_quaternion_constants.sage b/scripts/precomp/precompute_quaternion_constants.sage new file mode 100755 index 0000000..eae696f --- /dev/null +++ b/scripts/precomp/precompute_quaternion_constants.sage @@ -0,0 +1,44 @@ +#!/usr/bin/env sage +proof.all(False) # faster + +################################################################ + +from parameters import p +negl = 2**-64 + +################################################################ + +logp = ceil(log(p, 2)) +loglogp = ceil(log(logp,2)) +tors2val = (p+1).valuation(2) + +defs = dict() + +# RepresentInteger data +small = ceil(log(negl, 2) / -1) +assert 2**-small <= negl + +add_shift = ceil(log(log(negl, 1-1/(64*logp)), 2)) +assert (1 - 1/(64*logp)) ** (2**(add_shift)) <= negl + +defs['QUAT_primality_num_iter'] = ceil(-log(negl, 4)) +defs['QUAT_repres_bound_input'] = add_shift + +# Equivalent ideal data +defs['QUAT_equiv_bound_coeff'] = 2**(1 + add_shift//4) + +# Find_uv constants +m = 2 + floor((logp - tors2val) / 4) +defs['FINDUV_box_size'] = m +defs['FINDUV_cube_size'] = (2 * m + 1)**4 - 1 + +################################################################ + +with open('include/quaternion_constants.h','w') as hfile: + print(f'#include ', file=hfile) + + for k,v in defs.items(): + v = ZZ(v) + print(f'#define {k} {v}', file=hfile) + + diff --git a/scripts/precomp/precompute_quaternion_data.sage b/scripts/precomp/precompute_quaternion_data.sage new file mode 100755 index 0000000..71f7de3 --- /dev/null +++ b/scripts/precomp/precompute_quaternion_data.sage @@ -0,0 +1,91 @@ +#!/usr/bin/env sage +proof.all(False) # faster + + + +from maxorders import p, orders + +from cformat import Ibz, Object, ObjectFormatter + +# Prime of same size than p for random ideal of fixed norm +bitlength_p = int(p).bit_length() +prime_cofactor = next_prime((2^(bitlength_p))) + +algobj = [Ibz(p)] + +objs = \ + [ + [ + # basis (columns) + [ + Ibz(mat.denominator()), + [[Ibz(v) for v in vs] + for vs in mat.transpose()*mat.denominator()], + ], + # sqrt(-q) + [ + Ibz(mat.denominator()), + [Ibz(c) for c in ii*mat.denominator()], + ], + # sqrt(-p) + [ + Ibz(1), + [Ibz(c) for c in (0,0,1,0)] + ], + q + ] + for q,_,mat,ii,_,_ in orders + ] + +idlobjs = \ + [ + [ + # basis (columns) + [ + Ibz(idl.denominator()), + [[Ibz(v) for v in vs] + for vs in idl.transpose()*idl.denominator()], + ], + # norm + Ibz(abs(idl.row_space(ZZ).intersection((ZZ^4).submodule([[1,0,0,0]])).basis()[0][0])), + # left order + '&MAXORD_O0', + ] + for _,_,mat,_,idl,_ in orders + ] + +gammaobjs = \ + [ + [ + Ibz(gamma.denominator()), + list(map(Ibz, gamma * gamma.denominator())), + ] + for _,_,_,_,_,gamma in orders + ] + +objs = ObjectFormatter([ + Object('ibz_t', 'QUAT_prime_cofactor', Ibz(prime_cofactor)), + Object('quat_alg_t', 'QUATALG_PINFTY', algobj), + Object('quat_p_extremal_maximal_order_t[]', 'EXTREMAL_ORDERS', objs), + Object('quat_left_ideal_t[]', 'CONNECTING_IDEALS', idlobjs), # ideal corresponding to an isogeny from E0 which acts as identity w.r.t. the basis_even + Object('quat_alg_elem_t[]', 'CONJUGATING_ELEMENTS', gammaobjs), # elements γ such that each I has right order γ O₁ γ^-1 + ]) + +with open('include/quaternion_data.h','w') as hfile: + with open('quaternion_data.c','w') as cfile: + print(f'#include ', file=hfile) + print(f'#include ', file=cfile) + print(f'#include ', file=cfile) + print(f'#include ', file=cfile) + + #FIXME this should eventually go away? + print(f'#define MAXORD_O0 (EXTREMAL_ORDERS->order)', file=hfile) + print(f'#define STANDARD_EXTREMAL_ORDER (EXTREMAL_ORDERS[0])', file=hfile) + print(f'#define NUM_ALTERNATE_EXTREMAL_ORDERS {len(orders)-1}', file=hfile) + print(f'#define ALTERNATE_EXTREMAL_ORDERS (EXTREMAL_ORDERS+1)', file=hfile) + print(f'#define ALTERNATE_CONNECTING_IDEALS (CONNECTING_IDEALS+1)', file=hfile) + print(f'#define ALTERNATE_CONJUGATING_ELEMENTS (CONJUGATING_ELEMENTS+1)', file=hfile) + + objs.header(file=hfile) + objs.implementation(file=cfile) + diff --git a/scripts/precomp/precompute_sizes.sage b/scripts/precomp/precompute_sizes.sage new file mode 100755 index 0000000..5cda565 --- /dev/null +++ b/scripts/precomp/precompute_sizes.sage @@ -0,0 +1,93 @@ +#!/usr/bin/env sage +proof.all(False) # faster + +from sage.misc.banner import require_version +if not require_version(9, 8, print_message=True): + exit('') + +################################################################ + +from parameters import lvl, f, p + +################################################################ + +logp = ceil(log(p, 2)) +tors2val = (p+1).valuation(2) +tors2part = (p+1).p_primary_part(2) +tors3part = (p+1).p_primary_part(3) + +defs = dict() + +TORSION_2POWER_BYTES = (tors2part.bit_length() + 7) // 8 +SECURITY_BITS = round(p.bit_length() / 128) * 64 +RESPONSE_LENGTH = ceil(p.bit_length()/2) +RESPONSE_BYTES = (RESPONSE_LENGTH + 9) // 8 + +fpsz = (logp + 63)//64*8 +fp2sz = 2 * fpsz +defs['SECURITY_BITS'] = SECURITY_BITS +defs['SQIsign_response_length'] = ceil(logp/2) +defs['HASH_ITERATIONS'] = 2**(32 * ceil( logp/64 ) - (tors2val - ceil(logp/2))) +defs['FP_ENCODED_BYTES'] = fpsz +defs['FP2_ENCODED_BYTES'] = fp2sz +defs['EC_CURVE_ENCODED_BYTES'] = fp2sz # just the A +defs['EC_POINT_ENCODED_BYTES'] = fp2sz # just the x +defs['EC_BASIS_ENCODED_BYTES'] = 3 * defs['EC_POINT_ENCODED_BYTES'] + +defs['PUBLICKEY_BYTES'] = defs['EC_CURVE_ENCODED_BYTES'] + 1 # extra byte for hint +defs['SECRETKEY_BYTES'] = defs['PUBLICKEY_BYTES'] + 5*defs['FP_ENCODED_BYTES'] + 4*TORSION_2POWER_BYTES +defs['SIGNATURE_BYTES'] = defs['EC_CURVE_ENCODED_BYTES'] + 2 + 4*RESPONSE_BYTES + (SECURITY_BITS//8) + 1 + 1 + +size_privkey = defs['SECRETKEY_BYTES'] +size_pubkey = defs['PUBLICKEY_BYTES'] +size_signature = defs['SIGNATURE_BYTES'] + +algname = f'SQIsign_lvl{lvl}' + +################################################################ + +with open('include/encoded_sizes.h','w') as hfile: + for k,v in defs.items(): + v = ZZ(v) + print(f'#define {k} {v}', file=hfile) + +################################################################ + +api = f''' +// SPDX-License-Identifier: Apache-2.0 + +#ifndef api_h +#define api_h + +#include + +#define CRYPTO_SECRETKEYBYTES {size_privkey} +#define CRYPTO_PUBLICKEYBYTES {size_pubkey} +#define CRYPTO_BYTES {size_signature} + +#define CRYPTO_ALGNAME "{algname}" + +#if defined(ENABLE_SIGN) +SQISIGN_API +int +crypto_sign_keypair(unsigned char *pk, unsigned char *sk); + +SQISIGN_API +int +crypto_sign(unsigned char *sm, unsigned long long *smlen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *sk); +#endif + +SQISIGN_API +int +crypto_sign_open(unsigned char *m, unsigned long long *mlen, + const unsigned char *sm, unsigned long long smlen, + const unsigned char *pk); + +#endif /* api_h */ +'''.strip() + +with open(f'../../../nistapi/lvl{lvl}/api.h', 'w') as f: + print(api, file=f) + diff --git a/scripts/precomp/precompute_torsion_constants.sage b/scripts/precomp/precompute_torsion_constants.sage new file mode 100755 index 0000000..92948dd --- /dev/null +++ b/scripts/precomp/precompute_torsion_constants.sage @@ -0,0 +1,40 @@ +#!/usr/bin/env sage +proof.all(False) # faster + +################################################################ + +from parameters import p + +################################################################ + +tors2part = (p+1).p_primary_part(2) +lambda_security = round(p.bit_length() / 128) * 64 +N_sec = next_prime(1 << 4*lambda_security) +N_com = N_sec + +defs = { + 'TORSION_2POWER_BYTES': (tors2part.bit_length() + 7) // 8, + } + +from cformat import Ibz, Object, ObjectFormatter + +objs = ObjectFormatter([ + Object('ibz_t', 'TWO_TO_SECURITY_BITS', Ibz(1 << lambda_security)), # lambda_security = SECURITY_BITS (128, 192, 256) + Object('ibz_t', 'TORSION_PLUS_2POWER', Ibz(tors2part)), + Object('ibz_t', 'SEC_DEGREE', Ibz(N_sec)), + Object('ibz_t', 'COM_DEGREE', Ibz(N_com)), + ]) + +with open('include/torsion_constants.h','w') as hfile: + with open('torsion_constants.c','w') as cfile: + print(f'#include ', file=hfile) + print(f'#include ', file=cfile) + print(f'#include ', file=cfile) + print(f'#include ', file=cfile) + + for k,v in defs.items(): + print(f'#define {k} {v}', file=hfile) + + objs.header(file=hfile) + objs.implementation(file=cfile) + diff --git a/scripts/precomp/torsion_basis.py b/scripts/precomp/torsion_basis.py new file mode 100644 index 0000000..bdbc40c --- /dev/null +++ b/scripts/precomp/torsion_basis.py @@ -0,0 +1,75 @@ +from sage.all import ZZ, GF, EllipticCurve, parallel + +def even_torsion_basis_E0(E0, f): + """ + For the case when A = 0 we can't use the entangled basis algorithm + so we do something "stupid" to simply get something canonical + """ + assert E0.a_invariants() == (0, 0, 0, 1, 0) + + Fp2 = E0.base_ring() + p = Fp2.characteristic() + + def points_order_two_f(): + """ + Compute a point P of order 2^f with x(P) = 1 + i*x_im + """ + x_im = 0 + while True: + x_im += 1 + x = Fp2([1, x_im]) + if not E0.is_x_coord(x): + continue + # compares a+bi <= c+di iff (a,b) <= (c,d) as tuples, where integers + # modulo p are compared via their minimal non-negative representatives + P = min(E0.lift_x(x, all=True), key = lambda pt: list(pt.y())) + P.set_order(multiple=p+1) + if P.order() % (1 << f) == 0: + P *= P.order() // (1 << f) + P.set_order(1 << f) + yield P + + pts = points_order_two_f() + P = next(pts) + for Q in pts: + # Q is picked to be in E[2^f] AND we must ensure that + # form a basis, which is the same as e(P, Q) having + # full order 1 << f. + e = P.weil_pairing(Q, 1 << f) + if e ** (1 << f - 1) == -1: + break + + # Finally we want to make sure Q is above (0, 0) + P2 = (1 << f - 1) * P + Q2 = (1 << f - 1) * Q + if Q2 == E0(0, 0): + pass + elif P2 == E0(0, 0): + P, Q = Q, P + else: + Q += P + + assert P.weil_pairing(Q, 1 << f) ** (1 << f - 1) == -1 + assert (1 << f - 1) * Q == E0(0, 0) + + return P, Q + + +if __name__ == "__main__": + # p, f = 5 * 2**248 - 1, 248 + # p, f = 65 * 2**376 - 1, 376 + p, f = 27 * 2**500 - 1, 500 + print(f"p = {ZZ(p+1).factor()} - 1") + Fp2 = GF(p**2, modulus=[1, 0, 1], names="i") + E = EllipticCurve(Fp2, [1, 0]) + E.set_order((p + 1) ** 2) + + P, Q = even_torsion_basis_E0(E, f) + print(f"{P = }") + print(f"{Q = }") + + assert P.order() == 1 << f + assert Q.order() == 1 << f + e = P.weil_pairing(Q, 1 << f) + assert e ** (1 << f - 1) == -1 + print("all good") diff --git a/scripts/precompute_endomorphism_action.sage b/scripts/precompute_endomorphism_action.sage deleted file mode 100755 index 90a6cc7..0000000 --- a/scripts/precompute_endomorphism_action.sage +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/env sage -proof.all(False) # faster - -from sage.misc.banner import require_version -if not require_version(10, 0, print_message=True): - exit('') - -################################################################ - -from parameters import p, B, f, Tpls, Tmin, Dcom, Dchall -T = Tpls * Tmin - -################################################################ - -if p % 4 != 3: - raise NotImplementedError('requires p ≡ 3 (mod 4)') - -Fp2. = GF((p,2), modulus=[1,0,1]) -Fp4 = Fp2.extension(2,'u') -E = EllipticCurve(Fp4, [1,0]) -assert E.j_invariant() == 1728 -assert E.is_supersingular() -assert E.change_ring(Fp2).frobenius() == -p -assert E.order() == (p^2-1)^2 - -endo_1 = E.scalar_multiplication(1) -endo_i = E.automorphisms()[-1] -endo_j = E.frobenius_isogeny() -endo_k = endo_i * endo_j - -if 0: # skipped for speed, for now - assert endo_i^2 == E.scalar_multiplication(-1) - assert endo_j^2 == E.scalar_multiplication(-p) - assert endo_j * endo_i == - endo_i * endo_j -else: - R = E.random_point() - assert (endo_i^2)(R) == -1*R - assert (endo_j^2)(R) == -p*R - assert (endo_j*endo_i)(R) == -(endo_i*endo_j)(R) - -def half_endo(summands): - def _eval(P): - E = P.curve() - assert P in E - F = E.base_field() - if (halves := P.division_points(2)): - Q = halves[0] - else: - Q = E.change_ring(F.extension(2,'v'))(P) - R = sum(endo._eval(Q) for endo in summands) - return E(R) - return _eval - -gen1 = endo_1._eval -gen2 = endo_i._eval -gen3 = half_endo([endo_i, endo_j]) -gen4 = half_endo([endo_1, endo_k]) - -################################################################ - -from sage.groups.generic import order_from_multiple - -x = Fp4.gen() -while True: - x += 1 - try: - P = E.lift_x(x) - except ValueError: - continue - o = order_from_multiple(P, p^2-1) - if (T< = QuaternionAlgebra(-1, -p) -O0 = Quat.quaternion_order([1, i, (i+j)/2, (1+k)/2]) - -assert Dcom % 2 == 1 # odd -mat = block_matrix(Zmod(Dcom), [[identity_matrix(2), mati, matj, matk]])[:,::2] -ker = list(map(Quat, mat.right_kernel_matrix())) -idealP = sum((O0*g for g in ker), O0*Dcom) -assert idealP.norm() == Dcom -for b in idealP.basis(): - assert sum(Mod(c,Dcom)*g for c,g in zip(b,(1,mati,matj,matk)))[:,0] == 0 # kills P -for v in (ZZ^4): - idealPgen = sum(c*g for c,g in zip(v, idealP.basis())) - if vector(list(idealPgen)).denominator() == 2: - idealPgen *= 2 - if gcd(idealPgen.reduced_norm(), Dcom^2) == Dcom: - break -assert idealP == O0*Dcom + O0*idealPgen - -mat = mat # still -rhs = vector(Zmod(Dcom), [0,1]) -cs = mat.solve_right(rhs) -distorter = Quat(cs) -assert sum(Mod(c,Dcom)*g for c,g in zip(distorter,(1,mati,matj,matk))).columns()[0] == vector((0,1)) # maps P->Q - -################################################################ - -from cformat import Ibz, Object, ObjectFormatter - -def field2limbs(el): - l = 1 + floor(log(p, 2**64)) - el = Fp2(el) - vs = [[(int(c) >> 64*i) % 2**64 for i in range(l)] for c in el] - return vs - -def fmt_basis(name, P, Q): - vs = [ - [field2limbs(T[0]), field2limbs(T[2])] - for T in (P,Q,P-Q) - ] - return Object('ec_basis_t', name, vs) - -bases = { - 'EVEN': 1<', file=hfile) - print(f'#include ', file=hfile) - print(f'#include ', file=hfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - - objs.header(file=hfile) - objs.implementation(file=cfile) - diff --git a/scripts/precompute_klpt_constants.sage b/scripts/precompute_klpt_constants.sage deleted file mode 100755 index a6cef10..0000000 --- a/scripts/precompute_klpt_constants.sage +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env sage -proof.all(False) # faster - -from sage.misc.banner import require_version -if not require_version(9, 8, print_message=True): - exit('') - -################################################################ - -from parameters import f, p, Tpls, Tmin -negl = 2**-64 #TODO optimize - -################################################################ - -logp = ceil(log(p, 2)) -logT = ceil(log(Tpls*Tmin, 2)) -tors2val = (p+1).valuation(2) - -defs = dict() - -# lideal_equiv - -defs['KLPT_equiv_bound_coeff'] = ceil((log(negl, 1-2/logp) ** (1/4) - 1) / 2) + 2 -assert (1 - 2/logp) ** ((2 * defs['KLPT_equiv_bound_coeff'] + 1) ** 4) <= negl - -defs['KLPT_equiv_num_iter'] = (2 * defs['KLPT_equiv_bound_coeff'] + 1) ** 4 - -defs['KLPT_primality_num_iter'] = ceil(-log(negl, 4)) - -# signing KLPT - -defs['KLPT_signing_klpt_length'] = f * ceil (ceil((log(negl, 2) / -2) + 15/4*logp + 25)/f) -assert 2**(-2 * (defs['KLPT_signing_klpt_length'] - 15/4*logp - 25)) <= negl - -defs['KLPT_signing_num_gamma_trial'] = ceil(log(negl, 2) / -1) -assert 2 ** ( - defs['KLPT_signing_num_gamma_trial']) <= negl - -defs['KLPT_gamma_exponent_interval_size'] = 0 - -defs['KLPT_gamma_exponent_center_shift'] = ceil(log(log(negl, 1-1/logp) + defs['KLPT_signing_num_gamma_trial'], 2) + defs['KLPT_gamma_exponent_interval_size']) -assert (1 - 1/logp) ** (2**(defs['KLPT_gamma_exponent_center_shift'] - defs['KLPT_gamma_exponent_interval_size']) - defs['KLPT_signing_num_gamma_trial']) <= negl - -defs['KLPT_repres_num_gamma_trial'] = 2**(defs['KLPT_gamma_exponent_center_shift'] + defs['KLPT_gamma_exponent_interval_size']) - -defs['KLPT_signing_number_strong_approx'] = ceil(log(1/64, 1-4/13/logp)) -assert (1 - 4/13/logp) ** defs['KLPT_signing_number_strong_approx'] <= 1/64 - -# keygen KLPT - -defs['KLPT_random_prime_attempts'] = 64 - -defs['KLPT_secret_key_prime_size'] = ceil(logp / 4) - -defs['KLPT_keygen_length'] = f* ceil ( ceil(log(negl, 2) / -2 + 5/2*logp -25 ) / f) -assert 2 ** (-2 * (defs['KLPT_keygen_length'] - 5/2*logp +25)) <= negl - -defs['KLPT_keygen_num_gamma_trial'] = ceil(log(negl, 2) / -1) - -defs['KLPT_eichler_smallnorm_bitsize'] = ceil(1/2*logp - 4/3*( logT - 5/4*logp)) - -defs['KLPT_keygen_number_strong_approx'] = ceil(log(1/64, 1-2/5/logp)) -assert (1 - 2/5/logp) ** defs['KLPT_keygen_number_strong_approx'] <= 1/64 - -# Eichler - -defs['KLPT_eichler_number_mu_norm'] = ceil((logT - 5/4*logp) / log(3,2)) - -defs['KLPT_eichler_strong_approx_log_margin'] = 2 - -defs['KLPT_eichler_num_equiv_ideal'] = ceil(logp / 10) - -defs['KLPT_eichler_number_strong_approx'] = ceil(10 * logp) - -# signature response - -defs['SQISIGN_response_attempts'] = 64 - -# signature isogeny degrees - -defs['SQISIGN_random_length'] = 0 -defs['SQISIGN_signing_total_length'] = defs['KLPT_signing_klpt_length'] -defs['SQISIGN_signing_length'] = ZZ(defs['SQISIGN_signing_total_length'] / tors2val) -defs['SQISIGN_keygen_length'] = ZZ(defs['KLPT_keygen_length'] / tors2val) - -# prime data for Cornacchia - -primes_1mod4 = [p for p in primes(100) if p%4==1] -prod_primes_3mod4 = prod(p for p in primes(100) if p%4==3) - -################################################################ - -from cformat import Ibz, Object, ObjectFormatter - -objs = ObjectFormatter([ - Object('short[]', 'SMALL_PRIMES_1MOD4', [int(v) for v in primes_1mod4]), - Object('ibz_t', 'PROD_SMALL_PRIMES_3MOD4', Ibz(prod_primes_3mod4)), - ]) - -################################################################ - -with open('include/klpt_constants.h','w') as hfile: - with open('klpt_constants.c','w') as cfile: - print(f'#include ', file=hfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - - for k,v in defs.items(): - v = ZZ(v) - print(f'#define {k} {v}', file=hfile) - - objs.header(file=hfile) - objs.implementation(file=cfile) - diff --git a/scripts/precompute_quaternion_data.sage b/scripts/precompute_quaternion_data.sage deleted file mode 100755 index 967d3ae..0000000 --- a/scripts/precompute_quaternion_data.sage +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env sage -proof.all(False) # faster - -from sage.misc.banner import require_version -if not require_version(9, 8, print_message=True): - exit('') - -################################################################ - -from parameters import p -num = 7 #TODO how many extra maximal orders to precompute? - -################################################################ - -# Underlying theory: -# - Ibukiyama, On maximal orders of division quaternion algebras with certain optimal embeddings -# - https://ia.cr/2023/106 Lemma 10 - -from sage.algebras.quatalg.quaternion_algebra import basis_for_quaternion_lattice -bfql = lambda els: basis_for_quaternion_lattice(els, reverse=True) - -Quat. = QuaternionAlgebra(-1, -p) -assert Quat.discriminant() == p # ramifies correctly - -orders = [] - -q = 1 -while len(orders) < num: - q = next_prime(q) - - if q == 2: - continue - - Quat2. = QuaternionAlgebra(-q, -p) - if Quat2.discriminant() != p: # ramifies incorrectly - continue - - x, y = QuadraticForm(QQ, 2, [1,0,p]).solve(q) - gamma = x + j*y - assert gamma.reduced_norm() == q - ims = [Quat(1), i*gamma, j, k*gamma] - assert ims[1]^2 == -q - assert ims[2]^2 == -p - assert ims[1]*ims[2] == ims[3] - assert ims[2]*ims[1] == -ims[3] - # (1,ii,jj,kk)->ims is an isomorphism Quat2->Quat - - r = min(map(ZZ, Mod(-p, 4*q).sqrt(all=True))) - - if q % 4 == 3: - bas2 = [ - Quat2(1), - (1 + ii) / 2, - jj * (1 + ii) / 2, - (r + jj) * ii / q, - ] - else: - bas2 = [ - Quat2(1), - ii, - (1 + jj) / 2, - (r + jj) * ii / 2 / q, - ] - O2 = Quat2.quaternion_order(bas2) - assert O2.discriminant() == p # is maximal - - bas = [sum(c*im for c,im in zip(el,ims)) for el in bas2] - bas = bfql(bas) - O = Quat.quaternion_order(bas) - assert O.discriminant() == p # is maximal - assert j in O # p-extremal - - mat = matrix(map(list, bas)) -# print(f'{q = }\nsqrt(-q) = {ims[1]}\n {(chr(10)+" ").join(map(str,bas))}', file=sys.stderr) - assert mat[0] == vector((1,0,0,0)) - orders.append((q, ims[1], mat)) - -################################################################ - -gram = matrix(ZZ, [ - [((gi+gj).reduced_norm() - gi.reduced_norm() - gj.reduced_norm()) / 2 - for gi in Quat.basis()] for gj in Quat.basis()]) - -O0mat = matrix([list(g) for g in [Quat(1), i, (i+j)/2, (1+k)/2]]) - -################################################################ - -from cformat import Ibz, Object, ObjectFormatter - -algobj = [Ibz(p), [[Ibz(v) for v in vs] for vs in gram]] -O0ord = [Ibz(O0mat.denominator()), [[Ibz(v*O0mat.denominator()) for v in vs] for vs in O0mat.transpose()]] -O0obj = [O0ord, [Ibz(1), [Ibz(c) for c in (0,1,0,0)]], [Ibz(1), [Ibz(c) for c in (0,0,1,0)]], 1] - -objs = [[[Ibz(mat.denominator()), [[Ibz(v*mat.denominator()) for v in vs] for vs in mat.transpose()]], [Ibz(mat.denominator()), [Ibz(c*mat.denominator()) for c in ii]], [Ibz(1), [Ibz(c) for c in (0,0,1,0)]], q] for q,ii,mat in orders] - -objs = ObjectFormatter([ - Object('quat_alg_t', 'QUATALG_PINFTY', algobj), - Object('quat_order_t', 'MAXORD_O0', O0ord), - Object('quat_p_extremal_maximal_order_t', 'STANDARD_EXTREMAL_ORDER', O0obj), - Object('quat_p_extremal_maximal_order_t[]', 'ALTERNATE_EXTREMAL_ORDERS', objs), - ]) - -with open('include/quaternion_data.h','w') as hfile: - with open('quaternion_data.c','w') as cfile: - print(f'#include ', file=hfile) - print(f'#include ', file=hfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - - print(f'#define NUM_ALTERNATE_EXTREMAL_ORDERS {len(orders)}', file=hfile) - - objs.header(file=hfile) - objs.implementation(file=cfile) - diff --git a/scripts/precompute_sizes.sage b/scripts/precompute_sizes.sage deleted file mode 100755 index e7f77ef..0000000 --- a/scripts/precompute_sizes.sage +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env sage -proof.all(False) # faster - -from sage.misc.banner import require_version -if not require_version(9, 8, print_message=True): - exit('') - -################################################################ - -from parameters import lvl, f, p - -################################################################ - -logp = ceil(log(p, 2)) -tors2part = (p+1).p_primary_part(2) -tors3part = (p+1).p_primary_part(3) - -#XXX first load the constants from klpt_constants.h -import re -klpt_consts = dict() -for l in open('include/klpt_constants.h'): - m = re.search(r'#define *([^ ]+) *([x0-9]+)$', l) - if m: - k,v = m.groups() - klpt_consts[k] = int(v, 0) - -defs = dict() - -fp2sz = (logp + 63)//64*8 * 2 -defs['FP2_ENCODED_BYTES'] = fp2sz -defs['EC_CURVE_ENCODED_BYTES'] = fp2sz # just the A -defs['EC_POINT_ENCODED_BYTES'] = fp2sz # just the x -defs['EC_BASIS_ENCODED_BYTES'] = 3 * defs['EC_POINT_ENCODED_BYTES'] - -defs['CHAIN_LENGTH'] = klpt_consts['SQISIGN_keygen_length'] - -defs['QUAT_ALG_ELEM_ENCODED_BITS'] = ceil(((logp/4) + klpt_consts['KLPT_keygen_length'])/2 +55) #TODO FIXME figure this out XXX XXX -defs['QUAT_ALG_ELEM_ENCODED_BYTES'] = (defs['QUAT_ALG_ELEM_ENCODED_BITS'] + 7)//8 -defs['ID2ISO_LONG_TWO_ISOG_ENCODED_BYTES'] = defs['CHAIN_LENGTH'] * (defs['EC_CURVE_ENCODED_BYTES'] + defs['EC_POINT_ENCODED_BYTES'] + 2) - -defs['ZIP_CHAIN_LEN'] = klpt_consts['SQISIGN_signing_length'] -defs['ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES'] = (f + 7) // 8 -defs['ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES'] = defs['ZIP_CHAIN_LEN'] * defs['ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES'] + 1 - -defs['SIGNATURE_LEN'] = defs['ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES'] + ((tors2part*tors3part).bit_length()+7)//8 + 1 + (tors2part.bit_length()+7)//8 + (tors3part.bit_length()+7)//8 -defs['PUBLICKEY_BYTES'] = defs['EC_CURVE_ENCODED_BYTES'] -defs['SECRETKEY_BYTES'] = defs['EC_CURVE_ENCODED_BYTES'] + 5*defs['QUAT_ALG_ELEM_ENCODED_BYTES'] + defs['EC_POINT_ENCODED_BYTES'] + defs['EC_BASIS_ENCODED_BYTES'] + defs['EC_BASIS_ENCODED_BYTES'] - -size_privkey = defs['SECRETKEY_BYTES'] -size_pubkey = defs['PUBLICKEY_BYTES'] -size_signature = defs['SIGNATURE_LEN'] - -algname = f'lvl{lvl}' - -################################################################ - -with open('include/encoded_sizes.h','w') as hfile: - for k,v in defs.items(): - v = ZZ(v) - print(f'#define {k} {v}', file=hfile) - -api = f''' -// SPDX-License-Identifier: Apache-2.0 - -#ifndef api_h -#define api_h - -#define CRYPTO_SECRETKEYBYTES {size_privkey:4} -#define CRYPTO_PUBLICKEYBYTES {size_pubkey:4} -#define CRYPTO_BYTES {size_signature:4} - -#define CRYPTO_ALGNAME "{algname}" - -int -crypto_sign_keypair(unsigned char *pk, unsigned char *sk); - -int -crypto_sign(unsigned char *sm, unsigned long long *smlen, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk); - -int -crypto_sign_open(unsigned char *m, unsigned long long *mlen, - const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk); - -#endif /* api_h */ -'''.strip() - -with open(f'../../../nistapi/lvl{lvl}/api.h', 'w') as f: - print(api, file=f) - diff --git a/scripts/precompute_torsion_constants.sage b/scripts/precompute_torsion_constants.sage deleted file mode 100755 index e0e7afa..0000000 --- a/scripts/precompute_torsion_constants.sage +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env sage -proof.all(False) # faster - -from sage.misc.banner import require_version -if not require_version(9, 8, print_message=True): - exit('') - -################################################################ - -from parameters import p, B, f, Tpls, Tmin, Dcom, Dchall - -################################################################ - -Lpls = sorted(set(Tpls.prime_factors()) - {2}) -Epls = [Tpls.valuation(l) for l in Lpls] - -Lmin = sorted(set(Tmin.prime_factors()) - {2}) -Emin = [Tmin.valuation(l) for l in Lmin] - -tors2part = (p+1).p_primary_part(2) -tors3part = (p+1).p_primary_part(3) -tors23part = tors2part * tors3part - -defs = { - 'TORSION_2POWER_BYTES': (int(tors2part).bit_length() + 7) // 8, - 'TORSION_3POWER_BYTES': (int(tors3part).bit_length() + 7) // 8, - 'TORSION_23POWER_BYTES': (int(tors23part).bit_length() + 7) // 8, - } - -from cformat import Ibz, Object, ObjectFormatter - -objs = ObjectFormatter([ - Object('uint64_t', 'TORSION_PLUS_EVEN_POWER', int(f)), - Object('uint64_t[]', 'TORSION_ODD_PRIMES', Lpls + Lmin), - Object('uint64_t[]', 'TORSION_ODD_POWERS', Epls + Emin), - Object('uint64_t[]', 'TORSION_PLUS_ODD_PRIMES', Lpls), # TODO deduplicate? - Object('size_t[]', 'TORSION_PLUS_ODD_POWERS', Epls), # TODO deduplicate? - Object('uint64_t[]', 'TORSION_MINUS_ODD_PRIMES', Lmin), # TODO deduplicate? - Object('size_t[]', 'TORSION_MINUS_ODD_POWERS', Emin), # TODO deduplicate? - Object('size_t[]', 'DEGREE_COMMITMENT_POWERS', [Dcom.valuation(l) for l in Lpls+Lmin]), #FIXME should be ec_degree_odd_t - Object('ibz_t', 'CHARACTERISTIC', Ibz(p)), - Object('ibz_t', 'TORSION_ODD', Ibz(Tpls * Tmin)), - Object('ibz_t[]', 'TORSION_ODD_PRIMEPOWERS', [Ibz(l^e) for Tpm in (Tpls,Tmin) for l,e in Tpm.factor()]), - Object('ibz_t', 'TORSION_ODD_PLUS', Ibz(Tpls)), - Object('ibz_t', 'TORSION_ODD_MINUS', Ibz(Tmin)), - Object('ibz_t', 'TORSION_PLUS_2POWER', Ibz(tors2part)), - Object('ibz_t', 'TORSION_PLUS_3POWER', Ibz(tors3part)), - Object('ibz_t', 'TORSION_PLUS_23POWER', Ibz(tors23part)), - Object('ibz_t', 'DEGREE_COMMITMENT', Ibz(Dcom)), - Object('ibz_t', 'DEGREE_COMMITMENT_PLUS', Ibz(gcd(Dcom, Tpls))), - Object('ibz_t', 'DEGREE_COMMITMENT_MINUS', Ibz(gcd(Dcom, Tmin))), - Object('ibz_t', 'DEGREE_CHALLENGE', Ibz(Dchall)), - ]) - -with open('include/torsion_constants.h','w') as hfile: - with open('torsion_constants.c','w') as cfile: - print(f'#include ', file=hfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - print(f'#include ', file=cfile) - - for k,v in defs.items(): - print(f'#define {k} {v}', file=hfile) - - objs.header(file=hfile) - objs.implementation(file=cfile) - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fd8d809..70d59ae 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,92 +1,74 @@ -# There are the following dependencies -# ┌─┬──────┬─┐ ┌─┬────┬─┐ ┌─┬──────┬─┐ -# │ ├──────┤ │ │ ├────┤ │ │ ├──────┤ │ -# │ │Keygen│ │ │ │Sign│ │ │ │Verify│ │ -# │ ├──────┤ │ │ ├────┤ │ │ ├──────┤ │ -# └─┴───┬──┴─┘ └─┴─┬──┴─┘ └─┴───┬──┴─┘ -# │ │ │ -# │ │ │ -# ├────────────────────┼─────────────────┐ │ -# │ │ │ │ -# │ │ │ │ -# ┌───▼──┐ ┌──────▼────────┐ ┌────▼─────▼───────────┐ -# │ PRNG ◄────┬─────┤ Iso <-> Ideal ├───► Elliptic Curves, │ -# └───▲──┘ │ └──────┬────────┘ │ Pairings & Isogenies │ -# │ │ │ └───▲──────┬───────────┘ -# │ │ │ │ │ -# ┌───┴──┐ │ │ │ │ -# │ KLPT ◄────┘ │ ┌──────────┘ │ -# └───┬──┘ │ │ │ -# │ │ │ │ -# ┌─────────▼─────────┐ │ │ │ -# │ Quaternion orders │ │ │ ┌────▼───┐ -# │ and ideals │ │ │ │ GF(p²) │ -# └─────────┬─────────┘ │ │ └────┬───┘ -# │ ┌─┬──────▼─────┴──┬─┐ │ -# ┌─────▼─────┐ │ ├───────────────┤ │ ┌─────▼─────┐ -# │ MP BigInt │ │ │Precomputations│ │ │ FP BigInt │ -# └───────────┘ │ ├───────────────┤ │ └───────────┘ -# └─┴───────────────┴─┘ - add_subdirectory(common) -add_subdirectory(intbig) -add_subdirectory(quaternion) -add_subdirectory(precomp) -add_subdirectory(klpt) -add_subdirectory(gf) -add_subdirectory(ec) -add_subdirectory(id2iso) -add_subdirectory(protocols) +if(ENABLE_SIGN) + add_subdirectory(quaternion) +endif() + +add_subdirectory(mp) +add_subdirectory(gf) +add_subdirectory(precomp) +add_subdirectory(ec) +add_subdirectory(hd) +add_subdirectory(verification) + +if(ENABLE_SIGN) + add_subdirectory(id2iso) + add_subdirectory(signature) +endif() FOREACH(SVARIANT ${SVARIANT_S}) string(TOLOWER ${SVARIANT} SVARIANT_LOWER) string(TOUPPER ${SVARIANT} SVARIANT_UPPER) set(SOURCE_FILES_VARIANT sqisign.c) + # Library for SQIsign variant add_library(sqisign_${SVARIANT_LOWER} ${SOURCE_FILES_VARIANT}) - target_link_libraries(sqisign_${SVARIANT_LOWER} PUBLIC - ${LIB_PROTOCOLS_${SVARIANT_UPPER}} - ${LIB_ID2ISO_${SVARIANT_UPPER}} - ${LIB_KLPT_${SVARIANT_UPPER}} - ${LIB_QUATERNION} - ${LIB_PRECOMP_${SVARIANT_UPPER}} - ${LIB_INTBIG} - ${LIB_GF_${SVARIANT_UPPER}} - ${LIB_EC_${SVARIANT_UPPER}} - ${GMP} + target_link_libraries(sqisign_${SVARIANT_LOWER} PUBLIC + $<$:${LIB_SIGNATURE_${SVARIANT_UPPER}}> + ${LIB_VERIFICATION_${SVARIANT_UPPER}} + $<$:${LIB_ID2ISO_${SVARIANT_UPPER}}> + $<$:${LIB_QUATERNION}> + ${LIB_MP} + ${LIB_GF_${SVARIANT_UPPER}} + ${LIB_EC_${SVARIANT_UPPER}} + ${LIB_HD_${SVARIANT_UPPER}} + ${LIB_PRECOMP_${SVARIANT_UPPER}} + $<$:GMP> sqisign_common_sys ) - target_include_directories(sqisign_${SVARIANT_LOWER} PUBLIC ${INC_PROTOCOLS} ${INC_INTBIG} ${INC_QUATERNION} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_EC} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${INC_KLPT} ${INC_ID2ISO} ../include PRIVATE common/generic internal) + target_include_directories(sqisign_${SVARIANT_LOWER} PUBLIC $<$:${INC_SIGNATURE}> ${INC_VERIFICATION} $<$:${INC_QUATERNION}> ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_MP} ${INC_EC} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${INC_HD} $<$:${INC_ID2ISO}> ../include PRIVATE common/generic internal) target_compile_definitions(sqisign_${SVARIANT_LOWER} PUBLIC SQISIGN_VARIANT=${SVARIANT}) # Library for SQIsign variant (test) add_library(sqisign_${SVARIANT_LOWER}_test ${SOURCE_FILES_VARIANT}) - target_link_libraries(sqisign_${SVARIANT_LOWER}_test PUBLIC - ${LIB_PROTOCOLS_${SVARIANT_UPPER}} - ${LIB_ID2ISO_${SVARIANT_UPPER}} - ${LIB_KLPT_${SVARIANT_UPPER}} - ${LIB_QUATERNION} - ${LIB_PRECOMP_${SVARIANT_UPPER}} - ${LIB_INTBIG} - ${LIB_GF_${SVARIANT_UPPER}} - ${LIB_EC_${SVARIANT_UPPER}} - ${GMP} + target_link_libraries(sqisign_${SVARIANT_LOWER}_test PUBLIC + $<$:${LIB_SIGNATURE_${SVARIANT_UPPER}}> + ${LIB_VERIFICATION_${SVARIANT_UPPER}} + $<$:${LIB_ID2ISO_${SVARIANT_UPPER}}> + $<$:${LIB_QUATERNION}> + ${LIB_MP} + ${LIB_GF_${SVARIANT_UPPER}} + ${LIB_EC_${SVARIANT_UPPER}} + ${LIB_HD_${SVARIANT_UPPER}} + ${LIB_PRECOMP_${SVARIANT_UPPER}} + $<$:GMP> sqisign_common_test ) - target_include_directories(sqisign_${SVARIANT_LOWER}_test PUBLIC ${INC_PROTOCOLS} ${INC_INTBIG} ${INC_QUATERNION} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_EC} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${INC_KLPT} ${INC_ID2ISO} ../include PRIVATE common/generic internal) + target_include_directories(sqisign_${SVARIANT_LOWER}_test PUBLIC $<$:${INC_SIGNATURE}> ${INC_VERIFICATION} $<$:${INC_QUATERNION}> ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_MP} ${INC_EC} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${INC_HD} $<$:${INC_ID2ISO}> ../include PRIVATE common/generic internal) target_compile_definitions(sqisign_${SVARIANT_LOWER}_test PUBLIC SQISIGN_VARIANT=${SVARIANT}) # Library with NIST API set(SOURCE_FILE_NISTAPI nistapi/${SVARIANT_LOWER}/api.c) add_library(sqisign_${SVARIANT_LOWER}_nistapi ${SOURCE_FILE_NISTAPI}) - target_link_libraries(sqisign_${SVARIANT_LOWER}_nistapi PRIVATE sqisign_${SVARIANT_LOWER}) + target_link_libraries(sqisign_${SVARIANT_LOWER}_nistapi PUBLIC sqisign_${SVARIANT_LOWER}) target_include_directories(sqisign_${SVARIANT_LOWER}_nistapi PUBLIC nistapi/${SVARIANT_LOWER} PUBLIC ../include) + target_compile_definitions(sqisign_${SVARIANT_LOWER}_nistapi PUBLIC SQISIGN_VARIANT=${SVARIANT}) # Library with NIST API (test) add_library(sqisign_${SVARIANT_LOWER}_test_nistapi ${SOURCE_FILE_NISTAPI}) - target_link_libraries(sqisign_${SVARIANT_LOWER}_test_nistapi PRIVATE sqisign_${SVARIANT_LOWER}_test) + target_link_libraries(sqisign_${SVARIANT_LOWER}_test_nistapi PUBLIC sqisign_${SVARIANT_LOWER}_test) target_include_directories(sqisign_${SVARIANT_LOWER}_test_nistapi PUBLIC nistapi/${SVARIANT_LOWER}) + target_compile_definitions(sqisign_${SVARIANT_LOWER}_test_nistapi PUBLIC SQISIGN_VARIANT=${SVARIANT}) ENDFOREACH() diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 3338854..a27f0d8 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -1,3 +1,8 @@ +if (POLICY CMP0076) + cmake_policy(SET CMP0076 NEW) +endif() + get_filename_component(CCSD_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) string(TOUPPER ${CCSD_NAME} CCSD_NAME_UPPER) include(${SELECT_SQISIGN_VARIANT}) +include(${SELECT_IMPL_TYPE}) diff --git a/src/common/arm64crypto/CMakeLists.txt b/src/common/arm64crypto/CMakeLists.txt new file mode 100644 index 0000000..771dad0 --- /dev/null +++ b/src/common/arm64crypto/CMakeLists.txt @@ -0,0 +1,40 @@ +if(CMAKE_C_COMPILER_ID MATCHES "Clang") + set(SOURCE_FILES_COMMON_ARM64CRYPTO randombytes_ctrdrbg_inline_asm.c) +else() + set(SOURCE_FILES_COMMON_ARM64CRYPTO randombytes_ctrdrbg.c) + set_source_files_properties(randombytes_ctrdrbg.c PROPERTIES COMPILE_FLAGS -fno-strict-aliasing) +endif() + +foreach(SQISIGN_COMMON_TARGET sqisign_common_test sqisign_common_sys) + target_sources(${SQISIGN_COMMON_TARGET} PRIVATE ${SOURCE_FILES_COMMON_ARM64CRYPTO}) + target_include_directories(${SQISIGN_COMMON_TARGET} PRIVATE include) + target_compile_definitions(${SQISIGN_COMMON_TARGET} PRIVATE RANDOMBYTES_ARM64CRYPTO) + target_compile_options(${SQISIGN_COMMON_TARGET} PRIVATE -march=armv8-a+crypto) +endforeach() + +set(SOURCE_FILES_CTRDRBG_TEST_BENCHMARK + ${SOURCE_FILES_COMMON_ARM64CRYPTO} + ../ref/aes_c.c + ../ref/randombytes_ctrdrbg.c + ../generic/randombytes_system.c +) + +add_executable(sqisign_test_ctrdrbg_arm64crypto ${SOURCE_FILES_CTRDRBG_TEST_BENCHMARK} ../generic/test/test_ctrdrbg.c) +target_include_directories(sqisign_test_ctrdrbg_arm64crypto PRIVATE ${INC_PUBLIC} ${INC_COMMON} include ../ref/include) +target_compile_definitions(sqisign_test_ctrdrbg_arm64crypto PRIVATE + CTRDRBG_TEST_BENCH + RANDOMBYTES_INIT_PLATFORM=randombytes_init_arm64crypto + RANDOMBYTES_PLATFORM=randombytes_arm64crypto) +target_compile_options(sqisign_test_ctrdrbg_arm64crypto PRIVATE -march=armv8-a+crypto) + +add_test(sqisign_test_ctrdrbg_arm64crypto sqisign_test_ctrdrbg_arm64crypto) + +add_executable(sqisign_bench_ctrdrbg_arm64crypto ${SOURCE_FILES_CTRDRBG_TEST_BENCHMARK} ../generic/test/bench_ctrdrbg.c) +target_include_directories(sqisign_bench_ctrdrbg_arm64crypto PRIVATE ${INC_PUBLIC} ${INC_COMMON} include ../ref/include) +target_compile_definitions(sqisign_bench_ctrdrbg_arm64crypto PRIVATE + CTRDRBG_TEST_BENCH + RANDOMBYTES_INIT_PLATFORM=randombytes_init_arm64crypto + RANDOMBYTES_PLATFORM=randombytes_arm64crypto) +target_compile_options(sqisign_bench_ctrdrbg_arm64crypto PRIVATE -march=armv8-a+crypto) + +set(BM_BINS ${BM_BINS} sqisign_bench_ctrdrbg_arm64crypto CACHE INTERNAL "List of benchmark executables") diff --git a/src/common/arm64crypto/include/randombytes_arm64crypto.h b/src/common/arm64crypto/include/randombytes_arm64crypto.h new file mode 100644 index 0000000..88c4bf4 --- /dev/null +++ b/src/common/arm64crypto/include/randombytes_arm64crypto.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: Apache-2.0 + +#ifndef RANDOMBYTES_ARM64CRYPTO_H +#define RANDOMBYTES_ARM64CRYPTO_H + +#include + +#define RNG_SUCCESS 0 +#define RNG_BAD_MAXLEN -1 +#define RNG_BAD_OUTBUF -2 +#define RNG_BAD_REQ_LEN -3 + +typedef struct { + unsigned char buffer[16]; + int buffer_pos; + unsigned long length_remaining; + unsigned char key[32]; + unsigned char ctr[16]; +} AES_XOF_struct; + +typedef struct { + unsigned char Key[32]; + unsigned char V[16]; + int reseed_counter; +} AES256_CTR_DRBG_struct; + +#endif /* RANDOMBYTES_ARM64CRYPTO_H */ diff --git a/src/common/arm64crypto/randombytes_ctrdrbg.c b/src/common/arm64crypto/randombytes_ctrdrbg.c new file mode 100644 index 0000000..0f7a986 --- /dev/null +++ b/src/common/arm64crypto/randombytes_ctrdrbg.c @@ -0,0 +1,276 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include "randombytes_arm64crypto.h" + +#include +#include + +static AES256_CTR_DRBG_struct DRBG_ctx; + +static inline uint32_t AES_sbox_x4(uint32_t in) { + uint8x16_t sbox_val = vreinterpretq_u8_u32(vdupq_n_u32(in)); + sbox_val = vaeseq_u8(sbox_val, vdupq_n_u8(0)); + + return vgetq_lane_u32(vreinterpretq_u32_u8(sbox_val), 0); +} + +#define ROTR32(x, n) ((x << (32 - n)) | (x >> n)) + +typedef union { + uint8_t u8[15][16]; + uint32_t u32[15][4]; +} subkeys_t; + +static void AES256_key_schedule(uint8_t subkeys[15][16], const uint8_t *key) { + subkeys_t *sk = (subkeys_t *)subkeys; + uint8_t rcon = 1; + uint32_t s; + int i, j; + + memcpy(&subkeys[0][0], key, 32 * sizeof(uint8_t)); + + for (i = 2; i < 14; i += 2) { + s = AES_sbox_x4(sk->u32[i - 1][3]); + sk->u32[i][0] = ROTR32(s, 8) ^ rcon ^ sk->u32[i - 2][0]; + + for (j = 1; j < 4; j++) { + sk->u32[i][j] = sk->u32[i][j - 1] ^ sk->u32[i - 2][j]; + } + + s = AES_sbox_x4(sk->u32[i][3]); + sk->u32[i + 1][0] = s ^ sk->u32[i - 1][0]; + + for (j = 1; j < 4; j++) { + sk->u32[i + 1][j] = sk->u32[i + 1][j - 1] ^ sk->u32[i - 1][j]; + } + + rcon = (rcon << 1) ^ ((rcon >> 7) * 0x11b); + } + + s = AES_sbox_x4(sk->u32[13][3]); + sk->u32[14][0] = ROTR32(s, 8) ^ rcon ^ sk->u32[12][0]; + + for (j = 1; j < 4; j++) { + sk->u32[14][j] = sk->u32[14][j - 1] ^ sk->u32[12][j]; + } +} + +#define AES256_ECB_XWAYS(ways, vsubkeys, ctr, out) \ + do { \ + uint8x16_t state[ways]; \ + \ + for (int j = 0; j < ways; j++) { \ + state[j] = vaeseq_u8(ctr[j], vsubkeys[0]); \ + state[j] = vaesmcq_u8(state[j]); \ + } \ + \ + for (int i = 1; i < 13; i++) { \ + for (int j = 0; j < ways; j++) { \ + state[j] = vaeseq_u8(state[j], vsubkeys[i]); \ + state[j] = vaesmcq_u8(state[j]); \ + } \ + } \ + \ + for (int j = 0; j < ways; j++) { \ + state[j] = vaeseq_u8(state[j], vsubkeys[13]); \ + state[j] = veorq_u8(state[j], vsubkeys[14]); \ + vst1q_u8(out + j * 16, state[j]); \ + } \ + } while (0); + +// subkeys - subkeys for AES-256 +// ctr - a 128-bit plaintext value +// buffer - a 128-bit ciphertext value +static void AES256_ECB(uint8x16_t vsubkeys[15], uint8x16_t ctr, + unsigned char *buffer) { + AES256_ECB_XWAYS(1, vsubkeys, (&ctr), buffer); +} + +// vsubkeys - subkeys for AES-256 +// ctr - an array of 3 x 128-bit plaintext value +// buffer - an array of 3 x 128-bit ciphertext value +static void AES256_ECB_x3(uint8x16_t vsubkeys[15], uint8x16_t ctr[3], + unsigned char *buffer) { + AES256_ECB_XWAYS(3, vsubkeys, ctr, buffer); +} + +static void bswap128(__uint128_t *x) { + uint64_t *x64 = (uint64_t *)x; + + uint64_t t = x64[0]; + x64[0] = x64[1]; + x64[1] = t; + + x64[0] = __builtin_bswap64(x64[0]); + x64[1] = __builtin_bswap64(x64[1]); +} + +static void add_to_V(unsigned char V[], int incr) { + __uint128_t *V128 = (__uint128_t *)V; + bswap128(V128); + (*V128) += incr; + bswap128(V128); +} + +static void AES256_CTR_DRBG_Update(unsigned char *provided_data, + uint8x16_t vsubkeys[15], unsigned char *Key, + unsigned char *V) { + unsigned char temp[48]; + __uint128_t V128, t; + uint64x2_t vV[3]; + + memcpy(&V128, DRBG_ctx.V, sizeof(V128)); + + bswap128(&V128); + + for (int j = 0; j < 3; j++) { + V128++; + t = V128; + bswap128(&t); + vV[j] = vld1q_u64((uint64_t *)&t); + } + + AES256_ECB_x3(vsubkeys, (uint8x16_t *)vV, temp); + + if (provided_data != NULL) + for (int i = 0; i < 48; i++) + temp[i] ^= provided_data[i]; + memcpy(Key, temp, 32); + memcpy(V, temp + 32, 16); + + add_to_V(DRBG_ctx.V, 1); +} + +void randombytes_init_arm64crypto(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + (void)security_strength; + + unsigned char seed_material[48]; + uint8_t subkeys[15][16]; + uint8x16_t vsubkeys[15]; + + memcpy(seed_material, entropy_input, 48); + if (personalization_string) + for (int i = 0; i < 48; i++) + seed_material[i] ^= personalization_string[i]; + memset(DRBG_ctx.Key, 0x00, 32); + memset(DRBG_ctx.V, 0x00, 16); + + AES256_key_schedule(subkeys, DRBG_ctx.Key); + for (int i = 0; i < 15; i++) { + vsubkeys[i] = vld1q_u8(subkeys[i]); + } + + AES256_CTR_DRBG_Update(seed_material, vsubkeys, DRBG_ctx.Key, DRBG_ctx.V); + DRBG_ctx.reseed_counter = 1; +} + +#define WAYS 4 + +int randombytes_arm64crypto(unsigned char *x, unsigned long long xlen) { + uint8_t subkeys[15][16]; + unsigned char block[16]; + __uint128_t V[WAYS], Vle[WAYS]; + uint8x16x4_t vV; + uint8x16_t vsubkeys[15]; + + AES256_key_schedule(subkeys, DRBG_ctx.Key); + + for (int j = 0; j < 15; j++) { + vsubkeys[j] = vld1q_u8(subkeys[j]); + } + + memcpy(&Vle[0], DRBG_ctx.V, sizeof(Vle[0])); + V[0] = Vle[0]; + vV.val[0] = vld1q_u8((uint8_t *)&V[0]); + bswap128(&Vle[0]); + for (int j = 1; j < WAYS; j++) { + Vle[j] = Vle[j - 1] + 1; + V[j] = Vle[j]; + bswap128(&V[j]); + vV.val[j] = vld1q_u8((uint8_t *)&V[j]); + } + + int entered_fast_path = (xlen >= WAYS * 16) ? 1 : 0; + + while (xlen >= WAYS * 16) { + for (int j = 0; j < WAYS; j++) { + Vle[j] += 4; + } + + for (int j = 0; j < WAYS; j++) { + vV.val[j] = vaeseq_u8(vV.val[j], vsubkeys[0]); + vV.val[j] = vaesmcq_u8(vV.val[j]); + } + + for (int i = 1; i < 13; i++) { + for (int j = 0; j < WAYS; j++) { + vV.val[j] = vaeseq_u8(vV.val[j], vsubkeys[i]); + vV.val[j] = vaesmcq_u8(vV.val[j]); + } + } + + for (int j = 0; j < WAYS; j++) { + vV.val[j] = vaeseq_u8(vV.val[j], vsubkeys[13]); + vV.val[j] = veorq_u8(vV.val[j], vsubkeys[14]); + vst1q_u8(x + j * 16, vV.val[j]); + } + + for (int j = 0; j < WAYS; j++) { + V[j] = Vle[j]; + bswap128(&V[j]); + } + + vV = vld1q_u8_x4((uint8_t *)V); + + x += WAYS * 16; + xlen -= WAYS * 16; + } + + if (entered_fast_path && xlen == 0) { + asm volatile("" : "+r,m"(Vle[3]) : : "memory"); + V[0] = Vle[3] - 4; + bswap128(&V[0]); + } + + while (xlen > 0) { + if (xlen > 16) { + AES256_ECB(vsubkeys, vld1q_u8((uint8_t *)&V[0]), x); + x += 16; + xlen -= 16; + + Vle[0]++; + V[0] = Vle[0]; + bswap128(&V[0]); + } else { + AES256_ECB(vsubkeys, vld1q_u8((uint8_t *)&V[0]), block); + memcpy(x, block, xlen); + xlen = 0; + } + } + + memcpy(DRBG_ctx.V, &V[0], sizeof(V[0])); + + AES256_CTR_DRBG_Update(NULL, vsubkeys, DRBG_ctx.Key, DRBG_ctx.V); + DRBG_ctx.reseed_counter++; + + return RNG_SUCCESS; +} + +#ifdef RANDOMBYTES_ARM64CRYPTO +int randombytes(unsigned char *random_array, unsigned long long nbytes) { + int ret = randombytes_arm64crypto(random_array, nbytes); +#ifdef ENABLE_CT_TESTING + VALGRIND_MAKE_MEM_UNDEFINED(random_array, ret); +#endif + return ret; +} + +void randombytes_init(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + randombytes_init_arm64crypto(entropy_input, personalization_string, + security_strength); +} +#endif diff --git a/src/common/arm64crypto/randombytes_ctrdrbg_inline_asm.c b/src/common/arm64crypto/randombytes_ctrdrbg_inline_asm.c new file mode 100644 index 0000000..4418c8c --- /dev/null +++ b/src/common/arm64crypto/randombytes_ctrdrbg_inline_asm.c @@ -0,0 +1,422 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include +#include + +#include "randombytes_arm64crypto.h" + +typedef union { + uint8_t u8[16]; + uint64_t u64[2]; + __uint128_t u128; +} u128_t; + +static AES256_CTR_DRBG_struct DRBG_ctx; + +static inline uint32_t AES_sbox_x4(uint32_t in) { + uint8x16_t sbox_val = vreinterpretq_u8_u32(vdupq_n_u32(in)); + sbox_val = vaeseq_u8(sbox_val, vdupq_n_u8(0)); + + return vgetq_lane_u32(vreinterpretq_u32_u8(sbox_val), 0); +} + +#define ROTR32(x, n) ((x << (32 - n)) | (x >> n)) + +typedef union { + uint32_t u32[15][4]; +} subkeys_t; + +static void AES256_key_schedule(uint8_t subkeys[15][16], const uint8_t *key) { + subkeys_t *sk = (subkeys_t *)subkeys; + uint8_t rcon = 1; + uint32_t s; + int i, j; + + memcpy(&subkeys[0][0], key, 32 * sizeof(uint8_t)); + + for (i = 2; i < 14; i += 2) { + s = AES_sbox_x4(sk->u32[i - 1][3]); + sk->u32[i][0] = ROTR32(s, 8) ^ rcon ^ sk->u32[i - 2][0]; + + for (j = 1; j < 4; j++) { + sk->u32[i][j] = sk->u32[i][j - 1] ^ sk->u32[i - 2][j]; + } + + s = AES_sbox_x4(sk->u32[i][3]); + sk->u32[i + 1][0] = s ^ sk->u32[i - 1][0]; + + for (j = 1; j < 4; j++) { + sk->u32[i + 1][j] = sk->u32[i + 1][j - 1] ^ sk->u32[i - 1][j]; + } + + rcon = (rcon << 1) ^ ((rcon >> 7) * 0x11b); + } + + s = AES_sbox_x4(sk->u32[13][3]); + sk->u32[14][0] = ROTR32(s, 8) ^ rcon ^ sk->u32[12][0]; + + for (j = 1; j < 4; j++) { + sk->u32[14][j] = sk->u32[14][j - 1] ^ sk->u32[12][j]; + } +} + +#define AES256_ECB_XWAYS(ways, vsubkeys, ctr, out) \ + do { \ + uint8x16_t state[ways]; \ + \ + for (int j = 0; j < ways; j++) { \ + state[j] = vaeseq_u8(ctr[j], vsubkeys[0]); \ + state[j] = vaesmcq_u8(state[j]); \ + } \ + \ + for (int i = 1; i < 13; i++) { \ + for (int j = 0; j < ways; j++) { \ + state[j] = vaeseq_u8(state[j], vsubkeys[i]); \ + state[j] = vaesmcq_u8(state[j]); \ + } \ + } \ + \ + for (int j = 0; j < ways; j++) { \ + state[j] = vaeseq_u8(state[j], vsubkeys[13]); \ + state[j] = veorq_u8(state[j], vsubkeys[14]); \ + vst1q_u8(out + j * 16, state[j]); \ + } \ + } while (0); + +// subkeys - subkeys for AES-256 +// ctr - a 128-bit plaintext value +// buffer - a 128-bit ciphertext value +static void AES256_ECB(uint8x16_t vsubkeys[15], uint8x16_t ctr, + unsigned char *buffer) { + AES256_ECB_XWAYS(1, vsubkeys, (&ctr), buffer); +} + +// vsubkeys - subkeys for AES-256 +// ctr - an array of 3 x 128-bit plaintext value +// buffer - an array of 3 x 128-bit ciphertext value +static void AES256_ECB_x3(uint8x16_t vsubkeys[15], uint8x16_t ctr[3], + unsigned char *buffer) { + AES256_ECB_XWAYS(3, vsubkeys, ctr, buffer); +} + +static void bswap128(u128_t *x) { + uint64_t t = x->u64[0]; + x->u64[0] = x->u64[1]; + x->u64[1] = t; + + x->u64[0] = __builtin_bswap64(x->u64[0]); + x->u64[1] = __builtin_bswap64(x->u64[1]); +} + +static void incr_V(u128_t *V) { + bswap128(V); + V->u128++; + bswap128(V); +} + +static void AES256_CTR_DRBG_Update(const unsigned char *provided_data, + uint8x16_t vsubkeys[15], unsigned char *Key, + unsigned char *V) { + (void)V; + + unsigned char temp[48]; + u128_t V128, t; + uint64x2_t vV[3]; + + memcpy(&V128, DRBG_ctx.V, sizeof(V128)); + + bswap128(&V128); + + for (int j = 0; j < 3; j++) { + V128.u128++; + t = V128; + bswap128(&t); + vV[j] = vld1q_u64((uint64_t *)&t); + } + + AES256_ECB_x3(vsubkeys, (uint8x16_t *)vV, temp); + + if (provided_data != NULL) + for (int i = 0; i < 48; i++) + temp[i] ^= provided_data[i]; + memcpy(Key, temp, 32); + memcpy(V128.u8, temp + 32, 16); + + incr_V(&V128); + + memcpy(DRBG_ctx.V, V128.u8, 16); +} + +void randombytes_init_arm64crypto(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + (void)security_strength; + + unsigned char seed_material[48]; + uint8_t subkeys[15][16]; + uint8x16_t vsubkeys[15]; + + memcpy(seed_material, entropy_input, 48); + if (personalization_string) + for (int i = 0; i < 48; i++) + seed_material[i] ^= personalization_string[i]; + memset(DRBG_ctx.Key, 0x00, 32); + memset(DRBG_ctx.V, 0x00, 16); + + AES256_key_schedule(subkeys, DRBG_ctx.Key); + for (int i = 0; i < 15; i++) { + vsubkeys[i] = vld1q_u8(subkeys[i]); + } + + AES256_CTR_DRBG_Update(seed_material, vsubkeys, DRBG_ctx.Key, DRBG_ctx.V); + DRBG_ctx.reseed_counter = 1; +} + +#define WAYS 4 + +int randombytes_arm64crypto(unsigned char *x, unsigned long long xlen) { + uint8_t subkeys[15][16]; + unsigned char block[16]; + u128_t V[WAYS], Vle[WAYS]; + uint8x16x4_t vV; + uint8x16_t vsubkeys[15]; + + AES256_key_schedule(subkeys, DRBG_ctx.Key); + + for (int j = 0; j < 15; j++) { + vsubkeys[j] = vld1q_u8(subkeys[j]); + } + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Woverlength-strings" + asm("ldp %[V0l], %[V0h], %[DRBG_ctx_V] \n\t" + "stp %[V0l], %[V0h], [%[V] ] \n\t" + "rev %[Vle0h], %[V0l] \n\t" + "rev %[Vle0l], %[V0h] \n\t" + "adds %[Vle1l], %[Vle0l], #1 \n\t" + "adc %[Vle1h], %[Vle0h], xzr \n\t" + "rev %[V1h], %[Vle1l] \n\t" + "rev %[V1l], %[Vle1h] \n\t" + "stp %[V1l], %[V1h], [%[V], #16] \n\t" + "adds %[Vle2l], %[Vle0l], #2 \n\t" + "adc %[Vle2h], %[Vle0h], xzr \n\t" + "rev %[V2h], %[Vle2l] \n\t" + "rev %[V2l], %[Vle2h] \n\t" + "stp %[V2l], %[V2h], [%[V], #32] \n\t" + "adds %[Vle3l], %[Vle0l], #3 \n\t" + "adc %[Vle3h], %[Vle0h], xzr \n\t" + "rev %[V3h], %[Vle3l] \n\t" + "rev %[V3l], %[Vle3h] \n\t" + "stp %[V3l], %[V3h], [%[V], #48] \n\t" + "ld1 { %[vV0].16b, %[vV1].16b, %[vV2].16b, %[vV3].16b }, [%[V]]\n\t" + "cmp %[xlen], #64 \n\t" + "b.lo 2f \n\t" + ".p2align 6 \n\t" + "1: \n\t" + "aese %[vV0].16b, %[vsk0].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk0].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk0].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk0].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk1].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk1].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk1].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk1].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "adds %[Vle0l], %[Vle0l], #4 \n\t" + "adc %[Vle0h], %[Vle0h], xzr \n\t" + "adds %[Vle1l], %[Vle1l], #4 \n\t" + "adc %[Vle1h], %[Vle1h], xzr \n\t" + "adds %[Vle2l], %[Vle2l], #4 \n\t" + "adc %[Vle2h], %[Vle2h], xzr \n\t" + "adds %[Vle3l], %[Vle3l], #4 \n\t" + "adc %[Vle3h], %[Vle3h], xzr \n\t" + "aese %[vV0].16b, %[vsk2].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk2].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk2].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk2].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk3].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk3].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk3].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk3].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "rev %[V0h], %[Vle0l] \n\t" + "rev %[V0l], %[Vle0h] \n\t" + "rev %[V1h], %[Vle1l] \n\t" + "rev %[V1l], %[Vle1h] \n\t" + "rev %[V2h], %[Vle2l] \n\t" + "rev %[V2l], %[Vle2h] \n\t" + "rev %[V3h], %[Vle3l] \n\t" + "rev %[V3l], %[Vle3h] \n\t" + "aese %[vV0].16b, %[vsk4].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk4].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk4].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk4].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk5].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk5].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk5].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk5].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk6].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk6].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk6].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk6].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk7].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk7].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk7].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk7].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk8].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk8].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk8].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk8].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk9].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk9].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk9].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk9].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "stp %[V0l], %[V0h], [%[V]] \n\t" + "stp %[V1l], %[V1h], [%[V], #16] \n\t" + "stp %[V2l], %[V2h], [%[V], #32] \n\t" + "stp %[V3l], %[V3h], [%[V], #48] \n\t" + "aese %[vV0].16b, %[vsk10].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk10].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk10].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk10].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk11].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk11].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk11].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk11].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk12].16b \n\t" + "aesmc %[vV0].16b, %[vV0].16b \n\t" + "aese %[vV1].16b, %[vsk12].16b \n\t" + "aesmc %[vV1].16b, %[vV1].16b \n\t" + "aese %[vV2].16b, %[vsk12].16b \n\t" + "aesmc %[vV2].16b, %[vV2].16b \n\t" + "aese %[vV3].16b, %[vsk12].16b \n\t" + "aesmc %[vV3].16b, %[vV3].16b \n\t" + "aese %[vV0].16b, %[vsk13].16b \n\t" + "eor %[vV0].16b, %[vV0].16b, %[vsk14].16b \n\t" + "aese %[vV1].16b, %[vsk13].16b \n\t" + "eor %[vV1].16b, %[vV1].16b, %[vsk14].16b \n\t" + "stp %q[vV0], %q[vV1], [%[x]], #32\n\t" + "aese %[vV2].16b, %[vsk13].16b \n\t" + "eor %[vV2].16b, %[vV2].16b, %[vsk14].16b \n\t" + "aese %[vV3].16b, %[vsk13].16b \n\t" + "eor %[vV3].16b, %[vV3].16b, %[vsk14].16b \n\t" + "stp %q[vV2], %q[vV3], [%[x]], #32\n\t" + "sub %[xlen], %[xlen], #64 \n\t" + "ld1 { %[vV0].16b, %[vV1].16b, %[vV2].16b, %[vV3].16b }, [%[V]]\n\t" + "cmp %[xlen], #64 \n\t" + "b.hs 1b \n\t" + "cbnz %[xlen], 2f \n\t" + "subs %[V0h], %[Vle3l], #4 \n\t" + "sbc %[V0l], %[Vle3h], xzr \n\t" + "rev %[V0h], %[V0h] \n\t" + "rev %[V0l], %[V0l] \n\t" + "stp %[V0l], %[V0h], [%[V]] \n\t" + "2: \n\t" + : [vV0] "=&w"(vV.val[0]), [vV1] "=&w"(vV.val[1]), [vV2] "=&w"(vV.val[2]), + [vV3] "=&w"(vV.val[3]), [Vle0l] "=&r"(Vle[0].u64[0]), + [Vle0h] "=&r"(Vle[0].u64[1]), [Vle1l] "=&r"(Vle[1].u64[0]), + [Vle1h] "=&r"(Vle[1].u64[1]), [Vle2l] "=&r"(Vle[2].u64[0]), + [Vle2h] "=&r"(Vle[2].u64[1]), [Vle3l] "=&r"(Vle[3].u64[0]), + [Vle3h] "=&r"(Vle[3].u64[1]), [x] "+r"(x), [xlen] "+r"(xlen), + [V0l] "=&r"(V[0].u64[0]), [V0h] "=&r"(V[0].u64[1]), + [V1l] "=&r"(V[1].u64[0]), [V1h] "=&r"(V[1].u64[1]), + [V2l] "=&r"(V[2].u64[0]), [V2h] "=&r"(V[2].u64[1]), + [V3l] "=&r"(V[3].u64[0]), [V3h] "=&r"(V[3].u64[1]), + "=m"(*(unsigned char(*)[64])x), "=m"(*(unsigned char(*)[64])V) + : + [vsk0] "w"(vsubkeys[0]), [vsk1] "w"(vsubkeys[1]), [vsk2] "w"(vsubkeys[2]), + [vsk3] "w"(vsubkeys[3]), [vsk4] "w"(vsubkeys[4]), [vsk5] "w"(vsubkeys[5]), + [vsk6] "w"(vsubkeys[6]), [vsk7] "w"(vsubkeys[7]), [vsk8] "w"(vsubkeys[8]), + [vsk9] "w"(vsubkeys[9]), [vsk10] "w"(vsubkeys[10]), + [vsk11] "w"(vsubkeys[11]), [vsk12] "w"(vsubkeys[12]), + [vsk13] "w"(vsubkeys[13]), [vsk14] "w"(vsubkeys[14]), [V] "r"(V), + [DRBG_ctx_V] "m"(DRBG_ctx.V) + : "cc"); +#pragma GCC diagnostic pop + + while (xlen > 0) { + if (xlen > 16) { + AES256_ECB(vsubkeys, vld1q_u8((uint8_t *)&V[0]), x); + x += 16; + xlen -= 16; + + Vle[0].u128++; + V[0] = Vle[0]; + bswap128(&V[0]); + } else { + AES256_ECB(vsubkeys, vld1q_u8((uint8_t *)&V[0]), block); + memcpy(x, block, xlen); + xlen = 0; + } + } + + memcpy(DRBG_ctx.V, &V[0], sizeof(V[0])); + + AES256_CTR_DRBG_Update(NULL, vsubkeys, DRBG_ctx.Key, DRBG_ctx.V); + DRBG_ctx.reseed_counter++; + + return RNG_SUCCESS; +} + +#ifdef RANDOMBYTES_ARM64CRYPTO +int randombytes(unsigned char *random_array, unsigned long long nbytes) { + int ret = randombytes_arm64crypto(random_array, nbytes); +#ifdef ENABLE_CT_TESTING + VALGRIND_MAKE_MEM_UNDEFINED(random_array, ret); +#endif + return ret; +} + +void randombytes_init(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + randombytes_init_arm64crypto(entropy_input, personalization_string, + security_strength); +} +#endif diff --git a/src/common/broadwell/CMakeLists.txt b/src/common/broadwell/CMakeLists.txt new file mode 100644 index 0000000..576c2ab --- /dev/null +++ b/src/common/broadwell/CMakeLists.txt @@ -0,0 +1,43 @@ +set(SOURCE_FILES_COMMON_AESNI + aes_ni.c + ctr_drbg.c + randombytes_ctrdrbg_aesni.c + vaes256_key_expansion.S +) + +foreach(SQISIGN_COMMON_TARGET sqisign_common_test sqisign_common_sys) + target_sources(${SQISIGN_COMMON_TARGET} PRIVATE ${SOURCE_FILES_COMMON_AESNI}) + target_include_directories(${SQISIGN_COMMON_TARGET} PRIVATE include) + target_compile_definitions(${SQISIGN_COMMON_TARGET} PRIVATE RANDOMBYTES_AES_NI) + target_compile_options(${SQISIGN_COMMON_TARGET} PRIVATE -maes -mavx2) +endforeach() + +set(SOURCE_FILES_CTRDRBG_TEST_BENCHMARK + ../ref/aes_c.c + aes_ni.c + ctr_drbg.c + randombytes_ctrdrbg_aesni.c + ../ref/randombytes_ctrdrbg.c + ../generic/randombytes_system.c + vaes256_key_expansion.S +) + +add_executable(sqisign_test_ctrdrbg_intel ${SOURCE_FILES_CTRDRBG_TEST_BENCHMARK} ../generic/test/test_ctrdrbg.c) +target_include_directories(sqisign_test_ctrdrbg_intel PRIVATE ${INC_PUBLIC} ${INC_COMMON} include ../ref/include) +target_compile_definitions(sqisign_test_ctrdrbg_intel PRIVATE + CTRDRBG_TEST_BENCH + RANDOMBYTES_INIT_PLATFORM=randombytes_init_aes_ni + RANDOMBYTES_PLATFORM=randombytes_aes_ni) +target_compile_options(sqisign_test_ctrdrbg_intel PRIVATE -maes -mavx2) + +add_test(sqisign_test_ctrdrbg_intel sqisign_test_ctrdrbg_intel) + +add_executable(sqisign_bench_ctrdrbg_intel ${SOURCE_FILES_CTRDRBG_TEST_BENCHMARK} ../generic/test/bench_ctrdrbg.c) +target_include_directories(sqisign_bench_ctrdrbg_intel PRIVATE ${INC_PUBLIC} ${INC_COMMON} include ../ref/include) +target_compile_definitions(sqisign_bench_ctrdrbg_intel PRIVATE + CTRDRBG_TEST_BENCH + RANDOMBYTES_INIT_PLATFORM=randombytes_init_aes_ni + RANDOMBYTES_PLATFORM=randombytes_aes_ni) +target_compile_options(sqisign_bench_ctrdrbg_intel PRIVATE -maes -mavx2) + +set(BM_BINS ${BM_BINS} sqisign_bench_ctrdrbg_intel CACHE INTERNAL "List of benchmark executables") diff --git a/src/common/broadwell/aes_ni.c b/src/common/broadwell/aes_ni.c new file mode 100644 index 0000000..f87762c --- /dev/null +++ b/src/common/broadwell/aes_ni.c @@ -0,0 +1,258 @@ +/*************************************************************************** +* This implementation is a modified version of the code, +* written by Nir Drucker and Shay Gueron +* AWS Cryptographic Algorithms Group +* (ndrucker@amazon.com, gueron@amazon.com) +* +* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"). +* You may not use this file except in compliance with the License. +* A copy of the License is located at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* or in the "license" file accompanying this file. This file is distributed +* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +* express or implied. See the License for the specific language governing +* permissions and limitations under the License. +* The license is detailed in the file LICENSE.txt, and applies to this file. +* ***************************************************************************/ + +#include "aes_ni.h" +#include + +#include +#include + +#define AESENC(m, key) _mm_aesenc_si128(m, key) +#define AESENCLAST(m, key) _mm_aesenclast_si128(m, key) +#define XOR(a, b) _mm_xor_si128(a, b) +#define ADD32(a, b) _mm_add_epi32(a, b) +#define SHUF8(a, mask) _mm_shuffle_epi8(a, mask) + +#define ZERO256 _mm256_zeroall + +#define BSWAP_MASK 0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f + +#ifdef VAES256 +#define VAESENC(a, key) _mm256_aesenc_epi128(a, key) +#define VAESENCLAST(a, key) _mm256_aesenclast_epi128(a, key) +#define EXTRACT128(a, imm) _mm256_extracti128_si256(a, imm) +#define XOR256(a, b) _mm256_xor_si256(a,b) +#define ADD32_256(a, b) _mm256_add_epi32(a,b) +#define SHUF8_256(a, mask) _mm256_shuffle_epi8(a, mask) +#endif + +#ifdef VAES512 +#define VAESENC(a, key) _mm512_aesenc_epi128(a, key) +#define VAESENCLAST(a, key) _mm512_aesenclast_epi128(a, key) +#define EXTRACT128(a, imm) _mm512_extracti64x2_epi64(a, imm) +#define XOR512(a, b) _mm512_xor_si512(a,b) +#define ADD32_512(a, b) _mm512_add_epi32(a,b) +#define SHUF8_512(a, mask) _mm512_shuffle_epi8(a, mask) +#endif + +_INLINE_ __m128i load_m128i(IN const uint8_t *ctr) +{ + return _mm_set_epi8(ctr[0], ctr[1], ctr[2], ctr[3], + ctr[4], ctr[5], ctr[6], ctr[7], + ctr[8], ctr[9], ctr[10], ctr[11], + ctr[12], ctr[13], ctr[14], ctr[15]); +} + +_INLINE_ __m128i loadr_m128i(IN const uint8_t *ctr) +{ + return _mm_setr_epi8(ctr[0], ctr[1], ctr[2], ctr[3], + ctr[4], ctr[5], ctr[6], ctr[7], + ctr[8], ctr[9], ctr[10], ctr[11], + ctr[12], ctr[13], ctr[14], ctr[15]); +} + +void aes256_enc(OUT uint8_t *ct, + IN const uint8_t *pt, + IN const aes256_ks_t *ks) { + uint32_t i = 0; + __m128i block = loadr_m128i(pt); + + block = XOR(block, ks->keys[0]); + for (i = 1; i < AES256_ROUNDS; i++) { + block = AESENC(block, ks->keys[i]); + } + block = AESENCLAST(block, ks->keys[AES256_ROUNDS]); + + _mm_storeu_si128((void*)ct, block); + + // Delete secrets from registers if any. + ZERO256(); +} + +void aes256_ctr_enc(OUT uint8_t *ct, + IN const uint8_t *ctr, + IN const uint32_t num_blocks, + IN const aes256_ks_t *ks) +{ + __m128i ctr_block = load_m128i(ctr); + + const __m128i bswap_mask = _mm_set_epi32(BSWAP_MASK); + const __m128i one = _mm_set_epi32(0,0,0,1); + + __m128i block = SHUF8(ctr_block, bswap_mask); + + for (uint32_t bidx = 0; bidx < num_blocks; bidx++) + { + block = XOR(block, ks->keys[0]); + for (uint32_t i = 1; i < AES256_ROUNDS; i++) { + block = AESENC(block, ks->keys[i]); + } + block = AESENCLAST(block, ks->keys[AES256_ROUNDS]); + + //We use memcpy to avoid align casting. + _mm_storeu_si128((void*)&ct[16*bidx], block); + + ctr_block = ADD32(ctr_block, one); + block = SHUF8(ctr_block, bswap_mask); + } + + // Delete secrets from registers if any. + ZERO256(); +} + +#ifdef VAES256 +_INLINE_ void load_ks(OUT __m256i ks256[AES256_ROUNDS + 1], + IN const aes256_ks_t *ks) +{ + for(uint32_t i = 0; i < AES256_ROUNDS + 1; i++) + { + ks256[i] = _mm256_broadcastsi128_si256(ks->keys[i]); + } +} + +// NIST 800-90A Table 3, Section 10.2.1 (no derivation function) states that +// max_number_of_bits_per_request is min((2^ctr_len - 4) x block_len, 2^19) <= 2^19 +// Therefore the maximal number of blocks (16 bytes) is 2^19/128 = 2^19/2^7 = 2^12 < 2^32 +// Here num_blocks is assumed to be less then 2^32. +// It is the caller responsiblity to ensure it. +void aes256_ctr_enc256(OUT uint8_t *ct, + IN const uint8_t *ctr, + IN const uint32_t num_blocks, + IN const aes256_ks_t *ks) +{ + const uint64_t num_par_blocks = num_blocks/2; + const uint64_t blocks_rem = num_blocks - (2*(num_par_blocks)); + + __m256i ks256[AES256_ROUNDS + 1]; + load_ks(ks256, ks); + + __m128i single_block = load_m128i(ctr); + __m256i ctr_blocks = _mm256_broadcastsi128_si256(single_block); + + // Preparing the masks + const __m256i bswap_mask = _mm256_set_epi32(BSWAP_MASK, BSWAP_MASK); + const __m256i two = _mm256_set_epi32(0,0,0,2,0,0,0,2); + const __m256i init = _mm256_set_epi32(0,0,0,1,0,0,0,0); + + // Initialize two parallel counters + ctr_blocks = ADD32_256(ctr_blocks, init); + __m256i p = SHUF8_256(ctr_blocks, bswap_mask); + + for (uint32_t block_idx = 0; block_idx < num_par_blocks; block_idx++) + { + p = XOR256(p, ks256[0]); + for (uint32_t i = 1; i < AES256_ROUNDS; i++) + { + p = VAESENC(p, ks256[i]); + } + p = VAESENCLAST(p, ks256[AES256_ROUNDS]); + + // We use memcpy to avoid align casting. + _mm256_storeu_si256((__m256i *)&ct[PAR_AES_BLOCK_SIZE * block_idx], p); + + // Increase the two counters in parallel + ctr_blocks = ADD32_256(ctr_blocks, two); + p = SHUF8_256(ctr_blocks, bswap_mask); + } + + if(0 != blocks_rem) + { + single_block = EXTRACT128(p, 0); + aes256_ctr_enc(&ct[PAR_AES_BLOCK_SIZE * num_par_blocks], + (const uint8_t*)&single_block, blocks_rem, ks); + } + + // Delete secrets from registers if any. + ZERO256(); +} + +#endif //VAES256 + +#ifdef VAES512 + +_INLINE_ void load_ks(OUT __m512i ks512[AES256_ROUNDS + 1], + IN const aes256_ks_t *ks) +{ + for(uint32_t i = 0; i < AES256_ROUNDS + 1; i++) + { + ks512[i] = _mm512_broadcast_i32x4(ks->keys[i]); + } +} + +// NIST 800-90A Table 3, Section 10.2.1 (no derivation function) states that +// max_number_of_bits_per_request is min((2^ctr_len - 4) x block_len, 2^19) <= 2^19 +// Therefore the maximal number of blocks (16 bytes) is 2^19/128 = 2^19/2^7 = 2^12 < 2^32 +// Here num_blocks is assumed to be less then 2^32. +// It is the caller responsiblity to ensure it. +void aes256_ctr_enc512(OUT uint8_t *ct, + IN const uint8_t *ctr, + IN const uint32_t num_blocks, + IN const aes256_ks_t *ks) +{ + const uint64_t num_par_blocks = num_blocks/4; + const uint64_t blocks_rem = num_blocks - (4*(num_par_blocks)); + + __m512i ks512[AES256_ROUNDS + 1]; + load_ks(ks512, ks); + + __m128i single_block = load_m128i(ctr); + __m512i ctr_blocks = _mm512_broadcast_i32x4(single_block); + + // Preparing the masks + const __m512i bswap_mask = _mm512_set_epi32(BSWAP_MASK, BSWAP_MASK, + BSWAP_MASK, BSWAP_MASK); + const __m512i four = _mm512_set_epi32(0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,4); + const __m512i init = _mm512_set_epi32(0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,0); + + // Initialize four parallel counters + ctr_blocks = ADD32_512(ctr_blocks, init); + __m512i p = SHUF8_512(ctr_blocks, bswap_mask); + + for (uint32_t block_idx = 0; block_idx < num_par_blocks; block_idx++) + { + p = XOR512(p, ks512[0]); + for (uint32_t i = 1; i < AES256_ROUNDS; i++) + { + p = VAESENC(p, ks512[i]); + } + p = VAESENCLAST(p, ks512[AES256_ROUNDS]); + + + // We use memcpy to avoid align casting. + _mm512_storeu_si512(&ct[PAR_AES_BLOCK_SIZE * block_idx], p); + + // Increase the four counters in parallel + ctr_blocks = ADD32_512(ctr_blocks, four); + p = SHUF8_512(ctr_blocks, bswap_mask); + } + + if(0 != blocks_rem) + { + single_block = EXTRACT128(p, 0); + aes256_ctr_enc(&ct[PAR_AES_BLOCK_SIZE * num_par_blocks], + (const uint8_t*)&single_block, blocks_rem, ks); + } + + // Delete secrets from registers if any. + ZERO256(); +} + +#endif //VAES512 diff --git a/src/common/broadwell/ctr_drbg.c b/src/common/broadwell/ctr_drbg.c new file mode 100644 index 0000000..0717075 --- /dev/null +++ b/src/common/broadwell/ctr_drbg.c @@ -0,0 +1,201 @@ +/* Copyright (c) 2017, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +/*************************************************************************** + * Small modification by Nir Drucker and Shay Gueron + * AWS Cryptographic Algorithms Group + * (ndrucker@amazon.com, gueron@amazon.com) + * include: + * 1) Use memcpy/memset instead of OPENSSL_memcpy/memset + * 2) Include aes.h as the underlying aes code + * 3) Modifying the drbg structure + * ***************************************************************************/ + +#include "ctr_drbg.h" +#include + + +// Section references in this file refer to SP 800-90Ar1: +// http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-90Ar1.pdf + +int CTR_DRBG_init(CTR_DRBG_STATE *drbg, + const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], + const uint8_t *personalization, size_t personalization_len) { + // Section 10.2.1.3.1 + if (personalization_len > CTR_DRBG_ENTROPY_LEN) { + return 0; + } + + uint8_t seed_material[CTR_DRBG_ENTROPY_LEN]; + memcpy(seed_material, entropy, CTR_DRBG_ENTROPY_LEN); + + for (size_t i = 0; i < personalization_len; i++) { + seed_material[i] ^= personalization[i]; + } + + // Section 10.2.1.2 + // kInitMask is the result of encrypting blocks with big-endian value 1, 2 + // and 3 with the all-zero AES-256 key. + static const uint8_t kInitMask[CTR_DRBG_ENTROPY_LEN] = { + 0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9, 0xa9, 0x63, 0xb4, 0xf1, + 0xc4, 0xcb, 0x73, 0x8b, 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e, + 0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18, 0x72, 0x60, 0x03, 0xca, + 0x37, 0xa6, 0x2a, 0x74, 0xd1, 0xa2, 0xf5, 0x8e, 0x75, 0x06, 0x35, 0x8e, + }; + + for (size_t i = 0; i < sizeof(kInitMask); i++) { + seed_material[i] ^= kInitMask[i]; + } + + aes256_key_t key; + memcpy(key.raw, seed_material, 32); + memcpy(drbg->counter.bytes, seed_material + 32, 16); + + aes256_key_expansion(&drbg->ks, &key); + drbg->reseed_counter = 1; + + return 1; +} + +// ctr_inc adds |n| to the last four bytes of |drbg->counter|, treated as a +// big-endian number. +static void ctr32_add(CTR_DRBG_STATE *drbg, uint32_t n) { + drbg->counter.words[3] = + CRYPTO_bswap4(CRYPTO_bswap4(drbg->counter.words[3]) + n); +} + +static int ctr_drbg_update(CTR_DRBG_STATE *drbg, const uint8_t *data, + size_t data_len) { + // Per section 10.2.1.2, |data_len| must be |CTR_DRBG_ENTROPY_LEN|. Here, we + // allow shorter inputs and right-pad them with zeros. This is equivalent to + // the specified algorithm but saves a copy in |CTR_DRBG_generate|. + if (data_len > CTR_DRBG_ENTROPY_LEN) { + return 0; + } + + uint8_t temp[CTR_DRBG_ENTROPY_LEN]; + for (size_t i = 0; i < CTR_DRBG_ENTROPY_LEN; i += AES_BLOCK_SIZE) { + ctr32_add(drbg, 1); + aes256_enc(temp + i, drbg->counter.bytes, &drbg->ks); + } + + for (size_t i = 0; i < data_len; i++) { + temp[i] ^= data[i]; + } + + aes256_key_t key; + memcpy(key.raw, temp, 32); + memcpy(drbg->counter.bytes, temp + 32, 16); + aes256_key_expansion(&drbg->ks, &key); + + return 1; +} + +int CTR_DRBG_reseed(CTR_DRBG_STATE *drbg, + const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], + const uint8_t *additional_data, + size_t additional_data_len) { + // Section 10.2.1.4 + uint8_t entropy_copy[CTR_DRBG_ENTROPY_LEN]; + + if (additional_data_len > 0) { + if (additional_data_len > CTR_DRBG_ENTROPY_LEN) { + return 0; + } + + memcpy(entropy_copy, entropy, CTR_DRBG_ENTROPY_LEN); + for (size_t i = 0; i < additional_data_len; i++) { + entropy_copy[i] ^= additional_data[i]; + } + + entropy = entropy_copy; + } + + if (!ctr_drbg_update(drbg, entropy, CTR_DRBG_ENTROPY_LEN)) { + return 0; + } + + drbg->reseed_counter = 1; + + return 1; +} + +int CTR_DRBG_generate(CTR_DRBG_STATE *drbg, uint8_t *out, size_t out_len, + const uint8_t *additional_data, + size_t additional_data_len) { + if (additional_data_len != 0 && + !ctr_drbg_update(drbg, additional_data, additional_data_len)) { + return 0; + } + + // kChunkSize is used to interact better with the cache. Since the AES-CTR + // code assumes that it's encrypting rather than just writing keystream, the + // buffer has to be zeroed first. Without chunking, large reads would zero + // the whole buffer, flushing the L1 cache, and then do another pass (missing + // the cache every time) to “encrypt” it. The code can avoid this by + // chunking. + static const size_t kChunkSize = 8 * 1024; + + while (out_len >= AES_BLOCK_SIZE) { + size_t todo = kChunkSize; + if (todo > out_len) { + todo = out_len; + } + + todo &= ~(AES_BLOCK_SIZE - 1); + + const size_t num_blocks = todo / AES_BLOCK_SIZE; + if (1) { + memset(out, 0, todo); + ctr32_add(drbg, 1); +#ifdef VAES512 + aes256_ctr_enc512(out, drbg->counter.bytes, num_blocks, &drbg->ks); +#elif defined(VAES256) + aes256_ctr_enc256(out, drbg->counter.bytes, num_blocks, &drbg->ks); +#else + aes256_ctr_enc(out, drbg->counter.bytes, num_blocks, &drbg->ks); +#endif + ctr32_add(drbg, num_blocks - 1); + } else { + for (size_t i = 0; i < todo; i += AES_BLOCK_SIZE) { + ctr32_add(drbg, 1); + aes256_enc(&out[i], drbg->counter.bytes, &drbg->ks); + } + } + + out += todo; + out_len -= todo; + } + + if (out_len > 0) { + uint8_t block[AES_BLOCK_SIZE]; + ctr32_add(drbg, 1); + aes256_enc(block, drbg->counter.bytes, &drbg->ks); + + memcpy(out, block, out_len); + } + + // Right-padding |additional_data| in step 2.2 is handled implicitly by + // |ctr_drbg_update|, to save a copy. + if (!ctr_drbg_update(drbg, additional_data, additional_data_len)) { + return 0; + } + + drbg->reseed_counter++; + return 1; +} + +void CTR_DRBG_clear(CTR_DRBG_STATE *drbg) { + secure_clean((uint8_t *)drbg, sizeof(CTR_DRBG_STATE)); +} diff --git a/src/common/broadwell/include/aes_ni.h b/src/common/broadwell/include/aes_ni.h new file mode 100644 index 0000000..3714b8e --- /dev/null +++ b/src/common/broadwell/include/aes_ni.h @@ -0,0 +1,85 @@ +/*************************************************************************** +* Written by Nir Drucker and Shay Gueron +* AWS Cryptographic Algorithms Group +* (ndrucker@amazon.com, gueron@amazon.com) +* +* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"). +* You may not use this file except in compliance with the License. +* A copy of the License is located at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* or in the "license" file accompanying this file. This file is distributed +* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +* express or implied. See the License for the specific language governing +* permissions and limitations under the License. +* The license is detailed in the file LICENSE.txt, and applies to this file. +* ***************************************************************************/ + +#pragma once + +#include +#include +#include "defs.h" + +#define MAX_AES_INVOKATION (MASK(32)) + +#define AES256_KEY_SIZE (32ULL) +#define AES256_KEY_BITS (AES256_KEY_SIZE * 8) +#define AES_BLOCK_SIZE (16ULL) +#define AES256_ROUNDS (14ULL) + +#ifdef VAES256 +#define PAR_AES_BLOCK_SIZE (AES_BLOCK_SIZE*2) +#elif defined(VAES512) +#define PAR_AES_BLOCK_SIZE (AES_BLOCK_SIZE*4) +#endif + +typedef ALIGN(16) struct aes256_key_s { + uint8_t raw[AES256_KEY_SIZE]; +} aes256_key_t; + +typedef ALIGN(16) struct aes256_ks_s { + __m128i keys[AES256_ROUNDS + 1]; +} aes256_ks_t; + +// The ks parameter must be 16 bytes aligned! +EXTERNC void aes256_key_expansion(OUT aes256_ks_t *ks, + IN const aes256_key_t *key); + +// Encrypt one 128-bit block ct = E(pt,ks) +void aes256_enc(OUT uint8_t *ct, + IN const uint8_t *pt, + IN const aes256_ks_t *ks); + +// Encrypt num_blocks 128-bit blocks +// ct[15:0] = E(pt[15:0],ks) +// ct[31:16] = E(pt[15:0] + 1,ks) +// ... +// ct[16*num_blocks - 1:16*(num_blocks-1)] = E(pt[15:0] + num_blocks,ks) +void aes256_ctr_enc(OUT uint8_t *ct, + IN const uint8_t *pt, + IN const uint32_t num_blocks, + IN const aes256_ks_t *ks); + +// Encrypt num_blocks 128-bit blocks using VAES (AVX-2) +// ct[15:0] = E(pt[15:0],ks) +// ct[31:16] = E(pt[15:0] + 1,ks) +// ... +// ct[16*num_blocks - 1:16*(num_blocks-1)] = E(pt[15:0] + num_blocks,ks) +void aes256_ctr_enc256(OUT uint8_t *ct, + IN const uint8_t *ctr, + IN const uint32_t num_blocks, + IN const aes256_ks_t *ks); + +// Encrypt num_blocks 128-bit blocks using VAES (AVX512) +// ct[15:0] = E(pt[15:0],ks) +// ct[31:16] = E(pt[15:0] + 1,ks) +// ... +// ct[16*num_blocks - 1:16*(num_blocks-1)] = E(pt[15:0] + num_blocks,ks) +void aes256_ctr_enc512(OUT uint8_t *ct, + IN const uint8_t *ctr, + IN const uint32_t num_blocks, + IN const aes256_ks_t *ks); diff --git a/src/common/broadwell/include/ctr_drbg.h b/src/common/broadwell/include/ctr_drbg.h new file mode 100644 index 0000000..70ccd4a --- /dev/null +++ b/src/common/broadwell/include/ctr_drbg.h @@ -0,0 +1,78 @@ +/* Copyright (c) 2017, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +/*************************************************************************** +* Small modification by Nir Drucker and Shay Gueron +* AWS Cryptographic Algorithms Group +* (ndrucker@amazon.com, gueron@amazon.com) +* include: +* 1) Use memcpy/memset instead of OPENSSL_memcpy/memset +* 2) Include aes.h as the underlying aes code +* 3) Modifying the drbg structure +* ***************************************************************************/ + +#pragma once + +#if defined(__cplusplus) +extern "C" { +#endif + +#include "aes_ni.h" + +// CTR_DRBG_STATE contains the state of a CTR_DRBG based on AES-256. See SP +// 800-90Ar1. +typedef struct { + aes256_ks_t ks; + union { + uint8_t bytes[16]; + uint32_t words[4]; + } counter; + uint64_t reseed_counter; +} CTR_DRBG_STATE; + +// See SP 800-90Ar1, table 3. +#define CTR_DRBG_ENTROPY_LEN 48 + +// CTR_DRBG_init initialises |*drbg| given |CTR_DRBG_ENTROPY_LEN| bytes of +// entropy in |entropy| and, optionally, a personalization string up to +// |CTR_DRBG_ENTROPY_LEN| bytes in length. It returns one on success and zero +// on error. +int CTR_DRBG_init(CTR_DRBG_STATE *drbg, + const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], + const uint8_t *personalization, + size_t personalization_len); + +// CTR_DRBG_reseed reseeds |drbg| given |CTR_DRBG_ENTROPY_LEN| bytes of entropy +// in |entropy| and, optionally, up to |CTR_DRBG_ENTROPY_LEN| bytes of +// additional data. It returns one on success or zero on error. +int CTR_DRBG_reseed(CTR_DRBG_STATE *drbg, + const uint8_t entropy[CTR_DRBG_ENTROPY_LEN], + const uint8_t *additional_data, + size_t additional_data_len); + +// CTR_DRBG_generate processes to up |CTR_DRBG_ENTROPY_LEN| bytes of additional +// data (if any) and then writes |out_len| random bytes to |out|. It returns one on success or +// zero on error. +int CTR_DRBG_generate(CTR_DRBG_STATE *drbg, uint8_t *out, + size_t out_len, + const uint8_t *additional_data, + size_t additional_data_len); + +// CTR_DRBG_clear zeroises the state of |drbg|. +void CTR_DRBG_clear(CTR_DRBG_STATE *drbg); + + +#if defined(__cplusplus) +} // extern C +#endif diff --git a/src/common/broadwell/include/defs.h b/src/common/broadwell/include/defs.h new file mode 100644 index 0000000..09bb8b5 --- /dev/null +++ b/src/common/broadwell/include/defs.h @@ -0,0 +1,63 @@ +/*************************************************************************** +* Written by Nir Drucker and Shay Gueron +* AWS Cryptographic Algorithms Group +* (ndrucker@amazon.com, gueron@amazon.com) +* +* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"). +* You may not use this file except in compliance with the License. +* A copy of the License is located at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* or in the "license" file accompanying this file. This file is distributed +* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +* express or implied. See the License for the specific language governing +* permissions and limitations under the License. +* The license is detailed in the file LICENSE.txt, and applies to this file. +* ***************************************************************************/ + +#pragma once + +#include + +#ifdef __cplusplus + #define EXTERNC extern "C" +#else + #define EXTERNC +#endif + +// For code clarity. +#define IN +#define OUT + +#define ALIGN(n) __attribute__((aligned(n))) +#define _INLINE_ static inline + +typedef enum +{ + SUCCESS=0, + ERROR=1 +} status_t; + +#define SUCCESS 0 +#define ERROR 1 +#define GUARD(func) {if(SUCCESS != func) {return ERROR;}} + +#if defined(__GNUC__) && __GNUC__ >= 2 +static inline uint32_t CRYPTO_bswap4(uint32_t x) { + return __builtin_bswap32(x); +} +#endif + +_INLINE_ void secure_clean(OUT uint8_t *p, IN const uint32_t len) +{ +#ifdef _WIN32 + SecureZeroMemory(p, len); +#else + typedef void *(*memset_t)(void *, int, size_t); + static volatile memset_t memset_func = memset; + memset_func(p, 0, len); +#endif +} diff --git a/src/common/broadwell/randombytes_ctrdrbg_aesni.c b/src/common/broadwell/randombytes_ctrdrbg_aesni.c new file mode 100644 index 0000000..3fc67ac --- /dev/null +++ b/src/common/broadwell/randombytes_ctrdrbg_aesni.c @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: Apache-2.0 and Unknown +// +/* +NIST-developed software is provided by NIST as a public service. You may use, +copy, and distribute copies of the software in any medium, provided that you +keep intact this entire notice. You may improve, modify, and create derivative +works of the software or any portion of the software, and you may copy and +distribute such modifications or works. Modified works should carry a notice +stating that you changed the software and should note the date and nature of any +such change. Please explicitly acknowledge the National Institute of Standards +and Technology as the source of the software. + +NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF +ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, +WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS +NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR +ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE +ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, +INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR +USEFULNESS OF THE SOFTWARE. + +You are solely responsible for determining the appropriateness of using and +distributing the software and you assume all risks associated with its use, +including but not limited to the risks and costs of program errors, compliance +with applicable laws, damage to or loss of data, programs or equipment, and the +unavailability or interruption of operation. This software is not intended to be +used in any situation where a failure could cause risk of injury or damage to +property. The software developed by NIST employees is not subject to copyright +protection within the United States. +*/ + +#include + +#include +#include "ctr_drbg.h" + +#ifdef ENABLE_CT_TESTING +#include +#endif + +#define RNG_SUCCESS 0 +#define RNG_BAD_MAXLEN -1 +#define RNG_BAD_OUTBUF -2 +#define RNG_BAD_REQ_LEN -3 + +CTR_DRBG_STATE drbg; + +#ifndef CTRDRBG_TEST_BENCH +static +#endif +void +randombytes_init_aes_ni(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + (void)security_strength; // fixed to 256 + CTR_DRBG_init(&drbg, entropy_input, personalization_string, + (personalization_string == NULL) ? 0 : CTR_DRBG_ENTROPY_LEN); +} + +#ifndef CTRDRBG_TEST_BENCH +static +#endif +int +randombytes_aes_ni(unsigned char *x, size_t xlen) { + CTR_DRBG_generate(&drbg, x, xlen, NULL, 0); + return RNG_SUCCESS; +} + +#ifdef RANDOMBYTES_AES_NI +SQISIGN_API +int randombytes(unsigned char *random_array, unsigned long long nbytes) { + int ret = randombytes_aes_ni(random_array, nbytes); +#ifdef ENABLE_CT_TESTING + VALGRIND_MAKE_MEM_UNDEFINED(random_array, ret); +#endif + return ret; +} + +SQISIGN_API +void randombytes_init(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + randombytes_init_aes_ni(entropy_input, personalization_string, + security_strength); +} +#endif diff --git a/src/common/broadwell/vaes256_key_expansion.S b/src/common/broadwell/vaes256_key_expansion.S new file mode 100644 index 0000000..43d8fc2 --- /dev/null +++ b/src/common/broadwell/vaes256_key_expansion.S @@ -0,0 +1,122 @@ +#*************************************************************************** +# This implementation is a modified version of the code, +# written by Nir Drucker and Shay Gueron +# AWS Cryptographic Algorithms Group +# (ndrucker@amazon.com, gueron@amazon.com) +# +# Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). +# You may not use this file except in compliance with the License. +# A copy of the License is located at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# or in the "license" file accompanying this file. This file is distributed +# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language governing +# permissions and limitations under the License. +# The license is detailed in the file LICENSE.txt, and applies to this file. +#*************************************************************************** + +.intel_syntax noprefix +.data + +.p2align 4, 0x90 +MASK1: +.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d +CON1: +.long 1,1,1,1 + +.set k256_size, 32 + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",@progbits +#endif +.text + +################################################################################ +# void aes256_key_expansion(OUT aes256_ks_t* ks, IN const uint8_t* key); +# The output parameter must be 16 bytes aligned! +# +#Linux ABI +#define out rdi +#define in rsi + +#define CON xmm0 +#define MASK_REG xmm1 + +#define IN0 xmm2 +#define IN1 xmm3 + +#define TMP1 xmm4 +#define TMP2 xmm5 + +#define ZERO xmm15 + +.macro ROUND1 in0 in1 + add out, k256_size + vpshufb TMP2, \in1, MASK_REG + aesenclast TMP2, CON + vpslld CON, CON, 1 + vpslldq TMP1, \in0, 4 + vpxor \in0, \in0, TMP1 + vpslldq TMP1, TMP1, 4 + vpxor \in0, \in0, TMP1 + vpslldq TMP1, TMP1, 4 + vpxor \in0, \in0, TMP1 + vpxor \in0, \in0, TMP2 + vmovdqa [out], \in0 + +.endm + +.macro ROUND2 + vpshufd TMP2, IN0, 0xff + aesenclast TMP2, ZERO + vpslldq TMP1, IN1, 4 + vpxor IN1, IN1, TMP1 + vpslldq TMP1, TMP1, 4 + vpxor IN1, IN1, TMP1 + vpslldq TMP1, TMP1, 4 + vpxor IN1, IN1, TMP1 + vpxor IN1, IN1, TMP2 + vmovdqa [out+16], IN1 +.endm + +#ifdef __APPLE__ +#define AES256_KEY_EXPANSION _aes256_key_expansion +#else +#define AES256_KEY_EXPANSION aes256_key_expansion +#endif + +#ifndef __APPLE__ +.type AES256_KEY_EXPANSION,@function +.hidden AES256_KEY_EXPANSION +#endif +.globl AES256_KEY_EXPANSION +AES256_KEY_EXPANSION: + vmovdqu IN0, [in] + vmovdqu IN1, [in+16] + vmovdqa [out], IN0 + vmovdqa [out+16], IN1 + + vmovdqa CON, [rip+CON1] + vmovdqa MASK_REG, [rip+MASK1] + + vpxor ZERO, ZERO, ZERO + + mov ax, 6 +.loop256: + + ROUND1 IN0, IN1 + dec ax + ROUND2 + jne .loop256 + + ROUND1 IN0, IN1 + + ret +#ifndef __APPLE__ +.size AES256_KEY_EXPANSION, .-AES256_KEY_EXPANSION +#endif + diff --git a/src/common/generic/CMakeLists.txt b/src/common/generic/CMakeLists.txt index 3c0df05..238bccb 100644 --- a/src/common/generic/CMakeLists.txt +++ b/src/common/generic/CMakeLists.txt @@ -1,26 +1,15 @@ -set(SOURCE_FILES_COMMON_SYS +set(SOURCE_FILES_COMMON_GENERIC randombytes_system.c - aes_c.c fips202.c mem.c + tools.c ) -add_library(sqisign_common_sys ${SOURCE_FILES_COMMON_SYS}) -target_include_directories(sqisign_common_sys PRIVATE include ../../include) -target_compile_options(sqisign_common_sys PUBLIC ${C_OPT_FLAGS}) - -set(SOURCE_FILES_COMMON_TEST - randombytes_ctrdrbg.c - aes_c.c - fips202.c - mem.c -) - -add_library(sqisign_common_test ${SOURCE_FILES_COMMON_TEST}) -target_include_directories(sqisign_common_test PRIVATE include ../include) -target_compile_options(sqisign_common_test PUBLIC ${C_OPT_FLAGS}) - -if (ENABLE_CT_TESTING) - target_compile_definitions(sqisign_common_sys PUBLIC ENABLE_CT_TESTING) - target_compile_definitions(sqisign_common_test PUBLIC ENABLE_CT_TESTING) -endif() +foreach (SQISIGN_COMMON_TARGET sqisign_common_test sqisign_common_sys) + add_library(${SQISIGN_COMMON_TARGET} STATIC ${SOURCE_FILES_COMMON_GENERIC}) + target_include_directories(${SQISIGN_COMMON_TARGET} PRIVATE include ${INC_PUBLIC}) + target_compile_options(${SQISIGN_COMMON_TARGET} PUBLIC ${C_OPT_FLAGS}) + if (ENABLE_CT_TESTING) + target_compile_definitions(${SQISIGN_COMMON_TARGET} PUBLIC ENABLE_CT_TESTING) + endif() +endforeach() diff --git a/src/common/generic/fips202.c b/src/common/generic/fips202.c index cb99162..f2992d8 100644 --- a/src/common/generic/fips202.c +++ b/src/common/generic/fips202.c @@ -13,167 +13,7 @@ #include #include -#include -#include - -#define SHAKE128_RATE 168 -#define SHAKE256_RATE 136 -#define SHA3_256_RATE 136 -#define SHA3_384_RATE 104 -#define SHA3_512_RATE 72 - -#define PQC_SHAKEINCCTX_BYTES (sizeof(uint64_t)*26) -#define PQC_SHAKECTX_BYTES (sizeof(uint64_t)*25) - -// Context for incremental API -typedef struct { - uint64_t *ctx; -} shake128incctx; - -// Context for non-incremental API -typedef struct { - uint64_t *ctx; -} shake128ctx; - -// Context for incremental API -typedef struct { - uint64_t *ctx; -} shake256incctx; - -// Context for non-incremental API -typedef struct { - uint64_t *ctx; -} shake256ctx; - -// Context for incremental API -typedef struct { - uint64_t *ctx; -} sha3_256incctx; - -// Context for incremental API -typedef struct { - uint64_t *ctx; -} sha3_384incctx; - -// Context for incremental API -typedef struct { - uint64_t *ctx; -} sha3_512incctx; - -/* Initialize the state and absorb the provided input. - * - * This function does not support being called multiple times - * with the same state. - */ -void shake128_absorb(shake128ctx *state, const uint8_t *input, size_t inlen); -/* Squeeze output out of the sponge. - * - * Supports being called multiple times - */ -void shake128_squeezeblocks(uint8_t *output, size_t nblocks, shake128ctx *state); -/* Free the state */ -void shake128_ctx_release(shake128ctx *state); -/* Copy the state. */ -void shake128_ctx_clone(shake128ctx *dest, const shake128ctx *src); - -/* Initialize incremental hashing API */ -void shake128_inc_init(shake128incctx *state); -/* Absorb more information into the XOF. - * - * Can be called multiple times. - */ -void shake128_inc_absorb(shake128incctx *state, const uint8_t *input, size_t inlen); -/* Finalize the XOF for squeezing */ -void shake128_inc_finalize(shake128incctx *state); -/* Squeeze output out of the sponge. - * - * Supports being called multiple times - */ -void shake128_inc_squeeze(uint8_t *output, size_t outlen, shake128incctx *state); -/* Copy the context of the SHAKE128 XOF */ -void shake128_inc_ctx_clone(shake128incctx *dest, const shake128incctx *src); -/* Free the context of the SHAKE128 XOF */ -void shake128_inc_ctx_release(shake128incctx *state); - -/* Initialize the state and absorb the provided input. - * - * This function does not support being called multiple times - * with the same state. - */ -void shake256_absorb(shake256ctx *state, const uint8_t *input, size_t inlen); -/* Squeeze output out of the sponge. - * - * Supports being called multiple times - */ -void shake256_squeezeblocks(uint8_t *output, size_t nblocks, shake256ctx *state); -/* Free the context held by this XOF */ -void shake256_ctx_release(shake256ctx *state); -/* Copy the context held by this XOF */ -void shake256_ctx_clone(shake256ctx *dest, const shake256ctx *src); - -/* Initialize incremental hashing API */ -void shake256_inc_init(shake256incctx *state); -void shake256_inc_absorb(shake256incctx *state, const uint8_t *input, size_t inlen); -/* Prepares for squeeze phase */ -void shake256_inc_finalize(shake256incctx *state); -/* Squeeze output out of the sponge. - * - * Supports being called multiple times - */ -void shake256_inc_squeeze(uint8_t *output, size_t outlen, shake256incctx *state); -/* Copy the state */ -void shake256_inc_ctx_clone(shake256incctx *dest, const shake256incctx *src); -/* Free the state */ -void shake256_inc_ctx_release(shake256incctx *state); - -/* One-stop SHAKE128 call */ -void shake128(uint8_t *output, size_t outlen, - const uint8_t *input, size_t inlen); - -/* One-stop SHAKE256 call */ -void shake256(uint8_t *output, size_t outlen, - const uint8_t *input, size_t inlen); - -/* Initialize the incremental hashing state */ -void sha3_256_inc_init(sha3_256incctx *state); -/* Absorb blocks into SHA3 */ -void sha3_256_inc_absorb(sha3_256incctx *state, const uint8_t *input, size_t inlen); -/* Obtain the output of the function and free `state` */ -void sha3_256_inc_finalize(uint8_t *output, sha3_256incctx *state); -/* Copy the context */ -void sha3_256_inc_ctx_clone(sha3_256incctx *dest, const sha3_256incctx *src); -/* Release the state, don't use if `_finalize` has been used */ -void sha3_256_inc_ctx_release(sha3_256incctx *state); - -void sha3_256(uint8_t *output, const uint8_t *input, size_t inlen); - -/* Initialize the incremental hashing state */ -void sha3_384_inc_init(sha3_384incctx *state); -/* Absorb blocks into SHA3 */ -void sha3_384_inc_absorb(sha3_384incctx *state, const uint8_t *input, size_t inlen); -/* Obtain the output of the function and free `state` */ -void sha3_384_inc_finalize(uint8_t *output, sha3_384incctx *state); -/* Copy the context */ -void sha3_384_inc_ctx_clone(sha3_384incctx *dest, const sha3_384incctx *src); -/* Release the state, don't use if `_finalize` has been used */ -void sha3_384_inc_ctx_release(sha3_384incctx *state); - -/* One-stop SHA3-384 shop */ -void sha3_384(uint8_t *output, const uint8_t *input, size_t inlen); - -/* Initialize the incremental hashing state */ -void sha3_512_inc_init(sha3_512incctx *state); -/* Absorb blocks into SHA3 */ -void sha3_512_inc_absorb(sha3_512incctx *state, const uint8_t *input, size_t inlen); -/* Obtain the output of the function and free `state` */ -void sha3_512_inc_finalize(uint8_t *output, sha3_512incctx *state); -/* Copy the context */ -void sha3_512_inc_ctx_clone(sha3_512incctx *dest, const sha3_512incctx *src); -/* Release the state, don't use if `_finalize` has been used */ -void sha3_512_inc_ctx_release(sha3_512incctx *state); - -/* One-stop SHA3-512 shop */ -void sha3_512(uint8_t *output, const uint8_t *input, size_t inlen); +#include "fips202.h" #define NROUNDS 24 #define ROL(a, offset) (((a) << (offset)) ^ ((a) >> (64 - (offset)))) @@ -686,10 +526,6 @@ static void keccak_inc_squeeze(uint8_t *h, size_t outlen, } void shake128_inc_init(shake128incctx *state) { - state->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_inc_init(state->ctx); } @@ -706,22 +542,14 @@ void shake128_inc_squeeze(uint8_t *output, size_t outlen, shake128incctx *state) } void shake128_inc_ctx_clone(shake128incctx *dest, const shake128incctx *src) { - dest->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES); } void shake128_inc_ctx_release(shake128incctx *state) { - free(state->ctx); + (void)state; } void shake256_inc_init(shake256incctx *state) { - state->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_inc_init(state->ctx); } @@ -738,15 +566,11 @@ void shake256_inc_squeeze(uint8_t *output, size_t outlen, shake256incctx *state) } void shake256_inc_ctx_clone(shake256incctx *dest, const shake256incctx *src) { - dest->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES); } void shake256_inc_ctx_release(shake256incctx *state) { - free(state->ctx); + (void)state; } @@ -762,10 +586,6 @@ void shake256_inc_ctx_release(shake256incctx *state) { * - size_t inlen: length of input in bytes **************************************************/ void shake128_absorb(shake128ctx *state, const uint8_t *input, size_t inlen) { - state->ctx = malloc(PQC_SHAKECTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_absorb(state->ctx, SHAKE128_RATE, input, inlen, 0x1F); } @@ -786,16 +606,12 @@ void shake128_squeezeblocks(uint8_t *output, size_t nblocks, shake128ctx *state) } void shake128_ctx_clone(shake128ctx *dest, const shake128ctx *src) { - dest->ctx = malloc(PQC_SHAKECTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKECTX_BYTES); } /** Release the allocated state. Call only once. */ void shake128_ctx_release(shake128ctx *state) { - free(state->ctx); + (void)state; } /************************************************* @@ -810,10 +626,6 @@ void shake128_ctx_release(shake128ctx *state) { * - size_t inlen: length of input in bytes **************************************************/ void shake256_absorb(shake256ctx *state, const uint8_t *input, size_t inlen) { - state->ctx = malloc(PQC_SHAKECTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_absorb(state->ctx, SHAKE256_RATE, input, inlen, 0x1F); } @@ -834,16 +646,12 @@ void shake256_squeezeblocks(uint8_t *output, size_t nblocks, shake256ctx *state) } void shake256_ctx_clone(shake256ctx *dest, const shake256ctx *src) { - dest->ctx = malloc(PQC_SHAKECTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKECTX_BYTES); } /** Release the allocated state. Call only once. */ void shake256_ctx_release(shake256ctx *state) { - free(state->ctx); + (void)state; } /************************************************* @@ -909,23 +717,15 @@ void shake256(uint8_t *output, size_t outlen, } void sha3_256_inc_init(sha3_256incctx *state) { - state->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_inc_init(state->ctx); } void sha3_256_inc_ctx_clone(sha3_256incctx *dest, const sha3_256incctx *src) { - dest->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES); } void sha3_256_inc_ctx_release(sha3_256incctx *state) { - free(state->ctx); + (void)state; } void sha3_256_inc_absorb(sha3_256incctx *state, const uint8_t *input, size_t inlen) { @@ -970,18 +770,10 @@ void sha3_256(uint8_t *output, const uint8_t *input, size_t inlen) { } void sha3_384_inc_init(sha3_384incctx *state) { - state->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_inc_init(state->ctx); } void sha3_384_inc_ctx_clone(sha3_384incctx *dest, const sha3_384incctx *src) { - dest->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES); } @@ -990,7 +782,7 @@ void sha3_384_inc_absorb(sha3_384incctx *state, const uint8_t *input, size_t inl } void sha3_384_inc_ctx_release(sha3_384incctx *state) { - free(state->ctx); + (void)state; } void sha3_384_inc_finalize(uint8_t *output, sha3_384incctx *state) { @@ -1031,18 +823,10 @@ void sha3_384(uint8_t *output, const uint8_t *input, size_t inlen) { } void sha3_512_inc_init(sha3_512incctx *state) { - state->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (state->ctx == NULL) { - exit(111); - } keccak_inc_init(state->ctx); } void sha3_512_inc_ctx_clone(sha3_512incctx *dest, const sha3_512incctx *src) { - dest->ctx = malloc(PQC_SHAKEINCCTX_BYTES); - if (dest->ctx == NULL) { - exit(111); - } memcpy(dest->ctx, src->ctx, PQC_SHAKEINCCTX_BYTES); } @@ -1051,7 +835,7 @@ void sha3_512_inc_absorb(sha3_512incctx *state, const uint8_t *input, size_t inl } void sha3_512_inc_ctx_release(sha3_512incctx *state) { - free(state->ctx); + (void)state; } void sha3_512_inc_finalize(uint8_t *output, sha3_512incctx *state) { @@ -1090,13 +874,3 @@ void sha3_512(uint8_t *output, const uint8_t *input, size_t inlen) { output[i] = t[i]; } } - -int SHAKE128(unsigned char *output, size_t outputByteLen, const unsigned char *input, size_t inputByteLen) { - shake128(output, outputByteLen, input, inputByteLen); - return 0; -} - -int SHAKE256(unsigned char *output, size_t outputByteLen, const unsigned char *input, size_t inputByteLen) { - shake256(output, outputByteLen, input, inputByteLen); - return 0; -} diff --git a/src/common/generic/include/aes.h b/src/common/generic/include/aes.h deleted file mode 100644 index 2ceb847..0000000 --- a/src/common/generic/include/aes.h +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#ifndef AES_H -#define AES_H - -#include -#include - -void AES_256_ECB(const uint8_t *input, const uint8_t *key, uint8_t *output); -#define AES_ECB_encrypt AES_256_ECB - -#ifdef ENABLE_AESNI -int AES_128_CTR_NI(unsigned char *output, size_t outputByteLen, - const unsigned char *input, size_t inputByteLen); -int AES_128_CTR_4R_NI(unsigned char *output, size_t outputByteLen, - const unsigned char *input, size_t inputByteLen); -#define AES_128_CTR AES_128_CTR_NI -#else -int AES_128_CTR(unsigned char *output, size_t outputByteLen, - const unsigned char *input, size_t inputByteLen); -#endif - -#endif diff --git a/src/common/generic/include/bench.h b/src/common/generic/include/bench.h index 2ed9a4d..c253825 100644 --- a/src/common/generic/include/bench.h +++ b/src/common/generic/include/bench.h @@ -1,63 +1,126 @@ // SPDX-License-Identifier: Apache-2.0 +#ifndef BENCH_H__ +#define BENCH_H__ #include #include #include #include - - -#if defined(TARGET_OS_UNIX) && (defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_OTHER)) #include +#if defined(__APPLE__) +#include "bench_macos.h" #endif -#if (defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_S390X) || defined(TARGET_OTHER)) -#define print_bench_unit printf("nsec\n"); + +#if defined(TARGET_ARM) || defined(TARGET_S390X) || defined(NO_CYCLE_COUNTER) +#define BENCH_UNIT0 "nanoseconds" +#define BENCH_UNIT3 "microseconds" +#define BENCH_UNIT6 "milliseconds" +#define BENCH_UNIT9 "seconds" #else -#define print_bench_unit printf("cycles\n"); +#define BENCH_UNIT0 "cycles" +#define BENCH_UNIT3 "kilocycles" +#define BENCH_UNIT6 "megacycles" +#define BENCH_UNIT9 "gigacycles" #endif -#if (defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_S390X)) -#define BENCH_UNITS "nsec" -#else -#define BENCH_UNITS "cycles" +static inline void +cpucycles_init(void) { +#if defined(__APPLE__) && defined(TARGET_ARM64) + macos_init_rdtsc(); #endif +} -static inline int64_t cpucycles(void) { -#if (defined(TARGET_AMD64) || defined(TARGET_X86)) - unsigned int hi, lo; +static inline uint64_t +cpucycles(void) +{ +#if defined(TARGET_AMD64) || defined(TARGET_X86) + uint32_t hi, lo; - asm volatile ("rdtsc" : "=a" (lo), "=d"(hi)); - return ((int64_t) lo) | (((int64_t) hi) << 32); -#elif (defined(TARGET_S390X)) + asm volatile("rdtsc" : "=a"(lo), "=d"(hi)); + return ((uint64_t)lo) | ((uint64_t)hi << 32); +#elif defined(TARGET_S390X) uint64_t tod; - asm volatile("stckf %0\n" : "=Q" (tod) : : "cc"); + asm volatile("stckf %0\n" : "=Q"(tod) : : "cc"); return (tod * 1000 / 4096); +#elif defined(TARGET_ARM64) && !defined(NO_CYCLE_COUNTER) +#if defined(__APPLE__) + return macos_rdtsc(); +#else + uint64_t cycles; + asm volatile("mrs %0, PMCCNTR_EL0" : "=r"(cycles)); + return cycles; +#endif // __APPLE__ #else struct timespec time; clock_gettime(CLOCK_REALTIME, &time); - return (int64_t)(time.tv_sec * 1e9 + time.tv_nsec); + return (uint64_t)time.tv_sec * 1000000000 + time.tv_nsec; #endif } -static inline int cmpfunc (const void *a, const void *b) { - return ( *(uint64_t *)a - * (uint64_t *)b ); +static inline int +CMPFUNC(const void *a, const void *b) +{ + uint64_t aa = *(uint64_t *)a, bb = *(uint64_t *)b; + + if (aa > bb) + return +1; + if (aa < bb) + return -1; + return 0; } -#define BENCH_CODE_1(r) \ - cycles = 0; \ - for (i = 0; i < (r); ++i) { \ - cycles1 = cpucycles(); - -#define BENCH_CODE_2(name, csv) \ - cycles2 = cpucycles(); \ - if(i < LIST_SIZE) \ - cycles_list[i] = (cycles2 - cycles1);\ - cycles = cycles + (cycles2 - cycles1); \ - } \ - qsort(cycles_list, (runs < LIST_SIZE)? runs : LIST_SIZE, sizeof(uint64_t), cmpfunc);\ - if (csv) \ - printf("%2" PRId64 ",", cycles_list[(runs < LIST_SIZE)? runs/2 : LIST_SIZE/2]); \ - else { \ - printf(" %-20s-> median: %2" PRId64 ", average: %2" PRId64 " ", name, \ - cycles_list[(runs < LIST_SIZE)? runs/2 : LIST_SIZE/2], (cycles / runs)); \ - printf("%s\n", BENCH_UNITS); \ +static inline uint32_t +ISQRT(uint64_t x) +{ + uint32_t r = 0; + for (ssize_t i = 31; i >= 0; --i) { + uint32_t s = r + (1 << i); + if ((uint64_t)s * s <= x) + r = s; } + return r; +} + +static inline double +_TRUNC(uint64_t x) +{ + return x / 1000 / 1000.; +} +#define _FMT ".3lf" +#define _UNIT BENCH_UNIT6 + +#define BENCH_CODE_1(RUNS) \ + { \ + const size_t count = (RUNS); \ + if (!count) \ + abort(); \ + uint64_t cycles, cycles1, cycles2; \ + uint64_t cycles_list[count]; \ + cycles = 0; \ + for (size_t i = 0; i < count; ++i) { \ + cycles1 = cpucycles(); + +#define BENCH_CODE_2(name) \ + cycles2 = cpucycles(); \ + cycles_list[i] = cycles2 - cycles1; \ + cycles += cycles2 - cycles1; \ + } \ + qsort(cycles_list, count, sizeof(uint64_t), CMPFUNC); \ + uint64_t variance = 0; \ + for (size_t i = 0; i < count; ++i) { \ + int64_t off = cycles_list[i] - cycles / count; \ + variance += off * off; \ + } \ + variance /= count; \ + printf(" %-10s", name); \ + printf(" | average %9" _FMT " | stddev %9" _FMT, \ + _TRUNC(cycles / count), \ + _TRUNC(ISQRT(variance))); \ + printf(" | median %9" _FMT " | min %9" _FMT " | max %9" _FMT, \ + _TRUNC(cycles_list[count / 2]), \ + _TRUNC(cycles_list[0]), \ + _TRUNC(cycles_list[count - 1])); \ + printf(" (%s)\n", _UNIT); \ + } + +#endif diff --git a/src/common/generic/include/bench_macos.h b/src/common/generic/include/bench_macos.h new file mode 100644 index 0000000..0494fc8 --- /dev/null +++ b/src/common/generic/include/bench_macos.h @@ -0,0 +1,143 @@ +// WARNING: must be run as root on an M1 device +// WARNING: fragile, uses private apple APIs +// currently no command line interface, see variables at top of main + +/* +no warranty; use at your own risk - i believe this code needs +some minor changes to work on some later hardware and/or software revisions, +which is unsurprising given the use of undocumented, private APIs. +------------------------------------------------------------------------------ +This code is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2020 Dougall Johnson +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ + +/* + Based on https://github.com/travisdowns/robsize + Henry Wong + http://blog.stuffedcow.net/2013/05/measuring-rob-capacity/ + 2014-10-14 +*/ + +#include +#include +#include +#include + +#define KPERF_LIST \ + /* ret, name, params */ \ + F(int, kpc_force_all_ctrs_set, int) \ + F(int, kpc_set_counting, uint32_t) \ + F(int, kpc_set_thread_counting, uint32_t) \ + F(int, kpc_set_config, uint32_t, void *) \ + F(int, kpc_get_thread_counters, int, unsigned int, void *) + +#define F(ret, name, ...) \ + typedef ret name##proc(__VA_ARGS__); \ + static name##proc *name; +KPERF_LIST +#undef F + +#define CFGWORD_EL0A64EN_MASK (0x20000) + +#define CPMU_CORE_CYCLE 0x02 + +#define KPC_CLASS_FIXED (0) +#define KPC_CLASS_CONFIGURABLE (1) + +#define COUNTERS_COUNT 10 +#define KPC_MASK ((1u << KPC_CLASS_CONFIGURABLE) | (1u << KPC_CLASS_FIXED)) +static uint64_t g_config[COUNTERS_COUNT]; +static uint64_t g_counters[COUNTERS_COUNT]; + +static void +macos_configure_rdtsc() +{ + if (kpc_force_all_ctrs_set(1)) { + printf("kpc_force_all_ctrs_set failed\n"); + return; + } + + if (kpc_set_config(KPC_MASK, g_config)) { + printf("kpc_set_config failed\n"); + return; + } + + if (kpc_set_counting(KPC_MASK)) { + printf("kpc_set_counting failed\n"); + return; + } + + if (kpc_set_thread_counting(KPC_MASK)) { + printf("kpc_set_thread_counting failed\n"); + return; + } +} + +static void +macos_init_rdtsc() +{ + void *kperf = + dlopen("/System/Library/PrivateFrameworks/kperf.framework/Versions/A/kperf", RTLD_LAZY); + if (!kperf) { + printf("kperf = %p\n", kperf); + return; + } +#define F(ret, name, ...) \ + name = (name##proc *)(intptr_t)(dlsym(kperf, #name)); \ + if (!name) { \ + printf("%s = %p\n", #name, (void *)(intptr_t)name); \ + return; \ + } + KPERF_LIST +#undef F + + g_config[0] = CPMU_CORE_CYCLE | CFGWORD_EL0A64EN_MASK; + + macos_configure_rdtsc(); +} + +static uint64_t +macos_rdtsc(void) +{ + if (kpc_get_thread_counters(0, COUNTERS_COUNT, g_counters)) { + printf("kpc_get_thread_counters failed\n"); + return 1; + } + return g_counters[2]; +} diff --git a/src/common/generic/include/bench_test_arguments.h b/src/common/generic/include/bench_test_arguments.h new file mode 100644 index 0000000..17506f1 --- /dev/null +++ b/src/common/generic/include/bench_test_arguments.h @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: Apache-2.0 +#ifndef BENCH_TEST_ARGUMENTS_H__ +#define BENCH_TEST_ARGUMENTS_H__ + +#include +#include +#include + +static int parse_seed(const char *arg, uint32_t *seed) +{ + if (sscanf(arg, "--seed=%u", &seed[0]) == 1) + return 0; + + if (sscanf(arg, "--seed={ " + "0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", " + "0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 ", 0x%" PRIx32 " }", + &seed[0], &seed[1], &seed[2], &seed[3], &seed[4], &seed[5], + &seed[6], &seed[7], &seed[8], &seed[9], &seed[10], &seed[11]) == 12) + return 0; + + return 1; +} + +static void print_seed(const uint32_t *seed) +{ + printf("Random seed: \"--seed={ "); + for (int i = 0; i < 12; i++) { + printf("0x%08x%s", seed[i], (i < 11) ? ", " : " }\"\n"); + } +} + +#endif \ No newline at end of file diff --git a/src/common/generic/include/fips202.h b/src/common/generic/include/fips202.h index 9f95427..c29ebd8 100644 --- a/src/common/generic/include/fips202.h +++ b/src/common/generic/include/fips202.h @@ -4,8 +4,168 @@ #define FIPS202_H #include +#include -int SHAKE128(unsigned char *output, size_t outputByteLen, const unsigned char *input, size_t inputByteLen); -int SHAKE256(unsigned char *output, size_t outputByteLen, const unsigned char *input, size_t inputByteLen); +#define SHAKE128_RATE 168 +#define SHAKE256_RATE 136 +#define SHA3_256_RATE 136 +#define SHA3_384_RATE 104 +#define SHA3_512_RATE 72 + +#define PQC_SHAKEINCCTX_U64WORDS 26 +#define PQC_SHAKECTX_U64WORDS 25 + +#define PQC_SHAKEINCCTX_BYTES (sizeof(uint64_t) * 26) +#define PQC_SHAKECTX_BYTES (sizeof(uint64_t) * 25) + +// Context for incremental API +typedef struct { + uint64_t ctx[PQC_SHAKEINCCTX_U64WORDS]; +} shake128incctx; + +// Context for non-incremental API +typedef struct { + uint64_t ctx[PQC_SHAKECTX_U64WORDS]; +} shake128ctx; + +// Context for incremental API +typedef struct { + uint64_t ctx[PQC_SHAKEINCCTX_U64WORDS]; +} shake256incctx; + +// Context for non-incremental API +typedef struct { + uint64_t ctx[PQC_SHAKECTX_U64WORDS]; +} shake256ctx; + +// Context for incremental API +typedef struct { + uint64_t ctx[PQC_SHAKEINCCTX_U64WORDS]; +} sha3_256incctx; + +// Context for incremental API +typedef struct { + uint64_t ctx[PQC_SHAKEINCCTX_U64WORDS]; +} sha3_384incctx; + +// Context for incremental API +typedef struct { + uint64_t ctx[PQC_SHAKEINCCTX_U64WORDS]; +} sha3_512incctx; + +/* Initialize the state and absorb the provided input. + * + * This function does not support being called multiple times + * with the same state. + */ +void shake128_absorb(shake128ctx *state, const uint8_t *input, size_t inlen); +/* Squeeze output out of the sponge. + * + * Supports being called multiple times + */ +void shake128_squeezeblocks(uint8_t *output, size_t nblocks, shake128ctx *state); +/* Free the state */ +void shake128_ctx_release(shake128ctx *state); +/* Copy the state. */ +void shake128_ctx_clone(shake128ctx *dest, const shake128ctx *src); + +/* Initialize incremental hashing API */ +void shake128_inc_init(shake128incctx *state); +/* Absorb more information into the XOF. + * + * Can be called multiple times. + */ +void shake128_inc_absorb(shake128incctx *state, const uint8_t *input, size_t inlen); +/* Finalize the XOF for squeezing */ +void shake128_inc_finalize(shake128incctx *state); +/* Squeeze output out of the sponge. + * + * Supports being called multiple times + */ +void shake128_inc_squeeze(uint8_t *output, size_t outlen, shake128incctx *state); +/* Copy the context of the SHAKE128 XOF */ +void shake128_inc_ctx_clone(shake128incctx *dest, const shake128incctx *src); +/* Free the context of the SHAKE128 XOF */ +void shake128_inc_ctx_release(shake128incctx *state); + +/* Initialize the state and absorb the provided input. + * + * This function does not support being called multiple times + * with the same state. + */ +void shake256_absorb(shake256ctx *state, const uint8_t *input, size_t inlen); +/* Squeeze output out of the sponge. + * + * Supports being called multiple times + */ +void shake256_squeezeblocks(uint8_t *output, size_t nblocks, shake256ctx *state); +/* Free the context held by this XOF */ +void shake256_ctx_release(shake256ctx *state); +/* Copy the context held by this XOF */ +void shake256_ctx_clone(shake256ctx *dest, const shake256ctx *src); + +/* Initialize incremental hashing API */ +void shake256_inc_init(shake256incctx *state); +void shake256_inc_absorb(shake256incctx *state, const uint8_t *input, size_t inlen); +/* Prepares for squeeze phase */ +void shake256_inc_finalize(shake256incctx *state); +/* Squeeze output out of the sponge. + * + * Supports being called multiple times + */ +void shake256_inc_squeeze(uint8_t *output, size_t outlen, shake256incctx *state); +/* Copy the state */ +void shake256_inc_ctx_clone(shake256incctx *dest, const shake256incctx *src); +/* Free the state */ +void shake256_inc_ctx_release(shake256incctx *state); + +/* One-stop SHAKE128 call */ +void shake128(uint8_t *output, size_t outlen, + const uint8_t *input, size_t inlen); + +/* One-stop SHAKE256 call */ +void shake256(uint8_t *output, size_t outlen, + const uint8_t *input, size_t inlen); + +/* Initialize the incremental hashing state */ +void sha3_256_inc_init(sha3_256incctx *state); +/* Absorb blocks into SHA3 */ +void sha3_256_inc_absorb(sha3_256incctx *state, const uint8_t *input, size_t inlen); +/* Obtain the output of the function and free `state` */ +void sha3_256_inc_finalize(uint8_t *output, sha3_256incctx *state); +/* Copy the context */ +void sha3_256_inc_ctx_clone(sha3_256incctx *dest, const sha3_256incctx *src); +/* Release the state, don't use if `_finalize` has been used */ +void sha3_256_inc_ctx_release(sha3_256incctx *state); + +void sha3_256(uint8_t *output, const uint8_t *input, size_t inlen); + +/* Initialize the incremental hashing state */ +void sha3_384_inc_init(sha3_384incctx *state); +/* Absorb blocks into SHA3 */ +void sha3_384_inc_absorb(sha3_384incctx *state, const uint8_t *input, size_t inlen); +/* Obtain the output of the function and free `state` */ +void sha3_384_inc_finalize(uint8_t *output, sha3_384incctx *state); +/* Copy the context */ +void sha3_384_inc_ctx_clone(sha3_384incctx *dest, const sha3_384incctx *src); +/* Release the state, don't use if `_finalize` has been used */ +void sha3_384_inc_ctx_release(sha3_384incctx *state); + +/* One-stop SHA3-384 shop */ +void sha3_384(uint8_t *output, const uint8_t *input, size_t inlen); + +/* Initialize the incremental hashing state */ +void sha3_512_inc_init(sha3_512incctx *state); +/* Absorb blocks into SHA3 */ +void sha3_512_inc_absorb(sha3_512incctx *state, const uint8_t *input, size_t inlen); +/* Obtain the output of the function and free `state` */ +void sha3_512_inc_finalize(uint8_t *output, sha3_512incctx *state); +/* Copy the context */ +void sha3_512_inc_ctx_clone(sha3_512incctx *dest, const sha3_512incctx *src); +/* Release the state, don't use if `_finalize` has been used */ +void sha3_512_inc_ctx_release(sha3_512incctx *state); + +/* One-stop SHA3-512 shop */ +void sha3_512(uint8_t *output, const uint8_t *input, size_t inlen); #endif diff --git a/src/common/generic/include/tools.h b/src/common/generic/include/tools.h new file mode 100644 index 0000000..5a6a505 --- /dev/null +++ b/src/common/generic/include/tools.h @@ -0,0 +1,49 @@ + +#ifndef TOOLS_H +#define TOOLS_H + +#include + +// Debug printing: +// https://stackoverflow.com/questions/1644868/define-macro-for-debug-printing-in-c +#ifndef NDEBUG +#define DEBUG_PRINT 1 +#else +#define DEBUG_PRINT 0 +#endif + +#ifndef __FILE_NAME__ +#define __FILE_NAME__ "NA" +#endif + +#ifndef __LINE__ +#define __LINE__ 0 +#endif + +#ifndef __func__ +#define __func__ "NA" +#endif + +#define debug_print(fmt) \ + do { \ + if (DEBUG_PRINT) \ + printf("warning: %s, file %s, line %d, function %s().\n", \ + fmt, \ + __FILE_NAME__, \ + __LINE__, \ + __func__); \ + } while (0) + + +clock_t tic(void); +float tac(void); /* time in ms since last tic */ +float TAC(const char *str); /* same, but prints it with label 'str' */ +float toc(const clock_t t); /* time in ms since t */ +float TOC(const clock_t t, const char *str); /* same, but prints it with label 'str' */ +float TOC_clock(const clock_t t, const char *str); + +clock_t dclock(const clock_t t); // return the clock cycle diff between now and t +float clock_to_time(const clock_t t, + const char *str); // convert the number of clock cycles t to time +float clock_print(const clock_t t, const char *str); +#endif diff --git a/src/common/generic/include/tutil.h b/src/common/generic/include/tutil.h index 6cf7de6..59f1620 100644 --- a/src/common/generic/include/tutil.h +++ b/src/common/generic/include/tutil.h @@ -5,24 +5,27 @@ #include #if defined(__GNUC__) || defined(__clang__) +#define BSWAP16(i) __builtin_bswap16((i)) #define BSWAP32(i) __builtin_bswap32((i)) #define BSWAP64(i) __builtin_bswap64((i)) +#define UNUSED __attribute__((unused)) #else -#define BSWAP32(i) ((((i) >> 24) & 0xff) | (((i) >> 8) & 0xff00) | (((i) & 0xff00) << 8) | ((i) << 24)) +#define BSWAP16(i) ((((i) >> 8) & 0xff) | (((i) & 0xff00) << 8)) +#define BSWAP32(i) \ + ((((i) >> 24) & 0xff) | (((i) >> 8) & 0xff00) | (((i) & 0xff00) << 8) | ((i) << 24)) #define BSWAP64(i) ((BSWAP32((i) >> 32) & 0xffffffff) | (BSWAP32(i) << 32) +#define UNUSED #endif #if defined(RADIX_64) #define digit_t uint64_t #define sdigit_t int64_t -#define DIGIT_LEN 8 #define RADIX 64 #define LOG2RADIX 6 #define BSWAP_DIGIT(i) BSWAP64(i) #elif defined(RADIX_32) #define digit_t uint32_t #define sdigit_t int32_t -#define DIGIT_LEN 4 #define RADIX 32 #define LOG2RADIX 5 #define BSWAP_DIGIT(i) BSWAP32(i) diff --git a/src/common/generic/mem.c b/src/common/generic/mem.c index 891a4bb..4956bed 100644 --- a/src/common/generic/mem.c +++ b/src/common/generic/mem.c @@ -1,9 +1,12 @@ // SPDX-License-Identifier: Apache-2.0 +#include #include #include -void sqisign_secure_free(void *mem, size_t size) { +void +sqisign_secure_free(void *mem, size_t size) +{ if (mem) { typedef void *(*memset_t)(void *, int, size_t); static volatile memset_t memset_func = memset; @@ -11,7 +14,9 @@ void sqisign_secure_free(void *mem, size_t size) { free(mem); } } -void sqisign_secure_clear(void *mem, size_t size) { +void +sqisign_secure_clear(void *mem, size_t size) +{ typedef void *(*memset_t)(void *, int, size_t); static volatile memset_t memset_func = memset; memset_func(mem, 0, size); diff --git a/src/common/generic/randombytes_ctrdrbg.c b/src/common/generic/randombytes_ctrdrbg.c deleted file mode 100644 index 681933e..0000000 --- a/src/common/generic/randombytes_ctrdrbg.c +++ /dev/null @@ -1,140 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 and Unknown -// -/* -NIST-developed software is provided by NIST as a public service. You may use, copy, and distribute copies of the software in any medium, provided that you keep intact this entire notice. You may improve, modify, and create derivative works of the software or any portion of the software, and you may copy and distribute such modifications or works. Modified works should carry a notice stating that you changed the software and should note the date and nature of any such change. Please explicitly acknowledge the National Institute of Standards and Technology as the source of the software. - -NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR USEFULNESS OF THE SOFTWARE. - -You are solely responsible for determining the appropriateness of using and distributing the software and you assume all risks associated with its use, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and the unavailability or interruption of operation. This software is not intended to be used in any situation where a failure could cause risk of injury or damage to property. The software developed by NIST employees is not subject to copyright protection within the United States. -*/ - -#include - -#include - -#ifdef ENABLE_CT_TESTING -#include -#endif - -#define RNG_SUCCESS 0 -#define RNG_BAD_MAXLEN -1 -#define RNG_BAD_OUTBUF -2 -#define RNG_BAD_REQ_LEN -3 - -static __inline void AES256_ECB(unsigned char *key, unsigned char *ctr, unsigned char *buffer) { - AES_ECB_encrypt(ctr, key, buffer); -} - -typedef struct { - unsigned char buffer[16]; - int buffer_pos; - unsigned long length_remaining; - unsigned char key[32]; - unsigned char ctr[16]; -} AES_XOF_struct; - -typedef struct { - unsigned char Key[32]; - unsigned char V[16]; - int reseed_counter; -} AES256_CTR_DRBG_struct; - - -void -AES256_CTR_DRBG_Update(unsigned char *provided_data, - unsigned char *Key, - unsigned char *V); - -AES256_CTR_DRBG_struct DRBG_ctx; - -static void -randombytes_init_nist(unsigned char *entropy_input, - unsigned char *personalization_string, - int security_strength) { - unsigned char seed_material[48]; - - (void)security_strength; // Unused parameter - memcpy(seed_material, entropy_input, 48); - if (personalization_string) - for (int i = 0; i < 48; i++) { - seed_material[i] ^= personalization_string[i]; - } - memset(DRBG_ctx.Key, 0x00, 32); - memset(DRBG_ctx.V, 0x00, 16); - AES256_CTR_DRBG_Update(seed_material, DRBG_ctx.Key, DRBG_ctx.V); - DRBG_ctx.reseed_counter = 1; -} - -static int -randombytes_nist(unsigned char *x, size_t xlen) { - unsigned char block[16]; - size_t i = 0; - - while ( xlen > 0 ) { - //increment V - for (int j = 15; j >= 0; j--) { - if ( DRBG_ctx.V[j] == 0xff ) { - DRBG_ctx.V[j] = 0x00; - } else { - DRBG_ctx.V[j]++; - break; - } - } - AES256_ECB(DRBG_ctx.Key, DRBG_ctx.V, block); - if ( xlen > 15 ) { - memcpy(x + i, block, 16); - i += 16; - xlen -= 16; - } else { - memcpy(x + i, block, xlen); - i += xlen; - xlen = 0; - } - } - AES256_CTR_DRBG_Update(NULL, DRBG_ctx.Key, DRBG_ctx.V); - DRBG_ctx.reseed_counter++; - - return 0; -} - -void -AES256_CTR_DRBG_Update(unsigned char *provided_data, - unsigned char *Key, - unsigned char *V) { - unsigned char temp[48]; - - for (int i = 0; i < 3; i++) { - //increment V - for (int j = 15; j >= 0; j--) { - if ( V[j] == 0xff ) { - V[j] = 0x00; - } else { - V[j]++; - break; - } - } - - AES256_ECB(Key, V, temp + 16 * i); - } - if ( provided_data != NULL ) - for (int i = 0; i < 48; i++) { - temp[i] ^= provided_data[i]; - } - memcpy(Key, temp, 32); - memcpy(V, temp + 32, 16); -} - -int randombytes(unsigned char *random_array, unsigned long long nbytes) { - int ret = randombytes_nist(random_array, nbytes); -#ifdef ENABLE_CT_TESTING - VALGRIND_MAKE_MEM_UNDEFINED(random_array, ret); -#endif - return ret; -} - -void -randombytes_init(unsigned char *entropy_input, - unsigned char *personalization_string, - int security_strength) { - return randombytes_init_nist(entropy_input, personalization_string, security_strength); -} diff --git a/src/common/generic/randombytes_system.c b/src/common/generic/randombytes_system.c index 7d17b68..689c29b 100644 --- a/src/common/generic/randombytes_system.c +++ b/src/common/generic/randombytes_system.c @@ -20,6 +20,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include + #ifdef ENABLE_CT_TESTING #include #endif @@ -28,14 +30,14 @@ THE SOFTWARE. // *before* randombytes.h is included. Otherwise SYS_getrandom will not be // declared. #if defined(__linux__) || defined(__GNU__) -# define _GNU_SOURCE +#define _GNU_SOURCE #endif /* defined(__linux__) || defined(__GNU__) */ #if defined(_WIN32) /* Windows */ -# include -# include /* CryptAcquireContext, CryptGenRandom */ -#endif /* defined(_WIN32) */ +#include +#include /* CryptAcquireContext, CryptGenRandom */ +#endif /* defined(_WIN32) */ /* wasi */ #if defined(__wasi__) @@ -44,7 +46,7 @@ THE SOFTWARE. /* kFreeBSD */ #if defined(__FreeBSD_kernel__) && defined(__GLIBC__) -# define GNU_KFREEBSD +#define GNU_KFREEBSD #endif #if defined(__linux__) || defined(__GNU__) || defined(GNU_KFREEBSD) @@ -53,344 +55,377 @@ THE SOFTWARE. // to the linux headers. We only need RNDGETENTCNT, so we instead inline it. // RNDGETENTCNT is originally defined in `include/uapi/linux/random.h` in the // linux repo. -# define RNDGETENTCNT 0x80045200 +#define RNDGETENTCNT 0x80045200 -# include -# include -# include -# include -# include -# include -# include -# if (defined(__linux__) || defined(__GNU__)) && defined(__GLIBC__) && ((__GLIBC__ > 2) || (__GLIBC_MINOR__ > 24)) -# define USE_GLIBC -# include -# endif /* (defined(__linux__) || defined(__GNU__)) && defined(__GLIBC__) && ((__GLIBC__ > 2) || (__GLIBC_MINOR__ > 24)) */ -# include -# include -# include -# include +#include +#include +#include +#include +#include +#include +#include +#if (defined(__linux__) || defined(__GNU__)) && defined(__GLIBC__) && \ + ((__GLIBC__ > 2) || (__GLIBC_MINOR__ > 24)) +#define USE_GLIBC +#include +#endif /* (defined(__linux__) || defined(__GNU__)) && defined(__GLIBC__) && ((__GLIBC__ > 2) || \ + (__GLIBC_MINOR__ > 24)) */ +#include +#include +#include +#include // We need SSIZE_MAX as the maximum read len from /dev/urandom -# if !defined(SSIZE_MAX) -# define SSIZE_MAX (SIZE_MAX / 2 - 1) -# endif /* defined(SSIZE_MAX) */ +#if !defined(SSIZE_MAX) +#define SSIZE_MAX (SIZE_MAX / 2 - 1) +#endif /* defined(SSIZE_MAX) */ #endif /* defined(__linux__) || defined(__GNU__) || defined(GNU_KFREEBSD) */ - #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) /* Dragonfly, FreeBSD, NetBSD, OpenBSD (has arc4random) */ -# include -# if defined(BSD) -# include -# endif +#include +#if defined(BSD) +#include +#endif /* GNU/Hurd defines BSD in sys/param.h which causes problems later */ -# if defined(__GNU__) -# undef BSD -# endif +#if defined(__GNU__) +#undef BSD +#endif #endif #if defined(__EMSCRIPTEN__) -# include -# include -# include -# include +#include +#include +#include +#include #endif /* defined(__EMSCRIPTEN__) */ - #if defined(_WIN32) -static int randombytes_win32_randombytes(void* buf, size_t n) +static int +randombytes_win32_randombytes(void *buf, size_t n) { - HCRYPTPROV ctx; - BOOL tmp; - DWORD to_read = 0; - const size_t MAX_DWORD = 0xFFFFFFFF; + HCRYPTPROV ctx; + BOOL tmp; + DWORD to_read = 0; + const size_t MAX_DWORD = 0xFFFFFFFF; - tmp = CryptAcquireContext(&ctx, NULL, NULL, PROV_RSA_FULL, - CRYPT_VERIFYCONTEXT); - if (tmp == FALSE) return -1; + tmp = CryptAcquireContext(&ctx, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); + if (tmp == FALSE) + return -1; - while (n > 0) { - to_read = (DWORD)(n < MAX_DWORD ? n : MAX_DWORD); - tmp = CryptGenRandom(ctx, to_read, (BYTE*) buf); - if (tmp == FALSE) return -1; - buf = ((char*)buf) + to_read; - n -= to_read; - } + while (n > 0) { + to_read = (DWORD)(n < MAX_DWORD ? n : MAX_DWORD); + tmp = CryptGenRandom(ctx, to_read, (BYTE *)buf); + if (tmp == FALSE) + return -1; + buf = ((char *)buf) + to_read; + n -= to_read; + } - tmp = CryptReleaseContext(ctx, 0); - if (tmp == FALSE) return -1; + tmp = CryptReleaseContext(ctx, 0); + if (tmp == FALSE) + return -1; - return 0; + return 0; } #endif /* defined(_WIN32) */ #if defined(__wasi__) -static int randombytes_wasi_randombytes(void *buf, size_t n) { - arc4random_buf(buf, n); - return 0; +static int +randombytes_wasi_randombytes(void *buf, size_t n) +{ + arc4random_buf(buf, n); + return 0; } #endif /* defined(__wasi__) */ #if (defined(__linux__) || defined(__GNU__)) && (defined(USE_GLIBC) || defined(SYS_getrandom)) -# if defined(USE_GLIBC) +#if defined(USE_GLIBC) // getrandom is declared in glibc. -# elif defined(SYS_getrandom) -static ssize_t getrandom(void *buf, size_t buflen, unsigned int flags) { - return syscall(SYS_getrandom, buf, buflen, flags); -} -# endif - -static int randombytes_linux_randombytes_getrandom(void *buf, size_t n) +#elif defined(SYS_getrandom) +static ssize_t +getrandom(void *buf, size_t buflen, unsigned int flags) { - /* I have thought about using a separate PRF, seeded by getrandom, but - * it turns out that the performance of getrandom is good enough - * (250 MB/s on my laptop). - */ - size_t offset = 0, chunk; - int ret; - while (n > 0) { - /* getrandom does not allow chunks larger than 33554431 */ - chunk = n <= 33554431 ? n : 33554431; - do { - ret = getrandom((char *)buf + offset, chunk, 0); - } while (ret == -1 && errno == EINTR); - if (ret < 0) return ret; - offset += ret; - n -= ret; - } - assert(n == 0); - return 0; + return syscall(SYS_getrandom, buf, buflen, flags); } -#endif /* (defined(__linux__) || defined(__GNU__)) && (defined(USE_GLIBC) || defined(SYS_getrandom)) */ +#endif + +static int +randombytes_linux_randombytes_getrandom(void *buf, size_t n) +{ + /* I have thought about using a separate PRF, seeded by getrandom, but + * it turns out that the performance of getrandom is good enough + * (250 MB/s on my laptop). + */ + size_t offset = 0, chunk; + int ret; + while (n > 0) { + /* getrandom does not allow chunks larger than 33554431 */ + chunk = n <= 33554431 ? n : 33554431; + do { + ret = getrandom((char *)buf + offset, chunk, 0); + } while (ret == -1 && errno == EINTR); + if (ret < 0) + return ret; + offset += ret; + n -= ret; + } + assert(n == 0); + return 0; +} +#endif /* (defined(__linux__) || defined(__GNU__)) && (defined(USE_GLIBC) || \ + defined(SYS_getrandom)) */ #if (defined(__linux__) || defined(GNU_KFREEBSD)) && !defined(SYS_getrandom) -# if defined(__linux__) -static int randombytes_linux_read_entropy_ioctl(int device, int *entropy) +#if defined(__linux__) +static int +randombytes_linux_read_entropy_ioctl(int device, int *entropy) { - return ioctl(device, RNDGETENTCNT, entropy); + return ioctl(device, RNDGETENTCNT, entropy); } -static int randombytes_linux_read_entropy_proc(FILE *stream, int *entropy) +static int +randombytes_linux_read_entropy_proc(FILE *stream, int *entropy) { - int retcode; - do { - rewind(stream); - retcode = fscanf(stream, "%d", entropy); - } while (retcode != 1 && errno == EINTR); - if (retcode != 1) { - return -1; - } - return 0; + int retcode; + do { + rewind(stream); + retcode = fscanf(stream, "%d", entropy); + } while (retcode != 1 && errno == EINTR); + if (retcode != 1) { + return -1; + } + return 0; } -static int randombytes_linux_wait_for_entropy(int device) +static int +randombytes_linux_wait_for_entropy(int device) { - /* We will block on /dev/random, because any increase in the OS' entropy - * level will unblock the request. I use poll here (as does libsodium), - * because we don't *actually* want to read from the device. */ - enum { IOCTL, PROC } strategy = IOCTL; - const int bits = 128; - struct pollfd pfd; - int fd; - FILE *proc_file; - int retcode, retcode_error = 0; // Used as return codes throughout this function - int entropy = 0; + /* We will block on /dev/random, because any increase in the OS' entropy + * level will unblock the request. I use poll here (as does libsodium), + * because we don't *actually* want to read from the device. */ + enum + { + IOCTL, + PROC + } strategy = IOCTL; + const int bits = 128; + struct pollfd pfd; + int fd; + FILE *proc_file; + int retcode, retcode_error = 0; // Used as return codes throughout this function + int entropy = 0; - /* If the device has enough entropy already, we will want to return early */ - retcode = randombytes_linux_read_entropy_ioctl(device, &entropy); - // printf("errno: %d (%s)\n", errno, strerror(errno)); - if (retcode != 0 && (errno == ENOTTY || errno == ENOSYS)) { - // The ioctl call on /dev/urandom has failed due to a - // - ENOTTY (unsupported action), or - // - ENOSYS (invalid ioctl; this happens on MIPS, see #22). - // - // We will fall back to reading from - // `/proc/sys/kernel/random/entropy_avail`. This less ideal, - // because it allocates a file descriptor, and it may not work - // in a chroot. But at this point it seems we have no better - // options left. - strategy = PROC; - // Open the entropy count file - proc_file = fopen("/proc/sys/kernel/random/entropy_avail", "r"); - if (proc_file == NULL) { - return -1; - } - } else if (retcode != 0) { - // Unrecoverable ioctl error - return -1; - } - if (entropy >= bits) { - return 0; - } + /* If the device has enough entropy already, we will want to return early */ + retcode = randombytes_linux_read_entropy_ioctl(device, &entropy); + // printf("errno: %d (%s)\n", errno, strerror(errno)); + if (retcode != 0 && (errno == ENOTTY || errno == ENOSYS)) { + // The ioctl call on /dev/urandom has failed due to a + // - ENOTTY (unsupported action), or + // - ENOSYS (invalid ioctl; this happens on MIPS, see #22). + // + // We will fall back to reading from + // `/proc/sys/kernel/random/entropy_avail`. This less ideal, + // because it allocates a file descriptor, and it may not work + // in a chroot. But at this point it seems we have no better + // options left. + strategy = PROC; + // Open the entropy count file + proc_file = fopen("/proc/sys/kernel/random/entropy_avail", "r"); + if (proc_file == NULL) { + return -1; + } + } else if (retcode != 0) { + // Unrecoverable ioctl error + return -1; + } + if (entropy >= bits) { + return 0; + } - do { - fd = open("/dev/random", O_RDONLY); - } while (fd == -1 && errno == EINTR); /* EAGAIN will not occur */ - if (fd == -1) { - /* Unrecoverable IO error */ - return -1; - } + do { + fd = open("/dev/random", O_RDONLY); + } while (fd == -1 && errno == EINTR); /* EAGAIN will not occur */ + if (fd == -1) { + /* Unrecoverable IO error */ + return -1; + } - pfd.fd = fd; - pfd.events = POLLIN; - for (;;) { - retcode = poll(&pfd, 1, -1); - if (retcode == -1 && (errno == EINTR || errno == EAGAIN)) { - continue; - } else if (retcode == 1) { - if (strategy == IOCTL) { - retcode = randombytes_linux_read_entropy_ioctl(device, &entropy); - } else if (strategy == PROC) { - retcode = randombytes_linux_read_entropy_proc(proc_file, &entropy); - } else { - return -1; // Unreachable - } + pfd.fd = fd; + pfd.events = POLLIN; + for (;;) { + retcode = poll(&pfd, 1, -1); + if (retcode == -1 && (errno == EINTR || errno == EAGAIN)) { + continue; + } else if (retcode == 1) { + if (strategy == IOCTL) { + retcode = randombytes_linux_read_entropy_ioctl(device, &entropy); + } else if (strategy == PROC) { + retcode = randombytes_linux_read_entropy_proc(proc_file, &entropy); + } else { + return -1; // Unreachable + } - if (retcode != 0) { - // Unrecoverable I/O error - retcode_error = retcode; - break; - } - if (entropy >= bits) { - break; - } - } else { - // Unreachable: poll() should only return -1 or 1 - retcode_error = -1; - break; - } - } - do { - retcode = close(fd); - } while (retcode == -1 && errno == EINTR); - if (strategy == PROC) { - do { - retcode = fclose(proc_file); - } while (retcode == -1 && errno == EINTR); - } - if (retcode_error != 0) { - return retcode_error; - } - return retcode; + if (retcode != 0) { + // Unrecoverable I/O error + retcode_error = retcode; + break; + } + if (entropy >= bits) { + break; + } + } else { + // Unreachable: poll() should only return -1 or 1 + retcode_error = -1; + break; + } + } + do { + retcode = close(fd); + } while (retcode == -1 && errno == EINTR); + if (strategy == PROC) { + do { + retcode = fclose(proc_file); + } while (retcode == -1 && errno == EINTR); + } + if (retcode_error != 0) { + return retcode_error; + } + return retcode; } -# endif /* defined(__linux__) */ +#endif /* defined(__linux__) */ - -static int randombytes_linux_randombytes_urandom(void *buf, size_t n) +static int +randombytes_linux_randombytes_urandom(void *buf, size_t n) { - int fd; - size_t offset = 0, count; - ssize_t tmp; - do { - fd = open("/dev/urandom", O_RDONLY); - } while (fd == -1 && errno == EINTR); - if (fd == -1) return -1; -# if defined(__linux__) - if (randombytes_linux_wait_for_entropy(fd) == -1) return -1; -# endif + int fd; + size_t offset = 0, count; + ssize_t tmp; + do { + fd = open("/dev/urandom", O_RDONLY); + } while (fd == -1 && errno == EINTR); + if (fd == -1) + return -1; +#if defined(__linux__) + if (randombytes_linux_wait_for_entropy(fd) == -1) + return -1; +#endif - while (n > 0) { - count = n <= SSIZE_MAX ? n : SSIZE_MAX; - tmp = read(fd, (char *)buf + offset, count); - if (tmp == -1 && (errno == EAGAIN || errno == EINTR)) { - continue; - } - if (tmp == -1) return -1; /* Unrecoverable IO error */ - offset += tmp; - n -= tmp; - } - close(fd); - assert(n == 0); - return 0; + while (n > 0) { + count = n <= SSIZE_MAX ? n : SSIZE_MAX; + tmp = read(fd, (char *)buf + offset, count); + if (tmp == -1 && (errno == EAGAIN || errno == EINTR)) { + continue; + } + if (tmp == -1) + return -1; /* Unrecoverable IO error */ + offset += tmp; + n -= tmp; + } + close(fd); + assert(n == 0); + return 0; } #endif /* defined(__linux__) && !defined(SYS_getrandom) */ - #if defined(BSD) -static int randombytes_bsd_randombytes(void *buf, size_t n) +static int +randombytes_bsd_randombytes(void *buf, size_t n) { - arc4random_buf(buf, n); - return 0; + arc4random_buf(buf, n); + return 0; } #endif /* defined(BSD) */ - #if defined(__EMSCRIPTEN__) -static int randombytes_js_randombytes_nodejs(void *buf, size_t n) { - const int ret = EM_ASM_INT({ - var crypto; - try { - crypto = require('crypto'); - } catch (error) { - return -2; - } - try { - writeArrayToMemory(crypto.randomBytes($1), $0); - return 0; - } catch (error) { - return -1; - } - }, buf, n); - switch (ret) { - case 0: - return 0; - case -1: - errno = EINVAL; - return -1; - case -2: - errno = ENOSYS; - return -1; - } - assert(false); // Unreachable +static int +randombytes_js_randombytes_nodejs(void *buf, size_t n) +{ + const int ret = EM_ASM_INT( + { + var crypto; + try { + crypto = require('crypto'); + } catch (error) { + return -2; + } + try { + writeArrayToMemory(crypto.randomBytes($1), $0); + return 0; + } catch (error) { + return -1; + } + }, + buf, + n); + switch (ret) { + case 0: + return 0; + case -1: + errno = EINVAL; + return -1; + case -2: + errno = ENOSYS; + return -1; + } + assert(false); // Unreachable } #endif /* defined(__EMSCRIPTEN__) */ - -static int randombytes_select(void *buf, size_t n) +SQISIGN_API +int +randombytes_select(unsigned char *buf, unsigned long long n) { #if defined(__EMSCRIPTEN__) - return randombytes_js_randombytes_nodejs(buf, n); + return randombytes_js_randombytes_nodejs(buf, n); #elif defined(__linux__) || defined(__GNU__) || defined(GNU_KFREEBSD) -# if defined(USE_GLIBC) - /* Use getrandom system call */ - return randombytes_linux_randombytes_getrandom(buf, n); -# elif defined(SYS_getrandom) - /* Use getrandom system call */ - return randombytes_linux_randombytes_getrandom(buf, n); -# else - /* When we have enough entropy, we can read from /dev/urandom */ - return randombytes_linux_randombytes_urandom(buf, n); -# endif -#elif defined(BSD) - /* Use arc4random system call */ - return randombytes_bsd_randombytes(buf, n); -#elif defined(_WIN32) - /* Use windows API */ - return randombytes_win32_randombytes(buf, n); -#elif defined(__wasi__) - /* Use WASI */ - return randombytes_wasi_randombytes(buf, n); +#if defined(USE_GLIBC) + /* Use getrandom system call */ + return randombytes_linux_randombytes_getrandom(buf, n); +#elif defined(SYS_getrandom) + /* Use getrandom system call */ + return randombytes_linux_randombytes_getrandom(buf, n); #else -# error "randombytes(...) is not supported on this platform" + /* When we have enough entropy, we can read from /dev/urandom */ + return randombytes_linux_randombytes_urandom(buf, n); +#endif +#elif defined(BSD) + /* Use arc4random system call */ + return randombytes_bsd_randombytes(buf, n); +#elif defined(_WIN32) + /* Use windows API */ + return randombytes_win32_randombytes(buf, n); +#elif defined(__wasi__) + /* Use WASI */ + return randombytes_wasi_randombytes(buf, n); +#else +#error "randombytes(...) is not supported on this platform" #endif } -int randombytes(unsigned char *x, unsigned long long xlen) { +#ifdef RANDOMBYTES_SYSTEM +SQISIGN_API +int +randombytes(unsigned char *x, unsigned long long xlen) +{ - int ret = randombytes_select(x, (size_t) xlen); + int ret = randombytes_select(x, (size_t)xlen); #ifdef ENABLE_CT_TESTING VALGRIND_MAKE_MEM_UNDEFINED(x, xlen); #endif return ret; } -void randombytes_init(unsigned char *entropy_input, - unsigned char *personalization_string, - int security_strength) { - (void) entropy_input; - (void) personalization_string; - (void) security_strength; +SQISIGN_API +void +randombytes_init(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) +{ + (void)entropy_input; + (void)personalization_string; + (void)security_strength; } +#endif diff --git a/src/common/generic/test/bench_ctrdrbg.c b/src/common/generic/test/bench_ctrdrbg.c new file mode 100644 index 0000000..2dab0c2 --- /dev/null +++ b/src/common/generic/test/bench_ctrdrbg.c @@ -0,0 +1,57 @@ +#include +#include +#include + +#include "bench.h" + +#define RANDOMBYTES_MAX_LENGTH 131072 +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +void +randombytes_init_nist(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength); + +int +randombytes_nist(unsigned char *x, size_t xlen); + +void +RANDOMBYTES_INIT_PLATFORM(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength); + +int +RANDOMBYTES_PLATFORM(unsigned char *x, size_t xlen); + +int +randombytes_select(void *buf, size_t n); + +// run all tests in module +int main(int argc, char *argv[]) { +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + printf("Running AES-CTR-DRBG benchmarks\n"); + + unsigned char x[RANDOMBYTES_MAX_LENGTH]; + + cpucycles_init(); + + BENCH_CODE_1(1000 * SQISIGN_TEST_REPS); + RANDOMBYTES_PLATFORM(x, RANDOMBYTES_MAX_LENGTH); + BENCH_CODE_2(STRINGIFY(RANDOMBYTES_PLATFORM)); + + BENCH_CODE_1(SQISIGN_TEST_REPS); + randombytes_nist(x, RANDOMBYTES_MAX_LENGTH); + BENCH_CODE_2("randombytes_nist"); + + BENCH_CODE_1(1000 * SQISIGN_TEST_REPS); + randombytes_select(x, RANDOMBYTES_MAX_LENGTH); + BENCH_CODE_2("randombytes_system"); + + return 0; +} diff --git a/src/common/generic/test/test_ctrdrbg.c b/src/common/generic/test/test_ctrdrbg.c new file mode 100644 index 0000000..7be5f0a --- /dev/null +++ b/src/common/generic/test/test_ctrdrbg.c @@ -0,0 +1,68 @@ +#include +#include +#include + +#define RANDOMBYTES_MAX_LENGTH 131072 +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +void +randombytes_init_nist(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength); + +int +randombytes_nist(unsigned char *x, size_t xlen); + +void +RANDOMBYTES_INIT_PLATFORM(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength); + +int +RANDOMBYTES_PLATFORM(unsigned char *x, size_t xlen); + +int +randombytes_select(void *buf, size_t n); + +// run all tests in module +int main(int argc, char *argv[]) { + int res = 1; + + printf("Running AES-CTR-DRBG unit tests\n"); + + unsigned char seed[48]; + unsigned char x_nist[RANDOMBYTES_MAX_LENGTH], x_platform[RANDOMBYTES_MAX_LENGTH]; + + for (int i = 0; i < 8; i++) { + for (unsigned j = 0; j < sizeof(seed); j++) { + seed[j] = 1 << i; + } + + RANDOMBYTES_INIT_PLATFORM(seed, NULL, 256); + randombytes_init_nist(seed, NULL, 256); + + for (int j = RANDOMBYTES_MAX_LENGTH; j <= RANDOMBYTES_MAX_LENGTH; j *= 2) { + RANDOMBYTES_PLATFORM(x_platform, j); + randombytes_nist(x_nist, j); + + if (memcmp(x_platform, x_nist, j) != 0) { + for (int k = 0; k < j; k++) { + if (x_platform[k] != x_nist[k]) { + printf("Test failed for seed = %d, length = %d bytes: mismatch at index %d: %d != %d\n", i, j, k, x_platform[k], x_nist[k]); + break; + } + } + res = 0; + } + } + } + + if (!res) { + printf("\nSome tests failed!\n"); + } else { + printf("\nAll tests passed!\n"); + } + + return (!res); +} diff --git a/src/common/generic/tools.c b/src/common/generic/tools.c new file mode 100644 index 0000000..242ea08 --- /dev/null +++ b/src/common/generic/tools.c @@ -0,0 +1,75 @@ +#include +#include + +static clock_t global_timer; + +clock_t +tic(void) +{ + global_timer = clock(); + return global_timer; +} + +float +tac(void) +{ + float ms = (1000. * (float)(clock() - global_timer) / CLOCKS_PER_SEC); + return ms; +} + +float +TAC(const char *str) +{ + float ms = (1000. * (float)(clock() - global_timer) / CLOCKS_PER_SEC); +#ifndef NDEBUG + printf("%s [%d ms]\n", str, (int)ms); +#endif + return ms; +} + +float +toc(const clock_t t) +{ + float ms = (1000. * (float)(clock() - t) / CLOCKS_PER_SEC); + return ms; +} + +float +TOC(const clock_t t, const char *str) +{ + float ms = (1000. * (float)(clock() - t) / CLOCKS_PER_SEC); + printf("%s [%d ms]\n", str, (int)ms); + return ms; + // printf("%s [%ld]\n",str,clock()-t); + // return (float) (clock()-t); +} + +float +TOC_clock(const clock_t t, const char *str) +{ + printf("%s [%ld]\n", str, clock() - t); + return (float)(clock() - t); +} + +clock_t +dclock(const clock_t t) +{ + return (clock() - t); +} + +float +clock_to_time(const clock_t t, const char *str) +{ + float ms = (1000. * (float)(t) / CLOCKS_PER_SEC); + printf("%s [%d ms]\n", str, (int)ms); + return ms; + // printf("%s [%ld]\n",str,t); + // return (float) (t); +} + +float +clock_print(const clock_t t, const char *str) +{ + printf("%s [%ld]\n", str, t); + return (float)(t); +} diff --git a/src/common/ref/CMakeLists.txt b/src/common/ref/CMakeLists.txt new file mode 100644 index 0000000..63aa86d --- /dev/null +++ b/src/common/ref/CMakeLists.txt @@ -0,0 +1,10 @@ +set(SOURCE_FILES_COMMON_TEST_REF + randombytes_ctrdrbg.c + aes_c.c +) + +target_sources(sqisign_common_test PRIVATE ${SOURCE_FILES_COMMON_TEST_REF}) +target_include_directories(sqisign_common_test PRIVATE include) +target_compile_definitions(sqisign_common_test PRIVATE RANDOMBYTES_C) + +target_compile_definitions(sqisign_common_sys PRIVATE RANDOMBYTES_SYSTEM) diff --git a/src/common/generic/aes_c.c b/src/common/ref/aes_c.c similarity index 72% rename from src/common/generic/aes_c.c rename to src/common/ref/aes_c.c index 868fcd7..5e2d7d6 100644 --- a/src/common/generic/aes_c.c +++ b/src/common/ref/aes_c.c @@ -39,23 +39,24 @@ #define AESCTR_NONCEBYTES 12 #define AES_BLOCKBYTES 16 -// We've put these states on the heap to make sure ctx_release is used. #define PQC_AES128_STATESIZE 88 -typedef struct { - uint64_t *sk_exp; +typedef struct +{ + uint64_t sk_exp[PQC_AES128_STATESIZE]; } aes128ctx; #define PQC_AES192_STATESIZE 104 -typedef struct { - uint64_t *sk_exp; +typedef struct +{ + uint64_t sk_exp[PQC_AES192_STATESIZE]; } aes192ctx; #define PQC_AES256_STATESIZE 120 -typedef struct { - uint64_t *sk_exp; +typedef struct +{ + uint64_t sk_exp[PQC_AES256_STATESIZE]; } aes256ctx; - /** Initializes the context **/ void aes128_ecb_keyexp(aes128ctx *r, const unsigned char *key); @@ -68,7 +69,6 @@ void aes128_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, cons /** Frees the context **/ void aes128_ctx_release(aes128ctx *r); - /** Initializes the context **/ void aes192_ecb_keyexp(aes192ctx *r, const unsigned char *key); @@ -80,7 +80,6 @@ void aes192_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, cons void aes192_ctx_release(aes192ctx *r); - /** Initializes the context **/ void aes256_ecb_keyexp(aes256ctx *r, const unsigned char *key); @@ -93,46 +92,50 @@ void aes256_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, cons /** Frees the context **/ void aes256_ctx_release(aes256ctx *r); -static inline uint32_t br_dec32le(const unsigned char *src) { - return (uint32_t)src[0] - | ((uint32_t)src[1] << 8) - | ((uint32_t)src[2] << 16) - | ((uint32_t)src[3] << 24); +static inline uint32_t +br_dec32le(const unsigned char *src) +{ + return (uint32_t)src[0] | ((uint32_t)src[1] << 8) | ((uint32_t)src[2] << 16) | + ((uint32_t)src[3] << 24); } - -static void br_range_dec32le(uint32_t *v, size_t num, const unsigned char *src) { +static void +br_range_dec32le(uint32_t *v, size_t num, const unsigned char *src) +{ while (num-- > 0) { - *v ++ = br_dec32le(src); + *v++ = br_dec32le(src); src += 4; } } - -static inline uint32_t br_swap32(uint32_t x) { - x = ((x & (uint32_t)0x00FF00FF) << 8) - | ((x >> 8) & (uint32_t)0x00FF00FF); +static inline uint32_t +br_swap32(uint32_t x) +{ + x = ((x & (uint32_t)0x00FF00FF) << 8) | ((x >> 8) & (uint32_t)0x00FF00FF); return (x << 16) | (x >> 16); } - -static inline void br_enc32le(unsigned char *dst, uint32_t x) { +static inline void +br_enc32le(unsigned char *dst, uint32_t x) +{ dst[0] = (unsigned char)x; dst[1] = (unsigned char)(x >> 8); dst[2] = (unsigned char)(x >> 16); dst[3] = (unsigned char)(x >> 24); } - -static void br_range_enc32le(unsigned char *dst, const uint32_t *v, size_t num) { +static void +br_range_enc32le(unsigned char *dst, const uint32_t *v, size_t num) +{ while (num-- > 0) { - br_enc32le(dst, *v ++); + br_enc32le(dst, *v++); dst += 4; } } - -static void br_aes_ct64_bitslice_Sbox(uint64_t *q) { +static void +br_aes_ct64_bitslice_Sbox(uint64_t *q) +{ /* * This S-box implementation is a straightforward translation of * the circuit described by Boyar and Peralta in "A new @@ -306,18 +309,21 @@ static void br_aes_ct64_bitslice_Sbox(uint64_t *q) { q[0] = s7; } -static void br_aes_ct64_ortho(uint64_t *q) { -#define SWAPN(cl, ch, s, x, y) do { \ - uint64_t a, b; \ - a = (x); \ - b = (y); \ - (x) = (a & (uint64_t)(cl)) | ((b & (uint64_t)(cl)) << (s)); \ - (y) = ((a & (uint64_t)(ch)) >> (s)) | (b & (uint64_t)(ch)); \ +static void +br_aes_ct64_ortho(uint64_t *q) +{ +#define SWAPN(cl, ch, s, x, y) \ + do { \ + uint64_t a, b; \ + a = (x); \ + b = (y); \ + (x) = (a & (uint64_t)(cl)) | ((b & (uint64_t)(cl)) << (s)); \ + (y) = ((a & (uint64_t)(ch)) >> (s)) | (b & (uint64_t)(ch)); \ } while (0) -#define SWAP2(x, y) SWAPN(0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 1, x, y) -#define SWAP4(x, y) SWAPN(0x3333333333333333, 0xCCCCCCCCCCCCCCCC, 2, x, y) -#define SWAP8(x, y) SWAPN(0x0F0F0F0F0F0F0F0F, 0xF0F0F0F0F0F0F0F0, 4, x, y) +#define SWAP2(x, y) SWAPN(0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 1, x, y) +#define SWAP4(x, y) SWAPN(0x3333333333333333, 0xCCCCCCCCCCCCCCCC, 2, x, y) +#define SWAP8(x, y) SWAPN(0x0F0F0F0F0F0F0F0F, 0xF0F0F0F0F0F0F0F0, 4, x, y) SWAP2(q[0], q[1]); SWAP2(q[2], q[3]); @@ -335,8 +341,9 @@ static void br_aes_ct64_ortho(uint64_t *q) { SWAP8(q[3], q[7]); } - -static void br_aes_ct64_interleave_in(uint64_t *q0, uint64_t *q1, const uint32_t *w) { +static void +br_aes_ct64_interleave_in(uint64_t *q0, uint64_t *q1, const uint32_t *w) +{ uint64_t x0, x1, x2, x3; x0 = w[0]; @@ -363,8 +370,9 @@ static void br_aes_ct64_interleave_in(uint64_t *q0, uint64_t *q1, const uint32_t *q1 = x1 | (x3 << 8); } - -static void br_aes_ct64_interleave_out(uint32_t *w, uint64_t q0, uint64_t q1) { +static void +br_aes_ct64_interleave_out(uint32_t *w, uint64_t q0, uint64_t q1) +{ uint64_t x0, x1, x2, x3; x0 = q0 & (uint64_t)0x00FF00FF00FF00FF; @@ -385,11 +393,11 @@ static void br_aes_ct64_interleave_out(uint32_t *w, uint64_t q0, uint64_t q1) { w[3] = (uint32_t)x3 | (uint32_t)(x3 >> 16); } -static const unsigned char Rcon[] = { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36 -}; +static const unsigned char Rcon[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36 }; -static uint32_t sub_word(uint32_t x) { +static uint32_t +sub_word(uint32_t x) +{ uint64_t q[8]; memset(q, 0, sizeof q); @@ -400,7 +408,9 @@ static uint32_t sub_word(uint32_t x) { return (uint32_t)q[0]; } -static void br_aes_ct64_keysched(uint64_t *comp_skey, const unsigned char *key, unsigned int key_len) { +static void +br_aes_ct64_keysched(uint64_t *comp_skey, const unsigned char *key, unsigned int key_len) +{ unsigned int i, j, k, nk, nkf; uint32_t tmp; uint32_t skey[60]; @@ -410,7 +420,7 @@ static void br_aes_ct64_keysched(uint64_t *comp_skey, const unsigned char *key, nkf = ((nrounds + 1) << 2); br_range_dec32le(skey, (key_len >> 2), key); tmp = skey[(key_len >> 2) - 1]; - for (i = nk, j = 0, k = 0; i < nkf; i ++) { + for (i = nk, j = 0, k = 0; i < nkf; i++) { if (j == 0) { tmp = (tmp << 24) | (tmp >> 8); tmp = sub_word(tmp) ^ Rcon[k]; @@ -419,9 +429,9 @@ static void br_aes_ct64_keysched(uint64_t *comp_skey, const unsigned char *key, } tmp ^= skey[i - nk]; skey[i] = tmp; - if (++ j == nk) { + if (++j == nk) { j = 0; - k ++; + k++; } } @@ -437,23 +447,21 @@ static void br_aes_ct64_keysched(uint64_t *comp_skey, const unsigned char *key, q[7] = q[4]; br_aes_ct64_ortho(q); comp_skey[j + 0] = - (q[0] & (uint64_t)0x1111111111111111) - | (q[1] & (uint64_t)0x2222222222222222) - | (q[2] & (uint64_t)0x4444444444444444) - | (q[3] & (uint64_t)0x8888888888888888); + (q[0] & (uint64_t)0x1111111111111111) | (q[1] & (uint64_t)0x2222222222222222) | + (q[2] & (uint64_t)0x4444444444444444) | (q[3] & (uint64_t)0x8888888888888888); comp_skey[j + 1] = - (q[4] & (uint64_t)0x1111111111111111) - | (q[5] & (uint64_t)0x2222222222222222) - | (q[6] & (uint64_t)0x4444444444444444) - | (q[7] & (uint64_t)0x8888888888888888); + (q[4] & (uint64_t)0x1111111111111111) | (q[5] & (uint64_t)0x2222222222222222) | + (q[6] & (uint64_t)0x4444444444444444) | (q[7] & (uint64_t)0x8888888888888888); } } -static void br_aes_ct64_skey_expand(uint64_t *skey, const uint64_t *comp_skey, unsigned int nrounds) { +static void +br_aes_ct64_skey_expand(uint64_t *skey, const uint64_t *comp_skey, unsigned int nrounds) +{ unsigned u, v, n; n = (nrounds + 1) << 1; - for (u = 0, v = 0; u < n; u ++, v += 4) { + for (u = 0, v = 0; u < n; u++, v += 4) { uint64_t x0, x1, x2, x3; x0 = x1 = x2 = x3 = comp_skey[u]; @@ -471,8 +479,9 @@ static void br_aes_ct64_skey_expand(uint64_t *skey, const uint64_t *comp_skey, u } } - -static inline void add_round_key(uint64_t *q, const uint64_t *sk) { +static inline void +add_round_key(uint64_t *q, const uint64_t *sk) +{ q[0] ^= sk[0]; q[1] ^= sk[1]; q[2] ^= sk[2]; @@ -483,28 +492,32 @@ static inline void add_round_key(uint64_t *q, const uint64_t *sk) { q[7] ^= sk[7]; } -static inline void shift_rows(uint64_t *q) { +static inline void +shift_rows(uint64_t *q) +{ int i; - for (i = 0; i < 8; i ++) { + for (i = 0; i < 8; i++) { uint64_t x; x = q[i]; - q[i] = (x & (uint64_t)0x000000000000FFFF) - | ((x & (uint64_t)0x00000000FFF00000) >> 4) - | ((x & (uint64_t)0x00000000000F0000) << 12) - | ((x & (uint64_t)0x0000FF0000000000) >> 8) - | ((x & (uint64_t)0x000000FF00000000) << 8) - | ((x & (uint64_t)0xF000000000000000) >> 12) - | ((x & (uint64_t)0x0FFF000000000000) << 4); + q[i] = + (x & (uint64_t)0x000000000000FFFF) | ((x & (uint64_t)0x00000000FFF00000) >> 4) | + ((x & (uint64_t)0x00000000000F0000) << 12) | ((x & (uint64_t)0x0000FF0000000000) >> 8) | + ((x & (uint64_t)0x000000FF00000000) << 8) | ((x & (uint64_t)0xF000000000000000) >> 12) | + ((x & (uint64_t)0x0FFF000000000000) << 4); } } -static inline uint64_t rotr32(uint64_t x) { +static inline uint64_t +rotr32(uint64_t x) +{ return (x << 32) | (x >> 32); } -static inline void mix_columns(uint64_t *q) { +static inline void +mix_columns(uint64_t *q) +{ uint64_t q0, q1, q2, q3, q4, q5, q6, q7; uint64_t r0, r1, r2, r3, r4, r5, r6, r7; @@ -535,14 +548,19 @@ static inline void mix_columns(uint64_t *q) { q[7] = q6 ^ r6 ^ r7 ^ rotr32(q7 ^ r7); } - -static void inc4_be(uint32_t *x) { +static void +inc4_be(uint32_t *x) +{ uint32_t t = br_swap32(*x) + 4; *x = br_swap32(t); } - -static void aes_ecb4x(unsigned char out[64], const uint32_t ivw[16], const uint64_t *sk_exp, unsigned int nrounds) { +static void +aes_ecb4x(unsigned char out[64], + const uint32_t ivw[16], + const uint64_t *sk_exp, + unsigned int nrounds) +{ uint32_t w[16]; uint64_t q[8]; unsigned int i; @@ -553,7 +571,6 @@ static void aes_ecb4x(unsigned char out[64], const uint32_t ivw[16], const uint6 } br_aes_ct64_ortho(q); - add_round_key(q, sk_exp); for (i = 1; i < nrounds; i++) { br_aes_ct64_bitslice_Sbox(q); @@ -566,14 +583,15 @@ static void aes_ecb4x(unsigned char out[64], const uint32_t ivw[16], const uint6 add_round_key(q, sk_exp + 8 * nrounds); br_aes_ct64_ortho(q); - for (i = 0; i < 4; i ++) { + for (i = 0; i < 4; i++) { br_aes_ct64_interleave_out(w + (i << 2), q[i], q[i + 4]); } br_range_enc32le(out, w, 16); } - -static void aes_ctr4x(unsigned char out[64], uint32_t ivw[16], const uint64_t *sk_exp, unsigned int nrounds) { +static void +aes_ctr4x(unsigned char out[64], uint32_t ivw[16], const uint64_t *sk_exp, unsigned int nrounds) +{ aes_ecb4x(out, ivw, sk_exp, nrounds); /* Increase counter for next 4 blocks */ @@ -583,8 +601,13 @@ static void aes_ctr4x(unsigned char out[64], uint32_t ivw[16], const uint64_t *s inc4_be(ivw + 15); } - -static void aes_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const uint64_t *rkeys, unsigned int nrounds) { +static void +aes_ecb(unsigned char *out, + const unsigned char *in, + size_t nblocks, + const uint64_t *rkeys, + unsigned int nrounds) +{ uint32_t blocks[16]; unsigned char t[64]; @@ -603,18 +626,23 @@ static void aes_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, } } - -static void aes_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const uint64_t *rkeys, unsigned int nrounds) { +static void +aes_ctr(unsigned char *out, + size_t outlen, + const unsigned char *iv, + const uint64_t *rkeys, + unsigned int nrounds) +{ uint32_t ivw[16]; size_t i; uint32_t cc = 0; br_range_dec32le(ivw, 3, iv); - memcpy(ivw + 4, ivw, 3 * sizeof(uint32_t)); - memcpy(ivw + 8, ivw, 3 * sizeof(uint32_t)); + memcpy(ivw + 4, ivw, 3 * sizeof(uint32_t)); + memcpy(ivw + 8, ivw, 3 * sizeof(uint32_t)); memcpy(ivw + 12, ivw, 3 * sizeof(uint32_t)); - ivw[ 3] = br_swap32(cc); - ivw[ 7] = br_swap32(cc + 1); + ivw[3] = br_swap32(cc); + ivw[7] = br_swap32(cc + 1); ivw[11] = br_swap32(cc + 2); ivw[15] = br_swap32(cc + 3); @@ -632,97 +660,110 @@ static void aes_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, } } -void aes128_ecb_keyexp(aes128ctx *r, const unsigned char *key) { +void +aes128_ecb_keyexp(aes128ctx *r, const unsigned char *key) +{ uint64_t skey[22]; - r->sk_exp = malloc(sizeof(uint64_t) * PQC_AES128_STATESIZE); - if (r->sk_exp == NULL) { - exit(111); - } - br_aes_ct64_keysched(skey, key, 16); br_aes_ct64_skey_expand(r->sk_exp, skey, 10); } -void aes128_ctr_keyexp(aes128ctx *r, const unsigned char *key) { +void +aes128_ctr_keyexp(aes128ctx *r, const unsigned char *key) +{ aes128_ecb_keyexp(r, key); } - -void aes192_ecb_keyexp(aes192ctx *r, const unsigned char *key) { +void +aes192_ecb_keyexp(aes192ctx *r, const unsigned char *key) +{ uint64_t skey[26]; - r->sk_exp = malloc(sizeof(uint64_t) * PQC_AES192_STATESIZE); - if (r->sk_exp == NULL) { - exit(111); - } br_aes_ct64_keysched(skey, key, 24); br_aes_ct64_skey_expand(r->sk_exp, skey, 12); } - -void aes192_ctr_keyexp(aes192ctx *r, const unsigned char *key) { +void +aes192_ctr_keyexp(aes192ctx *r, const unsigned char *key) +{ aes192_ecb_keyexp(r, key); } - -void aes256_ecb_keyexp(aes256ctx *r, const unsigned char *key) { +void +aes256_ecb_keyexp(aes256ctx *r, const unsigned char *key) +{ uint64_t skey[30]; - r->sk_exp = malloc(sizeof(uint64_t) * PQC_AES256_STATESIZE); - if (r->sk_exp == NULL) { - exit(111); - } br_aes_ct64_keysched(skey, key, 32); br_aes_ct64_skey_expand(r->sk_exp, skey, 14); } - -void aes256_ctr_keyexp(aes256ctx *r, const unsigned char *key) { +void +aes256_ctr_keyexp(aes256ctx *r, const unsigned char *key) +{ aes256_ecb_keyexp(r, key); } - -void aes128_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const aes128ctx *ctx) { +void +aes128_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const aes128ctx *ctx) +{ aes_ecb(out, in, nblocks, ctx->sk_exp, 10); } -void aes128_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const aes128ctx *ctx) { +void +aes128_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const aes128ctx *ctx) +{ aes_ctr(out, outlen, iv, ctx->sk_exp, 10); } -void aes192_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const aes192ctx *ctx) { +void +aes192_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const aes192ctx *ctx) +{ aes_ecb(out, in, nblocks, ctx->sk_exp, 12); } -void aes192_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const aes192ctx *ctx) { +void +aes192_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const aes192ctx *ctx) +{ aes_ctr(out, outlen, iv, ctx->sk_exp, 12); } -void aes256_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const aes256ctx *ctx) { +void +aes256_ecb(unsigned char *out, const unsigned char *in, size_t nblocks, const aes256ctx *ctx) +{ aes_ecb(out, in, nblocks, ctx->sk_exp, 14); } -void aes256_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const aes256ctx *ctx) { +void +aes256_ctr(unsigned char *out, size_t outlen, const unsigned char *iv, const aes256ctx *ctx) +{ aes_ctr(out, outlen, iv, ctx->sk_exp, 14); } -void aes128_ctx_release(aes128ctx *r) { - free(r->sk_exp); +void +aes128_ctx_release(aes128ctx *r) +{ } -void aes192_ctx_release(aes192ctx *r) { - free(r->sk_exp); +void +aes192_ctx_release(aes192ctx *r) +{ } -void aes256_ctx_release(aes256ctx *r) { - free(r->sk_exp); +void +aes256_ctx_release(aes256ctx *r) +{ } -int AES_128_CTR(unsigned char *output, size_t outputByteLen, - const unsigned char *input, size_t inputByteLen) { +int +AES_128_CTR(unsigned char *output, + size_t outputByteLen, + const unsigned char *input, + size_t inputByteLen) +{ aes128ctx ctx; - unsigned char iv[16] = { 0 }; + const unsigned char iv[16] = { 0 }; aes128_ctr_keyexp(&ctx, input); aes128_ctr(output, outputByteLen, iv, &ctx); @@ -731,7 +772,9 @@ int AES_128_CTR(unsigned char *output, size_t outputByteLen, return (int)outputByteLen; } -void AES_256_ECB(const uint8_t *input, const unsigned char *key, unsigned char *output) { +void +AES_256_ECB(const uint8_t *input, const unsigned char *key, unsigned char *output) +{ aes256ctx ctx; aes256_ecb_keyexp(&ctx, key); diff --git a/src/common/ref/include/aes.h b/src/common/ref/include/aes.h new file mode 100644 index 0000000..e35ec37 --- /dev/null +++ b/src/common/ref/include/aes.h @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: Apache-2.0 + +#ifndef AES_H +#define AES_H + +#include +#include + +void AES_256_ECB(const uint8_t *input, const uint8_t *key, uint8_t *output); +#define AES_ECB_encrypt AES_256_ECB + +#ifdef ENABLE_AESNI +int AES_128_CTR_NI(unsigned char *output, + size_t outputByteLen, + const unsigned char *input, + size_t inputByteLen); +int AES_128_CTR_4R_NI(unsigned char *output, + size_t outputByteLen, + const unsigned char *input, + size_t inputByteLen); +#define AES_128_CTR AES_128_CTR_NI +#else +int AES_128_CTR(unsigned char *output, + size_t outputByteLen, + const unsigned char *input, + size_t inputByteLen); +#endif + +#endif diff --git a/src/common/ref/randombytes_ctrdrbg.c b/src/common/ref/randombytes_ctrdrbg.c new file mode 100644 index 0000000..372cc0d --- /dev/null +++ b/src/common/ref/randombytes_ctrdrbg.c @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: Apache-2.0 and Unknown +// +/* +NIST-developed software is provided by NIST as a public service. You may use, +copy, and distribute copies of the software in any medium, provided that you +keep intact this entire notice. You may improve, modify, and create derivative +works of the software or any portion of the software, and you may copy and +distribute such modifications or works. Modified works should carry a notice +stating that you changed the software and should note the date and nature of any +such change. Please explicitly acknowledge the National Institute of Standards +and Technology as the source of the software. + +NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF +ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, +WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS +NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR +ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE +ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, +INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR +USEFULNESS OF THE SOFTWARE. + +You are solely responsible for determining the appropriateness of using and +distributing the software and you assume all risks associated with its use, +including but not limited to the risks and costs of program errors, compliance +with applicable laws, damage to or loss of data, programs or equipment, and the +unavailability or interruption of operation. This software is not intended to be +used in any situation where a failure could cause risk of injury or damage to +property. The software developed by NIST employees is not subject to copyright +protection within the United States. +*/ + +#include +#include + +#include + +#ifdef ENABLE_CT_TESTING +#include +#endif + +#define RNG_SUCCESS 0 +#define RNG_BAD_MAXLEN -1 +#define RNG_BAD_OUTBUF -2 +#define RNG_BAD_REQ_LEN -3 + +static inline void AES256_ECB(const unsigned char *key, + const unsigned char *ctr, unsigned char *buffer) { + AES_ECB_encrypt(ctr, key, buffer); +} + +typedef struct { + unsigned char Key[32]; + unsigned char V[16]; + int reseed_counter; +} AES256_CTR_DRBG_struct; + +void AES256_CTR_DRBG_Update(const unsigned char *provided_data, + unsigned char *Key, unsigned char *V); + +AES256_CTR_DRBG_struct DRBG_ctx; + +#ifndef CTRDRBG_TEST_BENCH +static +#endif + void + randombytes_init_nist(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + unsigned char seed_material[48]; + + (void)security_strength; // Unused parameter + memcpy(seed_material, entropy_input, 48); + if (personalization_string) + for (int i = 0; i < 48; i++) { + seed_material[i] ^= personalization_string[i]; + } + memset(DRBG_ctx.Key, 0x00, 32); + memset(DRBG_ctx.V, 0x00, 16); + AES256_CTR_DRBG_Update(seed_material, DRBG_ctx.Key, DRBG_ctx.V); + DRBG_ctx.reseed_counter = 1; +} + +#ifndef CTRDRBG_TEST_BENCH +static +#endif + int + randombytes_nist(unsigned char *x, size_t xlen) { + unsigned char block[16]; + size_t i = 0; + + while (xlen > 0) { + // increment V + for (int j = 15; j >= 0; j--) { + if (DRBG_ctx.V[j] == 0xff) { + DRBG_ctx.V[j] = 0x00; + } else { + DRBG_ctx.V[j]++; + break; + } + } + AES256_ECB(DRBG_ctx.Key, DRBG_ctx.V, block); + if (xlen > 15) { + memcpy(x + i, block, 16); + i += 16; + xlen -= 16; + } else { + memcpy(x + i, block, xlen); + i += xlen; + xlen = 0; + } + } + AES256_CTR_DRBG_Update(NULL, DRBG_ctx.Key, DRBG_ctx.V); + DRBG_ctx.reseed_counter++; + + return 0; +} + +void AES256_CTR_DRBG_Update(const unsigned char *provided_data, + unsigned char *Key, unsigned char *V) { + unsigned char temp[48]; + + for (int i = 0; i < 3; i++) { + // increment V + for (int j = 15; j >= 0; j--) { + if (V[j] == 0xff) { + V[j] = 0x00; + } else { + V[j]++; + break; + } + } + + AES256_ECB(Key, V, temp + 16 * i); + } + if (provided_data != NULL) + for (int i = 0; i < 48; i++) { + temp[i] ^= provided_data[i]; + } + memcpy(Key, temp, 32); + memcpy(V, temp + 32, 16); +} + +#ifdef RANDOMBYTES_C +SQISIGN_API +int randombytes(unsigned char *random_array, unsigned long long nbytes) { + int ret = randombytes_nist(random_array, nbytes); +#ifdef ENABLE_CT_TESTING + VALGRIND_MAKE_MEM_UNDEFINED(random_array, ret); +#endif + return ret; +} + +SQISIGN_API +void randombytes_init(unsigned char *entropy_input, + unsigned char *personalization_string, + int security_strength) { + randombytes_init_nist(entropy_input, personalization_string, + security_strength); +} +#endif diff --git a/src/ec/ref/CMakeLists.txt b/src/ec/ref/CMakeLists.txt old mode 100755 new mode 100644 index 02f8cd3..d0ba315 --- a/src/ec/ref/CMakeLists.txt +++ b/src/ec/ref/CMakeLists.txt @@ -1,3 +1,3 @@ -set(ECX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ecx) +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/ec/ref/ecx/basis.c b/src/ec/ref/ecx/basis.c deleted file mode 100644 index 8e781ad..0000000 --- a/src/ec/ref/ecx/basis.c +++ /dev/null @@ -1,508 +0,0 @@ -#include "isog.h" - - -static void xTPL(ec_point_t* Q, const ec_point_t* P, const ec_point_t* A3) -{ - /* ----------------------------------------------------------------------------- * - * Differential point tripling given the montgomery coefficient A3 = (A+2C:A-2C) - * ----------------------------------------------------------------------------- */ - - fp2_t t0, t1, t2, t3, t4; - fp2_sub(&t0, &P->x, &P->z); - fp2_sqr(&t2, &t0); - fp2_add(&t1, &P->x, &P->z); - fp2_sqr(&t3, &t1); - fp2_add(&t4, &t1, &t0); - fp2_sub(&t0, &t1, &t0); - fp2_sqr(&t1, &t4); - fp2_sub(&t1, &t1, &t3); - fp2_sub(&t1, &t1, &t2); - fp2_mul(&Q->x, &t3, &A3->x); - fp2_mul(&t3, &Q->x, &t3); - fp2_mul(&Q->z, &t2, &A3->z); - fp2_mul(&t2, &t2, &Q->z); - fp2_sub(&t3, &t2, &t3); - fp2_sub(&t2, &Q->x, &Q->z); - fp2_mul(&t1, &t2, &t1); - fp2_add(&t2, &t3, &t1); - fp2_sqr(&t2, &t2); - fp2_mul(&Q->x, &t2, &t4); - fp2_sub(&t1, &t3, &t1); - fp2_sqr(&t1, &t1); - fp2_mul(&Q->z, &t1, &t0); -} - -int ec_is_on_curve(const ec_curve_t* curve, const ec_point_t* P){ - - fp2_t t0, t1, t2; - - // Check if xz*(C^2x^2+zACx+z^2C^2) is a square - fp2_mul(&t0, &curve->C, &P->x); - fp2_mul(&t1, &t0, &P->z); - fp2_mul(&t1, &t1, &curve->A); - fp2_mul(&t2, &curve->C, &P->z); - fp2_sqr(&t0, &t0); - fp2_sqr(&t2, &t2); - fp2_add(&t0, &t0, &t1); - fp2_add(&t0, &t0, &t2); - fp2_mul(&t0, &t0, &P->x); - fp2_mul(&t0, &t0, &P->z); - return fp2_is_square(&t0); -} - -static void difference_point(ec_point_t* PQ, const ec_point_t* P, const ec_point_t* Q, const ec_curve_t* curve){ - // Given P,Q in affine x-only, computes a deterministic choice for (P-Q) - // The points must be normalized to z=1 and the curve to C=1 - - fp2_t t0, t1, t2, t3; - - fp2_sub(&PQ->z, &P->x, &Q->x); // P - Q - fp2_mul(&t2, &P->x, &Q->x); // P*Q - fp_mont_setone(t1.re); - fp_set(t1.im, 0); - fp2_sub(&t3, &t2, &t1); // P*Q-1 - fp2_mul(&t0, &PQ->z, &t3); // (P-Q)*(P*Q-1) - fp2_sqr(&PQ->z, &PQ->z); // (P-Q)^2 - fp2_sqr(&t0, &t0); // (P-Q)^2*(P*Q-1)^2 - fp2_add(&t1, &t2, &t1); // P*Q+1 - fp2_add(&t3, &P->x, &Q->x); // P+Q - fp2_mul(&t1, &t1, &t3); // (P+Q)*(P*Q+1) - fp2_mul(&t2, &t2, &curve->A); // A*P*Q - fp2_add(&t2, &t2, &t2); // 2*A*P*Q - fp2_add(&t1, &t1, &t2); // (P+Q)*(P*Q+1) + 2*A*P*Q - fp2_sqr(&t2, &t1); // ((P+Q)*(P*Q+1) + 2*A*P*Q)^2 - fp2_sub(&t0, &t2, &t0); // ((P+Q)*(P*Q+1) + 2*A*P*Q)^2 - (P-Q)^2*(P*Q-1)^2 - fp2_sqrt(&t0); - fp2_add(&PQ->x, &t0, &t1); -} - -void ec_curve_to_basis_2(ec_basis_t *PQ2, const ec_curve_t *curve){ - fp2_t x, t0, t1, t2; - ec_point_t P, Q, Q2, P2, A24; - - // Curve coefficient in the form A24 = (A+2C:4C) - fp2_add(&A24.z, &curve->C, &curve->C); - fp2_add(&A24.x, &curve->A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - fp_mont_setone(x.re); - fp_set(x.im, 0); - - // Find P - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&P.x, &x); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - } - else - continue; - - // Clear odd factors from the order - xMULv2(&P, &P, p_cofactor_for_2f, P_COFACTOR_FOR_2F_BITLENGTH, &A24); - - // Check if point has order 2^f - copy_point(&P2, &P); - for(int i = 0; i < POWER_OF_2 - 1; i++) - xDBLv2(&P2, &P2, &A24); - if(ec_is_zero(&P2)) - continue; - else - break; - } - - // Find Q - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&Q.x, &x); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - } - else - continue; - - // Clear odd factors from the order - xMULv2(&Q, &Q, p_cofactor_for_2f, P_COFACTOR_FOR_2F_BITLENGTH, &A24); - - // Check if point has order 2^f - copy_point(&Q2, &Q); - for(int i = 0; i < POWER_OF_2 - 1; i++) - xDBLv2(&Q2, &Q2, &A24); - if(ec_is_zero(&Q2)) - continue; - - // Check if point is orthogonal to P - if(is_point_equal(&P2, &Q2)) - continue; - else - break; - } - - // Normalize points - ec_curve_t E; - fp2_mul(&t0, &P.z, &Q.z); - fp2_mul(&t1, &t0, &curve->C); - fp2_inv(&t1); - fp2_mul(&P.x, &P.x, &t1); - fp2_mul(&Q.x, &Q.x, &t1); - fp2_mul(&E.A, &curve->A, &t1); - fp2_mul(&P.x, &P.x, &Q.z); - fp2_mul(&P.x, &P.x, &curve->C); - fp2_mul(&Q.x, &Q.x, &P.z); - fp2_mul(&Q.x, &Q.x, &curve->C); - fp2_mul(&E.A, &E.A, &t0); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - fp2_copy(&Q.z, &P.z); - fp2_copy(&E.C, &P.z); - - // Compute P-Q - difference_point(&PQ2->PmQ, &P, &Q, &E); - copy_point(&PQ2->P, &P); - copy_point(&PQ2->Q, &Q); -} - - -void ec_complete_basis_2(ec_basis_t* PQ2, const ec_curve_t* curve, const ec_point_t* P){ - - fp2_t x, t0, t1, t2; - ec_point_t Q, Q2, P2, A24; - - // Curve coefficient in the form A24 = (A+2C:4C) - fp2_add(&A24.z, &curve->C, &curve->C); - fp2_add(&A24.x, &curve->A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Point of order 2 generated by P - copy_point(&P2, P); - for(int i = 0; i < POWER_OF_2 - 1; i++) - xDBLv2(&P2, &P2, &A24); - - // Find Q - fp_mont_setone(x.re); - fp_set(x.im, 0); - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&Q.x, &x); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - } - else - continue; - - // Clear odd factors from the order - xMULv2(&Q, &Q, p_cofactor_for_2f, (int)P_COFACTOR_FOR_2F_BITLENGTH, &A24); - - // Check if point has order 2^f - copy_point(&Q2, &Q); - for(int i = 0; i < POWER_OF_2 - 1; i++) - xDBLv2(&Q2, &Q2, &A24); - if(ec_is_zero(&Q2)) - continue; - - // Check if point is orthogonal to P - if(is_point_equal(&P2, &Q2)) - continue; - else - break; - } - - // Normalize points - ec_curve_t E; - ec_point_t PP; - fp2_mul(&t0, &P->z, &Q.z); - fp2_mul(&t1, &t0, &curve->C); - fp2_inv(&t1); - fp2_mul(&PP.x, &P->x, &t1); - fp2_mul(&Q.x, &Q.x, &t1); - fp2_mul(&E.A, &curve->A, &t1); - fp2_mul(&PP.x, &PP.x, &Q.z); - fp2_mul(&PP.x, &PP.x, &curve->C); - fp2_mul(&Q.x, &Q.x, &P->z); - fp2_mul(&Q.x, &Q.x, &curve->C); - fp2_mul(&E.A, &E.A, &t0); - fp_mont_setone(PP.z.re); - fp_set(PP.z.im, 0); - fp2_copy(&Q.z, &PP.z); - fp2_copy(&E.C, &PP.z); - - // Compute P-Q - difference_point(&PQ2->PmQ, &PP, &Q, &E); - copy_point(&PQ2->P, &PP); - copy_point(&PQ2->Q, &Q); -} - -void ec_curve_to_basis_3(ec_basis_t* PQ3, const ec_curve_t* curve){ - - fp2_t x, t0, t1, t2; - ec_point_t P, Q, Q3, P3, A24, A3; - - // Curve coefficient in the form A24 = (A+2C:4C) - fp2_add(&A24.z, &curve->C, &curve->C); - fp2_add(&A24.x, &curve->A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Curve coefficient in the form A3 = (A+2C:A-2C) - fp2_sub(&A3.z, &A24.x, &A24.z); - fp2_copy(&A3.x, &A24.x); - - fp_mont_setone(x.re); - fp_set(x.im, 0); - - // Find P - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&P.x, &x); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - } - else - continue; - - // Clear non-3 factors from the order - xMULv2(&P, &P, p_cofactor_for_3g, (int)P_COFACTOR_FOR_3G_BITLENGTH, &A24); - - // Check if point has order 3^g - copy_point(&P3, &P); - for(int i = 0; i < POWER_OF_3 - 1; i++) - xTPL(&P3, &P3, &A3); - if(ec_is_zero(&P3)) - continue; - else - break; - } - - // Find Q - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&Q.x, &x); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - } - else - continue; - - // Clear non-3 factors from the order - xMULv2(&Q, &Q, p_cofactor_for_3g, (int)P_COFACTOR_FOR_3G_BITLENGTH, &A24); - - // Check if point has order 3^g - copy_point(&Q3, &Q); - for(int i = 0; i < POWER_OF_3 - 1; i++) - xTPL(&Q3, &Q3, &A3); - if(ec_is_zero(&Q3)) - continue; - - // Check if point is orthogonal to P - if(is_point_equal(&P3, &Q3)) - continue; - xDBLv2(&P3, &P3, &A24); - if(is_point_equal(&P3, &Q3)) - continue; - else - break; - } - - // Normalize points - ec_curve_t E; - fp2_mul(&t0, &P.z, &Q.z); - fp2_mul(&t1, &t0, &curve->C); - fp2_inv(&t1); - fp2_mul(&P.x, &P.x, &t1); - fp2_mul(&Q.x, &Q.x, &t1); - fp2_mul(&E.A, &curve->A, &t1); - fp2_mul(&P.x, &P.x, &Q.z); - fp2_mul(&P.x, &P.x, &curve->C); - fp2_mul(&Q.x, &Q.x, &P.z); - fp2_mul(&Q.x, &Q.x, &curve->C); - fp2_mul(&E.A, &E.A, &t0); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - fp2_copy(&Q.z, &P.z); - fp2_copy(&E.C, &P.z); - - // Compute P-Q - difference_point(&PQ3->PmQ, &P, &Q, &E); - copy_point(&PQ3->P, &P); - copy_point(&PQ3->Q, &Q); -} - -void ec_curve_to_basis_6(ec_basis_t* PQ6, const ec_curve_t* curve){ - - fp2_t x, t0, t1, t2; - ec_point_t P, Q, Q6, P6, R, T, A24, A3; - - // Curve coefficient in the form A24 = (A+2C:4C) - fp2_add(&A24.z, &curve->C, &curve->C); - fp2_add(&A24.x, &curve->A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Curve coefficient in the form A3 = (A+2C:A-2C) - fp2_sub(&A3.z, &A24.x, &A24.z); - fp2_copy(&A3.x, &A24.x); - - fp_mont_setone(x.re); - fp_set(x.im, 0); - - // Find P - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&P.x, &x); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - } - else - continue; - - // Clear non-2 factors and non-3 factors from the order - xMULv2(&P, &P, p_cofactor_for_6fg, (int)P_COFACTOR_FOR_6FG_BITLENGTH, &A24); - - // Check if point has order 2^f*3^g - copy_point(&P6, &P); - for(int i = 0; i < POWER_OF_2 - 1; i++) - xDBLv2(&P6, &P6, &A24); - for(int i = 0; i < POWER_OF_3 - 1; i++) - xTPL(&P6, &P6, &A3); - if(ec_is_zero(&P6)) - continue; - xDBLv2(&T, &P6, &A24); - if (ec_is_zero(&T)) - continue; - xTPL(&T, &P6, &A3); - if (ec_is_zero(&T)) - continue; - break; - } - - // Find Q - while(1){ - fp_add(x.im, x.re, x.im); - - // Check if point is rational - fp2_sqr(&t0, &curve->C); - fp2_mul(&t1, &t0, &x); - fp2_mul(&t2, &curve->A, &curve->C); - fp2_add(&t1, &t1, &t2); - fp2_mul(&t1, &t1, &x); - fp2_add(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &x); - if(fp2_is_square(&t1)){ - fp2_copy(&Q.x, &x); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - } - else - continue; - - // Clear non-6 factors from the order - xMULv2(&Q, &Q, p_cofactor_for_6fg, (int)P_COFACTOR_FOR_6FG_BITLENGTH, &A24); - - // Check first if point has order 2^f*3^g - copy_point(&Q6, &Q); - for(int i = 0; i < POWER_OF_2 - 1; i++) - xDBLv2(&Q6, &Q6, &A24); - for(int i = 0; i < POWER_OF_3 - 1; i++) - xTPL(&Q6, &Q6, &A3); - if(ec_is_zero(&Q6)) - continue; - xDBLv2(&T, &Q6, &A24); - if (ec_is_zero(&T)) - continue; - xTPL(&T, &Q6, &A3); - if (ec_is_zero(&T)) - continue; - - // Check if point P is independent from point Q - xTPL(&R, &P6, &A3); - xTPL(&T, &Q6, &A3); - if(is_point_equal(&R, &T)) - continue; - xDBLv2(&R, &P6, &A24); - xDBLv2(&T, &Q6, &A24); - if(is_point_equal(&R, &T)) - continue; - break; - } - - // Normalize points - ec_curve_t E; - fp2_mul(&t0, &P.z, &Q.z); - fp2_mul(&t1, &t0, &curve->C); - fp2_inv(&t1); - fp2_mul(&P.x, &P.x, &t1); - fp2_mul(&Q.x, &Q.x, &t1); - fp2_mul(&E.A, &curve->A, &t1); - fp2_mul(&P.x, &P.x, &Q.z); - fp2_mul(&P.x, &P.x, &curve->C); - fp2_mul(&Q.x, &Q.x, &P.z); - fp2_mul(&Q.x, &Q.x, &curve->C); - fp2_mul(&E.A, &E.A, &t0); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - fp2_copy(&Q.z, &P.z); - fp2_copy(&E.C, &P.z); - - // Compute P-Q - difference_point(&PQ6->PmQ, &P, &Q, &E); - copy_point(&PQ6->P, &P); - copy_point(&PQ6->Q, &Q); -} diff --git a/src/ec/ref/ecx/ec.c b/src/ec/ref/ecx/ec.c deleted file mode 100755 index 5ad80f3..0000000 --- a/src/ec/ref/ecx/ec.c +++ /dev/null @@ -1,1461 +0,0 @@ -#include "curve_extras.h" -#include "tedwards.h" -#include -#include - - -bool ec_is_zero(ec_point_t const* P) -{ - return fp2_is_zero(&P->z); -} - -void ec_init(ec_point_t* P) -{ // Initialize point as identity element (1:0) - fp_t one = {0}; - - memset((digit_t*)P, 0, NWORDS_FIELD*RADIX*4/8); - one[0] = 1; - fp_tomont(P->x.re, one); -} - -void xDBL(ec_point_t* Q, ec_point_t const* P, ec_point_t const* AC) -{ - // This version computes the coefficient values A+2C and 4C on-the-fly - // The curve coefficients are passed via AC = (A:C) - fp2_t t0, t1, t2, t3; - - fp2_add(&t0, &P->x, &P->z); - fp2_sqr(&t0, &t0); - fp2_sub(&t1, &P->x, &P->z); - fp2_sqr(&t1, &t1); - fp2_sub(&t2, &t0, &t1); - fp2_add(&t3, &AC->z, &AC->z); - fp2_mul(&t1, &t1, &t3); - fp2_add(&t1, &t1, &t1); - fp2_mul(&Q->x, &t0, &t1); - fp2_add(&t0, &t3, &AC->x); - fp2_mul(&t0, &t0, &t2); - fp2_add(&t0, &t0, &t1); - fp2_mul(&Q->z, &t0, &t2); -} - -void xDBLv2(ec_point_t* Q, ec_point_t const* P, ec_point_t const* A24) -{ - // This version receives the coefficient value A24 = (A+2C:4C) - fp2_t t0, t1, t2; - - fp2_add(&t0, &P->x, &P->z); - fp2_sqr(&t0, &t0); - fp2_sub(&t1, &P->x, &P->z); - fp2_sqr(&t1, &t1); - fp2_sub(&t2, &t0, &t1); - fp2_mul(&t1, &t1, &A24->z); - fp2_mul(&Q->x, &t0, &t1); - fp2_mul(&t0, &t2, &A24->x); - fp2_add(&t0, &t0, &t1); - fp2_mul(&Q->z, &t0, &t2); -} - -void xADD(ec_point_t* R, ec_point_t const* P, ec_point_t const* Q, ec_point_t const* PQ) -{ - fp2_t t0, t1, t2, t3; - - fp2_add(&t0, &P->x, &P->z); - fp2_sub(&t1, &P->x, &P->z); - fp2_add(&t2, &Q->x, &Q->z); - fp2_sub(&t3, &Q->x, &Q->z); - fp2_mul(&t0, &t0, &t3); - fp2_mul(&t1, &t1, &t2); - fp2_add(&t2, &t0, &t1); - fp2_sub(&t3, &t0, &t1); - fp2_sqr(&t2, &t2); - fp2_sqr(&t3, &t3); - fp2_mul(&t2, &PQ->z, &t2); - fp2_mul(&R->z, &PQ->x, &t3); - fp2_copy(&R->x, &t2); -} - -void xDBLADD(ec_point_t* R, ec_point_t* S, ec_point_t const* P, ec_point_t const* Q, ec_point_t const* PQ, ec_point_t const* A24) -{ - // Requires precomputation of A24 = (A+2C:4C) - fp2_t t0, t1, t2; - - fp2_add(&t0, &P->x, &P->z); - fp2_sub(&t1, &P->x, &P->z); - fp2_sqr(&R->x, &t0); - fp2_sub(&t2, &Q->x, &Q->z); - fp2_add(&S->x, &Q->x, &Q->z); - fp2_mul(&t0, &t0, &t2); - fp2_sqr(&R->z, &t1); - fp2_mul(&t1, &t1, &S->x); - fp2_sub(&t2, &R->x, &R->z); - fp2_mul(&R->z, &R->z, &A24->z); - fp2_mul(&R->x, &R->x, &R->z); - fp2_mul(&S->x, &A24->x, &t2); - fp2_sub(&S->z, &t0, &t1); - fp2_add(&R->z, &R->z, &S->x); - fp2_add(&S->x, &t0, &t1); - fp2_mul(&R->z, &R->z, &t2); - fp2_sqr(&S->z, &S->z); - fp2_sqr(&S->x, &S->x); - fp2_mul(&S->z, &S->z, &PQ->x); - fp2_mul(&S->x, &S->x, &PQ->z); -} - -bool is_point_equal(const ec_point_t* P, const ec_point_t* Q) -{ // Evaluate if two points in Montgomery coordinates (X:Z) are equal - // Returns 1 (true) if P=Q, 0 (false) otherwise - fp2_t t0, t1; - - if ((fp2_is_zero(&P->x) && fp2_is_zero(&P->z)) || (fp2_is_zero(&Q->x) && fp2_is_zero(&Q->z))) { - return fp2_is_zero(&P->x) && fp2_is_zero(&P->z) && fp2_is_zero(&Q->x) && fp2_is_zero(&Q->z); - } - - fp2_mul(&t0, &P->x, &Q->z); - fp2_mul(&t1, &Q->x, &P->z); - fp2_sub(&t0, &t0, &t1); - - return fp2_is_zero(&t0); -} - -void swap_points(ec_point_t* P, ec_point_t* Q, const digit_t option) -{ // Swap points - // If option = 0 then P <- P and Q <- Q, else if option = 0xFF...FF then P <- Q and Q <- P - digit_t temp; - - for (int i = 0; i < NWORDS_FIELD; i++) { - temp = option & (P->x.re[i] ^ Q->x.re[i]); - P->x.re[i] = temp ^ P->x.re[i]; - Q->x.re[i] = temp ^ Q->x.re[i]; - temp = option & (P->x.im[i] ^ Q->x.im[i]); - P->x.im[i] = temp ^ P->x.im[i]; - Q->x.im[i] = temp ^ Q->x.im[i]; - temp = option & (P->z.re[i] ^ Q->z.re[i]); - P->z.re[i] = temp ^ P->z.re[i]; - Q->z.re[i] = temp ^ Q->z.re[i]; - temp = option & (P->z.im[i] ^ Q->z.im[i]); - P->z.im[i] = temp ^ P->z.im[i]; - Q->z.im[i] = temp ^ Q->z.im[i]; - } -} - -void copy_point(ec_point_t* P, ec_point_t const* Q) -{ - fp2_copy(&(P->x), &(Q->x)); - fp2_copy(&(P->z), &(Q->z)); -} - -void ec_normalize(ec_point_t* P){ - fp2_inv(&P->z); - fp2_mul(&P->x, &P->x, &P->z); - fp_mont_setone(P->z.re); - fp_set(P->z.im, 0); -} - -void ec_neg(ec_point_t* res, const ec_point_t* P){ - // DOES NOTHING - copy_point(res, P); -} - -void xMUL(ec_point_t* Q, ec_point_t const* P, digit_t const* k, ec_curve_t const* curve) -{ - ec_point_t R0, R1, A24; - digit_t mask; - unsigned int bit = 0, prevbit = 0, swap; - - fp2_add(&A24.x, &curve->C, &curve->C); // Precomputation of A24=(A+2C:4C) - fp2_add(&A24.z, &A24.x, &A24.x); - fp2_add(&A24.x, &A24.x, &curve->A); - - // R0 <- (1:0), R1 <- P - ec_init(&R0); - fp2_copy(&R1.x, &P->x); - fp2_copy(&R1.z, &P->z); - - // Main loop - for (int i = BITS-1; i >= 0; i--) { - bit = (k[i >> LOG2RADIX] >> (i & (RADIX-1))) & 1; - swap = bit ^ prevbit; - prevbit = bit; - mask = 0 - (digit_t)swap; - - swap_points(&R0, &R1, mask); - xDBLADD(&R0, &R1, &R0, &R1, P, &A24); - } - swap = 0 ^ prevbit; - mask = 0 - (digit_t)swap; - swap_points(&R0, &R1, mask); - - fp2_copy(&Q->x, &R0.x); - fp2_copy(&Q->z, &R0.z); -} - -void xMULv2(ec_point_t* Q, ec_point_t const* P, digit_t const* k, const int kbits, ec_point_t const* A24) -{ - // This version receives the coefficient value A24 = (A+2C:4C) - ec_point_t R0, R1; - digit_t mask; - unsigned int bit = 0, prevbit = 0, swap; - - // R0 <- (1:0), R1 <- P - ec_init(&R0); - fp2_copy(&R1.x, &P->x); - fp2_copy(&R1.z, &P->z); - - // Main loop - for (int i = kbits-1; i >= 0; i--) { - bit = (k[i >> LOG2RADIX] >> (i & (RADIX-1))) & 1; - swap = bit ^ prevbit; - prevbit = bit; - mask = 0 - (digit_t)swap; - - swap_points(&R0, &R1, mask); - xDBLADD(&R0, &R1, &R0, &R1, P, A24); - } - swap = 0 ^ prevbit; - mask = 0 - (digit_t)swap; - swap_points(&R0, &R1, mask); - - fp2_copy(&Q->x, &R0.x); - fp2_copy(&Q->z, &R0.z); -} - -static void mp_add(digit_t* c, const digit_t* a, const digit_t* b, const unsigned int nwords) -{ // Multiprecision addition - unsigned int i, carry = 0; - - for (i = 0; i < nwords; i++) { - ADDC(c[i], carry, a[i], b[i], carry); - } -} - -static void mp_sub(digit_t* c, digit_t const* a, digit_t const* b, const unsigned int nwords) -{ // Multiprecision subtraction, assuming a > b - unsigned int i, borrow = 0; - - for (i = 0; i < nwords; i++) { - SUBC(c[i], borrow, a[i], b[i], borrow); - } -} - -void select_ct(digit_t* c, const digit_t* a, const digit_t* b, const digit_t mask, const int nwords) -{ // Select c <- a if mask = 0, select c <- b if mask = 1...1 - - for (int i = 0; i < nwords; i++) { - c[i] = ((a[i] ^ b[i]) & mask) ^ a[i]; - } -} - -void swap_ct(digit_t* a, digit_t* b, const digit_t option, const int nwords) -{ // Swap entries - // If option = 0 then P <- P and Q <- Q, else if option = 0xFF...FF then a <- b and b <- a - digit_t temp; - - for (int i = 0; i < nwords; i++) { - temp = option & (a[i] ^ b[i]); - a[i] = temp ^ a[i]; - b[i] = temp ^ b[i]; - } -} - -// Compute S = k*P + l*Q, with PQ = P+Q -void xDBLMUL(ec_point_t* S, ec_point_t const* P, digit_t const* k, ec_point_t const* Q, digit_t const* l, ec_point_t const* PQ, ec_curve_t const* curve) -{ - int i; - digit_t evens, mevens, bitk0, bitl0, maskk, maskl, temp, bs1_ip1, bs2_ip1, bs1_i, bs2_i, h; - digit_t sigma[2] = {0}, pre_sigma = 0; - digit_t k_t[NWORDS_ORDER], l_t[NWORDS_ORDER], one[NWORDS_ORDER] = {0}, r[2*BITS] = {0}; - ec_point_t A24, DIFF1a, DIFF1b, DIFF2a, DIFF2b, R[3] = {0}, T[3]; - - // Derive sigma according to parity - bitk0 = (k[0] & 1); - bitl0 = (l[0] & 1); - maskk = 0 - bitk0; // Parity masks: 0 if even, otherwise 1...1 - maskl = 0 - bitl0; - sigma[0] = (bitk0 ^ 1); - sigma[1] = (bitl0 ^ 1); - evens = sigma[0] + sigma[1]; // Count number of even scalars - mevens = 0 - (evens & 1); // Mask mevens <- 0 if # even scalars = 0 or 2, otherwise mevens = 1...1 - - // If k and l are both even or both odd, pick sigma = (0,1) - sigma[0] = (sigma[0] & mevens); - sigma[1] = (sigma[1] & mevens) | (1 & ~mevens); - - // Convert even scalars to odd - one[0] = 1; - mp_sub(k_t, k, one, NWORDS_ORDER); - mp_sub(l_t, l, one, NWORDS_ORDER); - select_ct(k_t, k_t, k, maskk, NWORDS_ORDER); - select_ct(l_t, l_t, l, maskl, NWORDS_ORDER); - - // Scalar recoding - for (i = 0; i < BITS; i++) { - // If sigma[0] = 1 swap k_t and l_t - maskk = 0 - (sigma[0] ^ pre_sigma); - swap_ct(k_t, l_t, maskk, NWORDS_ORDER); - - if (i == BITS-1) { - bs1_ip1 = 0; - bs2_ip1 = 0; - } else { - bs1_ip1 = mp_shiftr(k_t, 1, NWORDS_ORDER); - bs2_ip1 = mp_shiftr(l_t, 1, NWORDS_ORDER); - } - bs1_i = k_t[0] & 1; - bs2_i = l_t[0] & 1; - - r[2*i] = bs1_i ^ bs1_ip1; - r[2*i+1] = bs2_i ^ bs2_ip1; - - // Revert sigma if second bit, r_(2i+1), is 1 - pre_sigma = sigma[0]; - maskk = 0 - r[2*i+1]; - select_ct(&temp, &sigma[0], &sigma[1], maskk, 1); - select_ct(&sigma[1], &sigma[1], &sigma[0], maskk, 1); - sigma[0] = temp; - } - - // Point initialization - ec_init(&R[0]); - maskk = 0 - sigma[0]; - select_ct((digit_t*)&R[1], (digit_t*)P, (digit_t*)Q, maskk, 4*NWORDS_FIELD); - select_ct((digit_t*)&R[2], (digit_t*)Q, (digit_t*)P, maskk, 4*NWORDS_FIELD); - fp2_copy(&DIFF1a.x, &R[1].x); - fp2_copy(&DIFF1a.z, &R[1].z); - fp2_copy(&DIFF1b.x, &R[2].x); - fp2_copy(&DIFF1b.z, &R[2].z); - - // Initialize DIFF2a <- P+Q, DIFF2b <- P-Q - xADD(&R[2], &R[1], &R[2], PQ); - fp2_copy(&DIFF2a.x, &R[2].x); - fp2_copy(&DIFF2a.z, &R[2].z); - fp2_copy(&DIFF2b.x, &PQ->x); - fp2_copy(&DIFF2b.z, &PQ->z); - - fp2_add(&A24.x, &curve->C, &curve->C); // Precomputation of A24=(A+2C:4C) - fp2_add(&A24.z, &A24.x, &A24.x); - fp2_add(&A24.x, &A24.x, &curve->A); - - // Main loop - for (i = BITS-1; i>=0; i--) { - h = r[2*i] + r[2*i+1]; // in {0, 1, 2} - maskk = 0 - (h & 1); - select_ct((digit_t*)&T[0], (digit_t*)&R[0], (digit_t*)&R[1], maskk, 4*NWORDS_FIELD); - maskk = 0 - (h >> 1); - select_ct((digit_t*)&T[0], (digit_t*)&T[0], (digit_t*)&R[2], maskk, 4*NWORDS_FIELD); - xDBLv2(&T[0], &T[0], &A24); - - maskk = 0 - r[2*i+1]; // in {0, 1} - select_ct((digit_t*)&T[1], (digit_t*)&R[0], (digit_t*)&R[1], maskk, 4*NWORDS_FIELD); - select_ct((digit_t*)&T[2], (digit_t*)&R[1], (digit_t*)&R[2], maskk, 4*NWORDS_FIELD); - swap_points(&DIFF1a, &DIFF1b, maskk); - xADD(&T[1], &T[1], &T[2], &DIFF1a); - xADD(&T[2], &R[0], &R[2], &DIFF2a); - - // If hw (mod 2) = 1 then swap DIFF2a and DIFF2b - maskk = 0 - (h & 1); - swap_points(&DIFF2a, &DIFF2b, maskk); - - // R <- T - memcpy((digit_t*)&R[0], (digit_t*)&T[0], NWORDS_FIELD*RADIX*4/8); - memcpy((digit_t*)&R[1], (digit_t*)&T[1], NWORDS_FIELD*RADIX*4/8); - memcpy((digit_t*)&R[2], (digit_t*)&T[2], NWORDS_FIELD*RADIX*4/8); - } - - // Output R[evens] - select_ct((digit_t*)S, (digit_t*)&R[0], (digit_t*)&R[1], mevens, 4*NWORDS_FIELD); - maskk = 0 - (bitk0 & bitl0); - select_ct((digit_t*)S, (digit_t*)S, (digit_t*)&R[2], maskk, 4*NWORDS_FIELD); -} - -void ec_ladder3pt(ec_point_t *R, fp_t const m, ec_point_t const *P, ec_point_t const *Q, ec_point_t const *PQ, ec_curve_t const *A) -{ - // Curve constant in the form A24=(A+2C:4C) - ec_point_t A24; - fp2_add(&A24.z, &A->C, &A->C); - fp2_add(&A24.x, &A->A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - ec_point_t X0, X1, X2; - copy_point(&X0, Q); - copy_point(&X1, P); - copy_point(&X2, PQ); - - int i,j; - uint64_t t; - for (i = 0; i < NWORDS_FIELD; i++) - { - t = 1; - for (j = 0 ; j < 64; j++) - { - swap_points(&X1, &X2, -((t & m[i]) == 0)); - xDBLADD(&X0, &X1, &X0, &X1, &X2, &A24); - swap_points(&X1, &X2, -((t & m[i]) == 0)); - t <<= 1; - }; - }; - copy_point(R, &X1); -} - -void ec_j_inv(fp2_t* j_inv, const ec_curve_t* curve){ - /* j-invariant computation for montgommery coefficient A2=(A+2C:4C) */ - fp2_t t0, t1; - - fp2_sqr(&t1, &curve->C); - fp2_sqr(j_inv, &curve->A); - fp2_add(&t0, &t1, &t1); - fp2_sub(&t0, j_inv, &t0); - fp2_sub(&t0, &t0, &t1); - fp2_sub(j_inv, &t0, &t1); - fp2_sqr(&t1, &t1); - fp2_mul(j_inv, j_inv, &t1); - fp2_add(&t0, &t0, &t0); - fp2_add(&t0, &t0, &t0); - fp2_sqr(&t1, &t0); - fp2_mul(&t0, &t0, &t1); - fp2_add(&t0, &t0, &t0); - fp2_add(&t0, &t0, &t0); - fp2_inv(j_inv); - fp2_mul(j_inv, &t0, j_inv); -} - -static void jac_init(jac_point_t* P) -{ // Initialize Montgomery in Jacobian coordinates as identity element (0:1:0) - fp_t one = {0}; - - memset((digit_t*)P, 0, NWORDS_FIELD*RADIX*6/8); - one[0] = 1; - fp_tomont(P->y.re, one); -} - -static bool is_jac_equal(const jac_point_t* P, const jac_point_t* Q) -{ // Evaluate if two points in Jacobian coordinates (X:Y:Z) are equal - // Returns 1 (true) if P=Q, 0 (false) otherwise - fp2_t t0, t1, t2, t3; - - fp2_sqr(&t0, &Q->z); - fp2_mul(&t2, &P->x, &t0); // x1*z2^2 - fp2_sqr(&t1, &P->z); - fp2_mul(&t3, &Q->x, &t1); // x2*z1^2 - fp2_sub(&t2, &t2, &t3); - - fp2_mul(&t0, &t0, &Q->z); - fp2_mul(&t0, &P->y, &t0); // y1*z2^3 - fp2_mul(&t1, &t1, &P->z); - fp2_mul(&t1, &Q->y, &t1); // y2*z1^3 - fp2_sub(&t0, &t0, &t1); - - return fp2_is_zero(&t0) && fp2_is_zero(&t2); -} - -static bool is_jac_xz_equal(const jac_point_t* P, const ec_point_t* Q) -{ // Evaluate if point P in Jacobian coordinates is equal to Q in homogeneous projective coordinates (X:Z) - // Comparison is up to sign (only compares X and Z coordinates) - // Returns 1 (true) if P=Q, 0 (false) otherwise - fp2_t t0, t1; - - fp2_mul(&t0, &P->x, &Q->z); // x1*z2 - fp2_sqr(&t1, &P->z); - fp2_mul(&t1, &Q->x, &t1); // x2*z1^2 - fp2_sub(&t0, &t0, &t1); - - return fp2_is_zero(&t0); -} - -static void copy_jac_point(jac_point_t* P, jac_point_t const* Q) -{ - fp2_copy(&(P->x), &(Q->x)); - fp2_copy(&(P->y), &(Q->y)); - fp2_copy(&(P->z), &(Q->z)); -} - -static void jac_neg(jac_point_t* Q, jac_point_t const* P) -{ - fp2_copy(&Q->x, &P->x); - fp2_neg(&Q->y, &P->y); - fp2_copy(&Q->z, &P->z); -} - -void DBL(jac_point_t* Q, jac_point_t const* P, ec_curve_t const* AC) -{ // Doubling on a Montgomery curve, representation in Jacobian coordinates (X:Y:Z) corresponding to (X/Z^2,Y/Z^3) - // This version receives the coefficient value A - fp2_t t0, t1, t2, t3; - - if (fp2_is_zero(&P->x) && fp2_is_zero(&P->z)) { - jac_init(Q); - return; - } - - fp2_sqr(&t0, &P->x); // t0 = x1^2 - fp2_add(&t1, &t0, &t0); - fp2_add(&t0, &t0, &t1); // t0 = 3x1^2 - fp2_sqr(&t1, &P->z); // t1 = z1^2 - fp2_mul(&t2, &P->x, &AC->A); - fp2_add(&t2, &t2, &t2); // t2 = 2Ax1 - fp2_add(&t2, &t1, &t2); // t2 = 2Ax1+z1^2 - fp2_mul(&t2, &t1, &t2); // t2 = z1^2(2Ax1+z1^2) - fp2_add(&t2, &t0, &t2); // t2 = alpha = 3x1^2 + z1^2(2Ax1+z1^2) - fp2_mul(&Q->z, &P->y, &P->z); - fp2_add(&Q->z, &Q->z, &Q->z); // z2 = 2y1z1 - fp2_sqr(&t0, &Q->z); - fp2_mul(&t0, &t0, &AC->A); // t0 = 4Ay1^2z1^2 - fp2_sqr(&t1, &P->y); - fp2_add(&t1, &t1, &t1); // t1 = 2y1^2 - fp2_add(&t3, &P->x, &P->x); // t3 = 2x1 - fp2_mul(&t3, &t1, &t3); // t3 = 4x1y1^2 - fp2_sqr(&Q->x, &t2); // x2 = alpha^2 - fp2_sub(&Q->x, &Q->x, &t0); // x2 = alpha^2 - 4Ay1^2z1^2 - fp2_sub(&Q->x, &Q->x, &t3); - fp2_sub(&Q->x, &Q->x, &t3); // x2 = alpha^2 - 4Ay1^2z1^2 - 8x1y1^2 - fp2_sub(&Q->y, &t3, &Q->x); // y2 = 4x1y1^2 - x2 - fp2_mul(&Q->y, &Q->y, &t2); // y2 = alpha(4x1y1^2 - x2) - fp2_sqr(&t1, &t1); // t1 = 4y1^4 - fp2_sub(&Q->y, &Q->y, &t1); - fp2_sub(&Q->y, &Q->y, &t1); // y2 = alpha(4x1y1^2 - x2) - 8y1^4 -} - -void ADD(jac_point_t* R, jac_point_t const* P, jac_point_t const* Q, ec_curve_t const* AC) -{ // Addition on a Montgomery curve, representation in Jacobian coordinates (X:Y:Z) corresponding to (X/Z^2,Y/Z^3) - // This version receives the coefficient value A - fp2_t t0, t1, t2, t3, t4, t5, t6; - jac_point_t T; - - if (is_jac_equal(P, Q)) { - DBL(R, P, AC); - return; - } - jac_neg(&T, P); - if (is_jac_equal(&T, Q)) { - jac_init(R); - return; - } - if (fp2_is_zero(&P->x) && fp2_is_zero(&P->z)) { - copy_jac_point(R, Q); - return; - } else if (fp2_is_zero(&Q->x) && fp2_is_zero(&Q->z)) { - copy_jac_point(R, P); - return; - } - - fp2_sqr(&t0, &P->z); // t0 = z1^2 - fp2_mul(&t1, &t0, &P->z); // t1 = z1^3 - fp2_sqr(&t2, &Q->z); // t2 = z2^2 - fp2_mul(&t3, &t2, &Q->z); // t3 = z2^3 - fp2_mul(&t1, &t1, &Q->y); // t1 = y2z1^3 - fp2_mul(&t3, &t3, &P->y); // t3 = y1z2^3 - fp2_sub(&t1, &t1, &t3); // t1 = lambda1 = y2z1^3 - y1z2^3 - fp2_mul(&t0, &t0, &Q->x); // t0 = x2z1^2 - fp2_mul(&t2, &t2, &P->x); // t2 = x1z2^2 - fp2_sub(&t4, &t0, &t2); // t4 = lambda3 = x2z1^2 - x1z2^2 - fp2_add(&t0, &t0, &t2); // t0 = lambda2 = x2z1^2 + x1z2^2 - fp2_mul(&t5, &P->z, &Q->z); // t5 = z1z2 - fp2_mul(&R->z, &t4, &t5); // z3 = z1z2*lambda3 - fp2_sqr(&t5, &t5); // t5 = z1^2z2^2 - fp2_mul(&t5, &AC->A, &t5); // t5 = Az1^2z2^2 - fp2_add(&t0, &t0, &t5); // t0 = Az1^2z2^2 + lambda2 - fp2_sqr(&t6, &t4); // t6 = lambda3^2 - fp2_mul(&t5, &t0, &t6); // t5 = lambda3^2(Az1^2z2^2 + lambda2) - fp2_sqr(&R->x, &t1); // x3 = lambda1^2 - fp2_sub(&R->x, &R->x, &t5); // x3 = lambda1^2 - lambda3^2(Az1^2z2^2 + lambda2) - fp2_mul(&t3, &t3, &t4); // t3 = y1z2^3*lambda3 - fp2_mul(&t3, &t3, &t6); // t3 = y1z2^3*lambda3^3 - fp2_mul(&t2, &t2, &t6); // t2 = x1z2^2*lambda3^2 - fp2_sub(&R->y, &t2, &R->x); // y3 = x1z2^2*lambda3^2 - x3 - fp2_mul(&R->y, &R->y, &t1); // y3 = lambda1(x1z2^2*lambda3^2 - x3) - fp2_sub(&R->y, &R->y, &t3); // y3 = lambda1(x1z2^2*lambda3^2 - x3) - y1z2^3*lambda3^3 -} - -void TPL(jac_point_t* Q, jac_point_t const* P, ec_curve_t const* AC) -{ // Naive tripling on a Montgomery curve, representation in Jacobian coordinates (X:Y:Z) corresponding to (X/Z^2,Y/Z^3) - // This version receives the coefficient value A - jac_point_t R; - - DBL(&R, P, AC); - ADD(Q, &R, P, AC); -} - -void recover_y(fp2_t* y, fp2_t const* Px, ec_curve_t const* curve) -{ // Recover y-coordinate of a point on the Montgomery curve y^2 = x^3 + Ax^2 + x - fp2_t t0; - - fp2_sqr(&t0, Px); - fp2_mul(y, &t0, &curve->A); // Ax^2 - fp2_add(y, y, Px); // Ax^2 + x - fp2_mul(&t0, &t0, Px); - fp2_add(y, y, &t0); // x^3 + Ax^2 + x - fp2_sqrt(y); - - //fp2_t t0, t1; - - //fp2_sqr(&t0, &P->x); - //fp2_sqr(&t1, &P->z); - //fp2_mul(y, &t0, &t1); - //fp2_mul(y, y, &curve->A); // AX^2Z^2 - //fp2_mul(&t0, &t0, &P->x); - //fp2_add(y, y, &t0); // X^3 + AX^2Z^2 - //fp2_mul(&t0, &t1, &P->z); - //fp2_sqr(&t1, &t0); - //fp2_mul(&t1, &t1, &P->x); - //fp2_add(y, y, &t1); // X^3 + AX^2Z^2 + XZ^6 - //fp2_sqrt(y); -} - - -static int mp_compare(digit_t* a, digit_t* b, unsigned int nwords) -{ // Multiprecision comparison, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) { - if (a[i] > b[i]) return 1; - else if (a[i] < b[i]) return -1; - } - return 0; -} - -static bool mp_is_zero(const digit_t* a, unsigned int nwords) -{ // Is a multiprecision element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < nwords; i++) - r |= a[i] ^ 0; - - return (bool)is_digit_zero_ct(r); -} - -void DBLMUL(jac_point_t* R, const jac_point_t* P, const digit_t k, const jac_point_t* Q, const digit_t l, const ec_curve_t* curve) -{ // Double-scalar multiplication R <- k*P + l*Q, fixed for 64-bit scalars - digit_t k_t, l_t; - jac_point_t PQ; - - ADD(&PQ, P, Q, curve); - jac_init(R); - - for (int i = 0; i < 64; i++) { - k_t = k >> (63-i); - k_t &= 0x01; - l_t = l >> (63-i); - l_t &= 0x01; - DBL(R, R, curve); - if (k_t == 1 && l_t == 1) { - ADD(R, R, &PQ, curve); - } else if (k_t == 1) { - ADD(R, R, P, curve); - } else if (l_t == 1) { - ADD(R, R, Q, curve); - } - } -} - -#define SCALAR_BITS 128 //// TODO: this could be defined by level - -void DBLMUL2(jac_point_t* R, const jac_point_t* P, const digit_t* k, const jac_point_t* Q, const digit_t* l, const ec_curve_t* curve) -{ // Double-scalar multiplication R <- k*P + l*Q, fixed for 128-bit scalars - digit_t k_t[2], l_t[2]; - jac_point_t PQ; - - ADD(&PQ, P, Q, curve); - jac_init(R); - - for (int i = 0; i < SCALAR_BITS-64; i++) { - k_t[1] = k[1] >> (SCALAR_BITS-64-1-i); - k_t[1] &= 0x01; - l_t[1] = l[1] >> (SCALAR_BITS-64-1-i); - l_t[1] &= 0x01; - DBL(R, R, curve); - if (k_t[1] == 1 && l_t[1] == 1) { - ADD(R, R, &PQ, curve); - } else if (k_t[1] == 1) { - ADD(R, R, P, curve); - } else if (l_t[1] == 1) { - ADD(R, R, Q, curve); - } - } - - for (int i = 0; i < 64; i++) { - k_t[0] = k[0] >> (64-1-i); - k_t[0] &= 0x01; - l_t[0] = l[0] >> (64-1-i); - l_t[0] &= 0x01; - DBL(R, R, curve); - if (k_t[0] == 1 && l_t[0] == 1) { - ADD(R, R, &PQ, curve); - } else if (k_t[0] == 1) { - ADD(R, R, P, curve); - } else if (l_t[0] == 1) { - ADD(R, R, Q, curve); - } - } -} - -static void mp_mul2(digit_t* c, const digit_t* a, const digit_t* b) -{ // Multiprecision multiplication fixed to two-digit operands - unsigned int carry = 0; - digit_t t0[2], t1[2], t2[2]; - - MUL(t0, a[0], b[0]); - MUL(t1, a[0], b[1]); - ADDC(t0[1], carry, t0[1], t1[0], carry); - ADDC(t1[1], carry, 0, t1[1], carry); - MUL(t2, a[1], b[1]); - ADDC(t2[0], carry, t2[0], t1[1], carry); - ADDC(t2[1], carry, 0, t2[1], carry); - c[0] = t0[0]; - c[1] = t0[1]; - c[2] = t2[0]; - c[3] = t2[1]; -} - -static void ec_dlog_2_step(digit_t* x, digit_t* y, const jac_point_t* R, const int f, const int B, const jac_point_t* Pe2, const jac_point_t* Qe2, const jac_point_t* PQe2, const ec_curve_t* curve) -{ // Based on Montgomery formulas using Jacobian coordinates - int i, j; - digit_t value = 1; - jac_point_t P, Q, TT, SS, PQp, T[(POWER_OF_2-1)/2], Re[(POWER_OF_2-1)/2]; // Storage could be reduced to e1 points - - *x = 0; - *y = 0; - - copy_jac_point(&P, &Pe2[f-1]); - copy_jac_point(&Q, &Qe2[f-1]); - copy_jac_point(&Re[f-1], R); - - for (i = 0; i < (f-1); i++) { - DBL(&Re[f-i-2], &Re[f-i-1], curve); - } - ADD(&PQp, &P, &Q, curve); - - // Unrolling the first two iterations - if (is_jac_equal(&Pe2[0], &Re[0])) { - *x += 1; - copy_jac_point(&T[0], &P); - for (j = 3; j <= B; j++) { - copy_jac_point(&T[j-1], &Pe2[j-1]); - } - jac_neg(&TT, &Pe2[1]); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&Qe2[0], &Re[0])) { - *y += 1; - copy_jac_point(&T[0], &Q); - for (j = 3; j <= B; j++) { - copy_jac_point(&T[j-1], &Qe2[j-1]); - } - jac_neg(&TT, &Qe2[1]); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&PQe2[0], &Re[0])) { - *x += 1; - *y += 1; - copy_jac_point(&T[0], &PQp); - for (j = 3; j <= B; j++) { - copy_jac_point(&T[j-1], &PQe2[j-1]); - } - jac_neg(&TT, &PQe2[1]); - ADD(&Re[0], &Re[1], &TT, curve); - } else { - jac_init(&T[0]); - for (j = 3; j <= B; j++) { - jac_init(&T[j-1]); - } - copy_jac_point(&Re[0], &Re[1]); - } - - // Unrolling iterations 3-B - for (i = 3; i <= B; i++) { - value <<= 1; - jac_neg(&TT, &T[i-1]); - ADD(&TT, &Re[i-1], &TT, curve); // TT <- Re[i-1]-T[i-1] - if (is_jac_equal(&Pe2[0], &Re[0])) { - *x += value; - ADD(&T[0], &T[0], &Pe2[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&T[j-1], &T[j-1], &Pe2[j-i+1], curve); - } - jac_neg(&SS, &Pe2[1]); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&Qe2[0], &Re[0])) { - *y += value; - ADD(&T[0], &T[0], &Qe2[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&T[j-1], &T[j-1], &Qe2[j-i+1], curve); - } - jac_neg(&SS, &Qe2[1]); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&PQe2[0], &Re[0])) { - *x += value; - *y += value; - ADD(&T[0], &T[0], &PQe2[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&T[j-1], &T[j-1], &PQe2[j-i+1], curve); - } - jac_neg(&SS, &PQe2[1]); - ADD(&Re[0], &TT, &SS, curve); - } else { - copy_jac_point(&Re[0], &TT); - } - } - - // Main Loop - for (i = B; i < f; i++) { - value <<= 1; - if (is_jac_equal(&Pe2[0], &Re[0])) { - *x += value; - ADD(&T[0], &T[0], &Pe2[f-i], curve); - } else if (is_jac_equal(&Qe2[0], &Re[0])) { - *y += value; - ADD(&T[0], &T[0], &Qe2[f-i], curve); - } else if (is_jac_equal(&PQe2[0], &Re[0])) { - *x += value; - *y += value; - ADD(&T[0], &T[0], &PQe2[f-i], curve); - } - jac_neg(&TT, &T[0]); - ADD(&Re[0], R, &TT, curve); // TT <- R-T[0] - for (j = 0; j < (f-i-1); j++) { - DBL(&Re[0], &Re[0], curve); - } - } - value <<= 1; - if (is_jac_equal(&Pe2[0], &Re[0])) { - *x += value; - } else if (is_jac_equal(&Qe2[0], &Re[0])) { - *y += value; - } else if (is_jac_equal(&PQe2[0], &Re[0])) { - *x += value; - *y += value; - } -} - -void ec_dlog_2(digit_t* scalarP, digit_t* scalarQ, const ec_basis_t* PQ2, const ec_point_t* R, const ec_curve_t* curve) -{ // Optimized implementation based on Montgomery formulas using Jacobian coordinates - int i; - digit_t w0 = 0, z0 = 0, x0 = 0, y0 = 0, x1 = 0, y1 = 0, w1 = 0, z1 = 0, e, e1, f, f1, f2, f2div2, f22, w, z; - digit_t fp2[NWORDS_ORDER] = {0}, xx[NWORDS_ORDER] = {0}, yy[NWORDS_ORDER] = {0}, ww[NWORDS_ORDER] = {0}, zz[NWORDS_ORDER] = {0}; - digit_t f22_p[NWORDS_ORDER] = {0}, w_p[NWORDS_ORDER] = {0}, z_p[NWORDS_ORDER] = {0}, x0_p[NWORDS_ORDER] = {0}, y0_p[NWORDS_ORDER] = {0}, w0_p[NWORDS_ORDER] = {0}, z0_p[NWORDS_ORDER] = {0}; - jac_point_t P, Q, RR, TT, R2r0, R2r, R2r1; - jac_point_t Pe2[POWER_OF_2], Qe2[POWER_OF_2], PQe2[POWER_OF_2]; - ec_point_t Rnorm; - ec_curve_t curvenorm; - ec_basis_t PQ2norm; - - f = POWER_OF_2; - memset(scalarP, 0, NWORDS_ORDER*RADIX/8); - memset(scalarQ, 0, NWORDS_ORDER*RADIX/8); - - // Normalize R,PQ2,curve - fp2_t D; - fp2_mul(&D, &PQ2->P.z, &PQ2->Q.z); - fp2_mul(&D, &D, &PQ2->PmQ.z); - fp2_mul(&D, &D, &R->z); - fp2_mul(&D, &D, &curve->C); - fp2_inv(&D); - fp_mont_setone(Rnorm.z.re); - fp_set(Rnorm.z.im, 0); - fp2_copy(&PQ2norm.P.z, &Rnorm.z); - fp2_copy(&PQ2norm.Q.z, &Rnorm.z); - fp2_copy(&PQ2norm.PmQ.z, &Rnorm.z); - fp2_copy(&curvenorm.C, &Rnorm.z); - fp2_mul(&Rnorm.x, &R->x, &D); - fp2_mul(&Rnorm.x, &Rnorm.x, &PQ2->P.z); - fp2_mul(&Rnorm.x, &Rnorm.x, &PQ2->Q.z); - fp2_mul(&Rnorm.x, &Rnorm.x, &PQ2->PmQ.z); - fp2_mul(&Rnorm.x, &Rnorm.x, &curve->C); - fp2_mul(&PQ2norm.P.x, &PQ2->P.x, &D); - fp2_mul(&PQ2norm.P.x, &PQ2norm.P.x, &R->z); - fp2_mul(&PQ2norm.P.x, &PQ2norm.P.x, &PQ2->Q.z); - fp2_mul(&PQ2norm.P.x, &PQ2norm.P.x, &PQ2->PmQ.z); - fp2_mul(&PQ2norm.P.x, &PQ2norm.P.x, &curve->C); - fp2_mul(&PQ2norm.Q.x, &PQ2->Q.x, &D); - fp2_mul(&PQ2norm.Q.x, &PQ2norm.Q.x, &R->z); - fp2_mul(&PQ2norm.Q.x, &PQ2norm.Q.x, &PQ2->P.z); - fp2_mul(&PQ2norm.Q.x, &PQ2norm.Q.x, &PQ2->PmQ.z); - fp2_mul(&PQ2norm.Q.x, &PQ2norm.Q.x, &curve->C); - fp2_mul(&PQ2norm.PmQ.x, &PQ2->PmQ.x, &D); - fp2_mul(&PQ2norm.PmQ.x, &PQ2norm.PmQ.x, &R->z); - fp2_mul(&PQ2norm.PmQ.x, &PQ2norm.PmQ.x, &PQ2->P.z); - fp2_mul(&PQ2norm.PmQ.x, &PQ2norm.PmQ.x, &PQ2->Q.z); - fp2_mul(&PQ2norm.PmQ.x, &PQ2norm.PmQ.x, &curve->C); - fp2_mul(&curvenorm.A, &curve->A, &D); - fp2_mul(&curvenorm.A, &curvenorm.A, &R->z); - fp2_mul(&curvenorm.A, &curvenorm.A, &PQ2->P.z); - fp2_mul(&curvenorm.A, &curvenorm.A, &PQ2->Q.z); - fp2_mul(&curvenorm.A, &curvenorm.A, &PQ2->PmQ.z); - - recover_y(&P.y, &PQ2norm.P.x, &curvenorm); - fp2_copy(&P.x, &PQ2norm.P.x); - fp2_copy(&P.z, &PQ2norm.P.z); - recover_y(&Q.y, &PQ2norm.Q.x, &curvenorm); // TODO: THIS SECOND SQRT CAN BE ELIMINATED - fp2_copy(&Q.x, &PQ2norm.Q.x); - fp2_copy(&Q.z, &PQ2norm.Q.z); - recover_y(&RR.y, &Rnorm.x, &curvenorm); - fp2_copy(&RR.x, &Rnorm.x); - fp2_copy(&RR.z, &Rnorm.z); - - jac_neg(&TT, &Q); - ADD(&TT, &P, &TT, &curvenorm); - if (!is_jac_xz_equal(&TT, &PQ2norm.PmQ)) - jac_neg(&Q, &Q); - - // Computing torsion-2^f points, multiples of P, Q and P+Q - copy_jac_point(&Pe2[POWER_OF_2-1], &P); - copy_jac_point(&Qe2[POWER_OF_2-1], &Q); - ADD(&PQe2[POWER_OF_2-1], &P, &Q, &curvenorm); // P+Q - - for (i = 0; i < (POWER_OF_2-1); i++) { - DBL(&Pe2[POWER_OF_2-i-2], &Pe2[POWER_OF_2-i-1], &curvenorm); - DBL(&Qe2[POWER_OF_2-i-2], &Qe2[POWER_OF_2-i-1], &curvenorm); - DBL(&PQe2[POWER_OF_2-i-2], &PQe2[POWER_OF_2-i-1], &curvenorm); - } - - e = f; - mp_shiftr(&e, 1, 1); - f1 = f-e; - e1 = f1; - mp_shiftr(&e1, 1, 1); - f2 = f1-e1; - - copy_jac_point(&TT, &RR); - for (i = 0; i < (f-f2); i++) { - DBL(&TT, &TT, &curvenorm); - } - // w0, z0 <- dlog2(2^(f-f2)*R, f2, f2 div 2) - f2div2 = f2; - mp_shiftr(&f2div2, 1, 1); - ec_dlog_2_step(&w0, &z0, &TT, (int)f2, (int)f2div2, &Pe2[0], &Qe2[0], &PQe2[0], &curvenorm); - - // R2r0 <- 2^e*R2 - (w0*Pe2[f1-1] + z0*Qe2[f1-1]) - copy_jac_point(&TT, &RR); - for (i = 0; i < e; i++) { - DBL(&TT, &TT, &curvenorm); - } - DBLMUL(&R2r0, &Pe2[f1-1], w0, &Qe2[f1-1], z0, &curvenorm); - jac_neg(&R2r0, &R2r0); - ADD(&R2r0, &TT, &R2r0, &curvenorm); - ec_dlog_2_step(&x0, &y0, &R2r0, (int)e1, (int)f2div2, &Pe2[0], &Qe2[0], &PQe2[0], &curvenorm); - - // w <- w0 + 2^f2 * x0, z <- z0 + 2^f2 * y0 - //f22 = 1; - //mp_shiftl(&f22, (unsigned int)f2, 1); - //w = w0 + f22 * x0; - //z = z0 + f22 * y0; - f22_p[0] = 1; - mp_shiftl(&f22_p[0], (unsigned int)f2, NWORDS_ORDER); - x0_p[0] = x0; - y0_p[0] = y0; - w0_p[0] = w0; - z0_p[0] = z0; - mp_mul2(&x0_p[0], &f22_p[0], &x0_p[0]); - mp_add(&w_p[0], &w0_p[0], &x0_p[0], NWORDS_ORDER); - mp_mul2(&y0_p[0], &f22_p[0], &y0_p[0]); - mp_add(&z_p[0], &z0_p[0], &y0_p[0], NWORDS_ORDER); - - // R2r <- R2 - (w*Pe2[f-1] + z*Qe2[f-1]), R2r has order 2^(f-e) - //DBLMUL(&R2r, &Pe2[f-1], w, &Qe2[f-1], z, &curvenorm); - DBLMUL2(&R2r, &Pe2[f-1], &w_p[0], &Qe2[f-1], &z_p[0], &curvenorm); - jac_neg(&R2r, &R2r); - ADD(&R2r, &RR, &R2r, &curvenorm); - copy_jac_point(&TT, &R2r); - for (i = 0; i < e1; i++) { - DBL(&TT, &TT, &curvenorm); - } - ec_dlog_2_step(&w1, &z1, &TT, (int)f2, (int)f2div2, &Pe2[0], &Qe2[0], &PQe2[0], &curvenorm); - - // R2r1 <- R2r - (w1*Pe2[f1-1] + z1*Qe2[f1-1]) - DBLMUL(&R2r1, &Pe2[f1-1], w1, &Qe2[f1-1], z1, &curvenorm); - jac_neg(&R2r1, &R2r1); - ADD(&R2r1, &R2r, &R2r1, &curvenorm); - ec_dlog_2_step(&x1, &y1, &R2r1, (int)e1, (int)f2div2, &Pe2[0], &Qe2[0], &PQe2[0], &curvenorm); - - xx[0] = x1; - yy[0] = y1; - ww[0] = w1; - zz[0] = z1; - mp_shiftl(&xx[0], (unsigned int)f2, NWORDS_ORDER); - mp_add(&xx[0], &xx[0], &ww[0], NWORDS_ORDER); - mp_shiftl(&yy[0], (unsigned int)f2, NWORDS_ORDER); - mp_add(&yy[0], &yy[0], &zz[0], NWORDS_ORDER); - //ww[0] = w; - //zz[0] = z; - ww[0] = w_p[0]; - zz[0] = z_p[0]; - ww[1] = w_p[1]; - zz[1] = z_p[1]; - if (e < 64) { - mp_shiftl(&xx[0], (unsigned int)e, NWORDS_ORDER); - mp_shiftl(&yy[0], (unsigned int)e, NWORDS_ORDER); - } else { - x0_p[0] = 0; - y0_p[0] = 0; - x0_p[1] = 0x100; - y0_p[1] = 0x100; - mp_mul2(&xx[0], &xx[0], &x0_p[0]); - mp_mul2(&yy[0], &yy[0], &y0_p[0]); - } - mp_add(scalarP, &xx[0], &ww[0], NWORDS_ORDER); - mp_add(scalarQ, &yy[0], &zz[0], NWORDS_ORDER); - - fp_copy(fp2, TWOpFm1); // 2^(f-1) - - // If scalarP > 2^(f-1) or (scalarQ > 2^(f-1) and (scalarP = 0 or scalarP = 2^(f-1))) then output -scalarP mod 2^f, -scalarQ mod 2^f - if (mp_compare(scalarP, fp2, NWORDS_ORDER) == 1 || - (mp_compare(scalarQ, fp2, NWORDS_ORDER) == 1 && (mp_is_zero(scalarP, NWORDS_ORDER) == 1 || mp_compare(scalarP, fp2, NWORDS_ORDER) == 0))) { - mp_shiftl(fp2, 1, NWORDS_ORDER); // Get 2^f - if (mp_is_zero(scalarP, NWORDS_ORDER) != 1) - mp_sub(scalarP, fp2, scalarP, NWORDS_ORDER); - if (mp_is_zero(scalarQ, NWORDS_ORDER) != 1) - mp_sub(scalarQ, fp2, scalarQ, NWORDS_ORDER); - } -} - -static void ec_dlog_3_step(digit_t* x, digit_t* y, const jac_point_t* R, const int f, const int B, const jac_point_t* Pe3, const jac_point_t* Qe3, const jac_point_t* PQe3, const ec_curve_t* curve) -{ // Based on Montgomery formulas using Jacobian coordinates - int i, j; - digit_t value = 1; - jac_point_t P, Q, PQp, PQ2p, P2Qp, P2Q2p, P2p, Q2p, TT, SS, Te[POWER_OF_3/2], Re[POWER_OF_3/2]; // Storage could be reduced to e points - jac_point_t PQep0, PQ2ep0, P2Qep0, P2Q2ep0, P2ep0, Q2ep0, PQep1, PQ2ep1, P2Qep1, P2Q2ep1, P2ep1, Q2ep1; - - *x = 0; - *y = 0; - - copy_jac_point(&P, &Pe3[f-1]); - copy_jac_point(&Q, &Qe3[f-1]); - copy_jac_point(&Re[f-1], R); - - for (i = 0; i < (f-1); i++) { - TPL(&Re[f-i-2], &Re[f-i-1], curve); - } - - ADD(&PQp, &P, &Q, curve); // P+Q - ADD(&PQ2p, &PQp, &Q, curve); // P+2Q - ADD(&P2Qp, &PQp, &P, curve); // P2+Q - DBL(&P2Q2p, &PQp, curve); // 2P+2Q - DBL(&P2p, &P, curve); // 2P - DBL(&Q2p, &Q, curve); // 2Q - ADD(&PQep0, &Pe3[0], &Qe3[0], curve); // Pe3[0] + Qe3[0] - ADD(&PQ2ep0, &PQep0, &Qe3[0], curve); // Pe3[0] + 2Qe3[0] - ADD(&P2Qep0, &PQep0, &Pe3[0], curve); // 2Pe3[0] + Qe3[0] - DBL(&P2Q2ep0, &PQep0, curve); // 2Pe3[0] + 2Qe3[0] - DBL(&P2ep0, &Pe3[0], curve); // 2Pe3[0] - DBL(&Q2ep0, &Qe3[0], curve); // 2Qe3[0] - ADD(&PQep1, &Pe3[1], &Qe3[1], curve); // Pe3[1] + Qe3[1] - ADD(&PQ2ep1, &PQep1, &Qe3[1], curve); // Pe3[1] + 2Qe3[1] - ADD(&P2Qep1, &PQep1, &Pe3[1], curve); // 2Pe3[1] + Qe3[1] - DBL(&P2Q2ep1, &PQep1, curve); // 2Pe3[1] + 2Qe3[1] - DBL(&P2ep1, &Pe3[1], curve); // 2Pe3[1] - DBL(&Q2ep1, &Qe3[1], curve); // 2Qe3[1] - - // Unrolling the first two iterations - if (is_jac_equal(&Pe3[0], &Re[0])) { - *x += 1; - copy_jac_point(&Te[0], &P); - for (j = 3; j <= B; j++) { - copy_jac_point(&Te[j-1], &Pe3[j-1]); - } - jac_neg(&TT, &Pe3[1]); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&PQep0, &Re[0])) { - *x += 1; - *y += 1; - copy_jac_point(&Te[0], &PQp); - for (j = 3; j <= B; j++) { - ADD(&Te[j-1], &Pe3[j-1], &Qe3[j-1], curve); - } - jac_neg(&TT, &PQep1); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&PQ2ep0, &Re[0])) { - *x += 1; - *y += 2; - copy_jac_point(&Te[0], &PQ2p); - for (j = 3; j <= B; j++) { - DBL(&TT, &Qe3[j-1], curve); - ADD(&Te[j-1], &Pe3[j-1], &TT, curve); - } - jac_neg(&TT, &PQ2ep1); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&P2ep0, &Re[0])) { - *x += 2; - copy_jac_point(&Te[0], &P2p); - for (j = 3; j <= B; j++) { - DBL(&Te[j-1], &Pe3[j-1], curve); - } - jac_neg(&TT, &P2ep1); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&P2Qep0, &Re[0])) { - *x += 2; - *y += 1; - copy_jac_point(&Te[0], &P2Qp); - for (j = 3; j <= B; j++) { - DBL(&TT, &Pe3[j-1], curve); - ADD(&Te[j-1], &TT, &Qe3[j-1], curve); - } - jac_neg(&TT, &P2Qep1); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&P2Q2ep0, &Re[0])) { - *x += 2; - *y += 2; - copy_jac_point(&Te[0], &P2Q2p); - for (j = 3; j <= B; j++) { - DBL(&TT, &Pe3[j-1], curve); - DBL(&SS, &Qe3[j-1], curve); - ADD(&Te[j-1], &TT, &SS, curve); - } - jac_neg(&TT, &P2Q2ep1); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&Qe3[0], &Re[0])) { - *y += 1; - copy_jac_point(&Te[0], &Q); - for (j = 3; j <= B; j++) { - copy_jac_point(&Te[j-1], &Qe3[j-1]); - } - jac_neg(&TT, &Qe3[1]); - ADD(&Re[0], &Re[1], &TT, curve); - } else if (is_jac_equal(&Q2ep0, &Re[0])) { - *y += 2; - copy_jac_point(&Te[0], &Q2p); - for (j = 3; j <= B; j++) { - DBL(&Te[j-1], &Qe3[j-1], curve); - } - jac_neg(&TT, &Q2ep1); - ADD(&Re[0], &Re[1], &TT, curve); - } else { - jac_init(&Te[0]); - for (j = 3; j <= B; j++) { - jac_init(&Te[j-1]); - } - copy_jac_point(&Re[0], &Re[1]); - } - - // Unrolling iterations 3-B - for (i = 3; i <= B; i++) { - value *= 3; - jac_neg(&TT, &Te[i-1]); - ADD(&TT, &Re[i-1], &TT, curve); // TT <- Re[i-1]-T[i-1] - if (is_jac_equal(&Pe3[0], &Re[0])) { - *x += value; - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - } - jac_neg(&SS, &Pe3[1]); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&PQep0, &Re[0])) { - *x += value; - *y += value; - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - } - jac_neg(&SS, &PQep1); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&PQ2ep0, &Re[0])) { - *x += value; - *y += value; - *y += value; - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - } - jac_neg(&SS, &PQ2ep1); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&P2ep0, &Re[0])) { - *x += value; - *x += value; - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - } - jac_neg(&SS, &P2ep1); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&P2Qep0, &Re[0])) { - *x += value; - *x += value; - *y += value; - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - } - jac_neg(&SS, &P2Qep1); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&P2Q2ep0, &Re[0])) { - *x += value; - *x += value; - *y += value; - *y += value; - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Pe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Pe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - } - jac_neg(&SS, &P2Q2ep1); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&Qe3[0], &Re[0])) { - *y += value; - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - } - jac_neg(&SS, &Qe3[1]); - ADD(&Re[0], &TT, &SS, curve); - } else if (is_jac_equal(&Q2ep0, &Re[0])) { - *y += value; - *y += value; - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - ADD(&Te[0], &Te[0], &Qe3[f-i+1], curve); - for (j = i+1; j <= B; j++) { - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - ADD(&Te[j-1], &Te[j-1], &Qe3[j-i+1], curve); - } - jac_neg(&SS, &Q2ep1); - ADD(&Re[0], &TT, &SS, curve); - } else { - copy_jac_point(&Re[0], &TT); - } - } - - // Main Loop - for (i = B; i < f; i++) { - value *= 3; - if (is_jac_equal(&Pe3[0], &Re[0])) { - *x += value; - copy_jac_point(&TT, &P); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&PQep0, &Re[0])) { - *x += value; - *y += value; - copy_jac_point(&TT, &PQp); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&PQ2ep0, &Re[0])) { - *x += value; - *y += value; - *y += value; - copy_jac_point(&TT, &PQ2p); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&P2ep0, &Re[0])) { - *x += value; - *x += value; - copy_jac_point(&TT, &P2p); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&P2Qep0, &Re[0])) { - *x += value; - *x += value; - *y += value; - copy_jac_point(&TT, &P2Qp); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&P2Q2ep0, &Re[0])) { - *x += value; - *x += value; - *y += value; - *y += value; - copy_jac_point(&TT, &P2Q2p); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&Qe3[0], &Re[0])) { - *y += value; - copy_jac_point(&TT, &Q); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } else if (is_jac_equal(&Q2ep0, &Re[0])) { - *y += value; - *y += value; - copy_jac_point(&TT, &Q2p); - for (j = 0; j < (i-1); j++) { - TPL(&TT, &TT, curve); - } - ADD(&Te[0], &Te[0], &TT, curve); - } - jac_neg(&TT, &Te[0]); - ADD(&Re[0], R, &TT, curve); - for (j = 0; j < (f-i-1); j++) { - TPL(&Re[0], &Re[0], curve); - } - } - value *= 3; - if (is_jac_equal(&Pe3[0], &Re[0])) { - *x += value; - } else if (is_jac_equal(&PQep0, &Re[0])) { - *x += value; - *y += value; - } else if (is_jac_equal(&PQ2ep0, &Re[0])) { - *x += value; - *y += value; - *y += value; - } else if (is_jac_equal(&P2ep0, &Re[0])) { - *x += value; - *x += value; - } else if (is_jac_equal(&P2Qep0, &Re[0])) { - *x += value; - *x += value; - *y += value; - } else if (is_jac_equal(&P2Q2ep0, &Re[0])) { - *x += value; - *x += value; - *y += value; - *y += value; - } else if (is_jac_equal(&Qe3[0], &Re[0])) { - *y += value; - } else if (is_jac_equal(&Q2ep0, &Re[0])) { - *y += value; - *y += value; - } -} - -void ec_dlog_3(digit_t* scalarP, digit_t* scalarQ, const ec_basis_t* PQ3, const ec_point_t* R, const ec_curve_t* curve) -{ // Optimized implementation based on Montgomery formulas using Jacobian coordinates - int i; - digit_t w0 = 0, z0 = 0, x0 = 0, y0 = 0, x1 = 0, y1 = 0, w1 = 0, z1 = 0, e, f, f1, f1div2; - digit_t fp2[NWORDS_ORDER] = {0}, xx[NWORDS_ORDER] = {0}, yy[NWORDS_ORDER] = {0}, ww[NWORDS_ORDER] = {0}, zz[NWORDS_ORDER] = {0}; - jac_point_t P, Q, RR, TT, R2r0; - jac_point_t Pe3[POWER_OF_3], Qe3[POWER_OF_3], PQe3[POWER_OF_3]; - ec_point_t Rnorm; - ec_curve_t curvenorm; - ec_basis_t PQ3norm; - - f = POWER_OF_3; - memset(scalarP, 0, NWORDS_ORDER*RADIX/8); - memset(scalarQ, 0, NWORDS_ORDER*RADIX/8); - - // Normalize R,PQ3,curve - fp2_t D; - fp2_mul(&D, &PQ3->P.z, &PQ3->Q.z); - fp2_mul(&D, &D, &PQ3->PmQ.z); - fp2_mul(&D, &D, &R->z); - fp2_mul(&D, &D, &curve->C); - fp2_inv(&D); - fp_mont_setone(Rnorm.z.re); - fp_set(Rnorm.z.im, 0); - fp2_copy(&PQ3norm.P.z, &Rnorm.z); - fp2_copy(&PQ3norm.Q.z, &Rnorm.z); - fp2_copy(&PQ3norm.PmQ.z, &Rnorm.z); - fp2_copy(&curvenorm.C, &Rnorm.z); - fp2_mul(&Rnorm.x, &R->x, &D); - fp2_mul(&Rnorm.x, &Rnorm.x, &PQ3->P.z); - fp2_mul(&Rnorm.x, &Rnorm.x, &PQ3->Q.z); - fp2_mul(&Rnorm.x, &Rnorm.x, &PQ3->PmQ.z); - fp2_mul(&Rnorm.x, &Rnorm.x, &curve->C); - fp2_mul(&PQ3norm.P.x, &PQ3->P.x, &D); - fp2_mul(&PQ3norm.P.x, &PQ3norm.P.x, &R->z); - fp2_mul(&PQ3norm.P.x, &PQ3norm.P.x, &PQ3->Q.z); - fp2_mul(&PQ3norm.P.x, &PQ3norm.P.x, &PQ3->PmQ.z); - fp2_mul(&PQ3norm.P.x, &PQ3norm.P.x, &curve->C); - fp2_mul(&PQ3norm.Q.x, &PQ3->Q.x, &D); - fp2_mul(&PQ3norm.Q.x, &PQ3norm.Q.x, &R->z); - fp2_mul(&PQ3norm.Q.x, &PQ3norm.Q.x, &PQ3->P.z); - fp2_mul(&PQ3norm.Q.x, &PQ3norm.Q.x, &PQ3->PmQ.z); - fp2_mul(&PQ3norm.Q.x, &PQ3norm.Q.x, &curve->C); - fp2_mul(&PQ3norm.PmQ.x, &PQ3->PmQ.x, &D); - fp2_mul(&PQ3norm.PmQ.x, &PQ3norm.PmQ.x, &R->z); - fp2_mul(&PQ3norm.PmQ.x, &PQ3norm.PmQ.x, &PQ3->P.z); - fp2_mul(&PQ3norm.PmQ.x, &PQ3norm.PmQ.x, &PQ3->Q.z); - fp2_mul(&PQ3norm.PmQ.x, &PQ3norm.PmQ.x, &curve->C); - fp2_mul(&curvenorm.A, &curve->A, &D); - fp2_mul(&curvenorm.A, &curvenorm.A, &R->z); - fp2_mul(&curvenorm.A, &curvenorm.A, &PQ3->P.z); - fp2_mul(&curvenorm.A, &curvenorm.A, &PQ3->Q.z); - fp2_mul(&curvenorm.A, &curvenorm.A, &PQ3->PmQ.z); - - recover_y(&P.y, &PQ3norm.P.x, &curvenorm); - fp2_copy(&P.x, &PQ3norm.P.x); - fp2_copy(&P.z, &PQ3norm.P.z); - recover_y(&Q.y, &PQ3norm.Q.x, &curvenorm); // TODO: THIS SECOND SQRT CAN BE ELIMINATED - fp2_copy(&Q.x, &PQ3norm.Q.x); - fp2_copy(&Q.z, &PQ3norm.Q.z); - recover_y(&RR.y, &Rnorm.x, &curvenorm); - fp2_copy(&RR.x, &Rnorm.x); - fp2_copy(&RR.z, &Rnorm.z); - - jac_neg(&TT, &Q); - ADD(&TT, &P, &TT, &curvenorm); - if (!is_jac_xz_equal(&TT, &PQ3norm.PmQ)) - jac_neg(&Q, &Q); - - // Computing torsion-2^f points, multiples of P, Q and P+Q - copy_jac_point(&Pe3[POWER_OF_3-1], &P); - copy_jac_point(&Qe3[POWER_OF_3-1], &Q); - ADD(&PQe3[POWER_OF_3-1], &P, &Q, &curvenorm); // P+Q - - for (i = 0; i < (POWER_OF_3-1); i++) { - TPL(&Pe3[POWER_OF_3-i-2], &Pe3[POWER_OF_3-i-1], &curvenorm); - TPL(&Qe3[POWER_OF_3-i-2], &Qe3[POWER_OF_3-i-1], &curvenorm); - TPL(&PQe3[POWER_OF_3-i-2], &PQe3[POWER_OF_3-i-1], &curvenorm); - } - - e = f >> 1; - f1 = f-e; - copy_jac_point(&TT, &RR); - for (i = 0; i < (f-f1); i++) { - TPL(&TT, &TT, &curvenorm); - } - // w0, z0 <- dlog3(3^(f-f1)*R, f1, f1 div 2) - f1div2 = f1 >> 1; - ec_dlog_3_step(&w0, &z0, &TT, (int)f1, (int)f1div2, &Pe3[0], &Qe3[0], &PQe3[0], &curvenorm); - - // R2r0 <- R2 - (w0*Pe3[f-1] + z0*Qe3[f-1]) - DBLMUL(&R2r0, &Pe3[f-1], w0, &Qe3[f-1], z0, &curvenorm); - jac_neg(&R2r0, &R2r0); - ADD(&R2r0, &RR, &R2r0, &curvenorm); - ec_dlog_3_step(&x0, &y0, &R2r0, (int)e, (int)f1div2, &Pe3[0], &Qe3[0], &PQe3[0], &curvenorm); - - xx[0] = x0; - yy[0] = y0; - ww[0] = w0; - zz[0] = z0; - mp_mul2(&xx[0], THREEpE, &xx[0]); - mp_add(scalarP, &xx[0], &ww[0], NWORDS_ORDER); - mp_mul2(&yy[0], THREEpE, &yy[0]); - mp_add(scalarQ, &yy[0], &zz[0], NWORDS_ORDER); - - // If scalarP > Floor(3^f/2) or (scalarQ > Floor(3^f/2) and scalarP = 0) then output -scalarP mod 3^f, -scalarQ mod 3^f - if (mp_compare(scalarP, THREEpFdiv2, NWORDS_ORDER) == 1 || - (mp_compare(scalarQ, THREEpFdiv2, NWORDS_ORDER) == 1 && (mp_is_zero(scalarP, NWORDS_ORDER) == 1))) { - if (mp_is_zero(scalarP, NWORDS_ORDER) != 1) - mp_sub(scalarP, THREEpF, scalarP, NWORDS_ORDER); - if (mp_is_zero(scalarQ, NWORDS_ORDER) != 1) - mp_sub(scalarQ, THREEpF, scalarQ, NWORDS_ORDER); - } -} - - -// WRAPPERS - -void ec_dbl(ec_point_t* res, const ec_curve_t* curve, const ec_point_t* P){ - xDBL(res, P, (ec_point_t const*)curve); -} -void ec_mul(ec_point_t* res, const ec_curve_t* curve, const digit_t* scalar, const ec_point_t* P){ - xMUL(res, P, scalar, curve); -} -void ec_biscalar_mul(ec_point_t* res, const ec_curve_t* curve, const digit_t* scalarP, const digit_t* scalarQ, const ec_basis_t* PQ){ - xDBLMUL(res, &PQ->P, scalarP, &PQ->Q, scalarQ, &PQ->PmQ, curve); -} diff --git a/src/ec/ref/ecx/fp2-test.c b/src/ec/ref/ecx/fp2-test.c deleted file mode 100644 index 95bd487..0000000 --- a/src/ec/ref/ecx/fp2-test.c +++ /dev/null @@ -1,90 +0,0 @@ -#include -#include -#include -#include "../generic/include/fp2_tmp.h" - -int main() -{ - fp2_t fp2_0, fp2_1; - // ------------ - fp2_set0(fp2_0); - fp2_set1(fp2_1); - // ------------ - - int i; - fp2_t a, b, c, d; - fp_t e; - - for (i = 0; i < 1024; i++) - { - printf("[%3d%%] Testing fp2_t arithmetic", 100 * i / (int)1024); - fflush(stdout); - printf("\r\x1b[K"); - - // Random elements of fp - fp2_random(a); - fp2_random(b); - fp2_copy(c, a); - c.re[0] += 1; - fp2_copy(d, b); - d.re[0] -= 1; - - assert(fp2_isequal(a,b) == 0); // different values check --> (a != b) - assert(fp2_isequal(c,c) == 1); // equal values check --> 1 (c == c) - - // Testing neg - fp2_set0(b); - fp2_copy(c, a); - fp2_neg(a, a); - fp2_sub(c, b, c); - assert(fp2_isequal(a,c) == 1); - - fp2_set1(a); // Now a == 1 - fp2_set0(b); // Now b == 0 - - assert(fp2_is_zero(a) == 0); - assert(fp2_is_zero(b) == 1); - - // testing c - c - fp2_sub(d, c, c); - assert(fp2_is_zero(d) == 1); - - // tetsing c * 0 - fp2_mul(d, c, b); - assert(fp2_is_zero(d) == 1); - - // tetsing c * 1 ... recall, in Montgomery domain R mod p plays the role of the 1 - fp2_set1(a); - fp2_mul(d, c, a); - assert(fp2_isequal(d, c) == 1); - - // fp_set(e, 1); // Now e == 1 - // fp2_pow(d, e, c); - // assert(fp2_isequal(d, c) == 1); - - // fp_set(e, 0); // Now e == 0 - // fp2_pow(d, e, c); - // assert(fp2_isone(d) == 1); - - // fp2_set(a, 1); // Now e == R mod p - // fp_random(e); - // fp2_pow(d, e, a); - // assert(fp2_isone(d) == 1); - - // Testing 1/a by computing (1/a) x a - fp2_random(a); - fp2_copy(b, a); - fp2_inv(a); - fp2_mul(c, a, b); - assert(fp2_isone(c) == 1); - - fp2_random(a); - fp2_sqr(b, a); - assert( fp2_issquare(b) ); - - }; - - printf("[%2d%%] Tested fp2_t arithmetic:\tNo errors!\n", 100 * i / (int)1024); - printf("-- All tests passed.\n"); - return 0; -} diff --git a/src/ec/ref/ecx/isog_chains.c b/src/ec/ref/ecx/isog_chains.c deleted file mode 100644 index 7e6f31b..0000000 --- a/src/ec/ref/ecx/isog_chains.c +++ /dev/null @@ -1,298 +0,0 @@ -#include "isog.h" -#include - -static inline void AC_to_A24(ec_point_t *A24, ec_curve_t const *E) -{ - // A24 = (A+2C : 4C) - fp2_add(&A24->z, &E->C, &E->C); - fp2_add(&A24->x, &E->A, &A24->z); - fp2_add(&A24->z, &A24->z, &A24->z); -} - -static inline void A24_to_AC(ec_curve_t *E, ec_point_t const *A24) -{ - // (A:C) = ((A+2C)*2-4C : 4C) - fp2_add(&E->A, &A24->x, &A24->x); - fp2_sub(&E->A, &E->A, &A24->z); - fp2_add(&E->A, &E->A, &E->A); - fp2_copy(&E->C, &A24->z); -} - -void ec_eval_even(ec_curve_t* image, const ec_isog_even_t* phi, - ec_point_t* points, unsigned short length){ - ec_point_t Q4, Q, A24; - copy_point(&Q4, &phi->kernel); - AC_to_A24(&A24, &phi->curve); - for(int i = 0; i < phi->length - 2; i++) - xDBLv2(&Q4, &Q4, &A24); - xDBLv2(&Q, &Q4, &A24); - if(fp2_is_zero(&Q.x)){ - xisog_4_singular(&A24, Q4, A24); - xeval_4_singular(points, points, length, Q4); - xeval_4_singular(&Q, &phi->kernel, 1, Q4); - } - else{ - xisog_4(&A24, Q4); - xeval_4(points, points, length); - xeval_4(&Q, &phi->kernel, 1); - } - ec_eval_even_strategy(image, points, length, &A24, &Q, phi->length-2); - } - -void ec_eval_even_nonzero(ec_curve_t* image, const ec_isog_even_t* phi, - ec_point_t* points, unsigned short length){ - ec_point_t Q4, A24; - copy_point(&Q4, &phi->kernel); - AC_to_A24(&A24, &phi->curve); - for(int i = 0; i < phi->length - 2; i++) - xDBLv2(&Q4, &Q4, &A24); - xisog_4(&A24, Q4); - xeval_4(points, points, length); - xeval_4(&Q4, &phi->kernel, 1); - ec_eval_even_strategy(image, points, length, &A24, &Q4, phi->length-2); - } - -static void ec_eval_even_strategy(ec_curve_t* image, ec_point_t* points, unsigned short points_len, - ec_point_t* A24, const ec_point_t *kernel, const int isog_len){ - - assert(isog_len == POWER_OF_2-2); - - uint8_t log2_of_e, tmp; - fp2_t t0; - digit_t e_half = (isog_len)>>1; - for(tmp = e_half, log2_of_e = 0; tmp > 0; tmp>>=1, ++log2_of_e); - log2_of_e *= 2; // In order to ensure each splits is at most size log2_of_e - - ec_point_t SPLITTING_POINTS[log2_of_e], K2; - copy_point(&SPLITTING_POINTS[0], kernel); - - int strategy = 0, // Current element of the strategy to be used - i, j; - - int BLOCK = 0, // Keeps track of point order - current = 0; // Number of points being carried - int XDBLs[log2_of_e]; // Number of doubles performed - - // If walk length is odd, we start with a 2-isogeny - if(isog_len & 1){ - copy_point(&SPLITTING_POINTS[1], &SPLITTING_POINTS[0]); - for(i = 0; i < isog_len-1; i++) - xDBLv2(&SPLITTING_POINTS[1], &SPLITTING_POINTS[1], A24); - xisog_2(A24, SPLITTING_POINTS[1]); - xeval_2(SPLITTING_POINTS, SPLITTING_POINTS, 1); - xeval_2(points, points, points_len); - } - - // Chain of 4-isogenies - for(j = 0; j < (e_half - 1); j++) - { - // Get the next point of order 4 - while (BLOCK != (e_half - 1 - j) ) - { - // A new split will be added - current += 1; - // We set the seed of the new split to be computed and saved - copy_point(&SPLITTING_POINTS[current], &SPLITTING_POINTS[current - 1]); - for(i = 0; i < 2*STRATEGY4[strategy]; i++) - xDBLv2(&SPLITTING_POINTS[current], &SPLITTING_POINTS[current], A24); - XDBLs[current] = STRATEGY4[strategy]; // The number of doublings performed is saved - BLOCK += STRATEGY4[strategy]; // BLOCK is increased by the number of doublings performed - strategy += 1; // Next, we move to the next element of the strategy - } - - // Evaluate 4-isogeny - xisog_4(A24, SPLITTING_POINTS[current]); - xeval_4(SPLITTING_POINTS, SPLITTING_POINTS, current); - xeval_4(points, points, points_len); - - BLOCK -= XDBLs[current]; - XDBLs[current] = 0; - current -= 1; - } - - // Final 4-isogeny - xisog_4(A24, SPLITTING_POINTS[current]); - xeval_4(points, points, points_len); - - // Output curve in the form (A:C) - A24_to_AC(image, A24); -} - -void ec_eval_odd(ec_curve_t* image, const ec_isog_odd_t* phi, - ec_point_t* points, unsigned short length){ - - ec_point_t ker_plus, ker_minus, P, K, A24, B24; - int i,j,k; - - AC_to_A24(&A24, &phi->curve); - - // Isogenies with kernel in E[p+1] - copy_point(&ker_plus, &phi->ker_plus); - copy_point(&ker_minus, &phi->ker_minus); - for(i = 0; i < P_LEN; i++){ - copy_point(&P, &ker_plus); - for(j = i+1; j < P_LEN; j++){ - for(k = 0; k < phi->degree[j]; k++) - xMULv2(&P, &P, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A24); - } - for(k = 0; k < phi->degree[i]; k++){ - copy_point(&K, &P); - for(j = 0; j < phi->degree[i]-k-1; j++) - xMULv2(&K, &K, &(TORSION_ODD_PRIMES[i]), p_plus_minus_bitlength[i], &A24); - kps(i, K, A24); - xisog(&B24, i, A24); - xeval(&P, i, P, A24); - xeval(&ker_plus, i, ker_plus, A24); - xeval(&ker_minus, i, ker_minus, A24); - for(j = 0; j < length; j++) - xeval(&points[j], i, points[j], A24); - copy_point(&A24, &B24); - kps_clear(i); - } - } - - // Isogenies with kernel in E[p-1] - for(i = P_LEN; i < P_LEN+M_LEN; i++){ - copy_point(&P, &ker_minus); - for(j = i+1; j < P_LEN+M_LEN; j++){ - for(k = 0; k < phi->degree[j]; k++) - xMULv2(&P, &P, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A24); - } - for(k = 0; k < phi->degree[i]; k++){ - copy_point(&K, &P); - for(j = 0; j < phi->degree[i]-k-1; j++) - xMULv2(&K, &K, &(TORSION_ODD_PRIMES[i]), p_plus_minus_bitlength[i], &A24); - kps(i, K, A24); - xisog(&B24, i, A24); - xeval(&P, i, P, A24); - xeval(&ker_minus, i, ker_minus, A24); - for(j = 0; j < length; j++) - xeval(&points[j], i, points[j], A24); - copy_point(&A24, &B24); - kps_clear(i); - } - } - - A24_to_AC(image, &A24); -} - -void ec_curve_normalize(ec_curve_t *new, ec_isom_t *isom, const ec_curve_t *old){ - fp2_t t0, t1, t2, t3, t4, t5; - // Compute the other solutions: - // A'^2 = [ sqrt(A^2-4C^2)*(9C^2-A^2) +- (A^3-3AC^2) ] / [ 2C^2*sqrt(A^2-4C^2) ] - fp2_sqr(&t0, &old->C); //C^2 - fp2_add(&t1, &t0, &t0); //2C^2 - fp2_add(&t2, &t1, &t1); //4C^2 - fp2_sqr(&t3, &old->A); //A^2 - fp2_sub(&t2, &t3, &t2); //A^2-4C^2 - fp2_sqrt(&t2); //sqrt(A^2-4C^2) - fp2_add(&t0, &t0, &t1); //3C^2 - fp2_mul(&t1, &t2, &t1); //2C^2*sqrt(A^2-4C^2) - fp2_sub(&t5, &t3, &t0); //A^2-3C^2 - fp2_mul(&t5, &t5, &old->A); //A^3-3AC^2 - fp2_add(&t4, &t0, &t0); //6C^2 - fp2_add(&t0, &t4, &t0); //9C^2 - fp2_sub(&t0, &t0, &t3); //9C^2-A^2 - fp2_add(&t3, &t3, &t3); //2A^2 - fp2_mul(&t3, &t3, &t2); //2A^2*sqrt(A^2-4C^2) - fp2_mul(&t2, &t2, &t0); //sqrt(A^2-4C^2)*(9C^2-A^2) - fp2_add(&t0, &t2, &t5); //sqrt(A^2-4C^2)*(9C^2-A^2) + (A^3-3AC^2) - fp2_sub(&t2, &t2, &t5); //sqrt(A^2-4C^2)*(9C^2-A^2) - (A^3-3AC^2) - fp2_inv(&t1); //1/2C^2*sqrt(A^2-4C^2) - fp2_mul(&t0, &t0, &t1); // First solution - fp2_mul(&t2, &t2, &t1); // Second solution - fp2_mul(&t1, &t3, &t1); // Original solution - - // Chose the lexicographically first solution - if(fp2_cmp(&t0, &t1)==1) - fp2_copy(&t0, &t1); - if(fp2_cmp(&t0, &t2)==1) - fp2_copy(&t0, &t2); - - // Copy the solution - fp2_sqrt(&t0); - ec_curve_t E; - fp2_copy(&E.A, &t0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - ec_isomorphism(isom, old, &E); - fp2_copy(&new->A, &E.A); - fp2_copy(&new->C, &E.C); -} - -void ec_isomorphism(ec_isom_t* isom, const ec_curve_t* from, const ec_curve_t* to){ - fp2_t t0, t1, t2, t3, t4; - fp2_mul(&t0, &from->A, &to->C); - fp2_sqr(&t0, &t0); //fromA^2toC^2 - fp2_mul(&t1, &to->A, &from->C); - fp2_sqr(&t1, &t1); //toA^2fromC^2 - fp2_mul(&t2, &to->C, &from->C); - fp2_sqr(&t2, &t2); //toC^2fromC^2 - fp2_add(&t3, &t2, &t2); - fp2_add(&t2, &t3, &t2); //3toC^2fromC^2 - fp2_sub(&t3, &t2, &t0); //3toC^2fromC^2-fromA^2toC^2 - fp2_sub(&t4, &t2, &t1); //3toC^2fromC^2-toA^2fromC^2 - fp2_inv(&t3); - fp2_mul(&t4, &t4, &t3); - fp2_sqrt(&t4); //lambda^2 constant for SW isomorphism - fp2_sqr(&t3, &t4); - fp2_mul(&t3, &t3, &t4); //lambda^6 - - // Check sign of lambda^2, such that lambda^6 has the right sign - fp2_sqr(&t0, &from->C); - fp2_add(&t1, &t0, &t0); - fp2_add(&t1, &t1, &t1); - fp2_add(&t1, &t1, &t1); - fp2_add(&t0, &t0, &t1); // 9fromC^2 - fp2_sqr(&t2, &from->A); - fp2_add(&t2, &t2, &t2); // 2fromA^2 - fp2_sub(&t2, &t2, &t0); - fp2_mul(&t2, &t2, &from->A); // -9fromC^2fromA+2fromA^3 - fp2_sqr(&t0, &to->C); - fp2_mul(&t0, &t0, &to->C); - fp2_mul(&t2, &t2, &t0); //toC^3* [-9fromC^2fromA+2fromA^3] - fp2_mul(&t3, &t3, &t2); //lambda^6*(-9fromA+2fromA^3)*toC^3 - fp2_sqr(&t0, &to->C); - fp2_add(&t1, &t0, &t0); - fp2_add(&t1, &t1, &t1); - fp2_add(&t1, &t1, &t1); - fp2_add(&t0, &t0, &t1); // 9toC^2 - fp2_sqr(&t2, &to->A); - fp2_add(&t2, &t2, &t2); // 2toA^2 - fp2_sub(&t2, &t2, &t0); - fp2_mul(&t2, &t2, &to->A); // -9toC^2toA+2toA^3 - fp2_sqr(&t0, &from->C); - fp2_mul(&t0, &t0, &from->C); - fp2_mul(&t2, &t2, &t0); //fromC^3* [-9toC^2toA+2toA^3] - if(!fp2_is_equal(&t2, &t3)) - fp2_neg(&t4, &t4); - - // Mont -> SW -> SW -> Mont - fp_mont_setone(t0.re); - fp_set(t0.im, 0); - fp2_add(&isom->D, &t0, &t0); - fp2_add(&isom->D, &isom->D, &t0); - fp2_mul(&isom->D, &isom->D, &from->C); - fp2_mul(&isom->D, &isom->D, &to->C); - fp2_mul(&isom->Nx, &isom->D, &t4); - fp2_mul(&t4, &t4, &from->A); - fp2_mul(&t4, &t4, &to->C); - fp2_mul(&t0, &to->A, &from->C); - fp2_sub(&isom->Nz, &t0, &t4); -} - -void ec_iso_inv(ec_isom_t* isom){ - fp2_t tmp; - fp2_copy(&tmp, &isom->D); - fp2_copy(&isom->D, &isom->Nx); - fp2_copy(&isom->Nx, &tmp); - fp2_neg(&isom->Nz, &isom->Nz); -} - -void ec_iso_eval(ec_point_t *P, ec_isom_t* isom){ - fp2_t tmp; - fp2_mul(&P->x, &P->x, &isom->Nx); - fp2_mul(&tmp, &P->z, &isom->Nz); - fp2_sub(&P->x, &P->x, &tmp); - fp2_mul(&P->z, &P->z, &isom->D); -} diff --git a/src/ec/ref/ecx/kps.c b/src/ec/ref/ecx/kps.c deleted file mode 100644 index c36d1cf..0000000 --- a/src/ec/ref/ecx/kps.c +++ /dev/null @@ -1,228 +0,0 @@ -#include "isog.h" -#include "curve_extras.h" -#include - -int sI, sJ, sK; // Sizes of each current I, J, and K - -fp2_t I[sI_max][2], // I plays also as the linear factors of the polynomial h_I(X) - EJ_0[sJ_max][3], EJ_1[sJ_max][3]; // To be used in xisog y xeval - -ec_point_t J[sJ_max], K[sK_max]; // Finite subsets of the kernel -fp2_t XZJ4[sJ_max], // -4* (Xj * Zj) for each j in J, and x([j]P) = (Xj : Zj) - rtree_A[(1 << (ceil_log_sI_max+2)) - 1], // constant multiple of the reciprocal tree computation - A0; // constant multiple of the reciprocal R0 - -poly ptree_hI[(1 << (ceil_log_sI_max+2)) - 1], // product tree of h_I(X) - rtree_hI[(1 << (ceil_log_sI_max+2)) - 1], // reciprocal tree of h_I(X) - ptree_EJ[(1 << (ceil_log_sJ_max+2)) - 1]; // product tree of E_J(X) - -fp2_t R0[2*sJ_max + 1]; // Reciprocal of h_I(X) required in the scaled remainder tree approach - -int deg_ptree_hI[(1 << (ceil_log_sI_max+2)) - 1], // degree of each noed in the product tree of h_I(X) - deg_ptree_EJ[(1 << (ceil_log_sJ_max+2)) - 1]; // degree of each node in the product tree of E_J(X) - -fp2_t leaves[sI_max]; // leaves of the remainder tree, which are required in the Resultant computation - -// ----------------------------------------------------------- -// ----------------------------------------------------------- -// Traditional Kernel Point computation (KPs) - -// Kernel computation required in tye degree-4 isogeny evaluation -void kps_4(ec_point_t const P) -{ - fp2_sub(&K[1].x, &P.x, &P.z); - fp2_add(&K[2].x, &P.x, &P.z); - fp2_sqr(&K[0].x, &P.z); - fp2_add(&K[0].z, &K[0].x, &K[0].x); - fp2_add(&K[0].x, &K[0].z, &K[0].z); -} - -void eds2mont(ec_point_t* P) -{ - fp2_t t; - fp2_add(&t, &(P->z), &(P->x)); - fp2_sub(&(P->z), &(P->z), &(P->x)); - fp2_copy(&(P->x), &t); -} - - -// Differential doubling in Twisted Edwards model -void ydbl(ec_point_t* Q, ec_point_t* const P, ec_point_t const* A) -{ - fp2_t t_0, t_1, X, Z; - - fp2_sqr(&t_0, &(P->x)); - fp2_sqr(&t_1, &(P->z)); - fp2_mul(&Z, &(A->z), &t_0); - fp2_mul(&X, &Z, &t_1); - fp2_sub(&t_1, &t_1, &t_0); - fp2_mul(&t_0, &(A->x), &t_1); - fp2_add(&Z, &Z, &t_0); - fp2_mul(&Z, &Z, &t_1); - - fp2_sub(&(Q->x), &X, &Z); - fp2_add(&(Q->z), &X, &Z); -} - -// Differential addition in Twisted Edwards model -void yadd(ec_point_t* R, ec_point_t* const P, ec_point_t* const Q, ec_point_t* const PQ) -{ - fp2_t a, b, c, d, X, Z; - - fp2_mul(&a, &(P->z), &(Q->x)); - fp2_mul(&b, &(P->x), &(Q->z)); - fp2_add(&c, &a, &b); - fp2_sub(&d, &a, &b); - fp2_sqr(&c, &c); - fp2_sqr(&d, &d); - - fp2_add(&a, &(PQ->z), &(PQ->x)); - fp2_sub(&b, &(PQ->z), &(PQ->x)); - fp2_mul(&X, &b, &c); - fp2_mul(&Z, &a, &d); - - fp2_sub(&(R->x), &X, &Z); - fp2_add(&(R->z), &X, &Z); -} - -// tvelu formulae -void kps_t(uint64_t const i, ec_point_t const P, ec_point_t const A) -{ - int j; - int d = ((int)TORSION_ODD_PRIMES[i] - 1) / 2; - - // Mapping the input point x(P), which belongs to a - // Montogmery curve model, into its Twisted Edwards - // representation y(P) - fp2_sub(&K[0].x, &P.x, &P.z); - fp2_add(&K[0].z, &P.x, &P.z); - ydbl(&K[1], &K[0], &A); // y([2]P) - - for (j = 2; j < d; j++) - yadd(&K[j], &K[j - 1], &K[0], &K[j - 2]); // y([j+1]P) -} - -// ----------------------------------------------------------- -// ----------------------------------------------------------- -// Kernel Point computation (KPs) used in velu SQRT -void kps_s(uint64_t const i, ec_point_t const P, ec_point_t const A) -{ - // ================================================================================= - assert(TORSION_ODD_PRIMES[i] > gap); // Ensuring velusqrt is used for l_i > gap - // The optimal bounds must corresponds to sI, sJ, and sK - - sI = sizeI[i]; // Size of I - sJ = sizeJ[i]; // Size of J - sK = sizeK[i]; // Size of K - assert(sI >= sJ); // Ensuring #I >= #J - assert(sK >= 0); // Recall, it must be that #K >= 0 - assert(sJ > 1); // ensuring sI >= sJ > 1 - // ================================================================================= - - // Now, we can proceed by the general case - - int j; - - // -------------------------------------------------- - // Computing [j]P for each j in {1, 3, ..., 2*sJ - 1} - ec_point_t P2, P4; - copy_point(&J[0], &P); // x(P) - // Next computations are required for allowing the use of the function get_A() - fp2_mul(&XZJ4[0], &J[0].x, &J[0].z); // Xj*Zj - fp2_add(&XZJ4[0], &XZJ4[0], &XZJ4[0]); // 2Xj*Zj - fp2_add(&XZJ4[0], &XZJ4[0], &XZJ4[0]); // 4Xj*Zj - fp2_neg(&XZJ4[0], &XZJ4[0]); // -4Xj*Zj - xDBLv2(&P2, &P, &A); // x([2]P) - xADD(&J[1], &P2, &J[0], &J[0]); // x([3]P) - // Next computations are required for allowing the use of the function get_A() - fp2_mul(&XZJ4[1], &J[1].x, &J[1].z); // Xj*Zj - fp2_add(&XZJ4[1], &XZJ4[1], &XZJ4[1]); // 2Xj*Zj - fp2_add(&XZJ4[1], &XZJ4[1], &XZJ4[1]); // 4Xj*Zj - fp2_neg(&XZJ4[1], &XZJ4[1]); // -4Xj*Zj - for (j = 2; j < sJ; j++) - { - xADD(&J[j], &J[j - 1], &P2, &J[j - 2]); // x([2*j + 1]P) - // Next computations are required for allowing the use of the function get_A() - fp2_mul(&XZJ4[j], &J[j].x, &J[j].z); // Xj*Zj - fp2_add(&XZJ4[j], &XZJ4[j], &XZJ4[j]); // 2Xj*Zj - fp2_add(&XZJ4[j], &XZJ4[j], &XZJ4[j]); // 4Xj*Zj - fp2_neg(&XZJ4[j], &XZJ4[j]); // -4Xj*Zj - }; - - // ---------------------------------------------------------- - // Computing [i]P for i in { (2*sJ) * (2i + 1) : 0 <= i < sI} - // and the linear factors of h_I(W) - ec_point_t Q, Q2, tmp1, tmp2; - int bhalf_floor= sJ >> 1; - int bhalf_ceil = sJ - bhalf_floor; - xDBLv2(&P4, &P2, &A); // x([4]P) - swap_points(&P2, &P4, -(uint64_t)(sJ % 2)); // x([4]P) <--- coditional swap ---> x([2]P) - xADD(&Q, &J[bhalf_ceil], &J[bhalf_floor - 1], &P2); // Q := [2b]P - swap_points(&P2, &P4, -(uint64_t)(sJ % 2)); // x([4]P) <--- coditional swap ---> x([2]P) - - // ............................................. - xDBLv2(&Q2, &Q, &A); // x([2]Q) - xADD(&tmp1, &Q2, &Q, &Q); // x([3]Q) - fp2_neg(&I[0][0], &Q.x); - fp2_copy(&I[0][1], &Q.z); - fp2_neg(&I[1][0], &tmp1.x); - fp2_copy(&I[1][1], &tmp1.z); - copy_point(&tmp2, &Q); - - for (j = 2; j < sI; j++){ - xADD(&tmp2, &tmp1, &Q2, &tmp2); // x([2*j + 1]Q) - fp2_neg(&I[j][0], &tmp2.x); - fp2_copy(&I[j][1], &tmp2.z); - swap_points(&tmp1, &tmp2, -(uint64_t)1); - } - - - // ---------------------------------------------------------------- - // Computing [k]P for k in { 4*sJ*sI + 1, ..., l - 6, l - 4, l - 2} - // In order to avoid BRANCHES we make allways copy in K[0] and K[1] - // by assuming that these entries are only used when sK >= 1 and - // sK >= 2, respectively. - - //if (sK >= 1) - copy_point(&K[0], &P2); // x([l - 2]P) = x([2]P) - //if (sK >= 2) - copy_point(&K[1], &P4); // x([l - 4]P) = x([4]P) - - for (j = 2; j < sK; j++) - xADD(&K[j], &K[j - 1], &P2, &K[j - 2]); // x([l - 2*(j+1)]P) = x([2 * (j+1)]P) - - // ---------------------------------------------------------------- - // ~~~~~~~~ ~~~~~~~~ - // | | | | - // Computing h_I(W) = | | (W - x([i]P)) = | | (Zi * W - Xi) / Zi where x([i]P) = Xi/Zi - // i in I i in I - // In order to avoid costly inverse computations in fp, we are gonna work with projective coordinates - - product_tree_LENFeq2(ptree_hI, deg_ptree_hI, 0, I, sI); // Product tree of hI - if (!scaled) - { - // (unscaled) remainder tree approach - reciprocal_tree(rtree_hI, rtree_A, 2*sJ + 1, ptree_hI, deg_ptree_hI, 0, sI); // Reciprocal tree of hI - } - else - { - // scaled remainder tree approach - fp2_t f_rev[sI_max + 1]; - for (j = 0; j < (sI + 1); j++) - fp2_copy(&f_rev[j], &ptree_hI[0][sI - j]); - - if (sI > (2*sJ - sI + 1)) - reciprocal(R0, &A0, f_rev, sI + 1, sI); - else - reciprocal(R0, &A0, f_rev, sI + 1, 2*sJ - sI + 1); - }; -} - -void kps_clear(int i){ - if (TORSION_ODD_PRIMES[i] > gap) - { - if (!scaled) - clear_tree(rtree_hI, 0, sizeI[i]); - clear_tree(ptree_hI, 0, sizeI[i]); - } -} \ No newline at end of file diff --git a/src/ec/ref/ecx/poly-mul.c b/src/ec/ref/ecx/poly-mul.c deleted file mode 100644 index 67e4dd3..0000000 --- a/src/ec/ref/ecx/poly-mul.c +++ /dev/null @@ -1,1025 +0,0 @@ -#define _POLY_MUL_REDC_H_ -#include -#include - -void poly_mul(poly h, const poly f, const int lenf, const poly g, const int leng) -{ - // Karatsuba multiplication of polynomials h = f*g - // REQUIRES that h have enough space for lenf + leng - 1 terms - // NOT responsible for terms in h beyond h[lenf + leng - 2] - - int i; - const int lenh = lenf + leng - 1; - - if (lenf < leng) - { - poly_mul(h, g, leng, f, lenf); - return; - } - - // Resulting degree is negative - if(lenh <= 0) - return; - - // Multiplication by 0 polynomial - if(leng == 0) - { - for(i = 0; i < lenf-1; i++) - fp2_set(&h[i], 0); - return; - } - - // Multiplication by constant - if(leng == 1) - { - fp2_t fc[lenf], gc; // copy of f and g - for(i = 0; i < lenf; i++) - fp2_copy(&fc[i], &f[i]); - - fp2_copy(&gc, &g[0]); - for (i = 0; i < lenh; i++) - fp2_mul(&h[i], &fc[i], &gc); - - - return; - } - - // At this point we ensure lenf >= leng >= 2 - - // Case when lenf = leng = 2 - if (lenf == 2) - { - fp2_t t0, t1, t2; - fp2_add(&t1, &f[0], &f[1]); - fp2_add(&t2, &g[0], &g[1]); - fp2_mul(&t0, &f[0], &g[0]); - fp2_mul(&h[2], &f[1], &g[1]); - fp2_mul(&t1, &t1, &t2); - fp2_sub(&t1, &t1, &t0); - fp2_sub(&h[1], &t1, &h[2]); - fp2_copy(&h[0], &t0); - return; - } - - // Cases for f cuadratic - if (lenf == 3) - { - // Case when f is cuadratic and g linear - if (leng == 2) - { - fp2_t t0, t1, t2, t3; - fp2_mul(&t0, &f[0], &g[0]); - fp2_mul(&t2, &f[1], &g[1]); - fp2_add(&t3, &f[0], &f[1]); - fp2_add(&t1, &g[0], &g[1]); - fp2_mul(&t1, &t1, &t3); - fp2_sub(&t1, &t1, &t2); - fp2_sub(&t1, &t1, &t0); - fp2_mul(&t3, &f[2], &g[1]); - fp2_mul(&h[2], &f[2], &g[0]); - fp2_add(&h[2], &h[2], &t2); - fp2_copy(&h[0], &t0); - fp2_copy(&h[1], &t1); - fp2_copy(&h[3], &t3); - return; - } - - // Case when f,g both cuadratic - if (leng == 3) - { - fp2_t fg_high[3], t0, t1, t2; - - poly_mul(fg_high, &(f[1]), 2, &(g[1]), 2); - - fp2_add(&t0, &f[0], &f[1]); - fp2_add(&t1, &g[0], &g[1]); - fp2_mul(&t1, &t0, &t1); - fp2_add(&t0, &f[0], &f[2]); - fp2_add(&t2, &g[0], &g[2]); - fp2_mul(&t2, &t0, &t2); - - fp2_mul(&h[0], &f[0], &g[0]); - - fp2_sub(&t1, &t1, &h[0]); - fp2_sub(&h[1], &t1, &fg_high[0]); - fp2_sub(&t2, &t2, &h[0]); - fp2_sub(&t2, &t2, &fg_high[2]); - fp2_add(&h[2], &t2, &fg_high[0]); - fp2_copy(&h[3], &fg_high[1]); - fp2_copy(&h[4], &fg_high[2]); - - return; - } - } - - // At this point we ensure lenf >= 4 and lenf >= leng - - const int nf = lenf >> 1; - const int mf = lenf - nf; - const int mg = leng - nf; - - // Case when g is half the size of f - if (leng <= nf) - { - fp2_t fg_low[nf + leng -1], fg_high[mf + leng -1]; - - poly_mul(fg_low, f, nf, g, leng); - poly_mul(fg_high, &(f[nf]), mf, g, leng); - for(i = 0; i < nf; i++) - fp2_copy(&h[i], &fg_low[i]); - - for(i = nf; i < nf + leng - 1; i++) - fp2_add(&h[i], &fg_high[i-nf], &fg_low[i]); - - for(i = nf + leng - 1; i < lenh; i++) - fp2_copy(&h[i], &fg_high[i - nf]); - - return; - } - - - // All other cases - // Strategy is to spli f and g, into - // f(x) = f0(x) + x^nf*f1(x) and g(x) = g0(x) + x^nf*g1(x) where nf = floor(lenf/2) - // such that f(x)*g(x) = fg_low(x) + x^nf*fg_mid(x) + x^2nf*fg_high(x) where: - // fg_low(x) = f0(x)*g0(x) - // fg_mid(x) = f0(x)*g1(x) + f1(x)*g0(x) - // fg_high(x) = f1(x)*g1(x) - - fp2_t f_mid[mf], g_mid[mf], fg_low[2*nf-1], fg_mid[2*mf-1], fg_high[mf+mg-1]; - - for(i = 0; i < nf; i++) - fp2_add(&f_mid[i], &f[i], &f[i+nf]); - - if(lenf & 1) - fp2_copy(&f_mid[nf], &f[lenf-1]); - - i = 0; - while(i < nf && i < mg) - { - fp2_add(&g_mid[i], &g[i], &g[nf+i]); - i++; - } - while(i < nf) - { - fp2_copy(&g_mid[i], &g[i]); - i++; - } - - poly_mul(fg_low, f, nf, g, nf); - poly_mul(fg_high, &(f[nf]), mf, &(g[nf]), mg); - - if((lenf & 1) && (mg == mf)) - { - fp2_copy(&g_mid[nf], &g[leng - 1]); - poly_mul(fg_mid, f_mid, mf, g_mid, mf); - } - else - { - poly_mul(fg_mid, f_mid, mf, g_mid, nf); - } - - - for(i = 0; i < mf + mg - 1; i++) - fp2_sub(&fg_mid[i], &fg_mid[i], &fg_high[i]); - - for(i = 0; i < 2*nf-1; i++) - fp2_sub(&fg_mid[i], &fg_mid[i], &fg_low[i]); - - for(i = 0; i < nf; i++) - fp2_copy(&h[i], &fg_low[i]); - - for(i = nf; i < 2*nf-1; i++) - fp2_add(&h[i], &fg_low[i], &fg_mid[i-nf]); - - fp2_copy(&h[2*nf-1], &fg_mid[nf-1]); - - for(i = 2*nf; i < 2*nf+mf-1; i++) - fp2_add(&h[i], &fg_mid[i-nf], &fg_high[i-2*nf]); - - for(i = 2*nf+mf-1; i < lenh; i++) - fp2_copy(&h[i], &fg_high[i-2*nf]); - - return; -} - -void poly_mul_low(poly h, const int n, const poly f, const int lenf, const poly g, const int leng) -{ - // Karatsuba multiplication of polynomials h = f*g mod x^n - // REQUIRES that h have enough space for n terms - // NOT responsible for terms in h beyond h[n-1] - - // Ensure f is the one with highest degree - if(leng > lenf) - { - poly_mul_low(h, n, g, leng, f, lenf); - return; - } - - // Cleave g and f are too big - if(leng > n) - { - poly_mul_low(h, n, f, n, g, n); - return; - } - - // Cleave f is too big - if(lenf > n) - { - poly_mul_low(h, n, f, n, g, leng); - return; - } - - // Case when resulting degree is too small - if(n == 0) - return; - - // Multiplication by zero polynomial - if( (leng == 0) || (lenf == 0) ) - { - int i; - for(i = 0; i < n; i++) - fp2_set(&h[i], 0); - - return; - } - - // Multiplication mod x - if(n == 1) - { - fp2_mul(&h[0], &f[0], &g[0]); - return; - } - - // Case when no reduction is necessary - if(n >= lenf + leng - 1) - { - int i; - poly_mul(h, f, lenf, g, leng); - for(i = lenf + leng - 1; i < n; i++) - fp2_set(&h[i], 0); - - return; - } - - // Multiplication by a constant - if(leng == 1) - { - fp2_t fc[n], gc; // Copies for f,g - int i; - for(i = 0; i < n; i++) - fp2_copy(&fc[i], &f[i]); - - fp2_copy(&gc, &g[0]); - for(i = 0; i < n; i++) - fp2_mul(&h[i], &fc[i], &gc); - - return; - } - - - // Multiplication mod x^2 of two linear polynomials - if(n == 2) - { - fp2_t fg[2]; - - fp2_mul(&fg[1], &f[1], &g[0]); - fp2_mul(&fg[0], &f[0], &g[1]); - fp2_add(&fg[1], &fg[1], &fg[0]); - fp2_mul(&h[0], &f[0], &g[0]); - fp2_copy(&h[1], &fg[1]); - return; - } - - // Cases for multiplication mod x^3 - if(n == 3) - { - - // Multiplication mod x^3 of linear by cuadratic or linear - if(leng == 2) - { - fp2_t t0, t1, t2; - fp2_add(&t0, &f[0], &f[1]); - fp2_add(&t1, &g[0], &g[1]); - fp2_mul(&t1, &t0, &t1); - fp2_mul(&t2, &f[0], &g[0]); - fp2_sub(&t1, &t1, &t2); - fp2_mul(&t0, &f[1], &g[1]); - fp2_sub(&t1, &t1, &t0); - fp2_mul(&h[2], &f[2], &g[0]); - fp2_add(&h[2], &t0, &h[2]); - fp2_copy(&h[1], &t1); - fp2_copy(&h[0], &t2); - return; - } - - // Multiplication mod x^3 of two cuadratic polynomials - if(leng == 3) - { - fp2_t t0, t1, t2, t3, t4; - fp2_mul(&t0, &f[0], &g[0]); - fp2_mul(&t1, &f[1], &g[1]); - fp2_add(&t2, &f[0], &f[1]); - fp2_add(&t3, &g[0], &g[1]); - fp2_mul(&t2, &t2, &t3); - fp2_sub(&t2, &t2, &t0); - fp2_sub(&t2, &t2, &t1); - - fp2_add(&t3, &f[0], &f[2]); - fp2_add(&t4, &g[0], &g[2]); - fp2_mul(&t3, &t3, &t4); - fp2_mul(&t4, &f[2], &g[2]); - fp2_sub(&t3, &t3, &t4); - fp2_sub(&t3, &t3, &t0); - fp2_add(&h[2], &t3, &t1); - - fp2_copy(&h[0], &t0); - fp2_copy(&h[1], &t2); - return; - } - } - - // Special case for small values, currently only used for n=4, leng=4 - if((n==4) && (leng==4)) - { - int i, j, k; - int S = n; - const int nf = n >> 1; - const int nc = n - nf; - fp2_t t0, t1; - - for(i = 0; i < nf; i++) - S = S + n - 1 - 2*i; - - fp2_t c[S]; - - for(i = 0; i < n; i++) - fp2_mul(&c[i], &f[i], &g[i]); - - k = n; - for(i = 0; i < nf; i++) - { - for(j = 0; j < n-2*i-1; j++) - { - fp2_add(&t0, &f[i], &f[i+j+1]); - fp2_add(&t1, &g[i], &g[i+j+1]); - fp2_mul(&c[k], &t0, &t1); - fp2_add(&t0, &c[i], &c[i+j+1]); - fp2_sub(&c[k], &c[k], &t0); - k++; - } - } - - fp2_copy(&c[n-1], &c[0]); - for(i = 1; i < nf; i++) - { - for(j = 1; j < n-2*i; j++) - fp2_add(&c[n+2*i-1+j], &c[n+2*i-1+j], &c[(1+i)*n-i*i-1+j]); - } - - for(i = 1; i < nc; i++) - fp2_add(&c[n+2*i-1], &c[n+2*i-1], &c[i]); - - for(i = n-1; i < 2*n-1; i++) - fp2_copy(&h[i-n+1], &c[i]); - - return; - } - - - // All other cases (n >= 4 and reduction is necessary for f*g but not f nor g): - - // Strategy is to split f, g into odd and even powers. E.j. f(x) = f0(x^2) + x*f1(x^2) - // Such that f*g(x) = fg_0(x^2) + x*fg_01(x^2) + x^2*fg_1(x^2) where: - // fg_0(x) = f0(x)*g0(x) mod x^ceil(n/2) - // fg_01(x) = (f0(x)g1(x)+f1(x)g0(x)) mod x^floor(n/2) - // fg_1(x) = f1(x)g1(x) mod x^ceil(n/2-1) - - int i; - const int l1 = n >> 1; - const int l0 = n - l1; - - //Split f - const int lenf1 = lenf >> 1; - const int lenf0 = lenf - lenf1; - fp2_t f0[lenf0], f1[lenf1]; - for(i = 0; i < lenf1; i++) - { - fp2_copy(&f0[i], &f[2*i]); - fp2_copy(&f1[i], &f[2*i+1]); - } - - if(lenf0 > lenf1) - fp2_copy(&f0[lenf0-1], &f[lenf - 1]); - - //Split g - const int leng1 = leng >> 1; - const int leng0 = leng - leng1; - fp2_t g0[leng0], g1[leng1]; - for(i = 0; i < leng1; i++) - { - fp2_copy(&g0[i], &g[2*i]); - fp2_copy(&g1[i], &g[2*i+1]); - } - - if(leng0 > leng1) - fp2_copy(&g0[leng0-1], &g[leng - 1]); - - //Compute f01 = f0 + f1 - fp2_t f01[lenf0]; - for(i = 0; i < lenf1; i++) - fp2_add(&f01[i], &f0[i], &f1[i]); - - if(lenf0 > lenf1) - fp2_copy(&f01[lenf0-1], &f0[lenf0-1]); - - //Compute g01 = g0 + g1 - fp2_t g01[leng0]; - for(i = 0; i < leng1; i++) - fp2_add(&g01[i], &g0[i], &g1[i]); - - if(leng0 > leng1) - fp2_copy(&g01[leng0-1], &g0[leng0-1]); - - //Compute fg_0(x) - int n0 = lenf0 + leng0 - 1; - if(n0 > l0) - n0 = l0; - - fp2_t fg_0[n0]; - poly_mul_low(fg_0, n0, f0, lenf0, g0, leng0); - - //Compute fg_1(x) - int n1 = lenf1 + leng1 - 1; - if(n1 > l1) - n1 = l1; - - fp2_t fg_1[n1]; - poly_mul_low(fg_1, n1, f1, lenf1, g1, leng1); - - //Compute fg_01(x) = f_01(x) * g_01(x) mod x^floor(n/2); - int n01 = lenf0 + leng0 -1; - if(n01 > l1) - n01 = l1; - - fp2_t fg_01[n01]; - poly_mul_low(fg_01, n01, f01, lenf0, g01, leng0); - - //Substractic fg_0 and fg_1 from fg_01 - //Note that the sizes satisfy n1 <= n01 <= n0 - //Result can be stored directly to h already - - i = 0; - while(i < n1) - { - fp2_sub(&fg_01[i], &fg_01[i], &fg_0[i]); - fp2_sub(&h[2*i+1], &fg_01[i], &fg_1[i]); - i++; - } - while(i < n01) - { - fp2_sub(&h[2*i+1], &fg_01[i], &fg_0[i]); - i++; - } - - //Combine the result for fg_1 and fg_0 - fp2_copy(&h[0], &fg_0[0]); - for(i = 1; i < n1; i++) - fp2_add(&h[2*i], &fg_0[i], &fg_1[i-1]); - if(2*n1 < n) - fp2_add(&h[2*n1], &fg_0[n1], &fg_1[n1-1]); - - return; -} - - -// The following two function compute the middle section of a product and are based -// on "The Middle Product Algorithm, I." by G. Hanrot. M. Quercia, and P. Zimmermann -void quasi_poly_mul_middle(poly h, const poly g, const int leng, const poly f, const int lenf) -{ - // Computes the middle part of the product, sepcifically fg[lenf-leng:lenf], - // for the special case of lenf = 2*leng-1 - // REQUIRES that h have space for leng terms and that lenf = 2*leng-1 - // NOT responsible for terms in h beyond h[leng-1] - assert(lenf >= (2*leng - 1)); - - if(leng == 0) - return; - - if(leng == 1) - { - fp2_mul(&h[0], &g[0], &f[0]); - return; - } - - int i; - const int leng0 = leng >> 1; - const int leng1 = leng - leng0; - const int lenF = 2*leng1-1; - fp2_t F[lenF], G[leng1]; - - fp2_t A[leng1]; - for(i = 0; i < lenF; i++) - fp2_add(&F[i], &f[i], &f[i+leng1]); - - quasi_poly_mul_middle(A, &(g[leng0]), leng1, F, lenF); - - fp2_t B[leng1]; - if(leng & 1) - { - fp2_copy(&G[0], &g[leng0]); - for(i = 0; i < leng0; i++) - fp2_sub(&G[i+1], &g[leng1+i], &g[i]); - - } - else - { - for(i = 0; i < leng0; i++) - fp2_sub(&G[i], &g[leng1+i], &g[i]); - - } - - quasi_poly_mul_middle(B, G, leng1, &(f[leng1]), lenF); - - fp2_t C[leng0]; - for(i = 0; i < 2*leng0-1; i++) - fp2_add(&F[i], &f[i+leng1], &f[i+2*leng1]); - - quasi_poly_mul_middle(C, g, leng0, F, 2*leng0-1); - - for(i = 0; i < leng1; i++) - fp2_sub(&h[i], &A[i], &B[i]); - - for(i = 0; i < leng0; i++) - fp2_add(&h[i+leng1], &C[i], &B[i]); - - return; -} - -void poly_mul_middle(poly h, const poly g, const int leng, const poly f, const int lenf) -{ - // Computes the middle part of the product, sepcifically fg[lenf-leng:lenf], for lenf >= leng - // Note that this is equivalent to the highest leng terms of fg mod x^(lenf) - // REQUIRES that h have space for leng terms and that lenf > leng - // NOT responsible for terms in h beyond h[leng-1] - - int i; - - // Case of deg(f) odd and deg(g) = floor(deg(f)/2), ie lengths n and 2n - if ( (leng == lenf >> 1) && !(lenf & 1) ) - { - // f1 = f[1:]+[0] - fp2_t f1[lenf]; - for(i = 0; i < lenf - 1; i++) - fp2_copy(&f1[i], &f[i+1]); - - fp2_set(&f1[lenf-1], 0); - quasi_poly_mul_middle(h, g, leng, f1, lenf); - return; - } - - // Case of deg(f) odd and deg(g) = ceil(deg(f)/2), ie lengths n and 2n-2 - if( (leng == (lenf>>1)+1) && !(lenf & 1) ) - { - // f1 = [0]+f[:] - fp2_t f1[lenf+1]; - fp2_set(&f1[0], 0); - for(i = 0; i < lenf; i++) - fp2_copy(&f1[i+1], &f[i]); - - quasi_poly_mul_middle(h, g, leng, f1, lenf+1); - return; - } - - // Case of deg(f) even and deg(g) = deg(f)/2, ie lengths n and 2n-1 - if( (leng == (lenf>>1)+1) && (lenf & 1) ) - { - quasi_poly_mul_middle(h, g, leng, f, lenf); - return; - } - - - // Unbalanced case, for deg(g) > ceil(deg(f)/2) or deg(g) < floor(deg(f)/2) - - if(leng == 0) - return; - - const int lenF0 = lenf-leng; - fp2_t F0[lenF0], G[leng]; - for(i = 0; i < lenF0; i++) - fp2_copy(&F0[i], &f[lenF0-1-i]); - - for( i = 0; i < leng; i++) - fp2_copy(&G[i], &g[leng-1-i]); - - fp2_t fg_low[leng-1], fg_low_reverse[leng-1]; - poly_mul_low(fg_low, leng-1, F0, lenF0, G, leng); - for(i = 0; i < leng-1; i++) - fp2_copy(&fg_low_reverse[i], &fg_low[leng-2-i]); - - fp2_t fg_high[leng]; - poly_mul_low(fg_high, leng, &(f[lenF0]), leng, g, leng); - - for(i = 0; i < leng-1; i++) - fp2_add(&h[i], &fg_low_reverse[i], &fg_high[i]); - - fp2_copy(&h[leng-1], &fg_high[leng-1]); - return; -} - - -void poly_mul_selfreciprocal(poly h, const poly g, const int leng, const poly f, const int lenf) -{ - // Computes the product h= f*g of self reciprocal polynomials of same length - // Note: a polynomial is self reciprocal if f(x) = x^deg(f) * f(1/x), or equivalently - // if the list of coefficients is a palyndrome. - // REQUIRES that h have space for lenf+leng-1 entries - // NOT responsible for terms in h beyond h[lenf+leng-1] - - // Case for same length - if(lenf==leng) - { - if(lenf == 0) - return; - - if(lenf == 1) - { - fp2_mul(&h[0], &g[0], &f[0]); - return; - } - - if(lenf == 2) - { - fp2_mul(&h[0], &g[0], &f[0]); - fp2_add(&h[1], &h[0], &h[0]); - fp2_copy(&h[2], &h[0]); - return; - } - - if(lenf == 3) - { - fp2_t t0, t1; - fp2_add(&t0, &g[0], &g[1]); - fp2_add(&t1, &f[0], &f[1]); - fp2_mul(&t1, &t0, &t1); - fp2_mul(&t0, &g[0], &f[0]); - fp2_mul(&h[2], &g[1], &f[1]); - fp2_add(&h[2], &h[2], &t0); - fp2_copy(&h[0], &t0); - fp2_sub(&h[1], &t1, &h[2]); - fp2_add(&h[2], &h[2], &h[0]); - fp2_copy(&h[3], &h[1]); - fp2_copy(&h[4], &h[0]); - return; - } - - if(lenf == 4) - { - fp2_t t0, t1; - fp2_add(&t0, &g[0], &g[1]); - fp2_add(&t1, &f[0], &f[1]); - fp2_mul(&t1, &t0, &t1); - fp2_mul(&t0, &g[0], &f[0]); - fp2_mul(&h[3], &g[1], &f[1]); - fp2_copy(&h[2], &t1); - fp2_copy(&h[0], &t0); - fp2_sub(&h[2], &h[2], &h[0]); - fp2_sub(&h[1], &h[2], &h[3]); - fp2_add(&h[3], &h[3], &h[0]); - fp2_add(&h[3], &h[3], &h[3]); - fp2_copy(&h[4], &h[2]); - fp2_copy(&h[5], &h[1]); - fp2_copy(&h[6], &h[0]); - return; - } - - if(lenf == 5) - { - fp2_t t0, t1, t2, t3, t4; - fp2_sub(&t1, &g[1], &g[0]); - fp2_sub(&t0, &f[0], &f[1]); - fp2_mul(&t1, &t1, &t0); - fp2_sub(&t2, &g[2], &g[0]); - fp2_sub(&t0, &f[0], &f[2]); - fp2_mul(&t2, &t0, &t2); - fp2_sub(&t3, &g[2], &g[1]); - fp2_sub(&t0, &f[1], &f[2]); - fp2_mul(&t3, &t3, &t0); - fp2_mul(&t0, &g[1], &f[1]); - fp2_mul(&t4, &g[2], &f[2]); - fp2_mul(&h[0], &g[0], &f[0]); - fp2_copy(&h[1], &t1); - fp2_copy(&h[2], &t2); - fp2_copy(&h[3], &t3); - fp2_add(&h[5], &t0, &h[0]); - fp2_add(&h[1], &h[1], &h[5]); - fp2_add(&h[3], &h[3], &h[1]); - fp2_add(&h[4], &h[5], &t4); - fp2_add(&h[4], &h[4], &h[5]); - fp2_add(&h[2], &h[2], &h[5]); - fp2_add(&h[2], &h[2], &t4); - fp2_add(&h[3], &h[3], &t0); - fp2_add(&h[3], &h[3], &t4); - fp2_copy(&h[5], &h[3]); - fp2_copy(&h[6], &h[2]); - fp2_copy(&h[7], &h[1]); - fp2_copy(&h[8], &h[0]); - return; - } - - // General case for same lengths - if(lenf & 1) - { - // Odd length - // Strategy is to split f, g into odd and even powers. E.j. f(x) = f0(x^2) + x*f1(x^2) - // Such that f*g(x) = h0(x^2) + x*h01(x^2) + x^2*h1(x^2) where: - // h0(x) = f0(x)*g0(x) - // h01(x) = (f0(x)g1(x)+f1(x)g0(x)) - // h1(x) = f1(x)g1(x) - - int i; - const int len1 = lenf >> 1; - const int len0 = len1 + 1; - - fp2_t g0[len0], f0[len0], g1[len1], f1[len1]; - for(i = 0; i < len1; i++) - { - fp2_copy(&g0[i], &g[2*i]); - fp2_copy(&f0[i], &f[2*i]); - fp2_copy(&g1[i], &g[2*i+1]); - fp2_copy(&f1[i], &f[2*i+1]); - } - - fp2_copy(&g0[len1], &g[2*len1]); - fp2_copy(&f0[len1], &f[2*len1]); - - fp2_t h0[2*len0-1]; - poly_mul_selfreciprocal(h0, g0, len0, f0, len0); - - fp2_t h1[2*len1-1]; - poly_mul_selfreciprocal(h1, g1, len1, f1, len1); - - fp2_t h01[2*len0-1]; - for(i = 0; i < len1; i++) - { - fp2_add(&g0[i], &g0[i], &g1[i]); - fp2_add(&f0[i], &f0[i], &f1[i]); - fp2_add(&g0[i+1], &g0[i+1], &g1[i]); - fp2_add(&f0[i+1], &f0[i+1], &f1[i]); - } - poly_mul_selfreciprocal(h01, g0, len0, f0, len0); - - // Mixing results for the odd degree part - for(i = 0; i < 2*len0-1; i++) - fp2_sub(&h01[i], &h01[i], &h0[i]); - - for(i = 0; i < 2*len1-1; i++) - fp2_sub(&h01[i], &h01[i], &h1[i]); - - for(i = 0; i < 2*len1-1; i++) - { - fp2_sub(&h01[i+1], &h01[i+1], &h1[i]); - fp2_sub(&h01[i+1], &h01[i+1], &h1[i]); - } - for(i = 0; i < 2*len1-1; i++) - fp2_sub(&h01[i+2], &h01[i+2], &h1[i]); - - fp2_copy(&h[1], &h01[0]); - for(i = 1; i < 2*len0-2; i++) - fp2_sub(&h[2*i+1], &h01[i], &h[2*i-1]); - - // Mixing results for the even degree parts - fp2_copy(&h[0], &h0[0]); - for(i = 1; i < 2*len1; i++) - fp2_add(&h[2*i], &h0[i], &h1[i-1]); - - fp2_copy(&h[4*len1], &h0[2*len1]); - return; - } - else - { - // Even length - // Strategy is to spli f and g, into - // f(x) = f0(x) + x^nf*f1(x) and g(x) = g0(x) + x^nf*g1(x) where nf = floor(lenf/2) - // such that f(x)*g(x) = fg_low(x) + x^nf*fg_mid(x) + x^2nf*fg_high(x) where: - // fg_low(x) = f0(x)*g0(x) - // fg_mid(x) = f0(x)*g1(x) + f1(x)*g0(x) <-[reverse of f0g1] - // fg_high(x) = f1(x)*g1(x) <-[reverse of fg_low] - - int i; - const int half = leng >> 1; - fp2_t h1[leng-1]; - - poly_mul(h, g, half, f, half); - poly_mul(h1, g, half, &(f[half]), half); - - fp2_set(&h[leng-1], 0); - for(i = 0; i < half; i++) - { - fp2_add(&h[half+i], &h[half+i], &h1[i]); - fp2_add(&h[half+i], &h[half+i], &h1[leng-2-i]); - } - - for(i = 0; i < leng-1; i++) - fp2_copy(&h[2*leng-2-i], &h[i]); - - return; - } - } - else - { - // Case for different lengths - const int m = (lenf+leng) >> 1; - int i; - - poly_mul_low(h, m, g, leng, f, lenf); - for(i = m; i < lenf+leng-1; i++) - fp2_copy(&h[i], &h[lenf+leng-2-i]); - - return; - } -} - - -void product_tree(poly H[], int DEG[], const int root, const poly F[], const int LENF, const int n) -{ - // Given an array F containing n polynomials of the same length LENF, - // Writes the product tree of the polynomials to the tree rooted at H[root]. - // - // The tree is represented by an array where, for node H[i], the left child is H[2*i+1] and - // the right child is H[2*i+2]. The root of the complete tree is intended to be H[0]. - // - // Also writes to DEG the tree containing the degree of the corresponding polynomials. - // - // REQUIRES H and DEG to have enough space for 2^(k+2)-1 terms where k = ceil(log2(n)) - - int i; - if(n == 1) - { - H[root] = malloc(sizeof(fp2_t)*LENF); - for(i = 0; i < LENF; i++) - fp2_copy(&H[root][i], &F[0][i]); - - DEG[root] = LENF-1; - return; - } - - const int n1 = n >> 1; - const int n0 = n - n1; - const int left = 2*root+1; - const int right = left + 1; - product_tree(H, DEG, left, F, LENF, n0); - product_tree(H, DEG, right, &(F[n0]), LENF, n1); - DEG[root] = DEG[left] + DEG[right]; - H[root] = malloc(sizeof(fp2_t)*(DEG[left]+DEG[right]+1)); - poly_mul(H[root], H[left], DEG[left]+1, H[right], DEG[right]+1); - return; -} - - - -void product_tree_LENFeq2(poly H[], int DEG[], const int root, const fp2_t F[][2], const int n) -{ - // Same as product tree but allows F to be given as a double array with LENF fixed to 2 - int i; - if(n == 1) - { - H[root] = malloc(sizeof(fp2_t)*2); - for(i = 0; i < 2; i++) - fp2_copy(&H[root][i], &F[0][i]); - - DEG[root] = 1; - return; - } - - const int n1 = n >> 1; - const int n0 = n - n1; - const int left = 2*root+1; - const int right = left + 1; - product_tree_LENFeq2(H, DEG, left, F, n0); - product_tree_LENFeq2(H, DEG, right, &(F[n0]), n1); - DEG[root] = DEG[left] + DEG[right]; - H[root] = malloc(sizeof(fp2_t)*(DEG[left]+DEG[right]+1)); - poly_mul(H[root], H[left], DEG[left]+1, H[right], DEG[right]+1); - return; -} - - - -void product_tree_LENFeq3(poly H[], int DEG[], const int root, const fp2_t F[][3], const int n) -{ - // Same as product tree but allows F to be given as a double array with LENF fixed to 3 - int i; - if(n == 1) - { - H[root] = malloc(sizeof(fp2_t)*3); - for(i = 0; i < 3; i++) - fp2_copy(&H[root][i], &F[0][i]); - - DEG[root] = 3-1; - return; - } - - const int n1 = n >> 1; - const int n0 = n - n1; - const int left = 2*root+1; - const int right = left + 1; - product_tree_LENFeq3(H, DEG, left, F, n0); - product_tree_LENFeq3(H, DEG, right, &(F[n0]), n1); - DEG[root] = DEG[left] + DEG[right]; - H[root] = malloc(sizeof(fp2_t)*(DEG[left]+DEG[right]+1)); - poly_mul(H[root], H[left], DEG[left]+1, H[right], DEG[right]+1); - return; -} - - -void product_tree_selfreciprocal(poly H[], int DEG[], const int root, const poly F[], const int LENF, const int n) -{ - // Same as product_tree but for selfreciprocal inputs - - int i; - if(n == 1) - { - H[root] = malloc(sizeof(fp2_t)*LENF); - for(i = 0; i < LENF; i++) - fp2_copy(&H[root][i], &F[0][i]); - - DEG[root] = LENF-1; - return; - } - - const int n1 = n >> 1; - const int n0 = n - n1; - const int left = 2*root+1; - const int right = left + 1; - product_tree_selfreciprocal(H, DEG, left, F, LENF, n0); - product_tree_selfreciprocal(H, DEG, right, &(F[n0]), LENF, n1); - DEG[root] = DEG[left] + DEG[right]; - H[root] = malloc(sizeof(fp2_t)*(DEG[left]+DEG[right]+1)); - poly_mul_selfreciprocal(H[root], H[left], DEG[left]+1, H[right], DEG[right]+1); - return; -} - -void product_tree_selfreciprocal_LENFeq3(poly H[], int DEG[], const int root, const fp2_t F[][3], const int n) -{ - // Same as product_tree_selfreciprocal but allows F to be given as a double array with LENF fixed to 3 - - int i; - if(n == 1) - { - H[root] = malloc(sizeof(fp2_t)*3); - for(i = 0; i < 3; i++) - fp2_copy(&H[root][i], &F[0][i]); - - DEG[root] = 3-1; - return; - } - - const int n1 = n >> 1; - const int n0 = n - n1; - const int left = 2*root+1; - const int right = left + 1; - product_tree_selfreciprocal_LENFeq3(H, DEG, left, F, n0); - product_tree_selfreciprocal_LENFeq3(H, DEG, right, &(F[n0]), n1); - DEG[root] = DEG[left] + DEG[right]; - H[root] = malloc(sizeof(fp2_t)*(DEG[left]+DEG[right]+1)); - poly_mul_selfreciprocal(H[root], H[left], DEG[left]+1, H[right], DEG[right]+1); - return; -} - -void clear_tree(poly H[], const int root, const int n) -{ - // Frees all dynamic memory in a polynomial tree rooted at H[root] and generated by n leafs - - if(n == 1) - { - free(H[root]); - return; - } - - clear_tree(H, 2*root+1, n-(n>>1)); - clear_tree(H, 2*root+2, n>>1); - free(H[root]); - return; -} - - - -void product(fp2_t *c, const fp2_t F[], const int n) -{ - // Given an array F of n constant polynomials, writes their product to c - int i; - - fp_mont_setone((*c).re);fp_set((*c).im,0); - - // Empty list must returns 1 - if (n == 0) - return; - - // At this step, we ensure there is at least one element in the list - fp2_copy(&*c, &F[0]); - for(i = 1; i < n; i++) - fp2_mul(&*c, &*c, &F[i]); - - return; -} diff --git a/src/ec/ref/ecx/poly-redc.c b/src/ec/ref/ecx/poly-redc.c deleted file mode 100644 index 393e87f..0000000 --- a/src/ec/ref/ecx/poly-redc.c +++ /dev/null @@ -1,349 +0,0 @@ -#define _POLY_MUL_REDC_H_ -#include "poly.h" -#include - -void reciprocal(poly h, fp2_t *c, const poly f, const int lenf, const int n){ - - // Writes a polynomial to h and a field element to c such that f*h = c mod x^n - // REQUIRES h to have space for n terms - // NOT responsible for terms in h beyond h[n-1] - - int i; - - // Case when f needs to be padded with zeroes - if(n > lenf) - { - fp2_t fpad[n]; - for(i = 0; i < lenf; i++) - fp2_copy(&fpad[i], &f[i]); - for(i = lenf; i < n; i++) - fp2_set(&fpad[i], 0); - reciprocal(h, c, fpad, n, n); - return; - } - - // Trivial case - if(n == 0) - { - fp2_set(&*c, 0); - return; - } - - // Case n = 1 - if(n == 1) - { - fp2_copy(&*c, &f[0]); - fp_mont_setone(h[0].re);fp_set(h[0].im,0); - return; - } - - // Case n = 2 - if(n == 2) - { - fp2_sqr(&*c, &f[0]); - fp2_copy(&h[0], &f[0]); - fp2_neg(&h[1], &f[1]); - return; - } - - // Case n = 3 - if(n == 3) - { - fp2_t t0, t1; - - fp2_sqr(&t0, &f[1]); - fp2_mul(&t1, &f[0], &f[2]); - fp2_sub(&t1, &t1, &t0); - fp2_mul(&t1, &t1, &f[0]); - - reciprocal(h, c, f, 2, 2); - fp2_mul(&h[0], &h[0], &*c); - fp2_mul(&h[1], &h[1], &*c); - fp2_neg(&h[2], &t1); - fp2_sqr(&*c, &*c); - return; - } - - // Case n = 4 - if(n == 4) - { - fp2_t t0, t1, t2, t3, g[2]; - - reciprocal(g, &t3, f, 2, 2); - fp2_sqr(&t0, &f[1]); - fp2_mul(&t1, &g[0], &f[2]); - fp2_mul(&t2, &g[0], &f[3]); - fp2_mul(&h[1], &g[1], &f[2]); - fp2_sub(&t0, &t1, &t0); - fp2_add(&t1, &t2, &h[1]); - fp2_mul(&t2, &t0, &g[0]); - fp2_mul(&h[1], &t0, &g[1]); - fp2_mul(&h[3], &t1, &g[0]); - fp2_add(&h[3], &h[1], &h[3]); - - fp2_mul(&h[0], &g[0], &t3); - fp2_mul(&h[1], &g[1], &t3); - fp2_neg(&h[2], &t2); - fp2_neg(&h[3], &h[3]); - fp2_sqr(&*c, &t3); - return; - } - - - // General case - // Compute the reciprocal g mod x^m for m = ceil(n/2) - // Then f*g-c is multiple of x^m so we only care about terms from m to n-1 - const int m = n - (n>>1); - fp2_t g[m], t[m], t0; - - reciprocal(g, &t0, f, lenf, m); - poly_mul_middle(t, g, m, f, n); - poly_mul_low(t, n-m, g, m, &(t[2*m-n]), n-m); - for(i = 0; i < m; i++) - fp2_mul(&h[i], &g[i], &t0); - for(i = m; i < n; i++) - fp2_neg(&h[i], &t[i-m]); - fp2_sqr(&*c, &t0); - return; -} - - -void poly_redc(poly h, const poly g, const int leng, const poly f, const int lenf,// - const poly f_rev_inv, const fp2_t c) -{ - // Computes h(x) = a * g(x) mod f(x) for some scalar a, writting lenf-1 terms to h. - // REQUIRES an inverse f_rev_inv such that f_rev*f_rev_inv = c mod x^(leng-lenf+1), - // where f_rev is the polynomial with the coefficients of f listed in reverse order. - // The scalar a is equal to c, except for special cases: - // - If leng= DEG[0] and that R,A have enough space for the tree (see product_tree) - - if(n == 0) - return; - - const int parent = (root-1) >> 1; - const int brother = root - 1 + 2*(root & 1); - int lenr; - - if(root > 0) - lenr = DEG[parent] - DEG[root]; - else - lenr = leng - DEG[root]; - - R[root] = malloc(sizeof(fp2_t)*lenr); - - // ---------------------------------- - // base cases determined by poly_redc - if(n == 1) - return; - - - // case for computing g mod f when len(f), len(g) = 3 - if (DEG[root] == 2 && lenr == 1) - { - reciprocal_tree(R, A, lenr-1, H, DEG, 2*root+1, n-(n>>1)); - reciprocal_tree(R, A, lenr-1, H, DEG, 2*root+2, n>>1); - return; - } - - // ---------------------------------- - - int i; - - // When the parent's inverse was calculated to a smaller modulus, need to invert from scratch - if(root == 0 || leng < lenr) - { - for(i = 0; i < lenr && i < DEG[root]+1; i++) - fp2_copy(&R[root][i], &H[root][DEG[root]-i]); - for(i = DEG[root]+1; i < lenr; i++){ - fp2_set(&R[root][i], 0); - } - reciprocal(R[root], &(A[root]), R[root], lenr, lenr); - } - else - { - // When parent's inverse was to a greater/equal modulus, this inverse can be obtained from it - for(i = 0; i < lenr; i++) - fp2_copy(&R[root][i], &H[brother][DEG[brother]-i]); - poly_mul_low(R[root], lenr, R[parent], leng, R[root], lenr); - fp2_copy(&A[root], &A[parent]); - } - - // Now move on to the children - reciprocal_tree(R, A, lenr-1, H, DEG, 2*root+1, n-(n>>1)); - reciprocal_tree(R, A, lenr-1, H, DEG, 2*root+2, n>>1); - return; -} - - -void multieval_unscaled(fp2_t REM[], const poly g, const int leng, const poly R[], const fp2_t A[],// - const poly H[], const int DEG[], const int root, const int n) -{ - // Given the product tree H and reciprocal tree R,A generated by f_0, ... , f_{n-1}, - // with corresponding degrees tree DEG[] and rooted at root, writes the constant term - // of c_i*g mod f_i to REM[i]. The constants c_i are unspecified, but are a function - // only of leng and f_0,...,f_{n-1} so they cancel out when taking the ratios of - // remainders of different g's of the same length. - // - // REQUIRES REM to have space for n terms - - if(n == 0) - return; - - fp2_t g_mod[DEG[root]]; - poly_redc(g_mod, g, leng, H[root], DEG[root]+1, R[root], A[root]); - - if(n == 1) - { - fp2_copy(&REM[0], &g_mod[0]); - return; - } - - multieval_unscaled(REM, g_mod, DEG[root], R, A, H, DEG, 2*root+1, n-(n>>1)); - multieval_unscaled(&(REM[n-(n>>1)]), g_mod, DEG[root], R, A, H, DEG, 2*root+2, n>>1); - return; -} - - -void multieval_scaled(fp2_t REM[], const poly G, const poly H[], // - const int DEG[], const int root, const int n) -{ - // Given the product tree H generated by LINEAR f_0,...,f_{n-1} rooted at root and with - // corresponding degrees tree DEG, writes the constant term of c_i * g mod f_i(x) to REM[i] - // The constants c_i are unspecified but are only a function of leng and f_0,...,f_{n-1}, - // so they cancel out when taking the ratios of remainders of different g's of the same length. - // - // REQUIRES REM to have space for n terms and n > 1 - // Also REQUIRES G = rev((rev(g mod F)) * F_rev_inv mod x^deg(F)-1) where F = H[root] - // and F_rev_inv is its reverse's reciprocal mod x^deg(F) - - if(root == 0) - { - if(n == 1) - { - fp2_copy(&REM[0], &G[DEG[root]-1]); - return; - } - else - { - multieval_scaled(REM, G, H, DEG, 2*root+1, n-(n>>1)); - multieval_scaled(&(REM[n-(n>>1)]), G, H, DEG, 2*root+2, n>>1); - return; - } - } - - const int parent = (root-1) >> 1; - const int brother = root - 1 + 2*(root & 1); - const int uncle = parent - 1 + 2*(parent & 1); - fp2_t fg[DEG[brother]+1]; - - if(root > 2) - poly_mul_middle(fg, H[brother], DEG[brother]+1, G, DEG[uncle]+1); - else - poly_mul_middle(fg, H[brother], DEG[brother]+1, G, DEG[0]); - - - if(n == 1) - { - fp2_copy(&REM[0], &fg[DEG[brother]]); - return; - } - - multieval_scaled(REM, fg, H, DEG, 2*root+1, n-(n>>1)); - multieval_scaled(&(REM[n-(n>>1)]), fg, H, DEG, 2*root+2, n>>1); - return; -} diff --git a/src/ec/ref/ecx/tedwards.c b/src/ec/ref/ecx/tedwards.c deleted file mode 100755 index b9af048..0000000 --- a/src/ec/ref/ecx/tedwards.c +++ /dev/null @@ -1,231 +0,0 @@ -#include -#include - -// a*x^2+y^2=1+d*x^2*y^2 -// a = A.x/A.z + 2, d = A.x/A.z - 2 - -void ted_init(ted_point_t* P) -{ // Initialize point as identity element (X:Y:Z:T) <- (0:1:1:0) - fp_t one = {0}; - - memset((digit_t*)P, 0, NWORDS_FIELD*RADIX*8/8); - one[0] = 1; - fp_tomont(P->x.re, one); -} - -void copy_ted_point(ted_point_t* P, ted_point_t const* Q) -{ - fp2_copy(&(P->x), &(Q->x)); - fp2_copy(&(P->y), &(Q->y)); - fp2_copy(&(P->z), &(Q->z)); - fp2_copy(&(P->t), &(Q->t)); -} - -void ted_dbl(ted_point_t *Q, ted_point_t const *P, ec_curve_t const* E) -{ - // A = X1^2 - // B = Y1^2 - // C = 2*Z1^2 - // D = a*A - // K = (X1+Y1)^2-A-B - // G = D+B - // F = G-C - // H = D-B - // X3 = K*F - // Y3 = G*H - // T3 = K*H - // Z3 = F*G - - // TODO: neutral element - fp2_t A, B, C, D, K, G, F, H; - - fp2_sqr(&A, &P->x); - fp2_sqr(&B, &P->y); - fp2_sqr(&C, &P->z); - fp2_add(&C, &C, &C); - fp2_mul(&D, &A, &E->A); - fp2_add(&K, &P->x, &P->y); - fp2_sqr(&K, &K); - fp2_sub(&K, &K, &A); - fp2_sub(&K, &K, &B); - fp2_add(&G, &D, &B); - fp2_sub(&F, &G, &C); - fp2_sub(&H, &D, &B); - fp2_mul(&Q->x, &K, &F); - fp2_mul(&Q->y, &G, &H); - fp2_mul(&Q->t, &K, &H); - fp2_mul(&Q->z, &F, &G); -} - -void ted_add(ted_point_t* S, ted_point_t const* P, ted_point_t const* Q, ec_curve_t const* E) -{ - // A = X1*X2 - // B = Y1*Y2 - // C = Z1*T2 - // D = T1*Z2 - // K = D+C - // F = (X1-Y1)*(X2+Y2)+B-A - // G = B+a*A - // H = D-C - // X3 = K*F - // Y3 = G*H - // T3 = K*H - // Z3 = F*G - - // TODO: neutral element - - ted_point_t res; - - if (is_ted_equal(P, Q)) { - ted_dbl(S, P, E); - return; - } - //assert(!is_ted_equal(P, Q)); - - ted_neg(&res, P); - if (is_ted_equal(&res, Q)) { - ted_init(S); - return; - } - // assert(!ted_equal(&res,Q)); - fp2_t A, B, C, D, K, F, G, H, tmp; - - fp2_mul(&A, &P->x, &Q->x); - fp2_mul(&B, &P->y, &Q->y); - fp2_mul(&C, &P->z, &Q->t); - fp2_mul(&D, &P->t, &Q->z); - fp2_add(&K, &D, &C); - fp2_add(&F, &Q->x, &Q->y); - fp2_sub(&tmp, &P->x, &P->y); - fp2_mul(&F, &F, &tmp); - fp2_add(&F, &F, &B); - fp2_sub(&F, &F, &A); - fp2_mul(&G, &A, &E->A); - fp2_add(&G, &G, &B); - fp2_sub(&H, &D, &C); - fp2_mul(&res.x, &K, &F); - fp2_mul(&res.y, &G, &H); - fp2_mul(&res.t, &K, &H); - fp2_mul(&res.z, &F, &G); - - if (fp2_is_zero(&res.x) && fp2_is_zero(&res.y) && fp2_is_zero(&res.z)) { - ted_dbl(S, P, E); - } else { - copy_ted_point(S, &res); - } -} - -void ted_neg(ted_point_t* Q, ted_point_t const* P) -{ - fp2_neg(&Q->x, &P->x); - fp2_copy(&Q->y, &P->y); - fp2_copy(&Q->z, &P->z); - fp2_neg(&Q->t, &P->t); -} - -static bool xLIFT(fp2_t* y, const ec_point_t* P, const ec_curve_t* curve) -{ // Returns false if it is on the curve, true if it is on the twist - fp2_t z2, tmp1, tmp2, y2; - - if (fp2_is_zero(&P->z)) return false; - - // (X^2 + Z^2) C - fp2_sqr(&tmp1, &P->x); - fp2_sqr(&z2, &P->z); - fp2_add(&tmp1, &tmp1, &z2); - fp2_mul(&tmp1, &tmp1, &curve->C); - - // X^2C + AXZ + Z^2C - fp2_mul(&tmp2, &P->x, &P->z); - fp2_mul(&tmp2, &tmp2, &curve->A); - fp2_add(&tmp1, &tmp1, &tmp2); - - // X^3C + AX^2Z + XZ^2C = Z^3(Cx^3 + Ax^2 + Cx) = Z^3 C (B*y^2) = Z C (B*Y^2) // x = X/Z - fp2_mul(&tmp1, &tmp1, &P->x); - // (ZC)^(-1) - fp2_mul(&tmp2, &curve->C, &P->z); - - assert(!fp2_is_zero(&tmp2)); - - fp2_inv(&tmp2); - fp2_mul(&y2, &tmp1, &tmp2); // (B*Y^2) - fp2_copy(y, &y2); - - if (fp2_is_square(&y2)) { // on the curve - fp2_sqrt(y); - return false; - } else { // on the twist - fp2_t tmp = fp2_non_residue(); - fp2_mul(y, y, &tmp); - fp2_sqrt(y); - return true; - } -} - -//void mont_to_ted(ec_point_t* E, ec_point_t const* A, bool twist) -void mont_to_ted(ec_curve_t* ted_curve, ec_curve_t const* curve) -{ - fp2_t tmp, two; - - // A : y^2 = x^3 + (a/c)x^2 + x - fp2_copy(&tmp, &curve->C); - fp2_inv(&tmp); // 1/c - fp2_mul(&tmp, &tmp, &curve->A); // a/c - fp2_set(&two, 2); - fp2_tomont(&two, &two); - fp2_add(&ted_curve->A, &tmp, &two); // a/c + 2 - fp2_sub(&ted_curve->C, &tmp, &two); // a/c - 2 - //if (twist) { - // B = Fp2_inv(fp2_non_residue) - // tmp = fp2_non_residue(); - // fp2_mul2(&E->x,&tmp); - // fp2_mul2(&E->z,&tmp); - //} -} - -void mont_to_ted_point(ted_point_t* Q, ec_point_t const* P, ec_curve_t const* curve) -{ - if (fp2_is_zero(&P->z)) { - fp2_set(&Q->x, 0); - fp2_set(&Q->y, 1); - fp2_set(&Q->z, 1); - fp2_set(&Q->t, 0); - fp_tomont(Q->y.re, Q->y.re); - fp_tomont(Q->z.re, Q->z.re); - } else { - fp2_t tmp, y; - - xLIFT(&y, P, curve); - fp2_add(&tmp, &P->x, &P->z); - fp2_mul(&Q->x, &P->x, &tmp); - fp2_sub(&Q->y, &P->x, &P->z); - fp2_mul(&Q->y, &Q->y, &y); - fp2_mul(&Q->z, &tmp, &y); - fp2_copy(&Q->t, &Q->z); - fp2_inv(&Q->t); - fp2_mul(&Q->t, &Q->t, &Q->x); - fp2_mul(&Q->t, &Q->t, &Q->y); - } -} - -void ted_to_mont_point(ec_point_t* Q, ted_point_t const* P) -{ - fp2_add(&Q->x, &P->z, &P->y); - fp2_sub(&Q->z, &P->z, &P->y); -} - -bool is_ted_equal(ted_point_t const* P1, ted_point_t const* P2) -{ - fp2_t x1z2, y1z2; - fp2_t y2z1, x2z1; - fp2_t t1y2, t2y1; - - fp2_mul(&x1z2, &P1->x, &P2->z); - fp2_mul(&y1z2, &P1->y, &P2->z); - fp2_mul(&y2z1, &P2->y, &P1->z); - fp2_mul(&x2z1, &P2->x, &P1->z); - fp2_mul(&t1y2, &P1->t, &P2->y); - fp2_mul(&t2y1, &P2->t, &P1->y); - - return fp2_is_equal(&x1z2, &x2z1) && fp2_is_equal(&y1z2, &y2z1) && fp2_is_equal(&t1y2, &t2y1); -} \ No newline at end of file diff --git a/src/ec/ref/ecx/test/ec-test.c b/src/ec/ref/ecx/test/ec-test.c deleted file mode 100644 index 7a6f98f..0000000 --- a/src/ec/ref/ecx/test/ec-test.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "ec-tests.h" - -int main(int argc, char* argv[]) -{ - if (argc < 3) { - printf("Please enter an argument: 'test' or 'bench' and \n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !(ec_test() & dlog_test()); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !(ec_run() & dlog_run()); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/ec/ref/ecx/test/fp2-test.c b/src/ec/ref/ecx/test/fp2-test.c deleted file mode 100644 index 1cae73f..0000000 --- a/src/ec/ref/ecx/test/fp2-test.c +++ /dev/null @@ -1,142 +0,0 @@ -#include -#include -#include -#include -#include - -static int BENCH_LOOPS = 1000; // Number of iterations per bench -static int TEST_LOOPS = 512; // Number of iterations per test - -bool fp2_isequal(fp2_t a, fp2_t b){ - return fp_is_equal(a.re, b.re) && fp_is_equal(a.im, b.im); -} - -bool fp2_isone(fp2_t a){ - fp_t one; - bool res = 1; - fp_mont_setone(one); - for(int i = 0; i < NWORDS_FIELD; i++){ - res = res && (a.re[i] == one[i]); - res = res && (a.im[i] == 0); - } - return res; -} - -void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -// VERY NOT SECURE (testing only) -void fp2_random(fp2_t *a){ - for(int i = 0; i < NWORDS_FIELD; i++){ - a->re[i] = rand(); - a->im[i] = rand(); - } - // Normalize - fp2_t one; - fp_mont_setone(one.re);fp_set(one.im,0); - fp2_mul(&*a, &*a, &one); - // Update seed - srand((unsigned) a->re[0]); -} - -int main(int argc, char* argv[]) -{ - if (argc > 1) { - TEST_LOOPS = atoi(argv[1]); - } - - fp2_t fp2_0, fp2_1; - // ------------ - fp2_set(&fp2_0, 0); - fp_mont_setone(fp2_1.re);fp_set(fp2_1.im,0); - // ------------ - - int i; - fp2_t a, b, c, d; - fp_t e; - - for (i = 0; i < TEST_LOOPS; i++) - { - printf("[%3d%%] Testing fp2_t arithmetic", 100 * i / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Random elements of fp - fp2_random(&a); - fp2_random(&b); - fp2_copy(&c, &a); - c.re[0] += 1; - fp2_copy(&d, &b); - d.re[0] -= 1; - - assert(fp2_isequal(a,b) == 0); // different values check --> (a != b) - assert(fp2_isequal(c,c) == 1); // equal values check --> 1 (c == c) - - // Testing neg - fp2_set(&b, 0); - fp2_copy(&c, &a); - fp2_neg(&a, &a); - fp2_sub(&c, &b, &c); - assert(fp2_isequal(a,c) == 1); - - fp_mont_setone(a.re);fp_set(a.im,0); // Now a == 1 - fp2_set(&b, 0); // Now b == 0 - - assert(fp2_is_zero(&a) == 0); - assert(fp2_is_zero(&b) == 1); - - // testing c - c - fp2_sub(&d, &c, &c); - assert(fp2_is_zero(&d) == 1); - - // tetsing c * 0 - fp2_mul(&d, &c, &b); - assert(fp2_is_zero(&d) == 1); - - // tetsing c * 1 ... recall, in Montgomery domain R mod p plays the role of the 1 - fp_mont_setone(a.re);fp_set(a.im,0); - fp2_mul(&d, &c, &a); - assert(fp2_isequal(d, c) == 1); - - // fp_set(e, 1); // Now e == 1 - // fp2_pow(d, e, c); - // assert(fp2_isequal(d, c) == 1); - - // fp_set(e, 0); // Now e == 0 - // fp2_pow(d, e, c); - // assert(fp2_isone(d) == 1); - - // fp2_set(a, 1); // Now e == R mod p - // fp_random(e); - // fp2_pow(d, e, a); - // assert(fp2_isone(d) == 1); - - // Testing 1/a by computing (1/a) x a - fp2_random(&a); - fp2_copy(&b, &a); - fp2_inv(&a); - fp2_mul(&c, &a, &b); - assert(fp2_isone(c) == 1); - - fp2_random(&a); - fp2_sqr(&b, &a); - assert( fp2_is_square(&b) ); - - }; - - if(TEST_LOOPS){ - printf("[%2d%%] Tested fp2_t arithmetic:\tNo errors!\n", 100 * i /TEST_LOOPS); - } - printf("-- All tests passed.\n"); - return 0; -} diff --git a/src/ec/ref/ecx/test/isog-test.c b/src/ec/ref/ecx/test/isog-test.c deleted file mode 100644 index 193a67d..0000000 --- a/src/ec/ref/ecx/test/isog-test.c +++ /dev/null @@ -1,1067 +0,0 @@ -#include -#include -#include -#include -#include - -#include "isog.h" -#include "test-basis.h" -#include - -static int BENCH_LOOPS = 1000; // Number of iterations per bench -static int TEST_LOOPS = 128; // Number of iterations per test - -bool curve_equal(ec_curve_t* E1, ec_curve_t* E2){ - fp2_t a, b; - fp2_mul(&a, &E1->A, &E2->C); - fp2_mul(&b, &E2->A, &E1->C); - return fp2_is_equal(&a, &b); -} - -void random_scalar(fp_t k) -{ - for(int i = 0; i < NWORDS_FIELD; i++) - k[i] = rand(); -} - -void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -void point_print(char *name, ec_point_t P){ - fp2_t a; - if(fp2_is_zero(&P.z)){ - printf("%s = INF\n", name); - } - else{ - fp2_copy(&a, &P.z); - fp2_inv(&a); - fp2_mul(&a, &a, &P.x); - fp2_print(name, a); - } -} - -void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} - -// Affine Montgomery coefficient computation (A + 2C : 4C) --> A/C -void coeff(fp2_t *B, ec_curve_t const *E) -{ - fp2_t t; - fp2_add(&t, &E->A, &E->A); // (2 * A24) - fp2_sub(&t, &t, &E->C); // (2 * A24) - C24 - - fp2_copy(&*B, &E->C); - fp2_inv(&*B); // 1 / (C24) - fp2_add(&t, &t, &t); // 4*A = 2[(2 * A24) - C24] - fp2_mul(&*B, &t, &*B); // A/C = 2[(2 * A24) - C24] / C24 -} - -// ladder3pt computes x(P + [m]Q) -void ladder3pt(ec_point_t *R, fp_t const m, ec_point_t const *P, ec_point_t const *Q, ec_point_t const *PQ, ec_point_t const *A) -{ - ec_point_t X0, X1, X2; - copy_point(&X0, Q); - copy_point(&X1, P); - copy_point(&X2, PQ); - - int i,j; - uint64_t t; - for (i = 0; i < NWORDS_FIELD; i++) - { - t = 1; - for (j = 0 ; j < 64; j++) - { - swap_points(&X1, &X2, -((t & m[i]) == 0)); - xDBLADD(&X0, &X1, &X0, &X1, &X2, A); - swap_points(&X1, &X2, -((t & m[i]) == 0)); - t <<= 1; - }; - }; - copy_point(R, &X1); -} - -static void xTPL(ec_point_t* Q, const ec_point_t* P, const ec_point_t* A3) -{ - /* ----------------------------------------------------------------------------- * - * Differential point tripling given the montgomery coefficient A3 = (A+2C:A-2C) - * ----------------------------------------------------------------------------- */ - - fp2_t t0, t1, t2, t3, t4; - fp2_sub(&t0, &P->x, &P->z); - fp2_sqr(&t2, &t0); - fp2_add(&t1, &P->x, &P->z); - fp2_sqr(&t3, &t1); - fp2_add(&t4, &t1, &t0); - fp2_sub(&t0, &t1, &t0); - fp2_sqr(&t1, &t4); - fp2_sub(&t1, &t1, &t3); - fp2_sub(&t1, &t1, &t2); - fp2_mul(&Q->x, &t3, &A3->x); - fp2_mul(&t3, &Q->x, &t3); - fp2_mul(&Q->z, &t2, &A3->z); - fp2_mul(&t2, &t2, &Q->z); - fp2_sub(&t3, &t2, &t3); - fp2_sub(&t2, &Q->x, &Q->z); - fp2_mul(&t1, &t2, &t1); - fp2_add(&t2, &t3, &t1); - fp2_sqr(&t2, &t2); - fp2_mul(&Q->x, &t2, &t4); - fp2_sub(&t1, &t3, &t1); - fp2_sqr(&t1, &t1); - fp2_mul(&Q->z, &t1, &t0); -} - -static void xisog_2_singular(ec_point_t* B24, ec_point_t A24){ - fp2_t t0, four; - fp_mont_setone(four.re); - fp_set(four.im, 0); - fp2_add(&four, &four, &four); - fp2_add(&four, &four, &four); - fp2_add(&t0, &A24.x, &A24.x); - fp2_sub(&t0, &t0, &A24.z); - fp2_add(&t0, &t0, &t0); - fp2_inv(&A24.z); - fp2_mul(&t0, &t0, &A24.z); - fp2_copy(&K[0].x, &t0); - fp2_add(&B24->x, &t0, &t0); - fp2_sqr(&t0, &t0); - fp2_sub(&t0, &t0, &four); - fp2_sqrt(&t0); - fp2_neg(&K[0].z, &t0); - fp2_add(&B24->z, &t0, &t0); - fp2_add(&B24->x, &B24->x, &B24->z); - fp2_add(&B24->z, &B24->z, &B24->z); -} - -static void xeval_2_singular(ec_point_t* R, const ec_point_t* Q, const int lenQ){ - fp2_t t0, t1; - for(int i = 0; i < lenQ; i++){ - fp2_mul(&t0, &Q[i].x, &Q[i].z); - fp2_mul(&t1, &K[0].x, &Q[i].z); - fp2_add(&t1, &t1, &Q[i].x); - fp2_mul(&t1, &t1, &Q[i].x); - fp2_sqr(&R[i].x, &Q[i].z); - fp2_add(&R[i].x, &R[i].x, &t1); - fp2_mul(&R[i].z, &t0, &K[0].z); - } -} - -int main(int argc, char* argv[]) -{ - unsigned long long cycles, cycles1, cycles2; - - // ----------------- TEST FOR BASIS GENERATION ----------------- // - if (argc > 1) { - TEST_LOOPS = atoi(argv[1]); - } - - // Initial curve with A = 0 - ec_curve_t E; - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - - for(int iter = 0; iter < TEST_LOOPS; iter++){ - - printf("[%3d%%] Testing basis generation", 100 * iter / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Curve coefficient A24=(A+2C:4C) - ec_point_t A24; - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - fp2_t j; - ec_j_inv(&j, &E); - - // Construct basis for 2^f torsion - ec_basis_t B2; - ec_curve_to_basis_2(&B2, &E); - - // Check that basis is rational - assert(ec_is_on_curve(&E, &B2.P)); - assert(ec_is_on_curve(&E, &B2.Q)); - assert(ec_is_on_curve(&E, &B2.PmQ)); - - // Compute P+Q - ec_point_t PpQ; - xADD(&PpQ, &B2.P, &B2.Q, &B2.PmQ); - - // Check the order - ec_point_t P2, Q2, PmQ2, PpQ2, R; - copy_point(&P2, &B2.P); - copy_point(&Q2, &B2.Q); - copy_point(&PmQ2, &B2.PmQ); - copy_point(&PpQ2, &PpQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - assert(!ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(!ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(!ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(!ec_is_zero(&PpQ2)); - } - assert(is_point_equal(&PmQ2, &PpQ2)); - xDBLv2(&P2, &P2, &A24); - assert(ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(ec_is_zero(&PpQ2)); - - // Check the complete_basis function - fp_t k; - random_scalar(k); - ladder3pt(&R, k, &B2.P, &B2.Q, &B2.PmQ, &A24); - ec_complete_basis_2(&B2, &E, &R); - assert(is_point_equal(&R, &B2.P)); - - // Check that basis is rational - assert(ec_is_on_curve(&E, &B2.P)); - assert(ec_is_on_curve(&E, &B2.Q)); - assert(ec_is_on_curve(&E, &B2.PmQ)); - - // Compute P+Q - xADD(&PpQ, &B2.P, &B2.Q, &B2.PmQ); - - // Check the order - copy_point(&P2, &B2.P); - copy_point(&Q2, &B2.Q); - copy_point(&PmQ2, &B2.PmQ); - copy_point(&PpQ2, &PpQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - assert(!ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(!ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(!ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(!ec_is_zero(&PpQ2)); - } - assert(is_point_equal(&PmQ2, &PpQ2)); - xDBLv2(&P2, &P2, &A24); - assert(ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(ec_is_zero(&PpQ2)); - - // Curve coefficient A3=(A+2C:A-2C) - ec_point_t A3; - fp2_copy(&A3.x, &A24.x); - fp2_sub(&A3.z, &A3.x, &A24.z); - - // Construct basis for 3^g torsion - ec_basis_t B3; - ec_curve_to_basis_3(&B3, &E); - - // Check that basis is rational - assert(ec_is_on_curve(&E, &B3.P)); - assert(ec_is_on_curve(&E, &B3.Q)); - assert(ec_is_on_curve(&E, &B3.PmQ)); - - // Compute P+Q - xADD(&PpQ, &B3.P, &B3.Q, &B3.PmQ); - - // Check the order - ec_point_t P3, Q3, PmQ3, PpQ3; - copy_point(&P3, &B3.P); - copy_point(&Q3, &B3.Q); - copy_point(&PmQ3, &B3.PmQ); - copy_point(&PpQ3, &PpQ); - for(int i = 0; i < POWER_OF_3 - 1; i++){ - xTPL(&P3, &P3, &A3); - assert(!ec_is_zero(&P3)); - xTPL(&Q3, &Q3, &A3); - assert(!ec_is_zero(&Q3)); - xTPL(&PmQ3, &PmQ3, &A3); - assert(!ec_is_zero(&PmQ3)); - xTPL(&PpQ3, &PpQ3, &A3); - assert(!ec_is_zero(&PpQ3)); - } - xADD(&P2, &PpQ3, &Q3, &P3); - assert(is_point_equal(&PmQ3, &P2)); - xTPL(&P3, &P3, &A3); - assert(ec_is_zero(&P3)); - xTPL(&Q3, &Q3, &A3); - assert(ec_is_zero(&Q3)); - xTPL(&PmQ3, &PmQ3, &A3); - assert(ec_is_zero(&PmQ3)); - xTPL(&PpQ3, &PpQ3, &A3); - assert(ec_is_zero(&PpQ3)); - - // Construct basis for 2^f*3^g torsion - ec_basis_t B6; - ec_curve_to_basis_6(&B6, &E); - - // Check that basis is rational - assert(ec_is_on_curve(&E, &B6.P)); - assert(ec_is_on_curve(&E, &B6.Q)); - assert(ec_is_on_curve(&E, &B6.PmQ)); - - // Compute P+Q - xADD(&PpQ, &B6.P, &B6.Q, &B6.PmQ); - - // Check the order - ec_point_t P6, Q6, PmQ6, PpQ6; - copy_point(&P6, &B6.P); - copy_point(&Q6, &B6.Q); - copy_point(&PmQ6, &B6.PmQ); - copy_point(&PpQ6, &PpQ); - - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P6, &P6, &A24); - assert(!ec_is_zero(&P6)); - xDBLv2(&Q6, &Q6, &A24); - assert(!ec_is_zero(&Q6)); - xDBLv2(&PmQ6, &PmQ6, &A24); - assert(!ec_is_zero(&PmQ6)); - xDBLv2(&PpQ6, &PpQ6, &A24); - assert(!ec_is_zero(&PpQ6)); - } - - for(int i = 0; i < POWER_OF_3 - 1; i++){ - xTPL(&P6, &P6, &A3); - assert(!ec_is_zero(&P6)); - xTPL(&Q6, &Q6, &A3); - assert(!ec_is_zero(&Q6)); - xTPL(&PmQ6, &PmQ6, &A3); - assert(!ec_is_zero(&PmQ6)); - xTPL(&PpQ6, &PpQ6, &A3); - assert(!ec_is_zero(&PpQ6)); - } - copy_point(&R, &P6); - xDBLv2(&P6, &P6, &A24); - assert(!ec_is_zero(&P6)); - xTPL(&P6, &P6, &A3); - assert(ec_is_zero(&P6)); - xTPL(&R, &R, &A3); - assert(!ec_is_zero(&R)); - xDBLv2(&R, &R, &A24); - assert(ec_is_zero(&R)); - - - copy_point(&R, &Q6); - xDBLv2(&Q6, &Q6, &A24); - assert(!ec_is_zero(&Q6)); - xTPL(&Q6, &Q6, &A3); - assert(ec_is_zero(&Q6)); - xTPL(&R, &R, &A3); - assert(!ec_is_zero(&R)); - xDBLv2(&R, &R, &A24); - assert(ec_is_zero(&R)); - - - copy_point(&R, &PmQ6); - xDBLv2(&PmQ6, &PmQ6, &A24); - assert(!ec_is_zero(&PmQ6)); - xTPL(&PmQ6, &PmQ6, &A3); - assert(ec_is_zero(&PmQ6)); - xTPL(&R, &R, &A3); - assert(!ec_is_zero(&R)); - xDBLv2(&R, &R, &A24); - assert(ec_is_zero(&R)); - - - copy_point(&R, &PpQ6); - xDBLv2(&PpQ6, &PpQ6, &A24); - assert(!ec_is_zero(&PpQ6)); - xTPL(&PpQ6, &PpQ6, &A3); - assert(ec_is_zero(&PpQ6)); - xTPL(&R, &R, &A3); - assert(!ec_is_zero(&R)); - xDBLv2(&R, &R, &A24); - assert(ec_is_zero(&R)); - - - // Compute a 2^e-basis with 2^(e-1)*Q=(0,0) - copy_point(&P2, &B2.P); - copy_point(&Q2, &B2.Q); - copy_point(&PmQ2, &B2.PmQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - xDBLv2(&Q2, &Q2, &A24); - xDBLv2(&PmQ2, &PmQ2, &A24); - } - if(fp2_is_zero(&P2.x)){ - copy_point(&Q2, &B2.Q); - copy_point(&B2.Q, &B2.P); - copy_point(&B2.P, &Q2); - } - else if(fp2_is_zero(&PmQ2.x)){ - copy_point(&Q2, &B2.Q); - copy_point(&B2.Q, &B2.PmQ); - copy_point(&B2.PmQ, &Q2); - } - - // Compute a 2^e-isogeny - ec_isog_even_t isog; - random_scalar(k); - ladder3pt(&R, k, &B2.P, &B2.Q, &B2.PmQ, &A24); - fp2_copy(&isog.curve.A, &E.A); - fp2_copy(&isog.curve.C, &E.C); - copy_point(&isog.kernel, &R); - isog.length = POWER_OF_2; - ec_eval_even_nonzero(&E, &isog, &B3.P, 1); - } - printf("[%2d%%] Tested basis generation:\t\tNo errors!\n", 100); - - - - // ----------------- TEST FOR NONZERO 2-ISOGENIES VS 4-ISOGENIES----------------- // - - // Initial curve with A = 0 - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - for(int iter = 0; iter < TEST_LOOPS; iter++){ - - printf("[%3d%%] Testing 2-isog vs 4-isog", 100 * iter / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Curve coefficient A24=(A+2C:4C) - ec_point_t A24, B24, C24; - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Compute a 2^e-basis with 2^(e-1)*Q=(0,0) - ec_basis_t B0, B1, B2; - ec_point_t P4, Q4, PmQ4, P2, Q2, PmQ2, tmp; - ec_curve_to_basis_2(&B2, &E); - copy_point(&P4, &B2.P); - copy_point(&Q4, &B2.Q); - copy_point(&PmQ4, &B2.PmQ); - for(int i = 0; i < POWER_OF_2 - 2; i++){ - xDBLv2(&P4, &P4, &A24); - xDBLv2(&Q4, &Q4, &A24); - xDBLv2(&PmQ4, &PmQ4, &A24); - } - xDBLv2(&P2, &P4, &A24); - xDBLv2(&Q2, &Q4, &A24); - xDBLv2(&PmQ2, &PmQ4, &A24); - if(fp2_is_zero(&P2.x)){ - copy_point(&tmp, &Q4); - copy_point(&Q4, &P4); - copy_point(&P4, &tmp); - } - else if(fp2_is_zero(&PmQ2.x)){ - copy_point(&tmp, &Q4); - copy_point(&Q4, &PmQ4); - copy_point(&PmQ4, &tmp); - } - - // Non-singular 2-isogenies - xDBLv2(&P2, &P4, &A24); - xisog_2(&B24, P2); - xeval_2((ec_point_t*)&B0, (ec_point_t*)&B2, 3); - xeval_2(&P2, &P4, 1); - xisog_2(&B24, P2); - xeval_2((ec_point_t*)&B0, (ec_point_t*)&B0, 3); - - // Non-singular 4-isogeny - xisog_4(&C24, P4); - xeval_4((ec_point_t*)&B1, (ec_point_t*)&B2, 3); - - // Compare results - assert(ec_is_equal(&B24, &C24)); - assert(ec_is_equal(&B0.P, &B1.P)); - assert(ec_is_equal(&B0.Q, &B1.Q)); - assert(ec_is_equal(&B0.PmQ, &B1.PmQ)); - - // Singular 2-isogenies case 1 - xisog_2_singular(&B24, A24); - xeval_2_singular((ec_point_t*)&B0, (ec_point_t*)&B2, 3); - xeval_2_singular(&Q2, &Q4, 1); - xisog_2(&B24, Q2); - xeval_2((ec_point_t*)&B0, (ec_point_t*)&B0, 3); - - // Singular 4-isogeny case 1 - xisog_4_singular(&C24, Q4, A24); - xeval_4_singular((ec_point_t*)&B1, (ec_point_t*)&B2, 3, Q4); - - // Compare results - assert(ec_is_equal(&B24, &C24)); - assert(ec_is_equal(&B0.P, &B1.P)); - assert(ec_is_equal(&B0.Q, &B1.Q)); - assert(ec_is_equal(&B0.PmQ, &B1.PmQ)); - - // Singular 2-isogenies case 2 - fp2_sub(&A24.x, &A24.z, &A24.x); - fp2_neg(&Q4.x, &Q4.x); - fp2_neg(&P4.x, &P4.x); - fp2_neg(&B2.P.x, &B2.P.x); - fp2_neg(&B2.Q.x, &B2.Q.x); - fp2_neg(&B2.PmQ.x, &B2.PmQ.x); - xisog_2_singular(&B24, A24); - xeval_2_singular((ec_point_t*)&B0, (ec_point_t*)&B2, 3); - xeval_2_singular(&Q2, &Q4, 1); - xisog_2(&B24, Q2); - xeval_2((ec_point_t*)&B0, (ec_point_t*)&B0, 3); - - // Singular 4-isogeny case 2 - xisog_4_singular(&C24, Q4, A24); - xeval_4_singular((ec_point_t*)&B1, (ec_point_t*)&B2, 3, Q4); - - // Compare results - assert(ec_is_equal(&B24, &C24)); - assert(ec_is_equal(&B0.P, &B1.P)); - assert(ec_is_equal(&B0.Q, &B1.Q)); - assert(ec_is_equal(&B0.PmQ, &B1.PmQ)); - - // Move to next curve - xisog_4(&A24, P4); - fp2_add(&E.A, &A24.x, &A24.x); - fp2_sub(&E.A, &E.A, &A24.z); - fp2_sub(&E.A, &E.A, &E.A); - fp2_copy(&E.C, &A24.z); - } - printf("[%2d%%] Tested 2-isog vs 4-isog:\t\tNo errors!\n", 100); - - - - // ----------------- TEST FOR NONZERO 2^f ISOGENIES ----------------- // - - // Initial curve with A = 0 - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - for(int iter = 0; iter < TEST_LOOPS; iter++){ - - printf("[%3d%%] Testing 2^f-isogenies (nonzero)", 100 * iter / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Curve coefficient A24=(A+2C:4C) - ec_point_t A24; - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Compute a 2^e-basis with 2^(e-1)*Q=(0,0) - ec_basis_t B2; - ec_point_t P2, Q2, PmQ2; - ec_curve_to_basis_2(&B2, &E); - copy_point(&P2, &B2.P); - copy_point(&Q2, &B2.Q); - copy_point(&PmQ2, &B2.PmQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - xDBLv2(&Q2, &Q2, &A24); - xDBLv2(&PmQ2, &PmQ2, &A24); - } - if(fp2_is_zero(&P2.x)){ - copy_point(&Q2, &B2.Q); - copy_point(&B2.Q, &B2.P); - copy_point(&B2.P, &Q2); - } - else if(fp2_is_zero(&PmQ2.x)){ - copy_point(&Q2, &B2.Q); - copy_point(&B2.Q, &B2.PmQ); - copy_point(&B2.PmQ, &Q2); - } - - // Generate 3^g-basis and a 2^f-kernel point - ec_basis_t B3; - fp_t k; - ec_point_t R; - ec_curve_to_basis_3(&B3, &E); - random_scalar(k); - ladder3pt(&R, k, &B2.P, &B2.Q, &B2.PmQ, &A24); - - // Evaluate 2^f-isogeny - ec_isog_even_t isog; - fp2_copy(&isog.curve.A, &E.A); - fp2_copy(&isog.curve.C, &E.C); - isog.length = POWER_OF_2; - for(int i = isog.length; i < POWER_OF_2; i++) - xDBLv2(&R, &R, &A24); - copy_point(&isog.kernel, &R); - ec_eval_even_nonzero(&E, &isog, (ec_point_t*)&B3, 3); - - // Curve coefficient A3 = (A+2C:A-2C) - ec_point_t A3; - fp2_add(&A3.z, &E.C, &E.C); - fp2_add(&A3.x, &E.A, &A3.z); - fp2_sub(&A3.z, &E.A, &A3.z); - - // Check order of the pushed 3^g-basis - ec_point_t P3, Q3, PmQ3, PpQ, PpQ3; - xADD(&PpQ, &B3.P, &B3.Q, &B3.PmQ); - copy_point(&P3, &B3.P); - copy_point(&Q3, &B3.Q); - copy_point(&PmQ3, &B3.PmQ); - copy_point(&PpQ3, &PpQ); - for(int i = 0; i < POWER_OF_3 - 1; i++){ - xTPL(&P3, &P3, &A3); - assert(!ec_is_zero(&P3)); - xTPL(&Q3, &Q3, &A3); - assert(!ec_is_zero(&Q3)); - xTPL(&PmQ3, &PmQ3, &A3); - assert(!ec_is_zero(&PmQ3)); - xTPL(&PpQ3, &PpQ3, &A3); - assert(!ec_is_zero(&PpQ3)); - } - xADD(&R, &PpQ3, &Q3, &P3); - assert(is_point_equal(&PmQ3, &R)); - xTPL(&P3, &P3, &A3); - assert(ec_is_zero(&P3)); - xTPL(&Q3, &Q3, &A3); - assert(ec_is_zero(&Q3)); - xTPL(&PmQ3, &PmQ3, &A3); - assert(ec_is_zero(&PmQ3)); - xTPL(&PpQ3, &PpQ3, &A3); - assert(ec_is_zero(&PpQ3)); - } - printf("[%2d%%] Tested 2^f-isogenies (nonzero):\tNo errors!\n", 100); - - - - // ----------------- TEST FOR 2^f ISOGENIES ----------------- // - - // Initial curve with A = 0 - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - cycles = 0; - for(int iter = 0; iter < TEST_LOOPS; iter++){ - - printf("[%3d%%] Testing 2^f-isogenies", 100 * iter / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Curve coefficient A24=(A+2C:4C) - ec_point_t A24; - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Compute a 2^e-basis - ec_basis_t B2; - ec_curve_to_basis_2(&B2, &E); - - // Generate 3^g-basis and a 2^f-kernel point - ec_basis_t B3; - fp_t k; - ec_point_t R; - ec_curve_to_basis_3(&B3, &E); - random_scalar(k); - ladder3pt(&R, k, &B2.P, &B2.Q, &B2.PmQ, &A24); - - // Evaluate 2^f-isogeny - ec_isog_even_t isog; - fp2_copy(&isog.curve.A, &E.A); - fp2_copy(&isog.curve.C, &E.C); - isog.length = POWER_OF_2; - for(int i = isog.length; i < POWER_OF_2; i++) - xDBLv2(&R, &R, &A24); - copy_point(&isog.kernel, &R); - cycles1 = cpucycles(); - ec_eval_even_basis(&E, &isog, &B3, 1); - cycles2 = cpucycles(); - cycles = cycles+(cycles2-cycles1); - - // Curve coefficient A3 = (A+2C:A-2C) - ec_point_t A3; - fp2_add(&A3.z, &E.C, &E.C); - fp2_add(&A3.x, &E.A, &A3.z); - fp2_sub(&A3.z, &E.A, &A3.z); - - // Check order of the pushed 3^g-basis - ec_point_t P3, Q3, PmQ3, PpQ, PpQ3; - xADD(&PpQ, &B3.P, &B3.Q, &B3.PmQ); - copy_point(&P3, &B3.P); - copy_point(&Q3, &B3.Q); - copy_point(&PmQ3, &B3.PmQ); - copy_point(&PpQ3, &PpQ); - for(int i = 0; i < POWER_OF_3 - 1; i++){ - xTPL(&P3, &P3, &A3); - assert(!ec_is_zero(&P3)); - xTPL(&Q3, &Q3, &A3); - assert(!ec_is_zero(&Q3)); - xTPL(&PmQ3, &PmQ3, &A3); - assert(!ec_is_zero(&PmQ3)); - xTPL(&PpQ3, &PpQ3, &A3); - assert(!ec_is_zero(&PpQ3)); - } - xADD(&R, &PpQ3, &Q3, &P3); - assert(is_point_equal(&PmQ3, &R)); - xTPL(&P3, &P3, &A3); - assert(ec_is_zero(&P3)); - xTPL(&Q3, &Q3, &A3); - assert(ec_is_zero(&Q3)); - xTPL(&PmQ3, &PmQ3, &A3); - assert(ec_is_zero(&PmQ3)); - xTPL(&PpQ3, &PpQ3, &A3); - assert(ec_is_zero(&PpQ3)); - } - printf("[%2d%%] Tested 2^f-isogenies:\t\tNo errors! (%7lld cycles)\n", 100, cycles/TEST_LOOPS);\ - - // ----------------- TEST FOR 3^g ISOGENIES ----------------- // - - // Initial curve with A = 0 - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - for(int iter = 0; iter < TEST_LOOPS; iter++){ - - printf("[%3d%%] Testing 3^g-isogenies", 100 * iter / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Curve coefficient A24=(A+2C:4C) - ec_point_t A24; - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Curve coefficient A3=(A+2C:A-2C) - ec_point_t A3; - fp2_copy(&A3.x, &A24.x); - fp2_sub(&A3.z, &A24.x, &A24.z); - - // Compute bases and a kernel point - ec_basis_t B2, B3; - fp_t k; - ec_point_t R; - ec_curve_to_basis_2(&B2, &E); - ec_curve_to_basis_3(&B3, &E); - random_scalar(k); - ladder3pt(&R, k, &B3.P, &B3.Q, &B3.PmQ, &A24); - - // Evaluate 3^g-isogeny - ec_isog_odd_t isog; - fp2_copy(&isog.curve.A, &E.A); - fp2_copy(&isog.curve.C, &E.C); - for(int i = 0; i < P_LEN+M_LEN; i++) - isog.degree[i] = 0; - isog.degree[0] = rand() % POWER_OF_3 + 1; - for(int i = isog.degree[0]; i < POWER_OF_3; i++) - xTPL(&R, &R, &A3); - copy_point(&isog.ker_plus, &R); - ec_eval_odd_basis(&E, &isog, &B2, 1); - - // Update A24 - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Check order of the pushed 2^f-basis - ec_point_t P2, Q2, PmQ2, PpQ, PpQ2; - xADD(&PpQ, &B2.P, &B2.Q, &B2.PmQ); - copy_point(&P2, &B2.P); - copy_point(&Q2, &B2.Q); - copy_point(&PmQ2, &B2.PmQ); - copy_point(&PpQ2, &PpQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - assert(!ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(!ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(!ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(!ec_is_zero(&PpQ2)); - } - assert(is_point_equal(&PmQ2, &PpQ2)); - xDBLv2(&P2, &P2, &A24); - assert(ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(ec_is_zero(&PpQ2)); - } - printf("[%2d%%] Tested 3^g-isogenies:\t\tNo errors!\n", 100); - - // ----------------- TEST FOR ODD-DEGREE ISOGENIES ----------------- // - - for(int iter = 0; iter < TEST_LOOPS/10; iter++){ - - printf("[%3d%%] Testing odd-degree isogenies", 100 * iter / ((int)TEST_LOOPS/10)); - fflush(stdout); - printf("\r\x1b[K"); - - // Initial curve with A = 0 - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - // Curve coefficient A24=(A+2C:4C) - ec_point_t A24; - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Compute a 2^f-basis - ec_basis_t B2; - ec_point_t R; - ec_curve_to_basis_2(&B2, &E); - - // Compute kernel points - ec_point_t P, Q, PQ, R_plus, R_minus; - fp_t k; - fp2_tomont(&P.x, &xPA); - fp2_tomont(&Q.x, &xQA); - fp2_tomont(&PQ.x, &xPQA); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - fp2_copy(&Q.z, &P.z); - fp2_copy(&PQ.z, &P.z); - random_scalar(k); - ladder3pt(&R_plus, k, &P, &Q, &PQ, &A24); - fp2_tomont(&P.x, &xPB); - fp2_tomont(&Q.x, &xQB); - fp2_tomont(&PQ.x, &xPQB); - random_scalar(k); - ladder3pt(&R_minus, k, &P, &Q, &PQ, &A24); - - // Evaluate an odd-degree isogeny - ec_isog_odd_t isog; - copy_point(&isog.ker_plus, &R_plus); - copy_point(&isog.ker_minus, &R_minus); - fp2_copy(&isog.curve.A, &E.A); - fp2_copy(&isog.curve.C, &E.C); - for(int i = 0; i < P_LEN; i++){ - isog.degree[i] = rand() % (TORSION_ODD_POWERS[i]+1); - int j = isog.degree[i]; - while(j < TORSION_ODD_POWERS[i]){ - xMULv2(&isog.ker_plus, &isog.ker_plus, &TORSION_ODD_PRIMES[i], p_plus_minus_bitlength[i], &A24); - j++; - } - } - for(int i = P_LEN; i < P_LEN+M_LEN; i++){ - isog.degree[i] = rand() % (TORSION_ODD_POWERS[i]+1); - int j = isog.degree[i]; - while(j < TORSION_ODD_POWERS[i]){ - xMULv2(&isog.ker_minus, &isog.ker_minus, &TORSION_ODD_PRIMES[i], p_plus_minus_bitlength[i], &A24); - j++; - } - } - - ec_eval_odd_basis(&E, &isog, &B2, 1); - ec_eval_odd(&E, &isog, &R_plus, 1); - ec_eval_odd(&E, &isog, &R_minus, 1); - - // Update A24 - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - - // Check order of the pushed 2^f-basis - ec_point_t P2, Q2, PmQ2, PpQ, PpQ2; - xADD(&PpQ, &B2.P, &B2.Q, &B2.PmQ); - copy_point(&P2, &B2.P); - copy_point(&Q2, &B2.Q); - copy_point(&PmQ2, &B2.PmQ); - copy_point(&PpQ2, &PpQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - assert(!ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(!ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(!ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(!ec_is_zero(&PpQ2)); - } - assert(is_point_equal(&PmQ2, &PpQ2)); - xDBLv2(&P2, &P2, &A24); - assert(ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(ec_is_zero(&PpQ2)); - - // Check order of the pushed R_plus point - int last = -1; - for(int i = 0; i < P_LEN; i++){ - int j = isog.degree[i]; - while(j < TORSION_ODD_POWERS[i]){ - xMULv2(&R_plus, &R_plus, &TORSION_ODD_PRIMES[i], p_plus_minus_bitlength[i], &A24); - if(ec_is_zero(&R_plus)){ - last = i; - break; - } - j++; - } - } - assert(last >= 0); - for(int i = last+1; i < P_LEN; i++) - assert(isog.degree[i] == TORSION_ODD_POWERS[i]); - - // Check order of the pushed R_minus point - last = -1; - for(int i = P_LEN; i < P_LEN+M_LEN; i++){ - int j = isog.degree[i]; - while(j < TORSION_ODD_POWERS[i]){ - xMULv2(&R_minus, &R_minus, &TORSION_ODD_PRIMES[i], p_plus_minus_bitlength[i], &A24); - if(ec_is_zero(&R_minus)){ - last = i; - break; - } - j++; - } - } - assert(last >= 0); - for(int i = last+1; i < P_LEN+M_LEN; i++) - assert(isog.degree[i] == TORSION_ODD_POWERS[i]); - } - printf("[%2d%%] Tested odd-degree isogenies:\tNo errors!\n", 100); - - // ----------------- TEST FOR ISOMORPHISMS ----------------- // - - // Initial curve with A = 0 - fp2_set(&E.A, 0); - fp_mont_setone(E.C.re); - fp_set(E.C.im, 0); - - for(int iter = 0; iter < TEST_LOOPS; iter++){ - - printf("[%3d%%] Testing odd-degree isogenies", 100 * iter / (int)TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - - // Compute jinv - fp2_t j; - ec_j_inv(&j, &E); - - // Normalize the curve - ec_curve_t Enorm; - ec_isom_t isom; - ec_curve_normalize(&Enorm, &isom, &E); - - // Compare j invariants - fp2_t jnorm; - ec_j_inv(&jnorm, &Enorm); - assert(fp2_is_equal(&j, &jnorm)); - - // Check that normalization is consistent - ec_curve_t Enorm2; - ec_isom_t isom2; - ec_curve_normalize(&Enorm2, &isom2, &Enorm); - assert(curve_equal(&Enorm, &Enorm2)); - - // Compute a basis - ec_basis_t B; - ec_curve_to_basis_2(&B, &E); - - // Push it through isomorphism - ec_basis_t Bnorm; - copy_point(&Bnorm.P, &B.P); - ec_iso_eval(&Bnorm.P, &isom); - copy_point(&Bnorm.Q, &B.Q); - ec_iso_eval(&Bnorm.Q, &isom); - copy_point(&Bnorm.PmQ, &B.PmQ); - ec_iso_eval(&Bnorm.PmQ, &isom); - - // Check that the new basis is rational - assert(ec_is_on_curve(&Enorm, &Bnorm.P)); - assert(ec_is_on_curve(&Enorm, &Bnorm.Q)); - assert(ec_is_on_curve(&Enorm, &Bnorm.PmQ)); - - // Compute P+Q - ec_point_t PpQ; - xADD(&PpQ, &Bnorm.P, &Bnorm.Q, &Bnorm.PmQ); - - // // Check the order - ec_point_t P2, Q2, PmQ2, PpQ2, R, A24; - fp2_add(&A24.z, &Enorm.C, &Enorm.C); - fp2_add(&A24.x, &Enorm.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - copy_point(&P2, &Bnorm.P); - copy_point(&Q2, &Bnorm.Q); - copy_point(&PmQ2, &Bnorm.PmQ); - copy_point(&PpQ2, &PpQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - assert(!ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(!ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(!ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(!ec_is_zero(&PpQ2)); - } - assert(is_point_equal(&PmQ2, &PpQ2)); - xDBLv2(&P2, &P2, &A24); - assert(ec_is_zero(&P2)); - xDBLv2(&Q2, &Q2, &A24); - assert(ec_is_zero(&Q2)); - xDBLv2(&PmQ2, &PmQ2, &A24); - assert(ec_is_zero(&PmQ2)); - xDBLv2(&PpQ2, &PpQ2, &A24); - assert(ec_is_zero(&PpQ2)); - - // Compute a 2^e-basis with 2^(e-1)*Q=(0,0) - fp2_add(&A24.z, &E.C, &E.C); - fp2_add(&A24.x, &E.A, &A24.z); - fp2_add(&A24.z, &A24.z, &A24.z); - copy_point(&P2, &B.P); - copy_point(&Q2, &B.Q); - copy_point(&PmQ2, &B.PmQ); - for(int i = 0; i < POWER_OF_2 - 1; i++){ - xDBLv2(&P2, &P2, &A24); - xDBLv2(&Q2, &Q2, &A24); - xDBLv2(&PmQ2, &PmQ2, &A24); - } - if(fp2_is_zero(&P2.x)){ - copy_point(&Q2, &B.Q); - copy_point(&B.Q, &B.P); - copy_point(&B.P, &Q2); - } - else if(fp2_is_zero(&PmQ2.x)){ - copy_point(&Q2, &B.Q); - copy_point(&B.Q, &B.PmQ); - copy_point(&B.PmQ, &Q2); - } - - // Compute a 2^e-isogeny - ec_isog_even_t isog; - fp_t k; - random_scalar(k); - ladder3pt(&R, k, &B.P, &B.Q, &B.PmQ, &A24); - fp2_copy(&isog.curve.A, &E.A); - fp2_copy(&isog.curve.C, &E.C); - copy_point(&isog.kernel, &R); - isog.length = POWER_OF_2; - ec_eval_even_nonzero(&E, &isog, &P2, 1); - } - printf("[%2d%%] Tested curve normalization+isom:\tNo errors!\n", 100); - - printf("-- All tests passed!\n"); - return 0; -} diff --git a/src/ec/ref/ecx/test/mont-test.c b/src/ec/ref/ecx/test/mont-test.c deleted file mode 100644 index 3ebf20a..0000000 --- a/src/ec/ref/ecx/test/mont-test.c +++ /dev/null @@ -1,386 +0,0 @@ -#include -#include -#include - -#include "ec.h" -#include "isog.h" -#include "test-basis.h" -#include - -static int BENCH_LOOPS = 1000; // Number of iterations per bench -static int TEST_LOOPS = 128; // Number of iterations per test - -// void random_scalar(fp_t k, const uint8_t j) -// { -// // To implement a better random function (We must use some of the SHAKE family functions) -// do -// { -// randombytes((void *)k, keyspace_bytes[j]); -// } while (fp_issmaller((uint64_t *)k, keyspace_size[j])); -// } - -// VERY NOT SECURE (testing only) -void fp2_random(fp2_t *a){ - for(int i = 0; i < NWORDS_FIELD; i++){ - a->re[i] = rand(); - a->im[i] = rand(); - } - // Normalize - fp2_t one; - fp_mont_setone(one.re);fp_set(one.im,0); - fp2_mul(&*a, &*a, &one); - // Update seed - srand((unsigned) a->re[0]); -} - -// Affine Montgomery coefficient computation (A + 2C : 4C) --> A/C -void coeff(fp2_t *B, ec_point_t const A) -{ - fp2_t t; - fp2_add(&t, &A.x, &A.x); // (2 * A24) - fp2_sub(&t, &t, &A.z); // (2 * A24) - C24 - - fp2_copy(&*B, &A.z); - fp2_inv(&*B); // 1 / (C24) - fp2_add(&t, &t, &t); // 4*A = 2[(2 * A24) - C24] - fp2_mul(&*B, &t, &*B); // A/C = 2[(2 * A24) - C24] / C24 -} - -// Determines if point is fp2-rational (if not, then it must be a zero trace point) -uint8_t isrational(ec_point_t const T, fp2_t const a) -{ - fp2_t XT, tmp, aux, YT_squared; - - fp2_copy(&XT, &T.z); - fp2_inv(&XT); - - fp2_mul(&XT, &XT, &T.x); - - fp2_sqr(&tmp, &XT); - fp2_mul(&aux, &tmp, &XT); - fp2_mul(&tmp, &tmp, &a); - fp2_add(&YT_squared, &tmp, &aux); - fp2_add(&YT_squared, &YT_squared, &XT); - - return fp2_is_square(&YT_squared); -} - -// ladder3pt computes x(P + [m]Q) -void ladder3pt(ec_point_t* R, fp_t const m, ec_point_t const* P, ec_point_t const* Q, ec_point_t const* PQ, ec_point_t const* A) -{ - ec_point_t X0, X1, X2; - copy_point(&X0, Q); - copy_point(&X1, P); - copy_point(&X2, PQ); - - int i,j; - uint64_t t; - for (i = 0; i < NWORDS_FIELD; i++) - { - t = 1; - for (j = 0 ; j < 64; j++) - { - swap_points(&X1, &X2, -((t & m[i]) == 0)); - xDBLADD(&X0, &X1, &X0, &X1, &X2, A); - swap_points(&X1, &X2, -((t & m[i]) == 0)); - t <<= 1; - }; - }; - copy_point(R, &X1); -} - -// For computing [(p + 1) / l_i]P, i:=0, ..., (N - 1) -void cofactor_multiples(ec_point_t P[], ec_point_t const* A, size_t lower, size_t upper) -{ - assert(lower < upper); - if (upper - lower == 1) - return ; - - int i; - size_t mid = lower + (upper - lower + 1) / 2; - copy_point(&(P[mid]), &(P[lower])); - for (i = lower; i < (int)mid; i++) - xMULv2(&(P[mid]), &(P[mid]), &(TORSION_ODD_PRIMES[i]), p_plus_minus_bitlength[i], A); - for (i = (int)mid; i < (int)upper; i++) - xMULv2(&(P[lower]), &(P[lower]), &(TORSION_ODD_PRIMES[i]), p_plus_minus_bitlength[i], A); - - cofactor_multiples(P, A, lower, mid); - cofactor_multiples(P, A, mid, upper); -} - -// The projective x-coordinate point (X : Z) at infinity is such that Z == 0 -static inline int isinfinity(ec_point_t const P) -{ - return fp2_is_zero(&P.z); -} - -int main(int argc, char* argv[]) -{ - if (argc > 1) { - TEST_LOOPS = atoi(argv[1]); - } - - fp2_t fp2_0, fp2_1; - fp2_set(&fp2_0, 0); - fp_mont_setone(fp2_1.re);fp_set(fp2_1.im,0); - - int i, j; - - ec_point_t A; - fp2_set(&A.x, 0); - fp_mont_setone(A.z.re);fp_set(A.z.im,0); - - fp2_add(&A.z, &A.z, &A.z); // 2C - fp2_add(&A.x, &A.x, &A.z); // A' + 2C - fp2_add(&A.z, &A.z, &A.z); // 4C - - // Just to ensure the projective curve coeffientes are different from zero - assert( !fp2_is_zero(&A.x) & !fp2_is_zero(&A.x) ); - - fp2_t a; - coeff(&a, A); - - ec_point_t PA, QA, PQA, PB, QB, PQB; - - // Writing the public projective x-coordinate points into Montogmery domain - fp2_tomont(&(PA.x), &(xPA)); - fp_mont_setone(PA.z.re);fp_set(PA.z.im,0); - fp2_tomont(&(QA.x), &(xQA)); - fp_mont_setone(QA.z.re);fp_set(QA.z.im,0); - fp2_tomont(&(PQA.x), &(xPQA)); - fp_mont_setone(PQA.z.re);fp_set(PQA.z.im,0); - - assert( isrational(PA, a) ); - assert( isrational(QA, a) ); - assert( isrational(PQA, a) ); - - // ====================================================================================================== - // Recall, PA, QA, and PQA are expeted to be N-order points, but we require to ensure they are of order N - for (j = 0; j < P_LEN; j++) - { - for (i = 1; i < TORSION_ODD_POWERS[j]; i++) - { - xMULv2(&PA, &PA, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&QA, &QA, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&PQA, &PQA, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( isrational(PA, a) ); - assert( isrational(QA, a) ); - assert( isrational(PQA, a) ); - }; - }; - assert( !isinfinity(PA) ); - assert( !isinfinity(QA) ); - assert( !isinfinity(PQA) ); - - ec_point_t P[P_LEN + M_LEN], Q[P_LEN + M_LEN], PQ[P_LEN + M_LEN]; - copy_point(&(P[0]), &PA); - cofactor_multiples(P, &A, 0, P_LEN); - copy_point(&(Q[0]), &QA); - cofactor_multiples(Q, &A, 0, P_LEN); - copy_point(&(PQ[0]), &PQA); - cofactor_multiples(PQ, &A, 0, P_LEN); - for (j = 0; j < P_LEN; j++) - { - // x(PA) - assert( !isinfinity(P[j]) ); // It must be different from the point at infinity - assert( isrational(P[j], a) ); - xMULv2(&P[j], &P[j], &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - assert( isinfinity(P[j]) ); // It must be now the point at infinity - // x(QA) - assert( !isinfinity(Q[j]) ); // It must be different from the point at infinity - assert( isrational(Q[j], a) ); - xMULv2(&Q[j], &Q[j], &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - assert( isinfinity(Q[j]) ); // It must be now the point at infinity - // x(PQA) - assert( !isinfinity(PQ[j]) ); // It must be different from the point at infinity - assert( isrational(PQ[j], a) ); - xMULv2(&PQ[j], &PQ[j], &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - assert( isinfinity(PQ[j]) ); // It must be now the point at infinity - }; - // Writing the public projective x-coordinate points into Montogmery domain - fp2_tomont(&(PB.x), &(xPB)); - fp_mont_setone(PB.z.re);fp_set(PB.z.im,0); - fp2_tomont(&(QB.x), &(xQB)); - fp_mont_setone(QB.z.re);fp_set(QB.z.im,0); - fp2_tomont(&(PQB.x), &(xPQB)); - fp_mont_setone(PQB.z.re);fp_set(PQB.z.im,0); - - assert( !isrational(PB, a) ); - assert( !isrational(QB, a) ); - assert( !isrational(PQB, a) ); - // ====================================================================================================== - // Recall, PB, QB, and PQB are expeted to be M-order points, but we require to ensure they are of order M - for (j = P_LEN; j < (P_LEN + M_LEN); j++) - { - for (i = 1; i < TORSION_ODD_POWERS[j]; i++) - { - xMULv2(&PB, &PB, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&QB, &QB, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&PQB, &PQB, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( !isrational(PB, a) ); - assert( !isrational(QB, a) ); - assert( !isrational(PQB, a) ); - }; - }; - assert( !isinfinity(PB) ); - assert( !isinfinity(QB) ); - assert( !isinfinity(PQB) ); - - copy_point(&(P[P_LEN]), &PB); - cofactor_multiples(P, &A, P_LEN, P_LEN + M_LEN); - copy_point(&(Q[P_LEN]), &QB); - cofactor_multiples(Q, &A, P_LEN, P_LEN + M_LEN); - copy_point(&(PQ[P_LEN]), &PQB); - cofactor_multiples(PQ, &A, P_LEN, P_LEN + M_LEN); - for (j = P_LEN; j < (P_LEN+M_LEN); j++) - { - // x(PB) - assert( !isinfinity(P[j]) ); // It must be different from the point at infinity - assert( !isrational(P[j], a) ); - xMULv2(&P[j], &P[j], &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - assert( isinfinity(P[j]) ); // It must be now the point at infinity - // x(QB) - assert( !isinfinity(Q[j]) ); // It must be different from the point at infinity - assert( !isrational(Q[j], a) ); - xMULv2(&Q[j], &Q[j], &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - assert( isinfinity(Q[j]) ); // It must be now the point at infinity - // x(PQB) - assert( !isinfinity(PQ[j]) ); // It must be different from the point at infinity - assert( !isrational(PQ[j], a) ); - xMULv2(&PQ[j], &PQ[j], &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - assert( isinfinity(PQ[j]) ); // It must be now the point at infinity - }; - - fp2_t m; - - // Writing the public projective x-coordinate points into Montogmery domain - fp2_tomont(&(PA.x), &(xPA)); - fp_mont_setone(PA.z.re);fp_set(PA.z.im,0); - fp2_tomont(&(QA.x), &(xQA)); - fp_mont_setone(QA.z.re);fp_set(QA.z.im,0); - fp2_tomont(&(PQA.x), &(xPQA)); - fp_mont_setone(PQA.z.re);fp_set(PQA.z.im,0); - - assert( isrational(PA, a) ); - assert( isrational(QA, a) ); - assert( isrational(PQA, a) ); - - fp2_tomont(&(PB.x), &(xPB)); - fp_mont_setone(PB.z.re);fp_set(PB.z.im,0); - fp2_tomont(&(QB.x), &(xQB)); - fp_mont_setone(QB.z.re);fp_set(QB.z.im,0); - fp2_tomont(&(PQB.x), &(xPQB)); - fp_mont_setone(PQB.z.re);fp_set(PQB.z.im,0); - - assert( !isrational(PB, a) ); - assert( !isrational(QB, a) ); - assert( !isrational(PQB, a) ); - - ec_point_t R[P_LEN + M_LEN]; - int k; - for (j = 0; j < TEST_LOOPS; j++) - { - printf("[%3d%%] Testing EC differential arithmetic", 100 * j / TEST_LOOPS); - fflush(stdout); - printf("\r\x1b[K"); - fp2_random(&m); - ladder3pt(&(R[0]), m.re, &PA, &QA, &PQA, &A); - assert( isrational(R[0], a) ); - for (k = 0; k < P_LEN; k++) - { - for (i = 1; i < TORSION_ODD_POWERS[k]; i++) - { - xMULv2(&R[0], &R[0], &(TORSION_ODD_PRIMES[k]), p_plus_minus_bitlength[k], &A); - assert( isrational(R[0], a) ); - }; - }; - cofactor_multiples(R, &A, 0, P_LEN); - for (i = 0; i < P_LEN; i++) - { - assert( !isinfinity(R[i]) ); // It must be different from the point at infinity - assert( isrational(R[i], a) ); - xMULv2(&R[i], &R[i], &(TORSION_ODD_PRIMES[i]), p_plus_minus_bitlength[i], &A); - assert( isinfinity(R[i]) ); // It must be now the point at infinity - }; - - fp2_random(&m); - ladder3pt(&(R[P_LEN]), m.re, &PB, &QB, &PQB, &A); - assert( !isrational(R[P_LEN], a) ); - for (k = P_LEN; k < (P_LEN+M_LEN); k++) - { - for (i = 1; i < TORSION_ODD_POWERS[k]; i++) - { - xMULv2(&R[P_LEN], &R[P_LEN], &(TORSION_ODD_PRIMES[k]), p_plus_minus_bitlength[k], &A); - assert( !isrational(R[P_LEN], a) ); - }; - }; - cofactor_multiples(R, &A, P_LEN, P_LEN + M_LEN); - for (i = P_LEN; i < (P_LEN+M_LEN); i++) - { - assert( !isinfinity(R[i]) ); // It must be different from the point at infinity - assert( !isrational(R[i], a) ); - xMULv2(&R[i], &R[i], &(TORSION_ODD_PRIMES[i]), p_plus_minus_bitlength[i], &A); - assert( isinfinity(R[i]) ); // It must be now the point at infinity - }; - }; - - if(TEST_LOOPS) - printf("[%3d%%] Tested EC differential arithmetic:\tNo errors!\n", 100 * j / TEST_LOOPS); - printf("-- All tests passed.\n"); - - // BENCHMARK xDBLv2 - unsigned long long cycles, cycles1, cycles2; - cycles = 0; - ec_point_t PP[TEST_LOOPS], EE[TEST_LOOPS]; - for(int i = 0; i < TEST_LOOPS; i++){ - fp2_random(&PP[i].x); - fp2_random(&PP[i].z); - fp2_random(&EE[i].x); - fp2_random(&EE[i].z); - } - cycles1 = cpucycles(); - for(int i = 0; i < TEST_LOOPS; i++){ - xDBLv2(&PP[i], &PP[i], &EE[i]); - } - cycles2 = cpucycles(); - cycles = cycles+(cycles2-cycles1); - - printf("xDBLv2 bench: %7lld cycles\n", cycles/TEST_LOOPS); - - // BENCHMARK xIsog4 - cycles = 0; - ec_point_t KK0[TEST_LOOPS], KK1[TEST_LOOPS], KK2[TEST_LOOPS]; - for(int i = 0; i < TEST_LOOPS; i++){ - fp2_random(&KK0[i].x); - fp2_random(&KK0[i].z); - fp2_random(&KK1[i].x); - fp2_random(&KK1[i].z); - fp2_random(&KK2[i].x); - fp2_random(&KK2[i].z); - } - cycles1 = cpucycles(); - for(int i = 0; i < TEST_LOOPS; i++){ - fp2_t t0, t1; - fp2_add(&t0, &PP[i].x, &PP[i].z); - fp2_sub(&t1, &PP[i].x, &PP[i].z); - fp2_mul(&(EE[i].x), &t0, &KK1[i].x); - fp2_mul(&(EE[i].z), &t1, &KK2[i].x); - fp2_mul(&t0, &t0, &t1); - fp2_mul(&t0, &t0, &KK0[i].x); - fp2_add(&t1, &(EE[i].x), &(EE[i].z)); - fp2_sub(&(EE[i].z), &(EE[i].x), &(EE[i].z)); - fp2_sqr(&t1, &t1); - fp2_sqr(&(EE[i].z), &(EE[i].z)); - fp2_add(&(EE[i].x), &t0, &t1); - fp2_sub(&t0, &(EE[i].z), &t0); - fp2_mul(&(EE[i].x), &(EE[i].x), &t1); - fp2_mul(&(EE[i].z), &(EE[i].z), &t0); - } - cycles2 = cpucycles(); - cycles = cycles+(cycles2-cycles1); - printf("xeval_4 bench: %7lld cycles\n", cycles/TEST_LOOPS); - - return 0; -} diff --git a/src/ec/ref/ecx/test/poly-mul-test.c b/src/ec/ref/ecx/test/poly-mul-test.c deleted file mode 100644 index ba3dd6a..0000000 --- a/src/ec/ref/ecx/test/poly-mul-test.c +++ /dev/null @@ -1,445 +0,0 @@ -#include -#include -#include - -bool fp2_isequal(fp2_t a, fp2_t b){ - return fp_is_equal(a.re, b.re) && fp_is_equal(a.im, b.im); -} - -// VERY NOT SECURE (testing only) -void fp2_random(fp2_t *a){ - for(int i = 0; i < NWORDS_FIELD; i++){ - a->re[i] = rand(); - a->im[i] = rand(); - } - // Normalize - fp2_t one; - fp_mont_setone(one.re);fp_set(one.im,0); - fp2_mul(&*a, &*a, &one); - // Update seed - srand((unsigned) a->re[0]); -} - -void slow_mul(poly h, poly f, int lenf, poly g, int leng){ - // Computes h = f*g by school method - - fp2_t a, b; - int nf, ng, e; - int lenh = lenf + leng - 1; - - if(lenh <= 0){ - return; - } - - fp2_t fg[lenh]; - - if (leng > lenf){ - slow_mul(h, g, leng, f, lenf); - return; - } - - for(e = 0; e < lenh; e++){ - - if (lenf - 1 < e){ - nf = lenf - 1; - } - else{ - nf = e; - } - - ng = e - nf; - fp2_set(&a, 0); - while( (ng < leng) & (nf >= 0) ){ - fp2_mul(&b, &f[nf], &g[ng]); - fp2_add(&a, &a, &b); - nf--; - ng++; - } - fp2_copy(&fg[e], &a); - } - for(e = 0; e < lenh; e++){ - fp2_copy(&h[e], &fg[e]); - } - return; -} - - - -int main(){ - fp2_t fp2_0, fp2_1; - #define nmax 16 - int nf, ng, n, e; - fp2_set(&fp2_0, 0); - fp_mont_setone(fp2_1.re);fp_set(fp2_1.im,0); - - //TEST MULTIPLICATION BY 0 - - for(nf = 2; nf < nmax; nf++){ - fp2_t f[nf], h[nf-1]; - - printf("[%3d%%] Testing multiplication by 0", 100 * nf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - for(e = 0; e < nf; e++){ - fp2_random(&f[e]); - } - poly_mul(h, f, nf, f, 0); - for(e = 0; e < nf-1; e++){ - assert(fp2_is_zero(&h[e])==1); - } - poly_mul(h, f, 0, f, nf); - for(e = 0; e < nf-1; e++){ - assert(fp2_is_zero(&h[e])==1); - } - } - printf("[%3d%%] Tested multiplication by 0:\t\tNo errors!\n", 100 * nf / nmax); - - - - //TEST FOR f, g, h DISJOINT MEMORY SPACES - - for(nf = 1; nf < nmax; nf++){ - - printf("[%3d%%] Testing multiplication", 100 * nf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - for(ng = 1; ng < nmax; ng++){ - - fp2_t f[nf]; //Random length nf poly - for(e = 0; e < nf; e++){ - fp2_random(&f[e]); - } - - fp2_t g[ng]; // Random length ng poly - for(e = 0; e < ng; e++){ - fp2_random(&g[e]); - } - - fp2_t h[nf+ng-1];// Compute product - poly_mul(h, f, nf, g, ng); - - fp2_t fg[nf+ng-1]; // Compute the product by school method - slow_mul(fg, f, nf, g, ng); - - for(e = 0; e < nf + ng - 1; e++){ // Verify answer term by term - assert(fp2_isequal(h[e], fg[e])==1); - } - } - } - printf("[%3d%%] Tested multiplication:\t\t\tNo errors!\n", 100 * nf / nmax); - - - - // TEST FOR f, g CONTIGIOUS AND RESULT SAVED OVER THEM - - for(nf = 1; nf < nmax; nf++){ - - printf("[%3d%%] Testing multiplication in place", 100 * nf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - for(ng = 1; ng < nmax; ng++){ - - fp2_t h[nf+ng]; - - //Random length nf poly - for(e = 0; e < nf; e++){ - fp2_random(&h[e]); - } - - // Random length ng poly - for(e = 0; e < ng; e++){ - fp2_random(&h[e+nf]); - } - - // Compute the product - fp2_t fg[nf+ng-1]; - slow_mul(fg, h, nf, &(h[nf]), ng); // School method - poly_mul(h, h, nf, &(h[nf]), ng); // Karatsuba method - - - for(e = 0; e < nf + ng - 1; e++){ // Verify answer term by term - assert(fp2_isequal(h[e], fg[e])==1); - } - } - } - printf("[%3d%%] Tested multiplication in place:\t\tNo errors!\n", 100 * nf / nmax); - - - - //TEST FOR MULTIPLICATION MOD X^N BY 0 - - for(nf = 2; nf < nmax; nf++){ - fp2_t f[nf]; - - printf("[%3d%%] Testing mul mod x^n by 0", 100 * nf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - for(e = 0; e < nf; e++){ - fp2_random(&f[e]); - } - - for(n = 1; n < nmax; n++){ - fp2_t h[n]; - poly_mul_low(h, n, f, nf, f, 0); - for(e = 0; e < n; e++){ - assert(fp2_is_zero(&h[e])==1); - } - poly_mul_low(h, n, f, 0, f, nf); - for(e = 0; e < n; e++){ - assert(fp2_is_zero(&h[e])==1); - } - } - } - printf("[%3d%%] Tested mul mod x^n by 0:\t\t\tNo errors!\n", 100 * nf / nmax); - - - - //TEST FOR MULTIPLICATION MOD X^N - - for(nf = 1; nf < nmax; nf++){ - - printf("[%3d%%] Testing mul mod x^n", 100 * nf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - for(ng = 1; ng < nmax; ng++){ - - fp2_t f[nf], g[ng], fg[nf+ng-1]; - poly h; - - //Get random polynomials - for(e = 0; e < nf; e++){ - fp2_random(&f[e]); - } - for(e = 0; e < ng; e++){ - fp2_random(&g[e]); - } - - //Save regular result to fg - slow_mul(fg, f, nf, g, ng); - - //Compute result mod x^n - for(n = 1; n < 2*nmax; n++){ - h = malloc(sizeof(fp2_t)*n); - poly_mul_low(h, n, f, nf, g, ng); - - //Compare with expected - e = 0; - while(e < nf+ng-1 && e < n){ - assert(fp2_isequal(h[e], fg[e]) == 1); - e++; - } - while(e < n){ - assert(fp2_is_zero(&h[e]) == 1); - e++; - } - free(h); - } - } - } - printf("[%3d%%] Tested mul mod x^n:\t\t\tNo errors!\n", 100 * nf / nmax); - - - - //TEST FOR POLY_MUL_MIDDLE - - for(nf = 1; nf < 2*nmax; nf+=1){ - fp2_t f[nf]; - - printf("[%3d%%] Testing poly_mul_middle", 100 * nf / (2*nmax)); - fflush(stdout); - printf("\r\x1b[K"); - - for(ng = (nf+1)>>1; ng < (nf+1)-((nf+1)>>1); ng++){ - // This runs from floor((nf+1)/2) to ceil((nf+1)/2) - fp2_t g[ng]; - for(e = 0; e < nf; e++){ - fp2_random(&f[e]); - } - for(e = 0; e < ng; e++){ - fp2_random(&g[e]); - } - - fp2_t h[nf+ng-1]; - slow_mul(h, g, ng, f, nf); - poly_mul_middle(g, g, ng, f, nf); - - for(e = 0; e < ng; e++){ - assert(fp2_isequal(h[e+nf-ng], g[e])==1); - } - } - } - printf("[%3d%%] Tested poly_mul_middle:\t\t\tNo errors!\n", 100 * nf / (2*nmax)); - - - // TEST FOR SELF RECIPROCAL MULTIPLICATION - for(nf = 1; nf < nmax; nf++){ - - printf("[%3d%%] Testing self reciprocal mul", 100 * nf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - for(ng = 1; ng < nmax; ng++){ - - fp2_t f[nf], g[ng], h[nf+ng-1], fg[nf+ng-1]; - - // Get random palyndromes - for(e = 0; e < (nf>>1); e++){ - fp2_random(&f[e]); - fp2_copy(&f[nf-1-e], &f[e]); - } - if(nf & 1){ - fp2_random(&f[nf>>1]); - } - - for(e = 0; e < (ng>>1); e++){ - fp2_random(&g[e]); - fp2_copy(&g[ng-1-e], &g[e]); - } - if(ng & 1){ - fp2_random(&g[ng>>1]); - } - - // Compute products - poly_mul_selfreciprocal(h, g, ng, f, nf); - slow_mul(fg, g, ng, f, nf); - - // Compare - for(e = 0; e < nf+ng-1; e++){ - assert(fp2_isequal(fg[e], h[e])==1); - } - } - } - printf("[%3d%%] Tested self reciprocal mul:\t\tNo errors!\n", 100 * nf / nmax); - - // TEST FOR PRODUCT TREES - int tree_size, iteration, i; - int len, *DEG, LENF; - poly *H, *F, h; - - for(tree_size = 1; tree_size < nmax; tree_size++){ - - printf("[%3d%%] Testing product tree:\t\t\tSize %d out of %d", 100 * tree_size / nmax, tree_size, nmax-1); - fflush(stdout); - printf("\r\x1b[K"); - - i = 0; - while((1<>1); e++){ - fp2_random(&F[i][e]); - fp2_copy(&F[i][LENF-1-e], &F[i][e]); - } - if(LENF & 1){ - fp2_random(&F[i][(LENF>>1)]); - } - } - product_tree_selfreciprocal(H, DEG, 0, F, LENF, tree_size); - - // Build product of all polynomials manually - len = LENF; - for(e = 0; e < LENF; e++){ - fp2_copy(&h[e], &F[0][e]); - } - for(i = 1; i < tree_size; i++){ - poly_mul(h, h, len, F[i], LENF); - len += LENF-1; - } - - // Compare to root - assert (len == DEG[0]+1); - for(e = 0; e < len; e++){ - assert(fp2_isequal(H[0][e], h[e])==1); - } - clear_tree(H, 0, tree_size); - for(i = 0; i < tree_size; i++){ - free(F[i]); - } - - } - free(DEG); - free(H); - free(F); - free(h); - } - printf("[%3d%%] Tested selfreciprocal product tree:\tNo errors!\n", 100 * tree_size / nmax); - - printf("-- All tests passed.\n"); - return 0; -} - diff --git a/src/ec/ref/ecx/test/poly-redc-test.c b/src/ec/ref/ecx/test/poly-redc-test.c deleted file mode 100644 index 3302ff3..0000000 --- a/src/ec/ref/ecx/test/poly-redc-test.c +++ /dev/null @@ -1,461 +0,0 @@ -#include "poly.h" -#include -#include -#define nmax 32 - -bool fp2_isequal(fp2_t a, fp2_t b){ - return fp_is_equal(a.re, b.re) && fp_is_equal(a.im, b.im); -} - -// VERY NOT SECURE (testing only) -void fp2_random(fp2_t *a){ - for(int i = 0; i < NWORDS_FIELD; i++){ - a->re[i] = rand(); - a->im[i] = rand(); - } - // Normalize - fp2_t one; - fp_mont_setone(one.re);fp_set(one.im,0); - fp2_mul(&*a, &*a, &one); - // Update seed - srand((unsigned) a->re[0]); -} - -int main(){ - fp2_t fp2_0, fp2_1; - fp2_set(&fp2_0, 0); - fp_mont_setone(fp2_1.re);fp_set(fp2_1.im,0); - - int lenf, leng, n, e, iteration, array_size, tree_size, i, root, brother, *DEG, LENF; - poly f, g, h, f_rev, f_rev_inv, *F, *H, *R, g1, g2, REM1, REM2, G1, G2, G1_rev, G2_rev, R0; - fp2_t c, *A, *C, ratio, A0; - - f_rev_inv = 0; - -// TEST FOR RECIPROCAL - for(lenf = 1; lenf < nmax; lenf++) - { - printf("[%3d%%] Testing reciprocals", 100 * lenf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - // Get random poly - f = malloc(sizeof(fp2_t)*lenf); - for(e = 0; e < lenf; e++) - fp2_random(&f[e]); - - for(n = 1; n < nmax; n++) - { - // Get the reciprocal and multiply them - h = malloc(sizeof(fp2_t)*n); - memset(h, 0, sizeof(fp2_t)*n); - reciprocal(h, &c, f, lenf, n); - poly_mul_low(h, n, f, lenf, h, n); - - // Compare with expected - assert(fp2_isequal(h[0],c)); - for(e = 1; e < n; e++) - assert(fp2_is_zero(&h[e])); - free(h); - } - free(f); - } - printf("[%3d%%] Tested reciprocals:\t\tNo errors!\n", 100 * lenf / nmax); - - - - // TEST FOR REDUCTION - for(lenf = 2; lenf < nmax; lenf++) - { - printf("[%3d%%] Testing polynomial reduction", 100 * lenf / nmax); - fflush(stdout); - printf("\r\x1b[K"); - - // Get random poly for the mod - f = malloc(sizeof(fp2_t)*lenf); - f_rev = malloc(sizeof(fp2_t)*lenf); - for(e = 0; e < lenf; e++) - { - fp2_random(&f[e]); - fp2_copy(&f_rev[lenf-1-e], &f[e]); - } - - for(leng = 1; leng < nmax; leng++) - { - // Get random poly to reduce - g = malloc(sizeof(fp2_t)*leng); - for(e = 0; e < leng; e++){ - fp2_random(&g[e]); - } - - // Get reverse-inverse mod x^(leng-lenf+1) - if(leng >= lenf) - { - f_rev_inv = malloc(sizeof(fp2_t)*(leng-lenf+1)); - reciprocal(f_rev_inv, &c, f_rev, lenf, leng-lenf+1); - } - else{ - fp_mont_setone(c.re);fp_set(c.im,0); - } - - // Compute the reduction - h = malloc(sizeof(fp2_t)*(lenf-1)); - poly_redc(h, g, leng, f, lenf, f_rev_inv, c); - - // Reduce manually - int leng_red = leng; - fp2_t scale, f_e; - while(leng_red >= lenf) - { - fp2_copy(&scale, &f[lenf-1]); - fp2_inv(&scale); - fp2_mul(&scale, &scale, &g[leng_red-1]); - for(e = 0; e < lenf; e++) - { - fp2_mul(&f_e, &f[e], &scale); - fp2_sub(&g[e+leng_red-lenf], &g[e+leng_red-lenf], &f_e); - } - leng_red--; - } - - // Rescale manual result - if( leng < lenf){ - fp_mont_setone(scale.re);fp_set(scale.im,0); - } - else - if(lenf == 2 && leng == 3) - { - fp2_sqr(&scale, &f[1]); - fp2_add(&scale, &scale, &scale); - } - else - fp2_copy(&scale, &c); - for(e = 0; e < leng_red; e++) - fp2_mul(&g[e], &g[e], &scale); - - - // Comapre results - for(e = leng_red-1; e >= 0; e--) - assert(fp2_isequal(h[e], g[e])); - for(e = leng_red; e < lenf-1; e++) - assert(fp2_is_zero(&h[e])); - - free(g); - free(h); - if(leng >= lenf) - free(f_rev_inv); - } - free(f); - free(f_rev); - } - printf("[%3d%%] Tested polynomial reduction:\tNo errors!\n", 100 * lenf / nmax); - - - -// TEST FOR RECIPROCAL TREES - - for(tree_size = 3; tree_size < nmax; tree_size++) - { - printf("[%3d%%] Testing reciprocal tree:\t\tTree size %d out of %d", 100 * tree_size / nmax, tree_size, nmax); - fflush(stdout); - printf("\r\x1b[K"); - - // Compute size of arrays - i = 0; - while((1< 1) - { - if(rand() & 1) - { - root = 2*root+1; - n = n - (n>>1); - } - else - { - root = 2*root+2; - n = n>>1; - } - brother = root - 1 + 2*(root & 1); - - // Check current node - if(DEG[root] > 2) - { - lenf = DEG[brother]; - f = malloc(sizeof(fp2_t)*lenf); - for(e = 0; e < DEG[root]+1 && e < lenf; e++){ - fp2_copy(&f[e], &H[root][DEG[root]-e]); - } - for(e = DEG[root]+1; e < lenf; e++){ - fp2_set(&f[e], 0); - } - poly_mul_low(f, lenf, f, lenf, R[root], lenf); - assert(fp2_isequal(f[0], A[root])); - for(e = 1; e < lenf; e++){ - assert(fp2_is_zero(&f[e])); - } - free(f); - } - } - } - // Clean up - for(i = 0; i < tree_size; i++) - free(F[i]); - clear_tree(H, 0, tree_size); - clear_tree(R, 0, tree_size); - free(F); - free(H); - free(R); - free(A); - free(DEG); - } - printf("[%3d%%] Tested reciprocal tree:\t\tNo errors!\n", 100 * tree_size / nmax); - - - - // TEST FOR REMAINDERS - for(tree_size = 2; tree_size < nmax; tree_size++) - { - printf("[%3d%%] Testing batched remainders:\t\tTree size %d out of %d", 100 * tree_size / nmax, tree_size, nmax); - fflush(stdout); - printf("\r\x1b[K"); - - // Compute size of arrays - i = 0; - while((1< leng-DEG[0]) - reciprocal(R0, &A0, f_rev, DEG[0]+1, DEG[0]); - else - reciprocal(R0, &A0, f_rev, DEG[0]+1, leng-DEG[0]); - poly_redc(G1, g1, leng, H[0], DEG[0]+1, R0, A0); - poly_redc(G2, g2, leng, H[0], DEG[0]+1, R0, A0); - for(e = 0; e < DEG[0]; e++) - { - fp2_copy(&G1_rev[e], &G1[DEG[0]-1-e]); - fp2_copy(&G2_rev[e], &G2[DEG[0]-1-e]); - } - poly_mul_middle(G1_rev, G1_rev, DEG[0], R0, DEG[0]); - poly_mul_middle(G2_rev, G2_rev, DEG[0], R0, DEG[0]); - for(e = 0; e < DEG[0]; e++) - { - fp2_copy(&G1[e], &G1_rev[DEG[0]-1-e]); - fp2_copy(&G2[e], &G2_rev[DEG[0]-1-e]); - } - free(G1_rev);free(G2_rev);free(R0);free(f_rev); - - // Compute the scaled remainder trees - multieval_scaled(REM1, G1, H, DEG, 0, tree_size); - multieval_scaled(REM2, G2, H, DEG, 0, tree_size); - - for(i = 0; i < tree_size; i++) - { - // Get ratio of the remainder - fp2_inv(&REM1[i]); - fp2_mul(&ratio, &REM1[i], &REM2[i]); - - // Compute remainders manually - f_rev = malloc(sizeof(fp2_t)*LENF); - f_rev_inv = malloc(sizeof(fp2_t)*(leng-LENF+1)); - h = malloc(sizeof(fp2_t)*(LENF-1)); - for(e = 0; e < LENF; e++) - fp2_copy(&f_rev[e], &F[i][LENF-1-e]); - reciprocal(f_rev_inv, &c, f_rev, LENF, leng-LENF+1); - poly_redc(h, g1, leng, F[i], LENF, f_rev_inv, c); - fp2_copy(&REM1[i], &h[0]); - poly_redc(h, g2, leng, F[i], LENF, f_rev_inv, c); - fp2_copy(&REM2[i], &h[0]); - free(f_rev);free(f_rev_inv);free(h); - - // Compare results - fp2_inv(&REM1[i]); - fp2_mul(&REM1[i], &REM1[i], &REM2[i]); - assert(fp2_isequal(REM1[i], ratio)); - } - - // Clean up - for(i = 0; i < tree_size; i++) - free(F[i]); - free(F);free(g1);free(g2);free(G1);free(G2); - clear_tree(H, 0, tree_size);free(H);free(DEG); - free(REM1);free(REM2); - } - printf("[%3d%%] Tested scaled remainder tree:\tNo errors!\n", 100 * tree_size / nmax); - - printf("-- All tests passed.\n"); -} diff --git a/src/ec/ref/ecx/test/test_extras.c b/src/ec/ref/ecx/test/test_extras.c deleted file mode 100755 index 83921dc..0000000 --- a/src/ec/ref/ecx/test/test_extras.c +++ /dev/null @@ -1,75 +0,0 @@ -#include "test_extras.h" -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; -extern const digit_t R2[NWORDS_FIELD]; - - -#if 0 -int64_t cpucycles(void) -{ // Access system counter for benchmarking - unsigned int hi, lo; - - asm volatile ("rdtsc\n\t" : "=a" (lo), "=d"(hi)); - return ((int64_t)lo) | (((int64_t)hi) << 32); -} -#endif - - -int compare_words(digit_t* a, digit_t* b, unsigned int nwords) -{ // Comparing "nword" elements, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) - { - if (a[i] > b[i]) return 1; - else if (a[i] < b[i]) return -1; - } - - return 0; -} - - -void sub_test(digit_t* out, digit_t* a, digit_t* b, unsigned int nwords) -{ // Subtraction without borrow, out = a-b where a>b - // SECURITY NOTE: this function does not have constant-time execution. It is for TESTING ONLY. - unsigned int i; - digit_t res, carry, borrow = 0; - - for (i = 0; i < nwords; i++) - { - res = a[i] - b[i]; - carry = (a[i] < b[i]); - out[i] = res - borrow; - borrow = carry || (res < borrow); - } -} - - -void fprandom_test(digit_t* a) -{ // Generating a pseudo-random field element in [0, p-1] - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - unsigned int i, diff = 256-254, nwords = NWORDS_FIELD; - unsigned char* string = NULL; - - string = (unsigned char*)a; - for (i = 0; i < sizeof(digit_t)*nwords; i++) { - *(string + i) = (unsigned char)rand(); // Obtain 256-bit number - } - a[nwords-1] &= (((digit_t)(-1) << diff) >> diff); - - while (compare_words((digit_t*)p, a, nwords) < 1) { // Force it to [0, modulus-1] - sub_test(a, a, (digit_t*)p, nwords); - } -} - - -void fp2random_test(fp2_t* a) -{ // Generating a pseudo-random element in GF(p^2) - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - - fprandom_test(a->re); - fprandom_test(a->im); -} \ No newline at end of file diff --git a/src/ec/ref/ecx/test/test_extras.h b/src/ec/ref/ecx/test/test_extras.h deleted file mode 100755 index 5941865..0000000 --- a/src/ec/ref/ecx/test/test_extras.h +++ /dev/null @@ -1,29 +0,0 @@ - -#ifndef TEST_EXTRAS_H -#define TEST_EXTRAS_H - -#include -#include -#include -#include -#include - -#define PASSED 0 -#define FAILED 1 - -// Access system counter for benchmarking -//int64_t cpucycles(void); - -// Comparing "nword" elements, a=b? : (1) a!=b, (0) a=b -int compare_words(digit_t* a, digit_t* b, unsigned int nwords); - -// Multiprecision subtraction for testing, assumes a > b -void sub_test(digit_t* out, digit_t* a, digit_t* b, unsigned int nwords); - -// Generating a pseudo-random field element in [0, p-1] -void fprandom_test(digit_t* a); - -// Generating a pseudo-random element in GF(p^2) -void fp2random_test(fp2_t* a); - -#endif \ No newline at end of file diff --git a/src/ec/ref/ecx/test/velu-test.c b/src/ec/ref/ecx/test/velu-test.c deleted file mode 100644 index da8bfc6..0000000 --- a/src/ec/ref/ecx/test/velu-test.c +++ /dev/null @@ -1,298 +0,0 @@ -#include -#include -#include -#include - -#include "isog.h" -#include "sdacs.h" -#include "ec.h" -#include "test-basis.h" - -void random_scalar(fp_t k, const uint8_t j) -{ - for(int i = 0; i < NWORDS_FIELD; i++) - k[i] = rand(); -} - -// Affine Montgomery coefficient computation (A + 2C : 4C) --> A/C -void coeff(fp2_t *B, ec_point_t const A) -{ - fp2_t t; - fp2_add(&t, &A.x, &A.x); // (2 * A24) - fp2_sub(&t, &t, &A.z); // (2 * A24) - C24 - - fp2_copy(&*B, &A.z); - fp2_inv(&*B); // 1 / (C24) - fp2_add(&t, &t, &t); // 4*A = 2[(2 * A24) - C24] - fp2_mul(&*B, &t, &*B); // A/C = 2[(2 * A24) - C24] / C24 -} - -// Determines if point is fp2-rational (if not, then it must be a zero trace point) -uint8_t isrational(ec_point_t const T, fp2_t const a) -{ - fp2_t XT, tmp, aux, YT_squared; - - fp2_copy(&XT, &T.z); - fp2_inv(&XT); - - fp2_mul(&XT, &XT, &T.x); - - fp2_sqr(&tmp, &XT); - fp2_mul(&aux, &tmp, &XT); - fp2_mul(&tmp, &tmp, &a); - fp2_add(&YT_squared, &tmp, &aux); - fp2_add(&YT_squared, &YT_squared, &XT); - - return fp2_is_square(&YT_squared); -} - -// ladder3pt computes x(P + [m]Q) -void ladder3pt(ec_point_t *R, fp_t const m, ec_point_t const *P, ec_point_t const *Q, ec_point_t const *PQ, ec_point_t const *A) -{ - ec_point_t X0, X1, X2; - copy_point(&X0, Q); - copy_point(&X1, P); - copy_point(&X2, PQ); - - int i,j; - uint64_t t; - for (i = 0; i < NWORDS_FIELD; i++) - { - t = 1; - for (j = 0 ; j < 64; j++) - { - swap_points(&X1, &X2, -((t & m[i]) == 0)); - xDBLADD(&X0, &X1, &X0, &X1, &X2, A); - swap_points(&X1, &X2, -((t & m[i]) == 0)); - t <<= 1; - }; - }; - copy_point(R, &X1); -} - -// The projective x-coordinate point (X : Z) at infinity is such that Z == 0 -static inline int isinfinity(ec_point_t const P) -{ - return fp2_is_zero(&P.z); -} - -int main() -{ - - fp2_t fp2_0, fp2_1; - fp2_set(&fp2_0, 0); - fp_mont_setone(fp2_1.re);fp_set(fp2_1.im,0); - - int i, j; - - ec_point_t A, B, T; - fp2_set(&A.x, 0); - fp_mont_setone(A.z.re);fp_set(A.z.im,0); - - // fp2_add(&A.x, &A.z, &A.x); // 1 - // fp2_add(&A.x, &A.x, &A.x); // 2 - // fp2_add(&A.x, &A.z, &A.x); // 3 - // fp2_add(&A.x, &A.x, &A.x); // 6 - - fp2_add(&A.z, &A.z, &A.z); // 2C - fp2_add(&A.x, &A.x, &A.z); // A' + 2C - fp2_add(&A.z, &A.z, &A.z); // 4C - - // Just to ensure the projective curve coeffientes are different from zero - assert( !fp2_is_zero(&A.x) & !fp2_is_zero(&A.x) ); - - fp2_t a; - coeff(&a, A); - - ec_point_t PA, QA, PQA, PB, QB, PQB, RA, RB; - - // Writing the public projective x-coordinate points into Montogmery domain - fp2_tomont(&(PA.x), &(xPA)); - fp_mont_setone(PA.z.re);fp_set(PA.z.im,0); - fp2_tomont(&(QA.x), &(xQA)); - fp_mont_setone(QA.z.re);fp_set(QA.z.im,0); - fp2_tomont(&(PQA.x), &(xPQA)); - fp_mont_setone(PQA.z.re);fp_set(PQA.z.im,0); - - assert( isrational(PA, a) ); - assert( isrational(QA, a) ); - assert( isrational(PQA, a) ); - - fp2_tomont(&(PB.x), &(xPB)); - fp_mont_setone(PB.z.re);fp_set(PB.z.im,0); - fp2_tomont(&(QB.x), &(xQB)); - fp_mont_setone(QB.z.re);fp_set(QB.z.im,0); - fp2_tomont(&(PQB.x), &(xPQB)); - fp_mont_setone(PQB.z.re);fp_set(PQB.z.im,0); - - assert( !isrational(PB, a) ); - assert( !isrational(QB, a) ); - assert( !isrational(PQB, a) ); - // ====================================================================================================== - // Recall, PA, QA, and PQA are expeted to be N-order points, but we require to ensure they are of order N - for (j = 0; j < P_LEN; j++) - { - for (i = 1; i < TORSION_ODD_POWERS[j]; i++) - { - xMULv2(&PA, &PA, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&QA, &QA, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&PQA, &PQA, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( isrational(PA, a) ); - assert( isrational(QA, a) ); - assert( isrational(PQA, a) ); - }; - }; - - assert( !isinfinity(PA) ); - assert( !isinfinity(QA) ); - assert( !isinfinity(PQA) ); - - // -------------------------------------------------------------- - fp_t m; - random_scalar(m, 0); - ladder3pt(&RA, m, &PA, &QA, &PQA, &A); - for (i = 0; i < P_LEN; i++) - { - printf("// Processing the %d-th prime:\t", i + 1); - printf("%2d%%", 100 * i / (int)P_LEN); - fflush(stdout); - printf("\r\x1b[K"); - - copy_point(&T, &RA); - for (j = (i+1); j < P_LEN; j++) - xMULv2(&T, &T, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( !isinfinity(T) ); - - kps(i, T, A); - if (TORSION_ODD_PRIMES[i] > gap) - printf("[\033[0;31m%7" PRId64 "\033[0m] (#I: %3d, #J: %3d, #K: %3d) \n", TORSION_ODD_PRIMES[i], sI, sJ, sK); - else - printf("[\033[0;31m%7" PRId64 "\033[0m] --------------------------- \n", TORSION_ODD_PRIMES[i]); - - xisog(&B, i, A); - - xeval(&PB, i, PB, A); - coeff(&a, B); - assert( !isinfinity(PB) ); - assert( !isrational(PB, a) ); - - xeval(&RA, i, RA, A); - assert( (!isinfinity(RA) && (i < (P_LEN - 1))) || (isinfinity(RA) && (i == (P_LEN - 1))) ); - assert( (isrational(RA, a) && (i < (P_LEN - 1))) || (isinfinity(RA) && (i == (P_LEN - 1))) ); - - copy_point(&A, &B); - // Verifying the order of the image point of PA has been reduced - copy_point(&T, &RA); - for (j = (i+1); j < P_LEN; j++) - xMULv2(&T, &T, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( isinfinity(T) ); - kps_clear(i); - }; - - fp2_set(&A.x, 0); - fp_mont_setone(A.z.re);fp_set(A.z.im,0); - - // fp2_add(&A.x, &A.z, &A.x); // 1 - // fp2_add(&A.x, &A.x, &A.x); // 2 - // fp2_add(&A.x, &A.z, &A.x); // 3 - // fp2_add(&A.x, &A.x, &A.x); // 6 - - fp2_add(&A.z, &A.z, &A.z); // 2C - fp2_add(&A.x, &A.x, &A.z); // A' + 2C - fp2_add(&A.z, &A.z, &A.z); // 4C - - // Just to ensure the projective curve coeffientes are different from zero - assert( !fp2_is_zero(&A.x) & !fp2_is_zero(&A.x) ); - - coeff(&a, A); - // Writing the public projective x-coordinate points into Montogmery domain - fp2_tomont(&(PA.x), &(xPA)); - fp_mont_setone(PA.z.re);fp_set(PA.z.im,0); - fp2_tomont(&(QA.x), &(xQA)); - fp_mont_setone(QA.z.re);fp_set(QA.z.im,0); - fp2_tomont(&(PQA.x), &(xPQA)); - fp_mont_setone(PQA.z.re);fp_set(PQA.z.im,0); - - assert( isrational(PA, a) ); - assert( isrational(QA, a) ); - assert( isrational(PQA, a) ); - - fp2_tomont(&(PB.x), &(xPB)); - fp_mont_setone(PB.z.re);fp_set(PB.z.im,0); - fp2_tomont(&(QB.x), &(xQB)); - fp_mont_setone(QB.z.re);fp_set(QB.z.im,0); - fp2_tomont(&(PQB.x), &(xPQB)); - fp_mont_setone(PQB.z.re);fp_set(PQB.z.im,0); - - assert( !isrational(PB, a) ); - assert( !isrational(QB, a) ); - assert( !isrational(PQB, a) ); - - // ====================================================================================================== - // Recall, PA, QA, and PQA are expeted to be N-order points, but we require to ensure they are of order N - for (j = P_LEN; j < (P_LEN+M_LEN); j++) - { - for (i = 1; i < TORSION_ODD_POWERS[j]; i++) - { - xMULv2(&PB, &PB, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&QB, &QB, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - xMULv2(&PQB, &PQB, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( !isrational(PB, a) ); - assert( !isrational(QB, a) ); - assert( !isrational(PQB, a) ); - }; - }; - - assert( !isinfinity(PB) ); - assert( !isinfinity(QB) ); - assert( !isinfinity(PQB) ); - - random_scalar(m, 1); - ladder3pt(&RB, m, &PB, &QB, &PQB, &A); - for (i = P_LEN; i < (P_LEN+M_LEN); i++) - { - printf("// Processing the %d-th prime:\t", i + 1); - printf("%2d%%", 100 * i / (int)(P_LEN+M_LEN)); - fflush(stdout); - printf("\r\x1b[K"); - - copy_point(&T, &RB); - for (j = (i+1); j < (P_LEN+M_LEN); j++) - xMULv2(&T, &T, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( !isinfinity(T) ); - - kps(i, T, A); - if (TORSION_ODD_PRIMES[i] > gap) - printf("[\033[0;31m%7" PRId64 "\033[0m] (#I: %3d, #J: %3d, #K: %3d) \n", TORSION_ODD_PRIMES[i], sI, sJ, sK); - else - printf("[\033[0;31m%7" PRId64 "\033[0m] --------------------------- \n", TORSION_ODD_PRIMES[i]); - - xisog(&B, i, A); - - xeval(&PA, i, PA, A); - coeff(&a, B); - assert( !isinfinity(PA) ); - assert( isrational(PA, a) ); - - xeval(&RB, i, RB, A); - assert( (!isinfinity(RB) && (i < (P_LEN + M_LEN - 1))) || (isinfinity(RB) && (i == (P_LEN + M_LEN - 1))) ); - assert( (!isrational(RB, a) && (i < (P_LEN + M_LEN - 1))) || (isinfinity(RB) && (i == (P_LEN + M_LEN - 1))) ); - - copy_point(&A, &B); - // Verifying the order of the image point of PB has been reduced - copy_point(&T, &RB); - for (j = (i+1); j < (P_LEN+M_LEN); j++) - xMULv2(&T, &T, &(TORSION_ODD_PRIMES[j]), p_plus_minus_bitlength[j], &A); - - assert( isinfinity(T) ); - kps_clear(i); - }; - - printf("-- All tests passed!\n"); - return 0; -} diff --git a/src/ec/ref/ecx/xeval.c b/src/ec/ref/ecx/xeval.c deleted file mode 100644 index 5bf83a3..0000000 --- a/src/ec/ref/ecx/xeval.c +++ /dev/null @@ -1,299 +0,0 @@ -#include "isog.h" -#include "ec.h" -#include - -// ----------------------------------------------------------------------------------------- -// ----------------------------------------------------------------------------------------- -// Traditional isogeny evaluation (xEVAL) - -// CrissCross procedure as described in Hisil and Costello paper -void CrissCross(fp2_t *r0, fp2_t *r1, fp2_t const alpha, fp2_t const beta, fp2_t const gamma, fp2_t const delta) -{ - fp2_t t_1, t_2; - - fp2_mul(&t_1, &alpha, &delta); - fp2_mul(&t_2, &beta, &gamma); - fp2_add(&*r0, &t_1, &t_2); - fp2_sub(&*r1, &t_1, &t_2); -} - -// Degree-2 isogeny evaluation with kenerl generated by P != (0, 0) -void xeval_2(ec_point_t* R, ec_point_t* const Q, const int lenQ) -{ - fp2_t t0, t1, t2; - for(int j = 0; j < lenQ; j++){ - fp2_add(&t0, &Q[j].x, &Q[j].z); - fp2_sub(&t1, &Q[j].x, &Q[j].z); - fp2_mul(&t2, &K[0].x, &t1); - fp2_mul(&t1, &K[0].z, &t0); - fp2_add(&t0, &t2, &t1); - fp2_sub(&t1, &t2, &t1); - fp2_mul(&R[j].x, &Q[j].x, &t0); - fp2_mul(&R[j].z, &Q[j].z, &t1); - } -} - -// Degree-4 isogeny evaluation with kenerl generated by P such that [2]P != (0, 0) -void xeval_4(ec_point_t* R, const ec_point_t* Q, const int lenQ) -{ - fp2_t t0, t1; - - for(int i = 0; i < lenQ; i++){ - fp2_add(&t0, &Q[i].x, &Q[i].z); - fp2_sub(&t1, &Q[i].x, &Q[i].z); - fp2_mul(&(R[i].x), &t0, &K[1].x); - fp2_mul(&(R[i].z), &t1, &K[2].x); - fp2_mul(&t0, &t0, &t1); - fp2_mul(&t0, &t0, &K[0].x); - fp2_add(&t1, &(R[i].x), &(R[i].z)); - fp2_sub(&(R[i].z), &(R[i].x), &(R[i].z)); - fp2_sqr(&t1, &t1); - fp2_sqr(&(R[i].z), &(R[i].z)); - fp2_add(&(R[i].x), &t0, &t1); - fp2_sub(&t0, &t0, &(R[i].z)); - fp2_mul(&(R[i].x), &(R[i].x), &t1); - fp2_mul(&(R[i].z), &(R[i].z), &t0); - } -} - -// Degree-4 isogeny evaluation with kenerl generated by P such that [2]P = (0, 0) -// Must call after xisog_4_singular -void xeval_4_singular(ec_point_t* R, const ec_point_t* Q, const int lenQ, const ec_point_t P) -{ - fp2_t t0, t1, t2; - for(int i = 0; i < lenQ; i++){ - fp2_add(&t0, &Q[i].x, &Q[i].z); - fp2_sub(&t2, &Q[i].x, &Q[i].z); - fp2_sqr(&t0, &t0); - fp2_sqr(&t2, &t2); - fp2_sub(&R[i].z, &t0, &t2); - if(fp2_is_equal(&P.x, &P.z)){ - // Branch for P = (+1,_) - fp2_copy(&t1, &t2); - } - else{ - // Branch for P = (-1,_) - fp2_copy(&t1, &t0); - fp2_copy(&t0, &t2); - } - fp2_mul(&R[i].x, &R[i].z, &K[0].x); - fp2_mul(&R[i].z, &R[i].z, &K[1].x); - fp2_mul(&R[i].z, &R[i].z, &t1); - fp2_mul(&t1, &t1, &K[0].z); - fp2_add(&R[i].x, &R[i].x, &t1); - fp2_mul(&R[i].x, &R[i].x, &t0); - } -} - -// Isogeny evaluation on Montgomery curves -// Recall: K has been computed in Twisted Edwards model and none extra additions are required. -void xeval_t(ec_point_t* Q, uint64_t const i, ec_point_t const P) -{ - int j; - int d = ((int)TORSION_ODD_PRIMES[i] - 1) / 2; // Here, l = 2d + 1 - - fp2_t R0, R1, S0, S1, T0, T1; - fp2_add(&S0, &P.x, &P.z); - fp2_sub(&S1, &P.x, &P.z); - - CrissCross(&R0, &R1, K[0].z, K[0].x, S0, S1); - for (j = 1; j < d; j++) - { - CrissCross(&T0, &T1, K[j].z, K[j].x, S0, S1); - fp2_mul(&R0, &T0, &R0); - fp2_mul(&R1, &T1, &R1); - }; - - fp2_sqr(&R0, &R0); - fp2_sqr(&R1, &R1); - - fp2_mul(&(Q->x), &P.x, &R0); - fp2_mul(&(Q->z), &P.z, &R1); -} - -// ----------------------------------------------------------------------------------------- -// ----------------------------------------------------------------------------------------- -// Isogeny evaluation (xEVAL) used in velu SQRT - -void xeval_s(ec_point_t* Q, uint64_t const i, ec_point_t const P, ec_point_t const A) -{ - // ================================================================================= - assert(TORSION_ODD_PRIMES[i] > gap); // Ensuring velusqrt is used for l_i > gap - sI = sizeI[i]; // size of I - sJ = sizeJ[i]; // size of J - sK = sizeK[i]; // size of K - - assert(sI >= sJ); // Ensuring #I >= #J - assert(sK >= 0); // Recall, it must be that #K >= 0 - assert(sJ > 1); // ensuring sI >= sJ > 1 - // ================================================================================= - - // We require the curve coefficient A = A'/C ... well, a multiple of these ones - fp2_t Ap; - fp2_add(&Ap, &A.x, &A.x); // 2A' + 4C - fp2_sub(&Ap, &Ap, &A.z); // 2A' - fp2_add(&Ap, &Ap, &Ap); // 4A' - - // -------------------------------------------------------------------------------------------------- - // ~~~~~~~~ - // | | - // Computing E_J(W) = | | [ F0(W, x([j]P)) * alpha^2 + F1(W, x([j]P)) * alpha + F2(W, x([j]P)) ] - // j in J - // In order to avoid costly inverse computations in fp, we are gonna work with projective coordinates - // In particular, for a degree-l isogeny construction, we need alpha = X/Z and alpha = Z/X (i.e., 1/alpha) - - //fp2_t EJ_0[sJ][3]; // EJ_0[j][2] factors of one polynomial to be used in a resultant - - fp2_t XZ_add, XZj_add, - XZ_sub, XZj_sub, - AXZ2, - CXZ2, - CX2Z2, - t1, t2; - - fp2_add(&XZ_add, &P.x, &P.z); // X + Z - fp2_sub(&XZ_sub, &P.x, &P.z); // X - Z - - fp2_mul(&AXZ2, &P.x, &P.z); // X * Z - fp2_sqr(&t1, &P.x); // X ^ 2 - fp2_sqr(&t2, &P.z); // Z ^ 2 - - fp2_add(&CX2Z2, &t1, &t2); // X^2 + Z^2 - fp2_mul(&CX2Z2, &CX2Z2, &A.z); // C * (X^2 + Z^2) - - fp2_add(&AXZ2, &AXZ2, &AXZ2); // 2 * (X * Z) - fp2_mul(&CXZ2, &AXZ2, &A.z); // C * [2 * (X * Z)] - fp2_mul(&AXZ2, &AXZ2, &Ap); // A' * [2 * (X * Z)] - - int j; - for (j = 0; j < sJ; j++) - { - fp2_add(&XZj_add, &J[j].x, &J[j].z); // Xj + Zj - fp2_sub(&XZj_sub, &J[j].x, &J[j].z); // Xj - Zj - - fp2_mul(&t1, &XZ_sub, &XZj_add); // (X - Z) * (Xj + Zj) - fp2_mul(&t2, &XZ_add, &XZj_sub); // (X + Z) * (Xj - Zj) - - // ................................... - // Computing the quadratic coefficient - fp2_sub(&EJ_0[j][2], &t1, &t2); // 2 * [(X*Zj) - (Z*Xj)] - fp2_sqr(&EJ_0[j][2], &EJ_0[j][2]); // ( 2 * [(X*Zj) - (Z*Xj)] )^2 - fp2_mul(&EJ_0[j][2], &A.z, &EJ_0[j][2]); // C * ( 2 * [(X*Zj) - (Z*Xj)] )^2 - - // .................................. - // Computing the constant coefficient - fp2_add(&EJ_0[j][0], &t1, &t2); // 2 * [(X*Xj) - (Z*Zj)] - fp2_sqr(&EJ_0[j][0], &EJ_0[j][0]); // ( 2 * [(X*Xj) - (Z*Zj)] )^2 - fp2_mul(&EJ_0[j][0], &A.z, &EJ_0[j][0]); // C * ( 2 * [(X*Xj) - (Z*Zj)] )^2 - - // ................................ - // Computing the linear coefficient - - // C * [ (-2*Xj*Zj)*(alpha^2 + 1) + (-2*alpha)*(Xj^2 + Zj^2)] + [A' * (-2*Xj*Zj) * (2*X*Z)] where alpha = X/Z - fp2_add(&t1, &J[j].x, &J[j].z); // (Xj + Zj) - fp2_sqr(&t1, &t1); // (Xj + Zj)^2 - fp2_add(&t1, &t1, &t1); // 2 * (Xj + Zj)^2 - fp2_add(&t1, &t1, &XZJ4[j]); // 2 * (Xj + Zj)^2 - (4*Xj*Zj) := 2 * (Xj^2 + Zj^2) - fp2_mul(&t1, &t1, &CXZ2); // [2 * (Xj^2 + Zj^2)] * (2 * [ C * (X * Z)]) - - fp2_mul(&t2, &CX2Z2, &XZJ4[j]); // [C * (X^2 + Z^2)] * (-4 * Xj * Zj) - fp2_sub(&t1, &t2, &t1); // [C * (X^2 + Z^2)] * (-4 * Xj * Zj) - [2 * (Xj^2 + Zj^2)] * (2 * [ C * (X * Z)]) - - fp2_mul(&t2, &AXZ2, &XZJ4[j]); // (2 * [A' * (X * Z)]) * (-4 * Xj * Zj) - fp2_add(&EJ_0[j][1], &t1, &t2); // This is our desired equation but multiplied by 2 - fp2_add(&EJ_0[j][1], &EJ_0[j][1], &EJ_0[j][1]); // This is our desired equation but multiplied by 4 - }; - - // --------------------------------------------------------------------- - // The faster way for multiplying is using a divide-and-conquer approach - - // product tree of EJ_0 (we only require the root) - product_tree_LENFeq3(ptree_EJ, deg_ptree_EJ, 0, EJ_0, sJ); - assert( deg_ptree_EJ[0] == (2*sJ) ); - if (!scaled) - { - // unscaled remainder tree approach - multieval_unscaled(leaves, ptree_EJ[0], 2*sJ + 1, rtree_hI, (const fp2_t*)rtree_A, ptree_hI, deg_ptree_hI, 0, sI); - } - else - { - // scaled remainder tree approach - fp2_t G[sI_max], G_rev[sI_max]; - poly_redc(G, ptree_EJ[0], 2*sJ + 1, ptree_hI[0], sI + 1, R0, A0); - for (j = 0; j < sI; j++) - fp2_copy(&G_rev[j], &G[sI - 1 - j]); - - poly_mul_middle(G_rev, G_rev, sI, R0, sI); - for (j = 0; j < sI; j++) - fp2_copy(&G[j], &G_rev[sI - 1 - j]); - - multieval_scaled(leaves, G, ptree_hI, deg_ptree_hI, 0, sI); - }; - - // Finally, we must multiply the leaves of the outpur of remainders - fp2_t r0; - product(&r0, (const fp2_t*)leaves, sI); - // EJ_1 is just reverting the ordering in the coefficients of EJ_0 - for (j = 0; j < sJ; j++){ - fp2_copy(&t1, &ptree_EJ[0][j]); - fp2_copy(&ptree_EJ[0][j], &ptree_EJ[0][2*sJ - j]); - fp2_copy(&ptree_EJ[0][2*sJ - j], &t1); - } - - if (!scaled) - { - // unscaled remainder tree approach - multieval_unscaled(leaves, ptree_EJ[0], 2*sJ + 1, rtree_hI, (const fp2_t*)rtree_A, ptree_hI, deg_ptree_hI, 0, sI); - } - else - { - // scaled remainder tree approach - fp2_t G[sI_max], G_rev[sI_max]; - poly_redc(G, ptree_EJ[0], 2*sJ + 1, ptree_hI[0], sI + 1, R0, A0); - for (j = 0; j < sI; j++) - fp2_copy(&G_rev[j], &G[sI - 1 - j]); - - poly_mul_middle(G_rev, G_rev, sI, R0, sI); - for (j = 0; j < sI; j++) - fp2_copy(&G[j], &G_rev[sI - 1 - j]); - - multieval_scaled(leaves, G, ptree_hI, deg_ptree_hI, 0, sI); - }; - clear_tree(ptree_EJ, 0, sJ); - // Finally, we must multiply the leaves of the outpur of remainders - fp2_t r1; - product(&r1, (const fp2_t*)leaves, sI); - - // ------------------------------- - // Sometimes the public value sK is equal to zero, - // Thus for avoing runtime error we add one when sK =0 - fp2_t hK_0[sK_max + 1], hK_1[sK_max + 1], hk_0, hk_1; - for (j = 0; j < sK; j++) - { - fp2_add(&XZj_add, &K[j].x, &K[j].z); // Xk + Zk - fp2_sub(&XZj_sub, &K[j].x, &K[j].z); // Xk - Zk - fp2_mul(&t1, &XZ_sub, &XZj_add); // (X - Z) * (Xk + Zk) - fp2_mul(&t2, &XZ_add, &XZj_sub); // (X + Z) * (Xk - Zk) - - // Case alpha = X/Z - fp2_sub(&hK_0[j], &t1, &t2); // 2 * [(X*Zk) - (Z*Xk)] - - // Case 1/alpha = Z/X - fp2_add(&hK_1[j], &t1, &t2); // 2 * [(X*Xk) - (Z*Zk)] - }; - - // hk_0 <- use product to mulitiply all the elements in hK_0 - product(&hk_0, (const fp2_t*)hK_0, sK); - // hk_1 <- use product to mulitiply all the elements in hK_1 - product(&hk_1, (const fp2_t*)hK_1, sK); - - // --------------------------------------------------------------------------------- - // Now, unifying all the computations - fp2_mul(&t1, &hk_1, &r1); // output of algorithm 2 with 1/alpha = Z/X and without the demoninator - fp2_sqr(&t1, &t1); - fp2_mul(&(Q->x), &t1, &P.x); - - fp2_mul(&t2, &hk_0, &r0); // output of algorithm 2 with alpha = X/Z and without the demoninator - fp2_sqr(&t2, &t2); - fp2_mul(&(Q->z), &t2, &P.z); -} diff --git a/src/ec/ref/ecx/xisog.c b/src/ec/ref/ecx/xisog.c deleted file mode 100644 index df07430..0000000 --- a/src/ec/ref/ecx/xisog.c +++ /dev/null @@ -1,295 +0,0 @@ -#include "isog.h" -#include "ec.h" -#include - -// ------------------------------------------------------------------------- -// ------------------------------------------------------------------------- - -// Degree-2 isogeny with kernel generated by P != (0 ,0) -// Outputs the curve coefficient in the form A24=(A+2C:4C) -void xisog_2(ec_point_t* B, ec_point_t const P) -{ - fp2_sqr(&B->x, &P.x); - fp2_sqr(&B->z, &P.z); - fp2_sub(&B->x, &B->z, &B->x); - fp2_add(&K[0].x, &P.x, &P.z); - fp2_sub(&K[0].z, &P.x, &P.z); -} - -// Degree-4 isogeny with kernel generated by P such that [2]P != (0 ,0) -// Outputs the curve coefficient in the form A24=(A+2C:4C) -void xisog_4(ec_point_t* B, ec_point_t const P) -{ - fp2_sqr(&K[0].x, &P.x); - fp2_sqr(&K[0].z, &P.z); - fp2_add(&K[1].x, &K[0].z, &K[0].x); - fp2_sub(&K[1].z, &K[0].z, &K[0].x); - fp2_mul(&B->x, &K[1].x, &K[1].z); - fp2_sqr(&B->z, &K[0].z); - - // Constants for xeval_4 - fp2_add(&K[2].x, &P.x, &P.z); - fp2_sub(&K[1].x, &P.x, &P.z); - fp2_add(&K[0].x, &K[0].z, &K[0].z); - fp2_add(&K[0].x, &K[0].x, &K[0].x); -} - -// Degree-4 isogeny with kernel generated by P such that [2]P = (0 ,0) -void xisog_4_singular(ec_point_t* B24, ec_point_t const P, ec_point_t A24) -{ - fp2_copy(&K[0].z, &A24.z); - if(fp2_is_equal(&P.x, &P.z)){ - // Case for P=(1,_) - fp2_copy(&K[0].x, &A24.x); - fp2_sub(&K[1].x, &A24.x, &A24.z); - fp2_neg(&B24->z, &K[1].x); - } - else{ - // Case for P=(-1,_) - fp2_copy(&K[1].x, &A24.x); - fp2_sub(&K[0].x, &A24.x, &A24.z); - fp2_neg(&B24->z, &K[0].x); - fp2_copy(&B24->z, &K[1].x); - } - fp2_copy(&B24->x, &K[0].z); -} - -// xISOG procedure, which is a hybrid between Montgomery and Twisted Edwards -// This tradition fomulae corresponds with the Twisted Edwards formulae but -// mapping the output into Montgomery form -void xisog_t(ec_point_t* B, uint64_t const i, ec_point_t const A) -{ - int j; - int d = ((int)TORSION_ODD_PRIMES[i] - 1) / 2; // Here, l = 2d + 1 - - fp2_t By, Bz, constant_d_edwards, tmp_a, tmp_d; - - fp2_copy(&By, &K[0].x); - fp2_copy(&Bz, &K[0].z); - - for (j = 1; j < d; j++) - { - fp2_mul(&By, &By, &K[j].x); - fp2_mul(&Bz, &Bz, &K[j].z); - }; - - // Mapping Montgomery curve coefficients into Twisted Edwards form - fp2_sub(&constant_d_edwards, &A.x, &A.z); - fp2_copy(&tmp_a, &A.x); - fp2_copy(&tmp_d, &constant_d_edwards); - - // left-to-right method for computing a^l and d^l - for (j = 1; j < (int)p_plus_minus_bitlength[i]; j++) - { - fp2_sqr(&tmp_a, &tmp_a); - fp2_sqr(&tmp_d, &tmp_d); - if( ( ((int)TORSION_ODD_PRIMES[i] >> ((int)p_plus_minus_bitlength[i] - j - 1)) & 1 ) != 0 ) - { - fp2_mul(&tmp_a, &tmp_a, &A.x); - fp2_mul(&tmp_d, &tmp_d, &constant_d_edwards); - }; - }; - - // raising to 8-th power - for (j = 0; j < 3; j++) - { - fp2_sqr(&By, &By); - fp2_sqr(&Bz, &Bz); - }; - - // Mapping Twisted Edwards curve coefficients into Montgomery form - fp2_mul(&(B->x), &tmp_a, &Bz); - fp2_mul(&(B->z), &tmp_d, &By); - fp2_sub(&(B->z), &(B->x), &(B->z)); -} - -// ------------------------------------------------------------------------- -// ------------------------------------------------------------------------- -// Isogeny construction (xISOG) used in velu SQRT - -void xisog_s(ec_point_t* B, uint64_t const i, ec_point_t const A) -{ - // ================================================================================= - assert(TORSION_ODD_PRIMES[i] > gap); // Ensuring velusqrt is used for l_i > gap - sI = sizeI[i]; // size of I - sJ = sizeJ[i]; // size of J - sK = sizeK[i]; // size of K - - assert(sI >= sJ); // Ensuring #I >= #J - assert(sK >= 0); // Recall, L is a prime and therefore it must be that #K > 0 - assert(sJ > 1); // ensuring sI >= sJ > 1 - // ================================================================================= - - // We require the curve coefficient A = A'/C ... well, a multiple of these ones - fp2_t Ap; - fp2_add(&Ap, &A.x, &A.x); // 2A' + 4C - fp2_sub(&Ap, &Ap, &A.z); // 2A' - fp2_add(&Ap, &Ap, &Ap); // 4A' - - fp2_t ADD_SQUARED[sJ_max], // (Xj + Zj)^2 - SUB_SQUARED[sJ_max]; // (Xj - Zj)^2 - - int j; - // Next loop precompute some variables to be used in the reaminder of xisog - for (j = 0; j < sJ; j++) - { - fp2_sub(&SUB_SQUARED[j], &J[j].x, &J[j].z); // (Xj - Zj) - fp2_sqr(&SUB_SQUARED[j], &SUB_SQUARED[j]); // (Xj - Zj)^2 - fp2_sub(&ADD_SQUARED[j], &SUB_SQUARED[j], &XZJ4[j]); // (Xj + Zj)^2 - }; - - // -------------------------------------------------------------------------------------------------- - // ~~~~~~~~ - // | | - // Computing E_J(W) = | | [ F0(W, x([j]P)) * alpha^2 + F1(W, x([j]P)) * alpha + F2(W, x([j]P)) ] - // j in J - // In order to avoid costly inverse computations in fp, we are gonna work with projective coordinates - // In particular, for a degree-l isogeny construction, we need alpha = 1 and alpha = -1 - - //fp2_t EJ_0[sJ][3], // quadratic factors of one polynomial to be used in a resultant - // EJ_1[sJ][3]; // quadratic factors of one polynomial to be used in a resultant - - // Next loop computes all the quadratic factors of EJ_0 and EJ_1 - fp2_t t1; - for (j = 0; j < sJ; j++) - { - // Each SUB_SQUARED[j] and ADD_SQUARED[j] should be multiplied by C - fp2_mul(&EJ_1[j][0], &ADD_SQUARED[j], &A.z); - fp2_mul(&EJ_0[j][0], &SUB_SQUARED[j], &A.z); - // We require the double of tadd and tsub - fp2_add(&EJ_0[j][1], &EJ_1[j][0], &EJ_1[j][0]); - fp2_add(&EJ_1[j][1], &EJ_0[j][0], &EJ_0[j][0]); - - fp2_mul(&t1, &XZJ4[j], &Ap); // A' *(-4*Xj*Zj) - - // Case alpha = 1 - fp2_sub(&EJ_0[j][1], &t1, &EJ_0[j][1]); - fp2_copy(&EJ_0[j][2], &EJ_0[j][0]); // E_[0,j} is a palindrome - - // Case alpha = -1 - fp2_sub(&EJ_1[j][1], &EJ_1[j][1], &t1); - fp2_copy(&EJ_1[j][2], &EJ_1[j][0]); // E_{1,j} is a palindrome - }; - - // --------------------------------------------------------------------- - // The faster way for multiplying is using a divide-and-conquer approach - - // selfreciprocal product tree of EJ_0 (we only require the root) - product_tree_selfreciprocal_LENFeq3(ptree_EJ, deg_ptree_EJ, 0, EJ_0, sJ); - assert( deg_ptree_EJ[0] == (2*sJ) ); - if (!scaled) - { - // (unscaled) remainder tree approach - multieval_unscaled(leaves, ptree_EJ[0], 2*sJ + 1, rtree_hI, (const fp2_t*)rtree_A, ptree_hI, deg_ptree_hI, 0, sI); - } - else - { - // scaled remainder tree approach - fp2_t G[sI_max], G_rev[sI_max]; - poly_redc(G, ptree_EJ[0], 2*sJ + 1, ptree_hI[0], sI + 1, R0, A0); - for (j = 0; j < sI; j++) - fp2_copy(&G_rev[j], &G[sI - 1 - j]); - - poly_mul_middle(G_rev, G_rev, sI, R0, sI); - for (j = 0; j < sI; j++) - fp2_copy(&G[j], &G_rev[sI - 1 - j]); - - multieval_scaled(leaves, G, ptree_hI, deg_ptree_hI, 0, sI); - }; - clear_tree(ptree_EJ, 0, sJ); - // Finally, we must multiply the leaves of the outpur of remainders - fp2_t r0; - product(&r0, (const fp2_t*)leaves, sI); - - // selfreciprocal product tree of EJ_1 (we only require the root) - product_tree_selfreciprocal_LENFeq3(ptree_EJ, deg_ptree_EJ, 0, EJ_1, sJ); - assert( deg_ptree_EJ[0] == (2*sJ) ); - if (!scaled) - { - // (unscaled) remainder tree approach - multieval_unscaled(leaves, ptree_EJ[0], 2*sJ + 1, rtree_hI, (const fp2_t*)rtree_A, ptree_hI, deg_ptree_hI, 0, sI); - } - else - { - // scaled remainder tree approach - fp2_t G[sI_max], G_rev[sI_max]; - poly_redc(G, ptree_EJ[0], 2*sJ + 1, ptree_hI[0], sI + 1, R0, A0); - for (j = 0; j < sI; j++) - fp2_copy(&G_rev[j], &G[sI - 1 - j]); - - poly_mul_middle(G_rev, G_rev, sI, R0, sI); - for (j = 0; j < sI; j++) - fp2_copy(&G[j], &G_rev[sI - 1 - j]); - - multieval_scaled(leaves, G, ptree_hI, deg_ptree_hI, 0, sI); - }; - clear_tree(ptree_EJ, 0, sJ); - // Finally, we must multiply the leaves of the outpur of remainders - fp2_t r1; - product(&r1, (const fp2_t*)leaves, sI); - - // ------------------------------- - // Sometimes the public value sK is equal to zero, - // Thus for avoing runtime error we add one when sK =0 - fp2_t hK_0[sK_max + 1], hK_1[sK_max + 1], hk_0, hk_1; - for (j = 0; j < sK; j++) - { - fp2_sub(&hK_0[j], &K[j].z, &K[j].x); - fp2_add(&hK_1[j], &K[j].z, &K[j].x); - }; - - // hk_0 <- use product to mulitiply all the elements in hK_0 - product(&hk_0, (const fp2_t*)hK_0, sK); - // hk_1 <- use product to mulitiply all the elements in hK_1 - product(&hk_1, (const fp2_t*)hK_1, sK); - - // -------------------------------------------------------------- - // Now, we have all the ingredients for computing the image curve - fp2_t A24, A24m, - t24, t24m; // <---- JORGE creo que podemos omitir estas variables, se usan cuando ya no se requiren los valores de la entrada A (podemos cambiar estos t's por B[0] y B[1] - - fp2_copy(&A24, &A.x); // A' + 2C - fp2_sub(&A24m, &A.x, &A.z); // A' - 2C - fp2_copy(&Ap, &A24m); - - // left-to-right method for computing (A' + 2C)^l and (A' - 2C)^l - for (j = 1; j < (int)p_plus_minus_bitlength[i]; j++) - { - fp2_sqr(&A24, &A24); - fp2_sqr(&A24m, &A24m); - if( ( ((int)TORSION_ODD_PRIMES[i] >> ((int)p_plus_minus_bitlength[i] - j - 1)) & 1 ) != 0 ) - { - fp2_mul(&A24, &A24, &A.x); - fp2_mul(&A24m, &A24m, &Ap); - }; - }; - - fp2_mul(&t24m, &hk_1, &r1); // output of algorithm 2 with alpha =-1 and without the demoninator - fp2_sqr(&t24m, &t24m); // raised at 2 - fp2_sqr(&t24m, &t24m); // raised at 4 - fp2_sqr(&t24m, &t24m); // raised at 8 - - fp2_mul(&t24, &hk_0, &r0); // output of algorithm 2 with alpha = 1 and without the demoninator - fp2_sqr(&t24, &t24); // raised at 2 - fp2_sqr(&t24, &t24); // raised at 4 - fp2_sqr(&t24, &t24); // raised at 8 - - fp2_mul(&A24, &A24, &t24m); - fp2_mul(&A24m, &A24m, &t24); - - // Now, we have d = (A24m / A24) where the image Montgomery cuve coefficient is - // B' 2*(1 + d) 2*(A24 + A24m) - // B = ---- = --------- = -------------- - // C (1 - d) (A24 - A24m) - // However, we required B' + 2C = 4*A24 and 4C = 4 * (A24 - A24m) - - fp2_sub(&t24m, &A24, &A24m); // (A24 - A24m) - fp2_add(&t24m, &t24m, &t24m); // 2*(A24 - A24m) - fp2_add(&t24m, &t24m, &t24m); // 4*(A24 - A24m) - - fp2_add(&t24, &A24, &A24); // 2 * A24 - fp2_add(&t24, &t24, &t24); // 4 * A24 - - fp2_copy(&(B->x), &t24); - fp2_copy(&(B->z), &t24m); -} diff --git a/src/ec/ref/include/biextension.h b/src/ec/ref/include/biextension.h new file mode 100644 index 0000000..1a50fcc --- /dev/null +++ b/src/ec/ref/include/biextension.h @@ -0,0 +1,82 @@ +#ifndef _BIEXT_H_ +#define _BIEXT_H_ + +#include +#include + +typedef struct pairing_params +{ + uint32_t e; // Points have order 2^e + ec_point_t P; // x(P) + ec_point_t Q; // x(Q) + ec_point_t PQ; // x(P-Q) = (PQX/PQZ : 1) + fp2_t ixP; // PZ/PX + fp2_t ixQ; // QZ/QX + ec_point_t A24; // ((A+2)/4 : 1) +} pairing_params_t; + +// For two bases and store: +// x(P - R), x(P - S), x(R - Q), x(S - Q) +typedef struct pairing_dlog_diff_points +{ + ec_point_t PmR; // x(P - R) + ec_point_t PmS; // x(P - S) + ec_point_t RmQ; // x(R - Q) + ec_point_t SmQ; // x(S - Q) +} pairing_dlog_diff_points_t; + +typedef struct pairing_dlog_params +{ + uint32_t e; // Points have order 2^e + ec_basis_t PQ; // x(P), x(Q), x(P-Q) + ec_basis_t RS; // x(R), x(S), x(R-S) + pairing_dlog_diff_points_t diff; // x(P - R), x(P - S), x(R - Q), x(S - Q) + fp2_t ixP; // PZ/PX + fp2_t ixQ; // QZ/QX + fp2_t ixR; // RZ/RX + fp2_t ixS; // SZ/SX + ec_point_t A24; // ((A+2)/4 : 1) +} pairing_dlog_params_t; + +// Computes e = e_{2^e}(P, Q) using biextension ladder +void weil(fp2_t *r, uint32_t e, const ec_point_t *P, const ec_point_t *Q, const ec_point_t *PQ, ec_curve_t *E); + +// Computes (reduced) z = t_{2^e}(P, Q) using biextension ladder +void reduced_tate(fp2_t *r, uint32_t e, const ec_point_t *P, const ec_point_t *Q, const ec_point_t *PQ, ec_curve_t *E); + +// Given two bases and computes scalars +// such that R = [r1]P + [r2]Q, S = [s1]P + [s2]Q +void ec_dlog_2_weil(digit_t *r1, + digit_t *r2, + digit_t *s1, + digit_t *s2, + ec_basis_t *PQ, + const ec_basis_t *RS, + ec_curve_t *curve, + int e); + +// Given two bases and +// where is a basis for E[2^f] +// the full 2-torsion, and a basis +// for smaller torsion E[2^e] +// computes scalars r1, r2, s1, s2 +// such that R = [r1]P + [r2]Q, S = [s1]P + [s2]Q +void ec_dlog_2_tate(digit_t *r1, + digit_t *r2, + digit_t *s1, + digit_t *s2, + const ec_basis_t *PQ, + const ec_basis_t *RS, + ec_curve_t *curve, + int e); + +void ec_dlog_2_tate_to_full(digit_t *r1, + digit_t *r2, + digit_t *s1, + digit_t *s2, + ec_basis_t *PQ, + ec_basis_t *RS, + ec_curve_t *curve, + int e); + +#endif diff --git a/src/ec/ref/include/curve_extras.h b/src/ec/ref/include/curve_extras.h deleted file mode 100644 index 3bc44d5..0000000 --- a/src/ec/ref/include/curve_extras.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef CURVE_EXTRAS_H -#define CURVE_EXTRAS_H - -#include "ec.h" -#include "torsion_constants.h" - -typedef struct jac_point_t { - fp2_t x; - fp2_t y; - fp2_t z; -} jac_point_t; - -bool ec_is_zero(ec_point_t const* P); -void copy_point(ec_point_t* P, ec_point_t const* Q); -void swap_points(ec_point_t* P, ec_point_t* Q, const digit_t option); -void ec_init(ec_point_t* P); -void xDBLv2(ec_point_t* Q, ec_point_t const* P, ec_point_t const* A24); -void xDBLADD(ec_point_t* R, ec_point_t* S, ec_point_t const* P, ec_point_t const* Q, ec_point_t const* PQ, ec_point_t const* A24); -void xDBLMUL(ec_point_t* S, ec_point_t const* P, digit_t const* k, ec_point_t const* Q, digit_t const* l, ec_point_t const* PQ, ec_curve_t const* curve); -void xDBL(ec_point_t* Q, ec_point_t const* P, ec_point_t const* AC); -void xMUL(ec_point_t* Q, ec_point_t const* P, digit_t const* k, ec_curve_t const* curve); -void xDBLMUL(ec_point_t* S, ec_point_t const* P, digit_t const* k, ec_point_t const* Q, digit_t const* l, ec_point_t const* PQ, ec_curve_t const* curve); - -#define is_point_equal ec_is_equal -#define xADD ec_add - -#endif - diff --git a/src/ec/ref/include/ec.h b/src/ec/ref/include/ec.h index bc47fd3..ee2be38 100644 --- a/src/ec/ref/include/ec.h +++ b/src/ec/ref/include/ec.h @@ -1,776 +1,668 @@ -/** @file - * - * @authors Luca De Feo, Francisco RH - * - * @brief Elliptic curve stuff -*/ - -#ifndef EC_H -#define EC_H - -#include -#include - - -/** @defgroup ec Elliptic curves - * @{ -*/ - -/** @defgroup ec_t Data structures - * @{ -*/ - -/** @brief Projective point - * - * @typedef ec_point_t - * - * @struct ec_point_t - * - * A projective point in (X:Z) or (X:Y:Z) coordinates (tbd). -*/ -typedef struct ec_point_t { - fp2_t x; - fp2_t z; -} ec_point_t; - -/** @brief A basis of a torsion subgroup - * - * @typedef ec_basis_t - * - * @struct ec_basis_t - * - * A pair of points (or a triplet, tbd) forming a basis of a torsion subgroup. -*/ -typedef struct ec_basis_t { - ec_point_t P; - ec_point_t Q; - ec_point_t PmQ; -} ec_basis_t; - -/** @brief An elliptic curve - * - * @typedef ec_curve_t - * - * @struct ec_curve_t - * - * An elliptic curve in projective Montgomery form -*/ -typedef struct ec_curve_t { - fp2_t A; - fp2_t C; ///< cannot be 0 -} ec_curve_t; - -/** @brief An isogeny of degree a power of 2 - * - * @typedef ec_isog_even_t - * - * @struct ec_isog_even_t -*/ -typedef struct ec_isog_even_t { - ec_curve_t curve; ///< The domain curve - ec_point_t kernel; ///< A kernel generator - unsigned short length; ///< The length as a 2-isogeny walk -} ec_isog_even_t; - - -/** @brief An odd divisor of p² - 1 - * - * @typedef ec_isog_odd_t - * - * Given that the list of divisors of p² - 1 is known, this is - * represented as a fixed-length vector of integer exponents. -*/ - -typedef uint8_t ec_degree_odd_t[P_LEN + M_LEN]; - -/** @brief An isogeny of odd degree dividing p² - 1 - * - * @typedef ec_isog_odd_t - * - * @struct ec_isog_odd_t -*/ -typedef struct ec_isog_odd_t { - ec_curve_t curve; - ec_point_t ker_plus; ///< A generator of E[p+1] ∩ ker(φ) - ec_point_t ker_minus; ///< A generator of E[p-1] ∩ ker(φ) - ec_degree_odd_t degree; ///< The degree of the isogeny -} ec_isog_odd_t; - -/** @brief Isomorphism of Montgomery curves - * - * @typedef ec_isom_t - * - * @struct ec_isom_t - * - * The isomorphism is given by the map maps (X:Z) ↦ ( (Nx X - Nz Z) : (D Z) ) -*/ -typedef struct ec_isom_t { - fp2_t Nx; - fp2_t Nz; - fp2_t D; -} ec_isom_t; - -// end ec_t -/** @} -*/ - - -/** @defgroup ec_curve_t Curves and isomorphisms - * @{ -*/ - -/** - * @brief j-invariant. - * - * @param j_inv computed j_invariant - * @param curve input curve - */ -void ec_j_inv(fp2_t* j_inv, const ec_curve_t* curve); - -/** - * @brief Isomorphism of elliptic curve - * - * @param isom computed isomorphism - * @param from domain curve - * @param to image curve - */ -void ec_isomorphism(ec_isom_t* isom, const ec_curve_t* from, const ec_curve_t* to); - -/** - * @brief In-place inversion of an isomorphism - * - * @param isom an isomorphism - */ -void ec_iso_inv(ec_isom_t* isom); - -/** - * @brief In-place evaluation of an isomorphism - * - * @param P a point - * @param isom an isomorphism - */ -void ec_iso_eval(ec_point_t* P, ec_isom_t* isom); - -/** - * @brief Given a Montgomery curve, computes a standard model for it and the isomorphism to it. - * - * @param new computed new curve - * @param isom computed isomorphism from `old` to `new` - * @param old A Montgomery curve - */ -void ec_curve_normalize(ec_curve_t *new, ec_isom_t *isom, const ec_curve_t *old); - -/** @} -*/ -/** @defgroup ec_point_t Point operations - * @{ -*/ - -/** - * @brief Point equality - * - * @param P a point - * @param Q a point - * @return 1 if equal - */ -bool ec_is_equal(const ec_point_t* P, const ec_point_t* Q); - -/** - * @brief Reduce Z-coordinate of point in place - * - * @param P a point - */ -void ec_normalize(ec_point_t* P); - -/** - * @brief Test whether a point is on a curve - * - * @param curve a curve - * @param P a point - * @return 1 if P is on the curve - */ -int ec_is_on_curve(const ec_curve_t* curve, const ec_point_t* P); - -/** - * @brief Point negation - * - * @param res computed opposite of P - * @param P a point - */ -void ec_neg(ec_point_t* res, const ec_point_t* P); - -/** - * @brief Point addition - * - * @param res computed sum of P and Q - * @param P a point - * @param Q a point - * @param PQ the difference P-Q - */ -void ec_add(ec_point_t* res, const ec_point_t* P, const ec_point_t* Q, const ec_point_t* PQ); - -/** - * @brief Point doubling - * - * @param res computed double of P - * @param P a point - */ -void ec_dbl(ec_point_t* res, const ec_curve_t* curve, const ec_point_t* P); - -/** - * @brief Point multiplication - * - * @param res computed scalar * P - * @param curve the curve - * @param scalar an unsigned multi-precision integer - * @param P a point - */ -void ec_mul(ec_point_t* res, const ec_curve_t* curve, const digit_t* scalar, const ec_point_t* P); - -/** - * @brief Point multiplication by a scalar of limited length - * - * @param res computed scalar * P - * @param curve the curve - * @param scalar an unsigned multi-precision integer - * @param kbits the bit size of scalar - * @param P a point - */ -void xMULv2(ec_point_t* Q, ec_point_t const* P, digit_t const* k, const int kbits, ec_point_t const* A24); - -/** - * @brief Combination P+m*Q - * - * @param R computed P + m * Q - * @param curve the curve - * @param m an unsigned multi-precision integer - * @param P a point - * @param Q a point - * @param PQ the difference P-Q - */ -void ec_ladder3pt(ec_point_t *R, fp_t const m, ec_point_t const *P, ec_point_t const *Q, ec_point_t const *PQ, ec_curve_t const *A); - -/** - * @brief Linear combination of points of a basis - * - * @param res computed scalarP * P + scalarQ * Q - * @param curve the curve - * @param scalarP an unsigned multi-precision integer - * @param scalarQ an unsigned multi-precision integer - * @param PQ a torsion basis consisting of points P and Q - */ -void ec_biscalar_mul(ec_point_t* res, const ec_curve_t* curve, - const digit_t* scalarP, const digit_t* scalarQ, - const ec_basis_t* PQ); - -/** @} -*/ - -/** @defgroup ec_dlog_t Discrete logs and bases - * @{ -*/ - -/** - * @brief Generate a Montgomery curve and a 2^f-torsion basis - * - * The algorithm is deterministc - * - * @param PQ2 computed basis of the 2^f-torsion - * @param curve the computed curve - */ -void ec_curve_to_basis_2(ec_basis_t *PQ2, const ec_curve_t *curve); - -/** - * @brief Complete a basis of the 2^f-torsion - * - * The algorithm is deterministic - * - * @param PQ2 a basis of the 2^f-torsion containing P as first generator - * @param curve the curve - * @param P a point of order 2^f - */ -void ec_complete_basis_2(ec_basis_t* PQ2, const ec_curve_t* curve, const ec_point_t* P); - -/** - * @brief Generate a 3^e-torsion basis - * - * The algorithm is deterministic - * - * @param PQ3 the computed 3^e-torsion basis - * @param curve a curve - */ -void ec_curve_to_basis_3(ec_basis_t* PQ3, const ec_curve_t* curve); - -/** - * @brief Generate a 6^e-torsion basis - * - * The algorithm is deterministic - * - * @param PQ6 the computed 2^f*3^g-torsion basis - * @param curve a curve - */ -void ec_curve_to_basis_6(ec_basis_t* PQ6, const ec_curve_t* curve); - - -/** - * @brief Compute the generalized dlog of R wrt the 2^f-basis PQ2 - * - * Ensure that R = scalarP * P + scalarQ * Q - * - * @param scalarP the computed dlog - * @param scalarQ the computed dlog - * @param PQ2 a 2^f-torsion basis - * @param R a point of order dividing 2^f - */ -void ec_dlog_2(digit_t* scalarP, digit_t* scalarQ, - const ec_basis_t* PQ2, const ec_point_t* R, const ec_curve_t* curve); - -/** - * @brief Compute the generalized dlog of R wrt the 3^e-basis PQ3 - * - * Ensure that R = scalarP * P + scalarQ * Q - * - * @param scalarP the computed dlog - * @param scalarQ the computed dlog - * @param PQ3 a 3^e-torsion basis - * @param R a point of order dividing 3^e - */ -void ec_dlog_3(digit_t* scalarP, digit_t* scalarQ, - const ec_basis_t* PQ3, const ec_point_t* R, const ec_curve_t* curve); -/** @} -*/ - -/** @defgroup ec_isog_t Isogenies - * @{ -*/ - -/** - * @brief Evaluate isogeny of even degree on list of points - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of points to evaluate the isogeny on, modified in place - * @param length of the list points - */ -void ec_eval_even(ec_curve_t* image, const ec_isog_even_t* phi, - ec_point_t* points, unsigned short length); - -/** - * @brief Evaluate isogeny of even degree on list of points, assuming the point (0,0) is not in the kernel - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of points to evaluate the isogeny on, modified in place - * @param length of the list points - */ -void ec_eval_even_nonzero(ec_curve_t* image, const ec_isog_even_t* phi, - ec_point_t* points, unsigned short length); - -/** - * @brief Evaluate isogeny of even degree on list of torsion bases - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of bases to evaluate the isogeny on, modified in place - * @param length of the list bases - */ -static inline void ec_eval_even_basis(ec_curve_t* image, const ec_isog_even_t* phi, - ec_basis_t* points, unsigned short length) { - ec_eval_even(image, phi, (ec_point_t*)points, sizeof(ec_basis_t) / sizeof(ec_point_t) * length); -} - -/** - * @brief Evaluate isogeny of odd degree on list of points - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of points to evaluate the isogeny on, modified in place - * @param length of the list points - */ -void ec_eval_odd(ec_curve_t* image, const ec_isog_odd_t* phi, - ec_point_t* points, unsigned short length); - -/** - * @brief Evaluate isogeny of odd degree on list of torsion bases - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of bases to evaluate the isogeny on, modified in place - * @param length of the list bases - */ -static inline void ec_eval_odd_basis(ec_curve_t* image, const ec_isog_odd_t* phi, - ec_basis_t* points, unsigned short length) { - ec_eval_odd(image, phi, (ec_point_t*)points, sizeof(ec_basis_t) / sizeof(ec_point_t) * length); -} - -/** @} -*/ - -// end ec -/** @} -*/ - - - -#endif - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////// ORIGINAL VERSION - -#if 0 - -/** @file - * - * @authors Luca De Feo, Francisco RH - * - * @brief Elliptic curve stuff -*/ - -#ifndef EC_H -#define EC_H - -#include - -/** @defgroup ec Elliptic curves - * @{ -*/ - -/** @defgroup ec_t Data structures - * @{ -*/ - -/** @brief Projective point - * - * @typedef ec_point_t - * - * @struct ec_point_t - * - * A projective point in (X:Z) or (X:Y:Z) coordinates (tbd). -*/ -typedef struct ec_point_t { - fp2_t X; - //fp2_t Y; - fp2_t Z; -} ec_point_t; - -/** @brief A basis of a torsion subgroup - * - * @typedef ec_basis_t - * - * @struct ec_basis_t - * - * A pair of points (or a triplet, tbd) forming a basis of a torsion subgroup. -*/ -typedef struct ec_basis_t { - ec_point_t P; - ec_point_t Q; - ec_point_t PmQ; // or maybe not -} ec_basis_t; - -/** @brief An elliptic curve - * - * @typedef ec_curve_t - * - * @struct ec_curve_t - * - * An elliptic curve in projective Montgomery form -*/ -typedef struct ec_curve_t { - fp2_t A; - fp2_t C; ///< cannot be 0 -} ec_curve_t; - -/** @brief An isogeny of degree a power of 2 - * - * @typedef ec_isog_even_t - * - * @struct ec_isog_even_t -*/ -typedef struct ec_isog_even_t { - ec_curve_t curve; ///< The domain curve - ec_point_t kernel; ///< A kernel generator - unsigned short length; ///< The length as a 2-isogeny walk -} ec_isog_even_t; - - -/** @brief An odd divisor of p² - 1 - * - * @typedef ec_isog_odd_t - * - * @struct ec_isog_odd_t - * - * Given that the list of divisors of p² - 1 is known, this could be - * represented as a fixed-length vector of integer exponents, possibly - * distinguishing the divisors of p + 1 from those of p - 1. -*/ -typedef struct ec_degree_odd_t { - // todo (basically a ushort vector) -} ec_degree_odd_t; - -/** @brief An isogeny of odd degree dividing p² - 1 - * - * @typedef ec_isog_odd_t - * - * @struct ec_isog_odd_t -*/ -typedef struct ec_isog_odd_t { - ec_point_t ker_plus; ///< A generator of E[p+1] ∩ ker(φ) - ec_point_t ker_minus; ///< A generator of E[p-1] ∩ ker(φ) - ec_degree_odd_t degree; ///< The degree of the isogeny -} ec_isog_odd_t; - -/** @brief Isomorphism of Montgomery curves - * - * @typedef ec_isom_t - * - * @struct ec_isom_t - * - * The isomorphism is given by the map maps (X:Z) ↦ ( (Nx X - Nz Z) : (D Z) ) - * TODO: fix if (X:Y:Z) coordinates. -*/ -typedef struct ec_isom_t { - fp2_t Nx; - fp2_t Nz; - fp2_t D; -} ec_isom_t; - -// end ec_t -/** @} -*/ - - -/** @defgroup ec_curve_t Curves and isomorphisms - * @{ -*/ - -/** - * @brief j-invariant. - * - * @param j_inv computed j_invariant - * @param curve input curve - */ -void ec_j_inv(fp2_t* j_inv, const ec_curve_t* curve); - -/** - * @brief Isomorphism of elliptic curve - * - * @param isom computed isomorphism - * @param from domain curve - * @param to image curve - */ -void ec_isomorphism(ec_isom_t* isom, const ec_curve_t* from, const ec_curve_t* to); - -/** @} -*/ -/** @defgroup ec_point_t Point operations - * @{ -*/ - -/** - * @brief Point equality - * - * @param P a point - * @param Q a point - * @return 1 if equal - */ -int ec_is_equal(const ec_point_t* P, const ec_point_t* Q); - -/** - * @brief Reduce Z-coordinate of point in place - * - * @param P a point - */ -void ec_normalize(ec_point_t* P); - -/** - * @brief Test whether a point is on a curve - * - * @param curve a curve - * @param P a point - * @return 1 if P is on the curve - */ -int ec_is_on_curve(const ec_curve_t* curve, const ec_point_t* P); - -/** - * @brief Point negation - * - * @param res computed opposite of P - * @param P a point - */ -void ec_neg(ec_point_t* res, const ec_point_t* P); - -/** - * @brief Point addition - * - * Needs to be adjusted if (X:Z) arithmetic. - * - * @param res computed sum of P and Q - * @param P a point - * @param Q a point - */ -void ec_add(ec_point_t* res, const ec_point_t* P, const ec_point_t* Q); - -/** - * @brief Point doubling - * - * @param res computed double of P - * @param P a point - */ -void ec_dbl(ec_point_t* res, const ec_curve_t* curve, const ec_point_t* P); - -/** - * @brief Point multiplication - * - * @param res computed scalar * P - * @param curve the curve - * @param scalar an unsigned multi-precision integer - * @param P a point - */ -void ec_mul(ec_point_t* res, const ec_curve_t* curve, const digit_t* scalar, const ec_point_t* P); - -/** - * @brief Linear combination of points of a basis - * - * @param res computed scalarP * P + scalarQ * Q - * @param curve the curve - * @param scalarP an unsigned multi-precision integer - * @param scalarQ an unsigned multi-precision integer - * @param PQ a torsion basis consisting of points P and Q - */ -void ec_biscalar_mul(ec_point_t* res, const ec_curve_t* curve, - const digit_t* scalarP, const digit_t* scalarQ, - const ec_basis_t* PQ); - -/** @} -*/ - -/** @defgroup ec_dlog_t Discrete logs and bases - * @{ -*/ - -/** - * @brief Generate a Montgomery curve and a 2^f-torsion basis - * - * The algorithm is deterministc - * - * @param curve the computed curve - * @param PQ2 a basis of the 2^f-torsion - * @param j_inv a j-invariant - */ -void ec_j_to_basis_2(ec_curve_t* curve, ec_basis_t* PQ2, const fp2_t* j_inv); - -/** - * @brief Complete a basis of the 2^f-torsion - * - * The algorithm is deterministc - * - * @param PQ2 a basis of the 2^f-torsion containing P as first generator - * @param curve the curve - * @param P a point of order 2^f - */ -void ec_complete_basis_2(ec_basis_t* PQ2, const ec_curve_t* curve, const ec_point_t* P); - -/** - * @brief Generate a 3^e-torsion basis - * - * The algorithm is deterministc - * - * @param PQ3 the computed 3^e-torsion basis - * @param curve a curve - */ -void ec_curve_to_basis_3(ec_basis_t* PQ3, const ec_curve_t* curve); - -/** - * @brief Compute the generalized dlog of R wrt the 2^f-basis PQ2 - * - * Ensure that R = scalarP * P + scalarQ * Q - * - * @param scalarP the computed dlog - * @param scalarQ the computed dlog - * @param PQ2 a 2^f-torsion basis - * @param R a point of order dividing 2^f - */ -void ec_dlog_2(digit_t* scalarP, digit_t* scalarQ, - const ec_basis_t* PQ2, const ec_point_t* R); - -/** - * @brief Compute the generalized dlog of R wrt the 3^e-basis PQ3 - * - * Ensure that R = scalarP * P + scalarQ * Q - * - * @param scalarP the computed dlog - * @param scalarQ the computed dlog - * @param PQ3 a 3^e-torsion basis - * @param R a point of order dividing 3^e - */ -void ec_dlog_3(digit_t* scalarP, digit_t* scalarQ, - const ec_basis_t* PQ3, const ec_point_t* R); -/** @} -*/ - -/** @defgroup ec_isog_t Isogenies - * @{ -*/ - -/** - * @brief Evaluate isogeny of even degree on list of points - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of points to evaluate the isogeny on, modified in place - * @param length of the list points - */ -void ec_eval_even(ec_curve_t* image, const ec_isog_even_t* phi, - ec_point_t* points, unsigned short length); - -/** - * @brief Evaluate isogeny of even degree on list of torsion bases - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of bases to evaluate the isogeny on, modified in place - * @param length of the list bases - */ -static inline void ec_eval_even_basis(ec_curve_t* image, const ec_isog_even_t* phi, - ec_basis_t* points, unsigned short length) { - ec_eval_even(image, phi, points, sizeof(ec_basis_t) / sizeof(ec_point_t) * length); -} - -/** - * @brief Evaluate isogeny of odd degree on list of points - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of points to evaluate the isogeny on, modified in place - * @param length of the list points - */ -void ec_eval_odd(ec_curve_t* image, const ec_isog_odd_t* phi, - ec_point_t* points, unsigned short length); - -/** - * @brief Evaluate isogeny of odd degree on list of torsion bases - * - * @param image computed image curve - * @param phi isogeny - * @param points a list of bases to evaluate the isogeny on, modified in place - * @param length of the list bases - */ -static inline void ec_eval_odd_basis(ec_curve_t* image, const ec_isog_odd_t* phi, - ec_basis_t* points, unsigned short length) { - ec_eval_odd(image, phi, points, sizeof(ec_basis_t) / sizeof(ec_point_t) * length); -} - -/** @} -*/ - -// end ec -/** @} -*/ - -#endif - - -#endif +/** @file + * + * @authors Luca De Feo, Francisco RH + * + * @brief Elliptic curve stuff + */ + +#ifndef EC_H +#define EC_H +#include +#include +#include +#include +#include + +/** @defgroup ec Elliptic curves + * @{ + */ + +/** @defgroup ec_t Data structures + * @{ + */ + +/** @brief Projective point on the Kummer line E/pm 1 in Montgomery coordinates + * + * @typedef ec_point_t + * + * @struct ec_point_t + * + * A projective point in (X:Z) or (X:Y:Z) coordinates (tbd). + */ +typedef struct ec_point_t +{ + fp2_t x; + fp2_t z; +} ec_point_t; + +/** @brief Projective point in Montgomery coordinates + * + * @typedef jac_point_t + * + * @struct jac_point_t + * + * A projective point in (X:Y:Z) coordinates + */ +typedef struct jac_point_t +{ + fp2_t x; + fp2_t y; + fp2_t z; +} jac_point_t; + +/** @brief Addition components + * + * @typedef add_components_t + * + * @struct add_components_t + * + * 3 components u,v,w that define the (X:Z) coordinates of both + * addition and substraction of two distinct points with + * P+Q =(u-v:w) and P-Q = (u+v=w) + */ +typedef struct add_components_t +{ + fp2_t u; + fp2_t v; + fp2_t w; +} add_components_t; + +/** @brief A basis of a torsion subgroup + * + * @typedef ec_basis_t + * + * @struct ec_basis_t + * + * A pair of points (or a triplet, tbd) forming a basis of a torsion subgroup. + */ +typedef struct ec_basis_t +{ + ec_point_t P; + ec_point_t Q; + ec_point_t PmQ; +} ec_basis_t; + +/** @brief An elliptic curve + * + * @typedef ec_curve_t + * + * @struct ec_curve_t + * + * An elliptic curve in projective Montgomery form + */ +typedef struct ec_curve_t +{ + fp2_t A; + fp2_t C; ///< cannot be 0 + ec_point_t A24; // the point (A+2 : 4C) + bool is_A24_computed_and_normalized; // says if A24 has been computed and normalized +} ec_curve_t; + +/** @brief An isogeny of degree a power of 2 + * + * @typedef ec_isog_even_t + * + * @struct ec_isog_even_t + */ +typedef struct ec_isog_even_t +{ + ec_curve_t curve; ///< The domain curve + ec_point_t kernel; ///< A kernel generator + unsigned length; ///< The length as a 2-isogeny walk +} ec_isog_even_t; + +/** @brief Isomorphism of Montgomery curves + * + * @typedef ec_isom_t + * + * @struct ec_isom_t + * + * The isomorphism is given by the map maps (X:Z) ↦ ( (Nx X + Nz Z) : (D Z) ) + */ +typedef struct ec_isom_t +{ + fp2_t Nx; + fp2_t Nz; + fp2_t D; +} ec_isom_t; + +// end ec_t +/** @} + */ + +/** @defgroup ec_curve_t Curves and isomorphisms + * @{ + */ + +// Initalisation for curves and points +void ec_curve_init(ec_curve_t *E); +void ec_point_init(ec_point_t *P); + +/** + * @brief Verify that a Montgomery coefficient is valid + * + * @param A an fp2_t + * + * @return 0 if curve is invalid, 1 otherwise + */ +int ec_curve_verify_A(const fp2_t *A); + +/** + * @brief Initialize an elliptic curve from a coefficient + * + * @param A an fp2_t + * @param E the elliptic curve to initialize + * + * @return 0 if curve is invalid, 1 otherwise + */ +int ec_curve_init_from_A(ec_curve_t *E, const fp2_t *A); + +// Copying points, bases and curves +static inline void +copy_point(ec_point_t *P, const ec_point_t *Q) +{ + fp2_copy(&P->x, &Q->x); + fp2_copy(&P->z, &Q->z); +} + +static inline void +copy_basis(ec_basis_t *B1, const ec_basis_t *B0) +{ + copy_point(&B1->P, &B0->P); + copy_point(&B1->Q, &B0->Q); + copy_point(&B1->PmQ, &B0->PmQ); +} + +static inline void +copy_curve(ec_curve_t *E1, const ec_curve_t *E2) +{ + fp2_copy(&(E1->A), &(E2->A)); + fp2_copy(&(E1->C), &(E2->C)); + E1->is_A24_computed_and_normalized = E2->is_A24_computed_and_normalized; + copy_point(&E1->A24, &E2->A24); +} + +// Functions for working with the A24 point and normalisation + +/** + * @brief Reduce (A : C) to (A/C : 1) in place + * + * @param E a curve + */ +void ec_normalize_curve(ec_curve_t *E); + +/** + * @brief Reduce (A + 2 : 4C) to ((A+2)/4C : 1) in place + * + * @param E a curve + */ +void ec_curve_normalize_A24(ec_curve_t *E); + +/** + * @brief Normalise both (A : C) and (A + 2 : 4C) as above, in place + * + * @param E a curve + */ +void ec_normalize_curve_and_A24(ec_curve_t *E); + +/** + * @brief Given a curve E, compute (A+2 : 4C) + * + * @param A24 the value (A+2 : 4C) to return into + * @param E a curve + */ +static inline void +AC_to_A24(ec_point_t *A24, const ec_curve_t *E) +{ + // Maybe we already have this computed + if (E->is_A24_computed_and_normalized) { + copy_point(A24, &E->A24); + return; + } + + // A24 = (A+2C : 4C) + fp2_add(&A24->z, &E->C, &E->C); + fp2_add(&A24->x, &E->A, &A24->z); + fp2_add(&A24->z, &A24->z, &A24->z); +} + +/** + * @brief Given a curve the point (A+2 : 4C) compute the curve coefficients (A : C) + * + * @param E a curve to compute + * @param A24 the value (A+2 : 4C) + */ +static inline void +A24_to_AC(ec_curve_t *E, const ec_point_t *A24) +{ + // (A:C) = ((A+2C)*2-4C : 4C) + fp2_add(&E->A, &A24->x, &A24->x); + fp2_sub(&E->A, &E->A, &A24->z); + fp2_add(&E->A, &E->A, &E->A); + fp2_copy(&E->C, &A24->z); +} + +/** + * @brief j-invariant. + * + * @param j_inv computed j_invariant + * @param curve input curve + */ +void ec_j_inv(fp2_t *j_inv, const ec_curve_t *curve); + +/** + * @brief Isomorphism of elliptic curve + * Takes as input two isomorphic Kummer lines in Montgomery form, and output an isomorphism between + * them + * + * @param isom computed isomorphism + * @param from domain curve + * @param to image curve + * @return 0xFFFFFFFF if there was an error during the computation, zero otherwise + */ +uint32_t ec_isomorphism(ec_isom_t *isom, const ec_curve_t *from, const ec_curve_t *to); + +/** + * @brief In-place evaluation of an isomorphism + * + * @param P a point + * @param isom an isomorphism + */ +void ec_iso_eval(ec_point_t *P, ec_isom_t *isom); + +/** @} + */ +/** @defgroup ec_point_t Point operations + * @{ + */ + +/** + * @brief Point equality + * + * @param P a point + * @param Q a point + * @return 0xFFFFFFFF if equal, zero otherwise + */ +uint32_t ec_is_equal(const ec_point_t *P, const ec_point_t *Q); + +/** + * @brief Point equality + * + * @param P a point + * @return 0xFFFFFFFF if point at infinity, zero otherwise + */ +uint32_t ec_is_zero(const ec_point_t *P); + +/** + * @brief Two torsion test + * + * @param P a point + * @param E the elliptic curve + * @return 0xFFFFFFFF if P is 2-torsion but not zero, zero otherwise + */ +uint32_t ec_is_two_torsion(const ec_point_t *P, const ec_curve_t *E); + +/** + * @brief Four torsion test + * + * @param P a point + * @param E the elliptic curve + * @return 0xFFFFFFFF if P is 2-torsion but not zero, zero otherwise + */ +uint32_t ec_is_four_torsion(const ec_point_t *P, const ec_curve_t *E); + +/** + * @brief Reduce Z-coordinate of point in place + * + * @param P a point + */ +void ec_normalize_point(ec_point_t *P); + +void xDBL_E0(ec_point_t *Q, const ec_point_t *P); +void xADD(ec_point_t *R, const ec_point_t *P, const ec_point_t *Q, const ec_point_t *PQ); +void xDBL_A24(ec_point_t *Q, const ec_point_t *P, const ec_point_t *A24, const bool A24_normalized); + +/** + * @brief Point doubling + * + * @param res computed double of P + * @param P a point + * @param curve an elliptic curve + */ +void ec_dbl(ec_point_t *res, const ec_point_t *P, const ec_curve_t *curve); + +/** + * @brief Point iterated doubling + * + * @param res computed double of P + * @param P a point + * @param n the number of double + * @param curve the curve on which P lays + */ +void ec_dbl_iter(ec_point_t *res, int n, const ec_point_t *P, ec_curve_t *curve); + +/** + * @brief Iterated doubling for a basis P, Q, PmQ + * + * @param res the computed iterated double of basis B + * @param n the number of doubles + * @param B the basis to double + * @param curve the parent curve of the basis + */ +void ec_dbl_iter_basis(ec_basis_t *res, int n, const ec_basis_t *B, ec_curve_t *curve); + +/** + * @brief Point multiplication + * + * @param res computed scalar * P + * @param curve the curve + * @param scalar an unsigned multi-precision integer + * @param P a point + * @param kbits numer of bits of the scalar + */ +void ec_mul(ec_point_t *res, const digit_t *scalar, const int kbits, const ec_point_t *P, ec_curve_t *curve); + +/** + * @brief Combination P+m*Q + * + * @param R computed P + m * Q + * @param curve the curve + * @param m an unsigned multi-precision integer + * @param P a point + * @param Q a point + * @param PQ the difference P-Q + * @return 0 if there was an error, 1 otherwise + */ +int ec_ladder3pt(ec_point_t *R, + const digit_t *m, + const ec_point_t *P, + const ec_point_t *Q, + const ec_point_t *PQ, + const ec_curve_t *curve); + +/** + * @brief Linear combination of points of a basis + * + * @param res computed scalarP * P + scalarQ * Q + * @param scalarP an unsigned multi-precision integer + * @param scalarQ an unsigned multi-precision integer + * @param kbits number of bits of the scalars, or n for points of order 2^n + * @param PQ a torsion basis consisting of points P and Q + * @param curve the curve + * + * @return 0 if there was an error, 1 otherwise + */ +int ec_biscalar_mul(ec_point_t *res, + const digit_t *scalarP, + const digit_t *scalarQ, + const int kbits, + const ec_basis_t *PQ, + const ec_curve_t *curve); + +// end point computations +/** + * @} + */ + +/** @defgroup ec_dlog_t Torsion basis computations + * @{ + */ + +/** + * @brief Generate a 2^f-torsion basis from a Montgomery curve along with a hint + * + * @param PQ2 an ec_basis_t + * @param curve an ec_curve_t + * @param f an integer + * + * @return A hint + * + * The algorithm is deterministc + */ +uint8_t ec_curve_to_basis_2f_to_hint(ec_basis_t *PQ2, ec_curve_t *curve, int f); + +/** + * @brief Generate a 2^f-torsion basis from a Montgomery curve and a given hint + * + * @param PQ2 an ec_basis_t + * @param curve an ec_curve_t + * @param f an integer + * @param hint the hint + * + * @return 1 is the basis is valid, 0 otherwise + * + * The algorithm is deterministc + */ +int ec_curve_to_basis_2f_from_hint(ec_basis_t *PQ2, ec_curve_t *curve, int f, const uint8_t hint); +/** // end basis computations + * @} + */ + +/** @defgroup ec_isog_t Isogenies + * @{ + */ + +/** + * @brief Evaluate isogeny of even degree on list of points. + * Returns 0 if successful and -1 if kernel has the wrong order or includes (0:1). + * + * @param image computed image curve + * @param phi isogeny + * @param points a list of points to evaluate the isogeny on, modified in place + * @param len_points length of the list points + * + * @return 0 if there was no error, 0xFFFFFFFF otherwise + */ +uint32_t ec_eval_even(ec_curve_t *image, ec_isog_even_t *phi, ec_point_t *points, unsigned len_points); + +/** + * @brief Multiplicative strategy for a short isogeny chain. Returns 1 if successfull and -1 + * if kernel has the wrong order or includes (0:1) when special=false. + * + * @param curve domain curve, to be overwritten by the codomain curve. + * @param kernel a kernel generator of order 2^len + * @param len the length of t he 2-isogeny chain + * @param points a list of points to evaluate the isogeny on, modified in place + * @param len_points length of the list points + * @param special if true, allow isogenies with (0:1) in the kernel + * + * @return 0 if there was no error, 0xFFFFFFFF otherwise + */ +uint32_t ec_eval_small_chain(ec_curve_t *curve, + const ec_point_t *kernel, + int len, + ec_point_t *points, + unsigned len_points, + bool special); + +/** + * @brief Recover Y-coordinate from X-coordinate and curve coefficients. + * + * @param y: a y-coordinate + * @param Px: a x-coordinate + * @param curve: the elliptic curve + * + * @return 0xFFFFFFFF if the point was on the curve, 0 otherwise + */ +uint32_t ec_recover_y(fp2_t *y, const fp2_t *Px, const ec_curve_t *curve); + +// Jacobian point init and copying +void jac_init(jac_point_t *P); +void copy_jac_point(jac_point_t *P, const jac_point_t *Q); + +/** + * @brief Test if two Jacobian points are equal + * + * @param P: a point + * @param Q: a point + * + * @return 0xFFFFFFFF if they are equal, 0 otherwise + */ +uint32_t jac_is_equal(const jac_point_t *P, const jac_point_t *Q); + +// Convert from Jacobian to x-only (just drop the Y-coordinate) +void jac_to_xz(ec_point_t *P, const jac_point_t *xyP); +// Convert from Jacobian coordinates in Montgomery model to Weierstrass +void jac_to_ws(jac_point_t *P, fp2_t *t, fp2_t *ao3, const jac_point_t *Q, const ec_curve_t *curve); +void jac_from_ws(jac_point_t *Q, const jac_point_t *P, const fp2_t *ao3, const ec_curve_t *curve); + +// Jacobian arithmetic +void jac_neg(jac_point_t *Q, const jac_point_t *P); +void ADD(jac_point_t *R, const jac_point_t *P, const jac_point_t *Q, const ec_curve_t *AC); +void DBL(jac_point_t *Q, const jac_point_t *P, const ec_curve_t *AC); +void DBLW(jac_point_t *Q, fp2_t *u, const jac_point_t *P, const fp2_t *t); +void jac_to_xz_add_components(add_components_t *uvw, const jac_point_t *P, const jac_point_t *Q, const ec_curve_t *AC); + +/** + * @brief Given a basis in x-only, lift to a pair of Jacobian points + * + * @param P: a point + * @param Q: a point + * @param B: a basis + * @param E: an elliptic curve + * + * @return 0xFFFFFFFF if there was no error, 0 otherwise + * + * + * Lifts a basis x(P), x(Q), x(P-Q) assuming the curve has (A/C : 1) and + * the point P = (X/Z : 1). For generic implementation see lift_basis() + */ +uint32_t lift_basis_normalized(jac_point_t *P, jac_point_t *Q, ec_basis_t *B, ec_curve_t *E); + +/** + * @brief Given a basis in x-only, lift to a pair of Jacobian points + * + * @param P: a point + * @param Q: a point + * @param B: a basis + * @param E: an elliptic curve + * + * @return 0xFFFFFFFF if there was no error, 0 otherwise + */ +uint32_t lift_basis(jac_point_t *P, jac_point_t *Q, ec_basis_t *B, ec_curve_t *E); + +/** + * @brief Check if basis points (P, Q) form a full 4-basis + * + * @param B: a basis + * @param E: an elliptic curve + * + * @return 0xFFFFFFFF if they form a basis, 0 otherwise + */ +uint32_t ec_is_basis_four_torsion(const ec_basis_t *B, const ec_curve_t *E); + +/* + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Test functions for printing and order checking, only used in debug mode + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + */ + +/** + * @brief Check if a point (X : Z) has order exactly 2^t + * + * @param P: a point + * @param E: an elliptic curve + * @param t: an integer + * + * @return 0xFFFFFFFF if the order is correct, 0 otherwise + */ +static int +test_point_order_twof(const ec_point_t *P, const ec_curve_t *E, int t) +{ + ec_point_t test; + ec_curve_t curve; + test = *P; + copy_curve(&curve, E); + + if (ec_is_zero(&test)) + return 0; + // Scale point by 2^(t-1) + ec_dbl_iter(&test, t - 1, &test, &curve); + // If it's zero now, it doesnt have order 2^t + if (ec_is_zero(&test)) + return 0; + // Ensure [2^t] P = 0 + ec_dbl(&test, &test, &curve); + return ec_is_zero(&test); +} + +/** + * @brief Check if basis points (P, Q, PmQ) all have order exactly 2^t + * + * @param B: a basis + * @param E: an elliptic curve + * @param t: an integer + * + * @return 0xFFFFFFFF if the order is correct, 0 otherwise + */ +static int +test_basis_order_twof(const ec_basis_t *B, const ec_curve_t *E, int t) +{ + int check_P = test_point_order_twof(&B->P, E, t); + int check_Q = test_point_order_twof(&B->Q, E, t); + int check_PmQ = test_point_order_twof(&B->PmQ, E, t); + + return check_P & check_Q & check_PmQ; +} + +/** + * @brief Check if a Jacobian point (X : Y : Z) has order exactly 2^f + * + * @param P: a point + * @param E: an elliptic curve + * @param t: an integer + * + * @return 0xFFFFFFFF if the order is correct, 0 otherwise + */ +static int +test_jac_order_twof(const jac_point_t *P, const ec_curve_t *E, int t) +{ + jac_point_t test; + test = *P; + if (fp2_is_zero(&test.z)) + return 0; + for (int i = 0; i < t - 1; i++) { + DBL(&test, &test, E); + } + if (fp2_is_zero(&test.z)) + return 0; + DBL(&test, &test, E); + return (fp2_is_zero(&test.z)); +} + +// Prints the x-coordinate of the point (X : 1) +static void +ec_point_print(const char *name, ec_point_t P) +{ + fp2_t a; + if (fp2_is_zero(&P.z)) { + printf("%s = INF\n", name); + } else { + fp2_copy(&a, &P.z); + fp2_inv(&a); + fp2_mul(&a, &a, &P.x); + fp2_print(name, &a); + } +} + +// Prints the Montgomery coefficient A +static void +ec_curve_print(const char *name, ec_curve_t E) +{ + fp2_t a; + fp2_copy(&a, &E.C); + fp2_inv(&a); + fp2_mul(&a, &a, &E.A); + fp2_print(name, &a); +} + +#endif +// end isogeny computations +/** + * @} + */ + +// end ec +/** + * @} + */ diff --git a/src/ec/ref/include/isog.h b/src/ec/ref/include/isog.h index 0f5f774..b251ca3 100644 --- a/src/ec/ref/include/isog.h +++ b/src/ec/ref/include/isog.h @@ -1,84 +1,28 @@ #ifndef _ISOG_H_ #define _ISOG_H_ +#include +#include -#include "curve_extras.h" -#include "poly.h" - -extern int sI, sJ, sK; // Sizes of each current I, J, and K - -extern fp2_t I[sI_max][2], // I plays also as the linear factors of the polynomial h_I(X) - EJ_0[sJ_max][3], EJ_1[sJ_max][3]; // To be used in xisog y xeval - -extern ec_point_t J[sJ_max], K[sK_max]; // Finite subsets of the kernel -extern fp2_t XZJ4[sJ_max], // -4* (Xj * Zj) for each j in J, and x([j]P) = (Xj : Zj) - rtree_A[(1 << (ceil_log_sI_max+2)) - 1], // constant multiple of the reciprocal tree computation - A0; // constant multiple of the reciprocal R0 - -extern poly ptree_hI[(1 << (ceil_log_sI_max+2)) - 1], // product tree of h_I(X) - rtree_hI[(1 << (ceil_log_sI_max+2)) - 1], // reciprocal tree of h_I(X) - ptree_EJ[(1 << (ceil_log_sJ_max+2)) - 1]; // product tree of E_J(X) - -extern fp2_t R0[2*sJ_max + 1]; // Reciprocal of h_I(X) required in the scaled remainder tree approach - -extern int deg_ptree_hI[(1 << (ceil_log_sI_max+2)) - 1], // degree of each noed in the product tree of h_I(X) - deg_ptree_EJ[(1 << (ceil_log_sJ_max+2)) - 1]; // degree of each node in the product tree of E_J(X) - -extern fp2_t leaves[sI_max]; // leaves of the remainder tree, which are required in the Resultant computation - - -void eds2mont(ec_point_t* P); // mapping from Twisted edwards into Montogmery -void yadd(ec_point_t* R, ec_point_t* const P, ec_point_t* const Q, ec_point_t* const PQ); // differential addition on Twisted edwards model -void CrissCross(fp2_t *r0, fp2_t *r1, fp2_t const alpha, fp2_t const beta, fp2_t const gamma, fp2_t const delta); - -void kps_t(uint64_t const i, ec_point_t const P, ec_point_t const A); // tvelu formulae -void kps_s(uint64_t const i, ec_point_t const P, ec_point_t const A); // svelu formulae - -void xisog_4(ec_point_t* B, ec_point_t const P); // degree-4 isogeny construction -void xisog_4_singular(ec_point_t* B24, ec_point_t const P, ec_point_t A24); -void xisog_2(ec_point_t* B, ec_point_t const P); // degree-2 isogeny construction -void xisog_t(ec_point_t* B, uint64_t const i, ec_point_t const A); // tvelu formulae -void xisog_s(ec_point_t* B, uint64_t const i, ec_point_t const A); // svelu formulae - -void xeval_4(ec_point_t* R, const ec_point_t* Q, const int lenQ); // degree-4 isogeny evaluation -void xeval_4_singular(ec_point_t* R, const ec_point_t* Q, const int lenQ, const ec_point_t P); -void xeval_2(ec_point_t* R, ec_point_t* const Q, const int lenQ); // degree-2 isogeny evaluation -void xeval_t(ec_point_t* Q, uint64_t const i, ec_point_t const P); // tvelu formulae -void xeval_s(ec_point_t* Q, uint64_t const i, ec_point_t const P, ec_point_t const A); // svelu formulae - -// Strategy-based 4-isogeny chain -static void ec_eval_even_strategy(ec_curve_t* image, ec_point_t* points, unsigned short points_len, - ec_point_t* A24, const ec_point_t *kernel, const int isog_len); - -void kps_clear(int i); // Clear memory assigned by KPS - - -// hybrid velu formulae -static inline void kps(uint64_t const i, ec_point_t const P, ec_point_t const A) +/* KPS structure for isogenies of degree 2 or 4 */ +typedef struct { - // Next branch only depends on a fixed public bound (named gap) - if (TORSION_ODD_PRIMES[i] <= gap) - kps_t(i, P, A); - else - kps_s(i, P, A); -} - -static inline void xisog(ec_point_t* B, uint64_t const i, ec_point_t const A) + ec_point_t K; +} ec_kps2_t; +typedef struct { - // Next branch only depends on a fixed public bound (named gap) - if (TORSION_ODD_PRIMES[i] <= gap) - xisog_t(B, i, A); - else - xisog_s(B, i, A); -} + ec_point_t K[3]; +} ec_kps4_t; -static inline void xeval(ec_point_t* Q, uint64_t const i, ec_point_t const P, ec_point_t const A) -{ - // Next branch only depends on a fixed public bound (named gap) - if (TORSION_ODD_PRIMES[i] <= gap) - xeval_t(Q, i, P); - else - xeval_s(Q, i, P, A); -} +void xisog_2(ec_kps2_t *kps, ec_point_t *B, const ec_point_t P); // degree-2 isogeny construction +void xisog_2_singular(ec_kps2_t *kps, ec_point_t *B24, ec_point_t A24); +void xisog_4(ec_kps4_t *kps, ec_point_t *B, const ec_point_t P); // degree-4 isogeny construction +void xisog_4_singular(ec_kps4_t *kps, ec_point_t *B24, const ec_point_t P, ec_point_t A24); + +void xeval_2(ec_point_t *R, ec_point_t *const Q, const int lenQ, const ec_kps2_t *kps); +void xeval_2_singular(ec_point_t *R, const ec_point_t *Q, const int lenQ, const ec_kps2_t *kps); + +void xeval_4(ec_point_t *R, const ec_point_t *Q, const int lenQ, const ec_kps4_t *kps); +void xeval_4_singular(ec_point_t *R, const ec_point_t *Q, const int lenQ, const ec_point_t P, const ec_kps4_t *kps); #endif diff --git a/src/ec/ref/include/poly.h b/src/ec/ref/include/poly.h deleted file mode 100644 index af23777..0000000 --- a/src/ec/ref/include/poly.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _POLY_H_ -#define _POLY_H_ - -#include - -typedef fp2_t *poly; // Polynomials are arrays of coeffs over Fq, lowest degree first - -void poly_mul(poly h, const poly f, const int lenf, const poly g, const int leng); -void poly_mul_low(poly h, const int n, const poly f, const int lenf, const poly g, const int leng); -void poly_mul_middle(poly h, const poly g, const int leng, const poly f, const int lenf); -void poly_mul_selfreciprocal(poly h, const poly g, const int leng, const poly f, const int lenf); - -void product_tree(poly H[], int DEG[], const int root, const poly F[], const int LENF, const int n); -void product_tree_LENFeq2(poly H[], int DEG[], const int root, const fp2_t F[][2], const int n); -void product_tree_LENFeq3(poly H[], int DEG[], const int root, const fp2_t F[][3], const int n); -void product_tree_selfreciprocal(poly H[], int DEG[], const int root, const poly F[], const int LENF, const int n); -void product_tree_selfreciprocal_LENFeq3(poly H[], int DEG[], const int root, const fp2_t F[][3], const int n); -void clear_tree(poly H[], const int root, const int n); - -void product(fp2_t *c, const fp2_t F[], const int n); - -void reciprocal(poly h, fp2_t *c, const poly f, const int lenf, const int n); -void poly_redc(poly h, const poly g, const int leng, const poly f, const int lenf,const poly f_inv, const fp2_t c); -void reciprocal_tree(poly *R, fp2_t *A, const int leng, const poly H[], const int DEG[], const int root, const int n); -void multieval_unscaled(fp2_t REM[], const poly g, const int leng, const poly R[], const fp2_t A[], const poly H[], const int DEG[], const int root, const int n); -void multieval_scaled(fp2_t REM[], const poly G, const poly H[], const int DEG[], const int root, const int n); - -#endif /* _POLY_H */ diff --git a/src/ec/ref/include/sdacs.h b/src/ec/ref/include/sdacs.h deleted file mode 100644 index f1fed6a..0000000 --- a/src/ec/ref/include/sdacs.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef _SDACS_H_ -#define _SDACS_H_ - -static char SDAC_P_0[] = "0"; -static char SDAC_P_1[] = "10"; -static char SDAC_P_2[] = "100"; -static char SDAC_P_3[] = "0100"; -static char SDAC_P_4[] = "10000"; -static char SDAC_P_5[] = "110000"; -static char SDAC_P_6[] = "100000"; -static char SDAC_P_7[] = "1100010001"; -static char SDAC_P_8[] = "1001010000"; -static char SDAC_P_9[] = "0101001000"; -static char SDAC_P_10[] = "110110010000"; -static char SDAC_P_11[] = "10000000000"; -static char SDAC_P_12[] = "1010100001001000"; - -static char SDAC_M_0[] = ""; -static char SDAC_M_1[] = "000"; -static char SDAC_M_2[] = "1010"; -static char SDAC_M_3[] = "100010"; -static char SDAC_M_4[] = "0010000"; -static char SDAC_M_5[] = "110000000"; -static char SDAC_M_6[] = "1010101010"; -static char SDAC_M_7[] = "1010001000"; -static char SDAC_M_8[] = "1001000000"; -static char SDAC_M_9[] = "0100001000"; -static char SDAC_M_10[] ="101101010000"; -static char SDAC_M_11[] = "100100010010"; -static char SDAC_M_12[] = "010100011000"; -static char SDAC_M_13[] = "101010000001"; -static char SDAC_M_14[] = "010100001000"; -static char SDAC_M_15[] = "1101010010000"; -static char SDAC_M_16[] = "1001010001010"; -static char SDAC_M_17[] = "101001000000101"; - -static char *SDACs[31] = { - SDAC_P_0, SDAC_P_1, SDAC_P_2, SDAC_P_3, SDAC_P_4, - SDAC_P_5, SDAC_P_6, SDAC_P_7, SDAC_P_8, SDAC_P_9, - SDAC_P_10, SDAC_P_11, SDAC_P_12, - SDAC_M_0, SDAC_M_1, SDAC_M_2, SDAC_M_3, SDAC_M_4, - SDAC_M_5, SDAC_M_6, SDAC_M_7, SDAC_M_8, SDAC_M_9, - SDAC_M_10, SDAC_M_11, SDAC_M_12, SDAC_M_13, SDAC_M_14, - SDAC_M_15, SDAC_M_16, SDAC_M_17 - }; - -static int LENGTHS[] = { -1, 2, 3, 4, 5, 6, 6, 10, 10, 10, 12, 11, 16, 0, 3, 4, 6, 7, 9, 10, 10, 10, 10, 12, 12, 12, 12, 12, 13, 13, 15 - }; -#endif \ No newline at end of file diff --git a/src/ec/ref/include/tedwards.h b/src/ec/ref/include/tedwards.h deleted file mode 100755 index 42597b6..0000000 --- a/src/ec/ref/include/tedwards.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef TEDWARDS_H -#define TEDWARDS_H - -#include -#include "ec.h" - -// a*x^2+y^2=1+d*x^2*y^2 - -typedef struct ted_point_t { - fp2_t x; - fp2_t y; - fp2_t z; - fp2_t t; // t = x*y/z -} ted_point_t; - -void ted_init(ted_point_t* P); -bool is_ted_equal(ted_point_t const* P1, ted_point_t const* P2); -void copy_ted_point(ted_point_t* P, ted_point_t const* Q); - -void ted_neg(ted_point_t* Q, ted_point_t const* P); -void ted_dbl(ted_point_t* Q, ted_point_t const* P, ec_curve_t const* E); -void ted_add(ted_point_t* S, ted_point_t const* P, ted_point_t const* Q, ec_curve_t const* E); - -void mont_to_ted(ec_curve_t* E, ec_curve_t const* A); -void mont_to_ted_point(ted_point_t* Q, ec_point_t const* P, ec_curve_t const* A); -void ted_to_mont_point(ec_point_t* Q, ted_point_t const* P); - -#endif diff --git a/src/ec/ref/lvl1/CMakeLists.txt b/src/ec/ref/lvl1/CMakeLists.txt index 6cf6396..8b64577 100644 --- a/src/ec/ref/lvl1/CMakeLists.txt +++ b/src/ec/ref/lvl1/CMakeLists.txt @@ -1,17 +1 @@ -set(SOURCE_FILES_EC_${SVARIANT_UPPER}_REF - ${ECX_DIR}/poly-mul.c - ${ECX_DIR}/poly-redc.c - ${ECX_DIR}/ec.c - ${ECX_DIR}/tedwards.c - ${ECX_DIR}/kps.c - ${ECX_DIR}/xisog.c - ${ECX_DIR}/xeval.c - ${ECX_DIR}/isog_chains.c - ${ECX_DIR}/basis.c -) - -add_library(${LIB_EC_${SVARIANT_UPPER}} ${SOURCE_FILES_EC_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_EC_${SVARIANT_UPPER}} PRIVATE ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${INC_EC}) -target_compile_options(${LIB_EC_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) \ No newline at end of file diff --git a/src/ec/ref/lvl1/test/CMakeLists.txt b/src/ec/ref/lvl1/test/CMakeLists.txt index 77f176e..316e0a8 100644 --- a/src/ec/ref/lvl1/test/CMakeLists.txt +++ b/src/ec/ref/lvl1/test/CMakeLists.txt @@ -1,36 +1 @@ -add_executable(fp2.test_${SVARIANT_LOWER} ${ECX_DIR}/test/fp2-test.c) - target_include_directories(fp2.test_${SVARIANT_LOWER} PUBLIC ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_COMMON}) - target_link_libraries(fp2.test_${SVARIANT_LOWER} ${LIB_GF_${SVARIANT_UPPER}}) - -add_executable(poly-mul.test_${SVARIANT_LOWER} ${ECX_DIR}/test/poly-mul-test.c) - target_include_directories(poly-mul.test_${SVARIANT_LOWER} PUBLIC ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_EC} ${INC_COMMON}) - target_link_libraries(poly-mul.test_${SVARIANT_LOWER} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) - -add_executable(poly-redc.test_${SVARIANT_LOWER} ${ECX_DIR}/test/poly-redc-test.c) - target_include_directories(poly-redc.test_${SVARIANT_LOWER} PUBLIC ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_EC} ${INC_COMMON}) - target_link_libraries(poly-redc.test_${SVARIANT_LOWER} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) - -add_executable(mont.test_${SVARIANT_LOWER} ${ECX_DIR}/test/mont-test.c) - target_include_directories(mont.test_${SVARIANT_LOWER} PUBLIC ${INC_GF_${SVARIANT_UPPER}} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_EC} ${INC_COMMON} .) - target_link_libraries(mont.test_${SVARIANT_LOWER} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) - -add_executable(ec.test_${SVARIANT_LOWER} ${ECX_DIR}/test/ec-test.c ${ECX_DIR}/test/test_extras.c) - target_include_directories(ec.test_${SVARIANT_LOWER} PUBLIC ${ECX_DIR}/test ${INC_GF_${SVARIANT_UPPER}} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_EC} ${INC_COMMON} .) - target_link_libraries(ec.test_${SVARIANT_LOWER} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) - -add_executable(velu.test_${SVARIANT_LOWER} ${ECX_DIR}/test/velu-test.c) - target_include_directories(velu.test_${SVARIANT_LOWER} PUBLIC ${INC_GF_${SVARIANT_UPPER}} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_EC} ${INC_COMMON} .) - target_link_libraries(velu.test_${SVARIANT_LOWER} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) - -add_executable(isog.test_${SVARIANT_LOWER} ${ECX_DIR}/test/isog-test.c) - target_include_directories(isog.test_${SVARIANT_LOWER} PUBLIC ${INC_GF_${SVARIANT_UPPER}} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${PROJECT_SOURCE_DIR}/include ../include ${INC_EC} ${INC_COMMON} .) - target_link_libraries(isog.test_${SVARIANT_LOWER} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) - - -add_test(ec_fp2.test_${SVARIANT_LOWER} fp2.test_${SVARIANT_LOWER} ${SQISIGN_TEST_REPS}) -add_test(ec_poly-mul.test_${SVARIANT_LOWER} poly-mul.test_${SVARIANT_LOWER} ${SQISIGN_TEST_REPS}) -add_test(ec_poly-redc.test_${SVARIANT_LOWER} poly-redc.test_${SVARIANT_LOWER} ${SQISIGN_TEST_REPS}) -add_test(ec_mont.test_${SVARIANT_LOWER} mont.test_${SVARIANT_LOWER} ${SQISIGN_TEST_REPS}) -add_test(ec_ec.test_${SVARIANT_LOWER} ec.test_${SVARIANT_LOWER} test ${SQISIGN_TEST_REPS}) -add_test(ec_velu.test_${SVARIANT_LOWER} velu.test_${SVARIANT_LOWER} ${SQISIGN_TEST_REPS}) -add_test(ec_isog.test_${SVARIANT_LOWER} isog.test_${SVARIANT_LOWER} ${SQISIGN_TEST_REPS}) \ No newline at end of file +include(../../lvlx_test.cmake) diff --git a/src/ec/ref/lvl1/test/ec-tests.h b/src/ec/ref/lvl1/test/ec-tests.h deleted file mode 100644 index 2e3af05..0000000 --- a/src/ec/ref/lvl1/test/ec-tests.h +++ /dev/null @@ -1,400 +0,0 @@ -#ifndef EC_TESTS_H -#define EC_TESTS_H - -#include "test_extras.h" -#include -#include -#include //////// NOTE: enable later -#include "test-basis.h" -#include "ec_params.h" - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 1000; // Number of iterations per bench -static int TEST_LOOPS = 512; // Number of iterations per test - - -bool ec_test() -{ // Tests for ecc arithmetic - bool OK = true; - int passed; - ec_point_t P = {0}, Q = {0}, R = {0}, S = {0}, SS = {0}, PQ = {0}; - ec_point_t AC = {0}; - digit_t k[NWORDS_ORDER] = {0}, l[NWORDS_ORDER] = {0}; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing ecc functions: \n\n"); - - // Point doubling - passed = 1; - P.x.re[0] = 0xDFD70ED0861BD329; P.x.re[1] = 0x20ACD3758C7F5540; P.x.re[2] = 0x3DCCDC007277F80A; P.x.re[3] = 0x18D6D2A22981DCE1; - P.x.im[0] = 0x3C23730A3F08F38C; P.x.im[1] = 0x98BB973AFD3D954D; P.x.im[2] = 0x8D98ADFC2829AE8A; P.x.im[3] = 0x21A2464D6369AFBA; - P.z.re[0] = 0x01; - - AC.z.re[0] = 0x01; - fp2_tomont(&AC.z, &AC.z); - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - xDBL(&S, &R, &AC); - fp2_copy(&SS.x, &S.x); // Copy of S = SS <- 2P - fp2_copy(&SS.z, &S.z); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0x5950EE0A4AF90FC8; R.x.re[1] = 0x16488065A0A98B08; R.x.re[2] = 0xCE65322229DA0FD1; R.x.re[3] = 0x270A35FF781EE204; - R.x.im[0] = 0x564447FD9EC57F6B; R.x.im[1] = 0x2EE24E984294F729; R.x.im[2] = 0x53A6C7360E972C71; R.x.im[3] = 0x4FCF4B9928A7C7E; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2)!=0) { passed=0; goto out0; } - - Q.x.re[0] = 0xC46076A670C70053; Q.x.re[1] = 0x97517AFA3AB9ED13; Q.x.re[2] = 0x349644C942EDF993; Q.x.re[3] = 0xBB4A4DB6F29AF9E; - Q.x.im[0] = 0x8B47629FB5A15BB0; Q.x.im[1] = 0x4EC6E809953C1A10; Q.x.im[2] = 0x1F83F0EC6CBB84D6; Q.x.im[3] = 0x1D8417C1D33265D3; - Q.z.re[0] = 0x01; - - PQ.x.re[0] = 0x853F66D11BE5534F; PQ.x.re[1] = 0x27C8FD4E52D03D4A; PQ.x.re[2] = 0xF88EA78D0A0C29D2; PQ.x.re[3] = 0x2F6DFB07D397A067; - PQ.x.im[0] = 0xE8DBC4AA34434BA1; PQ.x.im[1] = 0x7A73AE182636F8A0; PQ.x.im[2] = 0x419EC260137868EB; PQ.x.im[3] = 0x129B3E301703D43F; - PQ.z.re[0] = 0x01; - - fp2_tomont(&S.x, &Q.x); - fp2_tomont(&S.z, &Q.z); - fp2_tomont(&PQ.x, &PQ.x); - fp2_tomont(&PQ.z, &PQ.z); - xADD(&S, &SS, &S, &PQ); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xED0BEB8F93AB4FF9; R.x.re[1] = 0x27CF508B80CD49BF; R.x.re[2] = 0x38A6134DFA04B2BA; R.x.re[3] = 0x27B4CB15E109EF1F; - R.x.im[0] = 0x6F731BA6FD227BDE; R.x.im[1] = 0x14C12335341167F8; R.x.im[2] = 0xECA7B60F7866E27A; R.x.im[3] = 0x2A7A79A152880457; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - k[0] = 126; - xMUL(&S, &R, k, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xDE80F87A1203A147; R.x.re[1] = 0xD59E1215928A3B2D; R.x.re[2] = 0xD5A67F83A5A8CE46; R.x.re[3] = 0xA11E162488C9CDF; - R.x.im[0] = 0x9417D0D79A26741B; R.x.im[1] = 0x8B1F47D6F0FE5EEC; R.x.im[2] = 0xE52188DCB054CE36; R.x.im[3] = 0x1A8075A6C3148AB3; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - k[0] = 0xE77AD6B6C6B2D8CD; - k[1] = 0xDE43A0B600F38D12; - k[2] = 0xA35F4A7897E17CE2; - k[3] = 0x10ACB62E614D1237; - xMUL(&S, &R, k, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xD3938B0A68A3E7C0; R.x.re[1] = 0xE0667113208A0595; R.x.re[2] = 0x258F314C84E9CB60; R.x.re[3] = 0x14984BA7CA59AB71; - R.x.im[0] = 0xFE728423EE3BFEF4; R.x.im[1] = 0xBF68C42FE21AE0E4; R.x.im[2] = 0xA8FAF9C9528609CA; R.x.im[3] = 0x1225EC77A1DC0285; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &Q.x); - fp2_tomont(&R.z, &Q.z); - k[0] = 0xE77AD6B6C6B2D8CD; - k[1] = 0xDE43A0B600F38D12; - k[2] = 0xA35F4A7897E17CE2; - k[3] = 0x10ACB62E614D1237; - l[0] = 0x34AB78B6C6B2D8C0; - l[1] = 0xDE6B2D8CD00F38D1; - l[2] = 0xA35F4A7897E17CE2; - l[3] = 0x20ACF4A789614D13; - fp2_inv(&SS.z); - fp2_mul(&SS.x, &SS.x, &SS.z); - fp2_copy(&SS.z, &R.z); - xDBLMUL(&S, &R, k, &SS, l, &PQ, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0x554E1ADC609B992F; R.x.re[1] = 0xE407D961F8CC4C42; R.x.re[2] = 0x1CF626AFED5A68CE; R.x.re[3] = 0x6D02692EE110483; - R.x.im[0] = 0x16FB094E831C8997; R.x.im[1] = 0xFDE4ECF31DC5F702; R.x.im[2] = 0x89303D868DFAD7B4; R.x.im[3] = 0xC91ACE81346F22D; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - -out0: - if (passed==1) printf(" ECC arithmetic tests ............................................ PASSED"); - else { printf(" ECC arithmetic tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - return OK; -} - -bool dlog_test() -{ // Tests for dlog - bool OK = true; - int passed; - ec_point_t P = {0}, Q = {0}, R = {0}, S = {0}, SS = {0}, PQ = {0}; - ec_curve_t AC = {0}; - ec_basis_t PQ2; - digit_t scalarP[NWORDS_ORDER], scalarQ[NWORDS_ORDER], k[NWORDS_ORDER] = {0}, l[NWORDS_ORDER] = {0}; - digit_t kt[NWORDS_ORDER], lt[NWORDS_ORDER], f1[NWORDS_ORDER] = {0}, f2[NWORDS_ORDER] = {0}, zero[NWORDS_ORDER] = {0}, tpFdiv2[NWORDS_ORDER] = {0}, tpF[NWORDS_ORDER] = {0}; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing dlog functions: \n\n"); - - // dlog2 testing - passed = 1; - - fp2_tomont(&P.x, &xP2); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - - fp2_tomont(&Q.x, &xQ2); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - - fp2_tomont(&PQ.x, &xPQ2); - fp_mont_setone(PQ.z.re); - fp_set(PQ.z.im, 0); - - AC.C.re[0] = 0x01; - fp_copy(f1, TWOpFm1); - fp_copy(f2, TWOpF); - fp2_tomont(&AC.C, &AC.C); - - copy_point(&PQ2.P, &P); - copy_point(&PQ2.Q, &Q); - copy_point(&PQ2.PmQ, &PQ); - k[0] = 0xFFFFFFFFFFFFFFFF; - k[1] = 0x00000000000007FF; - l[0] = 0xFFFFFFFFFFFFFFFE; - l[1] = 0x00000000000007FF; - - for (int n = 0; n < TEST_LOOPS; n++) - { - k[0] -= 1; - l[0] -= 2; - xDBLMUL(&R, &P, k, &Q, l, &PQ, &AC); - ec_dlog_2(scalarP, scalarQ, &PQ2, &R, &AC); - - memcpy(kt, k, NWORDS_ORDER*RADIX/8); - memcpy(lt, l, NWORDS_ORDER*RADIX/8); - if (compare_words(k, f1, NWORDS_ORDER) == 1 || - (compare_words(l, f1, NWORDS_ORDER) == 1 && (compare_words(k, zero, NWORDS_ORDER) == 0 || compare_words(k, f1, NWORDS_ORDER) == 0))) { - if (compare_words(k, zero, NWORDS_ORDER) != 0) { - sub_test(kt, f2, kt, NWORDS_ORDER); - } - if (compare_words(l, zero, NWORDS_ORDER) != 0) { - sub_test(lt, f2, lt, NWORDS_ORDER); - } - } - if (compare_words((digit_t*)scalarP, (digit_t*)kt, NWORDS_ORDER) != 0 || compare_words((digit_t*)scalarQ, (digit_t*)lt, NWORDS_ORDER) != 0) { passed = 0; break; } - } - - if (passed == 1) printf(" dlog2 tests ..................................................... PASSED"); - else { printf(" dlog2 tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - // dlog3 testing - passed = 1; - - fp2_tomont(&P.x, &xP3); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - - fp2_tomont(&Q.x, &xQ3); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - - fp2_tomont(&PQ.x, &xPQ3); - fp_mont_setone(PQ.z.re); - fp_set(PQ.z.im, 0); - - AC.C.re[0] = 0x01; - fp_copy(tpFdiv2, THREEpFdiv2); - fp_copy(tpF, THREEpF); - fp2_tomont(&AC.C, &AC.C); - - copy_point(&PQ2.P, &P); - copy_point(&PQ2.Q, &Q); - copy_point(&PQ2.PmQ, &PQ); - k[1] = 0; - l[1] = 0; - k[0] = 0x02153E468B91C6D1; - l[0] = 0x02153E468B91C6D0; - - for (int n = 0; n < TEST_LOOPS; n++) - { - k[0] -= 1; - l[0] -= 2; - xDBLMUL(&R, &P, k, &Q, l, &PQ, &AC); - ec_dlog_3(scalarP, scalarQ, &PQ2, &R, &AC); - - memcpy(kt, k, NWORDS_ORDER*RADIX/8); - memcpy(lt, l, NWORDS_ORDER*RADIX/8); - if (compare_words(k, tpFdiv2, NWORDS_ORDER) == 1 || - (compare_words(l, tpFdiv2, NWORDS_ORDER) == 1 && compare_words(k, zero, NWORDS_ORDER) == 0)) { - if (compare_words(k, zero, NWORDS_ORDER) != 0) { - sub_test(kt, tpF, kt, NWORDS_ORDER); - } - if (compare_words(l, zero, NWORDS_ORDER) != 0) { - sub_test(lt, tpF, lt, NWORDS_ORDER); - } - } - if (compare_words((digit_t*)scalarP, (digit_t*)kt, NWORDS_ORDER) != 0 || compare_words((digit_t*)scalarQ, (digit_t*)lt, NWORDS_ORDER) != 0) { passed = 0; break; } - } - - if (passed == 1) printf(" dlog3 tests ..................................................... PASSED"); - else { printf(" dlog3 tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - return OK; -} - -bool ec_run() -{ - bool OK = true; - int n; - unsigned long long cycles, cycles1, cycles2; - ec_point_t P, Q, R, PQ, AC; - digit_t k[NWORDS_ORDER], l[NWORDS_ORDER]; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Benchmarking ecc arithmetic: \n\n"); - - // Point doubling - cycles = 0; - for (n=0; n -#include -#include //////// NOTE: enable later -#include "test-basis.h" -#include "ec_params.h" - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 1000; // Number of iterations per bench -static int TEST_LOOPS = 512; // Number of iterations per test - - -bool ec_test() -{ // Tests for ecc arithmetic - bool OK = true; - int passed; - ec_point_t P = {0}, Q = {0}, R = {0}, S = {0}, SS = {0}, PQ = {0}; - ec_point_t AC = {0}; - digit_t k[NWORDS_ORDER] = {0}, l[NWORDS_ORDER] = {0}; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing ecc functions: (NOT IMPLEMENTED) \n\n"); -/* - // Point doubling - passed = 1; - P.x.re[0] = 0xDFD70ED0861BD329; P.x.re[1] = 0x20ACD3758C7F5540; P.x.re[2] = 0x3DCCDC007277F80A; P.x.re[3] = 0x18D6D2A22981DCE1; - P.x.im[0] = 0x3C23730A3F08F38C; P.x.im[1] = 0x98BB973AFD3D954D; P.x.im[2] = 0x8D98ADFC2829AE8A; P.x.im[3] = 0x21A2464D6369AFBA; - P.z.re[0] = 0x01; - - AC.z.re[0] = 0x01; - fp2_tomont(&AC.z, &AC.z); - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - xDBL(&S, &R, &AC); - fp2_copy(&SS.x, &S.x); // Copy of S = SS <- 2P - fp2_copy(&SS.z, &S.z); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0x5950EE0A4AF90FC8; R.x.re[1] = 0x16488065A0A98B08; R.x.re[2] = 0xCE65322229DA0FD1; R.x.re[3] = 0x270A35FF781EE204; - R.x.im[0] = 0x564447FD9EC57F6B; R.x.im[1] = 0x2EE24E984294F729; R.x.im[2] = 0x53A6C7360E972C71; R.x.im[3] = 0x4FCF4B9928A7C7E; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2)!=0) { passed=0; goto out0; } - - Q.x.re[0] = 0xC46076A670C70053; Q.x.re[1] = 0x97517AFA3AB9ED13; Q.x.re[2] = 0x349644C942EDF993; Q.x.re[3] = 0xBB4A4DB6F29AF9E; - Q.x.im[0] = 0x8B47629FB5A15BB0; Q.x.im[1] = 0x4EC6E809953C1A10; Q.x.im[2] = 0x1F83F0EC6CBB84D6; Q.x.im[3] = 0x1D8417C1D33265D3; - Q.z.re[0] = 0x01; - - PQ.x.re[0] = 0x853F66D11BE5534F; PQ.x.re[1] = 0x27C8FD4E52D03D4A; PQ.x.re[2] = 0xF88EA78D0A0C29D2; PQ.x.re[3] = 0x2F6DFB07D397A067; - PQ.x.im[0] = 0xE8DBC4AA34434BA1; PQ.x.im[1] = 0x7A73AE182636F8A0; PQ.x.im[2] = 0x419EC260137868EB; PQ.x.im[3] = 0x129B3E301703D43F; - PQ.z.re[0] = 0x01; - - fp2_tomont(&S.x, &Q.x); - fp2_tomont(&S.z, &Q.z); - fp2_tomont(&PQ.x, &PQ.x); - fp2_tomont(&PQ.z, &PQ.z); - xADD(&S, &SS, &S, &PQ); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xED0BEB8F93AB4FF9; R.x.re[1] = 0x27CF508B80CD49BF; R.x.re[2] = 0x38A6134DFA04B2BA; R.x.re[3] = 0x27B4CB15E109EF1F; - R.x.im[0] = 0x6F731BA6FD227BDE; R.x.im[1] = 0x14C12335341167F8; R.x.im[2] = 0xECA7B60F7866E27A; R.x.im[3] = 0x2A7A79A152880457; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - k[0] = 126; - xMUL(&S, &R, k, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xDE80F87A1203A147; R.x.re[1] = 0xD59E1215928A3B2D; R.x.re[2] = 0xD5A67F83A5A8CE46; R.x.re[3] = 0xA11E162488C9CDF; - R.x.im[0] = 0x9417D0D79A26741B; R.x.im[1] = 0x8B1F47D6F0FE5EEC; R.x.im[2] = 0xE52188DCB054CE36; R.x.im[3] = 0x1A8075A6C3148AB3; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - k[0] = 0xE77AD6B6C6B2D8CD; - k[1] = 0xDE43A0B600F38D12; - k[2] = 0xA35F4A7897E17CE2; - k[3] = 0x10ACB62E614D1237; - xMUL(&S, &R, k, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xD3938B0A68A3E7C0; R.x.re[1] = 0xE0667113208A0595; R.x.re[2] = 0x258F314C84E9CB60; R.x.re[3] = 0x14984BA7CA59AB71; - R.x.im[0] = 0xFE728423EE3BFEF4; R.x.im[1] = 0xBF68C42FE21AE0E4; R.x.im[2] = 0xA8FAF9C9528609CA; R.x.im[3] = 0x1225EC77A1DC0285; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &Q.x); - fp2_tomont(&R.z, &Q.z); - k[0] = 0xE77AD6B6C6B2D8CD; - k[1] = 0xDE43A0B600F38D12; - k[2] = 0xA35F4A7897E17CE2; - k[3] = 0x10ACB62E614D1237; - l[0] = 0x34AB78B6C6B2D8C0; - l[1] = 0xDE6B2D8CD00F38D1; - l[2] = 0xA35F4A7897E17CE2; - l[3] = 0x20ACF4A789614D13; - fp2_inv(&SS.z); - fp2_mul(&SS.x, &SS.x, &SS.z); - fp2_copy(&SS.z, &R.z); - xDBLMUL(&S, &R, k, &SS, l, &PQ, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0x554E1ADC609B992F; R.x.re[1] = 0xE407D961F8CC4C42; R.x.re[2] = 0x1CF626AFED5A68CE; R.x.re[3] = 0x6D02692EE110483; - R.x.im[0] = 0x16FB094E831C8997; R.x.im[1] = 0xFDE4ECF31DC5F702; R.x.im[2] = 0x89303D868DFAD7B4; R.x.im[3] = 0xC91ACE81346F22D; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - -out0: - if (passed==1) printf(" ECC arithmetic tests ............................................ PASSED"); - else { printf(" ECC arithmetic tests... FAILED"); printf("\n"); return false; } - printf("\n"); - */ - return OK; -} - -bool dlog_test() -{ // Tests for dlog - bool OK = true; - int passed; - ec_point_t P = {0}, Q = {0}, R = {0}, S = {0}, SS = {0}, PQ = {0}; - ec_curve_t AC = {0}; - ec_basis_t PQ2; - digit_t scalarP[NWORDS_ORDER], scalarQ[NWORDS_ORDER], k[NWORDS_ORDER] = {0}, l[NWORDS_ORDER] = {0}; - digit_t kt[NWORDS_ORDER], lt[NWORDS_ORDER], f1[NWORDS_ORDER] = {0}, f2[NWORDS_ORDER] = {0}, zero[NWORDS_ORDER] = {0}, tpFdiv2[NWORDS_ORDER] = {0}, tpF[NWORDS_ORDER] = {0}; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing dlog functions: \n\n"); - - // dlog2 testing - passed = 1; - - fp2_tomont(&P.x, &xP2); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - - fp2_tomont(&Q.x, &xQ2); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - - fp2_tomont(&PQ.x, &xPQ2); - fp_mont_setone(PQ.z.re); - fp_set(PQ.z.im, 0); - - AC.C.re[0] = 0x01; - fp_copy(f1, TWOpFm1); - fp_copy(f2, TWOpF); - fp2_tomont(&AC.C, &AC.C); - - copy_point(&PQ2.P, &P); - copy_point(&PQ2.Q, &Q); - copy_point(&PQ2.PmQ, &PQ); - k[0] = 0xFFFFFFFFFFFFFFFF; - k[1] = 0x00000000000007FF; - l[0] = 0xFFFFFFFFFFFFFFFE; - l[1] = 0x00000000000007FF; - - for (int n = 0; n < TEST_LOOPS; n++) - { - k[0] -= 1; - l[0] -= 2; - xDBLMUL(&R, &P, k, &Q, l, &PQ, &AC); - ec_dlog_2(scalarP, scalarQ, &PQ2, &R, &AC); - - memcpy(kt, k, NWORDS_ORDER*RADIX/8); - memcpy(lt, l, NWORDS_ORDER*RADIX/8); - if (compare_words(k, f1, NWORDS_ORDER) == 1 || - (compare_words(l, f1, NWORDS_ORDER) == 1 && (compare_words(k, zero, NWORDS_ORDER) == 0 || compare_words(k, f1, NWORDS_ORDER) == 0))) { - if (compare_words(k, zero, NWORDS_ORDER) != 0) { - sub_test(kt, f2, kt, NWORDS_ORDER); - } - if (compare_words(l, zero, NWORDS_ORDER) != 0) { - sub_test(lt, f2, lt, NWORDS_ORDER); - } - } - if (compare_words((digit_t*)scalarP, (digit_t*)kt, NWORDS_ORDER) != 0 || compare_words((digit_t*)scalarQ, (digit_t*)lt, NWORDS_ORDER) != 0) { passed = 0; break; } - } - - if (passed == 1) printf(" dlog2 tests ..................................................... PASSED"); - else { printf(" dlog2 tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - // dlog3 testing - passed = 1; - - fp2_tomont(&P.x, &xP3); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - - fp2_tomont(&Q.x, &xQ3); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - - fp2_tomont(&PQ.x, &xPQ3); - fp_mont_setone(PQ.z.re); - fp_set(PQ.z.im, 0); - - AC.C.re[0] = 0x01; - fp_copy(tpFdiv2, THREEpFdiv2); - fp_copy(tpF, THREEpF); - fp2_tomont(&AC.C, &AC.C); - - copy_point(&PQ2.P, &P); - copy_point(&PQ2.Q, &Q); - copy_point(&PQ2.PmQ, &PQ); - k[1] = 0; - l[1] = 0; - k[0] = 0x02153E468B91C6D1; - l[0] = 0x02153E468B91C6D0; - - for (int n = 0; n < TEST_LOOPS; n++) - { - k[0] -= 1; - l[0] -= 2; - xDBLMUL(&R, &P, k, &Q, l, &PQ, &AC); - ec_dlog_3(scalarP, scalarQ, &PQ2, &R, &AC); - - memcpy(kt, k, NWORDS_ORDER*RADIX/8); - memcpy(lt, l, NWORDS_ORDER*RADIX/8); - if (compare_words(k, tpFdiv2, NWORDS_ORDER) == 1 || - (compare_words(l, tpFdiv2, NWORDS_ORDER) == 1 && compare_words(k, zero, NWORDS_ORDER) == 0)) { - if (compare_words(k, zero, NWORDS_ORDER) != 0) { - sub_test(kt, tpF, kt, NWORDS_ORDER); - } - if (compare_words(l, zero, NWORDS_ORDER) != 0) { - sub_test(lt, tpF, lt, NWORDS_ORDER); - } - } - if (compare_words((digit_t*)scalarP, (digit_t*)kt, NWORDS_ORDER) != 0 || compare_words((digit_t*)scalarQ, (digit_t*)lt, NWORDS_ORDER) != 0) { passed = 0; break; } - } - - if (passed == 1) printf(" dlog3 tests ..................................................... PASSED"); - else { printf(" dlog3 tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - return OK; -} - -bool ec_run() -{ - bool OK = true; - int n; - unsigned long long cycles, cycles1, cycles2; - ec_point_t P, Q, R, PQ, AC; - digit_t k[NWORDS_ORDER], l[NWORDS_ORDER]; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Benchmarking ecc arithmetic: \n\n"); - - // Point doubling - cycles = 0; - for (n=0; n -#include -#include //////// NOTE: enable later -#include "test-basis.h" -#include "ec_params.h" - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 1000; // Number of iterations per bench -static int TEST_LOOPS = 512; // Number of iterations per test - - -bool ec_test() -{ // Tests for ecc arithmetic - bool OK = true; - int passed; - ec_point_t P = {0}, Q = {0}, R = {0}, S = {0}, SS = {0}, PQ = {0}; - ec_point_t AC = {0}; - digit_t k[NWORDS_ORDER] = {0}, l[NWORDS_ORDER] = {0}; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing ecc functions: (NOT IMPLEMENTED) \n\n"); -/* - // Point doubling - passed = 1; - P.x.re[0] = 0xDFD70ED0861BD329; P.x.re[1] = 0x20ACD3758C7F5540; P.x.re[2] = 0x3DCCDC007277F80A; P.x.re[3] = 0x18D6D2A22981DCE1; - P.x.im[0] = 0x3C23730A3F08F38C; P.x.im[1] = 0x98BB973AFD3D954D; P.x.im[2] = 0x8D98ADFC2829AE8A; P.x.im[3] = 0x21A2464D6369AFBA; - P.z.re[0] = 0x01; - - AC.z.re[0] = 0x01; - fp2_tomont(&AC.z, &AC.z); - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - xDBL(&S, &R, &AC); - fp2_copy(&SS.x, &S.x); // Copy of S = SS <- 2P - fp2_copy(&SS.z, &S.z); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0x5950EE0A4AF90FC8; R.x.re[1] = 0x16488065A0A98B08; R.x.re[2] = 0xCE65322229DA0FD1; R.x.re[3] = 0x270A35FF781EE204; - R.x.im[0] = 0x564447FD9EC57F6B; R.x.im[1] = 0x2EE24E984294F729; R.x.im[2] = 0x53A6C7360E972C71; R.x.im[3] = 0x4FCF4B9928A7C7E; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2)!=0) { passed=0; goto out0; } - - Q.x.re[0] = 0xC46076A670C70053; Q.x.re[1] = 0x97517AFA3AB9ED13; Q.x.re[2] = 0x349644C942EDF993; Q.x.re[3] = 0xBB4A4DB6F29AF9E; - Q.x.im[0] = 0x8B47629FB5A15BB0; Q.x.im[1] = 0x4EC6E809953C1A10; Q.x.im[2] = 0x1F83F0EC6CBB84D6; Q.x.im[3] = 0x1D8417C1D33265D3; - Q.z.re[0] = 0x01; - - PQ.x.re[0] = 0x853F66D11BE5534F; PQ.x.re[1] = 0x27C8FD4E52D03D4A; PQ.x.re[2] = 0xF88EA78D0A0C29D2; PQ.x.re[3] = 0x2F6DFB07D397A067; - PQ.x.im[0] = 0xE8DBC4AA34434BA1; PQ.x.im[1] = 0x7A73AE182636F8A0; PQ.x.im[2] = 0x419EC260137868EB; PQ.x.im[3] = 0x129B3E301703D43F; - PQ.z.re[0] = 0x01; - - fp2_tomont(&S.x, &Q.x); - fp2_tomont(&S.z, &Q.z); - fp2_tomont(&PQ.x, &PQ.x); - fp2_tomont(&PQ.z, &PQ.z); - xADD(&S, &SS, &S, &PQ); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xED0BEB8F93AB4FF9; R.x.re[1] = 0x27CF508B80CD49BF; R.x.re[2] = 0x38A6134DFA04B2BA; R.x.re[3] = 0x27B4CB15E109EF1F; - R.x.im[0] = 0x6F731BA6FD227BDE; R.x.im[1] = 0x14C12335341167F8; R.x.im[2] = 0xECA7B60F7866E27A; R.x.im[3] = 0x2A7A79A152880457; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - k[0] = 126; - xMUL(&S, &R, k, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xDE80F87A1203A147; R.x.re[1] = 0xD59E1215928A3B2D; R.x.re[2] = 0xD5A67F83A5A8CE46; R.x.re[3] = 0xA11E162488C9CDF; - R.x.im[0] = 0x9417D0D79A26741B; R.x.im[1] = 0x8B1F47D6F0FE5EEC; R.x.im[2] = 0xE52188DCB054CE36; R.x.im[3] = 0x1A8075A6C3148AB3; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &P.x); - fp2_tomont(&R.z, &P.z); - k[0] = 0xE77AD6B6C6B2D8CD; - k[1] = 0xDE43A0B600F38D12; - k[2] = 0xA35F4A7897E17CE2; - k[3] = 0x10ACB62E614D1237; - xMUL(&S, &R, k, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0xD3938B0A68A3E7C0; R.x.re[1] = 0xE0667113208A0595; R.x.re[2] = 0x258F314C84E9CB60; R.x.re[3] = 0x14984BA7CA59AB71; - R.x.im[0] = 0xFE728423EE3BFEF4; R.x.im[1] = 0xBF68C42FE21AE0E4; R.x.im[2] = 0xA8FAF9C9528609CA; R.x.im[3] = 0x1225EC77A1DC0285; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - - fp2_tomont(&R.x, &Q.x); - fp2_tomont(&R.z, &Q.z); - k[0] = 0xE77AD6B6C6B2D8CD; - k[1] = 0xDE43A0B600F38D12; - k[2] = 0xA35F4A7897E17CE2; - k[3] = 0x10ACB62E614D1237; - l[0] = 0x34AB78B6C6B2D8C0; - l[1] = 0xDE6B2D8CD00F38D1; - l[2] = 0xA35F4A7897E17CE2; - l[3] = 0x20ACF4A789614D13; - fp2_inv(&SS.z); - fp2_mul(&SS.x, &SS.x, &SS.z); - fp2_copy(&SS.z, &R.z); - xDBLMUL(&S, &R, k, &SS, l, &PQ, (ec_curve_t*)&AC); - fp2_inv(&S.z); - fp2_mul(&S.x, &S.x, &S.z); - fp2_frommont(&S.x, &S.x); - - R.x.re[0] = 0x554E1ADC609B992F; R.x.re[1] = 0xE407D961F8CC4C42; R.x.re[2] = 0x1CF626AFED5A68CE; R.x.re[3] = 0x6D02692EE110483; - R.x.im[0] = 0x16FB094E831C8997; R.x.im[1] = 0xFDE4ECF31DC5F702; R.x.im[2] = 0x89303D868DFAD7B4; R.x.im[3] = 0xC91ACE81346F22D; - - if (compare_words((digit_t*)&R.x, (digit_t*)&S.x, NWORDS_FIELD*2) != 0) { passed = 0; goto out0; } - -out0: - if (passed==1) printf(" ECC arithmetic tests ............................................ PASSED"); - else { printf(" ECC arithmetic tests... FAILED"); printf("\n"); return false; } - printf("\n"); - */ - return OK; -} - -bool dlog_test() -{ // Tests for dlog - bool OK = true; - int passed; - ec_point_t P = {0}, Q = {0}, R = {0}, S = {0}, SS = {0}, PQ = {0}; - ec_curve_t AC = {0}; - ec_basis_t PQ2; - digit_t scalarP[NWORDS_ORDER], scalarQ[NWORDS_ORDER], k[NWORDS_ORDER] = {0}, l[NWORDS_ORDER] = {0}; - digit_t kt[NWORDS_ORDER], lt[NWORDS_ORDER], f1[NWORDS_ORDER] = {0}, f2[NWORDS_ORDER] = {0}, zero[NWORDS_ORDER] = {0}, tpFdiv2[NWORDS_ORDER] = {0}, tpF[NWORDS_ORDER] = {0}; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing dlog functions: \n\n"); - - // dlog2 testing - passed = 1; - - fp2_tomont(&P.x, &xP2); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - - fp2_tomont(&Q.x, &xQ2); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - - fp2_tomont(&PQ.x, &xPQ2); - fp_mont_setone(PQ.z.re); - fp_set(PQ.z.im, 0); - - AC.C.re[0] = 0x01; - fp_copy(f1, TWOpFm1); - fp_copy(f2, TWOpF); - fp2_tomont(&AC.C, &AC.C); - - copy_point(&PQ2.P, &P); - copy_point(&PQ2.Q, &Q); - copy_point(&PQ2.PmQ, &PQ); - k[0] = 0xFFFFFFFFFFFFFFFF; - k[1] = 0x00000000000007FF; - l[0] = 0xFFFFFFFFFFFFFFFE; - l[1] = 0x00000000000007FF; - - for (int n = 0; n < TEST_LOOPS; n++) - { - k[0] -= 1; - l[0] -= 2; - xDBLMUL(&R, &P, k, &Q, l, &PQ, &AC); - ec_dlog_2(scalarP, scalarQ, &PQ2, &R, &AC); - - memcpy(kt, k, NWORDS_ORDER*RADIX/8); - memcpy(lt, l, NWORDS_ORDER*RADIX/8); - if (compare_words(k, f1, NWORDS_ORDER) == 1 || - (compare_words(l, f1, NWORDS_ORDER) == 1 && (compare_words(k, zero, NWORDS_ORDER) == 0 || compare_words(k, f1, NWORDS_ORDER) == 0))) { - if (compare_words(k, zero, NWORDS_ORDER) != 0) { - sub_test(kt, f2, kt, NWORDS_ORDER); - } - if (compare_words(l, zero, NWORDS_ORDER) != 0) { - sub_test(lt, f2, lt, NWORDS_ORDER); - } - } - if (compare_words((digit_t*)scalarP, (digit_t*)kt, NWORDS_ORDER) != 0 || compare_words((digit_t*)scalarQ, (digit_t*)lt, NWORDS_ORDER) != 0) { passed = 0; break; } - } - - if (passed == 1) printf(" dlog2 tests ..................................................... PASSED"); - else { printf(" dlog2 tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - // dlog3 testing - passed = 1; - - fp2_tomont(&P.x, &xP3); - fp_mont_setone(P.z.re); - fp_set(P.z.im, 0); - - fp2_tomont(&Q.x, &xQ3); - fp_mont_setone(Q.z.re); - fp_set(Q.z.im, 0); - - fp2_tomont(&PQ.x, &xPQ3); - fp_mont_setone(PQ.z.re); - fp_set(PQ.z.im, 0); - - AC.C.re[0] = 0x01; - fp_copy(tpFdiv2, THREEpFdiv2); - fp_copy(tpF, THREEpF); - fp2_tomont(&AC.C, &AC.C); - - copy_point(&PQ2.P, &P); - copy_point(&PQ2.Q, &Q); - copy_point(&PQ2.PmQ, &PQ); - k[1] = 0; - l[1] = 0; - k[0] = 0x02153E468B91C6D1; - l[0] = 0x02153E468B91C6D0; - - for (int n = 0; n < TEST_LOOPS; n++) - { - k[0] -= 1; - l[0] -= 2; - xDBLMUL(&R, &P, k, &Q, l, &PQ, &AC); - ec_dlog_3(scalarP, scalarQ, &PQ2, &R, &AC); - - memcpy(kt, k, NWORDS_ORDER*RADIX/8); - memcpy(lt, l, NWORDS_ORDER*RADIX/8); - if (compare_words(k, tpFdiv2, NWORDS_ORDER) == 1 || - (compare_words(l, tpFdiv2, NWORDS_ORDER) == 1 && compare_words(k, zero, NWORDS_ORDER) == 0)) { - if (compare_words(k, zero, NWORDS_ORDER) != 0) { - sub_test(kt, tpF, kt, NWORDS_ORDER); - } - if (compare_words(l, zero, NWORDS_ORDER) != 0) { - sub_test(lt, tpF, lt, NWORDS_ORDER); - } - } - if (compare_words((digit_t*)scalarP, (digit_t*)kt, NWORDS_ORDER) != 0 || compare_words((digit_t*)scalarQ, (digit_t*)lt, NWORDS_ORDER) != 0) { passed = 0; break; } - } - - if (passed == 1) printf(" dlog3 tests ..................................................... PASSED"); - else { printf(" dlog3 tests... FAILED"); printf("\n"); return false; } - printf("\n"); - - return OK; -} - -bool ec_run() -{ - bool OK = true; - int n; - unsigned long long cycles, cycles1, cycles2; - ec_point_t P, Q, R, PQ, AC; - digit_t k[NWORDS_ORDER], l[NWORDS_ORDER]; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Benchmarking ecc arithmetic: \n\n"); - - // Point doubling - cycles = 0; - for (n=0; n + +uint32_t +ec_recover_y(fp2_t *y, const fp2_t *Px, const ec_curve_t *curve) +{ // Recover y-coordinate of a point on the Montgomery curve y^2 = x^3 + Ax^2 + x + fp2_t t0; + + fp2_sqr(&t0, Px); + fp2_mul(y, &t0, &curve->A); // Ax^2 + fp2_add(y, y, Px); // Ax^2 + x + fp2_mul(&t0, &t0, Px); + fp2_add(y, y, &t0); // x^3 + Ax^2 + x + // This is required, because we do not yet know that our curves are + // supersingular so our points live on the twist with B = 1. + return fp2_sqrt_verify(y); +} + +static void +difference_point(ec_point_t *PQ, const ec_point_t *P, const ec_point_t *Q, const ec_curve_t *curve) +{ + // Given P,Q in projective x-only, computes a deterministic choice for (P-Q) + // Based on Proposition 3 of https://eprint.iacr.org/2017/518.pdf + + fp2_t Bxx, Bxz, Bzz, t0, t1; + + fp2_mul(&t0, &P->x, &Q->x); + fp2_mul(&t1, &P->z, &Q->z); + fp2_sub(&Bxx, &t0, &t1); + fp2_sqr(&Bxx, &Bxx); + fp2_mul(&Bxx, &Bxx, &curve->C); // C*(P.x*Q.x-P.z*Q.z)^2 + fp2_add(&Bxz, &t0, &t1); + fp2_mul(&t0, &P->x, &Q->z); + fp2_mul(&t1, &P->z, &Q->x); + fp2_add(&Bzz, &t0, &t1); + fp2_mul(&Bxz, &Bxz, &Bzz); // (P.x*Q.x+P.z*Q.z)(P.x*Q.z+P.z*Q.x) + fp2_sub(&Bzz, &t0, &t1); + fp2_sqr(&Bzz, &Bzz); + fp2_mul(&Bzz, &Bzz, &curve->C); // C*(P.x*Q.z-P.z*Q.x)^2 + fp2_mul(&Bxz, &Bxz, &curve->C); // C*(P.x*Q.x+P.z*Q.z)(P.x*Q.z+P.z*Q.x) + fp2_mul(&t0, &t0, &t1); + fp2_mul(&t0, &t0, &curve->A); + fp2_add(&t0, &t0, &t0); + fp2_add(&Bxz, &Bxz, &t0); // C*(P.x*Q.x+P.z*Q.z)(P.x*Q.z+P.z*Q.x) + 2*A*P.x*Q.z*P.z*Q.x + + // To ensure that the denominator is a fourth power in Fp, we normalize by + // C*C_bar^2*(P.z)_bar^2*(Q.z)_bar^2 + fp_copy(&t0.re, &curve->C.re); + fp_neg(&t0.im, &curve->C.im); + fp2_sqr(&t0, &t0); + fp2_mul(&t0, &t0, &curve->C); + fp_copy(&t1.re, &P->z.re); + fp_neg(&t1.im, &P->z.im); + fp2_sqr(&t1, &t1); + fp2_mul(&t0, &t0, &t1); + fp_copy(&t1.re, &Q->z.re); + fp_neg(&t1.im, &Q->z.im); + fp2_sqr(&t1, &t1); + fp2_mul(&t0, &t0, &t1); + fp2_mul(&Bxx, &Bxx, &t0); + fp2_mul(&Bxz, &Bxz, &t0); + fp2_mul(&Bzz, &Bzz, &t0); + + // Solving quadratic equation + fp2_sqr(&t0, &Bxz); + fp2_mul(&t1, &Bxx, &Bzz); + fp2_sub(&t0, &t0, &t1); + // No need to check if t0 is square, as per the entangled basis algorithm. + fp2_sqrt(&t0); + fp2_add(&PQ->x, &Bxz, &t0); + fp2_copy(&PQ->z, &Bzz); +} + +// Lifts a basis x(P), x(Q), x(P-Q) assuming the curve has (A/C : 1) and the point +// P = (X/Z : 1). For generic implementation see lift_basis() +uint32_t +lift_basis_normalized(jac_point_t *P, jac_point_t *Q, ec_basis_t *B, ec_curve_t *E) +{ + assert(fp2_is_one(&B->P.z)); + assert(fp2_is_one(&E->C)); + + fp2_copy(&P->x, &B->P.x); + fp2_copy(&Q->x, &B->Q.x); + fp2_copy(&Q->z, &B->Q.z); + fp2_set_one(&P->z); + uint32_t ret = ec_recover_y(&P->y, &P->x, E); + + // Algorithm of Okeya-Sakurai to recover y.Q in the montgomery model + fp2_t v1, v2, v3, v4; + fp2_mul(&v1, &P->x, &Q->z); + fp2_add(&v2, &Q->x, &v1); + fp2_sub(&v3, &Q->x, &v1); + fp2_sqr(&v3, &v3); + fp2_mul(&v3, &v3, &B->PmQ.x); + fp2_add(&v1, &E->A, &E->A); + fp2_mul(&v1, &v1, &Q->z); + fp2_add(&v2, &v2, &v1); + fp2_mul(&v4, &P->x, &Q->x); + fp2_add(&v4, &v4, &Q->z); + fp2_mul(&v2, &v2, &v4); + fp2_mul(&v1, &v1, &Q->z); + fp2_sub(&v2, &v2, &v1); + fp2_mul(&v2, &v2, &B->PmQ.z); + fp2_sub(&Q->y, &v3, &v2); + fp2_add(&v1, &P->y, &P->y); + fp2_mul(&v1, &v1, &Q->z); + fp2_mul(&v1, &v1, &B->PmQ.z); + fp2_mul(&Q->x, &Q->x, &v1); + fp2_mul(&Q->z, &Q->z, &v1); + + // Transforming to a jacobian coordinate + fp2_sqr(&v1, &Q->z); + fp2_mul(&Q->y, &Q->y, &v1); + fp2_mul(&Q->x, &Q->x, &Q->z); + return ret; +} + +uint32_t +lift_basis(jac_point_t *P, jac_point_t *Q, ec_basis_t *B, ec_curve_t *E) +{ + // Normalise the curve E such that (A : C) is (A/C : 1) + // and the point x(P) = (X/Z : 1). + fp2_t inverses[2]; + fp2_copy(&inverses[0], &B->P.z); + fp2_copy(&inverses[1], &E->C); + + fp2_batched_inv(inverses, 2); + fp2_set_one(&B->P.z); + fp2_set_one(&E->C); + + fp2_mul(&B->P.x, &B->P.x, &inverses[0]); + fp2_mul(&E->A, &E->A, &inverses[1]); + + // Lift the basis to Jacobian points P, Q + return lift_basis_normalized(P, Q, B, E); +} + +// Given an x-coordinate, determines if this is a valid +// point on the curve. Assumes C=1. +static uint32_t +is_on_curve(const fp2_t *x, const ec_curve_t *curve) +{ + assert(fp2_is_one(&curve->C)); + fp2_t t0; + + fp2_add(&t0, x, &curve->A); // x + (A/C) + fp2_mul(&t0, &t0, x); // x^2 + (A/C)*x + fp2_add_one(&t0, &t0); // x^2 + (A/C)*x + 1 + fp2_mul(&t0, &t0, x); // x^3 + (A/C)*x^2 + x + + return fp2_is_square(&t0); +} + +// Helper function which given a point of order k*2^n with n maximal +// and k odd, computes a point of order 2^f +static inline void +clear_cofactor_for_maximal_even_order(ec_point_t *P, ec_curve_t *curve, int f) +{ + // clear out the odd cofactor to get a point of order 2^n + ec_mul(P, p_cofactor_for_2f, P_COFACTOR_FOR_2F_BITLENGTH, P, curve); + + // clear the power of two to get a point of order 2^f + for (int i = 0; i < TORSION_EVEN_POWER - f; i++) { + xDBL_A24(P, P, &curve->A24, curve->is_A24_computed_and_normalized); + } +} + +// Helper function which finds an NQR -1 / (1 + i*b) for entangled basis generation +static uint8_t +find_nqr_factor(fp2_t *x, ec_curve_t *curve, const uint8_t start) +{ + // factor = -1/(1 + i*b) for b in Fp will be NQR whenever 1 + b^2 is NQR + // in Fp, so we find one of these and then invert (1 + i*b). We store b + // as a u8 hint to save time in verification. + + // We return the hint as a u8, but use (uint16_t)n to give 2^16 - 1 + // to make failure cryptographically negligible, with a fallback when + // n > 128 is required. + uint8_t hint; + uint32_t found = 0; + uint16_t n = start; + + bool qr_b = 1; + fp_t b, tmp; + fp2_t z, t0, t1; + + do { + while (qr_b) { + // find b with 1 + b^2 a non-quadratic residue + fp_set_small(&tmp, (uint32_t)n * n + 1); + qr_b = fp_is_square(&tmp); + n++; // keeps track of b = n - 1 + } + + // for Px := -A/(1 + i*b) to be on the curve + // is equivalent to A^2*(z-1) - z^2 NQR for z = 1 + i*b + // thus prevents unnecessary inversion pre-check + + // t0 = z - 1 = i*b + // t1 = z = 1 + i*b + fp_set_small(&b, (uint32_t)n - 1); + fp2_set_zero(&t0); + fp2_set_one(&z); + fp_copy(&z.im, &b); + fp_copy(&t0.im, &b); + + // A^2*(z-1) - z^2 + fp2_sqr(&t1, &curve->A); + fp2_mul(&t0, &t0, &t1); // A^2 * (z - 1) + fp2_sqr(&t1, &z); + fp2_sub(&t0, &t0, &t1); // A^2 * (z - 1) - z^2 + found = !fp2_is_square(&t0); + + qr_b = 1; + } while (!found); + + // set Px to -A/(1 + i*b) + fp2_copy(x, &z); + fp2_inv(x); + fp2_mul(x, x, &curve->A); + fp2_neg(x, x); + + /* + * With very low probability n will not fit in 7 bits. + * We set hint = 0 which signals failure and the need + * to generate a value on the fly during verification + */ + hint = n <= 128 ? n - 1 : 0; + + return hint; +} + +// Helper function which finds a point x(P) = n * A +static uint8_t +find_nA_x_coord(fp2_t *x, ec_curve_t *curve, const uint8_t start) +{ + assert(!fp2_is_square(&curve->A)); // Only to be called when A is a NQR + + // when A is NQR we allow x(P) to be a multiple n*A of A + uint8_t n = start; + if (n == 1) { + fp2_copy(x, &curve->A); + } else { + fp2_mul_small(x, &curve->A, n); + } + + while (!is_on_curve(x, curve)) { + fp2_add(x, x, &curve->A); + n++; + } + + /* + * With very low probability (1/2^128), n will not fit in 7 bits. + * In this case, we set hint = 0 which signals failure and the need + * to generate a value on the fly during verification + */ + uint8_t hint = n < 128 ? n : 0; + return hint; +} + +// The entangled basis generation does not allow A = 0 +// so we simply return the one we have already precomputed +static void +ec_basis_E0_2f(ec_basis_t *PQ2, ec_curve_t *curve, int f) +{ + assert(fp2_is_zero(&curve->A)); + ec_point_t P, Q; + + // Set P, Q to precomputed (X : 1) values + fp2_copy(&P.x, &BASIS_E0_PX); + fp2_copy(&Q.x, &BASIS_E0_QX); + fp2_set_one(&P.z); + fp2_set_one(&Q.z); + + // clear the power of two to get a point of order 2^f + for (int i = 0; i < TORSION_EVEN_POWER - f; i++) { + xDBL_E0(&P, &P); + xDBL_E0(&Q, &Q); + } + + // Set P, Q in the basis and compute x(P - Q) + copy_point(&PQ2->P, &P); + copy_point(&PQ2->Q, &Q); + difference_point(&PQ2->PmQ, &P, &Q, curve); +} + +// Computes a basis E[2^f] = where the point Q is above (0 : 0) +// and stores hints as an array for faster recomputation at a later point +uint8_t +ec_curve_to_basis_2f_to_hint(ec_basis_t *PQ2, ec_curve_t *curve, int f) +{ + // Normalise (A/C : 1) and ((A + 2)/4 : 1) + ec_normalize_curve_and_A24(curve); + + if (fp2_is_zero(&curve->A)) { + ec_basis_E0_2f(PQ2, curve, f); + return 0; + } + + uint8_t hint; + bool hint_A = fp2_is_square(&curve->A); + + // Compute the points P, Q + ec_point_t P, Q; + + if (!hint_A) { + // when A is NQR we allow x(P) to be a multiple n*A of A + hint = find_nA_x_coord(&P.x, curve, 1); + } else { + // when A is QR we instead have to find (1 + b^2) a NQR + // such that x(P) = -A / (1 + i*b) + hint = find_nqr_factor(&P.x, curve, 1); + } + + fp2_set_one(&P.z); + fp2_add(&Q.x, &curve->A, &P.x); + fp2_neg(&Q.x, &Q.x); + fp2_set_one(&Q.z); + + // clear out the odd cofactor to get a point of order 2^f + clear_cofactor_for_maximal_even_order(&P, curve, f); + clear_cofactor_for_maximal_even_order(&Q, curve, f); + + // compute PmQ, set PmQ to Q to ensure Q above (0,0) + difference_point(&PQ2->Q, &P, &Q, curve); + copy_point(&PQ2->P, &P); + copy_point(&PQ2->PmQ, &Q); + + // Finally, we compress hint_A and hint into a single bytes. + // We choose to set the LSB of hint to hint_A + assert(hint < 128); // We expect hint to be 7-bits in size + return (hint << 1) | hint_A; +} + +// Computes a basis E[2^f] = where the point Q is above (0 : 0) +// given the hints as an array for faster basis computation +int +ec_curve_to_basis_2f_from_hint(ec_basis_t *PQ2, ec_curve_t *curve, int f, const uint8_t hint) +{ + // Normalise (A/C : 1) and ((A + 2)/4 : 1) + ec_normalize_curve_and_A24(curve); + + if (fp2_is_zero(&curve->A)) { + ec_basis_E0_2f(PQ2, curve, f); + return 1; + } + + // The LSB of hint encodes whether A is a QR + // The remaining 7-bits are used to find a valid x(P) + bool hint_A = hint & 1; + uint8_t hint_P = hint >> 1; + + // Compute the points P, Q + ec_point_t P, Q; + + if (!hint_P) { + // When hint_P = 0 it means we did not find a point in 128 attempts + // this is very rare and we almost never expect to need this fallback + // In either case, we can start with b = 128 to skip testing the known + // values which will not work + if (!hint_A) { + find_nA_x_coord(&P.x, curve, 128); + } else { + find_nqr_factor(&P.x, curve, 128); + } + } else { + // Otherwise we use the hint to directly find x(P) based on hint_A + if (!hint_A) { + // when A is NQR, we have found n such that x(P) = n*A + fp2_mul_small(&P.x, &curve->A, hint_P); + } else { + // when A is QR we have found b such that (1 + b^2) is a NQR in + // Fp, so we must compute x(P) = -A / (1 + i*b) + fp_set_one(&P.x.re); + fp_set_small(&P.x.im, hint_P); + fp2_inv(&P.x); + fp2_mul(&P.x, &P.x, &curve->A); + fp2_neg(&P.x, &P.x); + } + } + fp2_set_one(&P.z); + +#ifndef NDEBUG + int passed = 1; + passed = is_on_curve(&P.x, curve); + passed &= !fp2_is_square(&P.x); + + if (!passed) + return 0; +#endif + + // set xQ to -xP - A + fp2_add(&Q.x, &curve->A, &P.x); + fp2_neg(&Q.x, &Q.x); + fp2_set_one(&Q.z); + + // clear out the odd cofactor to get a point of order 2^f + clear_cofactor_for_maximal_even_order(&P, curve, f); + clear_cofactor_for_maximal_even_order(&Q, curve, f); + + // compute PmQ, set PmQ to Q to ensure Q above (0,0) + difference_point(&PQ2->Q, &P, &Q, curve); + copy_point(&PQ2->P, &P); + copy_point(&PQ2->PmQ, &Q); + +#ifndef NDEBUG + passed &= test_basis_order_twof(PQ2, curve, f); + + if (!passed) + return 0; +#endif + + return 1; +} diff --git a/src/ec/ref/lvlx/biextension.c b/src/ec/ref/lvlx/biextension.c new file mode 100644 index 0000000..1df7ab9 --- /dev/null +++ b/src/ec/ref/lvlx/biextension.c @@ -0,0 +1,770 @@ +#include +#include +#include +#include + +/* + * We implement the biextension arithmetic by using the cubical torsor + * representation. For now only implement the 2^e-ladder. + * + * Warning: cubicalADD is off by a factor x4 with respect to the correct + * cubical arithmetic. This does not affect the Weil pairing or the Tate + * pairing over F_{p^2} (due to the final exponentiation), but would give + * the wrong result if we compute the Tate pairing over F_p. + */ + +// this would be exactly like xADD if PQ was 'antinormalised' as (1,z) +// Cost: 3M + 2S + 3a + 3s +// Note: if needed, cubicalDBL is simply xDBL_A24 normalized and +// costs 3M + 2S + 2a + 2s + +static void +cubicalADD(ec_point_t *R, const ec_point_t *P, const ec_point_t *Q, const fp2_t *ixPQ) +{ + fp2_t t0, t1, t2, t3; + + fp2_add(&t0, &P->x, &P->z); + fp2_sub(&t1, &P->x, &P->z); + fp2_add(&t2, &Q->x, &Q->z); + fp2_sub(&t3, &Q->x, &Q->z); + fp2_mul(&t0, &t0, &t3); + fp2_mul(&t1, &t1, &t2); + fp2_add(&t2, &t0, &t1); + fp2_sub(&t3, &t0, &t1); + fp2_sqr(&R->z, &t3); + fp2_sqr(&t2, &t2); + fp2_mul(&R->x, ixPQ, &t2); +} + +// Given cubical reps of P, Q and x(P - Q) = (1 : ixPQ) +// compute P + Q, [2]Q +// Cost: 6M + 4S + 4a + 4s +static void +cubicalDBLADD(ec_point_t *PpQ, + ec_point_t *QQ, + const ec_point_t *P, + const ec_point_t *Q, + const fp2_t *ixPQ, + const ec_point_t *A24) +{ + // A24 = (A+2C/4C: 1) + assert(fp2_is_one(&A24->z)); + + fp2_t t0, t1, t2, t3; + + fp2_add(&t0, &P->x, &P->z); + fp2_sub(&t1, &P->x, &P->z); + fp2_add(&PpQ->x, &Q->x, &Q->z); + fp2_sub(&t3, &Q->x, &Q->z); + fp2_sqr(&t2, &PpQ->x); + fp2_sqr(&QQ->z, &t3); + fp2_mul(&t0, &t0, &t3); + fp2_mul(&t1, &t1, &PpQ->x); + fp2_add(&PpQ->x, &t0, &t1); + fp2_sub(&t3, &t0, &t1); + fp2_sqr(&PpQ->z, &t3); + fp2_sqr(&PpQ->x, &PpQ->x); + fp2_mul(&PpQ->x, ixPQ, &PpQ->x); + fp2_sub(&t3, &t2, &QQ->z); + fp2_mul(&QQ->x, &t2, &QQ->z); + fp2_mul(&t0, &t3, &A24->x); + fp2_add(&t0, &t0, &QQ->z); + fp2_mul(&QQ->z, &t0, &t3); +} + +// iterative biextension doubling +static void +biext_ladder_2e(uint32_t e, + ec_point_t *PnQ, + ec_point_t *nQ, + const ec_point_t *PQ, + const ec_point_t *Q, + const fp2_t *ixP, + const ec_point_t *A24) +{ + copy_point(PnQ, PQ); + copy_point(nQ, Q); + for (uint32_t i = 0; i < e; i++) { + cubicalDBLADD(PnQ, nQ, PnQ, nQ, ixP, A24); + } +} + +// Compute the monodromy ratio X/Z above as a (X:Z) point to avoid a division +// We implicitly use (1,0) as a cubical point above 0_E +static void +point_ratio(ec_point_t *R, const ec_point_t *PnQ, const ec_point_t *nQ, const ec_point_t *P) +{ + // Sanity tests + assert(ec_is_zero(nQ)); + assert(ec_is_equal(PnQ, P)); + + fp2_mul(&R->x, &nQ->x, &P->x); + fp2_copy(&R->z, &PnQ->x); +} + +// Compute the cubical translation of P by a point of 2-torsion T +static void +translate(ec_point_t *P, const ec_point_t *T) +{ + // When we translate, the following three things can happen: + // T = (A : 0) then the translation of P should be P + // T = (0 : B) then the translation of P = (X : Z) should be (Z : X) + // Otherwise T = (A : B) and P translates to (AX - BZ : BX - AZ) + // We compute this in constant time by computing the generic case + // and then using constant time swaps. + fp2_t PX_new, PZ_new; + + { + fp2_t t0, t1; + + // PX_new = AX - BZ + fp2_mul(&t0, &T->x, &P->x); + fp2_mul(&t1, &T->z, &P->z); + fp2_sub(&PX_new, &t0, &t1); + + // PZ_new = BX - AZ + fp2_mul(&t0, &T->z, &P->x); + fp2_mul(&t1, &T->x, &P->z); + fp2_sub(&PZ_new, &t0, &t1); + } + + // When we have A zero we should return (Z : X) + uint32_t TA_is_zero = fp2_is_zero(&T->x); + fp2_select(&PX_new, &PX_new, &P->z, TA_is_zero); + fp2_select(&PZ_new, &PZ_new, &P->x, TA_is_zero); + + // When we have B zero we should return (X : Z) + uint32_t TB_is_zero = fp2_is_zero(&T->z); + fp2_select(&PX_new, &PX_new, &P->x, TB_is_zero); + fp2_select(&PZ_new, &PZ_new, &P->z, TB_is_zero); + + // Set the point to the desired result + fp2_copy(&P->x, &PX_new); + fp2_copy(&P->z, &PZ_new); +} + +// Compute the biextension monodromy g_P,Q^{2^g} (in level 1) via the +// cubical arithmetic of P+2^e Q. +// The suffix _i means that we are given 1/x(P) as parameter. Warning: to +// get meaningful result when using the monodromy to compute pairings, we +// need P, Q, PQ, A24 to be normalised (this is not strictly necessary, but +// care need to be taken when they are not normalised. Only handle the +// normalised case for now) +static void +monodromy_i(ec_point_t *R, const pairing_params_t *pairing_data, bool swap_PQ) +{ + fp2_t ixP; + ec_point_t P, Q, PnQ, nQ; + + // When we compute the Weil pairing we need both P + [2^e]Q and + // Q + [2^e]P which we can do easily with biext_ladder_2e() below + // we use a bool to decide wether to use Q, ixP or P, ixQ in the + // ladder and P or Q in translation. + if (!swap_PQ) { + copy_point(&P, &pairing_data->P); + copy_point(&Q, &pairing_data->Q); + fp2_copy(&ixP, &pairing_data->ixP); + } else { + copy_point(&P, &pairing_data->Q); + copy_point(&Q, &pairing_data->P); + fp2_copy(&ixP, &pairing_data->ixQ); + } + + // Compute the biextension ladder P + [2^e]Q + biext_ladder_2e(pairing_data->e - 1, &PnQ, &nQ, &pairing_data->PQ, &Q, &ixP, &pairing_data->A24); + translate(&PnQ, &nQ); + translate(&nQ, &nQ); + point_ratio(R, &PnQ, &nQ, &P); +} + +// Normalize the points and also store 1/x(P), 1/x(Q) +static void +cubical_normalization(pairing_params_t *pairing_data, const ec_point_t *P, const ec_point_t *Q) +{ + fp2_t t[4]; + fp2_copy(&t[0], &P->x); + fp2_copy(&t[1], &P->z); + fp2_copy(&t[2], &Q->x); + fp2_copy(&t[3], &Q->z); + fp2_batched_inv(t, 4); + + // Store PZ / PX and QZ / QX + fp2_mul(&pairing_data->ixP, &P->z, &t[0]); + fp2_mul(&pairing_data->ixQ, &Q->z, &t[2]); + + // Store x(P), x(Q) normalised to (X/Z : 1) + fp2_mul(&pairing_data->P.x, &P->x, &t[1]); + fp2_mul(&pairing_data->Q.x, &Q->x, &t[3]); + fp2_set_one(&pairing_data->P.z); + fp2_set_one(&pairing_data->Q.z); +} + +// Weil pairing, PQ should be P+Q in (X:Z) coordinates +// We assume the points are normalised correctly +static void +weil_n(fp2_t *r, const pairing_params_t *pairing_data) +{ + ec_point_t R0, R1; + monodromy_i(&R0, pairing_data, true); + monodromy_i(&R1, pairing_data, false); + + fp2_mul(r, &R0.x, &R1.z); + fp2_inv(r); + fp2_mul(r, r, &R0.z); + fp2_mul(r, r, &R1.x); +} + +// Weil pairing, PQ should be P+Q in (X:Z) coordinates +// Normalise the points and call the code above +// The code will crash (division by 0) if either P or Q is (0:1) +void +weil(fp2_t *r, uint32_t e, const ec_point_t *P, const ec_point_t *Q, const ec_point_t *PQ, ec_curve_t *E) +{ + pairing_params_t pairing_data; + // Construct the structure for the Weil pairing + // Set (PX/PZ : 1), (QX : QZ : 1), PZ/PX and QZ/QX + pairing_data.e = e; + cubical_normalization(&pairing_data, P, Q); + copy_point(&pairing_data.PQ, PQ); + + // Ensure the input curve has A24 normalised and store + // in a struct + ec_curve_normalize_A24(E); + copy_point(&pairing_data.A24, &E->A24); + + // Compute the Weil pairing e_(2^n)(P, Q) + weil_n(r, &pairing_data); +} + +// two helper functions for reducing the tate pairing +// clear_cofac clears (p + 1) // 2^f for an Fp2 value +void +clear_cofac(fp2_t *r, const fp2_t *a) +{ + digit_t exp = *p_cofactor_for_2f; + exp >>= 1; + + fp2_t x; + fp2_copy(&x, a); + fp2_copy(r, a); + + // removes cofac + while (exp > 0) { + fp2_sqr(r, r); + if (exp & 1) { + fp2_mul(r, r, &x); + } + exp >>= 1; + } +} + +// applies frobenius a + ib --> a - ib to an fp2 element +void +fp2_frob(fp2_t *out, const fp2_t *in) +{ + fp_copy(&(out->re), &(in->re)); + fp_neg(&(out->im), &(in->im)); +} + +// reduced Tate pairing, normalizes the points, assumes PQ is P+Q in (X:Z) +// coordinates. Computes 1/x(P) and 1/x(Q) for efficient cubical ladder +void +reduced_tate(fp2_t *r, uint32_t e, const ec_point_t *P, const ec_point_t *Q, const ec_point_t *PQ, ec_curve_t *E) +{ + uint32_t e_full = TORSION_EVEN_POWER; + uint32_t e_diff = e_full - e; + ec_point_t R; + pairing_params_t pairing_data; + + // Construct the structure for the Weil pairing + // Set (PX/PZ : 1), (QX : QZ : 1), PZ/PX and QZ/QX + pairing_data.e = e; + cubical_normalization(&pairing_data, P, Q); + copy_point(&pairing_data.PQ, PQ); + + // Ensure the input curve has A24 normalised and store + // in a struct + ec_curve_normalize_A24(E); + copy_point(&pairing_data.A24, &E->A24); + + monodromy_i(&R, &pairing_data, true); + + // we get unreduced tate as R.X, R.Z + // reduced tate is -(R.Z/R.X)^((p^2 - 1) div 2^f) + // we reuse R.X and R.Z to split reduction step ^(p-1) into frobenius and ^-1 + fp2_t frob, tmp; + fp2_copy(&tmp, &R.x); + fp2_frob(&frob, &R.x); + fp2_mul(&R.x, &R.z, &frob); + fp2_frob(&frob, &R.z); + fp2_mul(&R.z, &tmp, &frob); + fp2_inv(&R.x); + fp2_mul(r, &R.x, &R.z); + + clear_cofac(r, r); + // clear remaining 2^e_diff + for (uint32_t j = 0; j < e_diff; j++) { + fp2_sqr(r, r); + } +} + +// Functions to compute discrete logs by computing the Weil pairing of points +// followed by computing the dlog in Fp^2 +// (If we work with full order points, it would be faster to use the Tate +// pairings rather than the Weil pairings; this is not implemented yet) + +// recursive dlog function +static bool +fp2_dlog_2e_rec(digit_t *a, long len, fp2_t *pows_f, fp2_t *pows_g, long stacklen) +{ + if (len == 0) { + // *a = 0; + for (int i = 0; i < NWORDS_ORDER; i++) { + a[i] = 0; + } + return true; + } else if (len == 1) { + if (fp2_is_one(&pows_f[stacklen - 1])) { + // a = 0; + for (int i = 0; i < NWORDS_ORDER; i++) { + a[i] = 0; + } + for (int i = 0; i < stacklen - 1; ++i) { + fp2_sqr(&pows_g[i], &pows_g[i]); // new_g = g^2 + } + return true; + } else if (fp2_is_equal(&pows_f[stacklen - 1], &pows_g[stacklen - 1])) { + // a = 1; + a[0] = 1; + for (int i = 1; i < NWORDS_ORDER; i++) { + a[i] = 0; + } + for (int i = 0; i < stacklen - 1; ++i) { + fp2_mul(&pows_f[i], &pows_f[i], &pows_g[i]); // new_f = f*g + fp2_sqr(&pows_g[i], &pows_g[i]); // new_g = g^2 + } + return true; + } else { + return false; + } + } else { + long right = (double)len * 0.5; + long left = len - right; + pows_f[stacklen] = pows_f[stacklen - 1]; + pows_g[stacklen] = pows_g[stacklen - 1]; + for (int i = 0; i < left; i++) { + fp2_sqr(&pows_f[stacklen], &pows_f[stacklen]); + fp2_sqr(&pows_g[stacklen], &pows_g[stacklen]); + } + // uint32_t dlp1 = 0, dlp2 = 0; + digit_t dlp1[NWORDS_ORDER], dlp2[NWORDS_ORDER]; + bool ok; + ok = fp2_dlog_2e_rec(dlp1, right, pows_f, pows_g, stacklen + 1); + if (!ok) + return false; + ok = fp2_dlog_2e_rec(dlp2, left, pows_f, pows_g, stacklen); + if (!ok) + return false; + // a = dlp1 + 2^right * dlp2 + multiple_mp_shiftl(dlp2, right, NWORDS_ORDER); + mp_add(a, dlp2, dlp1, NWORDS_ORDER); + + return true; + } +} + +// compute DLP: compute scal such that f = g^scal with f, 1/g as input +static bool +fp2_dlog_2e(digit_t *scal, const fp2_t *f, const fp2_t *g_inverse, int e) +{ + long log, len = e; + for (log = 0; len > 1; len >>= 1) + log++; + log += 1; + + fp2_t pows_f[log], pows_g[log]; + pows_f[0] = *f; + pows_g[0] = *g_inverse; + + for (int i = 0; i < NWORDS_ORDER; i++) { + scal[i] = 0; + } + + bool ok = fp2_dlog_2e_rec(scal, e, pows_f, pows_g, 1); + assert(ok); + + return ok; +} + +// Normalize the bases (P, Q), (R, S) and store their inverse +// and additionally normalise the curve to (A/C : 1) +static void +cubical_normalization_dlog(pairing_dlog_params_t *pairing_dlog_data, ec_curve_t *curve) +{ + fp2_t t[11]; + ec_basis_t *PQ = &pairing_dlog_data->PQ; + ec_basis_t *RS = &pairing_dlog_data->RS; + fp2_copy(&t[0], &PQ->P.x); + fp2_copy(&t[1], &PQ->P.z); + fp2_copy(&t[2], &PQ->Q.x); + fp2_copy(&t[3], &PQ->Q.z); + fp2_copy(&t[4], &PQ->PmQ.x); + fp2_copy(&t[5], &PQ->PmQ.z); + fp2_copy(&t[6], &RS->P.x); + fp2_copy(&t[7], &RS->P.z); + fp2_copy(&t[8], &RS->Q.x); + fp2_copy(&t[9], &RS->Q.z); + fp2_copy(&t[10], &curve->C); + + fp2_batched_inv(t, 11); + + fp2_mul(&pairing_dlog_data->ixP, &PQ->P.z, &t[0]); + fp2_mul(&PQ->P.x, &PQ->P.x, &t[1]); + fp2_set_one(&PQ->P.z); + + fp2_mul(&pairing_dlog_data->ixQ, &PQ->Q.z, &t[2]); + fp2_mul(&PQ->Q.x, &PQ->Q.x, &t[3]); + fp2_set_one(&PQ->Q.z); + + fp2_mul(&PQ->PmQ.x, &PQ->PmQ.x, &t[5]); + fp2_set_one(&PQ->PmQ.z); + + fp2_mul(&pairing_dlog_data->ixR, &RS->P.z, &t[6]); + fp2_mul(&RS->P.x, &RS->P.x, &t[7]); + fp2_set_one(&RS->P.z); + + fp2_mul(&pairing_dlog_data->ixS, &RS->Q.z, &t[8]); + fp2_mul(&RS->Q.x, &RS->Q.x, &t[9]); + fp2_set_one(&RS->Q.z); + + fp2_mul(&curve->A, &curve->A, &t[10]); + fp2_set_one(&curve->C); +} + +// Given two bases and basis = compute +// x(P - R), x(P - S), x(R - Q), x(S - Q) +static void +compute_difference_points(pairing_dlog_params_t *pairing_dlog_data, ec_curve_t *curve) +{ + jac_point_t xyP, xyQ, xyR, xyS, temp; + + // lifting the two basis points, assumes that x(P) and x(R) + // and the curve itself are normalised to (X : 1) + lift_basis_normalized(&xyP, &xyQ, &pairing_dlog_data->PQ, curve); + lift_basis_normalized(&xyR, &xyS, &pairing_dlog_data->RS, curve); + + // computation of the differences + // x(P - R) + jac_neg(&temp, &xyR); + ADD(&temp, &temp, &xyP, curve); + jac_to_xz(&pairing_dlog_data->diff.PmR, &temp); + + // x(P - S) + jac_neg(&temp, &xyS); + ADD(&temp, &temp, &xyP, curve); + jac_to_xz(&pairing_dlog_data->diff.PmS, &temp); + + // x(R - Q) + jac_neg(&temp, &xyQ); + ADD(&temp, &temp, &xyR, curve); + jac_to_xz(&pairing_dlog_data->diff.RmQ, &temp); + + // x(S - Q) + jac_neg(&temp, &xyQ); + ADD(&temp, &temp, &xyS, curve); + jac_to_xz(&pairing_dlog_data->diff.SmQ, &temp); +} + +// Inline all the Weil pairing computations needed for ec_dlog_2_weil +static void +weil_dlog(digit_t *r1, digit_t *r2, digit_t *s1, digit_t *s2, pairing_dlog_params_t *pairing_dlog_data) +{ + + ec_point_t nP, nQ, nR, nS, nPQ, PnQ, nPR, PnR, nPS, PnS, nRQ, RnQ, nSQ, SnQ; + + copy_point(&nP, &pairing_dlog_data->PQ.P); + copy_point(&nQ, &pairing_dlog_data->PQ.Q); + copy_point(&nR, &pairing_dlog_data->RS.P); + copy_point(&nS, &pairing_dlog_data->RS.Q); + copy_point(&nPQ, &pairing_dlog_data->PQ.PmQ); + copy_point(&PnQ, &pairing_dlog_data->PQ.PmQ); + copy_point(&nPR, &pairing_dlog_data->diff.PmR); + copy_point(&nPS, &pairing_dlog_data->diff.PmS); + copy_point(&PnR, &pairing_dlog_data->diff.PmR); + copy_point(&PnS, &pairing_dlog_data->diff.PmS); + copy_point(&nRQ, &pairing_dlog_data->diff.RmQ); + copy_point(&nSQ, &pairing_dlog_data->diff.SmQ); + copy_point(&RnQ, &pairing_dlog_data->diff.RmQ); + copy_point(&SnQ, &pairing_dlog_data->diff.SmQ); + + for (uint32_t i = 0; i < pairing_dlog_data->e - 1; i++) { + cubicalADD(&nPQ, &nPQ, &nP, &pairing_dlog_data->ixQ); + cubicalADD(&nPR, &nPR, &nP, &pairing_dlog_data->ixR); + cubicalDBLADD(&nPS, &nP, &nPS, &nP, &pairing_dlog_data->ixS, &pairing_dlog_data->A24); + + cubicalADD(&PnQ, &PnQ, &nQ, &pairing_dlog_data->ixP); + cubicalADD(&RnQ, &RnQ, &nQ, &pairing_dlog_data->ixR); + cubicalDBLADD(&SnQ, &nQ, &SnQ, &nQ, &pairing_dlog_data->ixS, &pairing_dlog_data->A24); + + cubicalADD(&PnR, &PnR, &nR, &pairing_dlog_data->ixP); + cubicalDBLADD(&nRQ, &nR, &nRQ, &nR, &pairing_dlog_data->ixQ, &pairing_dlog_data->A24); + + cubicalADD(&PnS, &PnS, &nS, &pairing_dlog_data->ixP); + cubicalDBLADD(&nSQ, &nS, &nSQ, &nS, &pairing_dlog_data->ixQ, &pairing_dlog_data->A24); + } + + // weil(&w0,e,&PQ->P,&PQ->Q,&PQ->PmQ,&A24); + translate(&nPQ, &nP); + translate(&nPR, &nP); + translate(&nPS, &nP); + translate(&PnQ, &nQ); + translate(&RnQ, &nQ); + translate(&SnQ, &nQ); + translate(&PnR, &nR); + translate(&nRQ, &nR); + translate(&PnS, &nS); + translate(&nSQ, &nS); + + translate(&nP, &nP); + translate(&nQ, &nQ); + translate(&nR, &nR); + translate(&nS, &nS); + + // computation of the reference weil pairing + ec_point_t T0, T1; + fp2_t w1[5], w2[5]; + + // e(P, Q) = w0 + point_ratio(&T0, &nPQ, &nP, &pairing_dlog_data->PQ.Q); + point_ratio(&T1, &PnQ, &nQ, &pairing_dlog_data->PQ.P); + // For the first element we need it's inverse for + // fp2_dlog_2e so we swap w1 and w2 here to save inversions + fp2_mul(&w2[0], &T0.x, &T1.z); + fp2_mul(&w1[0], &T1.x, &T0.z); + + // e(P,R) = w0^r2 + point_ratio(&T0, &nPR, &nP, &pairing_dlog_data->RS.P); + point_ratio(&T1, &PnR, &nR, &pairing_dlog_data->PQ.P); + fp2_mul(&w1[1], &T0.x, &T1.z); + fp2_mul(&w2[1], &T1.x, &T0.z); + + // e(R,Q) = w0^r1 + point_ratio(&T0, &nRQ, &nR, &pairing_dlog_data->PQ.Q); + point_ratio(&T1, &RnQ, &nQ, &pairing_dlog_data->RS.P); + fp2_mul(&w1[2], &T0.x, &T1.z); + fp2_mul(&w2[2], &T1.x, &T0.z); + + // e(P,S) = w0^s2 + point_ratio(&T0, &nPS, &nP, &pairing_dlog_data->RS.Q); + point_ratio(&T1, &PnS, &nS, &pairing_dlog_data->PQ.P); + fp2_mul(&w1[3], &T0.x, &T1.z); + fp2_mul(&w2[3], &T1.x, &T0.z); + + // e(S,Q) = w0^s1 + point_ratio(&T0, &nSQ, &nS, &pairing_dlog_data->PQ.Q); + point_ratio(&T1, &SnQ, &nQ, &pairing_dlog_data->RS.Q); + fp2_mul(&w1[4], &T0.x, &T1.z); + fp2_mul(&w2[4], &T1.x, &T0.z); + + fp2_batched_inv(w1, 5); + for (int i = 0; i < 5; i++) { + fp2_mul(&w1[i], &w1[i], &w2[i]); + } + + fp2_dlog_2e(r2, &w1[1], &w1[0], pairing_dlog_data->e); + fp2_dlog_2e(r1, &w1[2], &w1[0], pairing_dlog_data->e); + fp2_dlog_2e(s2, &w1[3], &w1[0], pairing_dlog_data->e); + fp2_dlog_2e(s1, &w1[4], &w1[0], pairing_dlog_data->e); +} + +void +ec_dlog_2_weil(digit_t *r1, + digit_t *r2, + digit_t *s1, + digit_t *s2, + ec_basis_t *PQ, + const ec_basis_t *RS, + ec_curve_t *curve, + int e) +{ + assert(test_point_order_twof(&PQ->Q, curve, e)); + + // precomputing the correct curve data + ec_curve_normalize_A24(curve); + + pairing_dlog_params_t pairing_dlog_data; + pairing_dlog_data.e = e; + pairing_dlog_data.PQ = *PQ; + pairing_dlog_data.RS = *RS; + pairing_dlog_data.A24 = curve->A24; + + cubical_normalization_dlog(&pairing_dlog_data, curve); + compute_difference_points(&pairing_dlog_data, curve); + + weil_dlog(r1, r2, s1, s2, &pairing_dlog_data); + +#ifndef NDEBUG + ec_point_t test; + ec_biscalar_mul(&test, r1, r2, e, PQ, curve); + // R = [r1]P + [r2]Q + assert(ec_is_equal(&test, &RS->P)); + ec_biscalar_mul(&test, s1, s2, e, PQ, curve); + // S = [s1]P + [s2]Q + assert(ec_is_equal(&test, &RS->Q)); +#endif +} + +// Inline all the Tate pairing computations needed for ec_dlog_2_weil +// including reduction, assumes a bases PQ of full E[2^e_full] torsion +// and a bases RS of smaller E[2^e] torsion +static void +tate_dlog_partial(digit_t *r1, digit_t *r2, digit_t *s1, digit_t *s2, pairing_dlog_params_t *pairing_dlog_data) +{ + + uint32_t e_full = TORSION_EVEN_POWER; + uint32_t e_diff = e_full - pairing_dlog_data->e; + + ec_point_t nP, nQ, nR, nS, nPQ, PnR, PnS, nRQ, nSQ; + + copy_point(&nP, &pairing_dlog_data->PQ.P); + copy_point(&nQ, &pairing_dlog_data->PQ.Q); + copy_point(&nR, &pairing_dlog_data->RS.P); + copy_point(&nS, &pairing_dlog_data->RS.Q); + copy_point(&nPQ, &pairing_dlog_data->PQ.PmQ); + copy_point(&PnR, &pairing_dlog_data->diff.PmR); + copy_point(&PnS, &pairing_dlog_data->diff.PmS); + copy_point(&nRQ, &pairing_dlog_data->diff.RmQ); + copy_point(&nSQ, &pairing_dlog_data->diff.SmQ); + + for (uint32_t i = 0; i < e_full - 1; i++) { + cubicalDBLADD(&nPQ, &nP, &nPQ, &nP, &pairing_dlog_data->ixQ, &pairing_dlog_data->A24); + } + + for (uint32_t i = 0; i < pairing_dlog_data->e - 1; i++) { + cubicalADD(&PnR, &PnR, &nR, &pairing_dlog_data->ixP); + cubicalDBLADD(&nRQ, &nR, &nRQ, &nR, &pairing_dlog_data->ixQ, &pairing_dlog_data->A24); + + cubicalADD(&PnS, &PnS, &nS, &pairing_dlog_data->ixP); + cubicalDBLADD(&nSQ, &nS, &nSQ, &nS, &pairing_dlog_data->ixQ, &pairing_dlog_data->A24); + } + + translate(&nPQ, &nP); + translate(&PnR, &nR); + translate(&nRQ, &nR); + translate(&PnS, &nS); + translate(&nSQ, &nS); + + translate(&nP, &nP); + translate(&nQ, &nQ); + translate(&nR, &nR); + translate(&nS, &nS); + + // computation of the reference Tate pairing + ec_point_t T0; + fp2_t w1[5], w2[5]; + + // t(P, Q)^(2^e_diff) = w0 + point_ratio(&T0, &nPQ, &nP, &pairing_dlog_data->PQ.Q); + fp2_copy(&w1[0], &T0.x); + fp2_copy(&w2[0], &T0.z); + + // t(R,P) = w0^r2 + point_ratio(&T0, &PnR, &nR, &pairing_dlog_data->PQ.P); + fp2_copy(&w1[1], &T0.x); + fp2_copy(&w2[1], &T0.z); + + // t(R,Q) = w0^r1 + point_ratio(&T0, &nRQ, &nR, &pairing_dlog_data->PQ.Q); + fp2_copy(&w2[2], &T0.x); + fp2_copy(&w1[2], &T0.z); + + // t(S,P) = w0^s2 + point_ratio(&T0, &PnS, &nS, &pairing_dlog_data->PQ.P); + fp2_copy(&w1[3], &T0.x); + fp2_copy(&w2[3], &T0.z); + + // t(S,Q) = w0^s1 + point_ratio(&T0, &nSQ, &nS, &pairing_dlog_data->PQ.Q); + fp2_copy(&w2[4], &T0.x); + fp2_copy(&w1[4], &T0.z); + + // batched reduction using projective representation + for (int i = 0; i < 5; i++) { + fp2_t frob, tmp; + fp2_copy(&tmp, &w1[i]); + // inline frobenius for ^p + // multiply by inverse to get ^(p-1) + fp2_frob(&frob, &w1[i]); + fp2_mul(&w1[i], &w2[i], &frob); + + // repeat for denom + fp2_frob(&frob, &w2[i]); + fp2_mul(&w2[i], &tmp, &frob); + } + + // batched normalization + fp2_batched_inv(w2, 5); + for (int i = 0; i < 5; i++) { + fp2_mul(&w1[i], &w1[i], &w2[i]); + } + + for (int i = 0; i < 5; i++) { + clear_cofac(&w1[i], &w1[i]); + + // removes 2^e_diff + for (uint32_t j = 0; j < e_diff; j++) { + fp2_sqr(&w1[i], &w1[i]); + } + } + + fp2_dlog_2e(r2, &w1[1], &w1[0], pairing_dlog_data->e); + fp2_dlog_2e(r1, &w1[2], &w1[0], pairing_dlog_data->e); + fp2_dlog_2e(s2, &w1[3], &w1[0], pairing_dlog_data->e); + fp2_dlog_2e(s1, &w1[4], &w1[0], pairing_dlog_data->e); +} + +void +ec_dlog_2_tate(digit_t *r1, + digit_t *r2, + digit_t *s1, + digit_t *s2, + const ec_basis_t *PQ, + const ec_basis_t *RS, + ec_curve_t *curve, + int e) +{ + // assume PQ is a full torsion basis + // returns a, b, c, d such that R = [a]P + [b]Q, S = [c]P + [d]Q + +#ifndef NDEBUG + int e_full = TORSION_EVEN_POWER; + int e_diff = e_full - e; +#endif + assert(test_basis_order_twof(PQ, curve, e_full)); + + // precomputing the correct curve data + ec_curve_normalize_A24(curve); + + pairing_dlog_params_t pairing_dlog_data; + pairing_dlog_data.e = e; + pairing_dlog_data.PQ = *PQ; + pairing_dlog_data.RS = *RS; + pairing_dlog_data.A24 = curve->A24; + + cubical_normalization_dlog(&pairing_dlog_data, curve); + compute_difference_points(&pairing_dlog_data, curve); + tate_dlog_partial(r1, r2, s1, s2, &pairing_dlog_data); + +#ifndef NDEBUG + ec_point_t test; + ec_biscalar_mul(&test, r1, r2, e, PQ, curve); + ec_dbl_iter(&test, e_diff, &test, curve); + // R = [r1]P + [r2]Q + assert(ec_is_equal(&test, &RS->P)); + + ec_biscalar_mul(&test, s1, s2, e, PQ, curve); + ec_dbl_iter(&test, e_diff, &test, curve); + // S = [s1]P + [s2]Q + assert(ec_is_equal(&test, &RS->Q)); +#endif +} diff --git a/src/ec/ref/lvlx/ec.c b/src/ec/ref/lvlx/ec.c new file mode 100644 index 0000000..be4e4e5 --- /dev/null +++ b/src/ec/ref/lvlx/ec.c @@ -0,0 +1,665 @@ +#include +#include +#include +#include + +void +ec_point_init(ec_point_t *P) +{ // Initialize point as identity element (1:0) + fp2_set_one(&(P->x)); + fp2_set_zero(&(P->z)); +} + +void +ec_curve_init(ec_curve_t *E) +{ // Initialize the curve struct + // Initialize the constants + fp2_set_zero(&(E->A)); + fp2_set_one(&(E->C)); + + // Initialize the point (A+2 : 4C) + ec_point_init(&(E->A24)); + + // Set the bool to be false by default + E->is_A24_computed_and_normalized = false; +} + +void +select_point(ec_point_t *Q, const ec_point_t *P1, const ec_point_t *P2, const digit_t option) +{ // Select points in constant time + // If option = 0 then Q <- P1, else if option = 0xFF...FF then Q <- P2 + fp2_select(&(Q->x), &(P1->x), &(P2->x), option); + fp2_select(&(Q->z), &(P1->z), &(P2->z), option); +} + +void +cswap_points(ec_point_t *P, ec_point_t *Q, const digit_t option) +{ // Swap points in constant time + // If option = 0 then P <- P and Q <- Q, else if option = 0xFF...FF then P <- Q and Q <- P + fp2_cswap(&(P->x), &(Q->x), option); + fp2_cswap(&(P->z), &(Q->z), option); +} + +void +ec_normalize_point(ec_point_t *P) +{ + fp2_inv(&P->z); + fp2_mul(&P->x, &P->x, &P->z); + fp2_set_one(&(P->z)); +} + +void +ec_normalize_curve(ec_curve_t *E) +{ + fp2_inv(&E->C); + fp2_mul(&E->A, &E->A, &E->C); + fp2_set_one(&E->C); +} + +void +ec_curve_normalize_A24(ec_curve_t *E) +{ + if (!E->is_A24_computed_and_normalized) { + AC_to_A24(&E->A24, E); + ec_normalize_point(&E->A24); + E->is_A24_computed_and_normalized = true; + } + assert(fp2_is_one(&E->A24.z)); +} + +void +ec_normalize_curve_and_A24(ec_curve_t *E) +{ // Neither the curve or A24 are guaranteed to be normalized. + // First we normalize (A/C : 1) and conditionally compute + if (!fp2_is_one(&E->C)) { + ec_normalize_curve(E); + } + + if (!E->is_A24_computed_and_normalized) { + // Now compute A24 = ((A + 2) / 4 : 1) + fp2_add_one(&E->A24.x, &E->A); // re(A24.x) = re(A) + 1 + fp2_add_one(&E->A24.x, &E->A24.x); // re(A24.x) = re(A) + 2 + fp_copy(&E->A24.x.im, &E->A.im); // im(A24.x) = im(A) + + fp2_half(&E->A24.x, &E->A24.x); // (A + 2) / 2 + fp2_half(&E->A24.x, &E->A24.x); // (A + 2) / 4 + fp2_set_one(&E->A24.z); + + E->is_A24_computed_and_normalized = true; + } +} + +uint32_t +ec_is_zero(const ec_point_t *P) +{ + return fp2_is_zero(&P->z); +} + +uint32_t +ec_has_zero_coordinate(const ec_point_t *P) +{ + return fp2_is_zero(&P->x) | fp2_is_zero(&P->z); +} + +uint32_t +ec_is_equal(const ec_point_t *P, const ec_point_t *Q) +{ // Evaluate if two points in Montgomery coordinates (X:Z) are equal + // Returns 0xFFFFFFFF (true) if P=Q, 0 (false) otherwise + fp2_t t0, t1; + + // Check if P, Q are the points at infinity + uint32_t l_zero = ec_is_zero(P); + uint32_t r_zero = ec_is_zero(Q); + + // Check if PX * QZ = QX * PZ + fp2_mul(&t0, &P->x, &Q->z); + fp2_mul(&t1, &P->z, &Q->x); + uint32_t lr_equal = fp2_is_equal(&t0, &t1); + + // Points are equal if + // - Both are zero, or + // - neither are zero AND PX * QZ = QX * PZ + return (l_zero & r_zero) | (~l_zero & ~r_zero * lr_equal); +} + +uint32_t +ec_is_two_torsion(const ec_point_t *P, const ec_curve_t *E) +{ + if (ec_is_zero(P)) + return 0; + + uint32_t x_is_zero, tmp_is_zero; + fp2_t t0, t1, t2; + fp2_add(&t0, &P->x, &P->z); + fp2_sqr(&t0, &t0); + fp2_sub(&t1, &P->x, &P->z); + fp2_sqr(&t1, &t1); + fp2_sub(&t2, &t0, &t1); + fp2_add(&t1, &t0, &t1); + fp2_mul(&t2, &t2, &E->A); + fp2_mul(&t1, &t1, &E->C); + fp2_add(&t1, &t1, &t1); + fp2_add(&t0, &t1, &t2); // 4 (CX^2+CZ^2+AXZ) + + x_is_zero = fp2_is_zero(&P->x); + tmp_is_zero = fp2_is_zero(&t0); + + // two torsion if x or x^2 + Ax + 1 is zero + return x_is_zero | tmp_is_zero; +} + +uint32_t +ec_is_four_torsion(const ec_point_t *P, const ec_curve_t *E) +{ + ec_point_t test; + xDBL_A24(&test, P, &E->A24, E->is_A24_computed_and_normalized); + return ec_is_two_torsion(&test, E); +} + +uint32_t +ec_is_basis_four_torsion(const ec_basis_t *B, const ec_curve_t *E) +{ // Check if basis points (P, Q) form a full 2^t-basis + ec_point_t P2, Q2; + xDBL_A24(&P2, &B->P, &E->A24, E->is_A24_computed_and_normalized); + xDBL_A24(&Q2, &B->Q, &E->A24, E->is_A24_computed_and_normalized); + return (ec_is_two_torsion(&P2, E) & ec_is_two_torsion(&Q2, E) & ~ec_is_equal(&P2, &Q2)); +} + +int +ec_curve_verify_A(const fp2_t *A) +{ // Verify the Montgomery coefficient A is valid (A^2-4 \ne 0) + // Return 1 if curve is valid, 0 otherwise + fp2_t t; + fp2_set_one(&t); + fp_add(&t.re, &t.re, &t.re); // t=2 + if (fp2_is_equal(A, &t)) + return 0; + fp_neg(&t.re, &t.re); // t=-2 + if (fp2_is_equal(A, &t)) + return 0; + return 1; +} + +int +ec_curve_init_from_A(ec_curve_t *E, const fp2_t *A) +{ // Initialize the curve from the A coefficient and check it is valid + // Return 1 if curve is valid, 0 otherwise + ec_curve_init(E); + fp2_copy(&E->A, A); // Set A + return ec_curve_verify_A(A); +} + +void +ec_j_inv(fp2_t *j_inv, const ec_curve_t *curve) +{ // j-invariant computation for Montgommery coefficient A2=(A+2C:4C) + fp2_t t0, t1; + + fp2_sqr(&t1, &curve->C); + fp2_sqr(j_inv, &curve->A); + fp2_add(&t0, &t1, &t1); + fp2_sub(&t0, j_inv, &t0); + fp2_sub(&t0, &t0, &t1); + fp2_sub(j_inv, &t0, &t1); + fp2_sqr(&t1, &t1); + fp2_mul(j_inv, j_inv, &t1); + fp2_add(&t0, &t0, &t0); + fp2_add(&t0, &t0, &t0); + fp2_sqr(&t1, &t0); + fp2_mul(&t0, &t0, &t1); + fp2_add(&t0, &t0, &t0); + fp2_add(&t0, &t0, &t0); + fp2_inv(j_inv); + fp2_mul(j_inv, &t0, j_inv); +} + +void +xDBL_E0(ec_point_t *Q, const ec_point_t *P) +{ // Doubling of a Montgomery point in projective coordinates (X:Z) on the curve E0 with (A:C) = (0:1). + // Input: projective Montgomery x-coordinates P = (XP:ZP), where xP=XP/ZP, and Montgomery curve constants (A:C) = (0:1). + // Output: projective Montgomery x-coordinates Q <- 2*P = (XQ:ZQ) such that x(2P)=XQ/ZQ. + fp2_t t0, t1, t2; + + fp2_add(&t0, &P->x, &P->z); + fp2_sqr(&t0, &t0); + fp2_sub(&t1, &P->x, &P->z); + fp2_sqr(&t1, &t1); + fp2_sub(&t2, &t0, &t1); + fp2_add(&t1, &t1, &t1); + fp2_mul(&Q->x, &t0, &t1); + fp2_add(&Q->z, &t1, &t2); + fp2_mul(&Q->z, &Q->z, &t2); +} + +void +xDBL(ec_point_t *Q, const ec_point_t *P, const ec_point_t *AC) +{ // Doubling of a Montgomery point in projective coordinates (X:Z). Computation of coefficient values A+2C and 4C + // on-the-fly. + // Input: projective Montgomery x-coordinates P = (XP:ZP), where xP=XP/ZP, and Montgomery curve constants (A:C). + // Output: projective Montgomery x-coordinates Q <- 2*P = (XQ:ZQ) such that x(2P)=XQ/ZQ. + fp2_t t0, t1, t2, t3; + + fp2_add(&t0, &P->x, &P->z); + fp2_sqr(&t0, &t0); + fp2_sub(&t1, &P->x, &P->z); + fp2_sqr(&t1, &t1); + fp2_sub(&t2, &t0, &t1); + fp2_add(&t3, &AC->z, &AC->z); + fp2_mul(&t1, &t1, &t3); + fp2_add(&t1, &t1, &t1); + fp2_mul(&Q->x, &t0, &t1); + fp2_add(&t0, &t3, &AC->x); + fp2_mul(&t0, &t0, &t2); + fp2_add(&t0, &t0, &t1); + fp2_mul(&Q->z, &t0, &t2); +} + +void +xDBL_A24(ec_point_t *Q, const ec_point_t *P, const ec_point_t *A24, const bool A24_normalized) +{ // Doubling of a Montgomery point in projective coordinates (X:Z). + // Input: projective Montgomery x-coordinates P = (XP:ZP), where xP=XP/ZP, and + // the Montgomery curve constants A24 = (A+2C:4C) (or A24 = (A+2C/4C:1) if normalized). + // Output: projective Montgomery x-coordinates Q <- 2*P = (XQ:ZQ) such that x(2P)=XQ/ZQ. + fp2_t t0, t1, t2; + + fp2_add(&t0, &P->x, &P->z); + fp2_sqr(&t0, &t0); + fp2_sub(&t1, &P->x, &P->z); + fp2_sqr(&t1, &t1); + fp2_sub(&t2, &t0, &t1); + if (!A24_normalized) + fp2_mul(&t1, &t1, &A24->z); + fp2_mul(&Q->x, &t0, &t1); + fp2_mul(&t0, &t2, &A24->x); + fp2_add(&t0, &t0, &t1); + fp2_mul(&Q->z, &t0, &t2); +} + +void +xADD(ec_point_t *R, const ec_point_t *P, const ec_point_t *Q, const ec_point_t *PQ) +{ // Differential addition of Montgomery points in projective coordinates (X:Z). + // Input: projective Montgomery points P=(XP:ZP) and Q=(XQ:ZQ) such that xP=XP/ZP and xQ=XQ/ZQ, and difference + // PQ=P-Q=(XPQ:ZPQ). + // Output: projective Montgomery point R <- P+Q = (XR:ZR) such that x(P+Q)=XR/ZR. + fp2_t t0, t1, t2, t3; + + fp2_add(&t0, &P->x, &P->z); + fp2_sub(&t1, &P->x, &P->z); + fp2_add(&t2, &Q->x, &Q->z); + fp2_sub(&t3, &Q->x, &Q->z); + fp2_mul(&t0, &t0, &t3); + fp2_mul(&t1, &t1, &t2); + fp2_add(&t2, &t0, &t1); + fp2_sub(&t3, &t0, &t1); + fp2_sqr(&t2, &t2); + fp2_sqr(&t3, &t3); + fp2_mul(&t2, &PQ->z, &t2); + fp2_mul(&R->z, &PQ->x, &t3); + fp2_copy(&R->x, &t2); +} + +void +xDBLADD(ec_point_t *R, + ec_point_t *S, + const ec_point_t *P, + const ec_point_t *Q, + const ec_point_t *PQ, + const ec_point_t *A24, + const bool A24_normalized) +{ // Simultaneous doubling and differential addition. + // Input: projective Montgomery points P=(XP:ZP) and Q=(XQ:ZQ) such that xP=XP/ZP and xQ=XQ/ZQ, the difference + // PQ=P-Q=(XPQ:ZPQ), and the Montgomery curve constants A24 = (A+2C:4C) (or A24 = (A+2C/4C:1) if normalized). + // Output: projective Montgomery points R <- 2*P = (XR:ZR) such that x(2P)=XR/ZR, and S <- P+Q = (XS:ZS) such that = + // x(Q+P)=XS/ZS. + fp2_t t0, t1, t2; + + fp2_add(&t0, &P->x, &P->z); + fp2_sub(&t1, &P->x, &P->z); + fp2_sqr(&R->x, &t0); + fp2_sub(&t2, &Q->x, &Q->z); + fp2_add(&S->x, &Q->x, &Q->z); + fp2_mul(&t0, &t0, &t2); + fp2_sqr(&R->z, &t1); + fp2_mul(&t1, &t1, &S->x); + fp2_sub(&t2, &R->x, &R->z); + if (!A24_normalized) + fp2_mul(&R->z, &R->z, &A24->z); + fp2_mul(&R->x, &R->x, &R->z); + fp2_mul(&S->x, &A24->x, &t2); + fp2_sub(&S->z, &t0, &t1); + fp2_add(&R->z, &R->z, &S->x); + fp2_add(&S->x, &t0, &t1); + fp2_mul(&R->z, &R->z, &t2); + fp2_sqr(&S->z, &S->z); + fp2_sqr(&S->x, &S->x); + fp2_mul(&S->z, &S->z, &PQ->x); + fp2_mul(&S->x, &S->x, &PQ->z); +} + +void +xMUL(ec_point_t *Q, const ec_point_t *P, const digit_t *k, const int kbits, const ec_curve_t *curve) +{ // The Montgomery ladder + // Input: projective Montgomery point P=(XP:ZP) such that xP=XP/ZP, a scalar k of bitlength kbits, and + // the Montgomery curve constants (A:C) (or A24 = (A+2C/4C:1) if normalized). + // Output: projective Montgomery points Q <- k*P = (XQ:ZQ) such that x(k*P)=XQ/ZQ. + ec_point_t R0, R1, A24; + digit_t mask; + unsigned int bit, prevbit = 0, swap; + + if (!curve->is_A24_computed_and_normalized) { + // Computation of A24=(A+2C:4C) + fp2_add(&A24.x, &curve->C, &curve->C); + fp2_add(&A24.z, &A24.x, &A24.x); + fp2_add(&A24.x, &A24.x, &curve->A); + } else { + fp2_copy(&A24.x, &curve->A24.x); + fp2_copy(&A24.z, &curve->A24.z); + // Assert A24 has been normalised + assert(fp2_is_one(&A24.z)); + } + + // R0 <- (1:0), R1 <- P + ec_point_init(&R0); + fp2_copy(&R1.x, &P->x); + fp2_copy(&R1.z, &P->z); + + // Main loop + for (int i = kbits - 1; i >= 0; i--) { + bit = (k[i >> LOG2RADIX] >> (i & (RADIX - 1))) & 1; + swap = bit ^ prevbit; + prevbit = bit; + mask = 0 - (digit_t)swap; + + cswap_points(&R0, &R1, mask); + xDBLADD(&R0, &R1, &R0, &R1, P, &A24, true); + } + swap = 0 ^ prevbit; + mask = 0 - (digit_t)swap; + cswap_points(&R0, &R1, mask); + + fp2_copy(&Q->x, &R0.x); + fp2_copy(&Q->z, &R0.z); +} + +int +xDBLMUL(ec_point_t *S, + const ec_point_t *P, + const digit_t *k, + const ec_point_t *Q, + const digit_t *l, + const ec_point_t *PQ, + const int kbits, + const ec_curve_t *curve) +{ // The Montgomery biladder + // Input: projective Montgomery points P=(XP:ZP) and Q=(XQ:ZQ) such that xP=XP/ZP and xQ=XQ/ZQ, scalars k and l of + // bitlength kbits, the difference PQ=P-Q=(XPQ:ZPQ), and the Montgomery curve constants (A:C). + // Output: projective Montgomery point S <- k*P + l*Q = (XS:ZS) such that x(k*P + l*Q)=XS/ZS. + + int i, A_is_zero; + digit_t evens, mevens, bitk0, bitl0, maskk, maskl, temp, bs1_ip1, bs2_ip1, bs1_i, bs2_i, h; + digit_t sigma[2] = { 0 }, pre_sigma = 0; + digit_t k_t[NWORDS_ORDER], l_t[NWORDS_ORDER], one[NWORDS_ORDER] = { 0 }, r[2 * BITS] = { 0 }; + ec_point_t DIFF1a, DIFF1b, DIFF2a, DIFF2b, R[3] = { 0 }, T[3]; + + // differential additions formulas are invalid in this case + if (ec_has_zero_coordinate(P) | ec_has_zero_coordinate(Q) | ec_has_zero_coordinate(PQ)) + return 0; + + // Derive sigma according to parity + bitk0 = (k[0] & 1); + bitl0 = (l[0] & 1); + maskk = 0 - bitk0; // Parity masks: 0 if even, otherwise 1...1 + maskl = 0 - bitl0; + sigma[0] = (bitk0 ^ 1); + sigma[1] = (bitl0 ^ 1); + evens = sigma[0] + sigma[1]; // Count number of even scalars + mevens = 0 - (evens & 1); // Mask mevens <- 0 if # even of scalars = 0 or 2, otherwise mevens = 1...1 + + // If k and l are both even or both odd, pick sigma = (0,1) + sigma[0] = (sigma[0] & mevens); + sigma[1] = (sigma[1] & mevens) | (1 & ~mevens); + + // Convert even scalars to odd + one[0] = 1; + mp_sub(k_t, k, one, NWORDS_ORDER); + mp_sub(l_t, l, one, NWORDS_ORDER); + select_ct(k_t, k_t, k, maskk, NWORDS_ORDER); + select_ct(l_t, l_t, l, maskl, NWORDS_ORDER); + + // Scalar recoding + for (i = 0; i < kbits; i++) { + // If sigma[0] = 1 swap k_t and l_t + maskk = 0 - (sigma[0] ^ pre_sigma); + swap_ct(k_t, l_t, maskk, NWORDS_ORDER); + + if (i == kbits - 1) { + bs1_ip1 = 0; + bs2_ip1 = 0; + } else { + bs1_ip1 = mp_shiftr(k_t, 1, NWORDS_ORDER); + bs2_ip1 = mp_shiftr(l_t, 1, NWORDS_ORDER); + } + bs1_i = k_t[0] & 1; + bs2_i = l_t[0] & 1; + + r[2 * i] = bs1_i ^ bs1_ip1; + r[2 * i + 1] = bs2_i ^ bs2_ip1; + + // Revert sigma if second bit, r_(2i+1), is 1 + pre_sigma = sigma[0]; + maskk = 0 - r[2 * i + 1]; + select_ct(&temp, &sigma[0], &sigma[1], maskk, 1); + select_ct(&sigma[1], &sigma[1], &sigma[0], maskk, 1); + sigma[0] = temp; + } + + // Point initialization + ec_point_init(&R[0]); + maskk = 0 - sigma[0]; + select_point(&R[1], P, Q, maskk); + select_point(&R[2], Q, P, maskk); + + fp2_copy(&DIFF1a.x, &R[1].x); + fp2_copy(&DIFF1a.z, &R[1].z); + fp2_copy(&DIFF1b.x, &R[2].x); + fp2_copy(&DIFF1b.z, &R[2].z); + + // Initialize DIFF2a <- P+Q, DIFF2b <- P-Q + xADD(&R[2], &R[1], &R[2], PQ); + if (ec_has_zero_coordinate(&R[2])) + return 0; // non valid formulas + + fp2_copy(&DIFF2a.x, &R[2].x); + fp2_copy(&DIFF2a.z, &R[2].z); + fp2_copy(&DIFF2b.x, &PQ->x); + fp2_copy(&DIFF2b.z, &PQ->z); + + A_is_zero = fp2_is_zero(&curve->A); + + // Main loop + for (i = kbits - 1; i >= 0; i--) { + h = r[2 * i] + r[2 * i + 1]; // in {0, 1, 2} + maskk = 0 - (h & 1); + select_point(&T[0], &R[0], &R[1], maskk); + maskk = 0 - (h >> 1); + select_point(&T[0], &T[0], &R[2], maskk); + if (A_is_zero) { + xDBL_E0(&T[0], &T[0]); + } else { + assert(fp2_is_one(&curve->A24.z)); + xDBL_A24(&T[0], &T[0], &curve->A24, true); + } + + maskk = 0 - r[2 * i + 1]; // in {0, 1} + select_point(&T[1], &R[0], &R[1], maskk); + select_point(&T[2], &R[1], &R[2], maskk); + + cswap_points(&DIFF1a, &DIFF1b, maskk); + xADD(&T[1], &T[1], &T[2], &DIFF1a); + xADD(&T[2], &R[0], &R[2], &DIFF2a); + + // If hw (mod 2) = 1 then swap DIFF2a and DIFF2b + maskk = 0 - (h & 1); + cswap_points(&DIFF2a, &DIFF2b, maskk); + + // R <- T + copy_point(&R[0], &T[0]); + copy_point(&R[1], &T[1]); + copy_point(&R[2], &T[2]); + } + + // Output R[evens] + select_point(S, &R[0], &R[1], mevens); + + maskk = 0 - (bitk0 & bitl0); + select_point(S, S, &R[2], maskk); + return 1; +} + +int +ec_ladder3pt(ec_point_t *R, + const digit_t *m, + const ec_point_t *P, + const ec_point_t *Q, + const ec_point_t *PQ, + const ec_curve_t *E) +{ // The 3-point Montgomery ladder + // Input: projective Montgomery points P=(XP:ZP) and Q=(XQ:ZQ) such that xP=XP/ZP and xQ=XQ/ZQ, a scalar k of + // bitlength kbits, the difference PQ=P-Q=(XPQ:ZPQ), and the Montgomery curve constants A24 = (A+2C/4C:1). + // Output: projective Montgomery point R <- P + m*Q = (XR:ZR) such that x(P + m*Q)=XR/ZR. + assert(E->is_A24_computed_and_normalized); + if (!fp2_is_one(&E->A24.z)) { + return 0; + } + // Formulas are not valid in that case + if (ec_has_zero_coordinate(PQ)) { + return 0; + } + + ec_point_t X0, X1, X2; + copy_point(&X0, Q); + copy_point(&X1, P); + copy_point(&X2, PQ); + + int i, j; + digit_t t; + for (i = 0; i < NWORDS_ORDER; i++) { + t = 1; + for (j = 0; j < RADIX; j++) { + cswap_points(&X1, &X2, -((t & m[i]) == 0)); + xDBLADD(&X0, &X1, &X0, &X1, &X2, &E->A24, true); + cswap_points(&X1, &X2, -((t & m[i]) == 0)); + t <<= 1; + }; + }; + copy_point(R, &X1); + return 1; +} + +// WRAPPERS to export + +void +ec_dbl(ec_point_t *res, const ec_point_t *P, const ec_curve_t *curve) +{ + // If A24 = ((A+2)/4 : 1) we save multiplications + if (curve->is_A24_computed_and_normalized) { + assert(fp2_is_one(&curve->A24.z)); + xDBL_A24(res, P, &curve->A24, true); + } else { + // Otherwise we compute A24 on the fly for doubling + xDBL(res, P, (const ec_point_t *)curve); + } +} + +void +ec_dbl_iter(ec_point_t *res, int n, const ec_point_t *P, ec_curve_t *curve) +{ + if (n == 0) { + copy_point(res, P); + return; + } + + // When the chain is long enough, we should normalise A24 + if (n > 50) { + ec_curve_normalize_A24(curve); + } + + // When A24 is normalized we can save some multiplications + if (curve->is_A24_computed_and_normalized) { + assert(fp2_is_one(&curve->A24.z)); + xDBL_A24(res, P, &curve->A24, true); + for (int i = 0; i < n - 1; i++) { + assert(fp2_is_one(&curve->A24.z)); + xDBL_A24(res, res, &curve->A24, true); + } + } else { + // Otherwise we do normal doubling + xDBL(res, P, (const ec_point_t *)curve); + for (int i = 0; i < n - 1; i++) { + xDBL(res, res, (const ec_point_t *)curve); + } + } +} + +void +ec_dbl_iter_basis(ec_basis_t *res, int n, const ec_basis_t *B, ec_curve_t *curve) +{ + ec_dbl_iter(&res->P, n, &B->P, curve); + ec_dbl_iter(&res->Q, n, &B->Q, curve); + ec_dbl_iter(&res->PmQ, n, &B->PmQ, curve); +} + +void +ec_mul(ec_point_t *res, const digit_t *scalar, const int kbits, const ec_point_t *P, ec_curve_t *curve) +{ + // For large scalars it's worth normalising anyway + if (kbits > 50) { + ec_curve_normalize_A24(curve); + } + + // When A24 is computed and normalized we save some Fp2 multiplications + xMUL(res, P, scalar, kbits, curve); +} + +int +ec_biscalar_mul(ec_point_t *res, + const digit_t *scalarP, + const digit_t *scalarQ, + const int kbits, + const ec_basis_t *PQ, + const ec_curve_t *curve) +{ + if (fp2_is_zero(&PQ->PmQ.z)) + return 0; + + /* Differential additions behave badly when PmQ = (0:1), so we need to + * treat this case specifically. Since we assume P, Q are a basis, this + * can happen only if kbits==1 */ + if (kbits == 1) { + // Sanity check: our basis should be given by 2-torsion points + if (!ec_is_two_torsion(&PQ->P, curve) || !ec_is_two_torsion(&PQ->Q, curve) || + !ec_is_two_torsion(&PQ->PmQ, curve)) + return 0; + digit_t bP, bQ; + bP = (scalarP[0] & 1); + bQ = (scalarQ[0] & 1); + if (bP == 0 && bQ == 0) + ec_point_init(res); //(1: 0) + else if (bP == 1 && bQ == 0) + copy_point(res, &PQ->P); + else if (bP == 0 && bQ == 1) + copy_point(res, &PQ->Q); + else if (bP == 1 && bQ == 1) + copy_point(res, &PQ->PmQ); + else // should never happen + assert(0); + return 1; + } else { + ec_curve_t E; + copy_curve(&E, curve); + + if (!fp2_is_zero(&curve->A)) { // If A is not zero normalize + ec_curve_normalize_A24(&E); + } + return xDBLMUL(res, &PQ->P, scalarP, &PQ->Q, scalarQ, &PQ->PmQ, kbits, (const ec_curve_t *)&E); + } +} diff --git a/src/ec/ref/lvlx/ec_jac.c b/src/ec/ref/lvlx/ec_jac.c new file mode 100644 index 0000000..20ca68c --- /dev/null +++ b/src/ec/ref/lvlx/ec_jac.c @@ -0,0 +1,335 @@ +#include +#include + +void +jac_init(jac_point_t *P) +{ // Initialize Montgomery in Jacobian coordinates as identity element (0:1:0) + fp2_set_zero(&P->x); + fp2_set_one(&P->y); + fp2_set_zero(&P->z); +} + +uint32_t +jac_is_equal(const jac_point_t *P, const jac_point_t *Q) +{ // Evaluate if two points in Jacobian coordinates (X:Y:Z) are equal + // Returns 1 (true) if P=Q, 0 (false) otherwise + fp2_t t0, t1, t2, t3; + + fp2_sqr(&t0, &Q->z); + fp2_mul(&t2, &P->x, &t0); // x1*z2^2 + fp2_sqr(&t1, &P->z); + fp2_mul(&t3, &Q->x, &t1); // x2*z1^2 + fp2_sub(&t2, &t2, &t3); + + fp2_mul(&t0, &t0, &Q->z); + fp2_mul(&t0, &P->y, &t0); // y1*z2^3 + fp2_mul(&t1, &t1, &P->z); + fp2_mul(&t1, &Q->y, &t1); // y2*z1^3 + fp2_sub(&t0, &t0, &t1); + + return fp2_is_zero(&t0) & fp2_is_zero(&t2); +} + +void +jac_to_xz(ec_point_t *P, const jac_point_t *xyP) +{ + fp2_copy(&P->x, &xyP->x); + fp2_copy(&P->z, &xyP->z); + fp2_sqr(&P->z, &P->z); + + // If xyP = (0:1:0), we currently have P=(0 : 0) but we want to set P=(1:0) + uint32_t c1, c2; + fp2_t one; + fp2_set_one(&one); + + c1 = fp2_is_zero(&P->x); + c2 = fp2_is_zero(&P->z); + fp2_select(&P->x, &P->x, &one, c1 & c2); +} + +void +jac_to_ws(jac_point_t *Q, fp2_t *t, fp2_t *ao3, const jac_point_t *P, const ec_curve_t *curve) +{ + // Cost of 3M + 2S when A != 0. + fp_t one; + fp2_t a; + /* a = 1 - A^2/3, U = X + (A*Z^2)/3, V = Y, W = Z, T = a*Z^4*/ + fp_set_one(&one); + if (!fp2_is_zero(&(curve->A))) { + fp_div3(&(ao3->re), &(curve->A.re)); + fp_div3(&(ao3->im), &(curve->A.im)); + fp2_sqr(t, &P->z); + fp2_mul(&Q->x, ao3, t); + fp2_add(&Q->x, &Q->x, &P->x); + fp2_sqr(t, t); + fp2_mul(&a, ao3, &(curve->A)); + fp_sub(&(a.re), &one, &(a.re)); + fp_neg(&(a.im), &(a.im)); + fp2_mul(t, t, &a); + } else { + fp2_copy(&Q->x, &P->x); + fp2_sqr(t, &P->z); + fp2_sqr(t, t); + } + fp2_copy(&Q->y, &P->y); + fp2_copy(&Q->z, &P->z); +} + +void +jac_from_ws(jac_point_t *Q, const jac_point_t *P, const fp2_t *ao3, const ec_curve_t *curve) +{ + // Cost of 1M + 1S when A != 0. + fp2_t t; + /* X = U - (A*W^2)/3, Y = V, Z = W. */ + if (!fp2_is_zero(&(curve->A))) { + fp2_sqr(&t, &P->z); + fp2_mul(&t, &t, ao3); + fp2_sub(&Q->x, &P->x, &t); + } + fp2_copy(&Q->y, &P->y); + fp2_copy(&Q->z, &P->z); +} + +void +copy_jac_point(jac_point_t *P, const jac_point_t *Q) +{ + fp2_copy(&(P->x), &(Q->x)); + fp2_copy(&(P->y), &(Q->y)); + fp2_copy(&(P->z), &(Q->z)); +} + +void +jac_neg(jac_point_t *Q, const jac_point_t *P) +{ + fp2_copy(&Q->x, &P->x); + fp2_neg(&Q->y, &P->y); + fp2_copy(&Q->z, &P->z); +} + +void +DBL(jac_point_t *Q, const jac_point_t *P, const ec_curve_t *AC) +{ // Cost of 6M + 6S. + // Doubling on a Montgomery curve, representation in Jacobian coordinates (X:Y:Z) corresponding to + // (X/Z^2,Y/Z^3) This version receives the coefficient value A + fp2_t t0, t1, t2, t3; + + uint32_t flag = fp2_is_zero(&P->x) & fp2_is_zero(&P->z); + + fp2_sqr(&t0, &P->x); // t0 = x1^2 + fp2_add(&t1, &t0, &t0); + fp2_add(&t0, &t0, &t1); // t0 = 3x1^2 + fp2_sqr(&t1, &P->z); // t1 = z1^2 + fp2_mul(&t2, &P->x, &AC->A); + fp2_add(&t2, &t2, &t2); // t2 = 2Ax1 + fp2_add(&t2, &t1, &t2); // t2 = 2Ax1+z1^2 + fp2_mul(&t2, &t1, &t2); // t2 = z1^2(2Ax1+z1^2) + fp2_add(&t2, &t0, &t2); // t2 = alpha = 3x1^2 + z1^2(2Ax1+z1^2) + fp2_mul(&Q->z, &P->y, &P->z); + fp2_add(&Q->z, &Q->z, &Q->z); // z2 = 2y1z1 + fp2_sqr(&t0, &Q->z); + fp2_mul(&t0, &t0, &AC->A); // t0 = 4Ay1^2z1^2 + fp2_sqr(&t1, &P->y); + fp2_add(&t1, &t1, &t1); // t1 = 2y1^2 + fp2_add(&t3, &P->x, &P->x); // t3 = 2x1 + fp2_mul(&t3, &t1, &t3); // t3 = 4x1y1^2 + fp2_sqr(&Q->x, &t2); // x2 = alpha^2 + fp2_sub(&Q->x, &Q->x, &t0); // x2 = alpha^2 - 4Ay1^2z1^2 + fp2_sub(&Q->x, &Q->x, &t3); + fp2_sub(&Q->x, &Q->x, &t3); // x2 = alpha^2 - 4Ay1^2z1^2 - 8x1y1^2 + fp2_sub(&Q->y, &t3, &Q->x); // y2 = 4x1y1^2 - x2 + fp2_mul(&Q->y, &Q->y, &t2); // y2 = alpha(4x1y1^2 - x2) + fp2_sqr(&t1, &t1); // t1 = 4y1^4 + fp2_sub(&Q->y, &Q->y, &t1); + fp2_sub(&Q->y, &Q->y, &t1); // y2 = alpha(4x1y1^2 - x2) - 8y1^4 + + fp2_select(&Q->x, &Q->x, &P->x, -flag); + fp2_select(&Q->z, &Q->z, &P->z, -flag); +} + +void +DBLW(jac_point_t *Q, fp2_t *u, const jac_point_t *P, const fp2_t *t) +{ // Cost of 3M + 5S. + // Doubling on a Weierstrass curve, representation in modified Jacobian coordinates + // (X:Y:Z:T=a*Z^4) corresponding to (X/Z^2,Y/Z^3), where a is the curve coefficient. + // Formula from https://hyperelliptic.org/EFD/g1p/auto-shortw-modified.html + + uint32_t flag = fp2_is_zero(&P->x) & fp2_is_zero(&P->z); + + fp2_t xx, c, cc, r, s, m; + // XX = X^2 + fp2_sqr(&xx, &P->x); + // A = 2*Y^2 + fp2_sqr(&c, &P->y); + fp2_add(&c, &c, &c); + // AA = A^2 + fp2_sqr(&cc, &c); + // R = 2*AA + fp2_add(&r, &cc, &cc); + // S = (X+A)^2-XX-AA + fp2_add(&s, &P->x, &c); + fp2_sqr(&s, &s); + fp2_sub(&s, &s, &xx); + fp2_sub(&s, &s, &cc); + // M = 3*XX+T1 + fp2_add(&m, &xx, &xx); + fp2_add(&m, &m, &xx); + fp2_add(&m, &m, t); + // X3 = M^2-2*S + fp2_sqr(&Q->x, &m); + fp2_sub(&Q->x, &Q->x, &s); + fp2_sub(&Q->x, &Q->x, &s); + // Z3 = 2*Y*Z + fp2_mul(&Q->z, &P->y, &P->z); + fp2_add(&Q->z, &Q->z, &Q->z); + // Y3 = M*(S-X3)-R + fp2_sub(&Q->y, &s, &Q->x); + fp2_mul(&Q->y, &Q->y, &m); + fp2_sub(&Q->y, &Q->y, &r); + // T3 = 2*R*T1 + fp2_mul(u, t, &r); + fp2_add(u, u, u); + + fp2_select(&Q->x, &Q->x, &P->x, -flag); + fp2_select(&Q->z, &Q->z, &P->z, -flag); +} + +void +select_jac_point(jac_point_t *Q, const jac_point_t *P1, const jac_point_t *P2, const digit_t option) +{ // Select points + // If option = 0 then Q <- P1, else if option = 0xFF...FF then Q <- P2 + fp2_select(&(Q->x), &(P1->x), &(P2->x), option); + fp2_select(&(Q->y), &(P1->y), &(P2->y), option); + fp2_select(&(Q->z), &(P1->z), &(P2->z), option); +} + +void +ADD(jac_point_t *R, const jac_point_t *P, const jac_point_t *Q, const ec_curve_t *AC) +{ + // Addition on a Montgomery curve, representation in Jacobian coordinates (X:Y:Z) corresponding + // to (x,y) = (X/Z^2,Y/Z^3) This version receives the coefficient value A + // + // Complete routine, to handle all edge cases: + // if ZP == 0: # P == inf + // return Q + // if ZQ == 0: # Q == inf + // return P + // dy <- YQ*ZP**3 - YP*ZQ**3 + // dx <- XQ*ZP**2 - XP*ZQ**2 + // if dx == 0: # x1 == x2 + // if dy == 0: # ... and y1 == y2: doubling case + // dy <- ZP*ZQ * (3*XP^2 + ZP^2 * (2*A*XP + ZP^2)) + // dx <- 2*YP*ZP + // else: # ... but y1 != y2, thus P = -Q + // return inf + // XR <- dy**2 - dx**2 * (A*ZP^2*ZQ^2 + XP*ZQ^2 + XQ*ZP^2) + // YR <- dy * (XP*ZQ^2 * dx^2 - XR) - YP*ZQ^3 * dx^3 + // ZR <- dx * ZP * ZQ + + // Constant time processing: + // - The case for P == 0 or Q == 0 is handled at the end with conditional select + // - dy and dx are computed for both the normal and doubling cases, we switch when + // dx == dy == 0 for the normal case. + // - If we have that P = -Q then dx = 0 and so ZR will be zero, giving us the point + // at infinity for "free". + // + // These current formula are expensive and I'm probably missing some tricks... + // Thought I'd get the ball rolling. + // Cost 17M + 6S + 13a + fp2_t t0, t1, t2, t3, u1, u2, v1, dx, dy; + + /* If P is zero or Q is zero we will conditionally swap before returning. */ + uint32_t ctl1 = fp2_is_zero(&P->z); + uint32_t ctl2 = fp2_is_zero(&Q->z); + + /* Precompute some values */ + fp2_sqr(&t0, &P->z); // t0 = z1^2 + fp2_sqr(&t1, &Q->z); // t1 = z2^2 + + /* Compute dy and dx for ordinary case */ + fp2_mul(&v1, &t1, &Q->z); // v1 = z2^3 + fp2_mul(&t2, &t0, &P->z); // t2 = z1^3 + fp2_mul(&v1, &v1, &P->y); // v1 = y1z2^3 + fp2_mul(&t2, &t2, &Q->y); // t2 = y2z1^3 + fp2_sub(&dy, &t2, &v1); // dy = y2z1^3 - y1z2^3 + fp2_mul(&u2, &t0, &Q->x); // u2 = x2z1^2 + fp2_mul(&u1, &t1, &P->x); // u1 = x1z2^2 + fp2_sub(&dx, &u2, &u1); // dx = x2z1^2 - x1z2^2 + + /* Compute dy and dx for doubling case */ + fp2_add(&t1, &P->y, &P->y); // dx_dbl = t1 = 2y1 + fp2_add(&t2, &AC->A, &AC->A); // t2 = 2A + fp2_mul(&t2, &t2, &P->x); // t2 = 2Ax1 + fp2_add(&t2, &t2, &t0); // t2 = 2Ax1 + z1^2 + fp2_mul(&t2, &t2, &t0); // t2 = z1^2 * (2Ax1 + z1^2) + fp2_sqr(&t0, &P->x); // t0 = x1^2 + fp2_add(&t2, &t2, &t0); // t2 = x1^2 + z1^2 * (2Ax1 + z1^2) + fp2_add(&t2, &t2, &t0); // t2 = 2*x1^2 + z1^2 * (2Ax1 + z1^2) + fp2_add(&t2, &t2, &t0); // t2 = 3*x1^2 + z1^2 * (2Ax1 + z1^2) + fp2_mul(&t2, &t2, &Q->z); // dy_dbl = t2 = z2 * (3*x1^2 + z1^2 * (2Ax1 + z1^2)) + + /* If dx is zero and dy is zero swap with double variables */ + uint32_t ctl = fp2_is_zero(&dx) & fp2_is_zero(&dy); + fp2_select(&dx, &dx, &t1, ctl); + fp2_select(&dy, &dy, &t2, ctl); + + /* Some more precomputations */ + fp2_mul(&t0, &P->z, &Q->z); // t0 = z1z2 + fp2_sqr(&t1, &t0); // t1 = z1z2^2 + fp2_sqr(&t2, &dx); // t2 = dx^2 + fp2_sqr(&t3, &dy); // t3 = dy^2 + + /* Compute x3 = dy**2 - dx**2 * (A*ZP^2*ZQ^2 + XP*ZQ^2 + XQ*ZP^2) */ + fp2_mul(&R->x, &AC->A, &t1); // x3 = A*(z1z2)^2 + fp2_add(&R->x, &R->x, &u1); // x3 = A*(z1z2)^2 + u1 + fp2_add(&R->x, &R->x, &u2); // x3 = A*(z1z2)^2 + u1 + u2 + fp2_mul(&R->x, &R->x, &t2); // x3 = dx^2 * (A*(z1z2)^2 + u1 + u2) + fp2_sub(&R->x, &t3, &R->x); // x3 = dy^2 - dx^2 * (A*(z1z2)^2 + u1 + u2) + + /* Compute y3 = dy * (XP*ZQ^2 * dx^2 - XR) - YP*ZQ^3 * dx^3*/ + fp2_mul(&R->y, &u1, &t2); // y3 = u1 * dx^2 + fp2_sub(&R->y, &R->y, &R->x); // y3 = u1 * dx^2 - x3 + fp2_mul(&R->y, &R->y, &dy); // y3 = dy * (u1 * dx^2 - x3) + fp2_mul(&t3, &t2, &dx); // t3 = dx^3 + fp2_mul(&t3, &t3, &v1); // t3 = v1 * dx^3 + fp2_sub(&R->y, &R->y, &t3); // y3 = dy * (u1 * dx^2 - x3) - v1 * dx^3 + + /* Compute z3 = dx * z1 * z2 */ + fp2_mul(&R->z, &dx, &t0); + + /* Finally, we need to set R = P is Q.Z = 0 and R = Q if P.Z = 0 */ + select_jac_point(R, R, Q, ctl1); + select_jac_point(R, R, P, ctl2); +} + +void +jac_to_xz_add_components(add_components_t *add_comp, const jac_point_t *P, const jac_point_t *Q, const ec_curve_t *AC) +{ + // Take P and Q in E distinct, two jac_point_t, return three components u,v and w in Fp2 such + // that the xz coordinates of P+Q are (u-v:w) and of P-Q are (u+v:w) + + fp2_t t0, t1, t2, t3, t4, t5, t6; + + fp2_sqr(&t0, &P->z); // t0 = z1^2 + fp2_sqr(&t1, &Q->z); // t1 = z2^2 + fp2_mul(&t2, &P->x, &t1); // t2 = x1z2^2 + fp2_mul(&t3, &t0, &Q->x); // t3 = z1^2x2 + fp2_mul(&t4, &P->y, &Q->z); // t4 = y1z2 + fp2_mul(&t4, &t4, &t1); // t4 = y1z2^3 + fp2_mul(&t5, &P->z, &Q->y); // t5 = z1y2 + fp2_mul(&t5, &t5, &t0); // t5 = z1^3y2 + fp2_mul(&t0, &t0, &t1); // t0 = (z1z2)^2 + fp2_mul(&t6, &t4, &t5); // t6 = (z1z_2)^3y1y2 + fp2_add(&add_comp->v, &t6, &t6); // v = 2(z1z_2)^3y1y2 + fp2_sqr(&t4, &t4); // t4 = y1^2z2^6 + fp2_sqr(&t5, &t5); // t5 = z1^6y_2^2 + fp2_add(&t4, &t4, &t5); // t4 = z1^6y_2^2 + y1^2z2^6 + fp2_add(&t5, &t2, &t3); // t5 = x1z2^2 +z_1^2x2 + fp2_add(&t6, &t3, &t3); // t6 = 2z_1^2x2 + fp2_sub(&t6, &t5, &t6); // t6 = lambda = x1z2^2 - z_1^2x2 + fp2_sqr(&t6, &t6); // t6 = lambda^2 = (x1z2^2 - z_1^2x2)^2 + fp2_mul(&t1, &AC->A, &t0); // t1 = A*(z1z2)^2 + fp2_add(&t1, &t5, &t1); // t1 = gamma =A*(z1z2)^2 + x1z2^2 +z_1^2x2 + fp2_mul(&t1, &t1, &t6); // t1 = gamma*lambda^2 + fp2_sub(&add_comp->u, &t4, &t1); // u = z1^6y_2^2 + y1^2z2^6 - gamma*lambda^2 + fp2_mul(&add_comp->w, &t6, &t0); // w = (z1z2)^2(lambda)^2 +} diff --git a/src/ec/ref/lvlx/isog_chains.c b/src/ec/ref/lvlx/isog_chains.c new file mode 100644 index 0000000..abc9808 --- /dev/null +++ b/src/ec/ref/lvlx/isog_chains.c @@ -0,0 +1,241 @@ +#include "isog.h" +#include + +// since we use degree 4 isogeny steps, we need to handle the odd case with care +static uint32_t +ec_eval_even_strategy(ec_curve_t *curve, + ec_point_t *points, + unsigned len_points, + const ec_point_t *kernel, + const int isog_len) +{ + ec_curve_normalize_A24(curve); + ec_point_t A24; + copy_point(&A24, &curve->A24); + + int space = 1; + for (int i = 1; i < isog_len; i *= 2) + ++space; + + // Stack of remaining kernel points and their associated orders + ec_point_t splits[space]; + uint16_t todo[space]; + splits[0] = *kernel; + todo[0] = isog_len; + + int current = 0; // Pointer to current top of stack + + // Chain of 4-isogenies + for (int j = 0; j < isog_len / 2; ++j) { + assert(current >= 0); + assert(todo[current] >= 1); + // Get the next point of order 4 + while (todo[current] != 2) { + assert(todo[current] >= 3); + // A new split will be added + ++current; + assert(current < space); + // We set the seed of the new split to be computed and saved + copy_point(&splits[current], &splits[current - 1]); + // if we copied from the very first element, then we perform one additional doubling + unsigned num_dbls = todo[current - 1] / 4 * 2 + todo[current - 1] % 2; + todo[current] = todo[current - 1] - num_dbls; + while (num_dbls--) + xDBL_A24(&splits[current], &splits[current], &A24, false); + } + + if (j == 0) { + assert(fp2_is_one(&A24.z)); + if (!ec_is_four_torsion(&splits[current], curve)) + return -1; + + ec_point_t T; + xDBL_A24(&T, &splits[current], &A24, false); + if (fp2_is_zero(&T.x)) + return -1; // special isogenies not allowed + } else { + assert(todo[current] == 2); +#ifndef NDEBUG + if (fp2_is_zero(&splits[current].z)) + debug_print("splitting point z coordinate is unexpectedly zero"); + + ec_point_t test; + xDBL_A24(&test, &splits[current], &A24, false); + if (fp2_is_zero(&test.z)) + debug_print("z coordinate is unexpectedly zero before doubling"); + xDBL_A24(&test, &test, &A24, false); + if (!fp2_is_zero(&test.z)) + debug_print("z coordinate is unexpectedly not zero after doubling"); +#endif + } + + // Evaluate 4-isogeny + ec_kps4_t kps4; + xisog_4(&kps4, &A24, splits[current]); + xeval_4(splits, splits, current, &kps4); + for (int i = 0; i < current; ++i) + todo[i] -= 2; + xeval_4(points, points, len_points, &kps4); + + --current; + } + assert(isog_len % 2 ? !current : current == -1); + + // Final 2-isogeny + if (isog_len % 2) { +#ifndef NDEBUG + if (fp2_is_zero(&splits[0].z)) + debug_print("splitting point z coordinate is unexpectedly zero"); + ec_point_t test; + copy_point(&test, &splits[0]); + xDBL_A24(&test, &test, &A24, false); + if (!fp2_is_zero(&test.z)) + debug_print("z coordinate is unexpectedly not zero after doubling"); +#endif + + // We need to check the order of this point in case there were no 4-isogenies + if (isog_len == 1 && !ec_is_two_torsion(&splits[0], curve)) + return -1; + if (fp2_is_zero(&splits[0].x)) { + // special isogenies not allowed + // this case can only happen if isog_len == 1; otherwise the + // previous 4-isogenies we computed ensure that $T=(0:1)$ is put + // as the kernel of the dual isogeny + return -1; + } + + ec_kps2_t kps2; + xisog_2(&kps2, &A24, splits[0]); + xeval_2(points, points, len_points, &kps2); + } + + // Output curve in the form (A:C) + A24_to_AC(curve, &A24); + + curve->is_A24_computed_and_normalized = false; + + return 0; +} + +uint32_t +ec_eval_even(ec_curve_t *image, ec_isog_even_t *phi, ec_point_t *points, unsigned len_points) +{ + copy_curve(image, &phi->curve); + return ec_eval_even_strategy(image, points, len_points, &phi->kernel, phi->length); +} + +// naive implementation +uint32_t +ec_eval_small_chain(ec_curve_t *curve, + const ec_point_t *kernel, + int len, + ec_point_t *points, + unsigned len_points, + bool special) // do we allow special isogenies? +{ + + ec_point_t A24; + AC_to_A24(&A24, curve); + + ec_kps2_t kps; + ec_point_t small_K, big_K; + copy_point(&big_K, kernel); + + for (int i = 0; i < len; i++) { + copy_point(&small_K, &big_K); + // small_K = big_K; + for (int j = 0; j < len - i - 1; j++) { + xDBL_A24(&small_K, &small_K, &A24, false); + } + // Check the order of the point before the first isogeny step + if (i == 0 && !ec_is_two_torsion(&small_K, curve)) + return (uint32_t)-1; + // Perform isogeny step + if (fp2_is_zero(&small_K.x)) { + if (special) { + ec_point_t B24; + xisog_2_singular(&kps, &B24, A24); + xeval_2_singular(&big_K, &big_K, 1, &kps); + xeval_2_singular(points, points, len_points, &kps); + copy_point(&A24, &B24); + } else { + return (uint32_t)-1; + } + } else { + xisog_2(&kps, &A24, small_K); + xeval_2(&big_K, &big_K, 1, &kps); + xeval_2(points, points, len_points, &kps); + } + } + A24_to_AC(curve, &A24); + + curve->is_A24_computed_and_normalized = false; + return 0; +} + +uint32_t +ec_isomorphism(ec_isom_t *isom, const ec_curve_t *from, const ec_curve_t *to) +{ + fp2_t t0, t1, t2, t3, t4; + + fp2_mul(&t0, &from->A, &from->C); + fp2_mul(&t1, &to->A, &to->C); + + fp2_mul(&t2, &t1, &to->C); // toA*toC^2 + fp2_add(&t3, &t2, &t2); + fp2_add(&t3, &t3, &t3); + fp2_add(&t3, &t3, &t3); + fp2_add(&t2, &t2, &t3); // 9*toA*toC^2 + fp2_sqr(&t3, &to->A); + fp2_mul(&t3, &t3, &to->A); // toA^3 + fp2_add(&t3, &t3, &t3); + fp2_sub(&isom->Nx, &t3, &t2); // 2*toA^3-9*toA*toC^2 + fp2_mul(&t2, &t0, &from->A); // fromA^2*fromC + fp2_sqr(&t3, &from->C); + fp2_mul(&t3, &t3, &from->C); // fromC^3 + fp2_add(&t4, &t3, &t3); + fp2_add(&t3, &t4, &t3); // 3*fromC^3 + fp2_sub(&t3, &t3, &t2); // 3*fromC^3-fromA^2*fromC + fp2_mul(&isom->Nx, &isom->Nx, &t3); // lambda_x = (2*toA^3-9*toA*toC^2)*(3*fromC^3-fromA^2*fromC) + + fp2_mul(&t2, &t0, &from->C); // fromA*fromC^2 + fp2_add(&t3, &t2, &t2); + fp2_add(&t3, &t3, &t3); + fp2_add(&t3, &t3, &t3); + fp2_add(&t2, &t2, &t3); // 9*fromA*fromC^2 + fp2_sqr(&t3, &from->A); + fp2_mul(&t3, &t3, &from->A); // fromA^3 + fp2_add(&t3, &t3, &t3); + fp2_sub(&isom->D, &t3, &t2); // 2*fromA^3-9*fromA*fromC^2 + fp2_mul(&t2, &t1, &to->A); // toA^2*toC + fp2_sqr(&t3, &to->C); + fp2_mul(&t3, &t3, &to->C); // toC^3 + fp2_add(&t4, &t3, &t3); + fp2_add(&t3, &t4, &t3); // 3*toC^3 + fp2_sub(&t3, &t3, &t2); // 3*toC^3-toA^2*toC + fp2_mul(&isom->D, &isom->D, &t3); // lambda_z = (2*fromA^3-9*fromA*fromC^2)*(3*toC^3-toA^2*toC) + + // Mont -> SW -> SW -> Mont + fp2_mul(&t0, &to->C, &from->A); + fp2_mul(&t0, &t0, &isom->Nx); // lambda_x*toC*fromA + fp2_mul(&t1, &from->C, &to->A); + fp2_mul(&t1, &t1, &isom->D); // lambda_z*fromC*toA + fp2_sub(&isom->Nz, &t0, &t1); // lambda_x*toC*fromA - lambda_z*fromC*toA + fp2_mul(&t0, &from->C, &to->C); + fp2_add(&t1, &t0, &t0); + fp2_add(&t0, &t0, &t1); // 3*fromC*toC + fp2_mul(&isom->D, &isom->D, &t0); // 3*lambda_z*fromC*toC + fp2_mul(&isom->Nx, &isom->Nx, &t0); // 3*lambda_x*fromC*toC + + return (fp2_is_zero(&isom->Nx) | fp2_is_zero(&isom->D)); +} + +void +ec_iso_eval(ec_point_t *P, ec_isom_t *isom) +{ + fp2_t tmp; + fp2_mul(&P->x, &P->x, &isom->Nx); + fp2_mul(&tmp, &P->z, &isom->Nz); + fp2_add(&P->x, &P->x, &tmp); + fp2_mul(&P->z, &P->z, &isom->D); +} diff --git a/src/ec/ref/lvlx/test/basis-gen-bench.c b/src/ec/ref/lvlx/test/basis-gen-bench.c new file mode 100644 index 0000000..6d65265 --- /dev/null +++ b/src/ec/ref/lvlx/test/basis-gen-bench.c @@ -0,0 +1,143 @@ +#include +#include +#include +#include +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +/****************************** +Util functions +******************************/ + +int +cmp_u64(const void *v1, const void *v2) +{ + uint64_t x1 = *(const uint64_t *)v1; + uint64_t x2 = *(const uint64_t *)v2; + if (x1 < x2) { + return -1; + } else if (x1 == x2) { + return 0; + } else { + return 1; + } +} + +void +bench_basis_generation(unsigned int n, int iterations) +{ + int i, j; + uint64_t cycles1, cycles2; + uint64_t cycle_runs[20]; + + ec_basis_t basis; + ec_curve_t curve; + ec_curve_init(&curve); + + // Set a supersingular elliptic curve + // E : y^2 = x^3 + 6*x^2 + x + fp2_set_small(&(curve.A), 6); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + + // Full even torsion generation without hints + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (j = 0; j < iterations; j++) { + (void)ec_curve_to_basis_2f_to_hint(&basis, &curve, n); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" 2^%d torsion generation takes .................................... %" PRIu64 " cycles\n", + n, + cycle_runs[4] / (iterations)); +} + +void +bench_basis_generation_from_hint(unsigned int n, int iterations) +{ + int i, j; + uint64_t cycles1, cycles2; + uint64_t cycle_runs[20]; + + ec_basis_t basis; + ec_curve_t curve; + ec_curve_init(&curve); + + // Set a supersingular elliptic curve + // E : y^2 = x^3 + 6*x^2 + x + fp2_set_small(&(curve.A), 6); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + + uint8_t hint = ec_curve_to_basis_2f_to_hint(&basis, &curve, n); + + // Full even torsion generation without hints + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (j = 0; j < iterations; j++) { + ec_curve_to_basis_2f_from_hint(&basis, &curve, n, hint); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" 2^%d torsion generation takes .................................... %" PRIu64 " cycles\n", + n, + cycle_runs[4] / (iterations)); +} + +void +bench_basis(int iterations) +{ + printf("\n-------------------------------------------------------------------------------------" + "-------------------\n\n"); + printf("Benchmarking E[2^n] basis generation for " STRINGIFY(SQISIGN_VARIANT) ": \n\n"); + bench_basis_generation(TORSION_EVEN_POWER, iterations); + bench_basis_generation(128, iterations); + + printf("\nBenchmarking E[2^n] basis generation with hint for " STRINGIFY(SQISIGN_VARIANT) ": \n\n"); + bench_basis_generation_from_hint(TORSION_EVEN_POWER, iterations); + bench_basis_generation_from_hint(128, iterations); +} + +int +main(int argc, char *argv[]) +{ + int iterations = 100 * SQISIGN_TEST_REPS; + int help = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + return 1; + } + + cpucycles_init(); + + bench_basis(iterations); + return 0; +} diff --git a/src/ec/ref/lvlx/test/basis-gen-test.c b/src/ec/ref/lvlx/test/basis-gen-test.c new file mode 100644 index 0000000..a067fa3 --- /dev/null +++ b/src/ec/ref/lvlx/test/basis-gen-test.c @@ -0,0 +1,195 @@ +#include +#include +#include +#include + +/****************************** +Test functions +******************************/ + +int +inner_test_generated_basis(ec_basis_t *basis, ec_curve_t *curve, unsigned int n) +{ + unsigned int i; + int PASSED = 1; + + ec_point_t P, Q; + copy_point(&P, &basis->P); + copy_point(&Q, &basis->Q); + + // Double points to get point of order 2 + for (i = 0; i < n - 1; i++) { + xDBL_A24(&P, &P, &curve->A24, curve->is_A24_computed_and_normalized); + xDBL_A24(&Q, &Q, &curve->A24, curve->is_A24_computed_and_normalized); + } + if (ec_is_zero(&P)) { + printf("Point P generated does not have full order\n"); + PASSED = 0; + } + if (ec_is_zero(&Q)) { + printf("Point Q generated does not have full order\n"); + PASSED = 0; + } + if (ec_is_equal(&P, &Q)) { + printf("Points P, Q are linearly dependent\n"); + PASSED = 0; + } + + if (!fp2_is_zero(&Q.x)) { + printf("Points Q is not above the Montgomery point\n"); + PASSED = 0; + } + + // This should give the identity + xDBL_A24(&P, &P, &curve->A24, curve->is_A24_computed_and_normalized); + xDBL_A24(&Q, &Q, &curve->A24, curve->is_A24_computed_and_normalized); + if (!ec_is_zero(&P)) { + printf("Point P generated does not have order exactly 2^n\n"); + PASSED = 0; + } + if (!ec_is_zero(&Q)) { + printf("Point Q generated does not have order exactly 2^n\n"); + PASSED = 0; + } + + if (PASSED == 0) { + printf("Test failed with n = %u\n", n); + } + + return PASSED; +} + +int +inner_test_hint_basis(ec_basis_t *basis, ec_basis_t *basis_hint) +{ + int PASSED = 1; + + if (!ec_is_equal(&basis->P, &basis_hint->P)) { + printf("The points P do not match using the hint\n"); + PASSED = 0; + } + + if (!ec_is_equal(&basis->Q, &basis_hint->Q)) { + printf("The points Q do not match using the hint\n"); + PASSED = 0; + } + + if (!ec_is_equal(&basis->PmQ, &basis_hint->PmQ)) { + printf("The points PmQ do not match using the hint\n"); + PASSED = 0; + } + + if (PASSED == 0) { + printf("Test failed\n"); + } + + return PASSED; +} + +/****************************** +Test wrapper functions +******************************/ + +int +test_basis_generation_E0(unsigned int n) +{ + ec_basis_t basis; + ec_curve_t curve; + + ec_curve_init(&curve); + + // Set a supersingular elliptic curve + // E : y^2 = x^3 + 6*x^2 + x + fp2_set_small(&(curve.A), 0); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + + // Generate a basis + (void)ec_curve_to_basis_2f_to_hint(&basis, &curve, n); + + // Test result + return inner_test_generated_basis(&basis, &curve, n); +} + +int +test_basis_generation(unsigned int n) +{ + ec_basis_t basis; + ec_curve_t curve; + + ec_curve_init(&curve); + + // Set a supersingular elliptic curve + // E : y^2 = x^3 + 6*x^2 + x + fp2_set_small(&(curve.A), 6); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + + // Generate a basis + (void)ec_curve_to_basis_2f_to_hint(&basis, &curve, n); + + // Test result + return inner_test_generated_basis(&basis, &curve, n); +} + +int +test_basis_generation_with_hints(unsigned int n) +{ + int check_1, check_2; + ec_basis_t basis, basis_hint; + ec_curve_t curve; + ec_curve_init(&curve); + + // Set a supersingular elliptic curve + // E : y^2 = x^3 + 6*x^2 + x + fp2_set_small(&(curve.A), 6); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + + // Generate a basis with hints + uint8_t hint = ec_curve_to_basis_2f_to_hint(&basis, &curve, n); + + // Ensure the basis from the hint is good + check_1 = inner_test_generated_basis(&basis, &curve, n); + + // Generate a basis using hints + ec_curve_to_basis_2f_from_hint(&basis_hint, &curve, n, hint); + + // These two bases should be the same + check_2 = inner_test_hint_basis(&basis, &basis_hint); + + return check_1 && check_2; +} + +int +test_basis(void) +{ + int passed; + + // Test full order + passed = test_basis_generation(TORSION_EVEN_POWER); + passed &= test_basis_generation_with_hints(TORSION_EVEN_POWER); + + // Test partial order + passed &= test_basis_generation(128); + passed &= test_basis_generation_with_hints(128); + + // Special case when we have A = 0 + passed &= test_basis_generation_E0(TORSION_EVEN_POWER); + passed &= test_basis_generation_E0(128); + + return passed; +} + +int +main(void) +{ + bool ok; + ok = test_basis(); + if (!ok) { + printf("Tests failed!\n"); + } else { + printf("All basis generation tests passed.\n"); + } + return !ok; +} diff --git a/src/ec/ref/lvlx/test/biextension-bench.c b/src/ec/ref/lvlx/test/biextension-bench.c new file mode 100644 index 0000000..d7f94e3 --- /dev/null +++ b/src/ec/ref/lvlx/test/biextension-bench.c @@ -0,0 +1,113 @@ +#include +#include +#include +#include +#include +#include +#include "biextension.h" +#include +#include "bench.h" + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +void +biextension_bench(uint64_t bench) +{ + uint64_t t0, t1; + uint32_t e = TORSION_EVEN_POWER; + + fp2_t r1; + ec_curve_t curve; + ec_point_t tmp; + + digit_t scal_r1[NWORDS_ORDER]; + digit_t scal_r2[NWORDS_ORDER]; + digit_t scal_s1[NWORDS_ORDER]; + digit_t scal_s2[NWORDS_ORDER]; + + ec_basis_t BPQ, BRS; + + // Get constants form curve E6 : y^2 = x^3 + 6*x^2 + x + ec_curve_init(&curve); + fp2_set_small(&(curve.A), 6); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + + // Compute 2^e torsion on curve and copy to a second basis + (void)ec_curve_to_basis_2f_to_hint(&BPQ, &curve, e); + copy_basis(&BRS, &BPQ); + + // Benchmark doubling on the curve + printf("\n\nBenchmarking doublings\n"); + t0 = cpucycles(); + for (uint64_t i = 0; i < bench; ++i) { + ec_dbl_iter(&tmp, e, &BPQ.P, &curve); + } + t1 = cpucycles(); + printf("\x1b[34mAvg doubling: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); + + printf("\n\nBenchmarking (Weil) pairings\n"); + t0 = cpucycles(); + for (uint64_t i = 0; i < bench; ++i) { + weil(&r1, e, &BPQ.P, &BPQ.Q, &BPQ.PmQ, &curve); + } + t1 = cpucycles(); + printf("\x1b[34mAvg pairing: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); + + printf("\n\nBenchmarking (Weil) dlogs\n"); + t0 = cpucycles(); + for (uint64_t i = 0; i < bench; ++i) { + ec_dlog_2_weil(scal_r1, scal_r2, scal_s1, scal_s2, &BPQ, &BRS, &curve, e); + } + t1 = cpucycles(); + printf("\x1b[34mAvg pairing dlog: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); + + printf("\n\nBenchmarking (Tate) dlogs\n"); + t0 = cpucycles(); + for (uint64_t i = 0; i < bench; ++i) { + ec_dlog_2_tate(scal_r1, scal_r2, scal_s1, scal_s2, &BPQ, &BRS, &curve, e); + } + t1 = cpucycles(); + printf("\x1b[34mAvg Tate dlog: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); +} + +int +main(int argc, char *argv[]) +{ + int iterations = 1000 * SQISIGN_TEST_REPS; + int help = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + return 1; + } + + cpucycles_init(); + + printf("Running biextension benchmarks for " STRINGIFY(SQISIGN_VARIANT) ":\n\n"); + + biextension_bench(iterations); + + return 0; +} diff --git a/src/ec/ref/lvlx/test/biextension-test.c b/src/ec/ref/lvlx/test/biextension-test.c new file mode 100644 index 0000000..40321e7 --- /dev/null +++ b/src/ec/ref/lvlx/test/biextension-test.c @@ -0,0 +1,259 @@ +#include +#include +#include +#include +#include +#include +#include "biextension.h" +#include +#include + +void +fp2_exp_2e(fp2_t *r, uint32_t e, const fp2_t *x) +{ + fp2_copy(r, x); + for (uint32_t i = 0; i < e; i++) { + fp2_sqr(r, r); + } +} + +void +biextension_test() +{ + clock_t t; + ec_curve_t curve; + ec_basis_t even_torsion; + uint32_t e = TORSION_EVEN_POWER; + fp2_t one, r1, rr1, rrr1, r2, r3, tp; + ec_point_t P, Q, PmQ, A24; + ec_point_t tmp, tmp2, PQ, PP, QQ, PPQ, PQQ, PPP, QQQ, PPPQ, PQQQ; + + // Get constants form curve E6 : y^2 = x^3 + 6*x^2 + x + ec_curve_init(&curve); + fp2_set_small(&(curve.A), 6); + fp2_set_one(&(curve.C)); + ec_curve_normalize_A24(&curve); + copy_point(&A24, &curve.A24); + + // Compute 2^e torsion on curve + (void)ec_curve_to_basis_2f_to_hint(&even_torsion, &curve, e); + copy_point(&P, &even_torsion.P); + copy_point(&Q, &even_torsion.Q); + copy_point(&PmQ, &even_torsion.PmQ); + + printf("Testing order of points\n"); + t = tic(); + ec_dbl_iter(&tmp, e, &P, &curve); + TOC_clock(t, "Doublings"); + assert(ec_is_zero(&tmp)); + ec_dbl_iter(&tmp, e, &Q, &curve); + assert(ec_is_zero(&tmp)); + ec_dbl_iter(&tmp, e, &PmQ, &curve); + assert(ec_is_zero(&tmp)); + + printf("Computing Weil pairing\n"); + xADD(&PQ, &P, &Q, &PmQ); + t = tic(); + + weil(&r1, e, &P, &Q, &PQ, &curve); + TOC_clock(t, "Weil pairing"); + + printf("Computing Tate pairing\n"); + t = tic(); + + reduced_tate(&tp, e, &P, &Q, &PQ, &curve); + TOC_clock(t, "Tate pairing"); + + printf("Testing order of Weil pairing\n"); + fp2_set_one(&one); + fp2_exp_2e(&r2, e - 1, &r1); + assert(!fp2_is_equal(&r2, &one)); + fp2_exp_2e(&r2, e, &r1); + assert(fp2_is_equal(&r2, &one)); + + printf("Testing order of Tate pairing\n"); + fp2_set_one(&one); + fp2_exp_2e(&r2, e - 1, &tp); + assert(!fp2_is_equal(&r2, &one)); + fp2_exp_2e(&r2, e, &tp); + assert(fp2_is_equal(&r2, &one)); + + printf("Bilinearity tests\n"); + weil(&r2, e, &P, &Q, &PmQ, &curve); + fp2_inv(&r2); + assert(fp2_is_equal(&r1, &r2)); + + xDBL_A24(&PP, &P, &A24, false); + xDBL_A24(&QQ, &Q, &A24, false); + xADD(&PPQ, &PQ, &P, &Q); + xADD(&PQQ, &PQ, &Q, &P); + + weil(&r2, e, &PP, &Q, &PPQ, &curve); + weil(&r3, e, &P, &QQ, &PQQ, &curve); + assert(fp2_is_equal(&r2, &r3)); + fp2_sqr(&rr1, &r1); + assert(fp2_is_equal(&rr1, &r2)); + + xADD(&PPP, &PP, &P, &P); + xADD(&QQQ, &QQ, &Q, &Q); + xADD(&PPPQ, &PPQ, &P, &PQ); + xADD(&PQQQ, &PQQ, &Q, &PQ); + weil(&r2, e, &PPP, &Q, &PPPQ, &curve); + weil(&r3, e, &P, &QQQ, &PQQQ, &curve); + assert(fp2_is_equal(&r2, &r3)); + fp2_mul(&rrr1, &rr1, &r1); + assert(fp2_is_equal(&rrr1, &r2)); + + printf("dlog tests\n"); + ec_basis_t BPQ, BRS; + digit_t scal_r1[NWORDS_ORDER] = { 0 }; + digit_t scal_r2[NWORDS_ORDER] = { 0 }; + digit_t scal_s1[NWORDS_ORDER] = { 0 }; + digit_t scal_s2[NWORDS_ORDER] = { 0 }; + digit_t scal_d1[NWORDS_ORDER] = { 0 }; + digit_t scal_d2[NWORDS_ORDER] = { 0 }; + + // original even torsion + BPQ = even_torsion; + BRS = even_torsion; + + // alternative torsion, just mix the points up a little... + // not filling top word so the addition below can overflow into it + // so the scalars are "random enough" but we still keep the difference + // scal_d1 and scal_d2 required to compute the right multiple of RmS + randombytes((unsigned char *)scal_d1, (NWORDS_ORDER - 1) * sizeof(digit_t)); + randombytes((unsigned char *)scal_d2, (NWORDS_ORDER - 1) * sizeof(digit_t)); + randombytes((unsigned char *)scal_s1, (NWORDS_ORDER - 1) * sizeof(digit_t)); + randombytes((unsigned char *)scal_s2, (NWORDS_ORDER - 1) * sizeof(digit_t)); + + // Ensure that r1*s2 - r2*s1 is odd such that the matrix + // [[r1, r2], [s1, s2]] is invertible + scal_s1[0] = (scal_s1[0] & ((digit_t)(-1) - 1)) + 1; // s1 needs to be odd + scal_d1[0] = (scal_d1[0] & ((digit_t)(-1) - 1)); // d1 needs to be even to make r1 odd + scal_s2[0] = (scal_s2[0] & ((digit_t)(-1) - 1)) + 1; // s2 needs to be odd + scal_d2[0] = (scal_d2[0] & ((digit_t)(-1) - 1)) + 1; // d2 needs to be odd to make r2 even + + // Compute r1 and r2 from the difference di = ri - si + mp_add(scal_r1, scal_d1, scal_s1, NWORDS_ORDER); + mp_add(scal_r2, scal_d2, scal_s2, NWORDS_ORDER); + + ec_biscalar_mul(&BRS.P, scal_r1, scal_r2, e, &BPQ, &curve); + ec_biscalar_mul(&BRS.Q, scal_s1, scal_s2, e, &BPQ, &curve); + ec_biscalar_mul(&BRS.PmQ, scal_d1, scal_d2, e, &BPQ, &curve); + + printf("mixed\n"); + + // Now solve the discrete log + ec_dlog_2_weil(scal_r1, scal_r2, scal_s1, scal_s2, &BPQ, &BRS, &curve, e); + + // assert everything matches + // R = [r1]P + [r2]Q + ec_biscalar_mul(&tmp, scal_r1, scal_r2, e, &BPQ, &curve); + assert(ec_is_equal(&tmp, &BRS.P)); + + // S = [s1]P + [s2]Q + ec_biscalar_mul(&tmp, scal_s1, scal_s2, e, &BPQ, &curve); + assert(ec_is_equal(&tmp, &BRS.Q)); + + printf("weil solved\n"); + + // now repeat using the tate pairing + ec_dlog_2_tate(scal_r1, scal_r2, scal_s1, scal_s2, &BPQ, &BRS, &curve, e); + + // assert everything matches + // R = [r1]P + [r2]Q + ec_biscalar_mul(&tmp, scal_r1, scal_r2, e, &BPQ, &curve); + assert(ec_is_equal(&tmp, &BRS.P)); + + // S = [s1]P + [s2]Q + ec_biscalar_mul(&tmp, scal_s1, scal_s2, e, &BPQ, &curve); + assert(ec_is_equal(&tmp, &BRS.Q)); + + printf("tate solved\n"); + + // now we try with bases for partial torsion E[2^e] with e < e_full + int e_full = TORSION_EVEN_POWER; + int e_partial = 126; + + ec_dbl_iter(&BRS.P, e_full - e_partial, &BRS.P, &curve); + ec_dbl_iter(&BRS.Q, e_full - e_partial, &BRS.Q, &curve); + ec_dbl_iter(&BRS.PmQ, e_full - e_partial, &BRS.PmQ, &curve); + + ec_dlog_2_tate(scal_r1, scal_r2, scal_s1, scal_s2, &BPQ, &BRS, &curve, e_partial); + + ec_biscalar_mul(&tmp, scal_r1, scal_r2, e, &BPQ, &curve); + ec_dbl_iter(&tmp, e_full - e_partial, &tmp, &curve); + assert(ec_is_equal(&tmp, &BRS.P)); + + // S = [s1]P + [s2]Q + // then S = [2^e_diff] S + ec_biscalar_mul(&tmp, scal_s1, scal_s2, e, &BPQ, &curve); + ec_dbl_iter(&tmp, e_full - e_partial, &tmp, &curve); + assert(ec_is_equal(&tmp, &BRS.Q)); + + printf("tate from full basis solved\n"); + + ec_dlog_2_tate(scal_r1, scal_r2, scal_s1, scal_s2, &BPQ, &BRS, &curve, e_partial); + mp_invert_matrix(scal_r1, scal_r2, scal_s1, scal_s2, e_partial, NWORDS_ORDER); + + // assert everything matches + ec_biscalar_mul(&tmp, scal_r1, scal_r2, e, &BRS, &curve); + ec_dbl_iter(&tmp2, e_full - e_partial, &BPQ.P, &curve); + assert(ec_is_equal(&tmp, &tmp2)); + + ec_biscalar_mul(&tmp, scal_s1, scal_s2, e, &BRS, &curve); + ec_dbl_iter(&tmp2, e_full - e_partial, &BPQ.Q, &curve); + assert(ec_is_equal(&tmp, &tmp2)); + + printf("tate to full basis solved\n"); +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int help = 0; + int seed_set = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + } + + if (help) { + printf("Usage: %s [--seed=]\n", argv[0]); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + printf("Running biextension unit tests\n"); + + biextension_test(); + + // Failures will be caught by asserts in biextension_test + printf("\nAll tests passed!\n"); + + return 0; +} diff --git a/src/ec/ref/lvlx/test/curve-arith-bench.c b/src/ec/ref/lvlx/test/curve-arith-bench.c new file mode 100644 index 0000000..3dc3158 --- /dev/null +++ b/src/ec/ref/lvlx/test/curve-arith-bench.c @@ -0,0 +1,163 @@ +#include +#include +#include +#include +#include + +#include "test_extras.h" +#include +#include +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +uint64_t +bench_xDBL(unsigned int Nbench) +{ + uint64_t cycles0, cycles1; + unsigned int i; + ec_point_t P[Nbench], A24[Nbench]; + for (i = 0; i < Nbench; i++) { + fp2_random_test(&(P[i].x)); + fp2_random_test(&(P[i].z)); + fp2_random_test(&(A24[i].x)); + fp2_random_test(&(A24[i].z)); + } + cycles0 = cpucycles(); + for (i = 0; i < Nbench; i++) { + xDBL(&P[i], &P[i], &A24[i]); + } + cycles1 = cpucycles(); + return cycles1 - cycles0; +} + +uint64_t +bench_xEVAL4(unsigned int Nbench) +{ + uint64_t cycles0, cycles1; + unsigned int i; + ec_point_t P[Nbench]; + ec_kps4_t KPS[Nbench]; + for (i = 0; i < Nbench; i++) { + fp2_random_test(&(P[i].x)); + fp2_random_test(&(P[i].z)); + for (int j = 0; j < 3; j++) { + fp2_random_test(&(KPS[i].K[j].x)); + fp2_random_test(&(KPS[i].K[j].z)); + } + } + cycles0 = cpucycles(); + for (i = 0; i < Nbench; i++) { + xeval_4(&P[i], &P[i], 1, &KPS[i]); + } + cycles1 = cpucycles(); + return cycles1 - cycles0; +} + +uint64_t +bench_isog_strategy(unsigned int Nbench) +{ + uint64_t cycles0, cycles1; + unsigned int i; + ec_curve_t E0; + ec_isog_even_t phi[Nbench]; + ec_basis_t basis2; + ec_curve_init(&E0); + fp2_set_small(&(E0.A), 6); + fp2_set_one(&(E0.C)); + (void)ec_curve_to_basis_2f_to_hint(&basis2, &E0, TORSION_EVEN_POWER); + for (i = 0; i < Nbench; i++) { + copy_curve(&phi[i].curve, &E0); + phi[i].length = TORSION_EVEN_POWER; + if (i == 0) { + xADD(&phi[i].kernel, &basis2.P, &basis2.Q, &basis2.PmQ); + } + if (i == 1) { + xADD(&phi[i].kernel, &phi[i - 1].kernel, &basis2.Q, &basis2.P); + } + if (i > 1) { + xADD(&phi[i].kernel, &phi[i - 1].kernel, &basis2.Q, &phi[i - 2].kernel); + } + } + cycles0 = cpucycles(); + for (i = 2; i < Nbench; i++) { + if (ec_eval_even(&phi[i].curve, &phi[i], NULL, 0)) { + printf("Failed isogeny strategy\n"); + return 0; + } + } + cycles1 = cpucycles(); + return cycles1 - cycles0; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = 100 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + printf("Benchmarking elliptic curve arithmetic for " STRINGIFY(SQISIGN_VARIANT) ":\n\n"); + + uint64_t cycles; + + cycles = bench_xDBL(10 * iterations); + printf("Bench xDBL_A24:\t%" PRIu64 " cycles\n", cycles / (10 * iterations)); + + cycles = bench_xEVAL4(iterations); + printf("Bench xEVAL4:\t%" PRIu64 " cycles\n", cycles / iterations); + + cycles = bench_isog_strategy(iterations); + printf("Bench isog strategy:\t%" PRIu64 " cycles\n", cycles / iterations); + + return 0; +} diff --git a/src/ec/ref/lvlx/test/curve-arith-test.c b/src/ec/ref/lvlx/test/curve-arith-test.c new file mode 100644 index 0000000..b895342 --- /dev/null +++ b/src/ec/ref/lvlx/test/curve-arith-test.c @@ -0,0 +1,404 @@ +#include +#include +#include + +#include "test_extras.h" +#include +#include +#include +#include + +/****************************** +Test functions +******************************/ + +int +test_xDBL_xADD(const ec_curve_t *curve, unsigned int Ntest) +{ + unsigned int i; + + ec_point_t P, Q, PQ, R1, R2; + + for (i = 0; i < Ntest; i++) { + ec_random_test(&P, curve); + ec_random_test(&Q, curve); + projective_difference_point(&PQ, &P, &Q, curve); + + // 2(P + Q) = 2P + 2Q + xADD(&R1, &P, &Q, &PQ); + ec_dbl(&R1, &R1, curve); + ec_dbl(&P, &P, curve); + ec_dbl(&Q, &Q, curve); + ec_dbl(&PQ, &PQ, curve); + xADD(&R2, &P, &Q, &PQ); + if (!ec_is_equal(&R1, &R2)) { + printf("Failed 2(P + Q) = 2P + 2Q\n"); + return 1; + } + + // (P+Q) + (P-Q) = 2P + xADD(&R1, &P, &Q, &PQ); + ec_dbl(&Q, &Q, curve); + xADD(&R1, &R1, &PQ, &Q); + ec_dbl(&P, &P, curve); + ec_dbl(&PQ, &PQ, curve); + if (!ec_is_equal(&R1, &P)) { + printf("Failed (P+Q) + (P-Q) = 2P\n"); + return 1; + } + } + + return 0; +} + +int +test_xDBLADD(const ec_curve_t *curve, unsigned int Ntest) +{ + unsigned int i; + + ec_point_t P, Q, PQ, R1, R2; + + ec_point_t A24; + AC_to_A24(&A24, curve); + + for (i = 0; i < Ntest; i++) { + ec_random_test(&P, curve); + ec_random_test(&Q, curve); + projective_difference_point(&PQ, &P, &Q, curve); + + xDBLADD(&R1, &R2, &P, &Q, &PQ, &A24, false); + xADD(&PQ, &P, &Q, &PQ); + if (!ec_is_equal(&R2, &PQ)) { + printf("Failed addition in xDBLADD\n"); + return 1; + } + ec_dbl(&P, &P, curve); + if (!ec_is_equal(&R1, &P)) { + printf("Failed doubling in xDBLADD\n"); + return 1; + } + } + return 0; +} + +int +test_xDBL_variants(ec_curve_t *curve, unsigned int Ntest) +{ + unsigned int i; + ec_curve_t E; + ec_point_t P, R1, R2, R3, R4; + ec_point_t A24, A24norm; + fp2_t z; + + AC_to_A24(&A24, curve); + copy_point(&A24norm, &A24); + ec_normalize_point(&A24norm); + + // Randomize projective representation + copy_curve(&E, curve); + fp2_random_test(&z); + fp2_mul(&(E.A24.x), &(A24.x), &z); + fp2_mul(&(E.A24.z), &(A24.z), &z); + E.is_A24_computed_and_normalized = false; + + for (i = 0; i < Ntest; i++) { + ec_random_test(&P, curve); + xDBL(&R1, &P, (const ec_point_t *)curve); + xDBL_A24(&R2, &P, &(E.A24), false); + xDBL_A24(&R3, &P, &A24norm, true); + xDBL_E0(&R4, &P); + if (!ec_is_equal(&R1, &R2)) { + printf("xDBL and xDBL_A24 dont match\n"); + return 1; + } + if (!ec_is_equal(&R1, &R3)) { + printf("xDBL and xDBL_A24 normalized dont match\n"); + return 1; + } + if (!ec_is_equal(&R1, &R4)) { + printf("xDBL and xDBL_E0 dont match\n"); + return 1; + } + } + return 0; +} + +int +test_zero_identities(ec_curve_t *curve, unsigned int Ntest) +{ + unsigned int i; + + ec_point_t P, Q, R, ec_zero; + + fp2_set_one(&(P.x)); + fp2_set_zero(&(P.z)); + + fp2_set_one(&(ec_zero.x)); + fp2_set_zero(&(ec_zero.z)); + + assert(ec_is_zero(&P)); + + for (i = 0; i < Ntest; i++) { + ec_random_test(&P, curve); + + xADD(&R, &ec_zero, &ec_zero, &ec_zero); + if (!ec_is_zero(&R)) { + printf("Failed 0 + 0 = 0\n"); + return 1; + } + + ec_dbl(&R, &P, curve); + xADD(&R, &P, &P, &R); + if (!ec_is_zero(&R)) { + printf("Failed P - P = 0\n"); + return 1; + } + + ec_dbl(&R, &ec_zero, curve); + if (!ec_is_zero(&R)) { + printf("Failed 2*0 = 0\n"); + return 1; + } + + xADD(&R, &P, &ec_zero, &P); + if (!ec_is_equal(&R, &P)) { + printf("Failed P + 0 = P\n"); + return 1; + } + xADD(&R, &ec_zero, &P, &P); + if (!ec_is_equal(&R, &P)) { + printf("Failed P + 0 = P\n"); + return 1; + } + + xDBLADD(&R, &Q, &P, &ec_zero, &P, &curve->A24, false); + if (!ec_is_equal(&Q, &P)) { + printf("Failed P + 0 = P in xDBLADD\n"); + return 1; + } + xDBLADD(&R, &Q, &ec_zero, &P, &P, &curve->A24, false); + if (!ec_is_equal(&Q, &P)) { + printf("Failed P + 0 = P in xDBLADD\n"); + return 1; + } + if (!ec_is_zero(&R)) { + printf("Failed 2*0 = 0 in xDBLADD\n"); + return 1; + } + } + return 0; +} + +int +test_jacobian(const ec_curve_t *curve, unsigned int Ntest) +{ + unsigned int i; + + ec_point_t P, Q; + jac_point_t R, S, T, U, jac_zero; + fp2_t t0, t1; + + jac_init(&jac_zero); + + for (i = 0; i < Ntest; i++) { + ec_random_test(&P, curve); + ec_normalize_point(&P); + ec_random_test(&Q, curve); + ec_normalize_point(&Q); + + /* Convert to Jacobian coordinates. */ + fp2_copy(&(S.x), &(P.x)); + ec_recover_y(&(S.y), &(S.x), curve); + fp2_set_one(&(S.z)); + fp2_copy(&(T.x), &(Q.x)); + ec_recover_y(&(T.y), &(T.x), curve); + fp2_set_one(&(T.z)); + + ADD(&R, &jac_zero, &jac_zero, curve); + if (!jac_is_equal(&R, &jac_zero)) { + printf("Failed 0 + 0 = 0 in jac\n"); + return 1; + } + + DBL(&R, &jac_zero, curve); + if (!jac_is_equal(&R, &jac_zero)) { + printf("Failed 2*0 = 0 in jac\n"); + return 1; + } + + jac_neg(&R, &S); + ADD(&R, &S, &R, curve); + if (!jac_is_equal(&R, &jac_zero)) { + printf("Failed P - P = 0 in jac\n"); + return 1; + } + + ADD(&R, &S, &jac_zero, curve); + if (!jac_is_equal(&R, &S)) { + printf("Failed P + 0 = P in jac\n"); + return 1; + } + ADD(&R, &jac_zero, &S, curve); + if (!jac_is_equal(&R, &S)) { + printf("Failed P + 0 = P in jac\n"); + return 1; + } + ADD(&R, &S, &jac_zero, curve); + if (!jac_is_equal(&R, &S)) { + printf("Failed 0 + P = P in jac\n"); + return 1; + } + + DBL(&R, &S, curve); + ADD(&U, &S, &S, curve); + if (!jac_is_equal(&R, &U)) { + printf("Failed P + P = 2*P in jac\n"); + return 1; + } + + ADD(&R, &T, &S, curve); + ADD(&T, &S, &T, curve); + if (!jac_is_equal(&R, &T)) { + printf("Failed P + Q = Q + P in jac\n"); + return 1; + } + ADD(&R, &T, &S, curve); + ADD(&U, &S, &T, curve); + if (!jac_is_equal(&R, &U)) { + printf("Failed P + Q = Q + P in jac\n"); + return 1; + } + + // Double R to make it different than (T + S). + DBL(&R, &R, curve); + ADD(&U, &S, &T, curve); + ADD(&U, &U, &R, curve); + ADD(&R, &R, &T, curve); + ADD(&R, &R, &S, curve); + if (!jac_is_equal(&R, &U)) { + printf("Failed (P + Q) + R = P + (Q + R) in jac\n"); + return 1; + } + + jac_to_ws(&R, &t0, &t1, &jac_zero, curve); + jac_from_ws(&R, &R, &t1, curve); + if (!jac_is_equal(&R, &jac_zero)) { + printf("Failed converting to Weierstrass\n"); + return 1; + } + + jac_to_ws(&R, &t0, &t1, &S, curve); + jac_from_ws(&R, &R, &t1, curve); + if (!jac_is_equal(&S, &R)) { + printf("Failed converting to Weierstrass\n"); + return 1; + } + DBL(&S, &S, curve); + jac_to_ws(&R, &t0, &t1, &S, curve); + jac_from_ws(&R, &R, &t1, curve); + if (!jac_is_equal(&S, &R)) { + printf("Failed converting to Weierstrass\n"); + return 1; + } + + jac_to_ws(&R, &t0, &t1, &jac_zero, curve); + DBLW(&R, &t0, &R, &t0); + jac_from_ws(&R, &R, &t1, curve); + if (!jac_is_equal(&R, &jac_zero)) { + printf("Failed 2*0 = 0 in Weierstrass\n"); + return 1; + } + jac_to_ws(&R, &t0, &t1, &S, curve); + DBLW(&R, &t0, &R, &t0); + jac_from_ws(&R, &R, &t1, curve); + DBL(&S, &S, curve); + if (!jac_is_equal(&S, &R)) { + printf("Failed doubling in Weierstrass\n"); + return 1; + } + } + return 0; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = 100 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + int res = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for testing; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + // Curve A=6 + ec_curve_t curve; + ec_curve_init(&curve); + fp2_set_small(&(curve.A), 0); + fp2_set_small(&(curve.C), 1); + // fp2_random_test(&(curve.C)); + // fp2_mul(&(curve.A), &(curve.A), &(curve.C)); + ec_curve_normalize_A24(&curve); + + res |= test_xDBL_xADD(&curve, iterations); + res |= test_xDBLADD(&curve, iterations); + res |= test_xDBL_variants(&curve, iterations); + res |= test_zero_identities(&curve, iterations); + res |= test_jacobian(&curve, iterations); + + fp2_random_test(&(curve.C)); + fp2_mul(&(curve.A), &(curve.A), &(curve.C)); + ec_curve_normalize_A24(&curve); + + res |= test_xDBL_xADD(&curve, iterations); + res |= test_xDBLADD(&curve, iterations); + res |= test_xDBL_variants(&curve, iterations); + res |= test_zero_identities(&curve, iterations); + res |= test_jacobian(&curve, iterations); + + if (res) { + printf("Tests failed!\n"); + } else { + printf("All ec arithmetic tests passed.\n"); + } + + return res; +} diff --git a/src/ec/ref/lvlx/test/test_extras.c b/src/ec/ref/lvlx/test/test_extras.c new file mode 100644 index 0000000..f2be495 --- /dev/null +++ b/src/ec/ref/lvlx/test/test_extras.c @@ -0,0 +1,116 @@ +#include "test_extras.h" +#include "rng.h" + +// Make n random-ish field elements (for tests only!). +void +fp_random_test(fp_t *a) +{ + uint8_t tmp[FP_ENCODED_BYTES]; + + randombytes(tmp, sizeof(tmp)); + + fp_decode_reduce(a, tmp, sizeof(tmp)); +} + +void +fp2_random_test(fp2_t *a) +{ + fp_random_test(&(a->re)); + fp_random_test(&(a->im)); +} + +// Given an x-coordinate, determines if this is a valid +// point on the curve. Assumes C=1. +static uint32_t +projective_is_on_curve(const ec_point_t *P, const ec_curve_t *curve) +{ + + fp2_t t0, t1, t2; + + // Check if xz*(C^2x^2+zACx+z^2C^2) is a square + fp2_mul(&t0, &curve->C, &P->x); + fp2_mul(&t1, &t0, &P->z); + fp2_mul(&t1, &t1, &curve->A); + fp2_mul(&t2, &curve->C, &P->z); + fp2_sqr(&t0, &t0); + fp2_sqr(&t2, &t2); + fp2_add(&t0, &t0, &t1); + fp2_add(&t0, &t0, &t2); + fp2_mul(&t0, &t0, &P->x); + fp2_mul(&t0, &t0, &P->z); + return fp2_is_square(&t0) || fp2_is_zero(&t0); +} + +void +ec_random_normalized_test(ec_point_t *P, const ec_curve_t *curve) +{ + fp2_set_one(&P->z); + while (1) { + fp2_random_test(&P->x); + if (projective_is_on_curve(P, curve)) { + break; + } + } +} + +void +ec_random_test(ec_point_t *P, const ec_curve_t *curve) +{ + ec_random_normalized_test(P, curve); + fp2_random_test(&P->z); + fp2_mul(&P->x, &P->x, &P->z); +} + +void +projective_difference_point(ec_point_t *PQ, const ec_point_t *P, const ec_point_t *Q, const ec_curve_t *curve) +{ + // Given P,Q in projective x-only, computes a deterministic choice for (P-Q) + // Based on Proposition 3 of https://eprint.iacr.org/2017/518.pdf + + fp2_t Bxx, Bxz, Bzz, t0, t1; + + fp2_mul(&t0, &P->x, &Q->x); + fp2_mul(&t1, &P->z, &Q->z); + fp2_sub(&Bxx, &t0, &t1); + fp2_sqr(&Bxx, &Bxx); + fp2_mul(&Bxx, &Bxx, &curve->C); // C*(P.x*Q.x-P.z*Q.z)^2 + fp2_add(&Bxz, &t0, &t1); + fp2_mul(&t0, &P->x, &Q->z); + fp2_mul(&t1, &P->z, &Q->x); + fp2_add(&Bzz, &t0, &t1); + fp2_mul(&Bxz, &Bxz, &Bzz); // (P.x*Q.x+P.z*Q.z)(P.x*Q.z+P.z*Q.x) + fp2_sub(&Bzz, &t0, &t1); + fp2_sqr(&Bzz, &Bzz); + fp2_mul(&Bzz, &Bzz, &curve->C); // C*(P.x*Q.z-P.z*Q.x)^2 + fp2_mul(&Bxz, &Bxz, &curve->C); // C*(P.x*Q.x+P.z*Q.z)(P.x*Q.z+P.z*Q.x) + fp2_mul(&t0, &t0, &t1); + fp2_mul(&t0, &t0, &curve->A); + fp2_add(&t0, &t0, &t0); + fp2_add(&Bxz, &Bxz, &t0); // C*(P.x*Q.x+P.z*Q.z)(P.x*Q.z+P.z*Q.x) + 2*A*P.x*Q.z*P.z*Q.x + + // Normalization: our squareroot always has the same sign as long as P.z, Q.z, and C + // are in Fp and C is a square, so the B's should be scaled by C*C_bar^2*P.z_bar^2*Q.Z_bar^2 + fp_copy(&t0.re, &curve->C.re); + fp_neg(&t0.im, &curve->C.im); + fp2_sqr(&t0, &t0); + fp2_mul(&t0, &t0, &curve->C); + fp_copy(&t1.re, &P->z.re); + fp_neg(&t1.im, &P->z.im); + fp2_sqr(&t1, &t1); + fp2_mul(&t0, &t0, &t1); + fp_copy(&t1.re, &Q->z.re); + fp_neg(&t1.im, &Q->z.im); + fp2_sqr(&t1, &t1); + fp2_mul(&t0, &t0, &t1); + fp2_mul(&Bxx, &Bxx, &t0); + fp2_mul(&Bxz, &Bxz, &t0); + fp2_mul(&Bzz, &Bzz, &t0); + + // Solving quadratic equation + fp2_sqr(&t0, &Bxz); + fp2_mul(&t1, &Bxx, &Bzz); + fp2_sub(&t0, &t0, &t1); + fp2_sqrt(&t0); + fp2_add(&PQ->x, &Bxz, &t0); + fp2_copy(&PQ->z, &Bzz); +} diff --git a/src/ec/ref/lvlx/test/test_extras.h b/src/ec/ref/lvlx/test/test_extras.h new file mode 100644 index 0000000..fb3d896 --- /dev/null +++ b/src/ec/ref/lvlx/test/test_extras.h @@ -0,0 +1,43 @@ + +#ifndef TEST_EXTRAS_H +#define TEST_EXTRAS_H + +#include +#include +#include +#include +#include +#include +#include + +#define PASSED 0 +#define FAILED 1 + +// Generating a pseudo-random field element in [0, p-1] +void fp_random_test(fp_t *a); + +// Generating a pseudo-random element in GF(p^2) +void fp2_random_test(fp2_t *a); + +// Generating a random projective x-only point +void ec_random_test(ec_point_t *P, const ec_curve_t *curve); + +// Generating a random projective x-only point and normalizing it +void ec_random_normalized_test(ec_point_t *P, const ec_curve_t *curve); + +// Point difference +void projective_difference_point(ec_point_t *PQ, const ec_point_t *P, const ec_point_t *Q, const ec_curve_t *curve); + +// xDBL +void xDBL(ec_point_t *Q, const ec_point_t *P, const ec_point_t *AC); + +// Double-and-add +extern void xDBLADD(ec_point_t *R, + ec_point_t *S, + const ec_point_t *P, + const ec_point_t *Q, + const ec_point_t *PQ, + const ec_point_t *A24, + const bool A24_normalized); + +#endif diff --git a/src/ec/ref/lvlx/xeval.c b/src/ec/ref/lvlx/xeval.c new file mode 100644 index 0000000..7fc7170 --- /dev/null +++ b/src/ec/ref/lvlx/xeval.c @@ -0,0 +1,64 @@ +#include "isog.h" +#include "ec.h" +#include + +// ----------------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------------------- + +// Degree-2 isogeny evaluation with kenerl generated by P != (0, 0) +void +xeval_2(ec_point_t *R, ec_point_t *const Q, const int lenQ, const ec_kps2_t *kps) +{ + fp2_t t0, t1, t2; + for (int j = 0; j < lenQ; j++) { + fp2_add(&t0, &Q[j].x, &Q[j].z); + fp2_sub(&t1, &Q[j].x, &Q[j].z); + fp2_mul(&t2, &kps->K.x, &t1); + fp2_mul(&t1, &kps->K.z, &t0); + fp2_add(&t0, &t2, &t1); + fp2_sub(&t1, &t2, &t1); + fp2_mul(&R[j].x, &Q[j].x, &t0); + fp2_mul(&R[j].z, &Q[j].z, &t1); + } +} + +void +xeval_2_singular(ec_point_t *R, const ec_point_t *Q, const int lenQ, const ec_kps2_t *kps) +{ + fp2_t t0, t1; + for (int i = 0; i < lenQ; i++) { + fp2_mul(&t0, &Q[i].x, &Q[i].z); + fp2_mul(&t1, &kps->K.x, &Q[i].z); + fp2_add(&t1, &t1, &Q[i].x); + fp2_mul(&t1, &t1, &Q[i].x); + fp2_sqr(&R[i].x, &Q[i].z); + fp2_add(&R[i].x, &R[i].x, &t1); + fp2_mul(&R[i].z, &t0, &kps->K.z); + } +} + +// Degree-4 isogeny evaluation with kenerl generated by P such that [2]P != (0, 0) +void +xeval_4(ec_point_t *R, const ec_point_t *Q, const int lenQ, const ec_kps4_t *kps) +{ + const ec_point_t *K = kps->K; + + fp2_t t0, t1; + + for (int i = 0; i < lenQ; i++) { + fp2_add(&t0, &Q[i].x, &Q[i].z); + fp2_sub(&t1, &Q[i].x, &Q[i].z); + fp2_mul(&(R[i].x), &t0, &K[1].x); + fp2_mul(&(R[i].z), &t1, &K[2].x); + fp2_mul(&t0, &t0, &t1); + fp2_mul(&t0, &t0, &K[0].x); + fp2_add(&t1, &(R[i].x), &(R[i].z)); + fp2_sub(&(R[i].z), &(R[i].x), &(R[i].z)); + fp2_sqr(&t1, &t1); + fp2_sqr(&(R[i].z), &(R[i].z)); + fp2_add(&(R[i].x), &t0, &t1); + fp2_sub(&t0, &t0, &(R[i].z)); + fp2_mul(&(R[i].x), &(R[i].x), &t1); + fp2_mul(&(R[i].z), &(R[i].z), &t0); + } +} diff --git a/src/ec/ref/lvlx/xisog.c b/src/ec/ref/lvlx/xisog.c new file mode 100644 index 0000000..7242d29 --- /dev/null +++ b/src/ec/ref/lvlx/xisog.c @@ -0,0 +1,61 @@ +#include "isog.h" +#include "ec.h" +#include + +// ------------------------------------------------------------------------- +// ------------------------------------------------------------------------- + +// Degree-2 isogeny with kernel generated by P != (0 ,0) +// Outputs the curve coefficient in the form A24=(A+2C:4C) +void +xisog_2(ec_kps2_t *kps, ec_point_t *B, const ec_point_t P) +{ + fp2_sqr(&B->x, &P.x); + fp2_sqr(&B->z, &P.z); + fp2_sub(&B->x, &B->z, &B->x); + fp2_add(&kps->K.x, &P.x, &P.z); + fp2_sub(&kps->K.z, &P.x, &P.z); +} + +void +xisog_2_singular(ec_kps2_t *kps, ec_point_t *B24, ec_point_t A24) +{ + // No need to check the square root, only used for signing. + fp2_t t0, four; + fp2_set_small(&four, 4); + fp2_add(&t0, &A24.x, &A24.x); + fp2_sub(&t0, &t0, &A24.z); + fp2_add(&t0, &t0, &t0); + fp2_inv(&A24.z); + fp2_mul(&t0, &t0, &A24.z); + fp2_copy(&kps->K.x, &t0); + fp2_add(&B24->x, &t0, &t0); + fp2_sqr(&t0, &t0); + fp2_sub(&t0, &t0, &four); + fp2_sqrt(&t0); + fp2_neg(&kps->K.z, &t0); + fp2_add(&B24->z, &t0, &t0); + fp2_add(&B24->x, &B24->x, &B24->z); + fp2_add(&B24->z, &B24->z, &B24->z); +} + +// Degree-4 isogeny with kernel generated by P such that [2]P != (0 ,0) +// Outputs the curve coefficient in the form A24=(A+2C:4C) +void +xisog_4(ec_kps4_t *kps, ec_point_t *B, const ec_point_t P) +{ + ec_point_t *K = kps->K; + + fp2_sqr(&K[0].x, &P.x); + fp2_sqr(&K[0].z, &P.z); + fp2_add(&K[1].x, &K[0].z, &K[0].x); + fp2_sub(&K[1].z, &K[0].z, &K[0].x); + fp2_mul(&B->x, &K[1].x, &K[1].z); + fp2_sqr(&B->z, &K[0].z); + + // Constants for xeval_4 + fp2_add(&K[2].x, &P.x, &P.z); + fp2_sub(&K[1].x, &P.x, &P.z); + fp2_add(&K[0].x, &K[0].z, &K[0].z); + fp2_add(&K[0].x, &K[0].x, &K[0].x); +} diff --git a/src/ec/ref/lvlx_test.cmake b/src/ec/ref/lvlx_test.cmake new file mode 100644 index 0000000..c553d40 --- /dev/null +++ b/src/ec/ref/lvlx_test.cmake @@ -0,0 +1,32 @@ +add_executable(curve-arith.test_${SVARIANT_LOWER} ${LVLX_DIR}/test/curve-arith-test.c ${LVLX_DIR}/test/test_extras.c) +target_include_directories(curve-arith.test_${SVARIANT_LOWER} PUBLIC ${INC_COMMON} ${INC_MP} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ../include ${INC_EC} .) +target_link_libraries(curve-arith.test_${SVARIANT_LOWER} ${LIB_EC_${SVARIANT_UPPER}} sqisign_common_test) + +add_executable(biextension.test_${SVARIANT_LOWER} ${LVLX_DIR}/test/biextension-test.c) +target_include_directories(biextension.test_${SVARIANT_LOWER} PUBLIC ${INC_COMMON} ${INC_MP} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ../include ${INC_EC} .) +target_link_libraries(biextension.test_${SVARIANT_LOWER} ${LIB_EC_${SVARIANT_UPPER}} sqisign_common_test) + +add_executable(basis-gen.test_${SVARIANT_LOWER} ${LVLX_DIR}/test/basis-gen-test.c) +target_include_directories(basis-gen.test_${SVARIANT_LOWER} PUBLIC ${INC_COMMON} ${INC_MP} ${LVLX_DIR}/test ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ../include ${INC_EC} .) +target_link_libraries(basis-gen.test_${SVARIANT_LOWER} ${LIB_EC_${SVARIANT_UPPER}}) + +add_test(curve_arith.test_${SVARIANT_LOWER} curve-arith.test_${SVARIANT_LOWER}) +add_test(ec_biextension.test_${SVARIANT_LOWER} biextension.test_${SVARIANT_LOWER}) +add_test(ec_basis_gen.test_${SVARIANT_LOWER} basis-gen.test_${SVARIANT_LOWER}) + +add_executable(curve-arith.bench_${SVARIANT_LOWER} ${LVLX_DIR}/test/curve-arith-bench.c ${LVLX_DIR}/test/test_extras.c) +target_include_directories(curve-arith.bench_${SVARIANT_LOWER} PUBLIC ${INC_COMMON} ${INC_MP} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ../include ${INC_EC} .) +target_link_libraries(curve-arith.bench_${SVARIANT_LOWER} ${LIB_EC_${SVARIANT_UPPER}} sqisign_common_sys) + +add_executable(biextension.bench_${SVARIANT_LOWER} ${LVLX_DIR}/test/biextension-bench.c) +target_include_directories(biextension.bench_${SVARIANT_LOWER} PUBLIC ${INC_COMMON} ${INC_MP} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ../include ${INC_EC} .) +target_link_libraries(biextension.bench_${SVARIANT_LOWER} ${LIB_EC_${SVARIANT_UPPER}} sqisign_common_sys) + +add_executable(basis-gen.bench_${SVARIANT_LOWER} ${LVLX_DIR}/test/basis-gen-bench.c) +target_include_directories(basis-gen.bench_${SVARIANT_LOWER} PUBLIC ${INC_COMMON} ${INC_MP} ${LVLX_DIR}/test ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ../include ${INC_EC} .) +target_link_libraries(basis-gen.bench_${SVARIANT_LOWER} ${LIB_EC_${SVARIANT_UPPER}}) + +set(BM_BINS ${BM_BINS} + curve-arith.bench_${SVARIANT_LOWER} basis-gen.bench_${SVARIANT_LOWER} biextension.bench_${SVARIANT_LOWER} + CACHE INTERNAL "List of benchmark executables") + diff --git a/src/gf/broadwell/CMakeLists.txt b/src/gf/broadwell/CMakeLists.txt index 3b414f0..d0ba315 100644 --- a/src/gf/broadwell/CMakeLists.txt +++ b/src/gf/broadwell/CMakeLists.txt @@ -1 +1,3 @@ +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) + include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/gf/broadwell/include/asm_preamble.h b/src/gf/broadwell/include/asm_preamble.h new file mode 100644 index 0000000..3ef7927 --- /dev/null +++ b/src/gf/broadwell/include/asm_preamble.h @@ -0,0 +1,22 @@ +#ifdef __APPLE__ +#define CAT(A, B) _CAT(A, B) +#define _CAT(A, B) A##B +#undef fp_add +#undef fp_sub +#undef fp_mul +#undef fp_sqr +#undef fp2_mul_c0 +#undef fp2_mul_c1 +#undef fp2_sq_c0 +#undef fp2_sq_c1 +#define p2 CAT(_, p2) +#define p CAT(_, p) +#define fp_add CAT(_, SQISIGN_NAMESPACE(fp_add)) +#define fp_sub CAT(_, SQISIGN_NAMESPACE(fp_sub)) +#define fp_mul CAT(_, SQISIGN_NAMESPACE(fp_mul)) +#define fp_sqr CAT(_, SQISIGN_NAMESPACE(fp_sqr)) +#define fp2_mul_c0 CAT(_, SQISIGN_NAMESPACE(fp2_mul_c0)) +#define fp2_mul_c1 CAT(_, SQISIGN_NAMESPACE(fp2_mul_c1)) +#define fp2_sq_c0 CAT(_, SQISIGN_NAMESPACE(fp2_sq_c0)) +#define fp2_sq_c1 CAT(_, SQISIGN_NAMESPACE(fp2_sq_c1)) +#endif diff --git a/src/gf/broadwell/include/fp2x.h b/src/gf/broadwell/include/fp2x.h new file mode 100644 index 0000000..44cf103 --- /dev/null +++ b/src/gf/broadwell/include/fp2x.h @@ -0,0 +1,162 @@ +#ifndef FP2X_H +#define FP2X_H + +#include +#include "fp.h" +#include + +// Structure for representing elements in GF(p^2) +typedef struct fp2_t +{ + fp_t re, im; +} fp2_t; + +static inline void +fp2_set_small(fp2_t *x, const uint32_t val) +{ + fp_set_small(&(x->re), val); + fp_set_zero(&(x->im)); +} + +static inline void +fp2_mul_small(fp2_t *x, const fp2_t *y, uint32_t n) +{ + fp_mul_small(&x->re, &y->re, n); + fp_mul_small(&x->im, &y->im, n); +} + +static inline void +fp2_set_zero(fp2_t *x) +{ + fp_set_zero(&(x->re)); + fp_set_zero(&(x->im)); +} + +static inline void +fp2_set_one(fp2_t *x) +{ + fp_set_one(&(x->re)); + fp_set_zero(&(x->im)); +} + +static inline uint32_t +fp2_is_equal(const fp2_t *a, const fp2_t *b) +{ // Compare two GF(p^2) elements in constant time + // Returns 1 (true) if a=b, 0 (false) otherwise + + return fp_is_equal(&(a->re), &(b->re)) & fp_is_equal(&(a->im), &(b->im)); +} + +static inline uint32_t +fp2_is_zero(const fp2_t *a) +{ // Is a GF(p^2) element zero? + // Returns 1 (true) if a=0, 0 (false) otherwise + + return fp_is_zero(&(a->re)) & fp_is_zero(&(a->im)); +} + +static inline uint32_t +fp2_is_one(const fp2_t *a) +{ // Is a GF(p^2) element one? + // Returns 1 (true) if a=0, 0 (false) otherwise + return fp_is_equal(&(a->re), &ONE) & fp_is_zero(&(a->im)); +} + +static inline void +fp2_half(fp2_t *x, const fp2_t *y) +{ + fp_half(&(x->re), &(y->re)); + fp_half(&(x->im), &(y->im)); +} + +static inline void +fp2_add(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_add(&(x->re), &(y->re), &(z->re)); + fp_add(&(x->im), &(y->im), &(z->im)); +} + +static inline void +fp2_add_one(fp2_t *x, const fp2_t *y) +{ + fp_add(&x->re, &y->re, &ONE); + fp_copy(&x->im, &y->im); +} + +static inline void +fp2_sub(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_sub(&(x->re), &(y->re), &(z->re)); + fp_sub(&(x->im), &(y->im), &(z->im)); +} + +static inline void +fp2_neg(fp2_t *x, const fp2_t *y) +{ + fp_neg(&(x->re), &(y->re)); + fp_neg(&(x->im), &(y->im)); +} + +#ifndef NO_FP2X_MUL +static inline void +fp2_mul(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_t t0, t1; + + fp_add(&t0, &(y->re), &(y->im)); + fp_add(&t1, &(z->re), &(z->im)); + fp_mul(&t0, &t0, &t1); + fp_mul(&t1, &(y->im), &(z->im)); + fp_mul(&(x->re), &(y->re), &(z->re)); + fp_sub(&(x->im), &t0, &t1); + fp_sub(&(x->im), &(x->im), &(x->re)); + fp_sub(&(x->re), &(x->re), &t1); +} +#endif + +#ifndef NO_FP2X_SQR +static inline void +fp2_sqr(fp2_t *x, const fp2_t *y) +{ + fp_t sum, diff; + + fp_add(&sum, &(y->re), &(y->im)); + fp_sub(&diff, &(y->re), &(y->im)); + fp_mul(&(x->im), &(y->re), &(y->im)); + fp_add(&(x->im), &(x->im), &(x->im)); + fp_mul(&(x->re), &sum, &diff); +} +#endif + +static inline void +fp2_select(fp2_t *d, const fp2_t *a0, const fp2_t *a1, uint32_t ctl) +{ + fp_select(&(d->re), &(a0->re), &(a1->re), ctl); + fp_select(&(d->im), &(a0->im), &(a1->im), ctl); +} + +static inline void +fp2_cswap(fp2_t *a, fp2_t *b, uint32_t ctl) +{ + fp_cswap(&(a->re), &(b->re), ctl); + fp_cswap(&(a->im), &(b->im), ctl); +} + +static inline void +fp2_copy(fp2_t *x, const fp2_t *y) +{ + *x = *y; +} + +// New functions +void fp2_encode(void *dst, const fp2_t *a); +uint32_t fp2_decode(fp2_t *d, const void *src); +void fp2_inv(fp2_t *x); +uint32_t fp2_is_square(const fp2_t *x); +void fp2_sqrt(fp2_t *x); +uint32_t fp2_sqrt_verify(fp2_t *a); +void fp2_batched_inv(fp2_t *x, int len); +void fp2_pow_vartime(fp2_t *out, const fp2_t *x, const uint64_t *exp, const int size); +void fp2_print(const char *name, const fp2_t *a); + +#endif diff --git a/src/gf/broadwell/lvl1/CMakeLists.txt b/src/gf/broadwell/lvl1/CMakeLists.txt index 5c6b64f..61da9a8 100644 --- a/src/gf/broadwell/lvl1/CMakeLists.txt +++ b/src/gf/broadwell/lvl1/CMakeLists.txt @@ -1,10 +1,6 @@ - -set(SOURCE_FILES_GF_${SVARIANT_UPPER}_BROADWELL - fp_asm.S fp.c fp2.c +set(SOURCE_FILES_GF_SPECIFIC + gf5248.c + fp_asm.S ) -add_library(${LIB_GF_${SVARIANT_UPPER}} ${SOURCE_FILES_GF_${SVARIANT_UPPER}_BROADWELL}) -target_include_directories(${LIB_GF_${SVARIANT_UPPER}} PRIVATE common ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} include ${PROJECT_SOURCE_DIR}/include ${INC_COMMON}) -target_compile_options(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/gf/broadwell/lvl1/Makefile b/src/gf/broadwell/lvl1/Makefile deleted file mode 100644 index d9aa6e3..0000000 --- a/src/gf/broadwell/lvl1/Makefile +++ /dev/null @@ -1,46 +0,0 @@ - -CC=gcc -CFLAGS= -O3 -std=gnu11 -Wall -march=native -Wno-missing-braces -Wno-logical-not-parentheses -LDFLAGS=-lm -AR=ar rcs -RANLIB=ranlib - -OBJECTS=objs/fp_p1913.o objs/fp.o objs/fp2.o objs/fp_asm.o objs/random.o - -all: lib tests - -objs/fp_p1913.o: fp_p1913.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp_p1913.c -o objs/fp_p1913.o - -objs/fp.o: fp.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp.c -o objs/fp.o - -objs/fp2.o: fp2.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp2.c -o objs/fp2.o - -objs/fp_asm.o: fp_asm.S - $(CC) -c $(CFLAGS) fp_asm.S -o objs/fp_asm.o - -objs/random.o: ../../../common/generic/randombytes_system.c - $(CC) -c $(CFLAGS) ../../../common/generic/randombytes_system.c -o objs/random.o - -lib: $(OBJECTS) - rm -rf lib - mkdir lib - $(AR) lib/libtest.a $^ - $(RANLIB) lib/libtest.a - -tests: lib - $(CC) $(CFLAGS) -L./lib test/test_fp.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp -lgmp - $(CC) $(CFLAGS) -L./lib test/test_fp2.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp2 -lgmp - -check: tests - -.PHONY: clean - -clean: - rm -rf *.req objs lib test_fp* - diff --git a/src/gf/broadwell/lvl1/fp.c b/src/gf/broadwell/lvl1/fp.c index 59ca87f..f7c7456 100644 --- a/src/gf/broadwell/lvl1/fp.c +++ b/src/gf/broadwell/lvl1/fp.c @@ -1,192 +1,95 @@ -#include "include/fp.h" +#include +#include "fp.h" -const uint64_t p[NWORDS_FIELD] = { 0xffffffffffffffff, 0x252C9E49355147FF, 0x33A6A86587407437, 0x34E29E286B95D98C }; -const uint64_t R2[NWORDS_FIELD] = { 0x233625AE400674D4, 0x20AFD6C1025A1C2E, 0x30A841AB0920655D, 0x0D72E7D67C30CD3D }; -const uint64_t pp[NWORDS_FIELD] = { 0x01, 0x00, 0x00, 0x00 }; +const digit_t p[NWORDS_FIELD] = { 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x04ffffffffffffff }; +const digit_t p2[NWORDS_FIELD] = { 0xfffffffffffffffe, 0xffffffffffffffff, 0xffffffffffffffff, 0x09ffffffffffffff }; - -void fp_set(digit_t* x, const digit_t val) -{ // Set field element x = val, where val has wordsize - - x[0] = val; - for (unsigned int i = 1; i < NWORDS_FIELD; i++) { - x[i] = 0; - } -} - -void fp_mont_setone(digit_t* out1) { - out1[0] = 0x4; - out1[1] = UINT64_C(0x6b4d86db2abae000); - out1[2] = UINT64_C(0x31655e69e2fe2f23); - out1[3] = UINT64_C(0x2c75875e51a899cf); -} - -bool fp_is_equal(const digit_t* a, const digit_t* b) -{ // Compare two field elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ b[i]; - - return (bool)is_digit_zero_ct(r); -} - -bool fp_is_zero(const digit_t* a) -{ // Is a field element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ 0; - - return (bool)is_digit_zero_ct(r); -} - -void fp_copy(digit_t* out, const digit_t* a) +void +fp_sqrt(fp_t *x) { - memcpy(out, a, NWORDS_FIELD*RADIX/8); + (void)gf5248_sqrt(x, x); } -void fp_neg(digit_t* out, const digit_t* a) -{ // Modular negation, out = -a mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - unsigned int i, borrow = 0; - - for (i = 0; i < NWORDS_FIELD; i++) { - SUBC(out[i], borrow, ((digit_t*)p)[i], a[i], borrow); - } - fp_sub(out, out, (digit_t*)p); +uint32_t +fp_is_square(const fp_t *a) +{ + // ls is (0, 1, -1) and we want fp_is_square + // to return 0xFF..FF when ls is 1 or 0 and 0x00..00 otherwise + int32_t ls = gf5248_legendre(a); + return ~(uint32_t)(ls >> 1); } -void fp_tomont(digit_t* out, const digit_t* a) -{ // Conversion to Montgomery representation - // out = a*R^2*R^(-1) mod p = a*R mod p, where a in [0, p-1]. - - fp_mul(out, a, (digit_t*)&R2); +void +fp_inv(fp_t *x) +{ + (void)gf5248_invert(x, x); } -void fp_frommont(digit_t* out, const digit_t* a) -{ // Conversion from Montgomery representation to standard representation - // out = a*R^(-1) mod p, where a in [0, p-1]. - digit_t one[NWORDS_FIELD] = {0}; - - one[0] = 1; - fp_mul(out, a, one); +void +fp_exp3div4(fp_t *a) +{ + // + // We optimise this by using the shape of the prime + // to avoid almost all multiplications: + // + // We write: + // (p - 3) / 4 = (5*2^248 - 4) / 4 + // = 5*2^246 - 1 + // = 5*(2^246 - 1) + 4 + // Then we first compute: + // a246 = a**(2^246 - 1) + // Then from this we get the desired result as: + // a**((p-3)/4) = a246**5 * a**4 + // We can compute this with 12 multiplications and 247 squares. + fp_t z4, t3, t6, tmp; + // Compute a**3 and a**4 + fp_sqr(&z4, a); + fp_mul(&tmp, a, &z4); + fp_sqr(&z4, &z4); + // Compute a**(2^3 - 1) = a**7 + fp_mul(&t3, &tmp, &z4); + // Compute a**(2^6 - 1) + fp_sqr(&t6, &t3); + for (int i = 1; i < 3; i++) + fp_sqr(&t6, &t6); + fp_mul(&t6, &t6, &t3); + // Compute a**(2^12 - 1) + fp_sqr(a, &t6); + for (int i = 1; i < 6; i++) + fp_sqr(a, a); + fp_mul(a, a, &t6); + // Compute a**(2^15 - 1) + for (int i = 0; i < 3; i++) + fp_sqr(a, a); + fp_mul(a, a, &t3); + // Compute a**(2^30 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 15; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^60 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 30; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^120 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 60; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^123 - 1) + for (int i = 0; i < 3; i++) + fp_sqr(a, a); + fp_mul(a, a, &t3); + // Compute a**(2^246 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 123; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(5*(2^246 - 1)) + fp_sqr(&tmp, a); + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(5*(2^246 - 1) + 4) + fp_mul(a, a, &z4); } - -void MUL(digit_t* out, const digit_t a, const digit_t b) -{ // Digit multiplication, digit*digit -> 2-digit result - // Inputs: a, b in [0, 2^w-1], where w is the computer wordsize - // Output: 0 < out < 2^(2w)-1 - register digit_t al, ah, bl, bh, temp; - digit_t albl, albh, ahbl, ahbh, res1, res2, res3, carry; - digit_t mask_low = (digit_t)(-1) >> (sizeof(digit_t)*4), mask_high = (digit_t)(-1) << (sizeof(digit_t)*4); - - al = a & mask_low; // Low part - ah = a >> (sizeof(digit_t)*4); // High part - bl = b & mask_low; - bh = b >> (sizeof(digit_t)*4); - - albl = al * bl; - albh = al * bh; - ahbl = ah * bl; - ahbh = ah * bh; - out[0] = albl & mask_low; // out00 - - res1 = albl >> (sizeof(digit_t)*4); - res2 = ahbl & mask_low; - res3 = albh & mask_low; - temp = res1 + res2 + res3; - carry = temp >> (sizeof(digit_t)*4); - out[0] ^= temp << (sizeof(digit_t)*4); // out01 - - res1 = ahbl >> (sizeof(digit_t)*4); - res2 = albh >> (sizeof(digit_t)*4); - res3 = ahbh & mask_low; - temp = res1 + res2 + res3 + carry; - out[1] = temp & mask_low; // out10 - carry = temp & mask_high; - out[1] ^= (ahbh & mask_high) + carry; // out11 -} - -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision right shift - digit_t bit_out = x[0] & 1; - - for (unsigned int i = 0; i < nwords-1; i++) { - SHIFTR(x[i+1], x[i], shift, x[i], RADIX); - } - x[nwords-1] >>= shift; - return bit_out; -} - -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision left shift - - for (int i = nwords-1; i > 0; i--) { - SHIFTL(x[i], x[i-1], shift, x[i], RADIX); - } - x[0] <<= shift; -} - -static void fp_exp3div4(digit_t* out, const digit_t* a) -{ // Fixed exponentiation out = a^((p-3)/4) mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - // Requirement: p = 3(mod 4) - fp_t p_t, acc; - digit_t bit; - - memcpy((digit_t*)p_t, (digit_t*)p, NWORDS_FIELD*RADIX/8); - memcpy((digit_t*)acc, (digit_t*)a, NWORDS_FIELD*RADIX/8); - mp_shiftr(p_t, 1, NWORDS_FIELD); - mp_shiftr(p_t, 1, NWORDS_FIELD); - fp_set(out, 1); - fp_tomont(out, out); - - for (int i = 0; i < NWORDS_FIELD*RADIX-2; i++) { - bit = p_t[0] & 1; - mp_shiftr(p_t, 1, NWORDS_FIELD); - if (bit == 1) { - fp_mul(out, out, acc); - } - fp_sqr(acc, acc); - } -} - -void fp_inv(digit_t* a) -{ // Modular inversion, out = x^-1*R mod p, where R = 2^(w*nwords), w is the computer wordsize and nwords is the number of words to represent p - // Input: a=xR in [0, p-1] - // Output: out in [0, p-1]. It outputs 0 if the input does not have an inverse - // Requirement: Ceiling(Log(p)) < w*nwords - fp_t t; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_sqr(t, t); - fp_mul(a, t, a); // a^(p-2) -} - -bool fp_is_square(const digit_t* a) -{ // Is field element a square? - // Output: out = 0 (false), 1 (true) - fp_t t, one; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_mul(t, t, a); // a^((p-1)/2) - fp_frommont(t, t); - fp_set(one, 1); - - return fp_is_equal(t, one); -} - -void fp_sqrt(digit_t* a) -{ // Square root computation, out = a^((p+1)/4) mod p - fp_t t; - - fp_exp3div4(t, a); - fp_mul(a, t, a); // a^((p+1)/4) -} \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/fp2.c b/src/gf/broadwell/lvl1/fp2.c deleted file mode 100644 index 01f30cb..0000000 --- a/src/gf/broadwell/lvl1/fp2.c +++ /dev/null @@ -1,190 +0,0 @@ -#include - -extern const digit_t R[NWORDS_FIELD]; - -extern void fp2_sq_c0(fp2_t *out, const fp2_t *in); -extern void fp2_sq_c1(fp_t *out, const fp2_t *in); - -extern void fp2_mul_c0(fp_t *out, const fp2_t *in0, const fp2_t *in1); -extern void fp2_mul_c1(fp_t *out, const fp2_t *in0, const fp2_t *in1); - -/* Arithmetic modulo X^2 + 1 */ - -void fp2_set(fp2_t* x, const digit_t val) -{ - fp_set(x->re, val); - fp_set(x->im, 0); -} - -bool fp2_is_zero(const fp2_t* a) -{ // Is a GF(p^2) element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - - return fp_is_zero(a->re) & fp_is_zero(a->im); -} - -bool fp2_is_equal(const fp2_t* a, const fp2_t* b) -{ // Compare two GF(p^2) elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - - return fp_is_equal(a->re, b->re) & fp_is_equal(a->im, b->im); -} - -void fp2_copy(fp2_t* x, const fp2_t* y) -{ - fp_copy(x->re, y->re); - fp_copy(x->im, y->im); -} - -fp2_t fp2_non_residue() -{ // 2 + i is a quadratic non-residue for p1913 - fp_t one = {0}; - fp2_t res; - - one[0] = 1; - fp_tomont(one, one); - fp_add(res.re, one, one); - fp_copy(res.im, one); - return res; -} - -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_add(x->re, y->re, z->re); - fp_add(x->im, y->im, z->im); -} - -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_sub(x->re, y->re, z->re); - fp_sub(x->im, y->im, z->im); -} - -void fp2_neg(fp2_t* x, const fp2_t* y) -{ - fp_neg(x->re, y->re); - fp_neg(x->im, y->im); -} - -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_t t; - - fp2_mul_c0(&t, y, z); // c0 = a0*b0 - a1*b1 - fp2_mul_c1(&x->im, y, z); // c1 = a0*b1 + a1*b0 - x->re[0] = t[0]; x->re[1] = t[1]; x->re[2] = t[2]; x->re[3] = t[3]; -} - -void fp2_sqr(fp2_t* x, const fp2_t* y) { - fp2_t t; - - fp2_sq_c0(&t, y); // c0 = (a0+a1)(a0-a1) - fp2_sq_c1(&x->im, y); // c1 = 2a0*a1 - x->re[0] = t.re[0]; x->re[1] = t.re[1]; x->re[2] = t.re[2]; x->re[3] = t.re[3]; -} - -void fp2_inv(fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - fp_inv(t0); - fp_mul(x->re, x->re, t0); - fp_mul(x->im, x->im, t0); - fp_neg(x->im, x->im); -} - -bool fp2_is_square(const fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - - return fp_is_square(t0); -} - -void fp2_frob(fp2_t* x, const fp2_t* y) -{ - memcpy((digit_t*)x->re, (digit_t*)y->re, NWORDS_FIELD*RADIX/8); - fp_neg(x->im, y->im); -} - -void fp2_tomont(fp2_t* x, const fp2_t* y) -{ - fp_tomont(x->re, y->re); - fp_tomont(x->im, y->im); -} - -void fp2_frommont(fp2_t* x, const fp2_t* y) -{ - fp_frommont(x->re, y->re); - fp_frommont(x->im, y->im); -} - -// NOTE: old, non-constant-time implementation. Could be optimized -void fp2_sqrt(fp2_t* x) -{ - fp_t sdelta, re, tmp1, tmp2, inv2, im; - - if (fp_is_zero(x->im)) { - if (fp_is_square(x->re)) { - fp_sqrt(x->re); - return; - } else { - fp_neg(x->im, x->re); - fp_sqrt(x->im); - fp_set(x->re, 0); - return; - } - } - - // sdelta = sqrt(re^2 + im^2) - fp_sqr(sdelta, x->re); - fp_sqr(tmp1, x->im); - fp_add(sdelta, sdelta, tmp1); - fp_sqrt(sdelta); - - fp_set(inv2, 2); - fp_tomont(inv2, inv2); // inv2 <- 2 - fp_inv(inv2); - fp_add(re, x->re, sdelta); - fp_mul(re, re, inv2); - memcpy((digit_t*)tmp2, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - if (!fp_is_square(tmp2)) { - fp_sub(re, x->re, sdelta); - fp_mul(re, re, inv2); - } - - fp_sqrt(re); - memcpy((digit_t*)im, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - fp_inv(im); - fp_mul(im, im, inv2); - fp_mul(x->im, im, x->im); - memcpy((digit_t*)x->re, (digit_t*)re, NWORDS_FIELD*RADIX/8); -} - -// Lexicographic comparison of two field elements. Returns +1 if x > y, -1 if x < y, 0 if x = y -int fp2_cmp(fp2_t* x, fp2_t* y){ - fp2_t a, b; - fp2_frommont(&a, x); - fp2_frommont(&b, y); - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.re[i] > b.re[i]) - return 1; - if(a.re[i] < b.re[i]) - return -1; - } - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.im[i] > b.im[i]) - return 1; - if(a.im[i] < b.im[i]) - return -1; - } - return 0; -} \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/fp_asm.S b/src/gf/broadwell/lvl1/fp_asm.S old mode 100644 new mode 100755 index c30123d..6da7ff7 --- a/src/gf/broadwell/lvl1/fp_asm.S +++ b/src/gf/broadwell/lvl1/fp_asm.S @@ -1,17 +1,27 @@ +#include .intel_syntax noprefix .set pbytes,32 .set plimbs,4 -.global p_plus_1 -p_plus_1: .quad 0x0000000000000000, 0x252C9E4935514800, 0x33A6A86587407437, 0x34E29E286B95D98C +#ifdef __APPLE__ +.section __TEXT,__const +#else +.section .rodata +#endif +p_plus_1: .quad 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0500000000000000 + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",@progbits +#endif + +#include .text .p2align 4,,15 .global fp_add fp_add: - push r12 xor rax, rax mov r8, [rsi] mov r9, [rsi+8] @@ -20,36 +30,34 @@ fp_add: add r8, [rdx] adc r9, [rdx+8] adc r10, [rdx+16] - adc r11, [rdx+24] - mov r12, [rip+p] - sub r8, r12 - mov rcx, [rip+p+8] - sbb r9, rcx - mov rsi, [rip+p+16] - sbb r10, rsi + adc r11, [rdx+24] + mov rax, r11 + shr rax, 59 + neg rax mov rdx, [rip+p+24] - sbb r11, rdx - sbb rax, 0 - - and r12, rax - and rcx, rax - and rsi, rax and rdx, rax + sub r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rdx - add r8, r12 - adc r9, rcx - adc r10, rsi - adc r11, rdx + mov rax, r11 + shr rax, 59 + neg rax + mov rdx, [rip+p+24] + and rdx, rax + sub r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rdx mov [rdi], r8 mov [rdi+8], r9 mov [rdi+16], r10 mov [rdi+24], r11 - pop r12 ret .global fp_sub fp_sub: - push r12 xor rax, rax mov r8, [rsi] mov r9, [rsi+8] @@ -61,23 +69,26 @@ fp_sub: sbb r11, [rdx+24] sbb rax, 0 - mov r12, [rip+p] - mov rcx, [rip+p+8] - mov rsi, [rip+p+16] mov rdx, [rip+p+24] - and r12, rax - and rcx, rax - and rsi, rax and rdx, rax - add r8, r12 - adc r9, rcx - adc r10, rsi + add r8, rax + adc r9, rax + adc r10, rax adc r11, rdx + + mov rax, r11 + sar rax, 59 + mov rdx, [rip+p+24] + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rdx + mov [rdi], r8 mov [rdi+8], r9 mov [rdi+16], r10 mov [rdi+24], r11 - pop r12 ret ///////////////////////////////////////////////////////////////// MACROS @@ -105,18 +116,11 @@ fp_sub: adc \Z4, 0 .endm -.macro MULADD64x192 M1, Z0, Z1, Z2, Z3, T0, T1 +.macro MULADD64x64 M1, Z0, Z1, Z2, Z3, T0, T1 mulx \T0, \T1, \M1 // A0*B0 xor rax, rax - adox \Z0, \T1 - adox \Z1, \T0 - mulx \T0, \T1, 8\M1 // A0*B1 - adcx \Z1, \T1 - adox \Z2, \T0 - mulx \T0, \T1, 16\M1 // A0*B2 - adcx \Z2, \T1 + adox \Z2, \T1 adox \Z3, \T0 - adc \Z3, 0 .endm //*********************************************************************** @@ -133,13 +137,13 @@ fp2_mul_c0: push r14 mov rcx, rdx - // [rdi0:3] <- p - b1 - mov r8, [rip+p] - mov r9, [rip+p+8] - mov r10, [rip+p+16] - mov r11, [rip+p+24] + // [rdi0:3] <- 2p - b1 + mov r8, [rip+p2] + mov r9, [rip+p2+8] + mov r10, r9 + mov r11, [rip+p2+24] mov rax, [rcx+32] - mov rdx, [rcx+40] + mov rdx, [rcx+40] sub r8, rax sbb r9, rdx mov rax, [rcx+48] @@ -167,7 +171,7 @@ fp2_mul_c0: MULADD64x256 [rsi+32], r8, r9, r10, r11, r12, r13, r14, rax // [r9:r12] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r8 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r9, r10, r11, r12, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r9, r10, r11, r12, r13, r14 // [r9:r12, r8] <- z = a0 x b01 - a1 x b11 + z mov rdx, [rcx+8] @@ -176,7 +180,7 @@ fp2_mul_c0: MULADD64x256 [rsi+32], r9, r10, r11, r12, r8, r13, r14, rax // [r10:r12, r8] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r9 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r10, r11, r12, r8, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r10, r11, r12, r8, r13, r14 // [r10:r12, r8:r9] <- z = a0 x b02 - a1 x b12 + z mov rdx, [rcx+16] @@ -185,7 +189,7 @@ fp2_mul_c0: MULADD64x256 [rsi+32], r10, r11, r12, r8, r9, r13, r14, rax // [r11:r12, r8:r9] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r10 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r11, r12, r8, r9, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r11, r12, r8, r9, r13, r14 // [r11:r12, r8:r10] <- z = a0 x b03 - a1 x b13 + z mov rdx, [rcx+24] @@ -194,27 +198,8 @@ fp2_mul_c0: MULADD64x256 [rsi+32], r11, r12, r8, r9, r10, r13, r14, rax // [r12, r8:r10] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r11 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r12, r8, r9, r10, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r12, r8, r9, r10, r13, r14 - // Final correction - mov rsi, [rip+p] - mov rcx, [rip+p+8] - mov rdx, [rip+p+16] - mov r11, [rip+p+24] - sub r12, rsi - sbb r8, rcx - sbb r9, rdx - sbb r10, r11 - sbb rax, 0 - and rsi, rax - and rcx, rax - and rdx, rax - and r11, rax - add r12, rsi - adc r8, rcx - adc r9, rdx - adc r10, r11 - mov [rdi], r12 mov [rdi+8], r8 mov [rdi+16], r9 @@ -254,7 +239,7 @@ fp2_mul_c1: MULADD64x256 [rsi+32], r8, r9, r10, r11, r12, r13, r14, rax // [r9:r12] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r8 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r9, r10, r11, r12, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r9, r10, r11, r12, r13, r14 // [r9:r12, r8] <- z = a0 x b01 - a1 x b11 + z mov rdx, [rcx+40] @@ -263,7 +248,7 @@ fp2_mul_c1: MULADD64x256 [rsi+32], r9, r10, r11, r12, r8, r13, r14, rax // [r10:r12, r8] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r9 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r10, r11, r12, r8, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r10, r11, r12, r8, r13, r14 // [r10:r12, r8:r9] <- z = a0 x b02 - a1 x b12 + z mov rdx, [rcx+48] @@ -272,7 +257,7 @@ fp2_mul_c1: MULADD64x256 [rsi+32], r10, r11, r12, r8, r9, r13, r14, rax // [r11:r12, r8:r9] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r10 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r11, r12, r8, r9, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r11, r12, r8, r9, r13, r14 // [r11:r12, r8:r10] <- z = a0 x b03 - a1 x b13 + z mov rdx, [rcx+56] @@ -281,27 +266,8 @@ fp2_mul_c1: MULADD64x256 [rsi+32], r11, r12, r8, r9, r10, r13, r14, rax // [r12, r8:r10] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, r11 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], r12, r8, r9, r10, r13, r14 + MULADD64x64 [rip+p_plus_1+24], r12, r8, r9, r10, r13, r14 - // Final correction - mov rsi, [rip+p] - mov rcx, [rip+p+8] - mov rdx, [rip+p+16] - mov r11, [rip+p+24] - sub r12, rsi - sbb r8, rcx - sbb r9, rdx - sbb r10, r11 - sbb rax, 0 - and rsi, rax - and rcx, rax - and rdx, rax - and r11, rax - add r12, rsi - adc r8, rcx - adc r9, rdx - adc r10, r11 - mov [rdi], r12 mov [rdi+8], r8 mov [rdi+16], r9 @@ -322,28 +288,28 @@ fp2_mul_c1: .macro FPMUL256x256 M0, M1, Z0, Z1, Z2, Z3, Z4, T0, T1 // [Z1:Z4] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, \Z0 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], \Z1, \Z2, \Z3, \Z4, \T0, \T1 + MULADD64x64 [rip+p_plus_1+24], \Z1, \Z2, \Z3, \Z4, \T0, \T1 // [Z1:Z4, Z0] <- z = a01 x a1 + z mov rdx, 8\M0 MULADD64x256 \M1, \Z1, \Z2, \Z3, \Z4, \Z0, \T0, \T1, \Z0 // [Z2:Z4, Z0] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, \Z1 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], \Z2, \Z3, \Z4, \Z0, \T0, \T1 + MULADD64x64 [rip+p_plus_1+24], \Z2, \Z3, \Z4, \Z0, \T0, \T1 // [Z2:Z4, Z0:Z1] <- z = a02 x a1 + z mov rdx, 16\M0 MULADD64x256 \M1, \Z2, \Z3, \Z4, \Z0, \Z1, \T0, \T1, \Z1 // [Z3:Z4, Z0:Z1] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, \Z2 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], \Z3, \Z4, \Z0, \Z1, \T0, \T1 + MULADD64x64 [rip+p_plus_1+24], \Z3, \Z4, \Z0, \Z1, \T0, \T1 // [Z3:Z4, Z0:Z2] <- z = a03 x a1 + z mov rdx, 24\M0 MULADD64x256 \M1, \Z3, \Z4, \Z0, \Z1, \Z2, \T0, \T1, \Z2 // [Z4, Z0:Z2] <- z = (z0 x p_plus_1 + z)/2^64 mov rdx, \Z3 // rdx <- z0 - MULADD64x192 [rip+p_plus_1+8], \Z4, \Z0, \Z1, \Z2, \T0, \T1 + MULADD64x64 [rip+p_plus_1+24], \Z4, \Z0, \Z1, \Z2, \T0, \T1 .endm //*********************************************************************** @@ -371,19 +337,21 @@ fp2_sq_c0: mov [rdi+16], r10 mov [rdi+24], r11 - // a0 - a1 + p + // a0 - a1 + 2p mov r8, [rsi] mov r10, [rsi+8] mov r12, [rsi+16] mov r13, [rsi+24] sub r8, [rsi+32] sbb r10, [rsi+40] - sbb r12, [rsi+48] + sbb r12, [rsi+48] sbb r13, [rsi+56] - add r8, [rip+p] - adc r10, [rip+p+8] - adc r12, [rip+p+16] - adc r13, [rip+p+24] + mov rax, [rip+p2] + add r8, rax + mov rax, [rip+p2+8] + adc r10, rax + adc r12, rax + adc r13, [rip+p2+24] mov [rdi+32], r8 mov [rdi+40], r10 mov [rdi+48], r12 @@ -402,25 +370,6 @@ fp2_sq_c0: FPMUL256x256 [rdi], [rdi+32], r8, r9, r10, r11, r12, r13, rcx - // Final correction - mov rsi, [rip+p] - mov rcx, [rip+p+8] - mov rdx, [rip+p+16] - mov r11, [rip+p+24] - sub r12, rsi - sbb r8, rcx - sbb r9, rdx - sbb r10, r11 - sbb rax, 0 - and rsi, rax - and rcx, rax - and rdx, rax - and r11, rax - add r12, rsi - adc r8, rcx - adc r9, rdx - adc r10, r11 - mov [rdi], r12 mov [rdi+8], r8 mov [rdi+16], r9 @@ -465,27 +414,8 @@ fp2_sq_c1: adox r12, rax FPMUL256x256 [rsp], [rsi+32], r8, r9, r10, r11, r12, r13, rcx - add rsp, 32 + add rsp, 32 - // Final correction - mov rsi, [rip+p] - mov rcx, [rip+p+8] - mov rdx, [rip+p+16] - mov r11, [rip+p+24] - sub r12, rsi - sbb r8, rcx - sbb r9, rdx - sbb r10, r11 - sbb rax, 0 - and rsi, rax - and rcx, rax - and rdx, rax - and r11, rax - add r12, rsi - adc r8, rcx - adc r9, rdx - adc r10, r11 - mov [rdi], r12 mov [rdi+8], r8 mov [rdi+16], r9 @@ -521,26 +451,7 @@ fp_mul: FPMUL256x256 [rcx], [rsi], r8, r9, r10, r11, r12, r13, r14 - // Final correction - mov rsi, [rip+p] - mov rcx, [rip+p+8] - mov rdx, [rip+p+16] - mov r11, [rip+p+24] - sub r12, rsi - sbb r8, rcx - sbb r9, rdx - sbb r10, r11 - sbb rax, 0 - and rsi, rax - and rcx, rax - and rdx, rax - and r11, rax - add r12, rsi - adc r8, rcx - adc r9, rdx - adc r10, r11 - - mov [rdi], r12 + mov [rdi], r12 mov [rdi+8], r8 mov [rdi+16], r9 mov [rdi+24], r10 @@ -552,4 +463,4 @@ fp_mul: .global fp_sqr fp_sqr: mov rdx, rsi - jmp fp_mul \ No newline at end of file + jmp fp_mul diff --git a/src/gf/broadwell/lvl1/gf5248.c b/src/gf/broadwell/lvl1/gf5248.c new file mode 100644 index 0000000..a5afc69 --- /dev/null +++ b/src/gf/broadwell/lvl1/gf5248.c @@ -0,0 +1,767 @@ +/* + * This code is derived from discussions with Thomas Pornin + */ + +#include "gf5248.h" + +// see gf5248.h +const gf5248 gf5248_ZERO = { 0, 0, 0, 0 }; + +// see gf5248.h +const gf5248 gf5248_ONE = { 0x0000000000000033, 0x0000000000000000, 0x0000000000000000, 0x0100000000000000 }; + +// see gf5248.h +const gf5248 gf5248_MINUS_ONE = { 0xFFFFFFFFFFFFFFCC, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF }; + +// Montgomery representation of 2^256. +static const gf5248 R2 = { 0x3333333333333d70, 0x3333333333333333, 0x3333333333333333, 0x0333333333333333 }; + +// The modulus itself (this is also a valid representation of zero). +static const gf5248 MODULUS = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x04FFFFFFFFFFFFFF }; + +// 1/2^244 (in Montgomery representation). +static const gf5248 INVT244 = { 0x0000000000001000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }; + +static const gf5248 PM1O3 = { 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa, 0x01aaaaaaaaaaaaaa }; + +// Normalize value *a into *d. +static inline void +inner_gf5248_normalize(gf5248 *d, const gf5248 *a) +{ + uint64_t d0, d1, d2, d3, m; + unsigned char cc; + + // Subtract q. + cc = inner_gf5248_sbb(0, a->v0, 0xFFFFFFFFFFFFFFFF, &d0); + cc = inner_gf5248_sbb(cc, a->v1, 0xFFFFFFFFFFFFFFFF, &d1); + cc = inner_gf5248_sbb(cc, a->v2, 0xFFFFFFFFFFFFFFFF, &d2); + cc = inner_gf5248_sbb(cc, a->v3, 0x04FFFFFFFFFFFFFF, &d3); + + // Add back q if the result is negative. + (void)inner_gf5248_sbb(cc, 0, 0, &m); + cc = inner_gf5248_adc(0, d0, m, &d0); + cc = inner_gf5248_adc(cc, d1, m, &d1); + cc = inner_gf5248_adc(cc, d2, m, &d2); + (void)inner_gf5248_adc(cc, d3, m & 0x04FFFFFFFFFFFFFF, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; +} + +// Expand the most significant bit of x into a full-width 64-bit word +// (0x0000000000000000 or 0xFFFFFFFFFFFFFFFF). +static inline uint64_t +sgnw(uint64_t x) +{ + return (uint64_t)(*(int64_t *)&x >> 63); +} + +// d <- u*f + v*g (in the field) +// Coefficients f and g are provided as unsigned integers, but they +// really are signed values which must be less than 2^62 (in absolute value). +static void +gf5248_lin(gf5248 *d, const gf5248 *u, const gf5248 *v, uint64_t f, uint64_t g) +{ + // f <- abs(f), keeping the sign in sf, and negating u accordingly + uint64_t sf = sgnw(f); + f = (f ^ sf) - sf; + gf5248 tu; + gf5248_neg(&tu, u); + gf5248_select(&tu, u, &tu, (uint32_t)sf); + + // g <- abs(g), keeping the sign in sg, and negating v accordingly + uint64_t sg = sgnw(g); + g = (g ^ sg) - sg; + gf5248 tv; + gf5248_neg(&tv, v); + gf5248_select(&tv, v, &tv, (uint32_t)sg); + + // Linear combination over plain integers. + uint64_t d0, d1, d2, d3, t; + inner_gf5248_umul_x2(d0, t, tu.v0, f, tv.v0, g); + inner_gf5248_umul_x2_add(d1, t, tu.v1, f, tv.v1, g, t); + inner_gf5248_umul_x2_add(d2, t, tu.v2, f, tv.v2, g, t); + inner_gf5248_umul_x2_add(d3, t, tu.v3, f, tv.v3, g, t); + + // Reduction: split into low part (248 bits) and high part + // (71 bits, since t can be up to 63 bits). If the high + // part is h, then: + // h*2^248 = (h mod 5)*2^248 + floor(h/5) mod q + uint64_t h0 = (d3 >> 56) | (t << 8); + uint64_t h1 = t >> 56; + d3 &= 0x00FFFFFFFFFFFFFF; + uint64_t z0, z1, quo0, rem0, quo1, rem1; + inner_gf5248_umul(z0, z1, h0, 0xCCCCCCCCCCCCCCCD); + (void)z0; + quo0 = z1 >> 2; + rem0 = h0 - (5 * quo0); + quo1 = (h1 * 0xCD) >> 10; + rem1 = h1 - (5 * quo1); + + // h = rem0 + 5*quo0 + (rem1 + 5*quo1)*2^64 + // = rem0 + rem1 + 5*(quo0 + quo1*2^64 + rem1*((2^64 - 1)/5)) + // We add rem0 and rem1 modulo 5, with an extra carry that + // goes into the folded part (multiple of 5). + uint64_t e, f0, f1; + unsigned char cc; + cc = inner_gf5248_adc(0, rem0 + 0xFFFFFFFFFFFFFFFA, rem1, &e); + cc = inner_gf5248_adc(cc, quo0, rem1 * 0x3333333333333333, &f0); + (void)inner_gf5248_adc(cc, quo1, 0, &f1); + e -= 0xFFFFFFFFFFFFFFFA; + + // Now we only have to add e*2^248 + f0:f1 to the low part. + cc = inner_gf5248_adc(0, d0, f0, &d0); + cc = inner_gf5248_adc(cc, d1, f1, &d1); + cc = inner_gf5248_adc(cc, d2, 0, &d2); + (void)inner_gf5248_adc(cc, d3, e << 56, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; +} + +// d <- abs(floor((a*f + b*g) / 2^31)) +// Coefficients f and g are provided as unsigned integer, but they really +// are signed values, which MUST be at most 2^31 in absolute value. +// The computation is performed over the integers, not modulo q. The low +// 31 bits are dropped (in practice, callers provided appropriate coefficients +// f and g such that a*f + b*g is a multiple of 2^31. +// +// If a*f + b*g is negative, then the absolute value is computed, and the +// function returns 0xFFFFFFFFFFFFFFFF; otherwise, the function returns +// 0x0000000000000000. +static uint64_t +lindiv31abs(gf5248 *d, const gf5248 *a, const gf5248 *b, uint64_t f, uint64_t g) +{ + // f <- abs(f), keeping the sign in sf + uint64_t sf = sgnw(f); + f = (f ^ sf) - sf; + + // g <- abs(g), keeping the sign in sg + uint64_t sg = sgnw(g); + g = (g ^ sg) - sg; + + // Apply the signs of f and g to the source operands. + uint64_t a0, a1, a2, a3, a4; + uint64_t b0, b1, b2, b3, b4; + unsigned char cc; + + cc = inner_gf5248_sbb(0, a->v0 ^ sf, sf, &a0); + cc = inner_gf5248_sbb(cc, a->v1 ^ sf, sf, &a1); + cc = inner_gf5248_sbb(cc, a->v2 ^ sf, sf, &a2); + cc = inner_gf5248_sbb(cc, a->v3 ^ sf, sf, &a3); + (void)inner_gf5248_sbb(cc, 0, 0, &a4); + + cc = inner_gf5248_sbb(0, b->v0 ^ sg, sg, &b0); + cc = inner_gf5248_sbb(cc, b->v1 ^ sg, sg, &b1); + cc = inner_gf5248_sbb(cc, b->v2 ^ sg, sg, &b2); + cc = inner_gf5248_sbb(cc, b->v3 ^ sg, sg, &b3); + (void)inner_gf5248_sbb(cc, 0, 0, &b4); + + // Compute a*f + b*g into d0:d1:d2:d3:d4. Since f and g are at + // most 2^31, we can add two 128-bit products with no overflow. + // Note: a4 and b4 are both in {0, -1}. + uint64_t d0, d1, d2, d3, d4, t; + inner_gf5248_umul_x2(d0, t, a0, f, b0, g); + inner_gf5248_umul_x2_add(d1, t, a1, f, b1, g, t); + inner_gf5248_umul_x2_add(d2, t, a2, f, b2, g, t); + inner_gf5248_umul_x2_add(d3, t, a3, f, b3, g, t); + d4 = t - (a4 & f) - (b4 & g); + + // Right-shift the value by 31 bits. + d0 = (d0 >> 31) | (d1 << 33); + d1 = (d1 >> 31) | (d2 << 33); + d2 = (d2 >> 31) | (d3 << 33); + d3 = (d3 >> 31) | (d4 << 33); + + // If the result is negative, negate it. + t = sgnw(d4); + cc = inner_gf5248_sbb(0, d0 ^ t, t, &d0); + cc = inner_gf5248_sbb(cc, d1 ^ t, t, &d1); + cc = inner_gf5248_sbb(cc, d2 ^ t, t, &d2); + (void)inner_gf5248_sbb(cc, d3 ^ t, t, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + return t; +} + +// lzcnt(x) returns the number of leading bits of value 0 in x. It supports +// x == 0 (in which case the function returns 64). +#if defined __LZCNT__ +static inline uint64_t +lzcnt(uint64_t x) +{ + return _lzcnt_u64(x); +} +#else +static inline uint64_t +lzcnt(uint64_t x) +{ + uint64_t m, s; + m = sgnw((x >> 32) - 1); + s = m & 32; + x = (x >> 32) ^ (m & (x ^ (x >> 32))); + m = sgnw((x >> 16) - 1); + s |= m & 16; + x = (x >> 16) ^ (m & (x ^ (x >> 16))); + m = sgnw((x >> 8) - 1); + s |= m & 8; + x = (x >> 8) ^ (m & (x ^ (x >> 8))); + m = sgnw((x >> 4) - 1); + s |= m & 4; + x = (x >> 4) ^ (m & (x ^ (x >> 4))); + m = sgnw((x >> 2) - 1); + s |= m & 2; + x = (x >> 2) ^ (m & (x ^ (x >> 2))); + + // At this point, x fits on 2 bits. Count of extra zeros: + // x = 0 -> 2 + // x = 1 -> 1 + // x = 2 -> 0 + // x = 3 -> 0 + s += (2 - x) & ((x - 3) >> 2); + return s; +} +#endif + +// see gf5248.h +uint32_t +gf5248_div(gf5248 *d, const gf5248 *x, const gf5248 *y) +{ + // Extended binary GCD: + // + // a <- y + // b <- q (modulus) + // u <- x (self) + // v <- 0 + // + // Value a is normalized (in the 0..q-1 range). Values a and b are + // then considered as (signed) integers. Values u and v are field + // elements. + // + // Invariants: + // a*x = y*u mod q + // b*x = y*v mod q + // b is always odd + // + // At each step: + // if a is even, then: + // a <- a/2, u <- u/2 mod q + // else: + // if a < b: + // (a, u, b, v) <- (b, v, a, u) + // a <- (a-b)/2, u <- (u-v)/2 mod q + // + // What we implement below is the optimized version of this + // algorithm, as described in https://eprint.iacr.org/2020/972 + + gf5248 a, b, u, v; + uint64_t xa, xb, f0, g0, f1, g1; + uint32_t r; + + r = ~gf5248_iszero(y); + inner_gf5248_normalize(&a, y); + b = MODULUS; + u = *x; + v = gf5248_ZERO; + + // Generic loop does 15*31 = 465 inner iterations. + for (int i = 0; i < 15; i++) { + // Get approximations of a and b over 64 bits: + // - If len(a) <= 64 and len(b) <= 64, then we just use + // their values (low limbs). + // - Otherwise, with n = max(len(a), len(b)), we use: + // (a mod 2^31) + 2^31*floor(a / 2^(n - 33)) + // (b mod 2^31) + 2^31*floor(b / 2^(n - 33)) + uint64_t m3 = a.v3 | b.v3; + uint64_t m2 = a.v2 | b.v2; + uint64_t m1 = a.v1 | b.v1; + uint64_t tnz3 = sgnw(m3 | -m3); + uint64_t tnz2 = sgnw(m2 | -m2) & ~tnz3; + uint64_t tnz1 = sgnw(m1 | -m1) & ~tnz3 & ~tnz2; + uint64_t tnzm = (m3 & tnz3) | (m2 & tnz2) | (m1 & tnz1); + uint64_t tnza = (a.v3 & tnz3) | (a.v2 & tnz2) | (a.v1 & tnz1); + uint64_t tnzb = (b.v3 & tnz3) | (b.v2 & tnz2) | (b.v1 & tnz1); + uint64_t snza = (a.v2 & tnz3) | (a.v1 & tnz2) | (a.v0 & tnz1); + uint64_t snzb = (b.v2 & tnz3) | (b.v1 & tnz2) | (b.v0 & tnz1); + + // If both len(a) <= 64 and len(b) <= 64, then: + // tnzm = 0 + // tnza = 0, snza = 0, tnzb = 0, snzb = 0 + // Otherwise: + // tnzm != 0 + // tnza contains the top non-zero limb of a + // snza contains the limb right below tnza + // tnzb contains the top non-zero limb of a + // snzb contains the limb right below tnzb + // + // We count the number of leading zero bits in tnzm: + // - If s <= 31, then the top 31 bits can be extracted from + // tnza and tnzb alone. + // - If 32 <= s <= 63, then we need some bits from snza and + // snzb as well. + int64_t s = lzcnt(tnzm); + uint64_t sm = (uint64_t)((31 - s) >> 63); + tnza ^= sm & (tnza ^ ((tnza << 32) | (snza >> 32))); + tnzb ^= sm & (tnzb ^ ((tnzb << 32) | (snzb >> 32))); + s -= 32 & sm; + tnza <<= s; + tnzb <<= s; + + // At this point: + // - If len(a) <= 64 and len(b) <= 64, then: + // tnza = 0 + // tnzb = 0 + // tnz1 = tnz2 = tnz3 = 0 + // we want to use the entire low words of a and b + // - Otherwise, we want to use the top 33 bits of tnza and + // tnzb, and the low 31 bits of the low words of a and b. + uint64_t tzx = ~(tnz1 | tnz2 | tnz3); + tnza |= a.v0 & tzx; + tnzb |= b.v0 & tzx; + xa = (a.v0 & 0x7FFFFFFF) | (tnza & 0xFFFFFFFF80000000); + xb = (b.v0 & 0x7FFFFFFF) | (tnzb & 0xFFFFFFFF80000000); + + // Compute the 31 inner iterations on xa and xb. + uint64_t fg0 = (uint64_t)1; + uint64_t fg1 = (uint64_t)1 << 32; + for (int j = 0; j < 31; j++) { + uint64_t a_odd, swap, t0, t1, t2; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf5248_sbb(0, xa, xb, &t0); + (void)inner_gf5248_sbb(cc, 0, 0, &swap); + swap &= a_odd; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + xa >>= 1; + fg1 <<= 1; + } + fg0 += 0x7FFFFFFF7FFFFFFF; + fg1 += 0x7FFFFFFF7FFFFFFF; + f0 = (fg0 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0 >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1 >> 32) - (uint64_t)0x7FFFFFFF; + + // Propagate updates to a, b, u and v. + gf5248 na, nb, nu, nv; + uint64_t nega = lindiv31abs(&na, &a, &b, f0, g0); + uint64_t negb = lindiv31abs(&nb, &a, &b, f1, g1); + f0 = (f0 ^ nega) - nega; + g0 = (g0 ^ nega) - nega; + f1 = (f1 ^ negb) - negb; + g1 = (g1 ^ negb) - negb; + gf5248_lin(&nu, &u, &v, f0, g0); + gf5248_lin(&nv, &u, &v, f1, g1); + a = na; + b = nb; + u = nu; + v = nv; + } + + // If y is invertible, then the final GCD is 1, and + // len(a) + len(b) <= 37, so we can end the computation with + // the low words directly. We only need 35 iterations to reach + // the point where b = 1. + // + // If y is zero, then v is unchanged (hence zero) and none of + // the subsequent iterations will change it either, so we get + // 0 on output, which is what we want. + xa = a.v0; + xb = b.v0; + f0 = 1; + g0 = 0; + f1 = 0; + g1 = 1; + for (int j = 0; j < 35; j++) { + uint64_t a_odd, swap, t0, t1, t2, t3; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf5248_sbb(0, xa, xb, &t0); + (void)inner_gf5248_sbb(cc, 0, 0, &swap); + swap &= a_odd; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (f0 ^ f1); + f0 ^= t2; + f1 ^= t2; + t3 = swap & (g0 ^ g1); + g0 ^= t3; + g1 ^= t3; + xa -= a_odd & xb; + f0 -= a_odd & f1; + g0 -= a_odd & g1; + xa >>= 1; + f1 <<= 1; + g1 <<= 1; + } + gf5248_lin(d, &u, &v, f1, g1); + + // At the point: + // - Numerator and denominator were both in Montgomery representation, + // but the two factors R canceled each other. + // - We have injected 31*15+35 = 500 extra factors of 2, hence we + // must divide the result by 2^500. + // - However, we also want to obtain the result in Montgomery + // representation, i.e. multiply by 2^256. We thus want to + // divide the current result by 2^(500 - 256) = 2^244. + // - We do this division by using a Montgomery multiplication with + // the Montgomery representation of 1/2^244, i.e. the integer + // 2^256/2^244 = 4096. + gf5248_mul(d, d, &INVT244); + return r; +} + +// see gf5248.h +uint32_t +gf5248_invert(gf5248 *d, const gf5248 *a) +{ + return gf5248_div(d, &gf5248_ONE, a); +} + +// see gf5248.h +int32_t +gf5248_legendre(const gf5248 *x) +{ + // Same algorithm as the binary GCD in gf5248_div(), with + // a few differences: + // - We do not keep track of the Bézout coefficients u and v. + // - In each inner iteration we adjust the running symbol value, + // which uses the low 3 bits of the values. + // - Since we need two extra bits of look-ahead, we can only run + // 29 inner iterations, and then need an extra recomputation + // for the last 2. + + gf5248 a, b; + uint64_t xa, xb, f0, g0, f1, g1, ls; + + inner_gf5248_normalize(&a, x); + b = MODULUS; + ls = 0; // running symbol information in bit 1. + + // Outer loop + for (int i = 0; i < 15; i++) { + // Get approximations of a and b over 64 bits. + uint64_t m3 = a.v3 | b.v3; + uint64_t m2 = a.v2 | b.v2; + uint64_t m1 = a.v1 | b.v1; + uint64_t tnz3 = sgnw(m3 | -m3); + uint64_t tnz2 = sgnw(m2 | -m2) & ~tnz3; + uint64_t tnz1 = sgnw(m1 | -m1) & ~tnz3 & ~tnz2; + uint64_t tnzm = (m3 & tnz3) | (m2 & tnz2) | (m1 & tnz1); + uint64_t tnza = (a.v3 & tnz3) | (a.v2 & tnz2) | (a.v1 & tnz1); + uint64_t tnzb = (b.v3 & tnz3) | (b.v2 & tnz2) | (b.v1 & tnz1); + uint64_t snza = (a.v2 & tnz3) | (a.v1 & tnz2) | (a.v0 & tnz1); + uint64_t snzb = (b.v2 & tnz3) | (b.v1 & tnz2) | (b.v0 & tnz1); + + int64_t s = lzcnt(tnzm); + uint64_t sm = (uint64_t)((31 - s) >> 63); + tnza ^= sm & (tnza ^ ((tnza << 32) | (snza >> 32))); + tnzb ^= sm & (tnzb ^ ((tnzb << 32) | (snzb >> 32))); + s -= 32 & sm; + tnza <<= s; + tnzb <<= s; + + uint64_t tzx = ~(tnz1 | tnz2 | tnz3); + tnza |= a.v0 & tzx; + tnzb |= b.v0 & tzx; + xa = (a.v0 & 0x7FFFFFFF) | (tnza & 0xFFFFFFFF80000000); + xb = (b.v0 & 0x7FFFFFFF) | (tnzb & 0xFFFFFFFF80000000); + + // First 290 inner iterations. + uint64_t fg0 = (uint64_t)1; + uint64_t fg1 = (uint64_t)1 << 32; + for (int j = 0; j < 29; j++) { + uint64_t a_odd, swap, t0, t1, t2; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf5248_sbb(0, xa, xb, &t0); + (void)inner_gf5248_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & xa & xb; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + xa >>= 1; + fg1 <<= 1; + ls ^= (xb + 2) >> 1; + } + + // Compute the updated a and b (low words only) to get + // enough bits for the next two iterations. + uint64_t fg0z = fg0 + 0x7FFFFFFF7FFFFFFF; + uint64_t fg1z = fg1 + 0x7FFFFFFF7FFFFFFF; + f0 = (fg0z & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0z >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1z & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1z >> 32) - (uint64_t)0x7FFFFFFF; + uint64_t a0 = (a.v0 * f0 + b.v0 * g0) >> 29; + uint64_t b0 = (a.v0 * f1 + b.v0 * g1) >> 29; + for (int j = 0; j < 2; j++) { + uint64_t a_odd, swap, t0, t1, t2, t3; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf5248_sbb(0, xa, xb, &t0); + (void)inner_gf5248_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & a0 & b0; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + t3 = swap & (a0 ^ b0); + a0 ^= t3; + b0 ^= t3; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + a0 -= a_odd & b0; + xa >>= 1; + fg1 <<= 1; + a0 >>= 1; + ls ^= (b0 + 2) >> 1; + } + + // Propagate updates to a and b. + fg0 += 0x7FFFFFFF7FFFFFFF; + fg1 += 0x7FFFFFFF7FFFFFFF; + f0 = (fg0 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0 >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1 >> 32) - (uint64_t)0x7FFFFFFF; + gf5248 na, nb; + uint64_t nega = lindiv31abs(&na, &a, &b, f0, g0); + (void)lindiv31abs(&nb, &a, &b, f1, g1); + ls ^= nega & nb.v0; + a = na; + b = nb; + } + + // Final iterations: values are at most 37 bits now. We do not + // need to keep track of update coefficients. Just like the GCD, + // we need only 35 iterations, because after 35 iterations, + // value a is 0 or 1, and b is 1, and no further modification to + // the Legendre symbol may happen. + xa = a.v0; + xb = b.v0; + for (int j = 0; j < 35; j++) { + uint64_t a_odd, swap, t0, t1; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf5248_sbb(0, xa, xb, &t0); + (void)inner_gf5248_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & xa & xb; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + xa -= a_odd & xb; + xa >>= 1; + ls ^= (xb + 2) >> 1; + } + + // At this point, if the source value was not zero, then the low + // bit of ls contains the QR status (0 = square, 1 = non-square), + // which we need to convert to the expected value (+1 or -1). + // If y == 0, then we return 0, per the API. + uint32_t r = 1 - ((uint32_t)ls & 2); + r &= ~gf5248_iszero(x); + return *(int32_t *)&r; +} + +// see gf5248.h +uint32_t +gf5248_sqrt(gf5248 *d, const gf5248 *a) +{ + // Candidate root is a^((q+1)/4), with (q+1)/4 = 5*2^246 + gf5248 y; + gf5248_xsquare(&y, a, 2); + gf5248_mul(&y, &y, a); + gf5248_xsquare(&y, &y, 246); + + // Normalize y and negate if necessary, to set the low bit to 0. + // The low bit check must be on the normal representation, + // not the Montgomery representation. + gf5248 yn; + inner_gf5248_montgomery_reduce(&yn, &y); + uint32_t ctl = -((uint32_t)yn.v0 & 1); + gf5248_neg(&yn, &y); + gf5248_select(&y, &y, &yn, ctl); + + // Check whether the candidate is indeed a square root. + gf5248_square(&yn, &y); + uint32_t r = gf5248_equals(&yn, a); + *d = y; + return r; +} + +// Little-endian encoding of a 64-bit integer. +static inline void +enc64le(void *dst, uint64_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); + buf[4] = (uint8_t)(x >> 32); + buf[5] = (uint8_t)(x >> 40); + buf[6] = (uint8_t)(x >> 48); + buf[7] = (uint8_t)(x >> 56); +} + +// Little-endian decoding of a 64-bit integer. +static inline uint64_t +dec64le(const void *src) +{ + const uint8_t *buf = src; + return (uint64_t)buf[0] | ((uint64_t)buf[1] << 8) | ((uint64_t)buf[2] << 16) | ((uint64_t)buf[3] << 24) | + ((uint64_t)buf[4] << 32) | ((uint64_t)buf[5] << 40) | ((uint64_t)buf[6] << 48) | ((uint64_t)buf[7] << 56); +} + +// see gf5248.h +void +gf5248_encode(void *dst, const gf5248 *a) +{ + uint8_t *buf = dst; + gf5248 x; + + inner_gf5248_montgomery_reduce(&x, a); + enc64le(buf, x.v0); + enc64le(buf + 8, x.v1); + enc64le(buf + 16, x.v2); + enc64le(buf + 24, x.v3); +} + +// see gf5248.h +uint32_t +gf5248_decode(gf5248 *d, const void *src) +{ + const uint8_t *buf = src; + uint64_t d0, d1, d2, d3, t; + unsigned char cc; + + d0 = dec64le(buf); + d1 = dec64le(buf + 8); + d2 = dec64le(buf + 16); + d3 = dec64le(buf + 24); + cc = inner_gf5248_sbb(0, d0, MODULUS.v0, &t); + cc = inner_gf5248_sbb(cc, d1, MODULUS.v1, &t); + cc = inner_gf5248_sbb(cc, d2, MODULUS.v2, &t); + cc = inner_gf5248_sbb(cc, d3, MODULUS.v3, &t); + (void)inner_gf5248_sbb(cc, 0, 0, &t); + + // If the value was not canonical then t = 0; otherwise, t = -1. + d->v0 = d0 & t; + d->v1 = d1 & t; + d->v2 = d2 & t; + d->v3 = d3 & t; + + // Convert to Montgomery representation. + gf5248_mul(d, d, &R2); + + return (uint32_t)t; +} + +// see gf5248.h +void +gf5248_decode_reduce(gf5248 *d, const void *src, size_t len) +{ + const uint8_t *buf = src; + + *d = gf5248_ZERO; + if (len == 0) { + return; + } + + if ((len & 31) != 0) { + // Input size is not a multiple of 32, we decode a partial + // block, which is already less than 2^248. + uint8_t tmp[32]; + size_t k; + + k = len & ~(size_t)31; + memcpy(tmp, buf + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + d->v0 = dec64le(&tmp[0]); + d->v1 = dec64le(&tmp[8]); + d->v2 = dec64le(&tmp[16]); + d->v3 = dec64le(&tmp[24]); + len = k; + } else { + // Input size is a multiple of 32, we decode a full block, + // and a reduction is needed. + len -= 32; + uint64_t d0 = dec64le(buf + len); + uint64_t d1 = dec64le(buf + len + 8); + uint64_t d2 = dec64le(buf + len + 16); + uint64_t d3 = dec64le(buf + len + 24); + inner_gf5248_partial_reduce(d, d0, d1, d2, d3); + } + + // Process all remaining blocks, in descending address order. + while (len > 0) { + gf5248_mul(d, d, &R2); + len -= 32; + uint64_t t0 = dec64le(buf + len); + uint64_t t1 = dec64le(buf + len + 8); + uint64_t t2 = dec64le(buf + len + 16); + uint64_t t3 = dec64le(buf + len + 24); + gf5248 t; + inner_gf5248_partial_reduce(&t, t0, t1, t2, t3); + gf5248_add(d, d, &t); + } + + // Final conversion to Montgomery representation. + gf5248_mul(d, d, &R2); +} + +void +gf5248_div3(gf5248 *d, const gf5248 *a) +{ + const digit_t MAGIC = 0xAAAAAAAAAAAAAAAB; // 3^-1 mod 2^64 + uint64_t c0, c1, f0, f1; + gf5248 t; + + inner_gf5248_umul(f0, f1, a->arr[3], MAGIC); + t.arr[3] = f1 >> 1; + c1 = a->arr[3] - 3 * t.arr[3]; + + for (int32_t i = 2; i >= 0; i--) { + c0 = c1; + inner_gf5248_umul(f0, f1, a->arr[i], MAGIC); + t.arr[i] = f1 >> 1; + c1 = c0 + a->arr[i] - 3 * t.arr[i]; + t.arr[i] += c0 * ((MAGIC - 1) >> 1); + f0 = ((c1 >> 1) & c1); /* c1 == 3 */ + f1 = ((c1 >> 2) & !(c1 & 0x11)); /* c1 == 4 */ + f0 |= f1; + t.arr[i] += f0; + c1 = c1 - 3 * f0; + } + *d = t; + gf5248_sub(&t, d, &PM1O3); + gf5248_select(d, d, &t, -((c1 & 1) | (c1 >> 1))); // c1 >= 1 + gf5248_sub(&t, d, &PM1O3); + gf5248_select(d, d, &t, -(c1 == 2)); +} \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/include/fp.h b/src/gf/broadwell/lvl1/include/fp.h index 7fb11af..8564b9c 100644 --- a/src/gf/broadwell/lvl1/include/fp.h +++ b/src/gf/broadwell/lvl1/include/fp.h @@ -1,7 +1,8 @@ #ifndef FP_H #define FP_H -//////////////////////////////////////////////// NOTE: this is placed here for now +// Include statements +#include #include #include #include @@ -10,67 +11,129 @@ #include #include -typedef digit_t fp_t[NWORDS_FIELD]; // Datatype for representing field elements +#include "gf5248.h" -void fp_set(digit_t* x, const digit_t val); -bool fp_is_equal(const digit_t* a, const digit_t* b); -bool fp_is_zero(const digit_t* a); -void fp_copy(digit_t* out, const digit_t* a); -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords); -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords); -void fp_add(digit_t* out, const digit_t* a, const digit_t* b); -void fp_sub(digit_t* out, const digit_t* a, const digit_t* b); -void fp_neg(digit_t* out, const digit_t* a); -void fp_sqr(digit_t* out, const digit_t* a); -void fp_mul(digit_t* out, const digit_t* a, const digit_t* b); -void MUL(digit_t* out, const digit_t a, const digit_t b); -void fp_inv(digit_t* x); -bool fp_is_square(const digit_t* a); -void fp_sqrt(digit_t* a); -void fp_tomont(digit_t* out, const digit_t* a); -void fp_frommont(digit_t* out, const digit_t* a); -void fp_mont_setone(digit_t* out); +// Type for elements of GF(p) +#define fp_t gf5248 -/********************** Constant-time unsigned comparisons ***********************/ +// Constants (Assumed to be in Montgomery form) +#define ZERO gf5248_ZERO +#define ONE gf5248_ONE -// The following functions return 1 (TRUE) if condition is true, 0 (FALSE) otherwise - -static inline unsigned int is_digit_nonzero_ct(digit_t x) -{ // Is x != 0? - return (unsigned int)((x | (0 - x)) >> (RADIX - 1)); +// Operations in fp +static inline void +fp_neg(fp_t *d, const fp_t *a) +{ + gf5248_neg(d, a); } -static inline unsigned int is_digit_zero_ct(digit_t x) -{ // Is x = 0? - return (unsigned int)(1 ^ is_digit_nonzero_ct(x)); +void fp_add(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S +void fp_sub(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S +void fp_sqr(fp_t *out, const fp_t *a); // implemented in fp_asm.S +void fp_mul(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S + +static inline void +fp_mul_small(fp_t *d, const fp_t *a, uint32_t n) +{ + gf5248_mul_small(d, a, n); } -static inline unsigned int is_digit_lessthan_ct(digit_t x, digit_t y) -{ // Is x < y? - return (unsigned int)((x ^ ((x ^ y) | ((x - y) ^ y))) >> (RADIX - 1)); +static inline void +fp_half(fp_t *d, const fp_t *a) +{ + gf5248_half(d, a); +} +// #define fp_half gf5248_half + +static inline void +fp_div3(fp_t *d, const fp_t *a) +{ + gf5248_div3(d, a); +} +// #define fp_div3 gf5248_div3 + +// Constant time selection and swapping +static inline void +fp_select(fp_t *d, const fp_t *a0, const fp_t *a1, uint32_t ctl) +{ + gf5248_select(d, a0, a1, ctl); +} +// #define fp_select gf5248_select +static inline void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + gf5248_cswap(a, b, ctl); +} +// #define fp_cswap gf5248_cswap + +// Comparisons for fp elements +static inline uint32_t +fp_is_zero(const fp_t *a) +{ + return gf5248_iszero(a); +} +// #define fp_is_zero gf5248_iszero + +static inline uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return gf5248_equals(a, b); +} +// #define fp_is_equal gf5248_equals + +// Set a uint32 to an Fp value +static inline void +fp_set_small(fp_t *d, uint32_t x) +{ + gf5248_set_small(d, x); +} +// #define fp_set_small gf5248_set_small + +// Encoding and decoding of bytes +static inline void +fp_encode(void *dst, const fp_t *a) +{ + gf5248_encode(dst, a); +} +// #define fp_encode gf5248_encode +static inline uint32_t +fp_decode(fp_t *d, const void *src) +{ + return gf5248_decode(d, src); +} +// #define fp_decode gf5248_decode +static inline void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + gf5248_decode_reduce(d, src, len); +} +// #define fp_decode_reduce gf5248_decode_reduce + +// These functions are essentially useless because we can just +// use = for the shallow copies we need, but they're here for +// now until we do a larger refactoring +static inline void +fp_copy(fp_t *out, const fp_t *a) +{ + memcpy(out, a, sizeof(fp_t)); } -/********************** Platform-independent macros for digit-size operations **********************/ +static inline void +fp_set_zero(fp_t *a) +{ + memcpy(a, &ZERO, sizeof(fp_t)); +} -// Digit addition with carry -#define ADDC(sumOut, carryOut, addend1, addend2, carryIn) \ - { digit_t tempReg = (addend1) + (digit_t)(carryIn); \ - (sumOut) = (addend2) + tempReg; \ - (carryOut) = (is_digit_lessthan_ct(tempReg, (digit_t)(carryIn)) | is_digit_lessthan_ct((sumOut), tempReg)); } +static inline void +fp_set_one(fp_t *a) +{ + memcpy(a, &ONE, sizeof(fp_t)); +} -// Digit subtraction with borrow -#define SUBC(differenceOut, borrowOut, minuend, subtrahend, borrowIn) \ - { digit_t tempReg = (minuend) - (subtrahend); \ - unsigned int borrowReg = (is_digit_lessthan_ct((minuend), (subtrahend)) | ((borrowIn) & is_digit_zero_ct(tempReg))); \ - (differenceOut) = tempReg - (digit_t)(borrowIn); \ - (borrowOut) = borrowReg; } +// Functions defined in low level code but with different API +void fp_inv(fp_t *a); +void fp_sqrt(fp_t *a); +void fp_exp3div4(fp_t *a); +uint32_t fp_is_square(const fp_t *a); -// Shift right with flexible datatype -#define SHIFTR(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((lowIn) >> (shift)) ^ ((highIn) << (DigitSize - (shift))); - -// Digit shift left -#define SHIFTL(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((highIn) << (shift)) ^ ((lowIn) >> (RADIX - (shift))); - -#endif \ No newline at end of file +#endif diff --git a/src/gf/broadwell/lvl1/include/fp2.h b/src/gf/broadwell/lvl1/include/fp2.h index 8015de0..5f84fdf 100644 --- a/src/gf/broadwell/lvl1/include/fp2.h +++ b/src/gf/broadwell/lvl1/include/fp2.h @@ -1,29 +1,41 @@ #ifndef FP2_H #define FP2_H -#include "fp.h" +#define NO_FP2X_MUL +#define NO_FP2X_SQR -// Structure for representing elements in GF(p^2) -typedef struct fp2_t { - fp_t re, im; -} fp2_t; +#include -void fp2_set(fp2_t* x, const digit_t val); -bool fp2_is_zero(const fp2_t* a); -bool fp2_is_equal(const fp2_t* a, const fp2_t* b); -void fp2_copy(fp2_t* x, const fp2_t* y); -fp2_t fp2_non_residue(); -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_neg(fp2_t* x, const fp2_t* y); -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sqr(fp2_t* x, const fp2_t* y); -void fp2_inv(fp2_t* x); -bool fp2_is_square(const fp2_t* x); -void fp2_frob(fp2_t* x, const fp2_t* y); -void fp2_sqrt(fp2_t* x); -void fp2_tomont(fp2_t* x, const fp2_t* y); -void fp2_frommont(fp2_t* x, const fp2_t* y); -int fp2_cmp(fp2_t* x, fp2_t* y); +extern void fp2_sq_c0(fp2_t *out, const fp2_t *in); +extern void fp2_sq_c1(fp_t *out, const fp2_t *in); -#endif +extern void fp2_mul_c0(fp_t *out, const fp2_t *in0, const fp2_t *in1); +extern void fp2_mul_c1(fp_t *out, const fp2_t *in0, const fp2_t *in1); + +static inline void +fp2_mul(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_t t; + + fp2_mul_c0(&t, y, z); // c0 = a0*b0 - a1*b1 + fp2_mul_c1(&x->im, y, z); // c1 = a0*b1 + a1*b0 + x->re.arr[0] = t.arr[0]; + x->re.arr[1] = t.arr[1]; + x->re.arr[2] = t.arr[2]; + x->re.arr[3] = t.arr[3]; +} + +static inline void +fp2_sqr(fp2_t *x, const fp2_t *y) +{ + fp2_t t; + + fp2_sq_c0(&t, y); // c0 = (a0+a1)(a0-a1) + fp2_sq_c1(&x->im, y); // c1 = 2a0*a1 + x->re.arr[0] = t.re.arr[0]; + x->re.arr[1] = t.re.arr[1]; + x->re.arr[2] = t.re.arr[2]; + x->re.arr[3] = t.re.arr[3]; +} + +#endif \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/include/gf5248.h b/src/gf/broadwell/lvl1/include/gf5248.h new file mode 100644 index 0000000..45686b6 --- /dev/null +++ b/src/gf/broadwell/lvl1/include/gf5248.h @@ -0,0 +1,912 @@ +/* + * This code is derived from discussions with Thomas Pornin + */ + +#ifndef gf5248_h__ +#define gf5248_h__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include +#include +#include + + typedef uint64_t digit_t; // Datatype for representing field elements + + /* + * A gf5248 instance represents an integer modulo q. + * This is a structure; it can be copied with a simple assignment, and + * passed around as a value (though exchanging pointers is possibly more + * efficient). + * The contents are opaque. No calling code should make any assumption + * about the contents. + */ + + typedef union + { + // Contents are opaque. + // Implementation note: this encodes the value in Montgomery + // representation, with R = 2^256, and partially reduced (value + // is less than 2^251, but not necessarily less than q). + struct + { + uint64_t v0; + uint64_t v1; + uint64_t v2; + uint64_t v3; + }; + digit_t arr[4]; + } gf5248; + + /* + * Constant zero (in the field). + */ + extern const gf5248 gf5248_ZERO; + + /* + * Constant one (in the field). + */ + extern const gf5248 gf5248_ONE; + + /* + * Constant -1 (in the field). + */ + extern const gf5248 gf5248_MINUS_ONE; + + /* + * API RULES: + * ========== + * + * Elementary operations on field elements are implemented by functions + * which take as parameter pointers to the operands. The first parameter + * is the pointer to the destination. Thus: + * gf5248 a = ...; + * gf5248 b = ...; + * gf5248 d; + * gf5248_sub(&d, &a, &b) + * sets field element d to a - b (implicitly modulo q). + * + * Operands may be used several times: it is always valid to use as + * output a gf5248 structure which is also used as input. + * + * Boolean values are represented by 32-bit integer (uint32_t) which have + * value exactly 0xFFFFFFFF (for "true") or 0x00000000 (for "false"). This + * convention minimizes the risk that a "smart" compiler breaks the + * constant-time property of the code through unfortunated optimizations. + * When a function expects such a Boolean, the caller MUST take care never + * to provide any value other than 0x00000000 or 0xFFFFFFFF. + * + * Values are encoded into exactly 32 bytes: value x modulo q is mapped to + * its unique integer representant in the [0..q-1] range, which is then + * encoded over 32 bytes with little-endian convention. Encoding is canonical + * and checked: when decoding (with gf5248_decode()), the input value is + * verified to be in the [0..q-1] range; for an out-of-range value, + * gf5248_decode() fills the output structure with zero, and returns + * 0x00000000. + * + * For most operations, the implementation is an inline function, defined + * below; the compiler can thus efficiently include it in the calling code. + * A few expensive operations (e.g. divisions) use non-inline functions, + * declared below but defined in gf5248.c + * + * All functions and macro whose name starts with "inner_gf5248_" are + * internal to this implementation and visible here only in order to + * support the API inline functions; they MUST NOT be used directly. + */ + +#if (defined _MSC_VER && defined _M_X64) || (defined __x86_64__ && (defined __GNUC__ || defined __clang__)) +#include +#define inner_gf5248_adc(cc, a, b, d) _addcarry_u64(cc, a, b, (unsigned long long *)(void *)d) +#define inner_gf5248_sbb(cc, a, b, d) _subborrow_u64(cc, a, b, (unsigned long long *)(void *)d) +#else +static inline unsigned char +inner_gf5248_adc(unsigned char cc, uint64_t a, uint64_t b, uint64_t *d) +{ + unsigned __int128 t = (unsigned __int128)a + (unsigned __int128)b + cc; + *d = (uint64_t)t; + return (unsigned char)(t >> 64); +} +static inline unsigned char +inner_gf5248_sbb(unsigned char cc, uint64_t a, uint64_t b, uint64_t *d) +{ + unsigned __int128 t = (unsigned __int128)a - (unsigned __int128)b - cc; + *d = (uint64_t)t; + return (unsigned char)(-(uint64_t)(t >> 64)); +} +#endif + +#if defined _MSC_VER +#define inner_gf5248_umul(lo, hi, x, y) \ + do { \ + uint64_t umul_hi; \ + (lo) = _umul128((x), (y), &umul_hi); \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf5248_umul_add(lo, hi, x, y, z) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x), (y), &umul_hi); \ + unsigned char umul_cc; \ + umul_cc = inner_gf5248_adc(0, umul_lo, (z), &umul_lo); \ + (void)inner_gf5248_adc(umul_cc, umul_hi, 0, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf5248_umul_x2(lo, hi, x1, y1, x2, y2) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x1), (y1), &umul_hi); \ + uint64_t umul_lo2, umul_hi2; \ + umul_lo2 = _umul128((x2), (y2), &umul_hi2); \ + unsigned char umul_cc; \ + umul_cc = inner_gf5248_adc(0, umul_lo, umul_lo2, &umul_lo); \ + (void)inner_gf5248_adc(umul_cc, umul_hi, umul_hi2, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf5248_umul_x2_add(lo, hi, x1, y1, x2, y2, z) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x1), (y1), &umul_hi); \ + uint64_t umul_lo2, umul_hi2; \ + umul_lo2 = _umul128((x2), (y2), &umul_hi2); \ + unsigned char umul_cc; \ + umul_cc = inner_gf5248_adc(0, umul_lo, umul_lo2, &umul_lo); \ + (void)inner_gf5248_adc(umul_cc, umul_hi, umul_hi2, &umul_hi); \ + umul_cc = inner_gf5248_adc(0, umul_lo, (z), &umul_lo); \ + (void)inner_gf5248_adc(umul_cc, umul_hi, 0, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#else +#define inner_gf5248_umul(lo, hi, x, y) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x) * (unsigned __int128)(y); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf5248_umul_add(lo, hi, x, y, z) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x) * (unsigned __int128)(y) + (unsigned __int128)(uint64_t)(z); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf5248_umul_x2(lo, hi, x1, y1, x2, y2) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = \ + (unsigned __int128)(x1) * (unsigned __int128)(y1) + (unsigned __int128)(x2) * (unsigned __int128)(y2); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf5248_umul_x2_add(lo, hi, x1, y1, x2, y2, z) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x1) * (unsigned __int128)(y1) + \ + (unsigned __int128)(x2) * (unsigned __int128)(y2) + (unsigned __int128)(uint64_t)(z); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#endif + + /* + * d <- a + b + */ + static inline void + gf5248_add(gf5248 *d, const gf5248 *a, const gf5248 *b) + { + uint64_t d0, d1, d2, d3, f; + unsigned char cc; + + // Raw addition. + cc = inner_gf5248_adc(0, a->v0, b->v0, &d0); + cc = inner_gf5248_adc(cc, a->v1, b->v1, &d1); + cc = inner_gf5248_adc(cc, a->v2, b->v2, &d2); + (void)inner_gf5248_adc(cc, a->v3, b->v3, &d3); + + // Sum is up to 2^252 - 2. Subtract q if the value is not lower + // than 2^251 (we subtract q by adding -q). + f = d3 >> 59; + cc = inner_gf5248_adc(0, d0, f, &d0); + cc = inner_gf5248_adc(cc, d1, 0, &d1); + cc = inner_gf5248_adc(cc, d2, 0, &d2); + (void)inner_gf5248_adc(cc, d3, ((uint64_t)0xFB << 56) & -f, &d3); + + // One subtraction of q might not be enough. + f = d3 >> 59; + cc = inner_gf5248_adc(0, d0, f, &d0); + cc = inner_gf5248_adc(cc, d1, 0, &d1); + cc = inner_gf5248_adc(cc, d2, 0, &d2); + (void)inner_gf5248_adc(cc, d3, ((uint64_t)0xFB << 56) & -f, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + } + + /* + * d <- a - b + */ + static inline void + gf5248_sub(gf5248 *d, const gf5248 *a, const gf5248 *b) + { + uint64_t d0, d1, d2, d3, m, f; + unsigned char cc; + + // Raw subtraction. + cc = inner_gf5248_sbb(0, a->v0, b->v0, &d0); + cc = inner_gf5248_sbb(cc, a->v1, b->v1, &d1); + cc = inner_gf5248_sbb(cc, a->v2, b->v2, &d2); + cc = inner_gf5248_sbb(cc, a->v3, b->v3, &d3); + + // Add 2*q if the result is negative. + (void)inner_gf5248_sbb(cc, 0, 0, &m); + cc = inner_gf5248_sbb(0, d0, m & 2, &d0); + cc = inner_gf5248_sbb(cc, d1, 0, &d1); + cc = inner_gf5248_sbb(cc, d2, 0, &d2); + (void)inner_gf5248_sbb(cc, d3, ((uint64_t)0xF6 << 56) & m, &d3); + + // We might have overdone it; subtract q if necessary. + f = d3 >> 59; + cc = inner_gf5248_adc(0, d0, f, &d0); + cc = inner_gf5248_adc(cc, d1, 0, &d1); + cc = inner_gf5248_adc(cc, d2, 0, &d2); + (void)inner_gf5248_adc(cc, d3, ((uint64_t)0xFB << 56) & -f, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + } + + /* + * d <- -a + */ + static inline void + gf5248_neg(gf5248 *d, const gf5248 *a) + { + uint64_t d0, d1, d2, d3, f; + unsigned char cc; + + // 2*q - a + cc = inner_gf5248_sbb(0, (uint64_t)0xFFFFFFFFFFFFFFFE, a->v0, &d0); + cc = inner_gf5248_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v1, &d1); + cc = inner_gf5248_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v2, &d2); + (void)inner_gf5248_sbb(cc, (uint64_t)0x09FFFFFFFFFFFFFF, a->v3, &d3); + + // Subtract q if the value is not lower than 2^251. + f = d3 >> 59; + cc = inner_gf5248_adc(0, d0, f, &d0); + cc = inner_gf5248_adc(cc, d1, 0, &d1); + cc = inner_gf5248_adc(cc, d2, 0, &d2); + (void)inner_gf5248_adc(cc, d3, ((uint64_t)0xFB << 56) & -f, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + } + + /* + * If ctl == 0x00000000, then *a0 is copied into *d. + * If ctl == 0xFFFFFFFF, then *a1 is copied into *d. + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ + static inline void + gf5248_select(gf5248 *d, const gf5248 *a0, const gf5248 *a1, uint32_t ctl) + { + uint64_t cw = (uint64_t)*(int32_t *)&ctl; + d->v0 = a0->v0 ^ (cw & (a0->v0 ^ a1->v0)); + d->v1 = a0->v1 ^ (cw & (a0->v1 ^ a1->v1)); + d->v2 = a0->v2 ^ (cw & (a0->v2 ^ a1->v2)); + d->v3 = a0->v3 ^ (cw & (a0->v3 ^ a1->v3)); + } + + /* + * If ctl == 0x00000000, then *a and *b are unchanged. + * If ctl == 0xFFFFFFFF, then the contents of *a and *b are swapped. + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ + static inline void + gf5248_cswap(gf5248 *a, gf5248 *b, uint32_t ctl) + { + uint64_t cw = (uint64_t)*(int32_t *)&ctl; + uint64_t t; + t = cw & (a->v0 ^ b->v0); + a->v0 ^= t; + b->v0 ^= t; + t = cw & (a->v1 ^ b->v1); + a->v1 ^= t; + b->v1 ^= t; + t = cw & (a->v2 ^ b->v2); + a->v2 ^= t; + b->v2 ^= t; + t = cw & (a->v3 ^ b->v3); + a->v3 ^= t; + b->v3 ^= t; + } + + /* + * d <- a/2 + */ + static inline void + gf5248_half(gf5248 *d, const gf5248 *a) + { + uint64_t d0, d1, d2, d3; + + d0 = (a->v0 >> 1) | (a->v1 << 63); + d1 = (a->v1 >> 1) | (a->v2 << 63); + d2 = (a->v2 >> 1) | (a->v3 << 63); + d3 = a->v3 >> 1; + d3 += ((uint64_t)5 << 55) & -(a->v0 & 1); + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + } + + // Inner function: 256-bit to 251-bit reduction + static inline void + inner_gf5248_partial_reduce(gf5248 *d, uint64_t a0, uint64_t a1, uint64_t a2, uint64_t a3) + { + uint64_t d0, d1, d2, d3, h, quo, rem; + unsigned char cc; + + // Split value in high (8 bits) and low (248 bits) parts. + h = a3 >> 56; + a3 &= 0x00FFFFFFFFFFFFFF; + + // 5*2^248 = 1 mod q; hence, we add floor(h/5) + (h mod 5)*2^248 + // to the low part. + quo = (h * 0xCD) >> 10; + rem = h - (5 * quo); + cc = inner_gf5248_adc(0, a0, quo, &d0); + cc = inner_gf5248_adc(cc, a1, 0, &d1); + cc = inner_gf5248_adc(cc, a2, 0, &d2); + (void)inner_gf5248_adc(cc, a3, rem << 56, &d3); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + } + + /* + * d <- 2*a + */ + static inline void + gf5248_mul2(gf5248 *d, const gf5248 *a) + { + gf5248_add(d, a, a); + } + + /* + * d <- 4*a + */ + static inline void + gf5248_mul4(gf5248 *d, const gf5248 *a) + { + uint64_t d0, d1, d2, d3; + d0 = a->v0 << 2; + d1 = (a->v0 >> 62) | (a->v1 << 2); + d2 = (a->v1 >> 62) | (a->v2 << 2); + d3 = (a->v2 >> 62) | (a->v3 << 2); + inner_gf5248_partial_reduce(d, d0, d1, d2, d3); + } + + /* + * d <- 8*a + */ + static inline void + gf5248_mul8(gf5248 *d, const gf5248 *a) + { + uint64_t d0, d1, d2, d3; + d0 = a->v0 << 3; + d1 = (a->v0 >> 61) | (a->v1 << 3); + d2 = (a->v1 >> 61) | (a->v2 << 3); + d3 = (a->v2 >> 61) | (a->v3 << 3); + inner_gf5248_partial_reduce(d, d0, d1, d2, d3); + } + + /* + * d <- 16*a + */ + static inline void + gf5248_mul16(gf5248 *d, const gf5248 *a) + { + uint64_t d0, d1, d2, d3; + d0 = a->v0 << 4; + d1 = (a->v0 >> 60) | (a->v1 << 4); + d2 = (a->v1 >> 60) | (a->v2 << 4); + d3 = (a->v2 >> 60) | (a->v3 << 4); + inner_gf5248_partial_reduce(d, d0, d1, d2, d3); + } + + /* + * d <- 32*a + */ + static inline void + gf5248_mul32(gf5248 *d, const gf5248 *a) + { + uint64_t d0, d1, d2, d3; + d0 = a->v0 << 5; + d1 = (a->v0 >> 59) | (a->v1 << 5); + d2 = (a->v1 >> 59) | (a->v2 << 5); + d3 = (a->v2 >> 59) | (a->v3 << 5); + inner_gf5248_partial_reduce(d, d0, d1, d2, d3); + } + + /* + * d <- a*x + * (multiplication by a 32-bit integer) + */ + static inline void + gf5248_mul_small(gf5248 *d, const gf5248 *a, uint32_t x) + { + uint64_t d0, d1, d2, d3, d4, lo, hi, b, h, quo, rem; + unsigned char cc; + + // Product over the integers. Top output word (d4) is at most 27 bits. + b = (uint64_t)x; + inner_gf5248_umul(d0, d1, a->v0, b); + inner_gf5248_umul(d2, d3, a->v2, b); + inner_gf5248_umul(lo, hi, a->v1, b); + cc = inner_gf5248_adc(0, d1, lo, &d1); + cc = inner_gf5248_adc(cc, d2, hi, &d2); + inner_gf5248_umul(lo, d4, a->v3, b); + cc = inner_gf5248_adc(cc, d3, lo, &d3); + (void)inner_gf5248_adc(cc, d4, 0, &d4); + + // Extract low 248-bit part, and the high part (at most 35 bits). + h = (d4 << 8) | (d3 >> 56); + d3 &= 0x00FFFFFFFFFFFFFF; + + // Fold h by adding floor(h/5) + (h mod 5)*2^248 to the low part. + inner_gf5248_umul(lo, hi, h, 0xCCCCCCCCCCCCCCCD); + quo = hi >> 2; + rem = h - (5 * quo); + cc = inner_gf5248_adc(cc, d0, quo, &d0); + cc = inner_gf5248_adc(cc, d1, 0, &d1); + cc = inner_gf5248_adc(cc, d2, 0, &d2); + (void)inner_gf5248_adc(cc, d3, rem << 56, &d3); + + // Max value is now 5*2^248 + 6871947672 + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + } + + /* + * d <- x + * Input value x (32-bit integer) is converted to field element x mod q. + */ + static inline void + gf5248_set_small(gf5248 *d, uint32_t x) + { + // We want Montgomery representation, i.e. x*2^256 mod q. + // We set h = x*2^8; then: + // x*2^256 = h*2^248 + // = (h mod 5)*2^248 + floor(h/5)*5*2^248 + // = (h mod 5)*2^248 + floor(h/5) mod q + // by using the fact that 5*2^248 = 1 mod q. + uint64_t h, lo, hi, quo, rem; + + h = (uint64_t)x << 8; + inner_gf5248_umul(lo, hi, h, 0xCCCCCCCCCCCCCCCD); + (void)lo; + quo = hi >> 2; + rem = h - (5 * quo); + d->v0 = quo; + d->v1 = 0; + d->v2 = 0; + d->v3 = rem << 56; + } + + // Inner function: d <- a/2^256, with normalization to [0..q-1]. + static inline void + inner_gf5248_montgomery_reduce(gf5248 *d, const gf5248 *a) + { + uint64_t x0, x1, x2, x3, f0, f1, f2, f3; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7; + uint64_t d0, d1, d2, d3; + uint64_t hi, t, w; + unsigned char cc; + + // Let m = -1/q mod 2^256 = 5*2^248 + 1 + // For input x, we compute f = x*m mod 2^256, then + // h = x + f*q, which is a multiple of 2^256. The output + // is then h/2^256. + // Since x < 2^256, we have: + // h <= 2^256 - 1 + (2^256 - 1)*q + // h <= q*2^256 + 2^256 - q - 1 + // Since h = 0 mod 2^256, this implies that h <= q*2^256. + // The output h/2^256 is therefore between 0 and q (inclusive). + + x0 = a->v0; + x1 = a->v1; + x2 = a->v2; + x3 = a->v3; + + // f = x*(-1/q) mod 2^256 + f0 = x0; + f1 = x1; + f2 = x2; + f3 = x3 + ((x0 * 5) << 56); + + // g = f*q + inner_gf5248_umul(g3, hi, f0, (uint64_t)5 << 56); + inner_gf5248_umul_add(g4, hi, f1, (uint64_t)5 << 56, hi); + inner_gf5248_umul_add(g5, hi, f2, (uint64_t)5 << 56, hi); + inner_gf5248_umul_add(g6, g7, f3, (uint64_t)5 << 56, hi); + cc = inner_gf5248_sbb(0, 0, f0, &g0); + cc = inner_gf5248_sbb(cc, 0, f1, &g1); + cc = inner_gf5248_sbb(cc, 0, f2, &g2); + cc = inner_gf5248_sbb(cc, g3, f3, &g3); + cc = inner_gf5248_sbb(cc, g4, 0, &g4); + cc = inner_gf5248_sbb(cc, g5, 0, &g5); + cc = inner_gf5248_sbb(cc, g6, 0, &g6); + (void)inner_gf5248_sbb(cc, g7, 0, &g7); + + // h = x + f*q (we drop the low 256 bits). + cc = inner_gf5248_adc(0, g0, x0, &x0); + cc = inner_gf5248_adc(cc, g1, x1, &x1); + cc = inner_gf5248_adc(cc, g2, x2, &x2); + cc = inner_gf5248_adc(cc, g3, x3, &x3); + cc = inner_gf5248_adc(cc, g4, 0, &d0); + cc = inner_gf5248_adc(cc, g5, 0, &d1); + cc = inner_gf5248_adc(cc, g6, 0, &d2); + (void)inner_gf5248_adc(cc, g7, 0, &d3); + + // Normalize: if h = q, replace it with zero. + t = d0 & d1 & d2 & (d3 ^ ~(uint64_t)0x04FFFFFFFFFFFFFF); + cc = inner_gf5248_adc(0, t, 1, &t); + (void)inner_gf5248_sbb(cc, 0, 0, &w); + w = ~w; + d->v0 = d0 & w; + d->v1 = d1 & w; + d->v2 = d2 & w; + d->v3 = d3 & w; + } + + /* + * d <- a*b + */ + static inline void + gf5248_mul(gf5248 *d, const gf5248 *a, const gf5248 *b) + { + uint64_t e0, e1, e2, e3, e4, e5, e6, e7; + uint64_t f0, f1, f2, f3, lo, hi, lo2, hi2; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7; + unsigned char cc; + + // Multiplication over integers. + inner_gf5248_umul(e0, e1, a->v0, b->v0); + inner_gf5248_umul(e2, e3, a->v1, b->v1); + inner_gf5248_umul(e4, e5, a->v2, b->v2); + inner_gf5248_umul(e6, e7, a->v3, b->v3); + + inner_gf5248_umul(lo, hi, a->v0, b->v1); + cc = inner_gf5248_adc(0, e1, lo, &e1); + cc = inner_gf5248_adc(cc, e2, hi, &e2); + inner_gf5248_umul(lo, hi, a->v0, b->v3); + cc = inner_gf5248_adc(cc, e3, lo, &e3); + cc = inner_gf5248_adc(cc, e4, hi, &e4); + inner_gf5248_umul(lo, hi, a->v2, b->v3); + cc = inner_gf5248_adc(cc, e5, lo, &e5); + cc = inner_gf5248_adc(cc, e6, hi, &e6); + (void)inner_gf5248_adc(cc, e7, 0, &e7); + + inner_gf5248_umul(lo, hi, a->v1, b->v0); + cc = inner_gf5248_adc(0, e1, lo, &e1); + cc = inner_gf5248_adc(cc, e2, hi, &e2); + inner_gf5248_umul(lo, hi, a->v3, b->v0); + cc = inner_gf5248_adc(cc, e3, lo, &e3); + cc = inner_gf5248_adc(cc, e4, hi, &e4); + inner_gf5248_umul(lo, hi, a->v3, b->v2); + cc = inner_gf5248_adc(cc, e5, lo, &e5); + cc = inner_gf5248_adc(cc, e6, hi, &e6); + (void)inner_gf5248_adc(cc, e7, 0, &e7); + + inner_gf5248_umul(lo, hi, a->v0, b->v2); + cc = inner_gf5248_adc(0, e2, lo, &e2); + cc = inner_gf5248_adc(cc, e3, hi, &e3); + inner_gf5248_umul(lo, hi, a->v1, b->v3); + cc = inner_gf5248_adc(cc, e4, lo, &e4); + cc = inner_gf5248_adc(cc, e5, hi, &e5); + cc = inner_gf5248_adc(cc, e6, 0, &e6); + (void)inner_gf5248_adc(cc, e7, 0, &e7); + + inner_gf5248_umul(lo, hi, a->v2, b->v0); + cc = inner_gf5248_adc(0, e2, lo, &e2); + cc = inner_gf5248_adc(cc, e3, hi, &e3); + inner_gf5248_umul(lo, hi, a->v3, b->v1); + cc = inner_gf5248_adc(cc, e4, lo, &e4); + cc = inner_gf5248_adc(cc, e5, hi, &e5); + cc = inner_gf5248_adc(cc, e6, 0, &e6); + (void)inner_gf5248_adc(cc, e7, 0, &e7); + + inner_gf5248_umul(lo, hi, a->v1, b->v2); + inner_gf5248_umul(lo2, hi2, a->v2, b->v1); + cc = inner_gf5248_adc(0, lo, lo2, &lo); + cc = inner_gf5248_adc(cc, hi, hi2, &hi); + (void)inner_gf5248_adc(cc, 0, 0, &hi2); + cc = inner_gf5248_adc(0, e3, lo, &e3); + cc = inner_gf5248_adc(cc, e4, hi, &e4); + cc = inner_gf5248_adc(cc, e5, hi2, &e5); + cc = inner_gf5248_adc(cc, e6, 0, &e6); + (void)inner_gf5248_adc(cc, e7, 0, &e7); + + // Montgomery reduction. + // + // Low part is lo(e) = e0..e3 (256 bits). + // Let m = -1/q mod 2^256; we add (lo(e)*m mod 2^256)*q to the + // high part g = e4..e7 (246 bits). + // + // We have m = 5*2^248 + 1. + f0 = e0; + f1 = e1; + f2 = e2; + f3 = e3 + ((e0 * 5) << 56); + + // g = f*q + inner_gf5248_umul(g3, hi, f0, (uint64_t)5 << 56); + inner_gf5248_umul_add(g4, hi, f1, (uint64_t)5 << 56, hi); + inner_gf5248_umul_add(g5, hi, f2, (uint64_t)5 << 56, hi); + inner_gf5248_umul_add(g6, g7, f3, (uint64_t)5 << 56, hi); + cc = inner_gf5248_sbb(0, 0, f0, &g0); + cc = inner_gf5248_sbb(cc, 0, f1, &g1); + cc = inner_gf5248_sbb(cc, 0, f2, &g2); + cc = inner_gf5248_sbb(cc, g3, f3, &g3); + cc = inner_gf5248_sbb(cc, g4, 0, &g4); + cc = inner_gf5248_sbb(cc, g5, 0, &g5); + cc = inner_gf5248_sbb(cc, g6, 0, &g6); + (void)inner_gf5248_sbb(cc, g7, 0, &g7); + + // Add g = f*q to e0..e7. + // Since e0..e7 < 2^502 and f < 2^256, we know that the result + // is less than 2^502 + 2^256*5*2^248, which is less than 6*2^504. + // This is also a multiple of 2^256. We divide by 2^256 by simply + // dropping the low 256 bits (which are all equal to zero), and + // the result is less than 6*2^248, which is already in our + // acceptable value range. + cc = inner_gf5248_adc(0, g0, e0, &e0); + cc = inner_gf5248_adc(cc, g1, e1, &e1); + cc = inner_gf5248_adc(cc, g2, e2, &e2); + cc = inner_gf5248_adc(cc, g3, e3, &e3); + cc = inner_gf5248_adc(cc, g4, e4, &e4); + cc = inner_gf5248_adc(cc, g5, e5, &e5); + cc = inner_gf5248_adc(cc, g6, e6, &e6); + (void)inner_gf5248_adc(cc, g7, e7, &e7); + + d->v0 = e4; + d->v1 = e5; + d->v2 = e6; + d->v3 = e7; + } + + /* + * d <- a^2 + */ + static inline void + gf5248_square(gf5248 *d, const gf5248 *a) + { + uint64_t e0, e1, e2, e3, e4, e5, e6, e7; + uint64_t f0, f1, f2, f3, lo, hi; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7; + unsigned char cc; + + // Squaring over integers. + inner_gf5248_umul(e1, e2, a->v0, a->v1); + inner_gf5248_umul(e3, e4, a->v0, a->v3); + inner_gf5248_umul(e5, e6, a->v2, a->v3); + inner_gf5248_umul(lo, hi, a->v0, a->v2); + cc = inner_gf5248_adc(0, e2, lo, &e2); + cc = inner_gf5248_adc(cc, e3, hi, &e3); + inner_gf5248_umul(lo, hi, a->v1, a->v3); + cc = inner_gf5248_adc(cc, e4, lo, &e4); + cc = inner_gf5248_adc(cc, e5, hi, &e5); + (void)inner_gf5248_adc(cc, e6, 0, &e6); + inner_gf5248_umul(lo, hi, a->v1, a->v2); + cc = inner_gf5248_adc(0, e3, lo, &e3); + cc = inner_gf5248_adc(cc, e4, hi, &e4); + cc = inner_gf5248_adc(cc, e5, 0, &e5); + (void)inner_gf5248_adc(cc, e6, 0, &e6); + + // There cannot be extra carry here because the partial sum is + // necessarily lower than 2^448 at this point. + + e7 = e6 >> 63; + e6 = (e6 << 1) | (e5 >> 63); + e5 = (e5 << 1) | (e4 >> 63); + e4 = (e4 << 1) | (e3 >> 63); + e3 = (e3 << 1) | (e2 >> 63); + e2 = (e2 << 1) | (e1 >> 63); + e1 = e1 << 1; + + inner_gf5248_umul(e0, hi, a->v0, a->v0); + cc = inner_gf5248_adc(0, e1, hi, &e1); + inner_gf5248_umul(lo, hi, a->v1, a->v1); + cc = inner_gf5248_adc(cc, e2, lo, &e2); + cc = inner_gf5248_adc(cc, e3, hi, &e3); + inner_gf5248_umul(lo, hi, a->v2, a->v2); + cc = inner_gf5248_adc(cc, e4, lo, &e4); + cc = inner_gf5248_adc(cc, e5, hi, &e5); + inner_gf5248_umul(lo, hi, a->v3, a->v3); + cc = inner_gf5248_adc(cc, e6, lo, &e6); + (void)inner_gf5248_adc(cc, e7, hi, &e7); + + // Montgomery reduction. + // + // Low part is lo(e) = e0..e3 (256 bits). + // Let m = -1/q mod 2^256; we add (lo(e)*m mod 2^256)*q to the + // high part g = e4..e7 (246 bits). + // + // We have m = 5*2^248 + 1. + f0 = e0; + f1 = e1; + f2 = e2; + f3 = e3 + ((e0 * 5) << 56); + + // g = f*q + inner_gf5248_umul(g3, hi, f0, (uint64_t)5 << 56); + inner_gf5248_umul_add(g4, hi, f1, (uint64_t)5 << 56, hi); + inner_gf5248_umul_add(g5, hi, f2, (uint64_t)5 << 56, hi); + inner_gf5248_umul_add(g6, g7, f3, (uint64_t)5 << 56, hi); + cc = inner_gf5248_sbb(0, 0, f0, &g0); + cc = inner_gf5248_sbb(cc, 0, f1, &g1); + cc = inner_gf5248_sbb(cc, 0, f2, &g2); + cc = inner_gf5248_sbb(cc, g3, f3, &g3); + cc = inner_gf5248_sbb(cc, g4, 0, &g4); + cc = inner_gf5248_sbb(cc, g5, 0, &g5); + cc = inner_gf5248_sbb(cc, g6, 0, &g6); + (void)inner_gf5248_sbb(cc, g7, 0, &g7); + + // Add g = f*q to e0..e7. + // Since e0..e7 < 2^502 and f < 2^256, we know that the result + // is less than 2^502 + 2^256*5*2^248, which is less than 6*2^504. + // This is also a multiple of 2^256. We divide by 2^256 by simply + // dropping the low 256 bits (which are all equal to zero), and + // the result is less than 6*2^248, which is already in our + // acceptable value range. + cc = inner_gf5248_adc(0, g0, e0, &e0); + cc = inner_gf5248_adc(cc, g1, e1, &e1); + cc = inner_gf5248_adc(cc, g2, e2, &e2); + cc = inner_gf5248_adc(cc, g3, e3, &e3); + cc = inner_gf5248_adc(cc, g4, e4, &e4); + cc = inner_gf5248_adc(cc, g5, e5, &e5); + cc = inner_gf5248_adc(cc, g6, e6, &e6); + (void)inner_gf5248_adc(cc, g7, e7, &e7); + + d->v0 = e4; + d->v1 = e5; + d->v2 = e6; + d->v3 = e7; + } + + /* + * d <- a^(2^n) + * This computes n successive squarings of value a, with result in d. + * n == 0 is a valid input (in that case, *a is copied into *d). + * This function is not constant-time with regard to n: the number of + * successive squarings may be observable through timing-based side channels. + */ + static inline void + gf5248_xsquare(gf5248 *d, const gf5248 *a, unsigned n) + { + if (n == 0) { + *d = *a; + return; + } + gf5248_square(d, a); + while (n-- > 1) { + gf5248_square(d, d); + } + } + + /* + * Returns 0xFFFFFFFF if *a is zero; otherwise, 0x00000000 is returned. + */ + static inline uint32_t + gf5248_iszero(const gf5248 *a) + { + uint64_t a0, a1, a2, a3, t0, t1, r; + + // Zero can be represented by 0 or by q. + a0 = a->v0; + a1 = a->v1; + a2 = a->v2; + a3 = a->v3; + t0 = a0 | a1 | a2 | a3; + t1 = ~a0 | ~a1 | ~a2 | (a3 ^ 0x04FFFFFFFFFFFFFF); + + // Top bit of r is 0 if and only if one of t0 or t1 is zero. + r = (t0 | -t0) & (t1 | -t1); + return (uint32_t)(r >> 63) - 1; + } + + /* + * Returns 0xFFFFFFFF if *a and *b represent the same field element; + * otherwise, 0x00000000 is returned. + */ + static inline uint32_t + gf5248_equals(const gf5248 *a, const gf5248 *b) + { + gf5248 d; + gf5248_sub(&d, a, b); + return gf5248_iszero(&d); + } + + /* + * d <- 1/a + * If *a is not zero, then the inverse is well-defined and written into *d, + * and the function returns 0xFFFFFFFF. If *a is zero, then this function + * sets *d to zero and returns 0x00000000. + */ + uint32_t gf5248_invert(gf5248 *d, const gf5248 *a); + + /* + * d <- a/b + * If *b is not zero, then this functions writes a/b into *d, and returns + * 0xFFFFFFFF. If *b is zero, then this function sets *d to zero (regardless + * of the value of *a) and returns 0x00000000. + */ + uint32_t gf5248_div(gf5248 *d, const gf5248 *a, const gf5248 *b); + + /* + * d <- a/3 + * Divides by 3 in the field by implementing the algorithm proposed in + * "Efficient Multiplication in Finite Field Extensions of Degree 5" + * by El Mrabet, Guillevic and Ionica at ASIACRYPT 2011. + */ + void gf5248_div3(gf5248 *out, const gf5248 *a); + + /* + * Get the Legendre symbol of *a (0 for zero, +1 for a non-zero square, + * -1 for a non-square). + */ + int32_t gf5248_legendre(const gf5248 *a); + + /* + * If *a is a square, then this function sets *d to a square root of a, + * and returns 0xFFFFFFFF. If *a is not a square, then this function + * sets *d to a square root of -a, and returns 0x00000000. + * In all cases, the value written into *d is such that the least significant + * bit of its integer representation (in [0..q-1]) is zero. + */ + uint32_t gf5248_sqrt(gf5248 *d, const gf5248 *a); + + /* + * Encode field element *a into buffer dst (exactly 32 bytes are written). + */ + void gf5248_encode(void *dst, const gf5248 *a); + + /* + * Decode source buffer src (exactly 32 bytes) into a field element *d. + * If the source value is not a valid canonical encoding, then *d is zero + * and the function returns 0x00000000; otherwise, the function returns + * 0xFFFFFFFF. + */ + uint32_t gf5248_decode(gf5248 *d, const void *src); + + /* + * Interpret the source buffer (of size len bytes) as an unsigned integer + * (little-endian convention) and reduce it modulo q, yielding a field + * element which is written into *d. Since reduction is applied, this + * function cannot fail. + */ + void gf5248_decode_reduce(gf5248 *d, const void *src, size_t len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/gf/broadwell/lvl1/test/CMakeLists.txt b/src/gf/broadwell/lvl1/test/CMakeLists.txt index 2f769a7..316e0a8 100644 --- a/src/gf/broadwell/lvl1/test/CMakeLists.txt +++ b/src/gf/broadwell/lvl1/test/CMakeLists.txt @@ -1,9 +1 @@ -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp test_fp.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp sqisign_test_gf_${SVARIANT_LOWER}_fp test ${SQISIGN_TEST_REPS}) - -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp2 test_fp2.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp2 PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp2 sqisign_test_gf_${SVARIANT_LOWER}_fp2 test ${SQISIGN_TEST_REPS}) \ No newline at end of file +include(../../lvlx_test.cmake) diff --git a/src/gf/broadwell/lvl1/test/test_extras.c b/src/gf/broadwell/lvl1/test/test_extras.c deleted file mode 100644 index d0689c6..0000000 --- a/src/gf/broadwell/lvl1/test/test_extras.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "test_extras.h" -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; -extern const digit_t R2[NWORDS_FIELD]; - -#if 0 -int64_t cpucycles(void) -{ // Access system counter for benchmarking - unsigned int hi, lo; - - asm volatile ("rdtsc\n\t" : "=a" (lo), "=d"(hi)); - return ((int64_t)lo) | (((int64_t)hi) << 32); -} -#endif - - -int compare_words(digit_t* a, digit_t* b, unsigned int nwords) -{ // Comparing "nword" elements, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) - { - if (a[i] > b[i]) return 1; - else if (a[i] < b[i]) return -1; - } - - return 0; -} - - -static void sub_test(digit_t* out, digit_t* a, digit_t* b, unsigned int nwords) -{ // Subtraction without borrow, out = a-b where a>b - // SECURITY NOTE: this function does not have constant-time execution. It is for TESTING ONLY. - unsigned int i; - digit_t res, carry, borrow = 0; - - for (i = 0; i < nwords; i++) - { - res = a[i] - b[i]; - carry = (a[i] < b[i]); - out[i] = res - borrow; - borrow = carry || (res < borrow); - } -} - - -void fprandom_test(digit_t* a) -{ // Generating a pseudo-random field element in [0, p-1] - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - unsigned int i, diff = 256-254, nwords = NWORDS_FIELD; - unsigned char* string = NULL; - - string = (unsigned char*)a; - for (i = 0; i < sizeof(digit_t)*nwords; i++) { - *(string + i) = (unsigned char)rand(); // Obtain 256-bit number - } - a[nwords-1] &= (((digit_t)(-1) << diff) >> diff); - - while (compare_words((digit_t*)p, a, nwords) < 1) { // Force it to [0, modulus-1] - sub_test(a, a, (digit_t*)p, nwords); - } -} - - -void fp2random_test(fp2_t* a) -{ // Generating a pseudo-random element in GF(p^2) - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - - fprandom_test(a->re); - fprandom_test(a->im); -} \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/test/test_extras.h b/src/gf/broadwell/lvl1/test/test_extras.h deleted file mode 100644 index 3de524d..0000000 --- a/src/gf/broadwell/lvl1/test/test_extras.h +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef TEST_EXTRAS_H -#define TEST_EXTRAS_H - -#include -#include -#include "../include/fp.h" -#include "../include/fp2.h" - -#define PASSED 0 -#define FAILED 1 - -// Access system counter for benchmarking -//int64_t cpucycles(void); - -// Comparing "nword" elements, a=b? : (1) a!=b, (0) a=b -int compare_words(digit_t* a, digit_t* b, unsigned int nwords); - -// Generating a pseudo-random field element in [0, p-1] -void fprandom_test(digit_t* a); - -// Generating a pseudo-random element in GF(p^2) -void fp2random_test(fp2_t* a); - -#endif \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/test/test_fp.c b/src/gf/broadwell/lvl1/test/test_fp.c deleted file mode 100644 index 033c570..0000000 --- a/src/gf/broadwell/lvl1/test/test_fp.c +++ /dev/null @@ -1,295 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp_test() -{ // Tests for the field arithmetic - bool OK = true; - int n, passed; - fp_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing field arithmetic over GF(p): \n\n"); - - // Field addition - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/broadwell/lvl1/test/test_fp2.c b/src/gf/broadwell/lvl1/test/test_fp2.c deleted file mode 100644 index 48b08c7..0000000 --- a/src/gf/broadwell/lvl1/test/test_fp2.c +++ /dev/null @@ -1,307 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp2_test() -{ // Tests for the GF(p^2) arithmetic - bool OK = true; - int n, passed; - fp2_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing arithmetic over GF(p^2): \n\n"); - - // Addition in GF(p^2) - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp2_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp2_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/broadwell/lvl3/CMakeLists.txt b/src/gf/broadwell/lvl3/CMakeLists.txt new file mode 100644 index 0000000..33a06b2 --- /dev/null +++ b/src/gf/broadwell/lvl3/CMakeLists.txt @@ -0,0 +1,6 @@ +set(SOURCE_FILES_GF_SPECIFIC + gf65376.c + fp_asm.S +) + +include(../lvlx.cmake) diff --git a/src/gf/broadwell/lvl3/fp.c b/src/gf/broadwell/lvl3/fp.c new file mode 100644 index 0000000..1ac3a49 --- /dev/null +++ b/src/gf/broadwell/lvl3/fp.c @@ -0,0 +1,108 @@ +#include +#include "fp.h" + +const digit_t p[NWORDS_FIELD] = { 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0x40ffffffffffffff }; +const digit_t p2[NWORDS_FIELD] = { 0xfffffffffffffffe, 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0x81ffffffffffffff }; + +void +fp_sqrt(fp_t *x) +{ + (void)gf65376_sqrt(x, x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + // ls is (0, 1, -1) and we want fp_is_square + // to return 0xFF..FF when ls is 1 or 0 and 0x00..00 otherwise + int32_t ls = gf65376_legendre(a); + return ~(uint32_t)(ls >> 1); +} + +void +fp_inv(fp_t *x) +{ + (void)gf65376_invert(x, x); +} + +void +fp_exp3div4(fp_t *a) +{ + // + // We optimise this by using the shape of the prime + // to avoid almost all multiplications: + // + // We write: + // (p - 3) / 4 = (65*2^376 - 4) / 4 + // = 65*2^374 - 1 + // = 65*(2^374 - 1) + 64 + // Then we first compute: + // a374 = a**(2^374 - 1) + // Then from this we get the desired result as: + // a**((p-3)/4) = a374**65 * a**64 + // We can compute this with 13 multiplications and 383 squares. + fp_t z3, z64, t11, tmp; + // Compute a**3, a**4 and a**64 + fp_sqr(&z64, a); + fp_mul(&z3, a, &z64); + fp_sqr(&z64, &z64); + // Compute t11 = a^3 * a^4 = a**(2^3 - 1) = a**7 + fp_mul(&t11, &z3, &z64); + fp_sqr(&z64, &z64); + fp_sqr(&z64, &z64); + fp_sqr(&z64, &z64); + fp_sqr(&z64, &z64); + // Compute a**(2^4 - 1) = a**15 + fp_sqr(&tmp, &t11); + fp_mul(a, a, &tmp); + // Compute a**(2^8 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 4; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^11 - 1) + for (int i = 0; i < 3; i++) + fp_sqr(a, a); + fp_mul(&t11, &t11, a); + // Compute a**(2^22 - 1) + fp_sqr(&tmp, &t11); + for (int i = 1; i < 11; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, &t11, &tmp); + // Compute a**(2^44 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 22; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^88 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 44; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^176 - 1)' + fp_sqr(&tmp, a); + for (int i = 1; i < 88; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^187 - 1) + for (int i = 0; i < 11; i++) + fp_sqr(a, a); + fp_mul(a, a, &t11); + // Compute a**(2^374 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 187; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(65*(2^374 - 1)) + fp_sqr(&tmp, a); + fp_sqr(&tmp, &tmp); + fp_sqr(&tmp, &tmp); + fp_sqr(&tmp, &tmp); + fp_sqr(&tmp, &tmp); + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(65*(2^374 - 1) + 64) + fp_mul(a, a, &z64); +} diff --git a/src/gf/broadwell/lvl3/fp_asm.S b/src/gf/broadwell/lvl3/fp_asm.S new file mode 100755 index 0000000..45b12dc --- /dev/null +++ b/src/gf/broadwell/lvl3/fp_asm.S @@ -0,0 +1,825 @@ +#include +.intel_syntax noprefix + +.set pbytes,32 +.set plimbs,4 + +#ifdef __APPLE__ +.section __TEXT,__const +#else +.section .rodata +#endif +p_plus_1: .quad 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x4100000000000000 + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",@progbits +#endif + +#include + +.text +.p2align 4,,15 + +.global fp_add +fp_add: + push r12 + push r13 + xor rax, rax + mov r8, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + add r8, [rdx] + adc r9, [rdx+8] + adc r10, [rdx+16] + adc r11, [rdx+24] + adc r12, [rdx+32] + adc r13, [rdx+40] + mov rax, r13 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rax + sbb r13, rdx + + mov rax, r13 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rax + sbb r13, rdx + mov [rdi], r8 + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + pop r13 + pop r12 + ret + +.global fp_sub +fp_sub: + push r12 + push r13 + xor rax, rax + mov r8, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + sub r8, [rdx] + sbb r9, [rdx+8] + sbb r10, [rdx+16] + sbb r11, [rdx+24] + sbb r12, [rdx+32] + sbb r13, [rdx+40] + sbb rax, 0 + + mov rdx, [rip+p+40] + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rax + adc r12, rax + adc r13, rdx + + mov rax, r13 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rax + adc r12, rax + adc r13, rdx + + mov [rdi], r8 + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + pop r13 + pop r12 + ret + +///////////////////////////////////////////////////////////////// MACROS +// z = a x bi + z +// Inputs: base memory pointer M1 (a), +// bi pre-stored in rdx, +// accumulator z in [Z0:Z6] +// Output: [Z0:Z6] +// Temps: regs T0:T1 +///////////////////////////////////////////////////////////////// +.macro MULADD64x384 M1, Z0, Z1, Z2, Z3, Z4, Z5, Z6, T0, T1, C + mulx \T0, \T1, \M1 // A0*B0 + xor \C, \C + adox \Z0, \T1 + adox \Z1, \T0 + mulx \T0, \T1, 8\M1 // A0*B1 + adcx \Z1, \T1 + adox \Z2, \T0 + mulx \T0, \T1, 16\M1 // A0*B2 + adcx \Z2, \T1 + adox \Z3, \T0 + mulx \T0, \T1, 24\M1 // A0*B3 + adcx \Z3, \T1 + adox \Z4, \T0 + mulx \T0, \T1, 32\M1 // A0*B4 + adcx \Z4, \T1 + adox \Z5, \T0 + mulx \T0, \T1, 40\M1 // A0*B5 + adcx \Z5, \T1 + adox \Z6, \T0 + adc \Z6, 0 +.endm + +.macro MULADD64x64 M1, Z0, Z1, Z2, Z3, Z4, Z5, T0, T1 + mulx \T0, \T1, \M1 // A0*B0 + xor rax, rax + adox \Z4, \T1 + adox \Z5, \T0 +.endm + +//*********************************************************************** +// Multiplication in GF(p^2), non-complex part +// Operation: c [rdi] = a0 x b0 - a1 x b1 +// Inputs: a = [a1, a0] stored in [rsi] +// b = [b1, b0] stored in [rdx] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_mul_c0 +fp2_mul_c0: + push r12 + push r13 + push r14 + push r15 + push rbx + mov rcx, rdx + sub rsp, 96 + + // [rdi0:5] <- 2p - b1 + mov r8, [rip+p2] + mov r9, [rip+p2+8] + mov r10, r9 + mov r11, r9 + mov r12, r9 + mov r13, [rip+p2+40] + mov rax, [rcx+48] + mov rdx, [rcx+56] + sub r8, rax + sbb r9, rdx + mov rax, [rcx+64] + mov rdx, [rcx+72] + sbb r10, rax + sbb r11, rdx + mov rax, [rcx+80] + mov rdx, [rcx+88] + sbb r12, rax + sbb r13, rdx + mov [rdi], r8 + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + + // Correcting a to [0,p) + xor rax, rax + mov r8, [rsi+48] + mov r9, [rsi+56] + mov r10, [rsi+64] + mov r11, [rsi+72] + mov r12, [rsi+80] + mov r13, [rsi+88] + mov rbx, [rip+p] + mov rdx, [rip+p+40] + sub r8, rbx + sbb r9, rbx + sbb r10, rbx + sbb r11, rbx + sbb r12, rbx + sbb r13, rdx + sbb rax, 0 + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rax + adc r12, rax + adc r13, rdx + mov [rsp+48], r8 + mov [rsp+56], r9 + mov [rsp+64], r10 + mov [rsp+72], r11 + mov [rsp+80], r12 + mov [rsp+88], r13 + + xor rax, rax + mov r8, [rsi] + mov r10, [rsi+8] + mov r12, [rsi+16] + mov r13, [rsi+24] + mov r14, [rsi+32] + mov r15, [rsi+40] + mov rdx, [rip+p+40] + sub r8, rbx + sbb r10, rbx + sbb r12, rbx + sbb r13, rbx + sbb r14, rbx + sbb r15, rdx + sbb rax, 0 + and rdx, rax + add r8, rax + adc r10, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rdx + mov [rsp], r8 + mov [rsp+8], r10 + mov [rsp+16], r12 + mov [rsp+24], r13 + mov [rsp+32], r14 + mov [rsp+40], r15 + + // [r8:r14] <- z = a0 x b00 - a1 x b10 + mov rdx, [rcx] + mulx r9, r8, r8 + xor rax, rax + mulx r10, r11, r10 + adox r9, r11 + mulx r11, r12, r12 + adox r10, r12 + mulx r12, r13, r13 + adox r11, r13 + mulx r13, r14, r14 + adox r12, r14 + mulx r14, r15, r15 + adox r13, r15 + adox r14, rax + + mov rdx, [rdi] + MULADD64x384 [rsp+48], r8, r9, r10, r11, r12, r13, r14, r15, rbx, rax + // [r9:r14] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r8 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r9, r10, r11, r12, r13, r14, r15, rbx + + // [r9:r14, r8] <- z = a0 x b01 - a1 x b11 + z + mov rdx, [rcx+8] + MULADD64x384 [rsp], r9, r10, r11, r12, r13, r14, r8, r15, rbx, r8 + mov rdx, [rdi+8] + MULADD64x384 [rsp+48], r9, r10, r11, r12, r13, r14, r8, r15, rbx, rax + // [r10:r14, r8] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r9 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r10, r11, r12, r13, r14, r8, r15, rbx + + // [r10:r14, r8:r9] <- z = a0 x b02 - a1 x b12 + z + mov rdx, [rcx+16] + MULADD64x384 [rsp], r10, r11, r12, r13, r14, r8, r9, r15, rbx, r9 + mov rdx, [rdi+16] + MULADD64x384 [rsp+48], r10, r11, r12, r13, r14, r8, r9, r15, rbx, rax + // [r11:r14, r8:r9] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r10 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r11, r12, r13, r14, r8, r9, r15, rbx + + // [r11:r14, r8:r10] <- z = a0 x b03 - a1 x b13 + z + mov rdx, [rcx+24] + MULADD64x384 [rsp], r11, r12, r13, r14, r8, r9, r10, r15, rbx, r10 + mov rdx, [rdi+24] + MULADD64x384 [rsp+48], r11, r12, r13, r14, r8, r9, r10, r15, rbx, rax + // [r14, r8:r10] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r11 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r12, r13, r14, r8, r9, r10, r15, rbx + + // [r12:r14, r8:r11] <- z = a0 x b04 - a1 x b14 + z + mov rdx, [rcx+32] + MULADD64x384 [rsp], r12, r13, r14, r8, r9, r10, r11, r15, rbx, r11 + mov rdx, [rdi+32] + MULADD64x384 [rsp+48], r12, r13, r14, r8, r9, r10, r11, r15, rbx, rax + // [r14, r8:r11] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r12 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r13, r14, r8, r9, r10, r11, r15, rbx + + // [r13:r14, r8:r12] <- z = a0 x b05 - a1 x b15 + z + mov rdx, [rcx+40] + MULADD64x384 [rsp], r13, r14, r8, r9, r10, r11, r12, r15, rbx, r12 + mov rdx, [rdi+40] + MULADD64x384 [rsp+48], r13, r14, r8, r9, r10, r11, r12, r15, rbx, rax + // [r14, r8:r12] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r13 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r14, r8, r9, r10, r11, r12, r15, rbx + + // Final correction + mov rax, r12 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r14, rax + sbb r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rdx + + mov [rdi], r14 + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + add rsp, 96 + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +//*********************************************************************** +// Multiplication in GF(p^2), complex part +// Operation: c [rdi] = a0 x b1 + a1 x b0 +// Inputs: a = [a1, a0] stored in [rsi] +// b = [b1, b0] stored in [rdx] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_mul_c1 +fp2_mul_c1: + push r12 + push r13 + push r14 + push r15 + push rbx + mov rcx, rdx + sub rsp, 96 + + // Correcting a to [0,p) + xor rax, rax + mov r8, [rsi+48] + mov r9, [rsi+56] + mov r10, [rsi+64] + mov r11, [rsi+72] + mov r12, [rsi+80] + mov r13, [rsi+88] + mov rbx, [rip+p] + mov rdx, [rip+p+40] + sub r8, rbx + sbb r9, rbx + sbb r10, rbx + sbb r11, rbx + sbb r12, rbx + sbb r13, rdx + sbb rax, 0 + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rax + adc r12, rax + adc r13, rdx + mov [rsp+48], r8 + mov [rsp+56], r9 + mov [rsp+64], r10 + mov [rsp+72], r11 + mov [rsp+80], r12 + mov [rsp+88], r13 + + xor rax, rax + mov r8, [rsi] + mov r10, [rsi+8] + mov r12, [rsi+16] + mov r13, [rsi+24] + mov r14, [rsi+32] + mov r15, [rsi+40] + mov rdx, [rip+p+40] + sub r8, rbx + sbb r10, rbx + sbb r12, rbx + sbb r13, rbx + sbb r14, rbx + sbb r15, rdx + sbb rax, 0 + and rdx, rax + add r8, rax + adc r10, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rdx + mov [rsp], r8 + mov [rsp+8], r10 + mov [rsp+16], r12 + mov [rsp+24], r13 + mov [rsp+32], r14 + mov [rsp+40], r15 + + // [r8:r14] <- z = a0 x b10 + a1 x b00 + mov rdx, [rcx+48] + mulx r9, r8, r8 + xor rax, rax + mulx r10, r11, r10 + adox r9, r11 + mulx r11, r12, r12 + adox r10, r12 + mulx r12, r13, r13 + adox r11, r13 + mulx r13, r14, r14 + adox r12, r14 + mulx r14, r15, r15 + adox r13, r15 + adox r14, rax + + mov rdx, [rcx] + MULADD64x384 [rsp+48], r8, r9, r10, r11, r12, r13, r14, r15, rbx, rax + // [r9:r14] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r8 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r9, r10, r11, r12, r13, r14, r15, rbx + + // [r9:r14, r8] <- z = a0 x b01 - a1 x b11 + z + mov rdx, [rcx+56] + MULADD64x384 [rsi], r9, r10, r11, r12, r13, r14, r8, r15, rbx, r8 + mov rdx, [rcx+8] + MULADD64x384 [rsp+48], r9, r10, r11, r12, r13, r14, r8, r15, rbx, rax + // [r10:r14, r8] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r9 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r10, r11, r12, r13, r14, r8, r15, rbx + + // [r10:r14, r8:r9] <- z = a0 x b02 - a1 x b12 + z + mov rdx, [rcx+64] + MULADD64x384 [rsp], r10, r11, r12, r13, r14, r8, r9, r15, rbx, r9 + mov rdx, [rcx+16] + MULADD64x384 [rsp+48], r10, r11, r12, r13, r14, r8, r9, r15, rbx, rax + // [r11:r14, r8:r9] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r10 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r11, r12, r13, r14, r8, r9, r15, rbx + + // [r11:r14, r8:r10] <- z = a0 x b03 - a1 x b13 + z + mov rdx, [rcx+72] + MULADD64x384 [rsp], r11, r12, r13, r14, r8, r9, r10, r15, rbx, r10 + mov rdx, [rcx+24] + MULADD64x384 [rsp+48], r11, r12, r13, r14, r8, r9, r10, r15, rbx, rax + // [r14, r8:r10] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r11 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r12, r13, r14, r8, r9, r10, r15, rbx + + // [r12:r14, r8:r11] <- z = a0 x b04 - a1 x b14 + z + mov rdx, [rcx+80] + MULADD64x384 [rsp], r12, r13, r14, r8, r9, r10, r11, r15, rbx, r11 + mov rdx, [rcx+32] + MULADD64x384 [rsp+48], r12, r13, r14, r8, r9, r10, r11, r15, rbx, rax + // [r14, r8:r11] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r12 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r13, r14, r8, r9, r10, r11, r15, rbx + + // [r13:r14, r8:r12] <- z = a0 x b05 - a1 x b15 + z + mov rdx, [rcx+88] + MULADD64x384 [rsp], r13, r14, r8, r9, r10, r11, r12, r15, rbx, r12 + mov rdx, [rcx+40] + MULADD64x384 [rsp+48], r13, r14, r8, r9, r10, r11, r12, r15, rbx, rax + // [r14, r8:r12] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r13 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], r14, r8, r9, r10, r11, r12, r15, rbx + + // Final correction + mov rax, r12 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r14, rax + sbb r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rdx + + mov [rdi], r14 + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + add rsp, 96 + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +///////////////////////////////////////////////////////////////// MACRO +// z = a x b (mod p) +// Inputs: base memory pointers M0 (a), M1 (b) +// bi pre-stored in rdx, +// accumulator z in [Z0:Z6], pre-stores a0 x b +// Output: [Z0:Z6] +// Temps: regs T0:T1 +///////////////////////////////////////////////////////////////// +.macro FPMUL384x384 M0, M1, Z0, Z1, Z2, Z3, Z4, Z5, Z6, T0, T1 + // [Z1:Z6] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z0 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], \Z1, \Z2, \Z3, \Z4, \Z5, \Z6, \T0, \T1 + + // [Z1:Z6, Z0] <- z = a01 x a1 + z + mov rdx, 8\M0 + MULADD64x384 \M1, \Z1, \Z2, \Z3, \Z4, \Z5, \Z6, \Z0, \T0, \T1, \Z0 + // [Z2:Z6, Z0] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z1 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], \Z2, \Z3, \Z4, \Z5, \Z6, \Z0, \T0, \T1 + + // [Z2:Z6, Z0:Z1] <- z = a02 x a1 + z + mov rdx, 16\M0 + MULADD64x384 \M1, \Z2, \Z3, \Z4, \Z5, \Z6, \Z0, \Z1, \T0, \T1, \Z1 + // [Z3:Z6, Z0:Z1] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z2 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], \Z3, \Z4, \Z5, \Z6, \Z0, \Z1, \T0, \T1 + + // [Z3:Z6, Z0:Z2] <- z = a03 x a1 + z + mov rdx, 24\M0 + MULADD64x384 \M1, \Z3, \Z4, \Z5, \Z6, \Z0, \Z1, \Z2, \T0, \T1, \Z2 + // [Z4:Z6, Z0:Z2] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z3 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], \Z4, \Z5, \Z6, \Z0, \Z1, \Z2, \T0, \T1 + + // [Z4:Z6, Z0:Z3] <- z = a04 x a1 + z + mov rdx, 32\M0 + MULADD64x384 \M1, \Z4, \Z5, \Z6, \Z0, \Z1, \Z2, \Z3, \T0, \T1, \Z3 + // [Z5:Z6, Z0:Z3] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z4 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], \Z5, \Z6, \Z0, \Z1, \Z2, \Z3, \T0, \T1 + + // [Z5:Z6, Z0:Z4] <- z = a05 x a1 + z + mov rdx, 40\M0 + MULADD64x384 \M1, \Z5, \Z6, \Z0, \Z1, \Z2, \Z3, \Z4, \T0, \T1, \Z4 + // [Z6, Z0:Z4] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z5 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+40], \Z6, \Z0, \Z1, \Z2, \Z3, \Z4, \T0, \T1 +.endm + +//*********************************************************************** +// Squaring in GF(p^2), non-complex part +// Operation: c [rdi] = (a0+a1) x (a0-a1) +// Inputs: a = [a1, a0] stored in [rsi] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_sq_c0 +fp2_sq_c0: + push r12 + push r13 + push r14 + push r15 + + // a0 + a1 + mov rdx, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + add rdx, [rsi+48] + adc r9, [rsi+56] + adc r10, [rsi+64] + adc r11, [rsi+72] + adc r12, [rsi+80] + adc r13, [rsi+88] + mov [rdi], rdx + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + + // a0 - a1 + mov r8, [rsi] + mov r10, [rsi+8] + mov r12, [rsi+16] + mov r13, [rsi+24] + mov r14, [rsi+32] + mov r15, [rsi+40] + xor rax, rax + sub r8, [rsi+48] + sbb r10, [rsi+56] + sbb r12, [rsi+64] + sbb r13, [rsi+72] + sbb r14, [rsi+80] + sbb r15, [rsi+88] + sbb rax, 0 + + mov rcx, [rip+p+40] + and rcx, rax + add r8, rax + adc r10, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rcx + + mov rax, r15 + sar rax, 63 + mov rcx, [rip+p+40] + and rcx, rax + add r8, rax + adc r10, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rcx + + mov [rdi+48], r8 + mov [rdi+56], r10 + mov [rdi+64], r12 + mov [rdi+72], r13 + mov [rdi+80], r14 + mov [rdi+88], r15 + + // [r8:r14] <- z = a00 x a1 + mulx r9, r8, r8 + xor rax, rax + mulx r10, r11, r10 + adox r9, r11 + mulx r11, r12, r12 + adox r10, r12 + mulx r12, r13, r13 + adox r11, r13 + mulx r13, r14, r14 + adox r12, r14 + mulx r14, r15, r15 + adox r13, r15 + adox r14, rax + + FPMUL384x384 [rdi], [rdi+48], r8, r9, r10, r11, r12, r13, r14, r15, rcx + + // Final correction + mov rax, r12 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r14, rax + sbb r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rdx + + mov [rdi], r14 + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + pop r15 + pop r14 + pop r13 + pop r12 + ret + +//*********************************************************************** +// Squaring in GF(p^2), complex part +// Operation: c [rdi] = 2a0 x a1 +// Inputs: a = [a1, a0] stored in [reg_p1] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_sq_c1 +fp2_sq_c1: + push r12 + push r13 + push r14 + push r15 + + mov rdx, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + add rdx, rdx + adc r9, r9 + adc r10, r10 + adc r11, r11 + adc r12, r12 + adc r13, r13 + sub rsp, 48 + mov [rsp+8], r9 + mov [rsp+16], r10 + mov [rsp+24], r11 + mov [rsp+32], r12 + mov [rsp+40], r13 + + // [r8:r12] <- z = a00 x a1 + mulx r9, r8, [rsi+48] + xor rax, rax + mulx r10, r11, [rsi+56] + adox r9, r11 + mulx r11, r12, [rsi+64] + adox r10, r12 + mulx r12, r13, [rsi+72] + adox r11, r13 + mulx r13, r14, [rsi+80] + adox r12, r14 + mulx r14, r15, [rsi+88] + adox r13, r15 + adox r14, rax + + FPMUL384x384 [rsp], [rsi+48], r8, r9, r10, r11, r12, r13, r14, r15, rcx + add rsp, 48 + + // Final correction + mov rax, r12 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r14, rax + sbb r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rdx + + mov [rdi], r14 + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + pop r15 + pop r14 + pop r13 + pop r12 + ret + +//*********************************************************************** +// Field multiplication in GF(p) +// Operation: c = a x b mod p +// Inputs: a stored in [rsi], b stored in [rdx] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp_mul +fp_mul: + push r12 + push r13 + push r14 + push r15 + push rbx + mov rcx, rdx + + // [r8:r14] <- z = a x b0 + mov rdx, [rcx] + mulx r9, r8, [rsi] + xor rax, rax + mulx r10, r11, [rsi+8] + adox r9, r11 + mulx r11, r12, [rsi+16] + adox r10, r12 + mulx r12, r13, [rsi+24] + adox r11, r13 + mulx r13, r14, [rsi+32] + adox r12, r14 + mulx r14, r15, [rsi+40] + adox r13, r15 + adox r14, rax + + FPMUL384x384 [rcx], [rsi], r8, r9, r10, r11, r12, r13, r14, r15, rbx + + // Final correction + mov rax, r12 + sar rax, 63 + mov rdx, [rip+p+40] + and rdx, rax + sub r14, rax + sbb r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rdx + + mov [rdi], r14 + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +.global fp_sqr +fp_sqr: + mov rdx, rsi + jmp fp_mul diff --git a/src/gf/broadwell/lvl3/gf65376.c b/src/gf/broadwell/lvl3/gf65376.c new file mode 100644 index 0000000..367e32b --- /dev/null +++ b/src/gf/broadwell/lvl3/gf65376.c @@ -0,0 +1,792 @@ +#include "gf65376.h" + +// see gf65376.h +const gf65376 gf65376_ZERO = { 0, 0, 0, 0, 0, 0 }; + +// see gf65376.h +const gf65376 gf65376_ONE = { 0x0000000000000003, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x3D00000000000000 }; + +// see gf65376.h +const gf65376 gf65376_MINUS_ONE = { 0xFFFFFFFFFFFFFFFC, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF }; + +// Montgomery representation of 2^256. +static const gf65376 R2 = { 0x3F03F03F03F03F13, 0x03F03F03F03F03F0, 0xF03F03F03F03F03F, + 0x3F03F03F03F03F03, 0x03F03F03F03F03F0, 0x1D3F03F03F03F03F }; + +// The modulus itself (this is also a valid representation of zero). +static const gf65376 MODULUS = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x40FFFFFFFFFFFFFF }; + +// 1/2^380 (in Montgomery representation). +static const gf65376 INVT380 = { 0x0000000000000010, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }; + +static const gf65376 PM1O3 = { 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa, + 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa, 0x15aaaaaaaaaaaaaa }; + +// Expand the most significant bit of x into a full-width 64-bit word +// (0x0000000000000000 or 0xFFFFFFFFFFFFFFFF). +static inline uint64_t +sgnw(uint64_t x) +{ + return (uint64_t)(*(int64_t *)&x >> 63); +} + +// d <- u*f + v*g (in the field) +// Coefficients f and g are provided as unsigned integers, but they +// really are signed values which must be less than 2^62 (in absolute value). +static void +gf65376_lin(gf65376 *d, const gf65376 *u, const gf65376 *v, uint64_t f, uint64_t g) +{ + // f <- abs(f), keeping the sign in sf, and negating u accordingly + uint64_t sf = sgnw(f); + f = (f ^ sf) - sf; + gf65376 tu; + gf65376_neg(&tu, u); + gf65376_select(&tu, u, &tu, (uint32_t)sf); + + // g <- abs(g), keeping the sign in sg, and negating v accordingly + uint64_t sg = sgnw(g); + g = (g ^ sg) - sg; + gf65376 tv; + gf65376_neg(&tv, v); + gf65376_select(&tv, v, &tv, (uint32_t)sg); + + // Linear combination over plain integers. + uint64_t d0, d1, d2, d3, d4, d5, t; + inner_gf65376_umul_x2(d0, t, tu.v0, f, tv.v0, g); + inner_gf65376_umul_x2_add(d1, t, tu.v1, f, tv.v1, g, t); + inner_gf65376_umul_x2_add(d2, t, tu.v2, f, tv.v2, g, t); + inner_gf65376_umul_x2_add(d3, t, tu.v3, f, tv.v3, g, t); + inner_gf65376_umul_x2_add(d4, t, tu.v4, f, tv.v4, g, t); + inner_gf65376_umul_x2_add(d5, t, tu.v5, f, tv.v5, g, t); + + // Reduction: split into low part (376 bits) and high part + // (71 bits, since t can be up to 63 bits). If the high + // part is h, then: + // h*2^376 = (h mod 65)*2^376 + floor(h/65) mod q + uint64_t h0 = (d5 >> 56) | (t << 8); + uint64_t h1 = t >> 56; + d5 &= 0x00FFFFFFFFFFFFFF; + + // NOTE: 0xFC0FC0FC0FC0FC1 = 65^-1 % 2^64 + // NOTE: 0xFC1 = 65^-1 % 2^12 + uint64_t z0, z1, quo0, rem0, quo1, rem1; + inner_gf65376_umul(z0, z1, h0, 0xFC0FC0FC0FC0FC1); + (void)z0; + quo0 = z1 >> 2; + rem0 = h0 - (65 * quo0); + quo1 = (h1 * 0xFC1) >> 18; // Only keep bottom two bits + rem1 = h1 - (65 * quo1); + + // h = rem0 + 65*quo0 + (rem1 + 65*quo1)*2^64 + // = rem0 + rem1 + 65*(quo0 + quo1*2^64 + rem1*((2^64 - 1)/65)) + // We add rem0 and rem1 modulo 65, with an extra carry that + // goes into the folded part (multiple of 65). + uint64_t e, f0, f1; + unsigned char cc; + cc = inner_gf65376_adc(0, rem0 + 0xFFFFFFFFFFFFFFBE, rem1, &e); + cc = inner_gf65376_adc(cc, quo0, rem1 * 0x3F03F03F03F03F0, &f0); + cc = inner_gf65376_adc(cc, quo1, 0, &f1); + assert(cc == 0); + e -= 0xFFFFFFFFFFFFFFBE; + + // Now we only have to add e*2^384 + f0:f1 to the low part. + cc = inner_gf65376_adc(0, d0, f0, &d0); + cc = inner_gf65376_adc(cc, d1, f1, &d1); + cc = inner_gf65376_adc(cc, d2, 0, &d2); + cc = inner_gf65376_adc(cc, d3, 0, &d3); + cc = inner_gf65376_adc(cc, d4, 0, &d4); + (void)inner_gf65376_adc(cc, d5, e << 56, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; +} + +// d <- abs(floor((a*f + b*g) / 2^31)) +// Coefficients f and g are provided as unsigned integer, but they really +// are signed values, which MUST be at most 2^31 in absolute value. +// The computation is performed over the integers, not modulo q. The low +// 31 bits are dropped (in practice, callers provided appropriate coefficients +// f and g such that a*f + b*g is a multiple of 2^31. +// +// If a*f + b*g is negative, then the absolute value is computed, and the +// function returns 0xFFFFFFFFFFFFFFFF; otherwise, the function returns +// 0x0000000000000000. +static uint64_t +lindiv31abs(gf65376 *d, const gf65376 *a, const gf65376 *b, uint64_t f, uint64_t g) +{ + // f <- abs(f), keeping the sign in sf + uint64_t sf = sgnw(f); + f = (f ^ sf) - sf; + + // g <- abs(g), keeping the sign in sg + uint64_t sg = sgnw(g); + g = (g ^ sg) - sg; + + // Apply the signs of f and g to the source operands. + uint64_t a0, a1, a2, a3, a4, a5, a6; + uint64_t b0, b1, b2, b3, b4, b5, b6; + unsigned char cc; + + cc = inner_gf65376_sbb(0, a->v0 ^ sf, sf, &a0); + cc = inner_gf65376_sbb(cc, a->v1 ^ sf, sf, &a1); + cc = inner_gf65376_sbb(cc, a->v2 ^ sf, sf, &a2); + cc = inner_gf65376_sbb(cc, a->v3 ^ sf, sf, &a3); + cc = inner_gf65376_sbb(cc, a->v4 ^ sf, sf, &a4); + cc = inner_gf65376_sbb(cc, a->v5 ^ sf, sf, &a5); + (void)inner_gf65376_sbb(cc, 0, 0, &a6); + + cc = inner_gf65376_sbb(0, b->v0 ^ sg, sg, &b0); + cc = inner_gf65376_sbb(cc, b->v1 ^ sg, sg, &b1); + cc = inner_gf65376_sbb(cc, b->v2 ^ sg, sg, &b2); + cc = inner_gf65376_sbb(cc, b->v3 ^ sg, sg, &b3); + cc = inner_gf65376_sbb(cc, b->v4 ^ sg, sg, &b4); + cc = inner_gf65376_sbb(cc, b->v5 ^ sg, sg, &b5); + (void)inner_gf65376_sbb(cc, 0, 0, &b6); + + // Compute a*f + b*g into d0:d1:d2:d3:d4. Since f and g are at + // most 2^31, we can add two 128-bit products with no overflow. + // Note: a4 and b4 are both in {0, -1}. + uint64_t d0, d1, d2, d3, d4, d5, d6, t; + inner_gf65376_umul_x2(d0, t, a0, f, b0, g); + inner_gf65376_umul_x2_add(d1, t, a1, f, b1, g, t); + inner_gf65376_umul_x2_add(d2, t, a2, f, b2, g, t); + inner_gf65376_umul_x2_add(d3, t, a3, f, b3, g, t); + inner_gf65376_umul_x2_add(d4, t, a4, f, b4, g, t); + inner_gf65376_umul_x2_add(d5, t, a5, f, b5, g, t); + d6 = t - (a6 & f) - (b6 & g); + + // Right-shift the value by 31 bits. + d0 = (d0 >> 31) | (d1 << 33); + d1 = (d1 >> 31) | (d2 << 33); + d2 = (d2 >> 31) | (d3 << 33); + d3 = (d3 >> 31) | (d4 << 33); + d4 = (d4 >> 31) | (d5 << 33); + d5 = (d5 >> 31) | (d6 << 33); + + // If the result is negative, negate it. + t = sgnw(d6); + cc = inner_gf65376_sbb(0, d0 ^ t, t, &d0); + cc = inner_gf65376_sbb(cc, d1 ^ t, t, &d1); + cc = inner_gf65376_sbb(cc, d2 ^ t, t, &d2); + cc = inner_gf65376_sbb(cc, d3 ^ t, t, &d3); + cc = inner_gf65376_sbb(cc, d4 ^ t, t, &d4); + (void)inner_gf65376_sbb(cc, d5 ^ t, t, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + return t; +} + +// lzcnt(x) returns the number of leading bits of value 0 in x. It supports +// x == 0 (in which case the function returns 64). +#if defined __LZCNT__ +static inline uint64_t +lzcnt(uint64_t x) +{ + return _lzcnt_u64(x); +} +#else +static inline uint64_t +lzcnt(uint64_t x) +{ + uint64_t m, s; + m = sgnw((x >> 32) - 1); + s = m & 32; + x = (x >> 32) ^ (m & (x ^ (x >> 32))); + m = sgnw((x >> 16) - 1); + s |= m & 16; + x = (x >> 16) ^ (m & (x ^ (x >> 16))); + m = sgnw((x >> 8) - 1); + s |= m & 8; + x = (x >> 8) ^ (m & (x ^ (x >> 8))); + m = sgnw((x >> 4) - 1); + s |= m & 4; + x = (x >> 4) ^ (m & (x ^ (x >> 4))); + m = sgnw((x >> 2) - 1); + s |= m & 2; + x = (x >> 2) ^ (m & (x ^ (x >> 2))); + + // At this point, x fits on 2 bits. Count of extra zeros: + // x = 0 -> 2 + // x = 1 -> 1 + // x = 2 -> 0 + // x = 3 -> 0 + s += (2 - x) & ((x - 3) >> 2); + return s; +} +#endif + +// see gf65376.h +uint32_t +gf65376_div(gf65376 *d, const gf65376 *x, const gf65376 *y) +{ + // Extended binary GCD: + // + // a <- y + // b <- q (modulus) + // u <- x (self) + // v <- 0 + // + // Value a is normalized (in the 0..q-1 range). Values a and b are + // then considered as (signed) integers. Values u and v are field + // elements. + // + // Invariants: + // a*x = y*u mod q + // b*x = y*v mod q + // b is always odd + // + // At each step: + // if a is even, then: + // a <- a/2, u <- u/2 mod q + // else: + // if a < b: + // (a, u, b, v) <- (b, v, a, u) + // a <- (a-b)/2, u <- (u-v)/2 mod q + // + // What we implement below is the optimized version of this + // algorithm, as described in https://eprint.iacr.org/2020/972 + + gf65376 a, b, u, v; + uint64_t xa, xb, f0, g0, f1, g1; + uint32_t r; + + r = ~gf65376_iszero(y); + inner_gf65376_normalize(&a, y); + b = MODULUS; + u = *x; + v = gf65376_ZERO; + + // Generic loop does 23*31 = 713 inner iterations. + for (int i = 0; i < 23; i++) { + // Get approximations of a and b over 64 bits: + // - If len(a) <= 64 and len(b) <= 64, then we just use + // their values (low limbs). + // - Otherwise, with n = max(len(a), len(b)), we use: + // (a mod 2^31) + 2^31*floor(a / 2^(n - 33)) + // (b mod 2^31) + 2^31*floor(b / 2^(n - 33)) + uint64_t m5 = a.v5 | b.v5; + uint64_t m4 = a.v4 | b.v4; + uint64_t m3 = a.v3 | b.v3; + uint64_t m2 = a.v2 | b.v2; + uint64_t m1 = a.v1 | b.v1; + uint64_t tnz5 = sgnw(m5 | -m5); + uint64_t tnz4 = sgnw(m4 | -m4) & ~tnz5; + uint64_t tnz3 = sgnw(m3 | -m3) & ~tnz5 & ~tnz4; + uint64_t tnz2 = sgnw(m2 | -m2) & ~tnz5 & ~tnz4 & ~tnz3; + uint64_t tnz1 = sgnw(m1 | -m1) & ~tnz5 & ~tnz4 & ~tnz3 & ~tnz2; + uint64_t tnzm = (m5 & tnz5) | (m4 & tnz4) | (m3 & tnz3) | (m2 & tnz2) | (m1 & tnz1); + uint64_t tnza = (a.v5 & tnz5) | (a.v4 & tnz4) | (a.v3 & tnz3) | (a.v2 & tnz2) | (a.v1 & tnz1); + uint64_t tnzb = (b.v5 & tnz5) | (b.v4 & tnz4) | (b.v3 & tnz3) | (b.v2 & tnz2) | (b.v1 & tnz1); + uint64_t snza = (a.v4 & tnz5) | (a.v3 & tnz4) | (a.v2 & tnz3) | (a.v1 & tnz2) | (a.v0 & tnz1); + uint64_t snzb = (b.v4 & tnz5) | (b.v3 & tnz4) | (b.v2 & tnz3) | (b.v1 & tnz2) | (b.v0 & tnz1); + + // If both len(a) <= 64 and len(b) <= 64, then: + // tnzm = 0 + // tnza = 0, snza = 0, tnzb = 0, snzb = 0 + // Otherwise: + // tnzm != 0 + // tnza contains the top non-zero limb of a + // snza contains the limb right below tnza + // tnzb contains the top non-zero limb of a + // snzb contains the limb right below tnzb + // + // We count the number of leading zero bits in tnzm: + // - If s <= 31, then the top 31 bits can be extracted from + // tnza and tnzb alone. + // - If 32 <= s <= 63, then we need some bits from snza and + // snzb as well. + int64_t s = lzcnt(tnzm); + uint64_t sm = (uint64_t)((31 - s) >> 63); + tnza ^= sm & (tnza ^ ((tnza << 32) | (snza >> 32))); + tnzb ^= sm & (tnzb ^ ((tnzb << 32) | (snzb >> 32))); + s -= 32 & sm; + tnza <<= s; + tnzb <<= s; + + // At this point: + // - If len(a) <= 64 and len(b) <= 64, then: + // tnza = 0 + // tnzb = 0 + // tnz1 = tnz2 = tnz3 = tnz4 = tnz5 = 0 + // we want to use the entire low words of a and b + // - Otherwise, we want to use the top 33 bits of tnza and + // tnzb, and the low 31 bits of the low words of a and b. + uint64_t tzx = ~(tnz1 | tnz2 | tnz3 | tnz4 | tnz5); + tnza |= a.v0 & tzx; + tnzb |= b.v0 & tzx; + xa = (a.v0 & 0x7FFFFFFF) | (tnza & 0xFFFFFFFF80000000); + xb = (b.v0 & 0x7FFFFFFF) | (tnzb & 0xFFFFFFFF80000000); + + // Compute the 31 inner iterations on xa and xb. + uint64_t fg0 = (uint64_t)1; + uint64_t fg1 = (uint64_t)1 << 32; + for (int j = 0; j < 31; j++) { + uint64_t a_odd, swap, t0, t1, t2; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf65376_sbb(0, xa, xb, &t0); + (void)inner_gf65376_sbb(cc, 0, 0, &swap); + swap &= a_odd; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + xa >>= 1; + fg1 <<= 1; + } + fg0 += 0x7FFFFFFF7FFFFFFF; + fg1 += 0x7FFFFFFF7FFFFFFF; + f0 = (fg0 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0 >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1 >> 32) - (uint64_t)0x7FFFFFFF; + + // Propagate updates to a, b, u and v. + gf65376 na, nb, nu, nv; + uint64_t nega = lindiv31abs(&na, &a, &b, f0, g0); + uint64_t negb = lindiv31abs(&nb, &a, &b, f1, g1); + f0 = (f0 ^ nega) - nega; + g0 = (g0 ^ nega) - nega; + f1 = (f1 ^ negb) - negb; + g1 = (g1 ^ negb) - negb; + gf65376_lin(&nu, &u, &v, f0, g0); + gf65376_lin(&nv, &u, &v, f1, g1); + a = na; + b = nb; + u = nu; + v = nv; + } + + // If y is invertible, then the final GCD is 1, and + // len(a) + len(b) <= 53, so we can end the computation with + // the low words directly. We only need 51 iterations to reach + // the point where b = 1. + // + // If y is zero, then v is unchanged (hence zero) and none of + // the subsequent iterations will change it either, so we get + // 0 on output, which is what we want. + xa = a.v0; + xb = b.v0; + f0 = 1; + g0 = 0; + f1 = 0; + g1 = 1; + for (int j = 0; j < 51; j++) { + uint64_t a_odd, swap, t0, t1, t2, t3; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf65376_sbb(0, xa, xb, &t0); + (void)inner_gf65376_sbb(cc, 0, 0, &swap); + swap &= a_odd; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (f0 ^ f1); + f0 ^= t2; + f1 ^= t2; + t3 = swap & (g0 ^ g1); + g0 ^= t3; + g1 ^= t3; + xa -= a_odd & xb; + f0 -= a_odd & f1; + g0 -= a_odd & g1; + xa >>= 1; + f1 <<= 1; + g1 <<= 1; + } + gf65376_lin(d, &u, &v, f1, g1); + + // At the point: + // - Numerator and denominator were both in Montgomery representation, + // but the two factors R canceled each other. + // - We have injected 31*23+51 = 764 extra factors of 2, hence we + // must divide the result by 2^764. + // - However, we also want to obtain the result in Montgomery + // representation, i.e. multiply by 2^256. We thus want to + // divide the current result by 2^(764 - 384) = 2^380. + // - We do this division by using a Montgomery multiplication with + // the Montgomery representation of 1/2^380, i.e. the integer + // 2^384/2^380 = 16. + gf65376_mul(d, d, &INVT380); + return r; +} + +// see gf65376.h +uint32_t +gf65376_invert(gf65376 *d, const gf65376 *a) +{ + return gf65376_div(d, &gf65376_ONE, a); +} + +// see gf65376.h +int32_t +gf65376_legendre(const gf65376 *x) +{ + // Same algorithm as the binary GCD in gf65376_div(), with + // a few differences: + // - We do not keep track of the Bézout coefficients u and v. + // - In each inner iteration we adjust the running symbol value, + // which uses the low 3 bits of the values. + // - Since we need two extra bits of look-ahead, we can only run + // 29 inner iterations, and then need an extra recomputation + // for the last 2. + + gf65376 a, b; + uint64_t xa, xb, f0, g0, f1, g1, ls; + + inner_gf65376_normalize(&a, x); + b = MODULUS; + ls = 0; // running symbol information in bit 1. + + // Outer loop + for (int i = 0; i < 23; i++) { + // Get approximations of a and b over 64 bits. + uint64_t m5 = a.v5 | b.v5; + uint64_t m4 = a.v4 | b.v4; + uint64_t m3 = a.v3 | b.v3; + uint64_t m2 = a.v2 | b.v2; + uint64_t m1 = a.v1 | b.v1; + uint64_t tnz5 = sgnw(m5 | -m5); + uint64_t tnz4 = sgnw(m4 | -m4) & ~tnz5; + uint64_t tnz3 = sgnw(m3 | -m3) & ~tnz5 & ~tnz4; + uint64_t tnz2 = sgnw(m2 | -m2) & ~tnz5 & ~tnz4 & ~tnz3; + uint64_t tnz1 = sgnw(m1 | -m1) & ~tnz5 & ~tnz4 & ~tnz3 & ~tnz2; + uint64_t tnzm = (m5 & tnz5) | (m4 & tnz4) | (m3 & tnz3) | (m2 & tnz2) | (m1 & tnz1); + uint64_t tnza = (a.v5 & tnz5) | (a.v4 & tnz4) | (a.v3 & tnz3) | (a.v2 & tnz2) | (a.v1 & tnz1); + uint64_t tnzb = (b.v5 & tnz5) | (b.v4 & tnz4) | (b.v3 & tnz3) | (b.v2 & tnz2) | (b.v1 & tnz1); + uint64_t snza = (a.v4 & tnz5) | (a.v3 & tnz4) | (a.v2 & tnz3) | (a.v1 & tnz2) | (a.v0 & tnz1); + uint64_t snzb = (b.v4 & tnz5) | (b.v3 & tnz4) | (b.v2 & tnz3) | (b.v1 & tnz2) | (b.v0 & tnz1); + + int64_t s = lzcnt(tnzm); + uint64_t sm = (uint64_t)((31 - s) >> 63); + tnza ^= sm & (tnza ^ ((tnza << 32) | (snza >> 32))); + tnzb ^= sm & (tnzb ^ ((tnzb << 32) | (snzb >> 32))); + s -= 32 & sm; + tnza <<= s; + tnzb <<= s; + + uint64_t tzx = ~(tnz1 | tnz2 | tnz3 | tnz4 | tnz5); + tnza |= a.v0 & tzx; + tnzb |= b.v0 & tzx; + xa = (a.v0 & 0x7FFFFFFF) | (tnza & 0xFFFFFFFF80000000); + xb = (b.v0 & 0x7FFFFFFF) | (tnzb & 0xFFFFFFFF80000000); + + // First 290 inner iterations. + uint64_t fg0 = (uint64_t)1; + uint64_t fg1 = (uint64_t)1 << 32; + for (int j = 0; j < 29; j++) { + uint64_t a_odd, swap, t0, t1, t2; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf65376_sbb(0, xa, xb, &t0); + (void)inner_gf65376_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & xa & xb; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + xa >>= 1; + fg1 <<= 1; + ls ^= (xb + 2) >> 1; + } + + // Compute the updated a and b (low words only) to get + // enough bits for the next two iterations. + uint64_t fg0z = fg0 + 0x7FFFFFFF7FFFFFFF; + uint64_t fg1z = fg1 + 0x7FFFFFFF7FFFFFFF; + f0 = (fg0z & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0z >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1z & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1z >> 32) - (uint64_t)0x7FFFFFFF; + uint64_t a0 = (a.v0 * f0 + b.v0 * g0) >> 29; + uint64_t b0 = (a.v0 * f1 + b.v0 * g1) >> 29; + for (int j = 0; j < 2; j++) { + uint64_t a_odd, swap, t0, t1, t2, t3; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf65376_sbb(0, xa, xb, &t0); + (void)inner_gf65376_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & a0 & b0; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + t3 = swap & (a0 ^ b0); + a0 ^= t3; + b0 ^= t3; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + a0 -= a_odd & b0; + xa >>= 1; + fg1 <<= 1; + a0 >>= 1; + ls ^= (b0 + 2) >> 1; + } + + // Propagate updates to a and b. + fg0 += 0x7FFFFFFF7FFFFFFF; + fg1 += 0x7FFFFFFF7FFFFFFF; + f0 = (fg0 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0 >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1 >> 32) - (uint64_t)0x7FFFFFFF; + gf65376 na, nb; + uint64_t nega = lindiv31abs(&na, &a, &b, f0, g0); + (void)lindiv31abs(&nb, &a, &b, f1, g1); + ls ^= nega & nb.v0; + a = na; + b = nb; + } + + // Final iterations: values are at most 53 bits now. We do not + // need to keep track of update coefficients. Just like the GCD, + // we need only 51 iterations, because after 51 iterations, + // value a is 0 or 1, and b is 1, and no further modification to + // the Legendre symbol may happen. + xa = a.v0; + xb = b.v0; + for (int j = 0; j < 51; j++) { + uint64_t a_odd, swap, t0, t1; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf65376_sbb(0, xa, xb, &t0); + (void)inner_gf65376_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & xa & xb; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + xa -= a_odd & xb; + xa >>= 1; + ls ^= (xb + 2) >> 1; + } + + // At this point, if the source value was not zero, then the low + // bit of ls contains the QR status (0 = square, 1 = non-square), + // which we need to convert to the expected value (+1 or -1). + // If y == 0, then we return 0, per the API. + uint32_t r = 1 - ((uint32_t)ls & 2); + r &= ~gf65376_iszero(x); + return *(int32_t *)&r; +} + +// see gf65376.h +uint32_t +gf65376_sqrt(gf65376 *d, const gf65376 *a) +{ + // Candidate root is a^((q+1)/4), with (q+1)/4 = 65*2^374 + gf65376 y; + gf65376_xsquare(&y, a, 6); + gf65376_mul(&y, &y, a); + gf65376_xsquare(&y, &y, 374); + + // Normalize y and negate if necessary, to set the low bit to 0. + // The low bit check must be on the normal representation, + // not the Montgomery representation. + gf65376 yn; + inner_gf65376_montgomery_reduce(&yn, &y); + uint32_t ctl = -((uint32_t)yn.v0 & 1); + gf65376_neg(&yn, &y); + gf65376_select(&y, &y, &yn, ctl); + + // Check whether the candidate is indeed a square root. + gf65376_square(&yn, &y); + uint32_t r = gf65376_equals(&yn, a); + *d = y; + return r; +} + +// Little-endian encoding of a 64-bit integer. +static inline void +enc64le(void *dst, uint64_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); + buf[4] = (uint8_t)(x >> 32); + buf[5] = (uint8_t)(x >> 40); + buf[6] = (uint8_t)(x >> 48); + buf[7] = (uint8_t)(x >> 56); +} + +// Little-endian decoding of a 64-bit integer. +static inline uint64_t +dec64le(const void *src) +{ + const uint8_t *buf = src; + return (uint64_t)buf[0] | ((uint64_t)buf[1] << 8) | ((uint64_t)buf[2] << 16) | ((uint64_t)buf[3] << 24) | + ((uint64_t)buf[4] << 32) | ((uint64_t)buf[5] << 40) | ((uint64_t)buf[6] << 48) | ((uint64_t)buf[7] << 56); +} + +// see gf65376.h +void +gf65376_encode(void *dst, const gf65376 *a) +{ + uint8_t *buf = dst; + gf65376 x; + + inner_gf65376_montgomery_reduce(&x, a); + enc64le(buf, x.v0); + enc64le(buf + 8, x.v1); + enc64le(buf + 16, x.v2); + enc64le(buf + 24, x.v3); + enc64le(buf + 32, x.v4); + enc64le(buf + 40, x.v5); +} + +// see gf65376.h +uint32_t +gf65376_decode(gf65376 *d, const void *src) +{ + const uint8_t *buf = src; + uint64_t d0, d1, d2, d3, d4, d5, t; + unsigned char cc; + + d0 = dec64le(buf); + d1 = dec64le(buf + 8); + d2 = dec64le(buf + 16); + d3 = dec64le(buf + 24); + d4 = dec64le(buf + 32); + d5 = dec64le(buf + 40); + cc = inner_gf65376_sbb(0, d0, MODULUS.v0, &t); + cc = inner_gf65376_sbb(cc, d1, MODULUS.v1, &t); + cc = inner_gf65376_sbb(cc, d2, MODULUS.v2, &t); + cc = inner_gf65376_sbb(cc, d3, MODULUS.v3, &t); + cc = inner_gf65376_sbb(cc, d4, MODULUS.v4, &t); + cc = inner_gf65376_sbb(cc, d5, MODULUS.v5, &t); + + (void)inner_gf65376_sbb(cc, 0, 0, &t); + + // If the value was not canonical then t = 0; otherwise, t = -1. + d->v0 = d0 & t; + d->v1 = d1 & t; + d->v2 = d2 & t; + d->v3 = d3 & t; + d->v4 = d4 & t; + d->v5 = d5 & t; + + // Convert to Montgomery representation. + gf65376_mul(d, d, &R2); + + return (uint32_t)t; +} + +// see gf65376.h +void +gf65376_decode_reduce(gf65376 *d, const void *src, size_t len) +{ + const uint8_t *buf = src; + + *d = gf65376_ZERO; + if (len == 0) { + return; + } + + size_t rem = len % 48; + if (rem != 0) { + // Input size is not a multiple of 48, we decode a partial + // block, which is already less than 2^383. + uint8_t tmp[48]; + size_t k; + + k = len - rem; + + memcpy(tmp, buf + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + d->v0 = dec64le(&tmp[0]); + d->v1 = dec64le(&tmp[8]); + d->v2 = dec64le(&tmp[16]); + d->v3 = dec64le(&tmp[24]); + d->v4 = dec64le(&tmp[32]); + d->v5 = dec64le(&tmp[40]); + + len = k; + } else { + // Input size is a multiple of 48, we decode a full block, + // and a reduction is needed. + len -= 48; + uint64_t d0 = dec64le(buf + len); + uint64_t d1 = dec64le(buf + len + 8); + uint64_t d2 = dec64le(buf + len + 16); + uint64_t d3 = dec64le(buf + len + 24); + uint64_t d4 = dec64le(buf + len + 32); + uint64_t d5 = dec64le(buf + len + 40); + inner_gf65376_partial_reduce(d, d0, d1, d2, d3, d4, d5); + } + + // Process all remaining blocks, in descending address order. + while (len > 0) { + gf65376_mul(d, d, &R2); + len -= 48; + uint64_t t0 = dec64le(buf + len); + uint64_t t1 = dec64le(buf + len + 8); + uint64_t t2 = dec64le(buf + len + 16); + uint64_t t3 = dec64le(buf + len + 24); + uint64_t t4 = dec64le(buf + len + 32); + uint64_t t5 = dec64le(buf + len + 40); + + gf65376 t; + inner_gf65376_partial_reduce(&t, t0, t1, t2, t3, t4, t5); + gf65376_add(d, d, &t); + } + + // Final conversion to Montgomery representation. + gf65376_mul(d, d, &R2); +} + +void +gf65376_div3(gf65376 *d, const gf65376 *a) +{ + const digit_t MAGIC = 0xAAAAAAAAAAAAAAAB; // 3^-1 mod 2^64 + uint64_t c0, c1, f0, f1; + gf65376 t; + + inner_gf65376_umul(f0, f1, a->arr[5], MAGIC); + t.arr[5] = f1 >> 1; + c1 = a->arr[5] - 3 * t.arr[5]; + + for (int32_t i = 4; i >= 0; i--) { + c0 = c1; + inner_gf65376_umul(f0, f1, a->arr[i], MAGIC); + t.arr[i] = f1 >> 1; + c1 = c0 + a->arr[i] - 3 * t.arr[i]; + t.arr[i] += c0 * ((MAGIC - 1) >> 1); + f0 = ((c1 >> 1) & c1); /* c1 == 3 */ + f1 = ((c1 >> 2) & !(c1 & 0x11)); /* c1 == 4 */ + f0 |= f1; + t.arr[i] += f0; + c1 = c1 - 3 * f0; + } + *d = t; + gf65376_sub(&t, d, &PM1O3); + gf65376_select(d, d, &t, -((c1 & 1) | (c1 >> 1))); // c1 >= 1 + gf65376_sub(&t, d, &PM1O3); + gf65376_select(d, d, &t, -(c1 == 2)); +} \ No newline at end of file diff --git a/src/gf/broadwell/lvl3/include/fp.h b/src/gf/broadwell/lvl3/include/fp.h new file mode 100644 index 0000000..dd7e41b --- /dev/null +++ b/src/gf/broadwell/lvl3/include/fp.h @@ -0,0 +1,139 @@ +#ifndef FP_H +#define FP_H + +// Include statements +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gf65376.h" + +// Type for elements of GF(p) +#define fp_t gf65376 + +// Constants (Assumed to be in Montgomery form) +#define ZERO gf65376_ZERO +#define ONE gf65376_ONE + +// Operations in fp +static inline void +fp_neg(fp_t *d, const fp_t *a) +{ + gf65376_neg(d, a); +} + +void fp_add(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S +void fp_sub(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S +void fp_sqr(fp_t *out, const fp_t *a); // implemented in fp_asm.S +void fp_mul(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S + +static inline void +fp_mul_small(fp_t *d, const fp_t *a, uint32_t n) +{ + gf65376_mul_small(d, a, n); +} + +static inline void +fp_half(fp_t *d, const fp_t *a) +{ + gf65376_half(d, a); +} +// #define fp_half gf65376_half + +static inline void +fp_div3(fp_t *d, const fp_t *a) +{ + gf65376_div3(d, a); +} +// #define fp_div3 gf65376_div3 + +// Constant time selection and swapping +static inline void +fp_select(fp_t *d, const fp_t *a0, const fp_t *a1, uint32_t ctl) +{ + gf65376_select(d, a0, a1, ctl); +} +// #define fp_select gf65376_select +static inline void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + gf65376_cswap(a, b, ctl); +} +// #define fp_cswap gf65376_cswap + +// Comparisons for fp elements +static inline uint32_t +fp_is_zero(const fp_t *a) +{ + return gf65376_iszero(a); +} +// #define fp_is_zero gf65376_iszero + +static inline uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return gf65376_equals(a, b); +} +// #define fp_is_equal gf65376_equals + +// Set a uint32 to an Fp value +static inline void +fp_set_small(fp_t *d, uint32_t x) +{ + gf65376_set_small(d, x); +} +// #define fp_set_small gf65376_set_small + +// Encoding and decoding of bytes +static inline void +fp_encode(void *dst, const fp_t *a) +{ + gf65376_encode(dst, a); +} +// #define fp_encode gf65376_encode +static inline uint32_t +fp_decode(fp_t *d, const void *src) +{ + return gf65376_decode(d, src); +} +// #define fp_decode gf65376_decode +static inline void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + gf65376_decode_reduce(d, src, len); +} +// #define fp_decode_reduce gf65376_decode_reduce + +// These functions are essentially useless because we can just +// use = for the shallow copies we need, but they're here for +// now until we do a larger refactoring +static inline void +fp_copy(fp_t *out, const fp_t *a) +{ + memcpy(out, a, sizeof(fp_t)); +} + +static inline void +fp_set_zero(fp_t *a) +{ + memcpy(a, &ZERO, sizeof(fp_t)); +} + +static inline void +fp_set_one(fp_t *a) +{ + memcpy(a, &ONE, sizeof(fp_t)); +} + +// Functions defined in low level code but with different API +void fp_inv(fp_t *a); +void fp_sqrt(fp_t *a); +void fp_exp3div4(fp_t *a); +uint32_t fp_is_square(const fp_t *a); + +#endif diff --git a/src/gf/broadwell/lvl3/include/fp2.h b/src/gf/broadwell/lvl3/include/fp2.h new file mode 100644 index 0000000..81801fa --- /dev/null +++ b/src/gf/broadwell/lvl3/include/fp2.h @@ -0,0 +1,45 @@ +#ifndef FP2_H +#define FP2_H + +#define NO_FP2X_MUL +#define NO_FP2X_SQR + +#include + +extern void fp2_sq_c0(fp2_t *out, const fp2_t *in); +extern void fp2_sq_c1(fp_t *out, const fp2_t *in); + +extern void fp2_mul_c0(fp_t *out, const fp2_t *in0, const fp2_t *in1); +extern void fp2_mul_c1(fp_t *out, const fp2_t *in0, const fp2_t *in1); + +static inline void +fp2_mul(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_t t; + + fp2_mul_c0(&t, y, z); // c0 = a0*b0 - a1*b1 + fp2_mul_c1(&x->im, y, z); // c1 = a0*b1 + a1*b0 + x->re.arr[0] = t.arr[0]; + x->re.arr[1] = t.arr[1]; + x->re.arr[2] = t.arr[2]; + x->re.arr[3] = t.arr[3]; + x->re.arr[4] = t.arr[4]; + x->re.arr[5] = t.arr[5]; +} + +static inline void +fp2_sqr(fp2_t *x, const fp2_t *y) +{ + fp2_t t; + + fp2_sq_c0(&t, y); // c0 = (a0+a1)(a0-a1) + fp2_sq_c1(&x->im, y); // c1 = 2a0*a1 + x->re.arr[0] = t.re.arr[0]; + x->re.arr[1] = t.re.arr[1]; + x->re.arr[2] = t.re.arr[2]; + x->re.arr[3] = t.re.arr[3]; + x->re.arr[4] = t.re.arr[4]; + x->re.arr[5] = t.re.arr[5]; +} + +#endif \ No newline at end of file diff --git a/src/gf/broadwell/lvl3/include/gf65376.h b/src/gf/broadwell/lvl3/include/gf65376.h new file mode 100644 index 0000000..ba752c9 --- /dev/null +++ b/src/gf/broadwell/lvl3/include/gf65376.h @@ -0,0 +1,1121 @@ +#ifndef gf65376_h__ +#define gf65376_h__ + +#ifdef __cplusplus +extern "C" +{ +#endif +#include +#include +#include +#include +#include +#include + + typedef uint64_t digit_t; // Datatype for representing field elements + + /* + * A gf65376 instance represents an integer modulo q. + * This is a structure; it can be copied with a simple assignment, and + * passed around as a value (though exchanging pointers is possibly more + * efficient). + * The contents are opaque. No calling code should make any assumption + * about the contents. + */ + typedef union + { + // Contents are opaque. + // Implementation note: this encodes the value in Montgomery + // representation, with R = 2^384. Only partial reduction is + // done internally to ensure the value is below 2^383 + struct + { + uint64_t v0; + uint64_t v1; + uint64_t v2; + uint64_t v3; + uint64_t v4; + uint64_t v5; + }; + digit_t arr[6]; + } gf65376; + + /* + * Constant zero (in the field). + */ + extern const gf65376 gf65376_ZERO; + + /* + * Constant one (in the field). + */ + extern const gf65376 gf65376_ONE; + + /* + * Constant -1 (in the field). + */ + extern const gf65376 gf65376_MINUS_ONE; + + /* + * API RULES: + * ========== + * + * Elementary operations on field elements are implemented by functions + * which take as parameter pointers to the operands. The first parameter + * is the pointer to the destination. Thus: + * gf65376 a = ...; + * gf65376 b = ...; + * gf65376 d; + * gf65376_sub(&d, &a, &b) + * sets field element d to a - b (implicitly modulo q). + * + * Operands may be used several times: it is always valid to use as + * output a gf65376 structure which is also used as input. + * + * Boolean values are represented by 32-bit integer (uint32_t) which have + * value exactly 0xFFFFFFFF (for "true") or 0x00000000 (for "false"). This + * convention minimizes the risk that a "smart" compiler breaks the + * constant-time property of the code through unfortunated optimizations. + * When a function expects such a Boolean, the caller MUST take care never + * to provide any value other than 0x00000000 or 0xFFFFFFFF. + * + * Values are encoded into exactly 48 bytes: value x modulo q is mapped to + * its unique integer representant in the [0..q-1] range, which is then + * encoded over 48 bytes with little-endian convention. Encoding is canonical + * and checked: when decoding (with gf65376_decode()), the input value is + * verified to be in the [0..q-1] range; for an out-of-range value, + * gf65376_decode() fills the output structure with zero, and returns + * 0x00000000. + * + * For most operations, the implementation is an inline function, defined + * below; the compiler can thus efficiently include it in the calling code. + * A few expensive operations (e.g. divisions) use non-inline functions, + * declared below but defined in gf65376.c + * + * All functions and macro whose name starts with "inner_gf65376_" are + * internal to this implementation and visible here only in order to + * support the API inline functions; they MUST NOT be used directly. + */ + +#if (defined _MSC_VER && defined _M_X64) || (defined __x86_64__ && (defined __GNUC__ || defined __clang__)) +#include +#define inner_gf65376_adc(cc, a, b, d) _addcarry_u64(cc, a, b, (unsigned long long *)(void *)d) +#define inner_gf65376_sbb(cc, a, b, d) _subborrow_u64(cc, a, b, (unsigned long long *)(void *)d) +#else +static inline unsigned char +inner_gf65376_adc(unsigned char cc, uint64_t a, uint64_t b, uint64_t *d) +{ + unsigned __int128 t = (unsigned __int128)a + (unsigned __int128)b + cc; + *d = (uint64_t)t; + return (unsigned char)(t >> 64); +} +static inline unsigned char +inner_gf65376_sbb(unsigned char cc, uint64_t a, uint64_t b, uint64_t *d) +{ + unsigned __int128 t = (unsigned __int128)a - (unsigned __int128)b - cc; + *d = (uint64_t)t; + return (unsigned char)(-(uint64_t)(t >> 64)); +} +#endif + +#if defined _MSC_VER +#define inner_gf65376_umul(lo, hi, x, y) \ + do { \ + uint64_t umul_hi; \ + (lo) = _umul128((x), (y), &umul_hi); \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf65376_umul_add(lo, hi, x, y, z) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x), (y), &umul_hi); \ + unsigned char umul_cc; \ + umul_cc = inner_gf65376_adc(0, umul_lo, (z), &umul_lo); \ + (void)inner_gf65376_adc(umul_cc, umul_hi, 0, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf65376_umul_x2(lo, hi, x1, y1, x2, y2) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x1), (y1), &umul_hi); \ + uint64_t umul_lo2, umul_hi2; \ + umul_lo2 = _umul128((x2), (y2), &umul_hi2); \ + unsigned char umul_cc; \ + umul_cc = inner_gf65376_adc(0, umul_lo, umul_lo2, &umul_lo); \ + (void)inner_gf65376_adc(umul_cc, umul_hi, umul_hi2, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf65376_umul_x2_add(lo, hi, x1, y1, x2, y2, z) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x1), (y1), &umul_hi); \ + uint64_t umul_lo2, umul_hi2; \ + umul_lo2 = _umul128((x2), (y2), &umul_hi2); \ + unsigned char umul_cc; \ + umul_cc = inner_gf65376_adc(0, umul_lo, umul_lo2, &umul_lo); \ + (void)inner_gf65376_adc(umul_cc, umul_hi, umul_hi2, &umul_hi); \ + umul_cc = inner_gf65376_adc(0, umul_lo, (z), &umul_lo); \ + (void)inner_gf65376_adc(umul_cc, umul_hi, 0, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#else +#define inner_gf65376_umul(lo, hi, x, y) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x) * (unsigned __int128)(y); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf65376_umul_add(lo, hi, x, y, z) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x) * (unsigned __int128)(y) + (unsigned __int128)(uint64_t)(z); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf65376_umul_x2(lo, hi, x1, y1, x2, y2) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = \ + (unsigned __int128)(x1) * (unsigned __int128)(y1) + (unsigned __int128)(x2) * (unsigned __int128)(y2); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf65376_umul_x2_add(lo, hi, x1, y1, x2, y2, z) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x1) * (unsigned __int128)(y1) + \ + (unsigned __int128)(x2) * (unsigned __int128)(y2) + (unsigned __int128)(uint64_t)(z); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#endif + + /* + * d <- a + b + */ + static inline void + gf65376_add(gf65376 *d, const gf65376 *a, const gf65376 *b) + { + uint64_t d0, d1, d2, d3, d4, d5, f; + unsigned char cc; + + // Raw addition. + cc = inner_gf65376_adc(0, a->v0, b->v0, &d0); + cc = inner_gf65376_adc(cc, a->v1, b->v1, &d1); + cc = inner_gf65376_adc(cc, a->v2, b->v2, &d2); + cc = inner_gf65376_adc(cc, a->v3, b->v3, &d3); + cc = inner_gf65376_adc(cc, a->v4, b->v4, &d4); + (void)inner_gf65376_adc(cc, a->v5, b->v5, &d5); + + // Sum is up to 2^384 - 2. Subtract q if the value is not lower + // than 2^383 (we subtract q by adding -q). + // Note: 0xBF = (-65) % 256, 56 = 376 - 5*64 + f = d5 >> 63; + cc = inner_gf65376_adc(0, d0, f, &d0); + cc = inner_gf65376_adc(cc, d1, 0, &d1); + cc = inner_gf65376_adc(cc, d2, 0, &d2); + cc = inner_gf65376_adc(cc, d3, 0, &d3); + cc = inner_gf65376_adc(cc, d4, 0, &d4); + (void)inner_gf65376_adc(cc, d5, ((uint64_t)0xBF << 56) & -f, &d5); + + // One subtraction of q might not be enough. + f = d5 >> 63; + cc = inner_gf65376_adc(0, d0, f, &d0); + cc = inner_gf65376_adc(cc, d1, 0, &d1); + cc = inner_gf65376_adc(cc, d2, 0, &d2); + cc = inner_gf65376_adc(cc, d3, 0, &d3); + cc = inner_gf65376_adc(cc, d4, 0, &d4); + (void)inner_gf65376_adc(cc, d5, ((uint64_t)0xBF << 56) & -f, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + /* + * d <- a - b + */ + static inline void + gf65376_sub(gf65376 *d, const gf65376 *a, const gf65376 *b) + { + uint64_t d0, d1, d2, d3, d4, d5, m, f; + unsigned char cc; + + // Raw subtraction. + cc = inner_gf65376_sbb(0, a->v0, b->v0, &d0); + cc = inner_gf65376_sbb(cc, a->v1, b->v1, &d1); + cc = inner_gf65376_sbb(cc, a->v2, b->v2, &d2); + cc = inner_gf65376_sbb(cc, a->v3, b->v3, &d3); + cc = inner_gf65376_sbb(cc, a->v4, b->v4, &d4); + cc = inner_gf65376_sbb(cc, a->v5, b->v5, &d5); + + // Add 2*q if the result is negative. + // Note: 0x7E = (-2*65) % 256, 56 = 376 - 5*64 + (void)inner_gf65376_sbb(cc, 0, 0, &m); + cc = inner_gf65376_sbb(0, d0, m & 2, &d0); + cc = inner_gf65376_sbb(cc, d1, 0, &d1); + cc = inner_gf65376_sbb(cc, d2, 0, &d2); + cc = inner_gf65376_sbb(cc, d3, 0, &d3); + cc = inner_gf65376_sbb(cc, d4, 0, &d4); + (void)inner_gf65376_sbb(cc, d5, ((uint64_t)0x7E << 56) & m, &d5); + + // We might have overdone it; subtract q if necessary. + // Note: 0xBF = (-65) % 256, 56 = 376 - 5*64 + f = d5 >> 63; + cc = inner_gf65376_adc(0, d0, f, &d0); + cc = inner_gf65376_adc(cc, d1, 0, &d1); + cc = inner_gf65376_adc(cc, d2, 0, &d2); + cc = inner_gf65376_adc(cc, d3, 0, &d3); + cc = inner_gf65376_adc(cc, d4, 0, &d4); + (void)inner_gf65376_adc(cc, d5, ((uint64_t)0xBF << 56) & -f, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + /* + * d <- -a + */ + static inline void + gf65376_neg(gf65376 *d, const gf65376 *a) + { + uint64_t d0, d1, d2, d3, d4, d5, f; + unsigned char cc; + + // 2*q - a + cc = inner_gf65376_sbb(0, (uint64_t)0xFFFFFFFFFFFFFFFE, a->v0, &d0); + cc = inner_gf65376_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v1, &d1); + cc = inner_gf65376_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v2, &d2); + cc = inner_gf65376_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v3, &d3); + cc = inner_gf65376_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v4, &d4); + (void)inner_gf65376_sbb(cc, (uint64_t)0x81FFFFFFFFFFFFFF, a->v5, &d5); + + // Subtract q if the value is not lower than 2^251. + f = d5 >> 63; + cc = inner_gf65376_adc(0, d0, f, &d0); + cc = inner_gf65376_adc(cc, d1, 0, &d1); + cc = inner_gf65376_adc(cc, d2, 0, &d2); + cc = inner_gf65376_adc(cc, d3, 0, &d3); + cc = inner_gf65376_adc(cc, d4, 0, &d4); + (void)inner_gf65376_adc(cc, d5, ((uint64_t)0xBF << 56) & -f, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + /* + * If ctl == 0x00000000, then *a0 is copied into *d. + * If ctl == 0xFFFFFFFF, then *a1 is copied into *d. + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ + static inline void + gf65376_select(gf65376 *d, const gf65376 *a0, const gf65376 *a1, uint32_t ctl) + { + uint64_t cw = (uint64_t)*(int32_t *)&ctl; + d->v0 = a0->v0 ^ (cw & (a0->v0 ^ a1->v0)); + d->v1 = a0->v1 ^ (cw & (a0->v1 ^ a1->v1)); + d->v2 = a0->v2 ^ (cw & (a0->v2 ^ a1->v2)); + d->v3 = a0->v3 ^ (cw & (a0->v3 ^ a1->v3)); + d->v4 = a0->v4 ^ (cw & (a0->v4 ^ a1->v4)); + d->v5 = a0->v5 ^ (cw & (a0->v5 ^ a1->v5)); + } + + /* + * If ctl == 0x00000000, then *a and *b are unchanged. + * If ctl == 0xFFFFFFFF, then the contents of *a and *b are swapped. + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ + static inline void + gf65376_cswap(gf65376 *a, gf65376 *b, uint32_t ctl) + { + uint64_t cw = (uint64_t)*(int32_t *)&ctl; + uint64_t t; + t = cw & (a->v0 ^ b->v0); + a->v0 ^= t; + b->v0 ^= t; + t = cw & (a->v1 ^ b->v1); + a->v1 ^= t; + b->v1 ^= t; + t = cw & (a->v2 ^ b->v2); + a->v2 ^= t; + b->v2 ^= t; + t = cw & (a->v3 ^ b->v3); + a->v3 ^= t; + b->v3 ^= t; + t = cw & (a->v4 ^ b->v4); + a->v4 ^= t; + b->v4 ^= t; + t = cw & (a->v5 ^ b->v5); + a->v5 ^= t; + b->v5 ^= t; + } + + /* + * d <- a/2 + */ + static inline void + gf65376_half(gf65376 *d, const gf65376 *a) + { + uint64_t d0, d1, d2, d3, d4, d5; + + d0 = (a->v0 >> 1) | (a->v1 << 63); + d1 = (a->v1 >> 1) | (a->v2 << 63); + d2 = (a->v2 >> 1) | (a->v3 << 63); + d3 = (a->v3 >> 1) | (a->v4 << 63); + d4 = (a->v4 >> 1) | (a->v5 << 63); + d5 = a->v5 >> 1; + d5 += ((uint64_t)65 << 55) & -(a->v0 & 1); + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + // Inner function: 384-bit to 383-bit reduction + static inline void + inner_gf65376_partial_reduce(gf65376 *d, + uint64_t a0, + uint64_t a1, + uint64_t a2, + uint64_t a3, + uint64_t a4, + uint64_t a5) + { + uint64_t d0, d1, d2, d3, d4, d5, h, quo, rem; + unsigned char cc; + + // Split value in high (8 bits) and low (376 bits) parts. + h = a5 >> 56; + a5 &= 0x00FFFFFFFFFFFFFF; + + // 65*2^376 = 1 mod q; hence, we add floor(h/65) + (h mod 65)*2^376 + // to the low part. + quo = (h * 0xFC1) >> 18; + rem = h - (65 * quo); + cc = inner_gf65376_adc(0, a0, quo, &d0); + cc = inner_gf65376_adc(cc, a1, 0, &d1); + cc = inner_gf65376_adc(cc, a2, 0, &d2); + cc = inner_gf65376_adc(cc, a3, 0, &d3); + cc = inner_gf65376_adc(cc, a4, 0, &d4); + (void)inner_gf65376_adc(cc, a5, rem << 56, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + // Inner function: Normalize value *a into *d. + static inline void + inner_gf65376_normalize(gf65376 *d, const gf65376 *a) + { + uint64_t d0, d1, d2, d3, d4, d5, m; + unsigned char cc; + + // Subtract q. + cc = inner_gf65376_sbb(0, a->v0, 0xFFFFFFFFFFFFFFFF, &d0); + cc = inner_gf65376_sbb(cc, a->v1, 0xFFFFFFFFFFFFFFFF, &d1); + cc = inner_gf65376_sbb(cc, a->v2, 0xFFFFFFFFFFFFFFFF, &d2); + cc = inner_gf65376_sbb(cc, a->v3, 0xFFFFFFFFFFFFFFFF, &d3); + cc = inner_gf65376_sbb(cc, a->v4, 0xFFFFFFFFFFFFFFFF, &d4); + cc = inner_gf65376_sbb(cc, a->v5, 0x40FFFFFFFFFFFFFF, &d5); + + // Add back q if the result is negative. + (void)inner_gf65376_sbb(cc, 0, 0, &m); + cc = inner_gf65376_adc(0, d0, m, &d0); + cc = inner_gf65376_adc(cc, d1, m, &d1); + cc = inner_gf65376_adc(cc, d2, m, &d2); + cc = inner_gf65376_adc(cc, d3, m, &d3); + cc = inner_gf65376_adc(cc, d4, m, &d4); + (void)inner_gf65376_adc(cc, d5, m & 0x40FFFFFFFFFFFFFF, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + /* + * d <- 2*a + */ + static inline void + gf65376_mul2(gf65376 *d, const gf65376 *a) + { + gf65376_add(d, a, a); + } + + /* + * d <- a*x + * (multiplication by a 32-bit integer) + */ + static inline void + gf65376_mul_small(gf65376 *d, const gf65376 *a, uint32_t x) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, lo, hi, b, h, quo, rem; + unsigned char cc; + + // Product over the integers. Top output word (d6) is at most 31 bits. + b = (uint64_t)x; + inner_gf65376_umul(d0, d1, a->v0, b); + inner_gf65376_umul(d2, d3, a->v2, b); + inner_gf65376_umul(d4, d5, a->v4, b); + + inner_gf65376_umul(lo, hi, a->v1, b); + cc = inner_gf65376_adc(0, d1, lo, &d1); + cc = inner_gf65376_adc(cc, d2, hi, &d2); + inner_gf65376_umul(lo, hi, a->v3, b); + cc = inner_gf65376_adc(cc, d3, lo, &d3); + cc = inner_gf65376_adc(cc, d4, hi, &d4); + inner_gf65376_umul(lo, d6, a->v5, b); + cc = inner_gf65376_adc(cc, d5, lo, &d5); + (void)inner_gf65376_adc(cc, d6, 0, &d6); + + // Extract low 248-bit part, and the high part (at most 35 bits). + h = (d6 << 8) | (d5 >> 56); + d5 &= 0x00FFFFFFFFFFFFFF; + + // Fold h by adding floor(h/65) + (h mod 65)*2^376 to the low part. + inner_gf65376_umul(lo, hi, h, 0xFC0FC0FC0FC0FC1); + quo = hi >> 2; + rem = h - (65 * quo); + cc = inner_gf65376_adc(cc, d0, quo, &d0); + cc = inner_gf65376_adc(cc, d1, 0, &d1); + cc = inner_gf65376_adc(cc, d2, 0, &d2); + cc = inner_gf65376_adc(cc, d3, 0, &d3); + cc = inner_gf65376_adc(cc, d4, 0, &d4); + (void)inner_gf65376_adc(cc, d5, rem << 56, &d5); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + } + + /* + * d <- x + * Input value x (32-bit integer) is converted to field element x mod q. + */ + static inline void + gf65376_set_small(gf65376 *d, uint32_t x) + { + // We want Montgomery representation, i.e. x*2^384 mod q. + // We set h = x*2^8; then: + // x*2^384 = h*2^376 + // = (h mod 65)*2^376 + floor(h/65)*65*2^376 + // = (h mod 65)*2^376 + floor(h/65) mod q + // by using the fact that 65*2^376 = 1 mod q. + uint64_t h, lo, hi, quo, rem; + + // NOTE: 0xFC0FC0FC0FC0FC1 = 65^(-1) % 2^64 + h = (uint64_t)x << 8; + inner_gf65376_umul(lo, hi, h, 0xFC0FC0FC0FC0FC1); + (void)lo; + quo = hi >> 2; + rem = h - (65 * quo); + + d->v0 = quo; + d->v1 = 0; + d->v2 = 0; + d->v3 = 0; + d->v4 = 0; + d->v5 = rem << 56; + } + + // Inner function: d <- a/2^384, with normalization to [0..q-1]. + static inline void + inner_gf65376_montgomery_reduce(gf65376 *d, const gf65376 *a) + { + uint64_t x0, x1, x2, x3, x4, x5, f0, f1, f2, f3, f4, f5; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11; + uint64_t d0, d1, d2, d3, d4, d5; + uint64_t hi, t, w; + unsigned char cc; + + // Let m = -1/q mod 2^384 = 65*2^376 + 1 + // For input x, we compute f = x*m mod 2^384, then + // h = x + f*q, which is a multiple of 2^384. The output + // is then h/2^384. + // Since x < 2^384, we have: + // h <= 2^384 - 1 + (2^384 - 1)*q + // h <= q*2^384 + 2^384 - q - 1 + // Since h = 0 mod 2^384, this implies that h <= q*2^384. + // The output h/2^384 is therefore between 0 and q (inclusive). + + x0 = a->v0; + x1 = a->v1; + x2 = a->v2; + x3 = a->v3; + x4 = a->v4; + x5 = a->v5; + + // f = x*(-1/q) mod 2^384 + f0 = x0; + f1 = x1; + f2 = x2; + f3 = x3; + f4 = x4; + f5 = x5 + ((x0 * 65) << 56); + + // g = f*q + inner_gf65376_umul(g5, hi, f0, (uint64_t)65 << 56); + inner_gf65376_umul_add(g6, hi, f1, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g7, hi, f2, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g8, hi, f3, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g9, hi, f4, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g10, g11, f5, (uint64_t)65 << 56, hi); + + cc = inner_gf65376_sbb(0, 0, f0, &g0); + cc = inner_gf65376_sbb(cc, 0, f1, &g1); + cc = inner_gf65376_sbb(cc, 0, f2, &g2); + cc = inner_gf65376_sbb(cc, 0, f3, &g3); + cc = inner_gf65376_sbb(cc, 0, f4, &g4); + cc = inner_gf65376_sbb(cc, g5, f5, &g5); + cc = inner_gf65376_sbb(cc, g6, 0, &g6); + cc = inner_gf65376_sbb(cc, g7, 0, &g7); + cc = inner_gf65376_sbb(cc, g8, 0, &g8); + cc = inner_gf65376_sbb(cc, g9, 0, &g9); + cc = inner_gf65376_sbb(cc, g10, 0, &g10); + (void)inner_gf65376_sbb(cc, g11, 0, &g11); + + // h = x + f*q (we drop the low 384 bits). + cc = inner_gf65376_adc(0, g0, x0, &x0); + cc = inner_gf65376_adc(cc, g1, x1, &x1); + cc = inner_gf65376_adc(cc, g2, x2, &x2); + cc = inner_gf65376_adc(cc, g3, x3, &x3); + cc = inner_gf65376_adc(cc, g4, x4, &x4); + cc = inner_gf65376_adc(cc, g5, x5, &x5); + cc = inner_gf65376_adc(cc, g6, 0, &d0); + cc = inner_gf65376_adc(cc, g7, 0, &d1); + cc = inner_gf65376_adc(cc, g8, 0, &d2); + cc = inner_gf65376_adc(cc, g9, 0, &d3); + cc = inner_gf65376_adc(cc, g10, 0, &d4); + (void)inner_gf65376_adc(cc, g11, 0, &d5); + + // Normalize: if h = q, replace it with zero. + t = d0 & d1 & d2 & d3 & d4 & (d5 ^ ~(uint64_t)0x40FFFFFFFFFFFFFF); + cc = inner_gf65376_adc(0, t, 1, &t); + (void)inner_gf65376_sbb(cc, 0, 0, &w); + w = ~w; + d->v0 = d0 & w; + d->v1 = d1 & w; + d->v2 = d2 & w; + d->v3 = d3 & w; + d->v4 = d4 & w; + d->v5 = d5 & w; + } + + /* + * d <- a*b + */ + static inline void + gf65376_mul(gf65376 *d, const gf65376 *a, const gf65376 *b) + { + uint64_t e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11; + uint64_t f0, f1, f2, f3, f4, f5, lo, hi, lo2, hi2; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11; + unsigned char cc; + + // Multiplication over integers. + // 6 mul + inner_gf65376_umul(e0, e1, a->v0, b->v0); + inner_gf65376_umul(e2, e3, a->v1, b->v1); + inner_gf65376_umul(e4, e5, a->v2, b->v2); + inner_gf65376_umul(e6, e7, a->v3, b->v3); + inner_gf65376_umul(e8, e9, a->v4, b->v4); + inner_gf65376_umul(e10, e11, a->v5, b->v5); + + // + 5 mul = 11 + inner_gf65376_umul(lo, hi, a->v0, b->v1); + cc = inner_gf65376_adc(0, e1, lo, &e1); + cc = inner_gf65376_adc(cc, e2, hi, &e2); + inner_gf65376_umul(lo, hi, a->v0, b->v3); + cc = inner_gf65376_adc(cc, e3, lo, &e3); + cc = inner_gf65376_adc(cc, e4, hi, &e4); + inner_gf65376_umul(lo, hi, a->v0, b->v5); + cc = inner_gf65376_adc(cc, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + inner_gf65376_umul(lo, hi, a->v2, b->v5); + cc = inner_gf65376_adc(cc, e7, lo, &e7); + cc = inner_gf65376_adc(cc, e8, hi, &e8); + inner_gf65376_umul(lo, hi, a->v4, b->v5); + cc = inner_gf65376_adc(cc, e9, lo, &e9); + cc = inner_gf65376_adc(cc, e10, hi, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 5 mul = 16 + inner_gf65376_umul(lo, hi, a->v1, b->v0); + cc = inner_gf65376_adc(0, e1, lo, &e1); + cc = inner_gf65376_adc(cc, e2, hi, &e2); + inner_gf65376_umul(lo, hi, a->v3, b->v0); + cc = inner_gf65376_adc(cc, e3, lo, &e3); + cc = inner_gf65376_adc(cc, e4, hi, &e4); + inner_gf65376_umul(lo, hi, a->v5, b->v0); + cc = inner_gf65376_adc(cc, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + inner_gf65376_umul(lo, hi, a->v5, b->v2); + cc = inner_gf65376_adc(cc, e7, lo, &e7); + cc = inner_gf65376_adc(cc, e8, hi, &e8); + inner_gf65376_umul(lo, hi, a->v5, b->v4); + cc = inner_gf65376_adc(cc, e9, lo, &e9); + cc = inner_gf65376_adc(cc, e10, hi, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 4 mul = 20 + inner_gf65376_umul(lo, hi, a->v0, b->v2); + cc = inner_gf65376_adc(0, e2, lo, &e2); + cc = inner_gf65376_adc(cc, e3, hi, &e3); + inner_gf65376_umul(lo, hi, a->v0, b->v4); + cc = inner_gf65376_adc(cc, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v2, b->v4); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + inner_gf65376_umul(lo, hi, a->v3, b->v5); + cc = inner_gf65376_adc(cc, e8, lo, &e8); + cc = inner_gf65376_adc(cc, e9, hi, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 4 mul = 24 + inner_gf65376_umul(lo, hi, a->v2, b->v0); + cc = inner_gf65376_adc(0, e2, lo, &e2); + cc = inner_gf65376_adc(cc, e3, hi, &e3); + inner_gf65376_umul(lo, hi, a->v4, b->v0); + cc = inner_gf65376_adc(cc, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v4, b->v2); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + inner_gf65376_umul(lo, hi, a->v5, b->v3); + cc = inner_gf65376_adc(cc, e8, lo, &e8); + cc = inner_gf65376_adc(cc, e9, hi, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 3 mul = 27 + inner_gf65376_umul(lo, hi, a->v1, b->v2); + cc = inner_gf65376_adc(cc, e3, lo, &e3); + cc = inner_gf65376_adc(cc, e4, hi, &e4); + inner_gf65376_umul(lo, hi, a->v1, b->v4); + cc = inner_gf65376_adc(cc, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + inner_gf65376_umul(lo, hi, a->v3, b->v4); + cc = inner_gf65376_adc(cc, e7, lo, &e7); + cc = inner_gf65376_adc(cc, e8, hi, &e8); + cc = inner_gf65376_adc(cc, e9, 0, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 3 mul = 30 + inner_gf65376_umul(lo, hi, a->v2, b->v1); + cc = inner_gf65376_adc(cc, e3, lo, &e3); + cc = inner_gf65376_adc(cc, e4, hi, &e4); + inner_gf65376_umul(lo, hi, a->v4, b->v1); + cc = inner_gf65376_adc(cc, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + inner_gf65376_umul(lo, hi, a->v4, b->v3); + cc = inner_gf65376_adc(cc, e7, lo, &e7); + cc = inner_gf65376_adc(cc, e8, hi, &e8); + cc = inner_gf65376_adc(cc, e9, 0, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 2 mul = 32 + inner_gf65376_umul(lo, hi, a->v1, b->v3); + cc = inner_gf65376_adc(cc, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v1, b->v5); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + cc = inner_gf65376_adc(cc, e8, 0, &e8); + cc = inner_gf65376_adc(cc, e9, 0, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 2 mul = 34 + inner_gf65376_umul(lo, hi, a->v3, b->v1); + cc = inner_gf65376_adc(cc, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v5, b->v1); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + cc = inner_gf65376_adc(cc, e8, 0, &e8); + cc = inner_gf65376_adc(cc, e9, 0, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // + 2 mul = 36 + inner_gf65376_umul(lo, hi, a->v2, b->v3); + inner_gf65376_umul(lo2, hi2, a->v3, b->v2); + cc = inner_gf65376_adc(0, lo, lo2, &lo); + cc = inner_gf65376_adc(cc, hi, hi2, &hi); + cc = inner_gf65376_adc(cc, 0, 0, &hi2); + assert(cc == 0); + cc = inner_gf65376_adc(0, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + cc = inner_gf65376_adc(cc, e7, hi2, &e7); + cc = inner_gf65376_adc(cc, e8, 0, &e8); + cc = inner_gf65376_adc(cc, e9, 0, &e9); + cc = inner_gf65376_adc(cc, e10, 0, &e10); + cc = inner_gf65376_adc(cc, e11, 0, &e11); + assert(cc == 0); + + // Montgomery reduction. + // + // Low part is lo(e) = e0..e5 (384 bits). + // Let m = -1/q mod 2^384; we add (lo(e)*m mod 2^384)*q to the + // high part g = e6..e11 (766 bits). + // + // We have m = 65*2^376 + 1. + f0 = e0; + f1 = e1; + f2 = e2; + f3 = e3; + f4 = e4; + f5 = e5 + ((e0 * 65) << 56); + + // g = f*q + inner_gf65376_umul(g5, hi, f0, (uint64_t)65 << 56); + inner_gf65376_umul_add(g6, hi, f1, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g7, hi, f2, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g8, hi, f3, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g9, hi, f4, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g10, g11, f5, (uint64_t)65 << 56, hi); + + cc = inner_gf65376_sbb(0, 0, f0, &g0); + cc = inner_gf65376_sbb(cc, 0, f1, &g1); + cc = inner_gf65376_sbb(cc, 0, f2, &g2); + cc = inner_gf65376_sbb(cc, 0, f3, &g3); + cc = inner_gf65376_sbb(cc, 0, f4, &g4); + cc = inner_gf65376_sbb(cc, g5, f5, &g5); + cc = inner_gf65376_sbb(cc, g6, 0, &g6); + cc = inner_gf65376_sbb(cc, g7, 0, &g7); + cc = inner_gf65376_sbb(cc, g8, 0, &g8); + cc = inner_gf65376_sbb(cc, g9, 0, &g9); + cc = inner_gf65376_sbb(cc, g10, 0, &g10); + cc = inner_gf65376_sbb(cc, g11, 0, &g11); + assert(cc == 0); + + // Add g = f*q to e0..e11. + // Since e0..e11 < 2^766 and f < 2^384, we know that the result + // is less than 2^766 + 2^384*65*2^376, which is less than 2^768. + // This is also a multiple of 2^256. We divide by 2^256 by simply + // dropping the low 256 bits (which are all equal to zero), and + // the result is less than 2**384 + cc = inner_gf65376_adc(0, g0, e0, &e0); + cc = inner_gf65376_adc(cc, g1, e1, &e1); + cc = inner_gf65376_adc(cc, g2, e2, &e2); + cc = inner_gf65376_adc(cc, g3, e3, &e3); + cc = inner_gf65376_adc(cc, g4, e4, &e4); + cc = inner_gf65376_adc(cc, g5, e5, &e5); + cc = inner_gf65376_adc(cc, g6, e6, &e6); + cc = inner_gf65376_adc(cc, g7, e7, &e7); + cc = inner_gf65376_adc(cc, g8, e8, &e8); + cc = inner_gf65376_adc(cc, g9, e9, &e9); + cc = inner_gf65376_adc(cc, g10, e10, &e10); + cc = inner_gf65376_adc(cc, g11, e11, &e11); + assert(cc == 0); + + // To ensure the result is in the allowable range, we still need to + // do a final reduction to ensure the value is smaller than 2^383 + inner_gf65376_partial_reduce(d, e6, e7, e8, e9, e10, e11); + } + + /* + * d <- a^2 + */ + static inline void + gf65376_square(gf65376 *d, const gf65376 *a) + { + uint64_t e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11; + uint64_t f0, f1, f2, f3, f4, f5, lo, hi; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11; + unsigned char cc; + + // Squaring over integers. + // 5 mul + inner_gf65376_umul(e1, e2, a->v0, a->v1); + inner_gf65376_umul(e3, e4, a->v0, a->v3); + inner_gf65376_umul(e5, e6, a->v0, a->v5); + inner_gf65376_umul(e7, e8, a->v2, a->v5); + inner_gf65376_umul(e9, e10, a->v4, a->v5); + + inner_gf65376_umul(lo, hi, a->v0, a->v2); + cc = inner_gf65376_adc(0, e2, lo, &e2); + cc = inner_gf65376_adc(cc, e3, hi, &e3); + inner_gf65376_umul(lo, hi, a->v0, a->v4); + cc = inner_gf65376_adc(cc, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v1, a->v5); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + inner_gf65376_umul(lo, hi, a->v3, a->v5); + cc = inner_gf65376_adc(cc, e8, lo, &e8); + cc = inner_gf65376_adc(cc, e9, hi, &e9); + (void)inner_gf65376_adc(cc, e10, 0, &e10); + + inner_gf65376_umul(lo, hi, a->v1, a->v2); + cc = inner_gf65376_adc(0, e3, lo, &e3); + cc = inner_gf65376_adc(cc, e4, hi, &e4); + inner_gf65376_umul(lo, hi, a->v1, a->v4); + cc = inner_gf65376_adc(cc, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + inner_gf65376_umul(lo, hi, a->v3, a->v4); + cc = inner_gf65376_adc(cc, e7, lo, &e7); + cc = inner_gf65376_adc(cc, e8, hi, &e8); + (void)inner_gf65376_adc(cc, e9, 0, &e9); + + inner_gf65376_umul(lo, hi, a->v1, a->v3); + cc = inner_gf65376_adc(0, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v2, a->v4); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + (void)inner_gf65376_adc(cc, e8, 0, &e8); + + inner_gf65376_umul(lo, hi, a->v2, a->v3); + cc = inner_gf65376_adc(0, e5, lo, &e5); + cc = inner_gf65376_adc(cc, e6, hi, &e6); + (void)inner_gf65376_adc(cc, e7, 0, &e7); + + e11 = e10 >> 63; + e10 = (e10 << 1) | (e9 >> 63); + e9 = (e9 << 1) | (e8 >> 63); + e8 = (e8 << 1) | (e7 >> 63); + e7 = (e7 << 1) | (e6 >> 63); + e6 = (e6 << 1) | (e5 >> 63); + e5 = (e5 << 1) | (e4 >> 63); + e4 = (e4 << 1) | (e3 >> 63); + e3 = (e3 << 1) | (e2 >> 63); + e2 = (e2 << 1) | (e1 >> 63); + e1 = e1 << 1; + + inner_gf65376_umul(e0, hi, a->v0, a->v0); + cc = inner_gf65376_adc(0, e1, hi, &e1); + inner_gf65376_umul(lo, hi, a->v1, a->v1); + cc = inner_gf65376_adc(cc, e2, lo, &e2); + cc = inner_gf65376_adc(cc, e3, hi, &e3); + inner_gf65376_umul(lo, hi, a->v2, a->v2); + cc = inner_gf65376_adc(cc, e4, lo, &e4); + cc = inner_gf65376_adc(cc, e5, hi, &e5); + inner_gf65376_umul(lo, hi, a->v3, a->v3); + cc = inner_gf65376_adc(cc, e6, lo, &e6); + cc = inner_gf65376_adc(cc, e7, hi, &e7); + inner_gf65376_umul(lo, hi, a->v4, a->v4); + cc = inner_gf65376_adc(cc, e8, lo, &e8); + cc = inner_gf65376_adc(cc, e9, hi, &e9); + inner_gf65376_umul(lo, hi, a->v5, a->v5); + cc = inner_gf65376_adc(cc, e10, lo, &e10); + (void)inner_gf65376_adc(cc, e11, hi, &e11); + + // Montgomery reduction. + // + // Low part is lo(e) = e0..e5 (384 bits). + // Let m = -1/q mod 2^384; we add (lo(e)*m mod 2^384)*q to the + // high part g = e6..e11 (766 bits). + // + // We have m = 65*2^376 + 1. + f0 = e0; + f1 = e1; + f2 = e2; + f3 = e3; + f4 = e4; + f5 = e5 + ((e0 * 65) << 56); + + // g = f*q + inner_gf65376_umul(g5, hi, f0, (uint64_t)65 << 56); + inner_gf65376_umul_add(g6, hi, f1, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g7, hi, f2, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g8, hi, f3, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g9, hi, f4, (uint64_t)65 << 56, hi); + inner_gf65376_umul_add(g10, g11, f5, (uint64_t)65 << 56, hi); + + cc = inner_gf65376_sbb(0, 0, f0, &g0); + cc = inner_gf65376_sbb(cc, 0, f1, &g1); + cc = inner_gf65376_sbb(cc, 0, f2, &g2); + cc = inner_gf65376_sbb(cc, 0, f3, &g3); + cc = inner_gf65376_sbb(cc, 0, f4, &g4); + cc = inner_gf65376_sbb(cc, g5, f5, &g5); + cc = inner_gf65376_sbb(cc, g6, 0, &g6); + cc = inner_gf65376_sbb(cc, g7, 0, &g7); + cc = inner_gf65376_sbb(cc, g8, 0, &g8); + cc = inner_gf65376_sbb(cc, g9, 0, &g9); + cc = inner_gf65376_sbb(cc, g10, 0, &g10); + cc = inner_gf65376_sbb(cc, g11, 0, &g11); + assert(cc == 0); + + // Add g = f*q to e0..e11. + // Since e0..e11 < 2^766 and f < 2^384, we know that the result + // is less than 2^766 + 2^384*65*2^376, which is less than 2^768. + // This is also a multiple of 2^256. We divide by 2^256 by simply + // dropping the low 256 bits (which are all equal to zero), and + // the result is less than 2**384 + cc = inner_gf65376_adc(0, g0, e0, &e0); + cc = inner_gf65376_adc(cc, g1, e1, &e1); + cc = inner_gf65376_adc(cc, g2, e2, &e2); + cc = inner_gf65376_adc(cc, g3, e3, &e3); + cc = inner_gf65376_adc(cc, g4, e4, &e4); + cc = inner_gf65376_adc(cc, g5, e5, &e5); + cc = inner_gf65376_adc(cc, g6, e6, &e6); + cc = inner_gf65376_adc(cc, g7, e7, &e7); + cc = inner_gf65376_adc(cc, g8, e8, &e8); + cc = inner_gf65376_adc(cc, g9, e9, &e9); + cc = inner_gf65376_adc(cc, g10, e10, &e10); + cc = inner_gf65376_adc(cc, g11, e11, &e11); + assert(cc == 0); + + // To ensure the result is in the allowable range, we still need to + // do a final reduction to ensure the value is smaller than 2^383 + inner_gf65376_partial_reduce(d, e6, e7, e8, e9, e10, e11); + } + + /* + * d <- a^(2^n) + * This computes n successive squarings of value a, with result in d. + * n == 0 is a valid input (in that case, *a is copied into *d). + * This function is not constant-time with regard to n: the number of + * successive squarings may be observable through timing-based side channels. + */ + static inline void + gf65376_xsquare(gf65376 *d, const gf65376 *a, unsigned n) + { + if (n == 0) { + *d = *a; + return; + } + gf65376_square(d, a); + while (n-- > 1) { + gf65376_square(d, d); + } + } + + /* + * Returns 0xFFFFFFFF if *a is zero; otherwise, 0x00000000 is returned. + */ + static inline uint32_t + gf65376_iszero(const gf65376 *a) + { + uint64_t a0, a1, a2, a3, a4, a5, t0, t1, r; + + // Zero can be represented by 0 or by q. + a0 = a->v0; + a1 = a->v1; + a2 = a->v2; + a3 = a->v3; + a4 = a->v4; + a5 = a->v5; + t0 = a0 | a1 | a2 | a3 | a4 | a5; + t1 = ~a0 | ~a1 | ~a2 | ~a3 | ~a4 | (a5 ^ 0x40FFFFFFFFFFFFFF); + + // Top bit of r is 0 if and only if one of t0 or t1 is zero. + r = (t0 | -t0) & (t1 | -t1); + return (uint32_t)(r >> 63) - 1; + } + + /* + * Returns 0xFFFFFFFF if *a and *b represent the same field element; + * otherwise, 0x00000000 is returned. + */ + static inline uint32_t + gf65376_equals(const gf65376 *a, const gf65376 *b) + { + gf65376 d; + gf65376_sub(&d, a, b); + return gf65376_iszero(&d); + } + + /* + * d <- 1/a + * If *a is not zero, then the inverse is well-defined and written into *d, + * and the function returns 0xFFFFFFFF. If *a is zero, then this function + * sets *d to zero and returns 0x00000000. + */ + uint32_t gf65376_invert(gf65376 *d, const gf65376 *a); + + /* + * d <- a/b + * If *b is not zero, then this functions writes a/b into *d, and returns + * 0xFFFFFFFF. If *b is zero, then this function sets *d to zero (regardless + * of the value of *a) and returns 0x00000000. + */ + uint32_t gf65376_div(gf65376 *d, const gf65376 *a, const gf65376 *b); + + /* + * d <- a/3 + * Divides by 3 in the field by implementing the algorithm proposed in + * "Efficient Multiplication in Finite Field Extensions of Degree 5" + * by El Mrabet, Guillevic and Ionica at ASIACRYPT 2011. + */ + void gf65376_div3(gf65376 *out, const gf65376 *a); + + /* + * Get the Legendre symbol of *a (0 for zero, +1 for a non-zero square, + * -1 for a non-square). + */ + int32_t gf65376_legendre(const gf65376 *a); + + /* + * If *a is a square, then this function sets *d to a square root of a, + * and returns 0xFFFFFFFF. If *a is not a square, then this function + * sets *d to a square root of -a, and returns 0x00000000. + * In all cases, the value written into *d is such that the least significant + * bit of its integer representation (in [0..q-1]) is zero. + */ + uint32_t gf65376_sqrt(gf65376 *d, const gf65376 *a); + + /* + * Encode field element *a into buffer dst (exactly 32 bytes are written). + */ + void gf65376_encode(void *dst, const gf65376 *a); + + /* + * Decode source buffer src (exactly 32 bytes) into a field element *d. + * If the source value is not a valid canonical encoding, then *d is zero + * and the function returns 0x00000000; otherwise, the function returns + * 0xFFFFFFFF. + */ + uint32_t gf65376_decode(gf65376 *d, const void *src); + + /* + * Interpret the source buffer (of size len bytes) as an unsigned integer + * (little-endian convention) and reduce it modulo q, yielding a field + * element which is written into *d. Since reduction is applied, this + * function cannot fail. + */ + void gf65376_decode_reduce(gf65376 *d, const void *src, size_t len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/gf/broadwell/lvl3/test/CMakeLists.txt b/src/gf/broadwell/lvl3/test/CMakeLists.txt new file mode 100644 index 0000000..316e0a8 --- /dev/null +++ b/src/gf/broadwell/lvl3/test/CMakeLists.txt @@ -0,0 +1 @@ +include(../../lvlx_test.cmake) diff --git a/src/gf/broadwell/lvl5/CMakeLists.txt b/src/gf/broadwell/lvl5/CMakeLists.txt new file mode 100644 index 0000000..b114fa0 --- /dev/null +++ b/src/gf/broadwell/lvl5/CMakeLists.txt @@ -0,0 +1,6 @@ +set(SOURCE_FILES_GF_SPECIFIC + gf27500.c + fp_asm.S +) + +include(../lvlx.cmake) diff --git a/src/gf/broadwell/lvl5/fp.c b/src/gf/broadwell/lvl5/fp.c new file mode 100644 index 0000000..37b7c87 --- /dev/null +++ b/src/gf/broadwell/lvl5/fp.c @@ -0,0 +1,112 @@ +#include +#include "fp.h" + +const digit_t p[NWORDS_FIELD] = { 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x01afffffffffffff }; +const digit_t p2[NWORDS_FIELD] = { 0xfffffffffffffffe, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x035fffffffffffff }; + +void +fp_sqrt(fp_t *x) +{ + fp_t tmp = *x; + (void)gf27500_sqrt(x, &tmp); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + // ls is (0, 1, -1) and we want fp_is_square + // to return 0xFF..FF when ls is 1 or 0 and 0x00..00 otherwise + int32_t ls = gf27500_legendre(a); + return ~(uint32_t)(ls >> 1); +} + +void +fp_inv(fp_t *x) +{ + fp_t tmp = *x; + (void)gf27500_invert(x, &tmp); +} + +void +fp_exp3div4(fp_t *a) +{ + // + // We optimise this by using the shape of the prime + // to avoid almost all multiplications: + // + // We write: + // (p - 3) / 4 = (27*2^500 - 4) / 4 + // = 27*2^498 - 1 + // = 27*(2^498 - 1) + 26 + // Then we first compute: + // a498 = a**(2^498 - 1) + // Then from this we get the desired result as: + // a**((p-3)/4) = a498**27 * a**26 + // We can compute this with 15 multiplications and 504 squares. + fp_t z26, t3, t6, t9, tmp; + // Compute a**3 and a**26 + fp_sqr(&z26, a); + fp_mul(&tmp, a, &z26); + fp_sqr(&z26, &z26); + // Compute a**(2^3 - 1) = a**7 + fp_mul(&t3, &tmp, &z26); + fp_sqr(&z26, &tmp); + fp_sqr(&z26, &z26); + fp_mul(&z26, &z26, a); + fp_sqr(&z26, &z26); + // Compute a**(2^6 - 1) + fp_sqr(&t6, &t3); + for (int i = 1; i < 3; i++) + fp_sqr(&t6, &t6); + fp_mul(&t6, &t6, &t3); + // Compute a**(2^9 - 1) + fp_sqr(&t9, &t6); + for (int i = 1; i < 3; i++) + fp_sqr(&t9, &t9); + fp_mul(&t9, &t9, &t3); + // Compute a**(2^15 - 1) + fp_sqr(a, &t9); + for (int i = 1; i < 6; i++) + fp_sqr(a, a); + fp_mul(a, a, &t6); + // Compute a**(2^30 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 15; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^60 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 30; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^120 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 60; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^240 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 120; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(2^249 - 1) + for (int i = 0; i < 9; i++) + fp_sqr(a, a); + fp_mul(a, a, &t9); + // Compute a**(2^498 - 1) + fp_sqr(&tmp, a); + for (int i = 1; i < 249; i++) + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + // Compute a**(27*(2^498 - 1)) + fp_sqr(&tmp, a); + fp_sqr(&tmp, &tmp); + fp_sqr(&tmp, &tmp); + fp_mul(a, a, &tmp); + fp_sqr(&tmp, a); + fp_mul(a, a, &tmp); + // Compute a**(27*(2^498 - 1) + 26) + fp_mul(a, a, &z26); +} diff --git a/src/gf/broadwell/lvl5/fp_asm.S b/src/gf/broadwell/lvl5/fp_asm.S new file mode 100755 index 0000000..3e73903 --- /dev/null +++ b/src/gf/broadwell/lvl5/fp_asm.S @@ -0,0 +1,784 @@ +#include +.intel_syntax noprefix + +.set pbytes,32 +.set plimbs,4 + +#ifdef __APPLE__ +.section __TEXT,__const +#else +.section .rodata +#endif +p_plus_1: .quad 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x01B0000000000000 + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",@progbits +#endif + +#include + +.text +.p2align 4,,15 + +.global fp_add +fp_add: + push r12 + push r13 + push r14 + push r15 + xor rax, rax + mov r8, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + mov r14, [rsi+48] + mov r15, [rsi+56] + add r8, [rdx] + adc r9, [rdx+8] + adc r10, [rdx+16] + adc r11, [rdx+24] + adc r12, [rdx+32] + adc r13, [rdx+40] + adc r14, [rdx+48] + adc r15, [rdx+56] + mov rax, r15 + shr rax, 57 + neg rax + mov rdx, [rip+p+56] + and rdx, rax + sub r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rax + sbb r13, rax + sbb r14, rax + sbb r15, rdx + + mov rax, r15 + shr rax, 57 + neg rax + mov rdx, [rip+p+56] + and rdx, rax + sub r8, rax + sbb r9, rax + sbb r10, rax + sbb r11, rax + sbb r12, rax + sbb r13, rax + sbb r14, rax + sbb r15, rdx + mov [rdi], r8 + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + mov [rdi+48], r14 + mov [rdi+56], r15 + pop r15 + pop r14 + pop r13 + pop r12 + ret + +.global fp_sub +fp_sub: + push r12 + push r13 + push r14 + push r15 + xor rax, rax + mov r8, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + mov r14, [rsi+48] + mov r15, [rsi+56] + sub r8, [rdx] + sbb r9, [rdx+8] + sbb r10, [rdx+16] + sbb r11, [rdx+24] + sbb r12, [rdx+32] + sbb r13, [rdx+40] + sbb r14, [rdx+48] + sbb r15, [rdx+56] + sbb rax, 0 + + mov rdx, [rip+p+56] + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rdx + + mov rax, r15 + sar rax, 57 + mov rdx, [rip+p+56] + and rdx, rax + add r8, rax + adc r9, rax + adc r10, rax + adc r11, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rdx + + mov [rdi], r8 + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + mov [rdi+48], r14 + mov [rdi+56], r15 + pop r15 + pop r14 + pop r13 + pop r12 + ret + +///////////////////////////////////////////////////////////////// MACRO +// z = a x bi + z +// Inputs: base memory pointer M1 (a), +// bi pre-stored in rdx, +// accumulator z in [Z0:Z8] +// Output: [Z0:Z8] +// Temps: regs T0:T1 +///////////////////////////////////////////////////////////////// +.macro MULADD64x512 M1, Z0, Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8, T0, T1, C + xor \C, \C + mulx \T0, \T1, \M1 // A0*B0 + adox \Z0, \T1 + adox \Z1, \T0 + mulx \T0, \T1, 8\M1 // A0*B1 + adcx \Z1, \T1 + adox \Z2, \T0 + mulx \T0, \T1, 16\M1 // A0*B2 + adcx \Z2, \T1 + adox \Z3, \T0 + mulx \T0, \T1, 24\M1 // A0*B3 + adcx \Z3, \T1 + adox \Z4, \T0 + mulx \T0, \T1, 32\M1 // A0*B4 + adcx \Z4, \T1 + adox \Z5, \T0 + mulx \T0, \T1, 40\M1 // A0*B5 + adcx \Z5, \T1 + adox \Z6, \T0 + mulx \T0, \T1, 48\M1 // A0*B6 + adcx \Z6, \T1 + adox \Z7, \T0 + mulx \T0, \T1, 56\M1 // A0*B7 + adcx \Z7, \T1 + adox \Z8, \T0 + adc \Z8, 0 +.endm + +.macro MULADD64x64 M1, Z0, Z1, Z2, Z3, Z4, Z5, Z6, Z7, T0, T1 + xor \T0, \T0 + mulx \T0, \T1, \M1 // A0*B0 + adox \Z6, \T1 + adox \Z7, \T0 +.endm + +//*********************************************************************** +// Multiplication in GF(p^2), non-complex part +// Operation: c [rdi] = a0 x b0 - a1 x b1 +// Inputs: a = [a1, a0] stored in [rsi] +// b = [b1, b0] stored in [rdx] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_mul_c0 +fp2_mul_c0: + push r12 + push r13 + push r14 + push r15 + push rbx + push rbp + mov rcx, rdx + + // [rdi0:7] <- 2p - b1 + mov r8, [rip+p2] + mov r9, [rip+p2+8] + mov r10, r9 + mov r11, r9 + mov r12, r9 + mov r13, r9 + mov r14, r9 + mov r15, [rip+p2+56] + mov rax, [rcx+64] + mov rdx, [rcx+72] + sub r8, rax + sbb r9, rdx + mov rax, [rcx+80] + mov rdx, [rcx+88] + sbb r10, rax + sbb r11, rdx + mov rax, [rcx+96] + mov rdx, [rcx+104] + sbb r12, rax + sbb r13, rdx + mov rax, [rcx+112] + mov rdx, [rcx+120] + sbb r14, rax + sbb r15, rdx + mov [rdi], r8 + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + mov [rdi+48], r14 + mov [rdi+56], r15 + + // [r8:r15, rax] <- z = a0 x b00 - a1 x b10 + mov rdx, [rcx] + mulx r9, r8, [rsi] + xor rax, rax + mulx r10, r11, [rsi+8] + adcx r9, r11 + mulx r11, r12, [rsi+16] + adcx r10, r12 + mulx r12, r13, [rsi+24] + adcx r11, r13 + mulx r13, r14, [rsi+32] + adcx r12, r14 + mulx r14, r15, [rsi+40] + adcx r13, r15 + mulx r15, rbp, [rsi+48] + adcx r14, rbp + mulx rax, rbx, [rsi+56] + adcx r15, rbx + adc rax, 0 + + mov rdx, [rdi] + MULADD64x512 [rsi+64], r8, r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp, rbx + // [r9:r14] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r8 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp + + // [r9:r15, rax, r8] <- z = a0 x b01 - a1 x b11 + z + mov rdx, [rcx+8] + MULADD64x512 [rsi], r9, r10, r11, r12, r13, r14, r15, rax, r8, rbx, rbp, r8 + mov rdx, [rdi+8] + MULADD64x512 [rsi+64], r9, r10, r11, r12, r13, r14, r15, rax, r8, rbx, rbp, rbx + // [r10:r15, rax, r8] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r9 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r10, r11, r12, r13, r14, r15, rax, r8, rbx, rbp + + // [r10:r15, rax, r8:r9] <- z = a0 x b02 - a1 x b12 + z + mov rdx, [rcx+16] + MULADD64x512 [rsi], r10, r11, r12, r13, r14, r15, rax, r8, r9, rbx, rbp, r9 + mov rdx, [rdi+16] + MULADD64x512 [rsi+64], r10, r11, r12, r13, r14, r15, rax, r8, r9, rbx, rbp, rbx + // [r11:r15, rax, r8:r9] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r10 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r11, r12, r13, r14, r15, rax, r8, r9, rbx, rbp + + // [r11:r15, rax, r8:r10] <- z = a0 x b03 - a1 x b13 + z + mov rdx, [rcx+24] + MULADD64x512 [rsi], r11, r12, r13, r14, r15, rax, r8, r9, r10, rbx, rbp, r10 + mov rdx, [rdi+24] + MULADD64x512 [rsi+64], r11, r12, r13, r14, r15, rax, r8, r9, r10, rbx, rbp, rbx + // [r12:r15, rax, r8:r10] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r11 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r12, r13, r14, r15, rax, r8, r9, r10, rbx, rbp + + // [r12:r15, rax, r8:r11] <- z = a0 x b04 - a1 x b14 + z + mov rdx, [rcx+32] + MULADD64x512 [rsi], r12, r13, r14, r15, rax, r8, r9, r10, r11, rbx, rbp, r11 + mov rdx, [rdi+32] + MULADD64x512 [rsi+64], r12, r13, r14, r15, rax, r8, r9, r10, r11, rbx, rbp, rbx + // [r13:r15, rax, r8:r11] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r12 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r13, r14, r15, rax, r8, r9, r10, r11, rbx, rbp + + // [r13:r15, rax, r8:r12] <- z = a0 x b05 - a1 x b15 + z + mov rdx, [rcx+40] + MULADD64x512 [rsi], r13, r14, r15, rax, r8, r9, r10, r11, r12, rbx, rbp, r12 + mov rdx, [rdi+40] + MULADD64x512 [rsi+64], r13, r14, r15, rax, r8, r9, r10, r11, r12, rbx, rbp, rbx + // [r14:r15, rax, r8:r12] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r13 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r14, r15, rax, r8, r9, r10, r11, r12, rbx, rbp + + // [r14:r15, rax, r8:r12] <- z = a0 x b06 - a1 x b16 + z + mov rdx, [rcx+48] + MULADD64x512 [rsi], r14, r15, rax, r8, r9, r10, r11, r12, r13, rbx, rbp, r13 + mov rdx, [rdi+48] + MULADD64x512 [rsi+64], r14, r15, rax, r8, r9, r10, r11, r12, r13, rbx, rbp, rbx + // [r15, rax, r8:r13] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r14 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r15, rax, r8, r9, r10, r11, r12, r13, rbx, rbp + + // [r15, rax, r8:r12] <- z = a0 x b06 - a1 x b16 + z + mov rdx, [rcx+56] + MULADD64x512 [rsi], r15, rax, r8, r9, r10, r11, r12, r13, r14, rbx, rbp, r14 + mov rdx, [rdi+56] + MULADD64x512 [rsi+64], r15, rax, r8, r9, r10, r11, r12, r13, r14, rbx, rbp, rbx + // [rax, r8:r14] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r15 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], rax, r8, r9, r10, r11, r12, r13, r14, rbx, rbp + + mov [rdi], rax + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + mov [rdi+48], r13 + mov [rdi+56], r14 + pop rbp + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +//*********************************************************************** +// Multiplication in GF(p^2), complex part +// Operation: c [rdi] = a0 x b1 + a1 x b0 +// Inputs: a = [a1, a0] stored in [rsi] +// b = [b1, b0] stored in [rdx] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_mul_c1 +fp2_mul_c1: + push r12 + push r13 + push r14 + push r15 + push rbx + push rbp + mov rcx, rdx + + // [r8:r15, rax] <- z = a0 x b10 + a1 x b00 + mov rdx, [rcx+64] + mulx r9, r8, [rsi] + xor rax, rax + mulx r10, r11, [rsi+8] + adcx r9, r11 + mulx r11, r12, [rsi+16] + adcx r10, r12 + mulx r12, r13, [rsi+24] + adcx r11, r13 + mulx r13, r14, [rsi+32] + adcx r12, r14 + mulx r14, r15, [rsi+40] + adcx r13, r15 + mulx r15, rbp, [rsi+48] + adcx r14, rbp + mulx rax, rbx, [rsi+56] + adcx r15, rbx + adc rax, 0 + + mov rdx, [rcx] + MULADD64x512 [rsi+64], r8, r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp, rbx + // [r9:r14] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r8 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp + + // [r9:r15, rax, r8] <- z = a0 x b01 - a1 x b11 + z + mov rdx, [rcx+72] + MULADD64x512 [rsi], r9, r10, r11, r12, r13, r14, r15, rax, r8, rbx, rbp, r8 + mov rdx, [rcx+8] + MULADD64x512 [rsi+64], r9, r10, r11, r12, r13, r14, r15, rax, r8, rbx, rbp, rbx + // [r10:r15, rax, r8] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r9 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r10, r11, r12, r13, r14, r15, rax, r8, rbx, rbp + + // [r10:r15, rax, r8:r9] <- z = a0 x b02 - a1 x b12 + z + mov rdx, [rcx+80] + MULADD64x512 [rsi], r10, r11, r12, r13, r14, r15, rax, r8, r9, rbx, rbp, r9 + mov rdx, [rcx+16] + MULADD64x512 [rsi+64], r10, r11, r12, r13, r14, r15, rax, r8, r9, rbx, rbp, rbx + // [r11:r15, rax, r8:r9] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r10 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r11, r12, r13, r14, r15, rax, r8, r9, rbx, rbp + + // [r11:r15, rax, r8:r10] <- z = a0 x b03 - a1 x b13 + z + mov rdx, [rcx+88] + MULADD64x512 [rsi], r11, r12, r13, r14, r15, rax, r8, r9, r10, rbx, rbp, r10 + mov rdx, [rcx+24] + MULADD64x512 [rsi+64], r11, r12, r13, r14, r15, rax, r8, r9, r10, rbx, rbp, rbx + // [r12:r15, rax, r8:r10] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r11 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r12, r13, r14, r15, rax, r8, r9, r10, rbx, rbp + + // [r12:r15, rax, r8:r11] <- z = a0 x b04 - a1 x b14 + z + mov rdx, [rcx+96] + MULADD64x512 [rsi], r12, r13, r14, r15, rax, r8, r9, r10, r11, rbx, rbp, r11 + mov rdx, [rcx+32] + MULADD64x512 [rsi+64], r12, r13, r14, r15, rax, r8, r9, r10, r11, rbx, rbp, rbx + // [r13:r15, rax, r8:r11] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r12 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r13, r14, r15, rax, r8, r9, r10, r11, rbx, rbp + + // [r13:r15, rax, r8:r12] <- z = a0 x b05 - a1 x b15 + z + mov rdx, [rcx+104] + MULADD64x512 [rsi], r13, r14, r15, rax, r8, r9, r10, r11, r12, rbx, rbp, r12 + mov rdx, [rcx+40] + MULADD64x512 [rsi+64], r13, r14, r15, rax, r8, r9, r10, r11, r12, rbx, rbp, rbx + // [r14:r15, rax, r8:r12] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r13 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r14, r15, rax, r8, r9, r10, r11, r12, rbx, rbp + + // [r14:r15, rax, r8:r12] <- z = a0 x b06 - a1 x b16 + z + mov rdx, [rcx+112] + MULADD64x512 [rsi], r14, r15, rax, r8, r9, r10, r11, r12, r13, rbx, rbp, r13 + mov rdx, [rcx+48] + MULADD64x512 [rsi+64], r14, r15, rax, r8, r9, r10, r11, r12, r13, rbx, rbp, rbx + // [r15, rax, r8:r13] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r14 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], r15, rax, r8, r9, r10, r11, r12, r13, rbx, rbp + + // [r15, rax, r8:r12] <- z = a0 x b06 - a1 x b16 + z + mov rdx, [rcx+120] + MULADD64x512 [rsi], r15, rax, r8, r9, r10, r11, r12, r13, r14, rbx, rbp, r14 + mov rdx, [rcx+56] + MULADD64x512 [rsi+64], r15, rax, r8, r9, r10, r11, r12, r13, r14, rbx, rbp, rbx + // [rax, r8:r14] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, r15 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], rax, r8, r9, r10, r11, r12, r13, r14, rbx, rbp + + mov [rdi], rax + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + mov [rdi+48], r13 + mov [rdi+56], r14 + pop rbp + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +///////////////////////////////////////////////////////////////// MACRO +// z = a x b (mod p) +// Inputs: base memory pointers M0 (a), M1 (b) +// bi pre-stored in rdx, +// accumulator z in [Z0:Z8], pre-stores a0 x b +// Output: [Z0:Z8] +// Temps: regs T0:T1 +///////////////////////////////////////////////////////////////// +.macro FPMUL512x512 M0, M1, Z0, Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8, T0, T1 + // [Z1:Z8] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z0 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z1, \Z2, \Z3, \Z4, \Z5, \Z6, \Z7, \Z8, \T0, \T1 + + // [Z1:Z8, Z0] <- z = a01 x a1 + z + mov rdx, 8\M0 + MULADD64x512 \M1, \Z1, \Z2, \Z3, \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \T0, \T1, \Z0 + // [Z2:Z8, Z0] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z1 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z2, \Z3, \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \T0, \T1 + + // [Z2:Z8, Z0:Z1] <- z = a02 x a1 + z + mov rdx, 16\M0 + MULADD64x512 \M1, \Z2, \Z3, \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \T0, \T1, \Z1 + // [Z3:Z8, Z0:Z1] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z2 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z3, \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \T0, \T1 + + // [Z3:Z8, Z0:Z2] <- z = a03 x a1 + z + mov rdx, 24\M0 + MULADD64x512 \M1, \Z3, \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \T0, \T1, \Z2 + // [Z4:Z8, Z0:Z2] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z3 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \T0, \T1 + + // [Z4:Z8, Z0:Z3] <- z = a04 x a1 + z + mov rdx, 32\M0 + MULADD64x512 \M1, \Z4, \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \T0, \T1, \Z3 + // [Z5:Z8, Z0:Z3] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z4 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \T0, \T1 + + // [Z5:Z8, Z0:Z4] <- z = a05 x a1 + z + mov rdx, 40\M0 + MULADD64x512 \M1, \Z5, \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \Z4, \T0, \T1, \Z4 + // [Z6:Z8, Z0:Z4] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z5 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \Z4, \T0, \T1 + + // [Z6:Z8, Z0:Z5] <- z = a06 x a1 + z + mov rdx, 48\M0 + MULADD64x512 \M1, \Z6, \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \Z4, \Z5, \T0, \T1, \Z5 + // [Z7:Z8, Z0:Z5] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z6 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \Z4, \Z5, \T0, \T1 + + // [Z7:Z8, Z0:Z6] <- z = a07 x a1 + z + mov rdx, 56\M0 + MULADD64x512 \M1, \Z7, \Z8, \Z0, \Z1, \Z2, \Z3, \Z4, \Z5, \Z6, \T0, \T1, \Z6 + // [Z8, Z0:Z6] <- z = (z0 x p_plus_1 + z)/2^64 + mov rdx, \Z7 // rdx <- z0 + MULADD64x64 [rip+p_plus_1+56], \Z8, \Z0, \Z1, \Z2, \Z3, \Z4, \Z5, \Z6, \T0, \T1 +.endm + +//*********************************************************************** +// Squaring in GF(p^2), non-complex part +// Operation: c [rdi] = (a0+a1) x (a0-a1) +// Inputs: a = [a1, a0] stored in [rsi] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_sq_c0 +fp2_sq_c0: + push r12 + push r13 + push r14 + push r15 + push rbx + push rbp + + // a0 + a1 + mov rdx, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + mov r14, [rsi+48] + mov r15, [rsi+56] + add rdx, [rsi+64] + adc r9, [rsi+72] + adc r10, [rsi+80] + adc r11, [rsi+88] + adc r12, [rsi+96] + adc r13, [rsi+104] + adc r14, [rsi+112] + adc r15, [rsi+120] + mov [rdi], rdx + mov [rdi+8], r9 + mov [rdi+16], r10 + mov [rdi+24], r11 + mov [rdi+32], r12 + mov [rdi+40], r13 + mov [rdi+48], r14 + mov [rdi+56], r15 + + // a0 - a1 + 2p + mov r8, [rsi] + mov r10, [rsi+8] + mov r12, [rsi+16] + mov r13, [rsi+24] + mov r14, [rsi+32] + mov r15, [rsi+40] + mov rbx, [rsi+48] + mov rbp, [rsi+56] + sub r8, [rsi+64] + sbb r10, [rsi+72] + sbb r12, [rsi+80] + sbb r13, [rsi+88] + sbb r14, [rsi+96] + sbb r15, [rsi+104] + sbb rbx, [rsi+112] + sbb rbp, [rsi+120] + mov rax, [rip+p2] + add r8, rax + mov rax, [rip+p2+8] + adc r10, rax + adc r12, rax + adc r13, rax + adc r14, rax + adc r15, rax + adc rbx, rax + adc rbp, [rip+p2+56] + mov [rdi+64], r8 + mov [rdi+72], r10 + mov [rdi+80], r12 + mov [rdi+88], r13 + mov [rdi+96], r14 + mov [rdi+104], r15 + mov [rdi+112], rbx + mov [rdi+120], rbp + + // [r8:r15, rax] <- z = a00 x a1 + mulx r9, r8, r8 + xor rax, rax + mulx r10, r11, r10 + adcx r9, r11 + mulx r11, r12, r12 + adcx r10, r12 + mulx r12, r13, r13 + adcx r11, r13 + mulx r13, r14, r14 + adcx r12, r14 + mulx r14, r15, r15 + adcx r13, r15 + mulx r15, rbx, rbx + adcx r14, rbx + mulx rax, rbp, rbp + adcx r15, rbp + adc rax, 0 + + FPMUL512x512 [rdi], [rdi+64], r8, r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp + + mov [rdi], rax + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + mov [rdi+48], r13 + mov [rdi+56], r14 + pop rbp + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +//*********************************************************************** +// Squaring in GF(p^2), complex part +// Operation: c [rdi] = 2a0 x a1 +// Inputs: a = [a1, a0] stored in [reg_p1] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp2_sq_c1 +fp2_sq_c1: + push r12 + push r13 + push r14 + push r15 + push rbx + push rbp + + mov rdx, [rsi] + mov r9, [rsi+8] + mov r10, [rsi+16] + mov r11, [rsi+24] + mov r12, [rsi+32] + mov r13, [rsi+40] + mov r14, [rsi+48] + mov r15, [rsi+56] + add rdx, rdx + adc r9, r9 + adc r10, r10 + adc r11, r11 + adc r12, r12 + adc r13, r13 + adc r14, r14 + adc r15, r15 + sub rsp, 64 + mov [rsp+8], r9 + mov [rsp+16], r10 + mov [rsp+24], r11 + mov [rsp+32], r12 + mov [rsp+40], r13 + mov [rsp+48], r14 + mov [rsp+56], r15 + + // [r8:r15, rax] <- z = a00 x a1 + mulx r9, r8, [rsi+64] + xor rax, rax + mulx r10, r11, [rsi+72] + adcx r9, r11 + mulx r11, r12, [rsi+80] + adcx r10, r12 + mulx r12, r13, [rsi+88] + adcx r11, r13 + mulx r13, r14, [rsi+96] + adcx r12, r14 + mulx r14, r15, [rsi+104] + adcx r13, r15 + mulx r15, rbp, [rsi+112] + adcx r14, rbp + mulx rax, rbx, [rsi+120] + adcx r15, rbx + adc rax, 0 + + FPMUL512x512 [rsp], [rsi+64], r8, r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp + add rsp, 64 + + mov [rdi], rax + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + mov [rdi+48], r13 + mov [rdi+56], r14 + pop rbp + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +//*********************************************************************** +// Field multiplication in GF(p) +// Operation: c = a x b mod p +// Inputs: a stored in [rsi], b stored in [rdx] +// Output: c stored in [rdi] +//*********************************************************************** +.global fp_mul +fp_mul: + push r12 + push r13 + push r14 + push r15 + push rbx + push rbp + mov rcx, rdx + + // [r8:r15, rax] <- z = a x b0 + mov rdx, [rcx] + mulx r9, r8, [rsi] + xor rax, rax + mulx r10, r11, [rsi+8] + adcx r9, r11 + mulx r11, r12, [rsi+16] + adcx r10, r12 + mulx r12, r13, [rsi+24] + adcx r11, r13 + mulx r13, r14, [rsi+32] + adcx r12, r14 + mulx r14, r15, [rsi+40] + adcx r13, r15 + mulx r15, rbp, [rsi+48] + adcx r14, rbp + mulx rax, rbx, [rsi+56] + adcx r15, rbx + adc rax, 0 + + FPMUL512x512 [rcx], [rsi], r8, r9, r10, r11, r12, r13, r14, r15, rax, rbx, rbp + + mov [rdi], rax + mov [rdi+8], r8 + mov [rdi+16], r9 + mov [rdi+24], r10 + mov [rdi+32], r11 + mov [rdi+40], r12 + mov [rdi+48], r13 + mov [rdi+56], r14 + pop rbp + pop rbx + pop r15 + pop r14 + pop r13 + pop r12 + ret + +.global fp_sqr +fp_sqr: + mov rdx, rsi + jmp fp_mul diff --git a/src/gf/broadwell/lvl5/gf27500.c b/src/gf/broadwell/lvl5/gf27500.c new file mode 100644 index 0000000..be91a01 --- /dev/null +++ b/src/gf/broadwell/lvl5/gf27500.c @@ -0,0 +1,839 @@ +#include "gf27500.h" + +// see gf27500.h +const gf27500 gf27500_ZERO = { 0, 0, 0, 0, 0, 0, 0, 0 }; + +// see gf27500.h +const gf27500 gf27500_ONE = { 0x0000000000000097, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0130000000000000 }; + +// see gf27500.h +const gf27500 gf27500_MINUS_ONE = { 0xFFFFFFFFFFFFFF68, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF }; + +// Montgomery representation of 2^256. +static const gf27500 R2 = { 0xED097B425ED0F19A, 0x097B425ED097B425, 0x7B425ED097B425ED, 0x425ED097B425ED09, + 0x5ED097B425ED097B, 0xD097B425ED097B42, 0x97B425ED097B425E, 0x0045ED097B425ED0 }; + +// The modulus itself (this is also a valid representation of zero). +static const gf27500 MODULUS = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x01AFFFFFFFFFFFFF }; + +// 1/2^496 (in Montgomery representation). +static const gf27500 INVT496 = { 0x0000000000010000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }; + +static const gf27500 PM1O3 = { 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x011fffffffffffff }; + +// Expand the most significant bit of x into a full-width 64-bit word +// (0x0000000000000000 or 0xFFFFFFFFFFFFFFFF). +static inline uint64_t +sgnw(uint64_t x) +{ + return (uint64_t)(*(int64_t *)&x >> 63); +} + +// d <- u*f + v*g (in the field) +// Coefficients f and g are provided as unsigned integers, but they +// really are signed values which must be less than 2^62 (in absolute value). +static void +gf27500_lin(gf27500 *d, const gf27500 *u, const gf27500 *v, uint64_t f, uint64_t g) +{ + // f <- abs(f), keeping the sign in sf, and negating u accordingly + uint64_t sf = sgnw(f); + f = (f ^ sf) - sf; + gf27500 tu; + gf27500_neg(&tu, u); + gf27500_select(&tu, u, &tu, (uint32_t)sf); + + // g <- abs(g), keeping the sign in sg, and negating v accordingly + uint64_t sg = sgnw(g); + g = (g ^ sg) - sg; + gf27500 tv; + gf27500_neg(&tv, v); + gf27500_select(&tv, v, &tv, (uint32_t)sg); + + // Linear combination over plain integers. + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, t; + inner_gf27500_umul_x2(d0, t, tu.v0, f, tv.v0, g); + inner_gf27500_umul_x2_add(d1, t, tu.v1, f, tv.v1, g, t); + inner_gf27500_umul_x2_add(d2, t, tu.v2, f, tv.v2, g, t); + inner_gf27500_umul_x2_add(d3, t, tu.v3, f, tv.v3, g, t); + inner_gf27500_umul_x2_add(d4, t, tu.v4, f, tv.v4, g, t); + inner_gf27500_umul_x2_add(d5, t, tu.v5, f, tv.v5, g, t); + inner_gf27500_umul_x2_add(d6, t, tu.v6, f, tv.v6, g, t); + inner_gf27500_umul_x2_add(d7, t, tu.v7, f, tv.v7, g, t); + + // Reduction: split into low part (500 bits) and high part + // (75 bits, since t can be up to 63 bits). If the high + // part is h, then: + // h*2^500 = (h mod 27)*2^500 + floor(h/27) mod q + uint64_t h0 = (d7 >> 52) | (t << 12); + uint64_t h1 = t >> 52; + d7 &= 0x000FFFFFFFFFFFFF; + + uint64_t z0, z1, quo0, rem0, quo1, rem1; + inner_gf27500_umul(z0, z1, h0, 0x97B425ED097B425F); + (void)z0; + quo0 = z1 >> 4; + rem0 = h0 - (27 * quo0); + quo1 = (0x12F7 * h1) >> 17; + rem1 = h1 - (27 * quo1); + + // h = rem0 + 27*quo0 + (rem1 + 27*quo1)*2^64 + // = rem0 + rem1 + 27*(quo0 + quo1*2^64 + rem1*((2^64 - 1)/27)) + // We add rem0 and rem1 modulo 27, with an extra carry that + // goes into the folded part (multiple of 27). + uint64_t e, f0, f1; + unsigned char cc; + cc = inner_gf27500_adc(0, rem0 + 0xFFFFFFFFFFFFFFE5, rem1, &e); + cc = inner_gf27500_adc(cc, quo0, rem1 * 0x97B425ED097B425, &f0); + cc = inner_gf27500_adc(cc, quo1, 0, &f1); + assert(cc == 0); + e -= 0xFFFFFFFFFFFFFFE5; + + // Now we only have to add e*2^512 + f0:f1 to the low part. + cc = inner_gf27500_adc(0, d0, f0, &d0); + cc = inner_gf27500_adc(cc, d1, f1, &d1); + cc = inner_gf27500_adc(cc, d2, 0, &d2); + cc = inner_gf27500_adc(cc, d3, 0, &d3); + cc = inner_gf27500_adc(cc, d4, 0, &d4); + cc = inner_gf27500_adc(cc, d5, 0, &d5); + cc = inner_gf27500_adc(cc, d6, 0, &d6); + (void)inner_gf27500_adc(cc, d7, e << 52, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; +} + +// d <- abs(floor((a*f + b*g) / 2^31)) +// Coefficients f and g are provided as unsigned integer, but they really +// are signed values, which MUST be at most 2^31 in absolute value. +// The computation is performed over the integers, not modulo q. The low +// 31 bits are dropped (in practice, callers provided appropriate coefficients +// f and g such that a*f + b*g is a multiple of 2^31. +// +// If a*f + b*g is negative, then the absolute value is computed, and the +// function returns 0xFFFFFFFFFFFFFFFF; otherwise, the function returns +// 0x0000000000000000. +static uint64_t +lindiv31abs(gf27500 *d, const gf27500 *a, const gf27500 *b, uint64_t f, uint64_t g) +{ + // f <- abs(f), keeping the sign in sf + uint64_t sf = sgnw(f); + f = (f ^ sf) - sf; + + // g <- abs(g), keeping the sign in sg + uint64_t sg = sgnw(g); + g = (g ^ sg) - sg; + + // Apply the signs of f and g to the source operands. + uint64_t a0, a1, a2, a3, a4, a5, a6, a7, a8; + uint64_t b0, b1, b2, b3, b4, b5, b6, b7, b8; + unsigned char cc; + + cc = inner_gf27500_sbb(0, a->v0 ^ sf, sf, &a0); + cc = inner_gf27500_sbb(cc, a->v1 ^ sf, sf, &a1); + cc = inner_gf27500_sbb(cc, a->v2 ^ sf, sf, &a2); + cc = inner_gf27500_sbb(cc, a->v3 ^ sf, sf, &a3); + cc = inner_gf27500_sbb(cc, a->v4 ^ sf, sf, &a4); + cc = inner_gf27500_sbb(cc, a->v5 ^ sf, sf, &a5); + cc = inner_gf27500_sbb(cc, a->v6 ^ sf, sf, &a6); + cc = inner_gf27500_sbb(cc, a->v7 ^ sf, sf, &a7); + (void)inner_gf27500_sbb(cc, 0, 0, &a8); + + cc = inner_gf27500_sbb(0, b->v0 ^ sg, sg, &b0); + cc = inner_gf27500_sbb(cc, b->v1 ^ sg, sg, &b1); + cc = inner_gf27500_sbb(cc, b->v2 ^ sg, sg, &b2); + cc = inner_gf27500_sbb(cc, b->v3 ^ sg, sg, &b3); + cc = inner_gf27500_sbb(cc, b->v4 ^ sg, sg, &b4); + cc = inner_gf27500_sbb(cc, b->v5 ^ sg, sg, &b5); + cc = inner_gf27500_sbb(cc, b->v6 ^ sg, sg, &b6); + cc = inner_gf27500_sbb(cc, b->v7 ^ sg, sg, &b7); + (void)inner_gf27500_sbb(cc, 0, 0, &b8); + + // Compute a*f + b*g into d0:d1:d2:d3:d4. Since f and g are at + // most 2^31, we can add two 128-bit products with no overflow. + // Note: a4 and b4 are both in {0, -1}. + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, d8, t; + inner_gf27500_umul_x2(d0, t, a0, f, b0, g); + inner_gf27500_umul_x2_add(d1, t, a1, f, b1, g, t); + inner_gf27500_umul_x2_add(d2, t, a2, f, b2, g, t); + inner_gf27500_umul_x2_add(d3, t, a3, f, b3, g, t); + inner_gf27500_umul_x2_add(d4, t, a4, f, b4, g, t); + inner_gf27500_umul_x2_add(d5, t, a5, f, b5, g, t); + inner_gf27500_umul_x2_add(d6, t, a6, f, b6, g, t); + inner_gf27500_umul_x2_add(d7, t, a7, f, b7, g, t); + d8 = t - (a8 & f) - (b8 & g); + + // Right-shift the value by 31 bits. + d0 = (d0 >> 31) | (d1 << 33); + d1 = (d1 >> 31) | (d2 << 33); + d2 = (d2 >> 31) | (d3 << 33); + d3 = (d3 >> 31) | (d4 << 33); + d4 = (d4 >> 31) | (d5 << 33); + d5 = (d5 >> 31) | (d6 << 33); + d6 = (d6 >> 31) | (d7 << 33); + d7 = (d7 >> 31) | (d8 << 33); + + // If the result is negative, negate it. + t = sgnw(d8); + cc = inner_gf27500_sbb(0, d0 ^ t, t, &d0); + cc = inner_gf27500_sbb(cc, d1 ^ t, t, &d1); + cc = inner_gf27500_sbb(cc, d2 ^ t, t, &d2); + cc = inner_gf27500_sbb(cc, d3 ^ t, t, &d3); + cc = inner_gf27500_sbb(cc, d4 ^ t, t, &d4); + cc = inner_gf27500_sbb(cc, d5 ^ t, t, &d5); + cc = inner_gf27500_sbb(cc, d6 ^ t, t, &d6); + (void)inner_gf27500_sbb(cc, d7 ^ t, t, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + return t; +} + +// lzcnt(x) returns the number of leading bits of value 0 in x. It supports +// x == 0 (in which case the function returns 64). +#if defined __LZCNT__ +static inline uint64_t +lzcnt(uint64_t x) +{ + return _lzcnt_u64(x); +} +#else +static inline uint64_t +lzcnt(uint64_t x) +{ + uint64_t m, s; + m = sgnw((x >> 32) - 1); + s = m & 32; + x = (x >> 32) ^ (m & (x ^ (x >> 32))); + m = sgnw((x >> 16) - 1); + s |= m & 16; + x = (x >> 16) ^ (m & (x ^ (x >> 16))); + m = sgnw((x >> 8) - 1); + s |= m & 8; + x = (x >> 8) ^ (m & (x ^ (x >> 8))); + m = sgnw((x >> 4) - 1); + s |= m & 4; + x = (x >> 4) ^ (m & (x ^ (x >> 4))); + m = sgnw((x >> 2) - 1); + s |= m & 2; + x = (x >> 2) ^ (m & (x ^ (x >> 2))); + + // At this point, x fits on 2 bits. Count of extra zeros: + // x = 0 -> 2 + // x = 1 -> 1 + // x = 2 -> 0 + // x = 3 -> 0 + s += (2 - x) & ((x - 3) >> 2); + return s; +} +#endif + +// see gf27500.h +uint32_t +gf27500_div(gf27500 *d, const gf27500 *x, const gf27500 *y) +{ + // Extended binary GCD: + // + // a <- y + // b <- q (modulus) + // u <- x (self) + // v <- 0 + // + // Value a is normalized (in the 0..q-1 range). Values a and b are + // then considered as (signed) integers. Values u and v are field + // elements. + // + // Invariants: + // a*x = y*u mod q + // b*x = y*v mod q + // b is always odd + // + // At each step: + // if a is even, then: + // a <- a/2, u <- u/2 mod q + // else: + // if a < b: + // (a, u, b, v) <- (b, v, a, u) + // a <- (a-b)/2, u <- (u-v)/2 mod q + // + // What we implement below is the optimized version of this + // algorithm, as described in https://eprint.iacr.org/2020/972 + + gf27500 a, b, u, v; + uint64_t xa, xb, f0, g0, f1, g1; + uint32_t r; + + r = ~gf27500_iszero(y); + inner_gf27500_normalize(&a, y); + b = MODULUS; + u = *x; + v = gf27500_ZERO; + + // Generic loop does 31*31 = 961 inner iterations. + for (int i = 0; i < 31; i++) { + // Get approximations of a and b over 64 bits: + // - If len(a) <= 64 and len(b) <= 64, then we just use + // their values (low limbs). + // - Otherwise, with n = max(len(a), len(b)), we use: + // (a mod 2^31) + 2^31*floor(a / 2^(n - 33)) + // (b mod 2^31) + 2^31*floor(b / 2^(n - 33)) + uint64_t m7 = a.v7 | b.v7; + uint64_t m6 = a.v6 | b.v6; + uint64_t m5 = a.v5 | b.v5; + uint64_t m4 = a.v4 | b.v4; + uint64_t m3 = a.v3 | b.v3; + uint64_t m2 = a.v2 | b.v2; + uint64_t m1 = a.v1 | b.v1; + uint64_t tnz7 = sgnw(m7 | -m7); + uint64_t tnz6 = sgnw(m6 | -m6) & ~tnz7; + uint64_t tnz5 = sgnw(m5 | -m5) & ~tnz7 & ~tnz6; + uint64_t tnz4 = sgnw(m4 | -m4) & ~tnz7 & ~tnz6 & ~tnz5; + uint64_t tnz3 = sgnw(m3 | -m3) & ~tnz7 & ~tnz6 & ~tnz5 & ~tnz4; + uint64_t tnz2 = sgnw(m2 | -m2) & ~tnz7 & ~tnz6 & ~tnz5 & ~tnz4 & ~tnz3; + uint64_t tnz1 = sgnw(m1 | -m1) & ~tnz7 & ~tnz6 & ~tnz5 & ~tnz4 & ~tnz3 & ~tnz2; + uint64_t tnzm = (m7 & tnz7) | (m6 & tnz6) | (m5 & tnz5) | (m4 & tnz4) | (m3 & tnz3) | (m2 & tnz2) | (m1 & tnz1); + uint64_t tnza = (a.v7 & tnz7) | (a.v6 & tnz6) | (a.v5 & tnz5) | (a.v4 & tnz4) | (a.v3 & tnz3) | (a.v2 & tnz2) | + (a.v1 & tnz1); + uint64_t tnzb = (b.v7 & tnz7) | (b.v6 & tnz6) | (b.v5 & tnz5) | (b.v4 & tnz4) | (b.v3 & tnz3) | (b.v2 & tnz2) | + (b.v1 & tnz1); + uint64_t snza = (a.v6 & tnz7) | (a.v5 & tnz6) | (a.v4 & tnz5) | (a.v3 & tnz4) | (a.v2 & tnz3) | (a.v1 & tnz2) | + (a.v0 & tnz1); + uint64_t snzb = (b.v6 & tnz7) | (b.v5 & tnz6) | (b.v4 & tnz5) | (b.v3 & tnz4) | (b.v2 & tnz3) | (b.v1 & tnz2) | + (b.v0 & tnz1); + + // If both len(a) <= 64 and len(b) <= 64, then: + // tnzm = 0 + // tnza = 0, snza = 0, tnzb = 0, snzb = 0 + // Otherwise: + // tnzm != 0 + // tnza contains the top non-zero limb of a + // snza contains the limb right below tnza + // tnzb contains the top non-zero limb of a + // snzb contains the limb right below tnzb + // + // We count the number of leading zero bits in tnzm: + // - If s <= 31, then the top 31 bits can be extracted from + // tnza and tnzb alone. + // - If 32 <= s <= 63, then we need some bits from snza and + // snzb as well. + int64_t s = lzcnt(tnzm); + uint64_t sm = (uint64_t)((31 - s) >> 63); + tnza ^= sm & (tnza ^ ((tnza << 32) | (snza >> 32))); + tnzb ^= sm & (tnzb ^ ((tnzb << 32) | (snzb >> 32))); + s -= 32 & sm; + tnza <<= s; + tnzb <<= s; + + // At this point: + // - If len(a) <= 64 and len(b) <= 64, then: + // tnza = 0 + // tnzb = 0 + // tnz1 = tnz2 = tnz3 = tnz4 = tnz5 = 0 + // we want to use the entire low words of a and b + // - Otherwise, we want to use the top 33 bits of tnza and + // tnzb, and the low 31 bits of the low words of a and b. + uint64_t tzx = ~(tnz1 | tnz2 | tnz3 | tnz4 | tnz5 | tnz6 | tnz7); + tnza |= a.v0 & tzx; + tnzb |= b.v0 & tzx; + xa = (a.v0 & 0x7FFFFFFF) | (tnza & 0xFFFFFFFF80000000); + xb = (b.v0 & 0x7FFFFFFF) | (tnzb & 0xFFFFFFFF80000000); + + // Compute the 31 inner iterations on xa and xb. + uint64_t fg0 = (uint64_t)1; + uint64_t fg1 = (uint64_t)1 << 32; + for (int j = 0; j < 31; j++) { + uint64_t a_odd, swap, t0, t1, t2; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf27500_sbb(0, xa, xb, &t0); + (void)inner_gf27500_sbb(cc, 0, 0, &swap); + swap &= a_odd; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + xa >>= 1; + fg1 <<= 1; + } + fg0 += 0x7FFFFFFF7FFFFFFF; + fg1 += 0x7FFFFFFF7FFFFFFF; + f0 = (fg0 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0 >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1 >> 32) - (uint64_t)0x7FFFFFFF; + + // Propagate updates to a, b, u and v. + gf27500 na, nb, nu, nv; + uint64_t nega = lindiv31abs(&na, &a, &b, f0, g0); + uint64_t negb = lindiv31abs(&nb, &a, &b, f1, g1); + f0 = (f0 ^ nega) - nega; + g0 = (g0 ^ nega) - nega; + f1 = (f1 ^ negb) - negb; + g1 = (g1 ^ negb) - negb; + gf27500_lin(&nu, &u, &v, f0, g0); + gf27500_lin(&nv, &u, &v, f1, g1); + a = na; + b = nb; + u = nu; + v = nv; + } + + // If y is invertible, then the final GCD is 1, and + // len(a) + len(b) <= 49, so we can end the computation with + // the low words directly. We only need 47 iterations to reach + // the point where b = 1. + // + // If y is zero, then v is unchanged (hence zero) and none of + // the subsequent iterations will change it either, so we get + // 0 on output, which is what we want. + xa = a.v0; + xb = b.v0; + f0 = 1; + g0 = 0; + f1 = 0; + g1 = 1; + for (int j = 0; j < 47; j++) { + uint64_t a_odd, swap, t0, t1, t2, t3; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf27500_sbb(0, xa, xb, &t0); + (void)inner_gf27500_sbb(cc, 0, 0, &swap); + swap &= a_odd; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (f0 ^ f1); + f0 ^= t2; + f1 ^= t2; + t3 = swap & (g0 ^ g1); + g0 ^= t3; + g1 ^= t3; + xa -= a_odd & xb; + f0 -= a_odd & f1; + g0 -= a_odd & g1; + xa >>= 1; + f1 <<= 1; + g1 <<= 1; + } + gf27500_lin(d, &u, &v, f1, g1); + + // At the point: + // - Numerator and denominator were both in Montgomery representation, + // but the two factors R canceled each other. + // - We have injected 31*31+47 = 1008 extra factors of 2, hence we + // must divide the result by 2^1008. + // - However, we also want to obtain the result in Montgomery + // representation, i.e. multiply by 2^512. We thus want to + // divide the current result by 2^(1008 - 512) = 2^496. + // - We do this division by using a Montgomery multiplication with + // the Montgomery representation of 1/2^496, i.e. the integer + // 2^512/2^496 = 2^16. + gf27500_mul(d, d, &INVT496); + return r; +} + +// see gf27500.h +uint32_t +gf27500_invert(gf27500 *d, const gf27500 *a) +{ + return gf27500_div(d, &gf27500_ONE, a); +} + +// see gf27500.h +int32_t +gf27500_legendre(const gf27500 *x) +{ + // Same algorithm as the binary GCD in gf27500_div(), with + // a few differences: + // - We do not keep track of the Bézout coefficients u and v. + // - In each inner iteration we adjust the running symbol value, + // which uses the low 3 bits of the values. + // - Since we need two extra bits of look-ahead, we can only run + // 29 inner iterations, and then need an extra recomputation + // for the last 2. + + gf27500 a, b; + uint64_t xa, xb, f0, g0, f1, g1, ls; + + inner_gf27500_normalize(&a, x); + b = MODULUS; + ls = 0; // running symbol information in bit 1. + + // Outer loop + for (int i = 0; i < 31; i++) { + // Get approximations of a and b over 64 bits. + uint64_t m7 = a.v7 | b.v7; + uint64_t m6 = a.v6 | b.v6; + uint64_t m5 = a.v5 | b.v5; + uint64_t m4 = a.v4 | b.v4; + uint64_t m3 = a.v3 | b.v3; + uint64_t m2 = a.v2 | b.v2; + uint64_t m1 = a.v1 | b.v1; + uint64_t tnz7 = sgnw(m7 | -m7); + uint64_t tnz6 = sgnw(m6 | -m6) & ~tnz7; + uint64_t tnz5 = sgnw(m5 | -m5) & ~tnz7 & ~tnz6; + uint64_t tnz4 = sgnw(m4 | -m4) & ~tnz7 & ~tnz6 & ~tnz5; + uint64_t tnz3 = sgnw(m3 | -m3) & ~tnz7 & ~tnz6 & ~tnz5 & ~tnz4; + uint64_t tnz2 = sgnw(m2 | -m2) & ~tnz7 & ~tnz6 & ~tnz5 & ~tnz4 & ~tnz3; + uint64_t tnz1 = sgnw(m1 | -m1) & ~tnz7 & ~tnz6 & ~tnz5 & ~tnz4 & ~tnz3 & ~tnz2; + uint64_t tnzm = (m7 & tnz7) | (m6 & tnz6) | (m5 & tnz5) | (m4 & tnz4) | (m3 & tnz3) | (m2 & tnz2) | (m1 & tnz1); + uint64_t tnza = (a.v7 & tnz7) | (a.v6 & tnz6) | (a.v5 & tnz5) | (a.v4 & tnz4) | (a.v3 & tnz3) | (a.v2 & tnz2) | + (a.v1 & tnz1); + uint64_t tnzb = (b.v7 & tnz7) | (b.v6 & tnz6) | (b.v5 & tnz5) | (b.v4 & tnz4) | (b.v3 & tnz3) | (b.v2 & tnz2) | + (b.v1 & tnz1); + uint64_t snza = (a.v6 & tnz7) | (a.v5 & tnz6) | (a.v4 & tnz5) | (a.v3 & tnz4) | (a.v2 & tnz3) | (a.v1 & tnz2) | + (a.v0 & tnz1); + uint64_t snzb = (b.v6 & tnz7) | (b.v5 & tnz6) | (b.v4 & tnz5) | (b.v3 & tnz4) | (b.v2 & tnz3) | (b.v1 & tnz2) | + (b.v0 & tnz1); + + int64_t s = lzcnt(tnzm); + uint64_t sm = (uint64_t)((31 - s) >> 63); + tnza ^= sm & (tnza ^ ((tnza << 32) | (snza >> 32))); + tnzb ^= sm & (tnzb ^ ((tnzb << 32) | (snzb >> 32))); + s -= 32 & sm; + tnza <<= s; + tnzb <<= s; + + uint64_t tzx = ~(tnz1 | tnz2 | tnz3 | tnz4 | tnz5 | tnz6 | tnz7); + tnza |= a.v0 & tzx; + tnzb |= b.v0 & tzx; + xa = (a.v0 & 0x7FFFFFFF) | (tnza & 0xFFFFFFFF80000000); + xb = (b.v0 & 0x7FFFFFFF) | (tnzb & 0xFFFFFFFF80000000); + + // First 290 inner iterations. + uint64_t fg0 = (uint64_t)1; + uint64_t fg1 = (uint64_t)1 << 32; + for (int j = 0; j < 29; j++) { + uint64_t a_odd, swap, t0, t1, t2; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf27500_sbb(0, xa, xb, &t0); + (void)inner_gf27500_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & xa & xb; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + xa >>= 1; + fg1 <<= 1; + ls ^= (xb + 2) >> 1; + } + + // Compute the updated a and b (low words only) to get + // enough bits for the next two iterations. + uint64_t fg0z = fg0 + 0x7FFFFFFF7FFFFFFF; + uint64_t fg1z = fg1 + 0x7FFFFFFF7FFFFFFF; + f0 = (fg0z & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0z >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1z & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1z >> 32) - (uint64_t)0x7FFFFFFF; + uint64_t a0 = (a.v0 * f0 + b.v0 * g0) >> 29; + uint64_t b0 = (a.v0 * f1 + b.v0 * g1) >> 29; + for (int j = 0; j < 2; j++) { + uint64_t a_odd, swap, t0, t1, t2, t3; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf27500_sbb(0, xa, xb, &t0); + (void)inner_gf27500_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & a0 & b0; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + t2 = swap & (fg0 ^ fg1); + fg0 ^= t2; + fg1 ^= t2; + t3 = swap & (a0 ^ b0); + a0 ^= t3; + b0 ^= t3; + xa -= a_odd & xb; + fg0 -= a_odd & fg1; + a0 -= a_odd & b0; + xa >>= 1; + fg1 <<= 1; + a0 >>= 1; + ls ^= (b0 + 2) >> 1; + } + + // Propagate updates to a and b. + fg0 += 0x7FFFFFFF7FFFFFFF; + fg1 += 0x7FFFFFFF7FFFFFFF; + f0 = (fg0 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g0 = (fg0 >> 32) - (uint64_t)0x7FFFFFFF; + f1 = (fg1 & 0xFFFFFFFF) - (uint64_t)0x7FFFFFFF; + g1 = (fg1 >> 32) - (uint64_t)0x7FFFFFFF; + gf27500 na, nb; + uint64_t nega = lindiv31abs(&na, &a, &b, f0, g0); + (void)lindiv31abs(&nb, &a, &b, f1, g1); + ls ^= nega & nb.v0; + a = na; + b = nb; + } + + // Final iterations: values are at most 49 bits now. We do not + // need to keep track of update coefficients. Just like the GCD, + // we need only 47 iterations, because after 47 iterations, + // value a is 0 or 1, and b is 1, and no further modification to + // the Legendre symbol may happen. + xa = a.v0; + xb = b.v0; + for (int j = 0; j < 47; j++) { + uint64_t a_odd, swap, t0, t1; + unsigned char cc; + a_odd = -(xa & 1); + cc = inner_gf27500_sbb(0, xa, xb, &t0); + (void)inner_gf27500_sbb(cc, 0, 0, &swap); + swap &= a_odd; + ls ^= swap & xa & xb; + t1 = swap & (xa ^ xb); + xa ^= t1; + xb ^= t1; + xa -= a_odd & xb; + xa >>= 1; + ls ^= (xb + 2) >> 1; + } + + // At this point, if the source value was not zero, then the low + // bit of ls contains the QR status (0 = square, 1 = non-square), + // which we need to convert to the expected value (+1 or -1). + // If y == 0, then we return 0, per the API. + uint32_t r = 1 - ((uint32_t)ls & 2); + r &= ~gf27500_iszero(x); + return *(int32_t *)&r; +} + +// see gf27500.h +uint32_t +gf27500_sqrt(gf27500 *d, const gf27500 *a) +{ + // Candidate root is a^((q+1)/4), with (q+1)/4 = 27*2^498 + gf27500 y3, y; + gf27500_square(&y3, a); + gf27500_mul(&y3, &y3, a); // a^3 + gf27500_xsquare(&y, &y3, 3); // a^24 + gf27500_mul(&y, &y, &y3); // a^27 + gf27500_xsquare(&y, &y, 498); // a^27*2^498 + + // Normalize y and negate if necessary, to set the low bit to 0. + // The low bit check must be on the normal representation, + // not the Montgomery representation. + gf27500 yn; + inner_gf27500_montgomery_reduce(&yn, &y); + uint32_t ctl = -((uint32_t)yn.v0 & 1); + gf27500_neg(&yn, &y); + gf27500_select(&y, &y, &yn, ctl); + + // Check whether the candidate is indeed a square root. + gf27500_square(&yn, &y); + uint32_t r = gf27500_equals(&yn, a); + *d = y; + return r; +} + +// Little-endian encoding of a 64-bit integer. +static inline void +enc64le(void *dst, uint64_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); + buf[4] = (uint8_t)(x >> 32); + buf[5] = (uint8_t)(x >> 40); + buf[6] = (uint8_t)(x >> 48); + buf[7] = (uint8_t)(x >> 56); +} + +// Little-endian decoding of a 64-bit integer. +static inline uint64_t +dec64le(const void *src) +{ + const uint8_t *buf = src; + return (uint64_t)buf[0] | ((uint64_t)buf[1] << 8) | ((uint64_t)buf[2] << 16) | ((uint64_t)buf[3] << 24) | + ((uint64_t)buf[4] << 32) | ((uint64_t)buf[5] << 40) | ((uint64_t)buf[6] << 48) | ((uint64_t)buf[7] << 56); +} + +// see gf27500.h +void +gf27500_encode(void *dst, const gf27500 *a) +{ + uint8_t *buf = dst; + gf27500 x; + + inner_gf27500_montgomery_reduce(&x, a); + enc64le(buf, x.v0); + enc64le(buf + 8, x.v1); + enc64le(buf + 16, x.v2); + enc64le(buf + 24, x.v3); + enc64le(buf + 32, x.v4); + enc64le(buf + 40, x.v5); + enc64le(buf + 48, x.v6); + enc64le(buf + 56, x.v7); +} + +// see gf27500.h +uint32_t +gf27500_decode(gf27500 *d, const void *src) +{ + const uint8_t *buf = src; + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, t; + unsigned char cc; + + d0 = dec64le(buf); + d1 = dec64le(buf + 8); + d2 = dec64le(buf + 16); + d3 = dec64le(buf + 24); + d4 = dec64le(buf + 32); + d5 = dec64le(buf + 40); + d6 = dec64le(buf + 48); + d7 = dec64le(buf + 56); + cc = inner_gf27500_sbb(0, d0, MODULUS.v0, &t); + cc = inner_gf27500_sbb(cc, d1, MODULUS.v1, &t); + cc = inner_gf27500_sbb(cc, d2, MODULUS.v2, &t); + cc = inner_gf27500_sbb(cc, d3, MODULUS.v3, &t); + cc = inner_gf27500_sbb(cc, d4, MODULUS.v4, &t); + cc = inner_gf27500_sbb(cc, d5, MODULUS.v5, &t); + cc = inner_gf27500_sbb(cc, d6, MODULUS.v6, &t); + cc = inner_gf27500_sbb(cc, d7, MODULUS.v7, &t); + + (void)inner_gf27500_sbb(cc, 0, 0, &t); + + // If the value was not canonical then t = 0; otherwise, t = -1. + d->v0 = d0 & t; + d->v1 = d1 & t; + d->v2 = d2 & t; + d->v3 = d3 & t; + d->v4 = d4 & t; + d->v5 = d5 & t; + d->v6 = d6 & t; + d->v7 = d7 & t; + + // Convert to Montgomery representation. + gf27500_mul(d, d, &R2); + + return (uint32_t)t; +} + +// see gf27500.h +void +gf27500_decode_reduce(gf27500 *d, const void *src, size_t len) +{ + const uint8_t *buf = src; + + *d = gf27500_ZERO; + if (len == 0) { + return; + } + + if ((len & 63) != 0) { + // Input size is not a multiple of 64, we decode a partial + // block, which is already less than 2^512. + uint8_t tmp[64]; + size_t k; + + k = len & ~(size_t)63; + memcpy(tmp, buf + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + d->v0 = dec64le(&tmp[0]); + d->v1 = dec64le(&tmp[8]); + d->v2 = dec64le(&tmp[16]); + d->v3 = dec64le(&tmp[24]); + d->v4 = dec64le(&tmp[32]); + d->v5 = dec64le(&tmp[40]); + d->v6 = dec64le(&tmp[48]); + d->v7 = dec64le(&tmp[56]); + + len = k; + } else { + // Input size is a multiple of 48, we decode a full block, + // and a reduction is needed. + len -= 64; + uint64_t d0 = dec64le(buf + len); + uint64_t d1 = dec64le(buf + len + 8); + uint64_t d2 = dec64le(buf + len + 16); + uint64_t d3 = dec64le(buf + len + 24); + uint64_t d4 = dec64le(buf + len + 32); + uint64_t d5 = dec64le(buf + len + 40); + uint64_t d6 = dec64le(buf + len + 48); + uint64_t d7 = dec64le(buf + len + 56); + + inner_gf27500_partial_reduce(d, d0, d1, d2, d3, d4, d5, d6, d7); + } + + // Process all remaining blocks, in descending address order. + while (len > 0) { + gf27500_mul(d, d, &R2); + len -= 64; + uint64_t t0 = dec64le(buf + len); + uint64_t t1 = dec64le(buf + len + 8); + uint64_t t2 = dec64le(buf + len + 16); + uint64_t t3 = dec64le(buf + len + 24); + uint64_t t4 = dec64le(buf + len + 32); + uint64_t t5 = dec64le(buf + len + 40); + uint64_t t6 = dec64le(buf + len + 48); + uint64_t t7 = dec64le(buf + len + 56); + + gf27500 t; + inner_gf27500_partial_reduce(&t, t0, t1, t2, t3, t4, t5, t6, t7); + gf27500_add(d, d, &t); + } + + // Final conversion to Montgomery representation. + gf27500_mul(d, d, &R2); +} + +void +gf27500_div3(gf27500 *d, const gf27500 *a) +{ + const digit_t MAGIC = 0xAAAAAAAAAAAAAAAB; // 3^-1 mod 2^64 + uint64_t c0, c1, f0, f1; + gf27500 t; + + inner_gf27500_umul(f0, f1, a->arr[7], MAGIC); + t.arr[7] = f1 >> 1; + c1 = a->arr[7] - 3 * t.arr[7]; + + for (int32_t i = 6; i >= 0; i--) { + c0 = c1; + inner_gf27500_umul(f0, f1, a->arr[i], MAGIC); + t.arr[i] = f1 >> 1; + c1 = c0 + a->arr[i] - 3 * t.arr[i]; + t.arr[i] += c0 * ((MAGIC - 1) >> 1); + f0 = ((c1 >> 1) & c1); /* c1 == 3 */ + f1 = ((c1 >> 2) & !(c1 & 0x11)); /* c1 == 4 */ + f0 |= f1; + t.arr[i] += f0; + c1 = c1 - 3 * f0; + } + *d = t; + gf27500_sub(&t, d, &PM1O3); + gf27500_select(d, d, &t, -((c1 & 1) | (c1 >> 1))); // c1 >= 1 + gf27500_sub(&t, d, &PM1O3); + gf27500_select(d, d, &t, -(c1 == 2)); +} \ No newline at end of file diff --git a/src/gf/broadwell/lvl5/include/fp.h b/src/gf/broadwell/lvl5/include/fp.h new file mode 100644 index 0000000..02a45a3 --- /dev/null +++ b/src/gf/broadwell/lvl5/include/fp.h @@ -0,0 +1,141 @@ +#ifndef FP_H +#define FP_H + +// Include statements +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gf27500.h" + +// Type for elements of GF(p) +// Type for elements of GF(p) +#define fp_t gf27500 + +// Constants (Assumed to be in Montgomery form) +// Constants (Assumed to be in Montgomery form) +#define ZERO gf27500_ZERO +#define ONE gf27500_ONE + +// Operations in fp +static inline void +fp_neg(fp_t *d, const fp_t *a) +{ + gf27500_neg(d, a); +} + +void fp_add(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S +void fp_sub(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S +void fp_sqr(fp_t *out, const fp_t *a); // implemented in fp_asm.S +void fp_mul(fp_t *out, const fp_t *a, const fp_t *b); // implemented in fp_asm.S + +static inline void +fp_mul_small(fp_t *d, const fp_t *a, uint32_t n) +{ + gf27500_mul_small(d, a, n); +} + +static inline void +fp_half(fp_t *d, const fp_t *a) +{ + gf27500_half(d, a); +} +// #define fp_half gf27500_half + +static inline void +fp_div3(fp_t *d, const fp_t *a) +{ + gf27500_div3(d, a); +} +// #define fp_div3 gf27500_div3 + +// Constant time selection and swapping +static inline void +fp_select(fp_t *d, const fp_t *a0, const fp_t *a1, uint32_t ctl) +{ + gf27500_select(d, a0, a1, ctl); +} +// #define fp_select gf27500_select + +static inline void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + gf27500_cswap(a, b, ctl); +} +// #define fp_cswap gf27500_cswap + +// Comparisons for fp elements +static inline uint32_t +fp_is_zero(const fp_t *a) +{ + return gf27500_iszero(a); +} +// #define fp_is_zero gf27500_iszero + +static inline uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return gf27500_equals(a, b); +} +// #define fp_is_equal gf27500_equals + +// Set a uint32 to an Fp value +static inline void +fp_set_small(fp_t *d, uint32_t x) +{ + gf27500_set_small(d, x); +} +// #define fp_set_small gf27500_set_small + +// Encoding and decoding of bytes +static inline void +fp_encode(void *dst, const fp_t *a) +{ + gf27500_encode(dst, a); +} +// #define fp_encode gf27500_encode +static inline uint32_t +fp_decode(fp_t *d, const void *src) +{ + return gf27500_decode(d, src); +} +// #define fp_decode gf27500_decode +static inline void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + gf27500_decode_reduce(d, src, len); +} +// #define fp_decode_reduce gf27500_decode_reduce +// These functions are essentially useless because we can just +// use = for the shallow copies we need, but they're here for +// now until we do a larger refactoring +static inline void +fp_copy(fp_t *out, const fp_t *a) +{ + memcpy(out, a, sizeof(fp_t)); +} + +static inline void +fp_set_zero(fp_t *a) +{ + memcpy(a, &ZERO, sizeof(fp_t)); +} + +static inline void +fp_set_one(fp_t *a) +{ + memcpy(a, &ONE, sizeof(fp_t)); +} + +// Functions defined in low level code but with different API +void fp_inv(fp_t *a); +void fp_sqrt(fp_t *a); +void fp_exp3div4(fp_t *a); +uint32_t fp_is_square(const fp_t *a); + +#endif diff --git a/src/gf/broadwell/lvl5/include/fp2.h b/src/gf/broadwell/lvl5/include/fp2.h new file mode 100644 index 0000000..736e83e --- /dev/null +++ b/src/gf/broadwell/lvl5/include/fp2.h @@ -0,0 +1,49 @@ +#ifndef FP2_H +#define FP2_H + +#define NO_FP2X_MUL +#define NO_FP2X_SQR + +#include + +extern void fp2_sq_c0(fp2_t *out, const fp2_t *in); +extern void fp2_sq_c1(fp_t *out, const fp2_t *in); + +extern void fp2_mul_c0(fp_t *out, const fp2_t *in0, const fp2_t *in1); +extern void fp2_mul_c1(fp_t *out, const fp2_t *in0, const fp2_t *in1); + +static inline void +fp2_mul(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_t t; + + fp2_mul_c0(&t, y, z); // c0 = a0*b0 - a1*b1 + fp2_mul_c1(&x->im, y, z); // c1 = a0*b1 + a1*b0 + x->re.arr[0] = t.arr[0]; + x->re.arr[1] = t.arr[1]; + x->re.arr[2] = t.arr[2]; + x->re.arr[3] = t.arr[3]; + x->re.arr[4] = t.arr[4]; + x->re.arr[5] = t.arr[5]; + x->re.arr[6] = t.arr[6]; + x->re.arr[7] = t.arr[7]; +} + +static inline void +fp2_sqr(fp2_t *x, const fp2_t *y) +{ + fp2_t t; + + fp2_sq_c0(&t, y); // c0 = (a0+a1)(a0-a1) + fp2_sq_c1(&x->im, y); // c1 = 2a0*a1 + x->re.arr[0] = t.re.arr[0]; + x->re.arr[1] = t.re.arr[1]; + x->re.arr[2] = t.re.arr[2]; + x->re.arr[3] = t.re.arr[3]; + x->re.arr[4] = t.re.arr[4]; + x->re.arr[5] = t.re.arr[5]; + x->re.arr[6] = t.re.arr[6]; + x->re.arr[7] = t.re.arr[7]; +} + +#endif \ No newline at end of file diff --git a/src/gf/broadwell/lvl5/include/gf27500.h b/src/gf/broadwell/lvl5/include/gf27500.h new file mode 100644 index 0000000..fe5151b --- /dev/null +++ b/src/gf/broadwell/lvl5/include/gf27500.h @@ -0,0 +1,1409 @@ +#ifndef gf27500_h__ +#define gf27500_h__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include +#include +#include +#include +#include + + typedef uint64_t digit_t; // Datatype for representing field elements + + /* + * A gf27500 instance represents an integer modulo q. + * This is a structure; it can be copied with a simple assignment, and + * passed around as a value (though exchanging pointers is possibly more + * efficient). + * The contents are opaque. No calling code should make any assumption + * about the contents. + */ + typedef union + { + // Contents are opaque. + // Implementation note: this encodes the value in Montgomery + // representation, with R = 2^512. Only partial reduction is + // done internally to ensure the value is below 2^505 + struct + { + uint64_t v0; + uint64_t v1; + uint64_t v2; + uint64_t v3; + uint64_t v4; + uint64_t v5; + uint64_t v6; + uint64_t v7; + }; + digit_t arr[8]; + } gf27500; + + /* + * Constant zero (in the field). + */ + extern const gf27500 gf27500_ZERO; + + /* + * Constant one (in the field). + */ + extern const gf27500 gf27500_ONE; + + /* + * Constant -1 (in the field). + */ + extern const gf27500 gf27500_MINUS_ONE; + + /* + * API RULES: + * ========== + * + * Elementary operations on field elements are implemented by functions + * which take as parameter pointers to the operands. The first parameter + * is the pointer to the destination. Thus: + * gf27500 a = ...; + * gf27500 b = ...; + * gf27500 d; + * gf27500_sub(&d, &a, &b) + * sets field element d to a - b (implicitly modulo q). + * + * Operands may be used several times: it is always valid to use as + * output a gf27500 structure which is also used as input. + * + * Boolean values are represented by 32-bit integer (uint32_t) which have + * value exactly 0xFFFFFFFF (for "true") or 0x00000000 (for "false"). This + * convention minimizes the risk that a "smart" compiler breaks the + * constant-time property of the code through unfortunated optimizations. + * When a function expects such a Boolean, the caller MUST take care never + * to provide any value other than 0x00000000 or 0xFFFFFFFF. + * + * Values are encoded into exactly 64 bytes: value x modulo q is mapped to + * its unique integer representant in the [0..q-1] range, which is then + * encoded over 64 bytes with little-endian convention. Encoding is canonical + * and checked: when decoding (with gf27500_decode()), the input value is + * verified to be in the [0..q-1] range; for an out-of-range value, + * gf27500_decode() fills the output structure with zero, and returns + * 0x00000000. + * + * For most operations, the implementation is an inline function, defined + * below; the compiler can thus efficiently include it in the calling code. + * A few expensive operations (e.g. divisions) use non-inline functions, + * declared below but defined in gf27500.c + * + * All functions and macro whose name starts with "inner_gf27500_" are + * internal to this implementation and visible here only in order to + * support the API inline functions; they MUST NOT be used directly. + */ + +#if (defined _MSC_VER && defined _M_X64) || (defined __x86_64__ && (defined __GNUC__ || defined __clang__)) +#include +#define inner_gf27500_adc(cc, a, b, d) _addcarry_u64(cc, a, b, (unsigned long long *)(void *)d) +#define inner_gf27500_sbb(cc, a, b, d) _subborrow_u64(cc, a, b, (unsigned long long *)(void *)d) +#else +static inline unsigned char +inner_gf27500_adc(unsigned char cc, uint64_t a, uint64_t b, uint64_t *d) +{ + unsigned __int128 t = (unsigned __int128)a + (unsigned __int128)b + cc; + *d = (uint64_t)t; + return (unsigned char)(t >> 64); +} +static inline unsigned char +inner_gf27500_sbb(unsigned char cc, uint64_t a, uint64_t b, uint64_t *d) +{ + unsigned __int128 t = (unsigned __int128)a - (unsigned __int128)b - cc; + *d = (uint64_t)t; + return (unsigned char)(-(uint64_t)(t >> 64)); +} +#endif + +#if defined _MSC_VER +#define inner_gf27500_umul(lo, hi, x, y) \ + do { \ + uint64_t umul_hi; \ + (lo) = _umul128((x), (y), &umul_hi); \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf27500_umul_add(lo, hi, x, y, z) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x), (y), &umul_hi); \ + unsigned char umul_cc; \ + umul_cc = inner_gf27500_adc(0, umul_lo, (z), &umul_lo); \ + (void)inner_gf27500_adc(umul_cc, umul_hi, 0, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf27500_umul_x2(lo, hi, x1, y1, x2, y2) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x1), (y1), &umul_hi); \ + uint64_t umul_lo2, umul_hi2; \ + umul_lo2 = _umul128((x2), (y2), &umul_hi2); \ + unsigned char umul_cc; \ + umul_cc = inner_gf27500_adc(0, umul_lo, umul_lo2, &umul_lo); \ + (void)inner_gf27500_adc(umul_cc, umul_hi, umul_hi2, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#define inner_gf27500_umul_x2_add(lo, hi, x1, y1, x2, y2, z) \ + do { \ + uint64_t umul_lo, umul_hi; \ + umul_lo = _umul128((x1), (y1), &umul_hi); \ + uint64_t umul_lo2, umul_hi2; \ + umul_lo2 = _umul128((x2), (y2), &umul_hi2); \ + unsigned char umul_cc; \ + umul_cc = inner_gf27500_adc(0, umul_lo, umul_lo2, &umul_lo); \ + (void)inner_gf27500_adc(umul_cc, umul_hi, umul_hi2, &umul_hi); \ + umul_cc = inner_gf27500_adc(0, umul_lo, (z), &umul_lo); \ + (void)inner_gf27500_adc(umul_cc, umul_hi, 0, &umul_hi); \ + (lo) = umul_lo; \ + (hi) = umul_hi; \ + } while (0) +#else +#define inner_gf27500_umul(lo, hi, x, y) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x) * (unsigned __int128)(y); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf27500_umul_add(lo, hi, x, y, z) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x) * (unsigned __int128)(y) + (unsigned __int128)(uint64_t)(z); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf27500_umul_x2(lo, hi, x1, y1, x2, y2) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = \ + (unsigned __int128)(x1) * (unsigned __int128)(y1) + (unsigned __int128)(x2) * (unsigned __int128)(y2); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#define inner_gf27500_umul_x2_add(lo, hi, x1, y1, x2, y2, z) \ + do { \ + unsigned __int128 umul_tmp; \ + umul_tmp = (unsigned __int128)(x1) * (unsigned __int128)(y1) + \ + (unsigned __int128)(x2) * (unsigned __int128)(y2) + (unsigned __int128)(uint64_t)(z); \ + (lo) = (uint64_t)umul_tmp; \ + (hi) = (uint64_t)(umul_tmp >> 64); \ + } while (0) +#endif + + /* + * d <- a + b + */ + static inline void + gf27500_add(gf27500 *d, const gf27500 *a, const gf27500 *b) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, f; + unsigned char cc; + + // Raw addition. + cc = inner_gf27500_adc(0, a->v0, b->v0, &d0); + cc = inner_gf27500_adc(cc, a->v1, b->v1, &d1); + cc = inner_gf27500_adc(cc, a->v2, b->v2, &d2); + cc = inner_gf27500_adc(cc, a->v3, b->v3, &d3); + cc = inner_gf27500_adc(cc, a->v4, b->v4, &d4); + cc = inner_gf27500_adc(cc, a->v5, b->v5, &d5); + cc = inner_gf27500_adc(cc, a->v6, b->v6, &d6); + (void)inner_gf27500_adc(cc, a->v7, b->v7, &d7); + + // Sum is up to 2^506 - 2. Subtract q if the value is not lower + // than 2^505 (we subtract q by adding -q). + // Note: 0xE5 = (-27) % 256, 52 = 500 - 7*64 + f = d7 >> 57; + cc = inner_gf27500_adc(0, d0, f, &d0); + cc = inner_gf27500_adc(cc, d1, 0, &d1); + cc = inner_gf27500_adc(cc, d2, 0, &d2); + cc = inner_gf27500_adc(cc, d3, 0, &d3); + cc = inner_gf27500_adc(cc, d4, 0, &d4); + cc = inner_gf27500_adc(cc, d5, 0, &d5); + cc = inner_gf27500_adc(cc, d6, 0, &d6); + (void)inner_gf27500_adc(cc, d7, ((uint64_t)0xFE5 << 52) & -f, &d7); + + // One subtraction of q might not be enough. + f = d7 >> 57; + cc = inner_gf27500_adc(0, d0, f, &d0); + cc = inner_gf27500_adc(cc, d1, 0, &d1); + cc = inner_gf27500_adc(cc, d2, 0, &d2); + cc = inner_gf27500_adc(cc, d3, 0, &d3); + cc = inner_gf27500_adc(cc, d4, 0, &d4); + cc = inner_gf27500_adc(cc, d5, 0, &d5); + cc = inner_gf27500_adc(cc, d6, 0, &d6); + (void)inner_gf27500_adc(cc, d7, ((uint64_t)0xFE5 << 52) & -f, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + /* + * d <- a - b + */ + static inline void + gf27500_sub(gf27500 *d, const gf27500 *a, const gf27500 *b) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, m, f; + unsigned char cc; + + // Raw subtraction. + cc = inner_gf27500_sbb(0, a->v0, b->v0, &d0); + cc = inner_gf27500_sbb(cc, a->v1, b->v1, &d1); + cc = inner_gf27500_sbb(cc, a->v2, b->v2, &d2); + cc = inner_gf27500_sbb(cc, a->v3, b->v3, &d3); + cc = inner_gf27500_sbb(cc, a->v4, b->v4, &d4); + cc = inner_gf27500_sbb(cc, a->v5, b->v5, &d5); + cc = inner_gf27500_sbb(cc, a->v6, b->v6, &d6); + cc = inner_gf27500_sbb(cc, a->v7, b->v7, &d7); + + // Add 2*q if the result is negative. + // Note: 0xCA = (-2*27) % 256, 52 = 500 - 7*64 + (void)inner_gf27500_sbb(cc, 0, 0, &m); + cc = inner_gf27500_sbb(0, d0, m & 2, &d0); + cc = inner_gf27500_sbb(cc, d1, 0, &d1); + cc = inner_gf27500_sbb(cc, d2, 0, &d2); + cc = inner_gf27500_sbb(cc, d3, 0, &d3); + cc = inner_gf27500_sbb(cc, d4, 0, &d4); + cc = inner_gf27500_sbb(cc, d5, 0, &d5); + cc = inner_gf27500_sbb(cc, d6, 0, &d6); + (void)inner_gf27500_sbb(cc, d7, ((uint64_t)0xFCA << 52) & m, &d7); + + // We might have overdone it; subtract q if necessary. + // Note: 0xE5 = (-27) % 256, 52 = 500 - 7*64 + f = d7 >> 57; + cc = inner_gf27500_adc(0, d0, f, &d0); + cc = inner_gf27500_adc(cc, d1, 0, &d1); + cc = inner_gf27500_adc(cc, d2, 0, &d2); + cc = inner_gf27500_adc(cc, d3, 0, &d3); + cc = inner_gf27500_adc(cc, d4, 0, &d4); + cc = inner_gf27500_adc(cc, d5, 0, &d5); + cc = inner_gf27500_adc(cc, d6, 0, &d6); + (void)inner_gf27500_adc(cc, d7, ((uint64_t)0xFE5 << 52) & -f, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + /* + * d <- -a + */ + static inline void + gf27500_neg(gf27500 *d, const gf27500 *a) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, f; + unsigned char cc; + + // 2*q - a + cc = inner_gf27500_sbb(0, (uint64_t)0xFFFFFFFFFFFFFFFE, a->v0, &d0); + cc = inner_gf27500_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v1, &d1); + cc = inner_gf27500_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v2, &d2); + cc = inner_gf27500_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v3, &d3); + cc = inner_gf27500_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v4, &d4); + cc = inner_gf27500_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v5, &d5); + cc = inner_gf27500_sbb(cc, (uint64_t)0xFFFFFFFFFFFFFFFF, a->v6, &d6); + (void)inner_gf27500_sbb(cc, (uint64_t)0x035FFFFFFFFFFFFF, a->v7, &d7); + + // Subtract q if the value is not lower than 2^505. + f = d7 >> 57; + cc = inner_gf27500_adc(0, d0, f, &d0); + cc = inner_gf27500_adc(cc, d1, 0, &d1); + cc = inner_gf27500_adc(cc, d2, 0, &d2); + cc = inner_gf27500_adc(cc, d3, 0, &d3); + cc = inner_gf27500_adc(cc, d4, 0, &d4); + cc = inner_gf27500_adc(cc, d5, 0, &d5); + cc = inner_gf27500_adc(cc, d6, 0, &d6); + (void)inner_gf27500_adc(cc, d7, ((uint64_t)0xFE5 << 52) & -f, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + /* + * If ctl == 0x00000000, then *a0 is copied into *d. + * If ctl == 0xFFFFFFFF, then *a1 is copied into *d. + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ + static inline void + gf27500_select(gf27500 *d, const gf27500 *a0, const gf27500 *a1, uint32_t ctl) + { + uint64_t cw = (uint64_t)*(int32_t *)&ctl; + d->v0 = a0->v0 ^ (cw & (a0->v0 ^ a1->v0)); + d->v1 = a0->v1 ^ (cw & (a0->v1 ^ a1->v1)); + d->v2 = a0->v2 ^ (cw & (a0->v2 ^ a1->v2)); + d->v3 = a0->v3 ^ (cw & (a0->v3 ^ a1->v3)); + d->v4 = a0->v4 ^ (cw & (a0->v4 ^ a1->v4)); + d->v5 = a0->v5 ^ (cw & (a0->v5 ^ a1->v5)); + d->v6 = a0->v6 ^ (cw & (a0->v6 ^ a1->v6)); + d->v7 = a0->v7 ^ (cw & (a0->v7 ^ a1->v7)); + } + + /* + * If ctl == 0x00000000, then *a and *b are unchanged. + * If ctl == 0xFFFFFFFF, then the contents of *a and *b are swapped. + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ + static inline void + gf27500_cswap(gf27500 *a, gf27500 *b, uint32_t ctl) + { + uint64_t cw = (uint64_t)*(int32_t *)&ctl; + uint64_t t; + t = cw & (a->v0 ^ b->v0); + a->v0 ^= t; + b->v0 ^= t; + t = cw & (a->v1 ^ b->v1); + a->v1 ^= t; + b->v1 ^= t; + t = cw & (a->v2 ^ b->v2); + a->v2 ^= t; + b->v2 ^= t; + t = cw & (a->v3 ^ b->v3); + a->v3 ^= t; + b->v3 ^= t; + t = cw & (a->v4 ^ b->v4); + a->v4 ^= t; + b->v4 ^= t; + t = cw & (a->v5 ^ b->v5); + a->v5 ^= t; + b->v5 ^= t; + t = cw & (a->v6 ^ b->v6); + a->v6 ^= t; + b->v6 ^= t; + t = cw & (a->v7 ^ b->v7); + a->v7 ^= t; + b->v7 ^= t; + } + + /* + * d <- a/2 + */ + static inline void + gf27500_half(gf27500 *d, const gf27500 *a) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7; + + d0 = (a->v0 >> 1) | (a->v1 << 63); + d1 = (a->v1 >> 1) | (a->v2 << 63); + d2 = (a->v2 >> 1) | (a->v3 << 63); + d3 = (a->v3 >> 1) | (a->v4 << 63); + d4 = (a->v4 >> 1) | (a->v5 << 63); + d5 = (a->v5 >> 1) | (a->v6 << 63); + d6 = (a->v6 >> 1) | (a->v7 << 63); + d7 = a->v7 >> 1; + d7 += ((uint64_t)27 << 51) & -(a->v0 & 1); + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + // Inner function: 512-bit to 505-bit reduction + static inline void + inner_gf27500_partial_reduce(gf27500 *d, + uint64_t a0, + uint64_t a1, + uint64_t a2, + uint64_t a3, + uint64_t a4, + uint64_t a5, + uint64_t a6, + uint64_t a7) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, h, quo, rem; + unsigned char cc; + + // Split value in high (12 bits) and low (500 bits) parts. + h = a7 >> 52; + a7 &= 0x000FFFFFFFFFFFFF; + + // 27*2^500 = 1 mod q; hence, we add floor(h/27) + (h mod 27)*2^500 + // to the low part. + quo = (0x12F7 * h) >> 17; + rem = h - (27 * quo); + + cc = inner_gf27500_adc(0, a0, quo, &d0); + cc = inner_gf27500_adc(cc, a1, 0, &d1); + cc = inner_gf27500_adc(cc, a2, 0, &d2); + cc = inner_gf27500_adc(cc, a3, 0, &d3); + cc = inner_gf27500_adc(cc, a4, 0, &d4); + cc = inner_gf27500_adc(cc, a5, 0, &d5); + cc = inner_gf27500_adc(cc, a6, 0, &d6); + (void)inner_gf27500_adc(cc, a7, rem << 52, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + // Inner function: Normalize value *a into *d. + static inline void + inner_gf27500_normalize(gf27500 *d, const gf27500 *a) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, m; + unsigned char cc; + + // Subtract q. + cc = inner_gf27500_sbb(0, a->v0, 0xFFFFFFFFFFFFFFFF, &d0); + cc = inner_gf27500_sbb(cc, a->v1, 0xFFFFFFFFFFFFFFFF, &d1); + cc = inner_gf27500_sbb(cc, a->v2, 0xFFFFFFFFFFFFFFFF, &d2); + cc = inner_gf27500_sbb(cc, a->v3, 0xFFFFFFFFFFFFFFFF, &d3); + cc = inner_gf27500_sbb(cc, a->v4, 0xFFFFFFFFFFFFFFFF, &d4); + cc = inner_gf27500_sbb(cc, a->v5, 0xFFFFFFFFFFFFFFFF, &d5); + cc = inner_gf27500_sbb(cc, a->v6, 0xFFFFFFFFFFFFFFFF, &d6); + cc = inner_gf27500_sbb(cc, a->v7, 0x01AFFFFFFFFFFFFF, &d7); + + // Add back q if the result is negative. + (void)inner_gf27500_sbb(cc, 0, 0, &m); + cc = inner_gf27500_adc(0, d0, m, &d0); + cc = inner_gf27500_adc(cc, d1, m, &d1); + cc = inner_gf27500_adc(cc, d2, m, &d2); + cc = inner_gf27500_adc(cc, d3, m, &d3); + cc = inner_gf27500_adc(cc, d4, m, &d4); + cc = inner_gf27500_adc(cc, d5, m, &d5); + cc = inner_gf27500_adc(cc, d6, m, &d6); + (void)inner_gf27500_adc(cc, d7, m & 0x01AFFFFFFFFFFFFF, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + /* + * d <- 2*a + */ + static inline void + gf27500_mul2(gf27500 *d, const gf27500 *a) + { + gf27500_add(d, a, a); + } + + /* + * d <- a*x + * (multiplication by a 32-bit integer) + */ + static inline void + gf27500_mul_small(gf27500 *d, const gf27500 *a, uint32_t x) + { + uint64_t d0, d1, d2, d3, d4, d5, d6, d7, d8; + uint64_t lo, hi, b, h, quo, rem; + unsigned char cc; + + // Product over the integers. Top output word (d6) is at most 31 bits. + b = (uint64_t)x; + inner_gf27500_umul(d0, d1, a->v0, b); + inner_gf27500_umul(d2, d3, a->v2, b); + inner_gf27500_umul(d4, d5, a->v4, b); + inner_gf27500_umul(d6, d7, a->v6, b); + + inner_gf27500_umul(lo, hi, a->v1, b); + cc = inner_gf27500_adc(0, d1, lo, &d1); + cc = inner_gf27500_adc(cc, d2, hi, &d2); + inner_gf27500_umul(lo, hi, a->v3, b); + cc = inner_gf27500_adc(cc, d3, lo, &d3); + cc = inner_gf27500_adc(cc, d4, hi, &d4); + inner_gf27500_umul(lo, hi, a->v5, b); + cc = inner_gf27500_adc(cc, d5, lo, &d5); + cc = inner_gf27500_adc(cc, d6, hi, &d6); + inner_gf27500_umul(lo, d8, a->v7, b); + cc = inner_gf27500_adc(cc, d7, lo, &d7); + (void)inner_gf27500_adc(cc, d8, 0, &d8); + + // Extract low 500-bit part, and the high part (at most 35 bits). + h = (d8 << 12) | (d7 >> 52); + d7 &= 0x000FFFFFFFFFFFFF; + + // Fold h by adding floor(h/65) + (h mod 65)*2^376 to the low part. + inner_gf27500_umul(lo, hi, h, 0x97B425ED097B425F); + quo = hi >> 4; + rem = h - (27 * quo); + + cc = inner_gf27500_adc(cc, d0, quo, &d0); + cc = inner_gf27500_adc(cc, d1, 0, &d1); + cc = inner_gf27500_adc(cc, d2, 0, &d2); + cc = inner_gf27500_adc(cc, d3, 0, &d3); + cc = inner_gf27500_adc(cc, d4, 0, &d4); + cc = inner_gf27500_adc(cc, d5, 0, &d5); + cc = inner_gf27500_adc(cc, d6, 0, &d6); + (void)inner_gf27500_adc(cc, d7, rem << 52, &d7); + + d->v0 = d0; + d->v1 = d1; + d->v2 = d2; + d->v3 = d3; + d->v4 = d4; + d->v5 = d5; + d->v6 = d6; + d->v7 = d7; + } + + /* + * d <- x + * Input value x (32-bit integer) is converted to field element x mod q. + */ + static inline void + gf27500_set_small(gf27500 *d, uint32_t x) + { + // We want Montgomery representation, i.e. x*2^512 mod q. + // We set h = x*2^12; then: + // x*2^512 = h*2^500 + // = (h mod 27)*2^500 + floor(h/27)*27*2^500 + // = (h mod 27)*2^500 + floor(h/27) mod q + // by using the fact that 27*2^500 = 1 mod q. + uint64_t h, lo, hi, quo, rem; + h = (uint64_t)x << 12; + inner_gf27500_umul(lo, hi, h, 0x97B425ED097B425F); + (void)lo; + quo = hi >> 4; + rem = h - (27 * quo); + + d->v0 = quo; + d->v1 = 0; + d->v2 = 0; + d->v3 = 0; + d->v4 = 0; + d->v5 = 0; + d->v6 = 0; + d->v7 = rem << 52; + } + + // Inner function: d <- a/2^512, with normalization to [0..q-1]. + static inline void + inner_gf27500_montgomery_reduce(gf27500 *d, const gf27500 *a) + { + uint64_t x0, x1, x2, x3, x4, x5, x6, x7; + uint64_t f0, f1, f2, f3, f4, f5, f6, f7; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15; + uint64_t d0, d1, d2, d3, d4, d5, d6, d7; + uint64_t hi, t, w; + unsigned char cc; + + // Let m = -1/q mod 2^512 = 27*2^500 + 1 + // For input x, we compute f = x*m mod 2^512, then + // h = x + f*q, which is a multiple of 2^512. The output + // is then h/2^512. + // Since x < 2^512, we have: + // h <= 2^512 - 1 + (2^512 - 1)*q + // h <= q*2^512 + 2^512 - q - 1 + // Since h = 0 mod 2^512, this implies that h <= q*2^512. + // The output h/2^512 is therefore between 0 and q (inclusive). + + x0 = a->v0; + x1 = a->v1; + x2 = a->v2; + x3 = a->v3; + x4 = a->v4; + x5 = a->v5; + x6 = a->v6; + x7 = a->v7; + + // f = x*(-1/q) mod 2^500 + f0 = x0; + f1 = x1; + f2 = x2; + f3 = x3; + f4 = x4; + f5 = x5; + f6 = x6; + f7 = x7 + ((x0 * 27) << 52); + + // g = f*q + inner_gf27500_umul(g7, hi, f0, (uint64_t)27 << 52); + inner_gf27500_umul_add(g8, hi, f1, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g9, hi, f2, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g10, hi, f3, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g11, hi, f4, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g12, hi, f5, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g13, hi, f6, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g14, g15, f7, (uint64_t)27 << 52, hi); + + cc = inner_gf27500_sbb(0, 0, f0, &g0); + cc = inner_gf27500_sbb(cc, 0, f1, &g1); + cc = inner_gf27500_sbb(cc, 0, f2, &g2); + cc = inner_gf27500_sbb(cc, 0, f3, &g3); + cc = inner_gf27500_sbb(cc, 0, f4, &g4); + cc = inner_gf27500_sbb(cc, 0, f5, &g5); + cc = inner_gf27500_sbb(cc, 0, f6, &g6); + cc = inner_gf27500_sbb(cc, g7, f7, &g7); + cc = inner_gf27500_sbb(cc, g8, 0, &g8); + cc = inner_gf27500_sbb(cc, g9, 0, &g9); + cc = inner_gf27500_sbb(cc, g10, 0, &g10); + cc = inner_gf27500_sbb(cc, g11, 0, &g11); + cc = inner_gf27500_sbb(cc, g12, 0, &g12); + cc = inner_gf27500_sbb(cc, g13, 0, &g13); + cc = inner_gf27500_sbb(cc, g14, 0, &g14); + (void)inner_gf27500_sbb(cc, g15, 0, &g15); + + // h = x + f*q (we drop the low 512 bits). + cc = inner_gf27500_adc(0, g0, x0, &x0); + cc = inner_gf27500_adc(cc, g1, x1, &x1); + cc = inner_gf27500_adc(cc, g2, x2, &x2); + cc = inner_gf27500_adc(cc, g3, x3, &x3); + cc = inner_gf27500_adc(cc, g4, x4, &x4); + cc = inner_gf27500_adc(cc, g5, x5, &x5); + cc = inner_gf27500_adc(cc, g6, x6, &x6); + cc = inner_gf27500_adc(cc, g7, x7, &x7); + cc = inner_gf27500_adc(cc, g8, 0, &d0); + cc = inner_gf27500_adc(cc, g9, 0, &d1); + cc = inner_gf27500_adc(cc, g10, 0, &d2); + cc = inner_gf27500_adc(cc, g11, 0, &d3); + cc = inner_gf27500_adc(cc, g12, 0, &d4); + cc = inner_gf27500_adc(cc, g13, 0, &d5); + cc = inner_gf27500_adc(cc, g14, 0, &d6); + (void)inner_gf27500_adc(cc, g15, 0, &d7); + + // Normalize: if h = q, replace it with zero. + t = d0 & d1 & d2 & d3 & d4 & d5 & d6 & (d7 ^ ~(uint64_t)0x01AFFFFFFFFFFFFF); + cc = inner_gf27500_adc(0, t, 1, &t); + (void)inner_gf27500_sbb(cc, 0, 0, &w); + w = ~w; + d->v0 = d0 & w; + d->v1 = d1 & w; + d->v2 = d2 & w; + d->v3 = d3 & w; + d->v4 = d4 & w; + d->v5 = d5 & w; + d->v6 = d6 & w; + d->v7 = d7 & w; + } + + /* + * d <- a*b + */ + static inline void + gf27500_mul(gf27500 *d, const gf27500 *a, const gf27500 *b) + { + uint64_t e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15; + uint64_t f0, f1, f2, f3, f4, f5, f6, f7; + uint64_t lo, hi, lo2, hi2; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15; + unsigned char cc; + + // Multiplication over integers. + // 8 mul + inner_gf27500_umul(e0, e1, a->v0, b->v0); + inner_gf27500_umul(e2, e3, a->v1, b->v1); + inner_gf27500_umul(e4, e5, a->v2, b->v2); + inner_gf27500_umul(e6, e7, a->v3, b->v3); + inner_gf27500_umul(e8, e9, a->v4, b->v4); + inner_gf27500_umul(e10, e11, a->v5, b->v5); + inner_gf27500_umul(e12, e13, a->v6, b->v6); + inner_gf27500_umul(e14, e15, a->v7, b->v7); + + // + 7 mul = 15 + inner_gf27500_umul(lo, hi, a->v0, b->v1); + cc = inner_gf27500_adc(0, e1, lo, &e1); + cc = inner_gf27500_adc(cc, e2, hi, &e2); + inner_gf27500_umul(lo, hi, a->v0, b->v3); + cc = inner_gf27500_adc(cc, e3, lo, &e3); + cc = inner_gf27500_adc(cc, e4, hi, &e4); + inner_gf27500_umul(lo, hi, a->v0, b->v5); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v0, b->v7); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v2, b->v7); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + inner_gf27500_umul(lo, hi, a->v4, b->v7); + cc = inner_gf27500_adc(cc, e11, lo, &e11); + cc = inner_gf27500_adc(cc, e12, hi, &e12); + inner_gf27500_umul(lo, hi, a->v6, b->v7); + cc = inner_gf27500_adc(cc, e13, lo, &e13); + cc = inner_gf27500_adc(cc, e14, hi, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 7 mul = 22 + inner_gf27500_umul(lo, hi, a->v1, b->v0); + cc = inner_gf27500_adc(0, e1, lo, &e1); + cc = inner_gf27500_adc(cc, e2, hi, &e2); + inner_gf27500_umul(lo, hi, a->v3, b->v0); + cc = inner_gf27500_adc(cc, e3, lo, &e3); + cc = inner_gf27500_adc(cc, e4, hi, &e4); + inner_gf27500_umul(lo, hi, a->v5, b->v0); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v7, b->v0); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v7, b->v2); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + inner_gf27500_umul(lo, hi, a->v7, b->v4); + cc = inner_gf27500_adc(cc, e11, lo, &e11); + cc = inner_gf27500_adc(cc, e12, hi, &e12); + inner_gf27500_umul(lo, hi, a->v7, b->v6); + cc = inner_gf27500_adc(cc, e13, lo, &e13); + cc = inner_gf27500_adc(cc, e14, hi, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 6 mul = 28 + inner_gf27500_umul(lo, hi, a->v0, b->v2); + cc = inner_gf27500_adc(0, e2, lo, &e2); + cc = inner_gf27500_adc(cc, e3, hi, &e3); + inner_gf27500_umul(lo, hi, a->v0, b->v4); + cc = inner_gf27500_adc(cc, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v0, b->v6); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v1, b->v7); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v3, b->v7); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + inner_gf27500_umul(lo, hi, a->v5, b->v7); + cc = inner_gf27500_adc(cc, e12, lo, &e12); + cc = inner_gf27500_adc(cc, e13, hi, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 6 mul = 34 + inner_gf27500_umul(lo, hi, a->v2, b->v0); + cc = inner_gf27500_adc(0, e2, lo, &e2); + cc = inner_gf27500_adc(cc, e3, hi, &e3); + inner_gf27500_umul(lo, hi, a->v4, b->v0); + cc = inner_gf27500_adc(cc, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v6, b->v0); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v7, b->v1); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v7, b->v3); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + inner_gf27500_umul(lo, hi, a->v7, b->v5); + cc = inner_gf27500_adc(cc, e12, lo, &e12); + cc = inner_gf27500_adc(cc, e13, hi, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 5 mul = 39 + inner_gf27500_umul(lo, hi, a->v1, b->v2); + cc = inner_gf27500_adc(cc, e3, lo, &e3); + cc = inner_gf27500_adc(cc, e4, hi, &e4); + inner_gf27500_umul(lo, hi, a->v1, b->v4); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v1, b->v6); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v3, b->v6); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + inner_gf27500_umul(lo, hi, a->v5, b->v6); + cc = inner_gf27500_adc(cc, e11, lo, &e11); + cc = inner_gf27500_adc(cc, e12, hi, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 5 mul = 44 + inner_gf27500_umul(lo, hi, a->v2, b->v1); + cc = inner_gf27500_adc(cc, e3, lo, &e3); + cc = inner_gf27500_adc(cc, e4, hi, &e4); + inner_gf27500_umul(lo, hi, a->v4, b->v1); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v6, b->v1); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v6, b->v3); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + inner_gf27500_umul(lo, hi, a->v6, b->v5); + cc = inner_gf27500_adc(cc, e11, lo, &e11); + cc = inner_gf27500_adc(cc, e12, hi, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 4 mul = 48 + inner_gf27500_umul(lo, hi, a->v1, b->v3); + cc = inner_gf27500_adc(cc, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v1, b->v5); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v3, b->v5); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v4, b->v6); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 4 mul = 52 + inner_gf27500_umul(lo, hi, a->v3, b->v1); + cc = inner_gf27500_adc(cc, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v5, b->v1); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v5, b->v3); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v6, b->v4); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 3 mul = 55 + inner_gf27500_umul(lo, hi, a->v2, b->v3); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v2, b->v5); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v4, b->v5); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + cc = inner_gf27500_adc(cc, e11, 0, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 3 mul = 58 + inner_gf27500_umul(lo, hi, a->v3, b->v2); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v5, b->v2); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v5, b->v4); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + cc = inner_gf27500_adc(cc, e11, 0, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 2 mul = 60 + inner_gf27500_umul(lo, hi, a->v2, b->v4); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v2, b->v6); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + cc = inner_gf27500_adc(cc, e10, 0, &e10); + cc = inner_gf27500_adc(cc, e11, 0, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 2 mul = 62 + inner_gf27500_umul(lo, hi, a->v4, b->v2); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v6, b->v2); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + cc = inner_gf27500_adc(cc, e10, 0, &e10); + cc = inner_gf27500_adc(cc, e11, 0, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // + 2 mul = 64 + inner_gf27500_umul(lo, hi, a->v3, b->v4); + inner_gf27500_umul(lo2, hi2, a->v4, b->v3); + cc = inner_gf27500_adc(0, lo, lo2, &lo); + cc = inner_gf27500_adc(cc, hi, hi2, &hi); + cc = inner_gf27500_adc(cc, 0, 0, &hi2); + assert(cc == 0); + cc = inner_gf27500_adc(0, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + cc = inner_gf27500_adc(cc, e9, hi2, &e9); + cc = inner_gf27500_adc(cc, e10, 0, &e10); + cc = inner_gf27500_adc(cc, e11, 0, &e11); + cc = inner_gf27500_adc(cc, e12, 0, &e12); + cc = inner_gf27500_adc(cc, e13, 0, &e13); + cc = inner_gf27500_adc(cc, e14, 0, &e14); + cc = inner_gf27500_adc(cc, e15, 0, &e15); + assert(cc == 0); + + // Montgomery reduction. + // + // Low part is lo(e) = e0..e7 (512 bits). + // Let m = -1/q mod 2^512; we add (lo(e)*m mod 2^512)*q to the + // high part g = e8..e15 (498 bits). + // + // We have m = 27*2^500 + 1. + f0 = e0; + f1 = e1; + f2 = e2; + f3 = e3; + f4 = e4; + f5 = e5; + f6 = e6; + f7 = e7 + ((e0 * 27) << 52); + + // g = f*q + inner_gf27500_umul(g7, hi, f0, (uint64_t)27 << 52); + inner_gf27500_umul_add(g8, hi, f1, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g9, hi, f2, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g10, hi, f3, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g11, hi, f4, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g12, hi, f5, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g13, hi, f6, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g14, g15, f7, (uint64_t)27 << 52, hi); + + cc = inner_gf27500_sbb(0, 0, f0, &g0); + cc = inner_gf27500_sbb(cc, 0, f1, &g1); + cc = inner_gf27500_sbb(cc, 0, f2, &g2); + cc = inner_gf27500_sbb(cc, 0, f3, &g3); + cc = inner_gf27500_sbb(cc, 0, f4, &g4); + cc = inner_gf27500_sbb(cc, 0, f5, &g5); + cc = inner_gf27500_sbb(cc, 0, f6, &g6); + cc = inner_gf27500_sbb(cc, g7, f7, &g7); + cc = inner_gf27500_sbb(cc, g8, 0, &g8); + cc = inner_gf27500_sbb(cc, g9, 0, &g9); + cc = inner_gf27500_sbb(cc, g10, 0, &g10); + cc = inner_gf27500_sbb(cc, g11, 0, &g11); + cc = inner_gf27500_sbb(cc, g12, 0, &g12); + cc = inner_gf27500_sbb(cc, g13, 0, &g13); + cc = inner_gf27500_sbb(cc, g14, 0, &g14); + (void)inner_gf27500_sbb(cc, g15, 0, &g15); + + // Add g = f*q to e0..e11. + // Since e0..e15 < 2^1010 and f < 2^512, we know that the result + // is less than 2^1010 + 2^512*27*2^500, which is less than 2^1017. + // This is also a multiple of 2^512. We divide by 2^512 by simply + // dropping the low 512 bits (which are all equal to zero), and + // the result is less than 2**505 + cc = inner_gf27500_adc(0, g0, e0, &e0); + cc = inner_gf27500_adc(cc, g1, e1, &e1); + cc = inner_gf27500_adc(cc, g2, e2, &e2); + cc = inner_gf27500_adc(cc, g3, e3, &e3); + cc = inner_gf27500_adc(cc, g4, e4, &e4); + cc = inner_gf27500_adc(cc, g5, e5, &e5); + cc = inner_gf27500_adc(cc, g6, e6, &e6); + cc = inner_gf27500_adc(cc, g7, e7, &e7); + cc = inner_gf27500_adc(cc, g8, e8, &e8); + cc = inner_gf27500_adc(cc, g9, e9, &e9); + cc = inner_gf27500_adc(cc, g10, e10, &e10); + cc = inner_gf27500_adc(cc, g11, e11, &e11); + cc = inner_gf27500_adc(cc, g12, e12, &e12); + cc = inner_gf27500_adc(cc, g13, e13, &e13); + cc = inner_gf27500_adc(cc, g14, e14, &e14); + cc = inner_gf27500_adc(cc, g15, e15, &e15); + assert(cc == 0); + + d->v0 = e8; + d->v1 = e9; + d->v2 = e10; + d->v3 = e11; + d->v4 = e12; + d->v5 = e13; + d->v6 = e14; + d->v7 = e15; + } + + /* + * d <- a^2 + */ + static inline void + gf27500_square(gf27500 *d, const gf27500 *a) + { + uint64_t e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15; + uint64_t f0, f1, f2, f3, f4, f5, f6, f7; + uint64_t lo, hi; + uint64_t g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15; + unsigned char cc; + + // Squaring over integers. + // 7 mul + inner_gf27500_umul(e1, e2, a->v0, a->v1); + inner_gf27500_umul(e3, e4, a->v0, a->v3); + inner_gf27500_umul(e5, e6, a->v0, a->v5); + inner_gf27500_umul(e7, e8, a->v0, a->v7); + inner_gf27500_umul(e9, e10, a->v2, a->v7); + inner_gf27500_umul(e11, e12, a->v4, a->v7); + inner_gf27500_umul(e13, e14, a->v6, a->v7); + + // + 6 = 13 mul + inner_gf27500_umul(lo, hi, a->v0, a->v2); + cc = inner_gf27500_adc(0, e2, lo, &e2); + cc = inner_gf27500_adc(cc, e3, hi, &e3); + inner_gf27500_umul(lo, hi, a->v0, a->v4); + cc = inner_gf27500_adc(cc, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v0, a->v6); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v1, a->v7); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v3, a->v7); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + inner_gf27500_umul(lo, hi, a->v5, a->v7); + cc = inner_gf27500_adc(cc, e12, lo, &e12); + cc = inner_gf27500_adc(cc, e13, hi, &e13); + (void)inner_gf27500_adc(cc, e14, 0, &e14); + + // + 5 = 18 mul + inner_gf27500_umul(lo, hi, a->v1, a->v2); + cc = inner_gf27500_adc(0, e3, lo, &e3); + cc = inner_gf27500_adc(cc, e4, hi, &e4); + inner_gf27500_umul(lo, hi, a->v1, a->v4); + cc = inner_gf27500_adc(cc, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v1, a->v6); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v3, a->v6); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + inner_gf27500_umul(lo, hi, a->v5, a->v6); + cc = inner_gf27500_adc(cc, e11, lo, &e11); + cc = inner_gf27500_adc(cc, e12, hi, &e12); + (void)inner_gf27500_adc(cc, e13, 0, &e13); + + // + 4 = 22 mul + inner_gf27500_umul(lo, hi, a->v1, a->v3); + cc = inner_gf27500_adc(0, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v1, a->v5); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v2, a->v6); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v4, a->v6); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + (void)inner_gf27500_adc(cc, e12, 0, &e12); + + // + 3 = 25 mul + inner_gf27500_umul(lo, hi, a->v2, a->v3); + cc = inner_gf27500_adc(0, e5, lo, &e5); + cc = inner_gf27500_adc(cc, e6, hi, &e6); + inner_gf27500_umul(lo, hi, a->v2, a->v5); + cc = inner_gf27500_adc(cc, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + inner_gf27500_umul(lo, hi, a->v4, a->v5); + cc = inner_gf27500_adc(cc, e9, lo, &e9); + cc = inner_gf27500_adc(cc, e10, hi, &e10); + (void)inner_gf27500_adc(cc, e11, 0, &e11); + + // + 2 = 27 mul + inner_gf27500_umul(lo, hi, a->v2, a->v4); + cc = inner_gf27500_adc(0, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v3, a->v5); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + (void)inner_gf27500_adc(cc, e10, 0, &e10); + + // + 1 = 28 mul + inner_gf27500_umul(lo, hi, a->v3, a->v4); + cc = inner_gf27500_adc(0, e7, lo, &e7); + cc = inner_gf27500_adc(cc, e8, hi, &e8); + (void)inner_gf27500_adc(cc, e9, 0, &e9); + + // Multiplication by two for all off diagonal + // terms + e15 = e14 >> 63; + e14 = (e14 << 1) | (e13 >> 63); + e13 = (e13 << 1) | (e12 >> 63); + e12 = (e12 << 1) | (e11 >> 63); + e11 = (e11 << 1) | (e10 >> 63); + e10 = (e10 << 1) | (e9 >> 63); + e9 = (e9 << 1) | (e8 >> 63); + e8 = (e8 << 1) | (e7 >> 63); + e7 = (e7 << 1) | (e6 >> 63); + e6 = (e6 << 1) | (e5 >> 63); + e5 = (e5 << 1) | (e4 >> 63); + e4 = (e4 << 1) | (e3 >> 63); + e3 = (e3 << 1) | (e2 >> 63); + e2 = (e2 << 1) | (e1 >> 63); + e1 = e1 << 1; + + // + 8 = 36 mul (diagonal terms) + inner_gf27500_umul(e0, hi, a->v0, a->v0); + cc = inner_gf27500_adc(0, e1, hi, &e1); + inner_gf27500_umul(lo, hi, a->v1, a->v1); + cc = inner_gf27500_adc(cc, e2, lo, &e2); + cc = inner_gf27500_adc(cc, e3, hi, &e3); + inner_gf27500_umul(lo, hi, a->v2, a->v2); + cc = inner_gf27500_adc(cc, e4, lo, &e4); + cc = inner_gf27500_adc(cc, e5, hi, &e5); + inner_gf27500_umul(lo, hi, a->v3, a->v3); + cc = inner_gf27500_adc(cc, e6, lo, &e6); + cc = inner_gf27500_adc(cc, e7, hi, &e7); + inner_gf27500_umul(lo, hi, a->v4, a->v4); + cc = inner_gf27500_adc(cc, e8, lo, &e8); + cc = inner_gf27500_adc(cc, e9, hi, &e9); + inner_gf27500_umul(lo, hi, a->v5, a->v5); + cc = inner_gf27500_adc(cc, e10, lo, &e10); + cc = inner_gf27500_adc(cc, e11, hi, &e11); + inner_gf27500_umul(lo, hi, a->v6, a->v6); + cc = inner_gf27500_adc(cc, e12, lo, &e12); + cc = inner_gf27500_adc(cc, e13, hi, &e13); + inner_gf27500_umul(lo, hi, a->v7, a->v7); + cc = inner_gf27500_adc(cc, e14, lo, &e14); + (void)inner_gf27500_adc(cc, e15, hi, &e15); + + // Montgomery reduction. + // + // Low part is lo(e) = e0..e7 (512 bits). + // Let m = -1/q mod 2^512; we add (lo(e)*m mod 2^512)*q to the + // high part g = e8..e15 (498 bits). + // + // We have m = 27*2^500 + 1. + f0 = e0; + f1 = e1; + f2 = e2; + f3 = e3; + f4 = e4; + f5 = e5; + f6 = e6; + f7 = e7 + ((e0 * 27) << 52); + + // g = f*q + inner_gf27500_umul(g7, hi, f0, (uint64_t)27 << 52); + inner_gf27500_umul_add(g8, hi, f1, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g9, hi, f2, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g10, hi, f3, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g11, hi, f4, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g12, hi, f5, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g13, hi, f6, (uint64_t)27 << 52, hi); + inner_gf27500_umul_add(g14, g15, f7, (uint64_t)27 << 52, hi); + + cc = inner_gf27500_sbb(0, 0, f0, &g0); + cc = inner_gf27500_sbb(cc, 0, f1, &g1); + cc = inner_gf27500_sbb(cc, 0, f2, &g2); + cc = inner_gf27500_sbb(cc, 0, f3, &g3); + cc = inner_gf27500_sbb(cc, 0, f4, &g4); + cc = inner_gf27500_sbb(cc, 0, f5, &g5); + cc = inner_gf27500_sbb(cc, 0, f6, &g6); + cc = inner_gf27500_sbb(cc, g7, f7, &g7); + cc = inner_gf27500_sbb(cc, g8, 0, &g8); + cc = inner_gf27500_sbb(cc, g9, 0, &g9); + cc = inner_gf27500_sbb(cc, g10, 0, &g10); + cc = inner_gf27500_sbb(cc, g11, 0, &g11); + cc = inner_gf27500_sbb(cc, g12, 0, &g12); + cc = inner_gf27500_sbb(cc, g13, 0, &g13); + cc = inner_gf27500_sbb(cc, g14, 0, &g14); + (void)inner_gf27500_sbb(cc, g15, 0, &g15); + + // Add g = f*q to e0..e11. + // Since e0..e15 < 2^1010 and f < 2^512, we know that the result + // is less than 2^1010 + 2^512*27*2^500, which is less than 2^1017. + // This is also a multiple of 2^512. We divide by 2^512 by simply + // dropping the low 512 bits (which are all equal to zero), and + // the result is less than 2**505 + cc = inner_gf27500_adc(0, g0, e0, &e0); + cc = inner_gf27500_adc(cc, g1, e1, &e1); + cc = inner_gf27500_adc(cc, g2, e2, &e2); + cc = inner_gf27500_adc(cc, g3, e3, &e3); + cc = inner_gf27500_adc(cc, g4, e4, &e4); + cc = inner_gf27500_adc(cc, g5, e5, &e5); + cc = inner_gf27500_adc(cc, g6, e6, &e6); + cc = inner_gf27500_adc(cc, g7, e7, &e7); + cc = inner_gf27500_adc(cc, g8, e8, &e8); + cc = inner_gf27500_adc(cc, g9, e9, &e9); + cc = inner_gf27500_adc(cc, g10, e10, &e10); + cc = inner_gf27500_adc(cc, g11, e11, &e11); + cc = inner_gf27500_adc(cc, g12, e12, &e12); + cc = inner_gf27500_adc(cc, g13, e13, &e13); + cc = inner_gf27500_adc(cc, g14, e14, &e14); + cc = inner_gf27500_adc(cc, g15, e15, &e15); + assert(cc == 0); + + d->v0 = e8; + d->v1 = e9; + d->v2 = e10; + d->v3 = e11; + d->v4 = e12; + d->v5 = e13; + d->v6 = e14; + d->v7 = e15; + } + + /* + * d <- a^(2^n) + * This computes n successive squarings of value a, with result in d. + * n == 0 is a valid input (in that case, *a is copied into *d). + * This function is not constant-time with regard to n: the number of + * successive squarings may be observable through timing-based side channels. + */ + static inline void + gf27500_xsquare(gf27500 *d, const gf27500 *a, unsigned n) + { + if (n == 0) { + *d = *a; + return; + } + gf27500_square(d, a); + while (n-- > 1) { + gf27500_square(d, d); + } + } + + /* + * Returns 0xFFFFFFFF if *a is zero; otherwise, 0x00000000 is returned. + */ + static inline uint32_t + gf27500_iszero(const gf27500 *a) + { + uint64_t a0, a1, a2, a3, a4, a5, a6, a7, t0, t1, r; + + // Zero can be represented by 0 or by q. + a0 = a->v0; + a1 = a->v1; + a2 = a->v2; + a3 = a->v3; + a4 = a->v4; + a5 = a->v5; + a6 = a->v6; + a7 = a->v7; + + t0 = a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7; + t1 = ~a0 | ~a1 | ~a2 | ~a3 | ~a4 | ~a5 | ~a6 | (a7 ^ 0x01AFFFFFFFFFFFFF); + + // Top bit of r is 0 if and only if one of t0 or t1 is zero. + r = (t0 | -t0) & (t1 | -t1); + return (uint32_t)(r >> 63) - 1; + } + + /* + * Returns 0xFFFFFFFF if *a and *b represent the same field element; + * otherwise, 0x00000000 is returned. + */ + static inline uint32_t + gf27500_equals(const gf27500 *a, const gf27500 *b) + { + gf27500 d; + gf27500_sub(&d, a, b); + return gf27500_iszero(&d); + } + + /* + * d <- 1/a + * If *a is not zero, then the inverse is well-defined and written into *d, + * and the function returns 0xFFFFFFFF. If *a is zero, then this function + * sets *d to zero and returns 0x00000000. + */ + uint32_t gf27500_invert(gf27500 *d, const gf27500 *a); + + /* + * d <- a/b + * If *b is not zero, then this functions writes a/b into *d, and returns + * 0xFFFFFFFF. If *b is zero, then this function sets *d to zero (regardless + * of the value of *a) and returns 0x00000000. + */ + uint32_t gf27500_div(gf27500 *d, const gf27500 *a, const gf27500 *b); + + /* + * d <- a/3 + * Divides by 3 in the field by implementing the algorithm proposed in + * "Efficient Multiplication in Finite Field Extensions of Degree 5" + * by El Mrabet, Guillevic and Ionica at ASIACRYPT 2011. + */ + void gf27500_div3(gf27500 *out, const gf27500 *a); + + /* + * Get the Legendre symbol of *a (0 for zero, +1 for a non-zero square, + * -1 for a non-square). + */ + int32_t gf27500_legendre(const gf27500 *a); + + /* + * If *a is a square, then this function sets *d to a square root of a, + * and returns 0xFFFFFFFF. If *a is not a square, then this function + * sets *d to a square root of -a, and returns 0x00000000. + * In all cases, the value written into *d is such that the least significant + * bit of its integer representation (in [0..q-1]) is zero. + */ + uint32_t gf27500_sqrt(gf27500 *d, const gf27500 *a); + + /* + * Encode field element *a into buffer dst (exactly 64 bytes are written). + */ + void gf27500_encode(void *dst, const gf27500 *a); + + /* + * Decode source buffer src (exactly 64 bytes) into a field element *d. + * If the source value is not a valid canonical encoding, then *d is zero + * and the function returns 0x00000000; otherwise, the function returns + * 0xFFFFFFFF. + */ + uint32_t gf27500_decode(gf27500 *d, const void *src); + + /* + * Interpret the source buffer (of size len bytes) as an unsigned integer + * (little-endian convention) and reduce it modulo q, yielding a field + * element which is written into *d. Since reduction is applied, this + * function cannot fail. + */ + void gf27500_decode_reduce(gf27500 *d, const void *src, size_t len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/gf/broadwell/lvl5/test/CMakeLists.txt b/src/gf/broadwell/lvl5/test/CMakeLists.txt new file mode 100644 index 0000000..316e0a8 --- /dev/null +++ b/src/gf/broadwell/lvl5/test/CMakeLists.txt @@ -0,0 +1 @@ +include(../../lvlx_test.cmake) diff --git a/src/gf/broadwell/lvlx.cmake b/src/gf/broadwell/lvlx.cmake new file mode 100644 index 0000000..3ab2d2d --- /dev/null +++ b/src/gf/broadwell/lvlx.cmake @@ -0,0 +1,12 @@ +set(SOURCE_FILES_GF_${SVARIANT_UPPER}_BROADWELL + ${SOURCE_FILES_GF_SPECIFIC} + fp.c + ${LVLX_DIR}/fp2.c +) + +add_library(${LIB_GF_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_GF_${SVARIANT_UPPER}_BROADWELL}) +target_include_directories(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} include ${INC_PUBLIC}) +target_compile_options(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_compile_definitions(${LIB_GF_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + +add_subdirectory(test) diff --git a/src/gf/broadwell/lvlx/fp2.c b/src/gf/broadwell/lvlx/fp2.c new file mode 100644 index 0000000..3269f6c --- /dev/null +++ b/src/gf/broadwell/lvlx/fp2.c @@ -0,0 +1,188 @@ +#include "fp2.h" +#include +#include + +/* Arithmetic modulo X^2 + 1 */ + +void +fp2_encode(void *dst, const fp2_t *a) +{ + uint8_t *buf = dst; + fp_encode(buf, &(a->re)); + fp_encode(buf + FP_ENCODED_BYTES, &(a->im)); +} + +uint32_t +fp2_decode(fp2_t *d, const void *src) +{ + const uint8_t *buf = src; + uint32_t re, im; + + re = fp_decode(&(d->re), buf); + im = fp_decode(&(d->im), buf + FP_ENCODED_BYTES); + return re & im; +} + +void +fp2_inv(fp2_t *x) +{ + fp_t t0, t1; + + fp_sqr(&t0, &(x->re)); + fp_sqr(&t1, &(x->im)); + fp_add(&t0, &t0, &t1); + fp_inv(&t0); + fp_mul(&(x->re), &(x->re), &t0); + fp_mul(&(x->im), &(x->im), &t0); + fp_neg(&(x->im), &(x->im)); +} + +void +fp2_batched_inv(fp2_t *x, int len) +{ + fp2_t t1[len], t2[len]; + fp2_t inverse; + + // x = x0,...,xn + // t1 = x0, x0*x1, ... ,x0 * x1 * ... * xn + t1[0] = x[0]; + for (int i = 1; i < len; i++) { + fp2_mul(&t1[i], &t1[i - 1], &x[i]); + } + + // inverse = 1/ (x0 * x1 * ... * xn) + inverse = t1[len - 1]; + fp2_inv(&inverse); + t2[0] = inverse; + + // t2 = 1/ (x0 * x1 * ... * xn), 1/ (x0 * x1 * ... * x(n-1)) , ... , 1/xO + for (int i = 1; i < len; i++) { + fp2_mul(&t2[i], &t2[i - 1], &x[len - i]); + } + + x[0] = t2[len - 1]; + for (int i = 1; i < len; i++) { + fp2_mul(&x[i], &t1[i - 1], &t2[len - i - 1]); + } +} + +uint32_t +fp2_is_square(const fp2_t *x) +{ + fp_t t0, t1; + + fp_sqr(&t0, &(x->re)); + fp_sqr(&t1, &(x->im)); + fp_add(&t0, &t0, &t1); + + return fp_is_square(&t0); +} + +void +fp2_sqrt(fp2_t *a) +{ + fp_t x0, x1, t0, t1; + + /* From "Optimized One-Dimensional SQIsign Verification on Intel and + * Cortex-M4" by Aardal et al: https://eprint.iacr.org/2024/1563 */ + + // x0 = \delta = sqrt(a0^2 + a1^2). + fp_sqr(&x0, &(a->re)); + fp_sqr(&x1, &(a->im)); + fp_add(&x0, &x0, &x1); + fp_sqrt(&x0); + // If a1 = 0, there is a risk of \delta = -a0, which makes x0 = 0 below. + // In that case, we restore the value \delta = a0. + fp_select(&x0, &x0, &(a->re), fp_is_zero(&(a->im))); + // x0 = \delta + a0, t0 = 2 * x0. + fp_add(&x0, &x0, &(a->re)); + fp_add(&t0, &x0, &x0); + // x1 = t0^(p-3)/4. + fp_copy(&x1, &t0); + fp_exp3div4(&x1); + // x0 = x0 * x1, x1 = x1 * a1, t1 = (2x0)^2. + fp_mul(&x0, &x0, &x1); + fp_mul(&x1, &x1, &(a->im)); + fp_add(&t1, &x0, &x0); + fp_sqr(&t1, &t1); + // If t1 = t0, return x0 + x1*i, otherwise x1 - x0*i. + fp_sub(&t0, &t0, &t1); + uint32_t f = fp_is_zero(&t0); + fp_neg(&t1, &x0); + fp_copy(&t0, &x1); + fp_select(&t0, &t0, &x0, f); + fp_select(&t1, &t1, &x1, f); + + // Check if t0 is zero + uint32_t t0_is_zero = fp_is_zero(&t0); + // Check whether t0, t1 are odd + // Note: we encode to ensure canonical representation + uint8_t tmp_bytes[FP_ENCODED_BYTES]; + fp_encode(tmp_bytes, &t0); + uint32_t t0_is_odd = -((uint32_t)tmp_bytes[0] & 1); + fp_encode(tmp_bytes, &t1); + uint32_t t1_is_odd = -((uint32_t)tmp_bytes[0] & 1); + // We negate the output if: + // t0 is odd, or + // t0 is zero and t1 is odd + uint32_t negate_output = t0_is_odd | (t0_is_zero & t1_is_odd); + fp_neg(&x0, &t0); + fp_select(&(a->re), &t0, &x0, negate_output); + fp_neg(&x0, &t1); + fp_select(&(a->im), &t1, &x0, negate_output); +} + +uint32_t +fp2_sqrt_verify(fp2_t *a) +{ + fp2_t t0, t1; + + fp2_copy(&t0, a); + fp2_sqrt(a); + fp2_sqr(&t1, a); + + return (fp2_is_equal(&t0, &t1)); +} + +// exponentiation +void +fp2_pow_vartime(fp2_t *out, const fp2_t *x, const digit_t *exp, const int size) +{ + fp2_t acc; + digit_t bit; + + fp2_copy(&acc, x); + fp2_set_one(out); + + // Iterate over each word of exp + for (int j = 0; j < size; j++) { + // Iterate over each bit of the word + for (int i = 0; i < RADIX; i++) { + bit = (exp[j] >> i) & 1; + if (bit == 1) { + fp2_mul(out, out, &acc); + } + fp2_sqr(&acc, &acc); + } + } +} + +void +fp2_print(const char *name, const fp2_t *a) +{ + printf("%s0x", name); + + uint8_t buf[FP_ENCODED_BYTES]; + fp_encode(&buf, &a->re); // Encoding ensures canonical rep + for (int i = 0; i < FP_ENCODED_BYTES; i++) { + printf("%02x", buf[FP_ENCODED_BYTES - i - 1]); + } + + printf(" + i*0x"); + + fp_encode(&buf, &a->im); + for (int i = 0; i < FP_ENCODED_BYTES; i++) { + printf("%02x", buf[FP_ENCODED_BYTES - i - 1]); + } + printf("\n"); +} diff --git a/src/gf/broadwell/lvlx_test.cmake b/src/gf/broadwell/lvlx_test.cmake new file mode 100644 index 0000000..28655ac --- /dev/null +++ b/src/gf/broadwell/lvlx_test.cmake @@ -0,0 +1,23 @@ +add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_fp.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}} sqisign_common_test) +target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp PRIVATE ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_fp2.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}} sqisign_common_test) +target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp2 PRIVATE ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp sqisign_test_gf_${SVARIANT_LOWER}_fp test) +add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp2 sqisign_test_gf_${SVARIANT_LOWER}_fp2 test) + +add_executable(sqisign_bench_gf_${SVARIANT_LOWER}_fp ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/bench_fp.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_bench_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}} sqisign_common_test) +target_include_directories(sqisign_bench_gf_${SVARIANT_LOWER}_fp PRIVATE ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +add_executable(sqisign_bench_gf_${SVARIANT_LOWER}_fp2 ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/bench_fp2.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_bench_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}} sqisign_common_sys) +target_include_directories(sqisign_bench_gf_${SVARIANT_LOWER}_fp2 PRIVATE ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +set(BM_BINS ${BM_BINS} + sqisign_bench_gf_${SVARIANT_LOWER}_fp sqisign_bench_gf_${SVARIANT_LOWER}_fp2 + CACHE INTERNAL "List of benchmark executables") + diff --git a/src/gf/gfx/test/bench_fp.c b/src/gf/gfx/test/bench_fp.c new file mode 100644 index 0000000..2a2b992 --- /dev/null +++ b/src/gf/gfx/test/bench_fp.c @@ -0,0 +1,254 @@ +#include +#include +#include +#include +#include +#include +#include "test_utils.h" +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +bool +fp_run(int iterations) +{ + bool OK = true; + int n, i; + uint64_t cycles1, cycles2; + fp_t a, b; + uint8_t tmp[32]; + + fp_random_test(&a); + fp_random_test(&b); + + printf("\n-------------------------------------------------------------------------------------" + "-------------------\n\n"); + printf("Benchmarking GF(p) field arithmetic for " STRINGIFY(SQISIGN_VARIANT) ": \n\n"); + + // GF(p) addition + uint64_t cycle_runs[20]; + + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_add(&a, &a, &b); + fp_add(&b, &b, &a); + fp_add(&a, &a, &b); + fp_add(&b, &b, &a); + fp_add(&a, &a, &b); + fp_add(&b, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) addition runs in .......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p) subtraction + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_sub(&a, &a, &b); + fp_sub(&b, &b, &a); + fp_sub(&a, &a, &b); + fp_sub(&b, &b, &a); + fp_sub(&a, &a, &b); + fp_sub(&b, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) subtraction runs in ....................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p) division by 3 + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_div3(&a, &a); + fp_div3(&b, &b); + fp_div3(&a, &a); + fp_div3(&b, &b); + fp_div3(&a, &a); + fp_div3(&b, &b); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) division by 3 runs in ..................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p) multiplication + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_mul(&a, &a, &b); + fp_mul(&b, &b, &a); + fp_mul(&a, &a, &b); + fp_mul(&b, &b, &a); + fp_mul(&a, &a, &b); + fp_mul(&b, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) multiplication runs in .................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p) small multiplication + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + uint32_t val = cycles1; + for (n = 0; n < iterations; n++) { + fp_mul_small(&a, &a, val); + fp_mul_small(&a, &a, val); + fp_mul_small(&a, &a, val); + fp_mul_small(&a, &a, val); + fp_mul_small(&a, &a, val); + fp_mul_small(&a, &a, val); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) small multiplication runs in .............................. %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p) squaring + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_sqr(&a, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) squaring runs in .......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (iterations), + tmp[0]); + + // GF(p) inversion + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_inv(&a); + fp_add(&a, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) inversion runs in ......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / iterations, + tmp[0]); + + // GF(p) sqrt + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_sqrt(&a); + fp_add(&a, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p) sqrt runs in .............................................. %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / iterations, + tmp[0]); + + // GF(p) is_square + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp_is_square(&a); + fp_add(&a, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" Square checking runs in ......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / iterations, + tmp[0]); + + return OK; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = 1000 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + return !fp_run(iterations); +} diff --git a/src/gf/gfx/test/bench_fp2.c b/src/gf/gfx/test/bench_fp2.c new file mode 100644 index 0000000..0da8802 --- /dev/null +++ b/src/gf/gfx/test/bench_fp2.c @@ -0,0 +1,234 @@ +#include +#include +#include +#include +#include +#include "test_utils.h" +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +bool +fp2_run(int iterations) +{ + bool OK = true; + int n, i; + uint64_t cycles1, cycles2; + fp2_t a, b; + uint8_t tmp[2 * FP_ENCODED_BYTES]; + + fp2_random_test(&a); + fp2_random_test(&b); + + printf("\n-------------------------------------------------------------------------------------" + "-------------------\n\n"); + printf("Benchmarking GF(p^2) field arithmetic for " STRINGIFY(SQISIGN_VARIANT) ": \n\n"); + + // GF(p^2) addition + uint64_t cycle_runs[20]; + + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_add(&a, &a, &b); + fp2_add(&b, &b, &a); + fp2_add(&a, &a, &b); + fp2_add(&b, &b, &a); + fp2_add(&a, &a, &b); + fp2_add(&b, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) addition runs in .......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p^2) subtraction + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_sub(&a, &a, &b); + fp2_sub(&b, &b, &a); + fp2_sub(&a, &a, &b); + fp2_sub(&b, &b, &a); + fp2_sub(&a, &a, &b); + fp2_sub(&b, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) subtraction runs in ....................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p^2) multiplication + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_mul(&a, &a, &b); + fp2_mul(&b, &b, &a); + fp2_mul(&a, &a, &b); + fp2_mul(&b, &b, &a); + fp2_mul(&a, &a, &b); + fp2_mul(&b, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &b); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) multiplication runs in .................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p^2) squaring + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_sqr(&a, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) squaring runs in .......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (iterations), + tmp[0]); + + // GF(p^2) small multiplication + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + uint32_t val = cycles1; + for (n = 0; n < iterations; n++) { + fp2_mul_small(&a, &a, val); + fp2_mul_small(&a, &a, val); + fp2_mul_small(&a, &a, val); + fp2_mul_small(&a, &a, val); + fp2_mul_small(&a, &a, val); + fp2_mul_small(&a, &a, val); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp_add(&a.re, &a.re, &a.im); + fp2_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) small multiplication runs in .............................. %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / (6 * iterations), + tmp[0]); + + // GF(p^2) inversion + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_inv(&a); + fp2_add(&a, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) inversion runs in ......................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / iterations, + tmp[0]); + + // GF(p^2) sqrt + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_sqrt(&a); + fp2_add(&a, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" GF(p^2) sqrt runs in .............................................. %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / iterations, + tmp[0]); + + // GF(p^2) is_square + for (i = 0; i < 20; i++) { + cycles1 = cpucycles(); + for (n = 0; n < iterations; n++) { + fp2_is_square(&a); + fp2_add(&a, &b, &a); + } + cycles2 = cpucycles(); + cycle_runs[i] = cycles2 - cycles1; + } + fp2_encode(tmp, &a); + qsort(cycle_runs + 10, 10, sizeof cycle_runs[0], cmp_u64); + printf(" Square checking runs in ........................................... %" PRIu64 " cycles, (%u ignore me)\n", + cycle_runs[4] / iterations, + tmp[0]); + + return OK; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = 1000 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + return !fp2_run(iterations); +} diff --git a/src/gf/gfx/test/test_fp.c b/src/gf/gfx/test/test_fp.c new file mode 100644 index 0000000..89bae40 --- /dev/null +++ b/src/gf/gfx/test/test_fp.c @@ -0,0 +1,460 @@ +#include +#include +#include +#include +#include "test_utils.h" +#include +#include + +bool +fp_test(int iterations) +{ // Tests for the field arithmetic + bool OK = true; + int n, passed; + fp_t a, b, c, d, e, f; + + printf("\n-------------------------------------------------------------------------------------" + "-------------------\n\n"); + printf("Testing field arithmetic over GF(p): \n\n"); + + // Test equality + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + fp_add(&b, &a, (fp_t *)&ONE); + fp_set_zero(&c); + + if (fp_is_equal(&a, &a) == 0) { + passed = 0; + break; + } + if (fp_is_equal(&a, &b) != 0) { + passed = 0; + break; + } + if (fp_is_equal(&c, (fp_t *)&ZERO) == 0) { + passed = 0; + break; + } + + if (fp_is_zero((fp_t *)&ZERO) == 0) { + passed = 0; + break; + } + if (fp_is_zero((fp_t *)&ONE) != 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) equality tests ............................................ PASSED"); + else { + printf(" GF(p) equality tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Test mul small + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + uint32_t val = rand(); + + // Multiply by small value + fp_mul_small(&b, &a, val); + + // Convert and use usual multiplication + fp_set_small(&c, val); + fp_mul(&d, &a, &c); + + if (fp_is_equal(&b, &d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) mul small test ............................................ PASSED"); + else { + printf(" GF(p) mul small tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Test half + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + + fp_add(&b, &a, &a); + fp_half(&c, &b); + if (fp_is_equal(&a, &c) == 0) { + passed = 0; + break; + } + + fp_random_test(&a); + + fp_half(&b, &a); + fp_add(&c, &b, &b); + if (fp_is_equal(&a, &c) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) half test ................................................. PASSED"); + else { + printf(" GF(p) half tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Field division by 3 + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + + fp_add(&b, &a, &a); + fp_add(&b, &b, &a); + fp_div3(&c, &b); + + if (fp_is_equal(&a, &c) == 0) { + passed = 0; + break; + } + + fp_set_zero(&a); + fp_div3(&d, &a); // d = 0/3 + if (fp_is_zero(&d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) div by 3 tests............................................. PASSED"); + else { + printf(" GF(p) div by 3 tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Test set small + passed = 1; + for (n = 0; n < iterations; n++) { + fp_set_one(&a); + fp_add(&b, &a, &a); + fp_set_small(&c, (uint32_t)2); + if (fp_is_equal(&b, &c) == 0) { + passed = 0; + break; + } + + fp_set_one(&a); + fp_add(&b, &a, &a); + fp_add(&b, &b, &b); + fp_set_small(&c, 4); + if (fp_is_equal(&b, &c) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) set small test ............................................ PASSED"); + else { + printf(" GF(p) set small... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Field addition + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + fp_random_test(&b); + fp_random_test(&c); + fp_random_test(&d); + + fp_add(&d, &a, &b); + fp_add(&e, &d, &c); // e = (a+b)+c + fp_add(&d, &b, &c); + fp_add(&f, &d, &a); // f = a+(b+c) + if (fp_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp_add(&d, &a, &b); // d = a+b + fp_add(&e, &b, &a); // e = b+a + if (fp_is_equal(&d, &e) == 0) { + passed = 0; + break; + } + + fp_set_zero(&b); + fp_add(&d, &a, &b); // d = a+0 + if (fp_is_equal(&a, &d) == 0) { + passed = 0; + break; + } + + fp_set_zero(&b); + fp_neg(&d, &a); + fp_add(&e, &a, &d); // e = a+(-a) + if (fp_is_equal(&e, &b) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) addition tests ............................................ PASSED"); + else { + printf(" GF(p) addition tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Field subtraction + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + fp_random_test(&b); + fp_random_test(&c); + fp_random_test(&d); + + fp_sub(&d, &a, &b); + fp_sub(&e, &d, &c); // e = (a-b)-c + fp_add(&d, &b, &c); + fp_sub(&f, &a, &d); // f = a-(b+c) + if (fp_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp_sub(&d, &a, &b); // d = a-b + fp_sub(&e, &b, &a); + fp_neg(&e, &e); // e = -(b-a) + if (fp_is_equal(&d, &e) == 0) { + passed = 0; + break; + } + + fp_set_zero(&b); + fp_sub(&d, &a, &b); // d = a-0 + if (fp_is_equal(&a, &d) == 0) { + passed = 0; + break; + } + + fp_sub(&e, &a, &a); // e = a+(-a) + if (fp_is_zero(&e) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) subtraction tests ......................................... PASSED"); + else { + printf(" GF(p) subtraction tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Field multiplication + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + fp_random_test(&b); + fp_random_test(&c); + fp_mul(&d, &a, &b); + fp_mul(&e, &d, &c); // e = (a*b)*c + fp_mul(&d, &b, &c); + fp_mul(&f, &d, &a); // f = a*(b*c) + if (fp_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp_add(&d, &b, &c); + fp_mul(&e, &a, &d); // e = a*(b+c) + fp_mul(&d, &a, &b); + fp_mul(&f, &a, &c); + fp_add(&f, &d, &f); // f = a*b+a*c + if (fp_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp_mul(&d, &a, &b); // d = a*b + fp_mul(&e, &b, &a); // e = b*a + if (fp_is_equal(&d, &e) == 0) { + passed = 0; + break; + } + + fp_set_one(&b); + fp_mul(&d, &a, &b); // d = a*1 + if (fp_is_equal(&a, &d) == 0) { + passed = 0; + break; + } + + fp_set_zero(&b); + fp_mul(&d, &a, &b); // d = a*0 + if (fp_is_equal(&b, &d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) multiplication tests ...................................... PASSED"); + else { + printf(" GF(p) multiplication tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Field squaring + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + + fp_sqr(&b, &a); // b = a^2 + fp_mul(&c, &a, &a); // c = a*a + if (fp_is_equal(&b, &c) == 0) { + passed = 0; + break; + } + + fp_set_zero(&a); + fp_sqr(&d, &a); // d = 0^2 + if (fp_is_zero(&d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) squaring tests............................................. PASSED"); + else { + printf(" GF(p) squaring tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Field inversion + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + + fp_copy(&b, &a); + fp_inv(&b); + fp_mul(&c, &a, &b); // c = a*a^-1 + if (fp_is_equal(&c, (fp_t *)&ONE) == 0) { + passed = 0; + break; + } + + fp_set_zero(&a); + fp_inv(&a); // c = 0^-1 + if (fp_is_equal(&a, (fp_t *)&ZERO) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p) inversion tests............................................ PASSED"); + else { + printf(" GF(p) inversion tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Square root and square detection + passed = 1; + for (n = 0; n < iterations; n++) { + fp_random_test(&a); + + fp_sqr(&c, &a); // c = a^2 + if (fp_is_square(&c) == 0) { + passed = 0; + break; + } + + fp_sqrt(&c); // c, d = ±sqrt(c) + fp_neg(&d, &c); + if ((fp_is_equal(&a, &c) == 0) && (fp_is_equal(&a, &d) == 0)) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" Square root, square tests........................................ PASSED"); + else { + printf(" Square root, square tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + return OK; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = 1000 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for testing; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + return !fp_test(iterations); +} diff --git a/src/gf/gfx/test/test_fp2.c b/src/gf/gfx/test/test_fp2.c new file mode 100644 index 0000000..ab2122f --- /dev/null +++ b/src/gf/gfx/test/test_fp2.c @@ -0,0 +1,349 @@ +#include +#include +#include +#include "test_utils.h" +#include +#include + +bool +fp2_test(int iterations) +{ // Tests for the GF(p^2) arithmetic + bool OK = true; + int n, passed; + fp2_t a, b, c, d, e, f; + + printf("\n-------------------------------------------------------------------------------------" + "-------------------\n\n"); + printf("Testing arithmetic over GF(p^2): \n\n"); + + // Addition in GF(p^2) + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + fp2_random_test(&b); + fp2_random_test(&c); + fp2_random_test(&d); + + fp2_add(&d, &a, &b); + fp2_add(&e, &d, &c); // e = (a+b)+c + fp2_add(&d, &b, &c); + fp2_add(&f, &d, &a); // f = a+(b+c) + if (fp2_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp2_add(&d, &a, &b); // d = a+b + fp2_add(&e, &b, &a); // e = b+a + if (fp2_is_equal(&d, &e) == 0) { + passed = 0; + break; + } + + fp2_set_zero(&b); + fp2_add(&d, &a, &b); // d = a+0 + if (fp2_is_equal(&d, &a) == 0) { + passed = 0; + break; + } + + fp2_neg(&d, &a); + fp2_add(&e, &a, &d); // e = a+(-a) + if (fp2_is_zero(&e) == 0) { + passed = 0; + break; + } + + // Test add_one special method + fp2_set_one(&b); + fp2_add(&e, &a, &b); + fp2_add_one(&f, &a); + if (fp2_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p^2) addition tests ............................................ PASSED"); + else { + printf(" GF(p^2) addition tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Subtraction in GF(p^2) + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + fp2_random_test(&b); + fp2_random_test(&c); + fp2_random_test(&d); + + fp2_sub(&d, &a, &b); + fp2_sub(&e, &d, &c); // e = (a-b)-c + fp2_add(&d, &b, &c); + fp2_sub(&f, &a, &d); // f = a-(b+c) + if (fp2_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp2_sub(&d, &a, &b); // d = a-b + fp2_sub(&e, &b, &a); + fp2_neg(&e, &e); // e = -(b-a) + if (fp2_is_equal(&d, &e) == 0) { + passed = 0; + break; + } + + fp2_set_zero(&b); + fp2_sub(&d, &a, &b); // d = a-0 + if (fp2_is_equal(&d, &a) == 0) { + passed = 0; + break; + } + + fp2_sub(&e, &a, &a); // e = a+(-a) + if (fp2_is_zero(&e) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p^2) subtraction tests ......................................... PASSED"); + else { + printf(" GF(p^2) subtraction tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Multiplication in GF(p^2) + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + fp2_random_test(&b); + fp2_random_test(&c); + + fp2_mul(&d, &a, &b); + fp2_mul(&e, &d, &c); // e = (a*b)*c + fp2_mul(&d, &b, &c); + fp2_mul(&f, &d, &a); // f = a*(b*c) + if (fp2_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp2_add(&d, &b, &c); + fp2_mul(&e, &a, &d); // e = a*(b+c) + fp2_mul(&d, &a, &b); + fp2_mul(&f, &a, &c); + fp2_add(&f, &d, &f); // f = a*b+a*c + if (fp2_is_equal(&e, &f) == 0) { + passed = 0; + break; + } + + fp2_mul(&d, &a, &b); // d = a*b + fp2_mul(&e, &b, &a); // e = b*a + if (fp2_is_equal(&d, &e) == 0) { + passed = 0; + break; + } + + fp2_set_one(&b); + fp2_mul(&d, &a, &b); // d = a*1 + if (fp2_is_equal(&a, &d) == 0) { + passed = 0; + break; + } + + fp2_set_zero(&b); + fp2_mul(&d, &a, &b); // d = a*0 + if (fp2_is_zero(&d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p^2) multiplication tests ...................................... PASSED"); + else { + printf(" GF(p^2) multiplication tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Test mul small + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + uint32_t val = rand(); + + // Multiply by a small value + fp2_mul_small(&b, &a, val); + + // Convert and multiply as a fp val + fp2_set_small(&c, val); + fp2_mul(&d, &a, &c); + + // Values should be the same + if (fp2_is_equal(&b, &d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p^2) mul small test ............................................ PASSED"); + else { + printf(" GF(p^2) mul small tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Squaring in GF(p^2) + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + fp2_sqr(&b, &a); // b = a^2 + fp2_mul(&c, &a, &a); // c = a*a + if (fp2_is_equal(&b, &c) == 0) { + passed = 0; + break; + } + + fp2_set_zero(&a); + fp2_sqr(&d, &a); // d = 0^2 + if (fp2_is_zero(&d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p^2) squaring tests............................................. PASSED"); + else { + printf(" GF(p^2) squaring tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Inversion in GF(p^2) + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + + fp2_set_one(&d); + fp2_copy(&b, &a); + fp2_inv(&a); + fp2_mul(&c, &a, &b); // c = a*a^-1 + if (fp2_is_equal(&c, &d) == 0) { + passed = 0; + break; + } + + fp2_set_zero(&a); + fp2_set_zero(&d); + fp2_inv(&a); // c = 0^-1 + if (fp2_is_equal(&a, &d) == 0) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" GF(p^2) inversion tests............................................ PASSED"); + else { + printf(" GF(p^2) inversion tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + // Square root and square detection in GF(p^2) + passed = 1; + for (n = 0; n < iterations; n++) { + fp2_random_test(&a); + + fp2_sqr(&c, &a); // c = a^2 + if (fp2_is_square(&c) == 0) { + passed = 0; + break; + } + + fp2_copy(&b, &c); + if (!fp2_sqrt_verify(&b)) { + passed = 0; + break; + } + + fp2_sqrt(&c); // c = a = sqrt(c) + fp2_neg(&d, &c); + if ((fp2_is_equal(&a, &c) == 0) && (fp2_is_equal(&a, &d) == 0)) { + passed = 0; + break; + } + } + if (passed == 1) + printf(" Square root, square tests.......................................... PASSED"); + else { + printf(" Square root, square tests... FAILED"); + printf("\n"); + return false; + } + printf("\n"); + + return OK; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = 1000 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for testing; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + return !fp2_test(iterations); +} diff --git a/src/gf/gfx/test/test_utils.c b/src/gf/gfx/test/test_utils.c new file mode 100644 index 0000000..694e319 --- /dev/null +++ b/src/gf/gfx/test/test_utils.c @@ -0,0 +1,39 @@ +/* + * A custom SHA-3 / SHAKE implementation is used for pseudorandom (but + * reproducible) generation of test values. + */ + +#include "test_utils.h" +#include "rng.h" + +// Make n random-ish field elements (for tests only!). +void +fp_random_test(fp_t *a) +{ + uint8_t tmp[FP_ENCODED_BYTES]; + + randombytes(tmp, sizeof(tmp)); + + fp_decode_reduce(a, tmp, sizeof(tmp)); +} + +void +fp2_random_test(fp2_t *a) +{ + fp_random_test(&(a->re)); + fp_random_test(&(a->im)); +} + +int +cmp_u64(const void *v1, const void *v2) +{ + uint64_t x1 = *(const uint64_t *)v1; + uint64_t x2 = *(const uint64_t *)v2; + if (x1 < x2) { + return -1; + } else if (x1 == x2) { + return 0; + } else { + return 1; + } +} diff --git a/src/gf/gfx/test/test_utils.h b/src/gf/gfx/test/test_utils.h new file mode 100644 index 0000000..0c69c76 --- /dev/null +++ b/src/gf/gfx/test/test_utils.h @@ -0,0 +1,19 @@ +#ifndef test_utils_h__ +#define test_utils_h__ + +#include "fp.h" +#include "fp2.h" +#include +#include + +#define PASSED 0 +#define FAILED 1 + +// Random elements of fp and fp2, only suitable for testing +void fp_random_test(fp_t *a); +void fp2_random_test(fp2_t *a); + +// Comparison of u64 for qsort +int cmp_u64(const void *v1, const void *v2); + +#endif diff --git a/src/gf/ref/CMakeLists.txt b/src/gf/ref/CMakeLists.txt index 3b414f0..d0ba315 100644 --- a/src/gf/ref/CMakeLists.txt +++ b/src/gf/ref/CMakeLists.txt @@ -1 +1,3 @@ +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) + include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/gf/ref/include/fp.h b/src/gf/ref/include/fp.h new file mode 100644 index 0000000..1241d58 --- /dev/null +++ b/src/gf/ref/include/fp.h @@ -0,0 +1,48 @@ +#ifndef FP_H +#define FP_H + +//////////////////////////////////////////////// NOTE: this is placed here for now +#include +#include +#include +#include +#include +#include +#include +#include + +typedef digit_t fp_t[NWORDS_FIELD]; // Datatype for representing field elements + +extern const digit_t ONE[NWORDS_FIELD]; +extern const digit_t ZERO[NWORDS_FIELD]; +// extern const digit_t PM1O3[NWORDS_FIELD]; + +void fp_set_small(fp_t *x, const digit_t val); +void fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val); +void fp_set_zero(fp_t *x); +void fp_set_one(fp_t *x); +uint32_t fp_is_equal(const fp_t *a, const fp_t *b); +uint32_t fp_is_zero(const fp_t *a); +void fp_copy(fp_t *out, const fp_t *a); + +void fp_encode(void *dst, const fp_t *a); +void fp_decode_reduce(fp_t *d, const void *src, size_t len); +uint32_t fp_decode(fp_t *d, const void *src); + +void fp_select(fp_t *d, const fp_t *a0, const fp_t *a1, uint32_t ctl); +void fp_cswap(fp_t *a, fp_t *b, uint32_t ctl); + +void fp_add(fp_t *out, const fp_t *a, const fp_t *b); +void fp_sub(fp_t *out, const fp_t *a, const fp_t *b); +void fp_neg(fp_t *out, const fp_t *a); +void fp_sqr(fp_t *out, const fp_t *a); +void fp_mul(fp_t *out, const fp_t *a, const fp_t *b); + +void fp_inv(fp_t *x); +uint32_t fp_is_square(const fp_t *a); +void fp_sqrt(fp_t *a); +void fp_half(fp_t *out, const fp_t *a); +void fp_exp3div4(fp_t *out, const fp_t *a); +void fp_div3(fp_t *out, const fp_t *a); + +#endif diff --git a/src/gf/ref/include/fp2.h b/src/gf/ref/include/fp2.h new file mode 100644 index 0000000..00e673b --- /dev/null +++ b/src/gf/ref/include/fp2.h @@ -0,0 +1,41 @@ +#ifndef FP2_H +#define FP2_H + +#include +#include "fp.h" +#include + +// Structure for representing elements in GF(p^2) +typedef struct fp2_t +{ + fp_t re, im; +} fp2_t; + +void fp2_set_small(fp2_t *x, const digit_t val); +void fp2_mul_small(fp2_t *x, const fp2_t *y, uint32_t n); +void fp2_set_one(fp2_t *x); +void fp2_set_zero(fp2_t *x); +uint32_t fp2_is_zero(const fp2_t *a); +uint32_t fp2_is_equal(const fp2_t *a, const fp2_t *b); +uint32_t fp2_is_one(const fp2_t *a); +void fp2_copy(fp2_t *x, const fp2_t *y); +void fp2_add(fp2_t *x, const fp2_t *y, const fp2_t *z); +void fp2_add_one(fp2_t *x, const fp2_t *y); +void fp2_sub(fp2_t *x, const fp2_t *y, const fp2_t *z); +void fp2_neg(fp2_t *x, const fp2_t *y); +void fp2_mul(fp2_t *x, const fp2_t *y, const fp2_t *z); +void fp2_sqr(fp2_t *x, const fp2_t *y); +void fp2_inv(fp2_t *x); +uint32_t fp2_is_square(const fp2_t *x); +void fp2_sqrt(fp2_t *x); +uint32_t fp2_sqrt_verify(fp2_t *a); +void fp2_half(fp2_t *x, const fp2_t *y); +void fp2_batched_inv(fp2_t *x, int len); +void fp2_pow_vartime(fp2_t *out, const fp2_t *x, const digit_t *exp, const int size); +void fp2_print(const char *name, const fp2_t *a); +void fp2_encode(void *dst, const fp2_t *a); +uint32_t fp2_decode(fp2_t *d, const void *src); +void fp2_select(fp2_t *d, const fp2_t *a0, const fp2_t *a1, uint32_t ctl); +void fp2_cswap(fp2_t *a, fp2_t *b, uint32_t ctl); + +#endif diff --git a/src/gf/ref/lvl1/CMakeLists.txt b/src/gf/ref/lvl1/CMakeLists.txt index 10e8149..75f4223 100644 --- a/src/gf/ref/lvl1/CMakeLists.txt +++ b/src/gf/ref/lvl1/CMakeLists.txt @@ -1,10 +1,5 @@ - -set(SOURCE_FILES_GF_${SVARIANT_UPPER}_REF - fp_p1913.c fp.c fp2.c +set(SOURCE_FILES_GF_SPECIFIC + fp_p5248_${RADIX}.c ) -add_library(${LIB_GF_${SVARIANT_UPPER}} ${SOURCE_FILES_GF_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_GF_${SVARIANT_UPPER}} PRIVATE common ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} include ${PROJECT_SOURCE_DIR}/include ${INC_COMMON}) -target_compile_options(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/gf/ref/lvl1/Makefile b/src/gf/ref/lvl1/Makefile deleted file mode 100755 index e59be0e..0000000 --- a/src/gf/ref/lvl1/Makefile +++ /dev/null @@ -1,43 +0,0 @@ - -CC=gcc -CFLAGS= -O3 -std=gnu11 -Wall -march=native -Wno-missing-braces -Wno-logical-not-parentheses -LDFLAGS=-lm -AR=ar rcs -RANLIB=ranlib - -OBJECTS=objs/fp_p1913.o objs/fp.o objs/fp2.o objs/random.o - -all: lib tests - -objs/fp_p1913.o: fp_p1913.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp_p1913.c -o objs/fp_p1913.o - -objs/fp.o: fp.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp.c -o objs/fp.o - -objs/fp2.o: fp2.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp2.c -o objs/fp2.o - -objs/random.o: ../../../common/generic/randombytes_system.c - $(CC) -c $(CFLAGS) ../../../common/generic/randombytes_system.c -o objs/random.o - -lib: $(OBJECTS) - rm -rf lib - mkdir lib - $(AR) lib/libtest.a $^ - $(RANLIB) lib/libtest.a - -tests: lib - $(CC) $(CFLAGS) -L./lib test/test_fp.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp -lgmp - $(CC) $(CFLAGS) -L./lib test/test_fp2.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp2 -lgmp - -check: tests - -.PHONY: clean - -clean: - rm -rf *.req objs lib test_fp* - diff --git a/src/gf/ref/lvl1/fp.c b/src/gf/ref/lvl1/fp.c deleted file mode 100755 index 4514d38..0000000 --- a/src/gf/ref/lvl1/fp.c +++ /dev/null @@ -1,169 +0,0 @@ -#include "include/fp.h" - -const uint64_t p[NWORDS_FIELD] = { 0xffffffffffffffff, 0x252C9E49355147FF, 0x33A6A86587407437, 0x34E29E286B95D98C }; -const uint64_t R2[NWORDS_FIELD] = { 0x233625AE400674D4, 0x20AFD6C1025A1C2E, 0x30A841AB0920655D, 0x0D72E7D67C30CD3D }; -const uint64_t pp[NWORDS_FIELD] = { 0x01, 0x00, 0x00, 0x00 }; - - -void fp_set(digit_t* x, const digit_t val) -{ // Set field element x = val, where val has wordsize - - x[0] = val; - for (unsigned int i = 1; i < NWORDS_FIELD; i++) { - x[i] = 0; - } -} - -bool fp_is_equal(const digit_t* a, const digit_t* b) -{ // Compare two field elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ b[i]; - - return (bool)is_digit_zero_ct(r); -} - -bool fp_is_zero(const digit_t* a) -{ // Is a field element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ 0; - - return (bool)is_digit_zero_ct(r); -} - -void fp_copy(digit_t* out, const digit_t* a) -{ - memcpy(out, a, NWORDS_FIELD*RADIX/8); -} - -void fp_neg(digit_t* out, const digit_t* a) -{ // Modular negation, out = -a mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - unsigned int i, borrow = 0; - - for (i = 0; i < NWORDS_FIELD; i++) { - SUBC(out[i], borrow, ((digit_t*)p)[i], a[i], borrow); - } - fp_sub(out, out, (digit_t*)p); -} - -void MUL(digit_t* out, const digit_t a, const digit_t b) -{ // Digit multiplication, digit*digit -> 2-digit result - // Inputs: a, b in [0, 2^w-1], where w is the computer wordsize - // Output: 0 < out < 2^(2w)-1 - register digit_t al, ah, bl, bh, temp; - digit_t albl, albh, ahbl, ahbh, res1, res2, res3, carry; - digit_t mask_low = (digit_t)(-1) >> (sizeof(digit_t)*4), mask_high = (digit_t)(-1) << (sizeof(digit_t)*4); - - al = a & mask_low; // Low part - ah = a >> (sizeof(digit_t)*4); // High part - bl = b & mask_low; - bh = b >> (sizeof(digit_t)*4); - - albl = al * bl; - albh = al * bh; - ahbl = ah * bl; - ahbh = ah * bh; - out[0] = albl & mask_low; // out00 - - res1 = albl >> (sizeof(digit_t)*4); - res2 = ahbl & mask_low; - res3 = albh & mask_low; - temp = res1 + res2 + res3; - carry = temp >> (sizeof(digit_t)*4); - out[0] ^= temp << (sizeof(digit_t)*4); // out01 - - res1 = ahbl >> (sizeof(digit_t)*4); - res2 = albh >> (sizeof(digit_t)*4); - res3 = ahbh & mask_low; - temp = res1 + res2 + res3 + carry; - out[1] = temp & mask_low; // out10 - carry = temp & mask_high; - out[1] ^= (ahbh & mask_high) + carry; // out11 -} - -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision right shift - digit_t bit_out = x[0] & 1; - - for (unsigned int i = 0; i < nwords-1; i++) { - SHIFTR(x[i+1], x[i], shift, x[i], RADIX); - } - x[nwords-1] >>= shift; - return bit_out; -} - -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision left shift - - for (int i = nwords-1; i > 0; i--) { - SHIFTL(x[i], x[i-1], shift, x[i], RADIX); - } - x[0] <<= shift; -} - -static void fp_exp3div4(digit_t* out, const digit_t* a) -{ // Fixed exponentiation out = a^((p-3)/4) mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - // Requirement: p = 3(mod 4) - fp_t p_t, acc; - digit_t bit; - - memcpy((digit_t*)p_t, (digit_t*)p, NWORDS_FIELD*RADIX/8); - memcpy((digit_t*)acc, (digit_t*)a, NWORDS_FIELD*RADIX/8); - mp_shiftr(p_t, 1, NWORDS_FIELD); - mp_shiftr(p_t, 1, NWORDS_FIELD); - fp_set(out, 1); - fp_tomont(out, out); - - for (int i = 0; i < NWORDS_FIELD*RADIX-2; i++) { - bit = p_t[0] & 1; - mp_shiftr(p_t, 1, NWORDS_FIELD); - if (bit == 1) { - fp_mul(out, out, acc); - } - fp_sqr(acc, acc); - } -} - -void fp_inv(digit_t* a) -{ // Modular inversion, out = x^-1*R mod p, where R = 2^(w*nwords), w is the computer wordsize and nwords is the number of words to represent p - // Input: a=xR in [0, p-1] - // Output: out in [0, p-1]. It outputs 0 if the input does not have an inverse - // Requirement: Ceiling(Log(p)) < w*nwords - fp_t t; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_sqr(t, t); - fp_mul(a, t, a); // a^(p-2) -} - -bool fp_is_square(const digit_t* a) -{ // Is field element a square? - // Output: out = 0 (false), 1 (true) - fp_t t, one; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_mul(t, t, a); // a^((p-1)/2) - fp_frommont(t, t); - fp_set(one, 1); - - return fp_is_equal(t, one); -} - -void fp_sqrt(digit_t* a) -{ // Square root computation, out = a^((p+1)/4) mod p - fp_t t; - - fp_exp3div4(t, a); - fp_mul(a, t, a); // a^((p+1)/4) -} \ No newline at end of file diff --git a/src/gf/ref/lvl1/fp2.c b/src/gf/ref/lvl1/fp2.c deleted file mode 100755 index 4de6396..0000000 --- a/src/gf/ref/lvl1/fp2.c +++ /dev/null @@ -1,192 +0,0 @@ -#include - -extern const digit_t R[NWORDS_FIELD]; - -/* Arithmetic modulo X^2 + 1 */ - -void fp2_set(fp2_t* x, const digit_t val) -{ - fp_set(x->re, val); - fp_set(x->im, 0); -} - -bool fp2_is_zero(const fp2_t* a) -{ // Is a GF(p^2) element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - - return fp_is_zero(a->re) & fp_is_zero(a->im); -} - -bool fp2_is_equal(const fp2_t* a, const fp2_t* b) -{ // Compare two GF(p^2) elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - - return fp_is_equal(a->re, b->re) & fp_is_equal(a->im, b->im); -} - -void fp2_copy(fp2_t* x, const fp2_t* y) -{ - fp_copy(x->re, y->re); - fp_copy(x->im, y->im); -} - -fp2_t fp2_non_residue() -{ // 2 + i is a quadratic non-residue for p1913 - fp_t one = {0}; - fp2_t res; - - one[0] = 1; - fp_tomont(one, one); - fp_add(res.re, one, one); - fp_copy(res.im, one); - return res; -} - -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_add(x->re, y->re, z->re); - fp_add(x->im, y->im, z->im); -} - -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_sub(x->re, y->re, z->re); - fp_sub(x->im, y->im, z->im); -} - -void fp2_neg(fp2_t* x, const fp2_t* y) -{ - fp_neg(x->re, y->re); - fp_neg(x->im, y->im); -} - -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_t t0, t1; - - fp_add(t0, y->re, y->im); - fp_add(t1, z->re, z->im); - fp_mul(t0, t0, t1); - fp_mul(t1, y->im, z->im); - fp_mul(x->re, y->re, z->re); - fp_sub(x->im, t0, t1); - fp_sub(x->im, x->im, x->re); - fp_sub(x->re, x->re, t1); -} - -void fp2_sqr(fp2_t* x, const fp2_t* y) -{ - fp_t sum, diff; - - fp_add(sum, y->re, y->im); - fp_sub(diff, y->re, y->im); - fp_mul(x->im, y->re, y->im); - fp_add(x->im, x->im, x->im); - fp_mul(x->re, sum, diff); -} - -void fp2_inv(fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - fp_inv(t0); - fp_mul(x->re, x->re, t0); - fp_mul(x->im, x->im, t0); - fp_neg(x->im, x->im); -} - -bool fp2_is_square(const fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - - return fp_is_square(t0); -} - -void fp2_frob(fp2_t* x, const fp2_t* y) -{ - memcpy((digit_t*)x->re, (digit_t*)y->re, NWORDS_FIELD*RADIX/8); - fp_neg(x->im, y->im); -} - -void fp2_tomont(fp2_t* x, const fp2_t* y) -{ - fp_tomont(x->re, y->re); - fp_tomont(x->im, y->im); -} - -void fp2_frommont(fp2_t* x, const fp2_t* y) -{ - fp_frommont(x->re, y->re); - fp_frommont(x->im, y->im); -} - -// NOTE: old, non-constant-time implementation. Could be optimized -void fp2_sqrt(fp2_t* x) -{ - fp_t sdelta, re, tmp1, tmp2, inv2, im; - - if (fp_is_zero(x->im)) { - if (fp_is_square(x->re)) { - fp_sqrt(x->re); - return; - } else { - fp_neg(x->im, x->re); - fp_sqrt(x->im); - fp_set(x->re, 0); - return; - } - } - - // sdelta = sqrt(re^2 + im^2) - fp_sqr(sdelta, x->re); - fp_sqr(tmp1, x->im); - fp_add(sdelta, sdelta, tmp1); - fp_sqrt(sdelta); - - fp_set(inv2, 2); - fp_tomont(inv2, inv2); // inv2 <- 2 - fp_inv(inv2); - fp_add(re, x->re, sdelta); - fp_mul(re, re, inv2); - memcpy((digit_t*)tmp2, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - if (!fp_is_square(tmp2)) { - fp_sub(re, x->re, sdelta); - fp_mul(re, re, inv2); - } - - fp_sqrt(re); - memcpy((digit_t*)im, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - fp_inv(im); - fp_mul(im, im, inv2); - fp_mul(x->im, im, x->im); - memcpy((digit_t*)x->re, (digit_t*)re, NWORDS_FIELD*RADIX/8); -} - -// Lexicographic comparison of two field elements. Returns +1 if x > y, -1 if x < y, 0 if x = y -int fp2_cmp(fp2_t* x, fp2_t* y){ - fp2_t a, b; - fp2_frommont(&a, x); - fp2_frommont(&b, y); - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.re[i] > b.re[i]) - return 1; - if(a.re[i] < b.re[i]) - return -1; - } - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.im[i] > b.im[i]) - return 1; - if(a.im[i] < b.im[i]) - return -1; - } - return 0; -} \ No newline at end of file diff --git a/src/gf/ref/lvl1/fp_p1913.c b/src/gf/ref/lvl1/fp_p1913.c deleted file mode 100755 index 0e97cd6..0000000 --- a/src/gf/ref/lvl1/fp_p1913.c +++ /dev/null @@ -1,1876 +0,0 @@ -/* Autogenerated: './src/ExtractionOCaml/word_by_word_montgomery' p1913 64 23920667128620486487914848107166358953830561597426178123910317653495243603967 */ -/* curve description: p1913 */ -/* machine_wordsize = 64 (from "64") */ -/* requested operations: (all) */ -/* m = 0x34e29e286b95d98c33a6a86587407437252c9e49355147ffffffffffffffffff (from "23920667128620486487914848107166358953830561597426178123910317653495243603967") */ -/* */ -/* NOTE: In addition to the bounds specified above each function, all */ -/* functions synthesized for this Montgomery arithmetic require the */ -/* input to be strictly less than the prime modulus (m), and also */ -/* require the input to be in the unique saturated representation. */ -/* All functions also ensure that these two properties are true of */ -/* return values. */ -/* */ -/* Computed values: */ -/* eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) */ -/* bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */ -/* twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) in */ -/* if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 */ - -#include -typedef unsigned char fiat_p1913_uint1; -typedef signed char fiat_p1913_int1; -#if defined(__GNUC__) || defined(__clang__) -# define FIAT_P1913_FIAT_EXTENSION __extension__ -# define FIAT_P1913_FIAT_INLINE __inline__ -#else -# define FIAT_P1913_FIAT_EXTENSION -# define FIAT_P1913_FIAT_INLINE -#endif - -FIAT_P1913_FIAT_EXTENSION typedef signed __int128 fiat_p1913_int128; -FIAT_P1913_FIAT_EXTENSION typedef unsigned __int128 fiat_p1913_uint128; - -/* The type fiat_p1913_montgomery_domain_field_element is a field element in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p1913_montgomery_domain_field_element[4]; - -/* The type fiat_p1913_non_montgomery_domain_field_element is a field element NOT in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p1913_non_montgomery_domain_field_element[4]; - -#if (-1 & 3) != 3 -#error "This code only works on a two's complement system" -#endif - - -/* - * The function fiat_p1913_addcarryx_u64 is an addition with carry. - * - * Postconditions: - * out1 = (arg1 + arg2 + arg3) mod 2^64 - * out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -void fiat_p1913_addcarryx_u64(uint64_t* out1, fiat_p1913_uint1* out2, fiat_p1913_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p1913_uint128 x1; - uint64_t x2; - fiat_p1913_uint1 x3; - x1 = ((arg1 + (fiat_p1913_uint128)arg2) + arg3); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (fiat_p1913_uint1)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p1913_subborrowx_u64 is a subtraction with borrow. - * - * Postconditions: - * out1 = (-arg1 + arg2 + -arg3) mod 2^64 - * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -void fiat_p1913_subborrowx_u64(uint64_t* out1, fiat_p1913_uint1* out2, fiat_p1913_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p1913_int128 x1; - fiat_p1913_int1 x2; - uint64_t x3; - x1 = ((arg2 - (fiat_p1913_int128)arg1) - arg3); - x2 = (fiat_p1913_int1)(x1 >> 64); - x3 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - *out1 = x3; - *out2 = (fiat_p1913_uint1)(0x0 - x2); -} - -/* - * The function fiat_p1913_mulx_u64 is a multiplication, returning the full double-width result. - * - * Postconditions: - * out1 = (arg1 * arg2) mod 2^64 - * out2 = ⌊arg1 * arg2 / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0xffffffffffffffff] - * arg2: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p1913_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) { - fiat_p1913_uint128 x1; - uint64_t x2; - uint64_t x3; - x1 = ((fiat_p1913_uint128)arg1 * arg2); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (uint64_t)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p1913_cmovznz_u64 is a single-word conditional move. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p1913_cmovznz_u64(uint64_t* out1, fiat_p1913_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p1913_uint1 x1; - uint64_t x2; - uint64_t x3; - x1 = (!(!arg1)); - x2 = ((fiat_p1913_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff)); - x3 = ((x2 & arg3) | ((~x2) & arg2)); - *out1 = x3; -} - -/* - * The function fiat_p1913_mul multiplies two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_mul(fiat_p1913_montgomery_domain_field_element out1, const fiat_p1913_montgomery_domain_field_element arg1, const fiat_p1913_montgomery_domain_field_element arg2) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - fiat_p1913_uint1 x14; - uint64_t x15; - fiat_p1913_uint1 x16; - uint64_t x17; - fiat_p1913_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - fiat_p1913_uint1 x29; - uint64_t x30; - fiat_p1913_uint1 x31; - uint64_t x32; - fiat_p1913_uint1 x33; - uint64_t x34; - uint64_t x35; - fiat_p1913_uint1 x36; - uint64_t x37; - fiat_p1913_uint1 x38; - uint64_t x39; - fiat_p1913_uint1 x40; - uint64_t x41; - fiat_p1913_uint1 x42; - uint64_t x43; - fiat_p1913_uint1 x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - fiat_p1913_uint1 x54; - uint64_t x55; - fiat_p1913_uint1 x56; - uint64_t x57; - fiat_p1913_uint1 x58; - uint64_t x59; - uint64_t x60; - fiat_p1913_uint1 x61; - uint64_t x62; - fiat_p1913_uint1 x63; - uint64_t x64; - fiat_p1913_uint1 x65; - uint64_t x66; - fiat_p1913_uint1 x67; - uint64_t x68; - fiat_p1913_uint1 x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - fiat_p1913_uint1 x79; - uint64_t x80; - fiat_p1913_uint1 x81; - uint64_t x82; - fiat_p1913_uint1 x83; - uint64_t x84; - uint64_t x85; - fiat_p1913_uint1 x86; - uint64_t x87; - fiat_p1913_uint1 x88; - uint64_t x89; - fiat_p1913_uint1 x90; - uint64_t x91; - fiat_p1913_uint1 x92; - uint64_t x93; - fiat_p1913_uint1 x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - fiat_p1913_uint1 x105; - uint64_t x106; - fiat_p1913_uint1 x107; - uint64_t x108; - fiat_p1913_uint1 x109; - uint64_t x110; - uint64_t x111; - fiat_p1913_uint1 x112; - uint64_t x113; - fiat_p1913_uint1 x114; - uint64_t x115; - fiat_p1913_uint1 x116; - uint64_t x117; - fiat_p1913_uint1 x118; - uint64_t x119; - fiat_p1913_uint1 x120; - uint64_t x121; - uint64_t x122; - uint64_t x123; - uint64_t x124; - uint64_t x125; - uint64_t x126; - uint64_t x127; - uint64_t x128; - uint64_t x129; - fiat_p1913_uint1 x130; - uint64_t x131; - fiat_p1913_uint1 x132; - uint64_t x133; - fiat_p1913_uint1 x134; - uint64_t x135; - uint64_t x136; - fiat_p1913_uint1 x137; - uint64_t x138; - fiat_p1913_uint1 x139; - uint64_t x140; - fiat_p1913_uint1 x141; - uint64_t x142; - fiat_p1913_uint1 x143; - uint64_t x144; - fiat_p1913_uint1 x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - uint64_t x155; - fiat_p1913_uint1 x156; - uint64_t x157; - fiat_p1913_uint1 x158; - uint64_t x159; - fiat_p1913_uint1 x160; - uint64_t x161; - uint64_t x162; - fiat_p1913_uint1 x163; - uint64_t x164; - fiat_p1913_uint1 x165; - uint64_t x166; - fiat_p1913_uint1 x167; - uint64_t x168; - fiat_p1913_uint1 x169; - uint64_t x170; - fiat_p1913_uint1 x171; - uint64_t x172; - uint64_t x173; - uint64_t x174; - uint64_t x175; - uint64_t x176; - uint64_t x177; - uint64_t x178; - uint64_t x179; - uint64_t x180; - fiat_p1913_uint1 x181; - uint64_t x182; - fiat_p1913_uint1 x183; - uint64_t x184; - fiat_p1913_uint1 x185; - uint64_t x186; - uint64_t x187; - fiat_p1913_uint1 x188; - uint64_t x189; - fiat_p1913_uint1 x190; - uint64_t x191; - fiat_p1913_uint1 x192; - uint64_t x193; - fiat_p1913_uint1 x194; - uint64_t x195; - fiat_p1913_uint1 x196; - uint64_t x197; - uint64_t x198; - fiat_p1913_uint1 x199; - uint64_t x200; - fiat_p1913_uint1 x201; - uint64_t x202; - fiat_p1913_uint1 x203; - uint64_t x204; - fiat_p1913_uint1 x205; - uint64_t x206; - fiat_p1913_uint1 x207; - uint64_t x208; - uint64_t x209; - uint64_t x210; - uint64_t x211; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[0]); - fiat_p1913_mulx_u64(&x5, &x6, x4, (arg2[3])); - fiat_p1913_mulx_u64(&x7, &x8, x4, (arg2[2])); - fiat_p1913_mulx_u64(&x9, &x10, x4, (arg2[1])); - fiat_p1913_mulx_u64(&x11, &x12, x4, (arg2[0])); - fiat_p1913_addcarryx_u64(&x13, &x14, 0x0, x12, x9); - fiat_p1913_addcarryx_u64(&x15, &x16, x14, x10, x7); - fiat_p1913_addcarryx_u64(&x17, &x18, x16, x8, x5); - x19 = (x18 + x6); - fiat_p1913_mulx_u64(&x20, &x21, x11, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x22, &x23, x11, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x24, &x25, x11, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x26, &x27, x11, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x28, &x29, 0x0, x27, x24); - fiat_p1913_addcarryx_u64(&x30, &x31, x29, x25, x22); - fiat_p1913_addcarryx_u64(&x32, &x33, x31, x23, x20); - x34 = (x33 + x21); - fiat_p1913_addcarryx_u64(&x35, &x36, 0x0, x11, x26); - fiat_p1913_addcarryx_u64(&x37, &x38, x36, x13, x28); - fiat_p1913_addcarryx_u64(&x39, &x40, x38, x15, x30); - fiat_p1913_addcarryx_u64(&x41, &x42, x40, x17, x32); - fiat_p1913_addcarryx_u64(&x43, &x44, x42, x19, x34); - fiat_p1913_mulx_u64(&x45, &x46, x1, (arg2[3])); - fiat_p1913_mulx_u64(&x47, &x48, x1, (arg2[2])); - fiat_p1913_mulx_u64(&x49, &x50, x1, (arg2[1])); - fiat_p1913_mulx_u64(&x51, &x52, x1, (arg2[0])); - fiat_p1913_addcarryx_u64(&x53, &x54, 0x0, x52, x49); - fiat_p1913_addcarryx_u64(&x55, &x56, x54, x50, x47); - fiat_p1913_addcarryx_u64(&x57, &x58, x56, x48, x45); - x59 = (x58 + x46); - fiat_p1913_addcarryx_u64(&x60, &x61, 0x0, x37, x51); - fiat_p1913_addcarryx_u64(&x62, &x63, x61, x39, x53); - fiat_p1913_addcarryx_u64(&x64, &x65, x63, x41, x55); - fiat_p1913_addcarryx_u64(&x66, &x67, x65, x43, x57); - fiat_p1913_addcarryx_u64(&x68, &x69, x67, x44, x59); - fiat_p1913_mulx_u64(&x70, &x71, x60, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x72, &x73, x60, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x74, &x75, x60, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x76, &x77, x60, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x78, &x79, 0x0, x77, x74); - fiat_p1913_addcarryx_u64(&x80, &x81, x79, x75, x72); - fiat_p1913_addcarryx_u64(&x82, &x83, x81, x73, x70); - x84 = (x83 + x71); - fiat_p1913_addcarryx_u64(&x85, &x86, 0x0, x60, x76); - fiat_p1913_addcarryx_u64(&x87, &x88, x86, x62, x78); - fiat_p1913_addcarryx_u64(&x89, &x90, x88, x64, x80); - fiat_p1913_addcarryx_u64(&x91, &x92, x90, x66, x82); - fiat_p1913_addcarryx_u64(&x93, &x94, x92, x68, x84); - x95 = ((uint64_t)x94 + x69); - fiat_p1913_mulx_u64(&x96, &x97, x2, (arg2[3])); - fiat_p1913_mulx_u64(&x98, &x99, x2, (arg2[2])); - fiat_p1913_mulx_u64(&x100, &x101, x2, (arg2[1])); - fiat_p1913_mulx_u64(&x102, &x103, x2, (arg2[0])); - fiat_p1913_addcarryx_u64(&x104, &x105, 0x0, x103, x100); - fiat_p1913_addcarryx_u64(&x106, &x107, x105, x101, x98); - fiat_p1913_addcarryx_u64(&x108, &x109, x107, x99, x96); - x110 = (x109 + x97); - fiat_p1913_addcarryx_u64(&x111, &x112, 0x0, x87, x102); - fiat_p1913_addcarryx_u64(&x113, &x114, x112, x89, x104); - fiat_p1913_addcarryx_u64(&x115, &x116, x114, x91, x106); - fiat_p1913_addcarryx_u64(&x117, &x118, x116, x93, x108); - fiat_p1913_addcarryx_u64(&x119, &x120, x118, x95, x110); - fiat_p1913_mulx_u64(&x121, &x122, x111, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x123, &x124, x111, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x125, &x126, x111, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x127, &x128, x111, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x129, &x130, 0x0, x128, x125); - fiat_p1913_addcarryx_u64(&x131, &x132, x130, x126, x123); - fiat_p1913_addcarryx_u64(&x133, &x134, x132, x124, x121); - x135 = (x134 + x122); - fiat_p1913_addcarryx_u64(&x136, &x137, 0x0, x111, x127); - fiat_p1913_addcarryx_u64(&x138, &x139, x137, x113, x129); - fiat_p1913_addcarryx_u64(&x140, &x141, x139, x115, x131); - fiat_p1913_addcarryx_u64(&x142, &x143, x141, x117, x133); - fiat_p1913_addcarryx_u64(&x144, &x145, x143, x119, x135); - x146 = ((uint64_t)x145 + x120); - fiat_p1913_mulx_u64(&x147, &x148, x3, (arg2[3])); - fiat_p1913_mulx_u64(&x149, &x150, x3, (arg2[2])); - fiat_p1913_mulx_u64(&x151, &x152, x3, (arg2[1])); - fiat_p1913_mulx_u64(&x153, &x154, x3, (arg2[0])); - fiat_p1913_addcarryx_u64(&x155, &x156, 0x0, x154, x151); - fiat_p1913_addcarryx_u64(&x157, &x158, x156, x152, x149); - fiat_p1913_addcarryx_u64(&x159, &x160, x158, x150, x147); - x161 = (x160 + x148); - fiat_p1913_addcarryx_u64(&x162, &x163, 0x0, x138, x153); - fiat_p1913_addcarryx_u64(&x164, &x165, x163, x140, x155); - fiat_p1913_addcarryx_u64(&x166, &x167, x165, x142, x157); - fiat_p1913_addcarryx_u64(&x168, &x169, x167, x144, x159); - fiat_p1913_addcarryx_u64(&x170, &x171, x169, x146, x161); - fiat_p1913_mulx_u64(&x172, &x173, x162, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x174, &x175, x162, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x176, &x177, x162, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x178, &x179, x162, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x180, &x181, 0x0, x179, x176); - fiat_p1913_addcarryx_u64(&x182, &x183, x181, x177, x174); - fiat_p1913_addcarryx_u64(&x184, &x185, x183, x175, x172); - x186 = (x185 + x173); - fiat_p1913_addcarryx_u64(&x187, &x188, 0x0, x162, x178); - fiat_p1913_addcarryx_u64(&x189, &x190, x188, x164, x180); - fiat_p1913_addcarryx_u64(&x191, &x192, x190, x166, x182); - fiat_p1913_addcarryx_u64(&x193, &x194, x192, x168, x184); - fiat_p1913_addcarryx_u64(&x195, &x196, x194, x170, x186); - x197 = ((uint64_t)x196 + x171); - fiat_p1913_subborrowx_u64(&x198, &x199, 0x0, x189, UINT64_C(0xffffffffffffffff)); - fiat_p1913_subborrowx_u64(&x200, &x201, x199, x191, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_subborrowx_u64(&x202, &x203, x201, x193, UINT64_C(0x33a6a86587407437)); - fiat_p1913_subborrowx_u64(&x204, &x205, x203, x195, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_subborrowx_u64(&x206, &x207, x205, x197, 0x0); - fiat_p1913_cmovznz_u64(&x208, x207, x198, x189); - fiat_p1913_cmovznz_u64(&x209, x207, x200, x191); - fiat_p1913_cmovznz_u64(&x210, x207, x202, x193); - fiat_p1913_cmovznz_u64(&x211, x207, x204, x195); - out1[0] = x208; - out1[1] = x209; - out1[2] = x210; - out1[3] = x211; -} - -/* - * The function fiat_p1913_square squares a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_square(fiat_p1913_montgomery_domain_field_element out1, const fiat_p1913_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - fiat_p1913_uint1 x14; - uint64_t x15; - fiat_p1913_uint1 x16; - uint64_t x17; - fiat_p1913_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - fiat_p1913_uint1 x29; - uint64_t x30; - fiat_p1913_uint1 x31; - uint64_t x32; - fiat_p1913_uint1 x33; - uint64_t x34; - uint64_t x35; - fiat_p1913_uint1 x36; - uint64_t x37; - fiat_p1913_uint1 x38; - uint64_t x39; - fiat_p1913_uint1 x40; - uint64_t x41; - fiat_p1913_uint1 x42; - uint64_t x43; - fiat_p1913_uint1 x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - fiat_p1913_uint1 x54; - uint64_t x55; - fiat_p1913_uint1 x56; - uint64_t x57; - fiat_p1913_uint1 x58; - uint64_t x59; - uint64_t x60; - fiat_p1913_uint1 x61; - uint64_t x62; - fiat_p1913_uint1 x63; - uint64_t x64; - fiat_p1913_uint1 x65; - uint64_t x66; - fiat_p1913_uint1 x67; - uint64_t x68; - fiat_p1913_uint1 x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - fiat_p1913_uint1 x79; - uint64_t x80; - fiat_p1913_uint1 x81; - uint64_t x82; - fiat_p1913_uint1 x83; - uint64_t x84; - uint64_t x85; - fiat_p1913_uint1 x86; - uint64_t x87; - fiat_p1913_uint1 x88; - uint64_t x89; - fiat_p1913_uint1 x90; - uint64_t x91; - fiat_p1913_uint1 x92; - uint64_t x93; - fiat_p1913_uint1 x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - fiat_p1913_uint1 x105; - uint64_t x106; - fiat_p1913_uint1 x107; - uint64_t x108; - fiat_p1913_uint1 x109; - uint64_t x110; - uint64_t x111; - fiat_p1913_uint1 x112; - uint64_t x113; - fiat_p1913_uint1 x114; - uint64_t x115; - fiat_p1913_uint1 x116; - uint64_t x117; - fiat_p1913_uint1 x118; - uint64_t x119; - fiat_p1913_uint1 x120; - uint64_t x121; - uint64_t x122; - uint64_t x123; - uint64_t x124; - uint64_t x125; - uint64_t x126; - uint64_t x127; - uint64_t x128; - uint64_t x129; - fiat_p1913_uint1 x130; - uint64_t x131; - fiat_p1913_uint1 x132; - uint64_t x133; - fiat_p1913_uint1 x134; - uint64_t x135; - uint64_t x136; - fiat_p1913_uint1 x137; - uint64_t x138; - fiat_p1913_uint1 x139; - uint64_t x140; - fiat_p1913_uint1 x141; - uint64_t x142; - fiat_p1913_uint1 x143; - uint64_t x144; - fiat_p1913_uint1 x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - uint64_t x155; - fiat_p1913_uint1 x156; - uint64_t x157; - fiat_p1913_uint1 x158; - uint64_t x159; - fiat_p1913_uint1 x160; - uint64_t x161; - uint64_t x162; - fiat_p1913_uint1 x163; - uint64_t x164; - fiat_p1913_uint1 x165; - uint64_t x166; - fiat_p1913_uint1 x167; - uint64_t x168; - fiat_p1913_uint1 x169; - uint64_t x170; - fiat_p1913_uint1 x171; - uint64_t x172; - uint64_t x173; - uint64_t x174; - uint64_t x175; - uint64_t x176; - uint64_t x177; - uint64_t x178; - uint64_t x179; - uint64_t x180; - fiat_p1913_uint1 x181; - uint64_t x182; - fiat_p1913_uint1 x183; - uint64_t x184; - fiat_p1913_uint1 x185; - uint64_t x186; - uint64_t x187; - fiat_p1913_uint1 x188; - uint64_t x189; - fiat_p1913_uint1 x190; - uint64_t x191; - fiat_p1913_uint1 x192; - uint64_t x193; - fiat_p1913_uint1 x194; - uint64_t x195; - fiat_p1913_uint1 x196; - uint64_t x197; - uint64_t x198; - fiat_p1913_uint1 x199; - uint64_t x200; - fiat_p1913_uint1 x201; - uint64_t x202; - fiat_p1913_uint1 x203; - uint64_t x204; - fiat_p1913_uint1 x205; - uint64_t x206; - fiat_p1913_uint1 x207; - uint64_t x208; - uint64_t x209; - uint64_t x210; - uint64_t x211; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[0]); - fiat_p1913_mulx_u64(&x5, &x6, x4, (arg1[3])); - fiat_p1913_mulx_u64(&x7, &x8, x4, (arg1[2])); - fiat_p1913_mulx_u64(&x9, &x10, x4, (arg1[1])); - fiat_p1913_mulx_u64(&x11, &x12, x4, (arg1[0])); - fiat_p1913_addcarryx_u64(&x13, &x14, 0x0, x12, x9); - fiat_p1913_addcarryx_u64(&x15, &x16, x14, x10, x7); - fiat_p1913_addcarryx_u64(&x17, &x18, x16, x8, x5); - x19 = (x18 + x6); - fiat_p1913_mulx_u64(&x20, &x21, x11, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x22, &x23, x11, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x24, &x25, x11, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x26, &x27, x11, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x28, &x29, 0x0, x27, x24); - fiat_p1913_addcarryx_u64(&x30, &x31, x29, x25, x22); - fiat_p1913_addcarryx_u64(&x32, &x33, x31, x23, x20); - x34 = (x33 + x21); - fiat_p1913_addcarryx_u64(&x35, &x36, 0x0, x11, x26); - fiat_p1913_addcarryx_u64(&x37, &x38, x36, x13, x28); - fiat_p1913_addcarryx_u64(&x39, &x40, x38, x15, x30); - fiat_p1913_addcarryx_u64(&x41, &x42, x40, x17, x32); - fiat_p1913_addcarryx_u64(&x43, &x44, x42, x19, x34); - fiat_p1913_mulx_u64(&x45, &x46, x1, (arg1[3])); - fiat_p1913_mulx_u64(&x47, &x48, x1, (arg1[2])); - fiat_p1913_mulx_u64(&x49, &x50, x1, (arg1[1])); - fiat_p1913_mulx_u64(&x51, &x52, x1, (arg1[0])); - fiat_p1913_addcarryx_u64(&x53, &x54, 0x0, x52, x49); - fiat_p1913_addcarryx_u64(&x55, &x56, x54, x50, x47); - fiat_p1913_addcarryx_u64(&x57, &x58, x56, x48, x45); - x59 = (x58 + x46); - fiat_p1913_addcarryx_u64(&x60, &x61, 0x0, x37, x51); - fiat_p1913_addcarryx_u64(&x62, &x63, x61, x39, x53); - fiat_p1913_addcarryx_u64(&x64, &x65, x63, x41, x55); - fiat_p1913_addcarryx_u64(&x66, &x67, x65, x43, x57); - fiat_p1913_addcarryx_u64(&x68, &x69, x67, x44, x59); - fiat_p1913_mulx_u64(&x70, &x71, x60, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x72, &x73, x60, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x74, &x75, x60, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x76, &x77, x60, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x78, &x79, 0x0, x77, x74); - fiat_p1913_addcarryx_u64(&x80, &x81, x79, x75, x72); - fiat_p1913_addcarryx_u64(&x82, &x83, x81, x73, x70); - x84 = (x83 + x71); - fiat_p1913_addcarryx_u64(&x85, &x86, 0x0, x60, x76); - fiat_p1913_addcarryx_u64(&x87, &x88, x86, x62, x78); - fiat_p1913_addcarryx_u64(&x89, &x90, x88, x64, x80); - fiat_p1913_addcarryx_u64(&x91, &x92, x90, x66, x82); - fiat_p1913_addcarryx_u64(&x93, &x94, x92, x68, x84); - x95 = ((uint64_t)x94 + x69); - fiat_p1913_mulx_u64(&x96, &x97, x2, (arg1[3])); - fiat_p1913_mulx_u64(&x98, &x99, x2, (arg1[2])); - fiat_p1913_mulx_u64(&x100, &x101, x2, (arg1[1])); - fiat_p1913_mulx_u64(&x102, &x103, x2, (arg1[0])); - fiat_p1913_addcarryx_u64(&x104, &x105, 0x0, x103, x100); - fiat_p1913_addcarryx_u64(&x106, &x107, x105, x101, x98); - fiat_p1913_addcarryx_u64(&x108, &x109, x107, x99, x96); - x110 = (x109 + x97); - fiat_p1913_addcarryx_u64(&x111, &x112, 0x0, x87, x102); - fiat_p1913_addcarryx_u64(&x113, &x114, x112, x89, x104); - fiat_p1913_addcarryx_u64(&x115, &x116, x114, x91, x106); - fiat_p1913_addcarryx_u64(&x117, &x118, x116, x93, x108); - fiat_p1913_addcarryx_u64(&x119, &x120, x118, x95, x110); - fiat_p1913_mulx_u64(&x121, &x122, x111, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x123, &x124, x111, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x125, &x126, x111, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x127, &x128, x111, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x129, &x130, 0x0, x128, x125); - fiat_p1913_addcarryx_u64(&x131, &x132, x130, x126, x123); - fiat_p1913_addcarryx_u64(&x133, &x134, x132, x124, x121); - x135 = (x134 + x122); - fiat_p1913_addcarryx_u64(&x136, &x137, 0x0, x111, x127); - fiat_p1913_addcarryx_u64(&x138, &x139, x137, x113, x129); - fiat_p1913_addcarryx_u64(&x140, &x141, x139, x115, x131); - fiat_p1913_addcarryx_u64(&x142, &x143, x141, x117, x133); - fiat_p1913_addcarryx_u64(&x144, &x145, x143, x119, x135); - x146 = ((uint64_t)x145 + x120); - fiat_p1913_mulx_u64(&x147, &x148, x3, (arg1[3])); - fiat_p1913_mulx_u64(&x149, &x150, x3, (arg1[2])); - fiat_p1913_mulx_u64(&x151, &x152, x3, (arg1[1])); - fiat_p1913_mulx_u64(&x153, &x154, x3, (arg1[0])); - fiat_p1913_addcarryx_u64(&x155, &x156, 0x0, x154, x151); - fiat_p1913_addcarryx_u64(&x157, &x158, x156, x152, x149); - fiat_p1913_addcarryx_u64(&x159, &x160, x158, x150, x147); - x161 = (x160 + x148); - fiat_p1913_addcarryx_u64(&x162, &x163, 0x0, x138, x153); - fiat_p1913_addcarryx_u64(&x164, &x165, x163, x140, x155); - fiat_p1913_addcarryx_u64(&x166, &x167, x165, x142, x157); - fiat_p1913_addcarryx_u64(&x168, &x169, x167, x144, x159); - fiat_p1913_addcarryx_u64(&x170, &x171, x169, x146, x161); - fiat_p1913_mulx_u64(&x172, &x173, x162, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x174, &x175, x162, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x176, &x177, x162, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x178, &x179, x162, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x180, &x181, 0x0, x179, x176); - fiat_p1913_addcarryx_u64(&x182, &x183, x181, x177, x174); - fiat_p1913_addcarryx_u64(&x184, &x185, x183, x175, x172); - x186 = (x185 + x173); - fiat_p1913_addcarryx_u64(&x187, &x188, 0x0, x162, x178); - fiat_p1913_addcarryx_u64(&x189, &x190, x188, x164, x180); - fiat_p1913_addcarryx_u64(&x191, &x192, x190, x166, x182); - fiat_p1913_addcarryx_u64(&x193, &x194, x192, x168, x184); - fiat_p1913_addcarryx_u64(&x195, &x196, x194, x170, x186); - x197 = ((uint64_t)x196 + x171); - fiat_p1913_subborrowx_u64(&x198, &x199, 0x0, x189, UINT64_C(0xffffffffffffffff)); - fiat_p1913_subborrowx_u64(&x200, &x201, x199, x191, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_subborrowx_u64(&x202, &x203, x201, x193, UINT64_C(0x33a6a86587407437)); - fiat_p1913_subborrowx_u64(&x204, &x205, x203, x195, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_subborrowx_u64(&x206, &x207, x205, x197, 0x0); - fiat_p1913_cmovznz_u64(&x208, x207, x198, x189); - fiat_p1913_cmovznz_u64(&x209, x207, x200, x191); - fiat_p1913_cmovznz_u64(&x210, x207, x202, x193); - fiat_p1913_cmovznz_u64(&x211, x207, x204, x195); - out1[0] = x208; - out1[1] = x209; - out1[2] = x210; - out1[3] = x211; -} - -/* - * The function fiat_p1913_add adds two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_add(fiat_p1913_montgomery_domain_field_element out1, const fiat_p1913_montgomery_domain_field_element arg1, const fiat_p1913_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p1913_uint1 x2; - uint64_t x3; - fiat_p1913_uint1 x4; - uint64_t x5; - fiat_p1913_uint1 x6; - uint64_t x7; - fiat_p1913_uint1 x8; - uint64_t x9; - fiat_p1913_uint1 x10; - uint64_t x11; - fiat_p1913_uint1 x12; - uint64_t x13; - fiat_p1913_uint1 x14; - uint64_t x15; - fiat_p1913_uint1 x16; - uint64_t x17; - fiat_p1913_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - fiat_p1913_addcarryx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p1913_addcarryx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p1913_addcarryx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p1913_addcarryx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p1913_subborrowx_u64(&x9, &x10, 0x0, x1, UINT64_C(0xffffffffffffffff)); - fiat_p1913_subborrowx_u64(&x11, &x12, x10, x3, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_subborrowx_u64(&x13, &x14, x12, x5, UINT64_C(0x33a6a86587407437)); - fiat_p1913_subborrowx_u64(&x15, &x16, x14, x7, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_subborrowx_u64(&x17, &x18, x16, x8, 0x0); - fiat_p1913_cmovznz_u64(&x19, x18, x9, x1); - fiat_p1913_cmovznz_u64(&x20, x18, x11, x3); - fiat_p1913_cmovznz_u64(&x21, x18, x13, x5); - fiat_p1913_cmovznz_u64(&x22, x18, x15, x7); - out1[0] = x19; - out1[1] = x20; - out1[2] = x21; - out1[3] = x22; -} - -/* - * The function fiat_p1913_sub subtracts two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_sub(fiat_p1913_montgomery_domain_field_element out1, const fiat_p1913_montgomery_domain_field_element arg1, const fiat_p1913_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p1913_uint1 x2; - uint64_t x3; - fiat_p1913_uint1 x4; - uint64_t x5; - fiat_p1913_uint1 x6; - uint64_t x7; - fiat_p1913_uint1 x8; - uint64_t x9; - uint64_t x10; - fiat_p1913_uint1 x11; - uint64_t x12; - fiat_p1913_uint1 x13; - uint64_t x14; - fiat_p1913_uint1 x15; - uint64_t x16; - fiat_p1913_uint1 x17; - fiat_p1913_subborrowx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p1913_subborrowx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p1913_subborrowx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p1913_subborrowx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p1913_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x10, &x11, 0x0, x1, x9); - fiat_p1913_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT64_C(0x252c9e49355147ff))); - fiat_p1913_addcarryx_u64(&x14, &x15, x13, x5, (x9 & UINT64_C(0x33a6a86587407437))); - fiat_p1913_addcarryx_u64(&x16, &x17, x15, x7, (x9 & UINT64_C(0x34e29e286b95d98c))); - out1[0] = x10; - out1[1] = x12; - out1[2] = x14; - out1[3] = x16; -} - -/* - * The function fiat_p1913_opp negates a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = -eval (from_montgomery arg1) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_opp(fiat_p1913_montgomery_domain_field_element out1, const fiat_p1913_montgomery_domain_field_element arg1) { - uint64_t x1; - fiat_p1913_uint1 x2; - uint64_t x3; - fiat_p1913_uint1 x4; - uint64_t x5; - fiat_p1913_uint1 x6; - uint64_t x7; - fiat_p1913_uint1 x8; - uint64_t x9; - uint64_t x10; - fiat_p1913_uint1 x11; - uint64_t x12; - fiat_p1913_uint1 x13; - uint64_t x14; - fiat_p1913_uint1 x15; - uint64_t x16; - fiat_p1913_uint1 x17; - fiat_p1913_subborrowx_u64(&x1, &x2, 0x0, 0x0, (arg1[0])); - fiat_p1913_subborrowx_u64(&x3, &x4, x2, 0x0, (arg1[1])); - fiat_p1913_subborrowx_u64(&x5, &x6, x4, 0x0, (arg1[2])); - fiat_p1913_subborrowx_u64(&x7, &x8, x6, 0x0, (arg1[3])); - fiat_p1913_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x10, &x11, 0x0, x1, x9); - fiat_p1913_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT64_C(0x252c9e49355147ff))); - fiat_p1913_addcarryx_u64(&x14, &x15, x13, x5, (x9 & UINT64_C(0x33a6a86587407437))); - fiat_p1913_addcarryx_u64(&x16, &x17, x15, x7, (x9 & UINT64_C(0x34e29e286b95d98c))); - out1[0] = x10; - out1[1] = x12; - out1[2] = x14; - out1[3] = x16; -} - -/* - * The function fiat_p1913_from_montgomery translates a field element out of the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^4) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_from_montgomery(fiat_p1913_non_montgomery_domain_field_element out1, const fiat_p1913_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - fiat_p1913_uint1 x11; - uint64_t x12; - fiat_p1913_uint1 x13; - uint64_t x14; - fiat_p1913_uint1 x15; - uint64_t x16; - fiat_p1913_uint1 x17; - uint64_t x18; - fiat_p1913_uint1 x19; - uint64_t x20; - fiat_p1913_uint1 x21; - uint64_t x22; - fiat_p1913_uint1 x23; - uint64_t x24; - fiat_p1913_uint1 x25; - uint64_t x26; - fiat_p1913_uint1 x27; - uint64_t x28; - fiat_p1913_uint1 x29; - uint64_t x30; - uint64_t x31; - uint64_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - fiat_p1913_uint1 x39; - uint64_t x40; - fiat_p1913_uint1 x41; - uint64_t x42; - fiat_p1913_uint1 x43; - uint64_t x44; - fiat_p1913_uint1 x45; - uint64_t x46; - fiat_p1913_uint1 x47; - uint64_t x48; - fiat_p1913_uint1 x49; - uint64_t x50; - fiat_p1913_uint1 x51; - uint64_t x52; - fiat_p1913_uint1 x53; - uint64_t x54; - fiat_p1913_uint1 x55; - uint64_t x56; - fiat_p1913_uint1 x57; - uint64_t x58; - uint64_t x59; - uint64_t x60; - uint64_t x61; - uint64_t x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - fiat_p1913_uint1 x67; - uint64_t x68; - fiat_p1913_uint1 x69; - uint64_t x70; - fiat_p1913_uint1 x71; - uint64_t x72; - fiat_p1913_uint1 x73; - uint64_t x74; - fiat_p1913_uint1 x75; - uint64_t x76; - fiat_p1913_uint1 x77; - uint64_t x78; - fiat_p1913_uint1 x79; - uint64_t x80; - fiat_p1913_uint1 x81; - uint64_t x82; - fiat_p1913_uint1 x83; - uint64_t x84; - fiat_p1913_uint1 x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - fiat_p1913_uint1 x95; - uint64_t x96; - fiat_p1913_uint1 x97; - uint64_t x98; - fiat_p1913_uint1 x99; - uint64_t x100; - fiat_p1913_uint1 x101; - uint64_t x102; - fiat_p1913_uint1 x103; - uint64_t x104; - fiat_p1913_uint1 x105; - uint64_t x106; - fiat_p1913_uint1 x107; - uint64_t x108; - uint64_t x109; - fiat_p1913_uint1 x110; - uint64_t x111; - fiat_p1913_uint1 x112; - uint64_t x113; - fiat_p1913_uint1 x114; - uint64_t x115; - fiat_p1913_uint1 x116; - uint64_t x117; - fiat_p1913_uint1 x118; - uint64_t x119; - uint64_t x120; - uint64_t x121; - uint64_t x122; - x1 = (arg1[0]); - fiat_p1913_mulx_u64(&x2, &x3, x1, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x4, &x5, x1, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x6, &x7, x1, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x8, &x9, x1, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x10, &x11, 0x0, x9, x6); - fiat_p1913_addcarryx_u64(&x12, &x13, x11, x7, x4); - fiat_p1913_addcarryx_u64(&x14, &x15, x13, x5, x2); - fiat_p1913_addcarryx_u64(&x16, &x17, 0x0, x1, x8); - fiat_p1913_addcarryx_u64(&x18, &x19, x17, 0x0, x10); - fiat_p1913_addcarryx_u64(&x20, &x21, x19, 0x0, x12); - fiat_p1913_addcarryx_u64(&x22, &x23, x21, 0x0, x14); - fiat_p1913_addcarryx_u64(&x24, &x25, 0x0, x18, (arg1[1])); - fiat_p1913_addcarryx_u64(&x26, &x27, x25, x20, 0x0); - fiat_p1913_addcarryx_u64(&x28, &x29, x27, x22, 0x0); - fiat_p1913_mulx_u64(&x30, &x31, x24, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x32, &x33, x24, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x34, &x35, x24, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x36, &x37, x24, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x38, &x39, 0x0, x37, x34); - fiat_p1913_addcarryx_u64(&x40, &x41, x39, x35, x32); - fiat_p1913_addcarryx_u64(&x42, &x43, x41, x33, x30); - fiat_p1913_addcarryx_u64(&x44, &x45, 0x0, x24, x36); - fiat_p1913_addcarryx_u64(&x46, &x47, x45, x26, x38); - fiat_p1913_addcarryx_u64(&x48, &x49, x47, x28, x40); - fiat_p1913_addcarryx_u64(&x50, &x51, x49, (x29 + (x23 + (x15 + x3))), x42); - fiat_p1913_addcarryx_u64(&x52, &x53, 0x0, x46, (arg1[2])); - fiat_p1913_addcarryx_u64(&x54, &x55, x53, x48, 0x0); - fiat_p1913_addcarryx_u64(&x56, &x57, x55, x50, 0x0); - fiat_p1913_mulx_u64(&x58, &x59, x52, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x60, &x61, x52, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x62, &x63, x52, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x64, &x65, x52, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x66, &x67, 0x0, x65, x62); - fiat_p1913_addcarryx_u64(&x68, &x69, x67, x63, x60); - fiat_p1913_addcarryx_u64(&x70, &x71, x69, x61, x58); - fiat_p1913_addcarryx_u64(&x72, &x73, 0x0, x52, x64); - fiat_p1913_addcarryx_u64(&x74, &x75, x73, x54, x66); - fiat_p1913_addcarryx_u64(&x76, &x77, x75, x56, x68); - fiat_p1913_addcarryx_u64(&x78, &x79, x77, (x57 + (x51 + (x43 + x31))), x70); - fiat_p1913_addcarryx_u64(&x80, &x81, 0x0, x74, (arg1[3])); - fiat_p1913_addcarryx_u64(&x82, &x83, x81, x76, 0x0); - fiat_p1913_addcarryx_u64(&x84, &x85, x83, x78, 0x0); - fiat_p1913_mulx_u64(&x86, &x87, x80, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x88, &x89, x80, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x90, &x91, x80, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x92, &x93, x80, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x94, &x95, 0x0, x93, x90); - fiat_p1913_addcarryx_u64(&x96, &x97, x95, x91, x88); - fiat_p1913_addcarryx_u64(&x98, &x99, x97, x89, x86); - fiat_p1913_addcarryx_u64(&x100, &x101, 0x0, x80, x92); - fiat_p1913_addcarryx_u64(&x102, &x103, x101, x82, x94); - fiat_p1913_addcarryx_u64(&x104, &x105, x103, x84, x96); - fiat_p1913_addcarryx_u64(&x106, &x107, x105, (x85 + (x79 + (x71 + x59))), x98); - x108 = (x107 + (x99 + x87)); - fiat_p1913_subborrowx_u64(&x109, &x110, 0x0, x102, UINT64_C(0xffffffffffffffff)); - fiat_p1913_subborrowx_u64(&x111, &x112, x110, x104, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_subborrowx_u64(&x113, &x114, x112, x106, UINT64_C(0x33a6a86587407437)); - fiat_p1913_subborrowx_u64(&x115, &x116, x114, x108, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_subborrowx_u64(&x117, &x118, x116, 0x0, 0x0); - fiat_p1913_cmovznz_u64(&x119, x118, x109, x102); - fiat_p1913_cmovznz_u64(&x120, x118, x111, x104); - fiat_p1913_cmovznz_u64(&x121, x118, x113, x106); - fiat_p1913_cmovznz_u64(&x122, x118, x115, x108); - out1[0] = x119; - out1[1] = x120; - out1[2] = x121; - out1[3] = x122; -} - -/* - * The function fiat_p1913_to_montgomery translates a field element into the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = eval arg1 mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_to_montgomery(fiat_p1913_montgomery_domain_field_element out1, const fiat_p1913_non_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - fiat_p1913_uint1 x14; - uint64_t x15; - fiat_p1913_uint1 x16; - uint64_t x17; - fiat_p1913_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - fiat_p1913_uint1 x28; - uint64_t x29; - fiat_p1913_uint1 x30; - uint64_t x31; - fiat_p1913_uint1 x32; - uint64_t x33; - fiat_p1913_uint1 x34; - uint64_t x35; - fiat_p1913_uint1 x36; - uint64_t x37; - fiat_p1913_uint1 x38; - uint64_t x39; - fiat_p1913_uint1 x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - fiat_p1913_uint1 x50; - uint64_t x51; - fiat_p1913_uint1 x52; - uint64_t x53; - fiat_p1913_uint1 x54; - uint64_t x55; - fiat_p1913_uint1 x56; - uint64_t x57; - fiat_p1913_uint1 x58; - uint64_t x59; - fiat_p1913_uint1 x60; - uint64_t x61; - fiat_p1913_uint1 x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - fiat_p1913_uint1 x72; - uint64_t x73; - fiat_p1913_uint1 x74; - uint64_t x75; - fiat_p1913_uint1 x76; - uint64_t x77; - fiat_p1913_uint1 x78; - uint64_t x79; - fiat_p1913_uint1 x80; - uint64_t x81; - fiat_p1913_uint1 x82; - uint64_t x83; - fiat_p1913_uint1 x84; - uint64_t x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - fiat_p1913_uint1 x94; - uint64_t x95; - fiat_p1913_uint1 x96; - uint64_t x97; - fiat_p1913_uint1 x98; - uint64_t x99; - fiat_p1913_uint1 x100; - uint64_t x101; - fiat_p1913_uint1 x102; - uint64_t x103; - fiat_p1913_uint1 x104; - uint64_t x105; - fiat_p1913_uint1 x106; - uint64_t x107; - uint64_t x108; - uint64_t x109; - uint64_t x110; - uint64_t x111; - uint64_t x112; - uint64_t x113; - uint64_t x114; - uint64_t x115; - fiat_p1913_uint1 x116; - uint64_t x117; - fiat_p1913_uint1 x118; - uint64_t x119; - fiat_p1913_uint1 x120; - uint64_t x121; - fiat_p1913_uint1 x122; - uint64_t x123; - fiat_p1913_uint1 x124; - uint64_t x125; - fiat_p1913_uint1 x126; - uint64_t x127; - fiat_p1913_uint1 x128; - uint64_t x129; - uint64_t x130; - uint64_t x131; - uint64_t x132; - uint64_t x133; - uint64_t x134; - uint64_t x135; - uint64_t x136; - uint64_t x137; - fiat_p1913_uint1 x138; - uint64_t x139; - fiat_p1913_uint1 x140; - uint64_t x141; - fiat_p1913_uint1 x142; - uint64_t x143; - fiat_p1913_uint1 x144; - uint64_t x145; - fiat_p1913_uint1 x146; - uint64_t x147; - fiat_p1913_uint1 x148; - uint64_t x149; - fiat_p1913_uint1 x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - uint64_t x155; - uint64_t x156; - uint64_t x157; - uint64_t x158; - uint64_t x159; - fiat_p1913_uint1 x160; - uint64_t x161; - fiat_p1913_uint1 x162; - uint64_t x163; - fiat_p1913_uint1 x164; - uint64_t x165; - fiat_p1913_uint1 x166; - uint64_t x167; - fiat_p1913_uint1 x168; - uint64_t x169; - fiat_p1913_uint1 x170; - uint64_t x171; - fiat_p1913_uint1 x172; - uint64_t x173; - uint64_t x174; - fiat_p1913_uint1 x175; - uint64_t x176; - fiat_p1913_uint1 x177; - uint64_t x178; - fiat_p1913_uint1 x179; - uint64_t x180; - fiat_p1913_uint1 x181; - uint64_t x182; - fiat_p1913_uint1 x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[0]); - fiat_p1913_mulx_u64(&x5, &x6, x4, UINT64_C(0xd72e7d67c30cd3d)); - fiat_p1913_mulx_u64(&x7, &x8, x4, UINT64_C(0x30a841ab0920655d)); - fiat_p1913_mulx_u64(&x9, &x10, x4, UINT64_C(0x20afd6c1025a1c2e)); - fiat_p1913_mulx_u64(&x11, &x12, x4, UINT64_C(0x233625ae400674d4)); - fiat_p1913_addcarryx_u64(&x13, &x14, 0x0, x12, x9); - fiat_p1913_addcarryx_u64(&x15, &x16, x14, x10, x7); - fiat_p1913_addcarryx_u64(&x17, &x18, x16, x8, x5); - fiat_p1913_mulx_u64(&x19, &x20, x11, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x21, &x22, x11, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x23, &x24, x11, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x25, &x26, x11, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x27, &x28, 0x0, x26, x23); - fiat_p1913_addcarryx_u64(&x29, &x30, x28, x24, x21); - fiat_p1913_addcarryx_u64(&x31, &x32, x30, x22, x19); - fiat_p1913_addcarryx_u64(&x33, &x34, 0x0, x11, x25); - fiat_p1913_addcarryx_u64(&x35, &x36, x34, x13, x27); - fiat_p1913_addcarryx_u64(&x37, &x38, x36, x15, x29); - fiat_p1913_addcarryx_u64(&x39, &x40, x38, x17, x31); - fiat_p1913_mulx_u64(&x41, &x42, x1, UINT64_C(0xd72e7d67c30cd3d)); - fiat_p1913_mulx_u64(&x43, &x44, x1, UINT64_C(0x30a841ab0920655d)); - fiat_p1913_mulx_u64(&x45, &x46, x1, UINT64_C(0x20afd6c1025a1c2e)); - fiat_p1913_mulx_u64(&x47, &x48, x1, UINT64_C(0x233625ae400674d4)); - fiat_p1913_addcarryx_u64(&x49, &x50, 0x0, x48, x45); - fiat_p1913_addcarryx_u64(&x51, &x52, x50, x46, x43); - fiat_p1913_addcarryx_u64(&x53, &x54, x52, x44, x41); - fiat_p1913_addcarryx_u64(&x55, &x56, 0x0, x35, x47); - fiat_p1913_addcarryx_u64(&x57, &x58, x56, x37, x49); - fiat_p1913_addcarryx_u64(&x59, &x60, x58, x39, x51); - fiat_p1913_addcarryx_u64(&x61, &x62, x60, ((x40 + (x18 + x6)) + (x32 + x20)), x53); - fiat_p1913_mulx_u64(&x63, &x64, x55, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x65, &x66, x55, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x67, &x68, x55, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x69, &x70, x55, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x71, &x72, 0x0, x70, x67); - fiat_p1913_addcarryx_u64(&x73, &x74, x72, x68, x65); - fiat_p1913_addcarryx_u64(&x75, &x76, x74, x66, x63); - fiat_p1913_addcarryx_u64(&x77, &x78, 0x0, x55, x69); - fiat_p1913_addcarryx_u64(&x79, &x80, x78, x57, x71); - fiat_p1913_addcarryx_u64(&x81, &x82, x80, x59, x73); - fiat_p1913_addcarryx_u64(&x83, &x84, x82, x61, x75); - fiat_p1913_mulx_u64(&x85, &x86, x2, UINT64_C(0xd72e7d67c30cd3d)); - fiat_p1913_mulx_u64(&x87, &x88, x2, UINT64_C(0x30a841ab0920655d)); - fiat_p1913_mulx_u64(&x89, &x90, x2, UINT64_C(0x20afd6c1025a1c2e)); - fiat_p1913_mulx_u64(&x91, &x92, x2, UINT64_C(0x233625ae400674d4)); - fiat_p1913_addcarryx_u64(&x93, &x94, 0x0, x92, x89); - fiat_p1913_addcarryx_u64(&x95, &x96, x94, x90, x87); - fiat_p1913_addcarryx_u64(&x97, &x98, x96, x88, x85); - fiat_p1913_addcarryx_u64(&x99, &x100, 0x0, x79, x91); - fiat_p1913_addcarryx_u64(&x101, &x102, x100, x81, x93); - fiat_p1913_addcarryx_u64(&x103, &x104, x102, x83, x95); - fiat_p1913_addcarryx_u64(&x105, &x106, x104, ((x84 + (x62 + (x54 + x42))) + (x76 + x64)), x97); - fiat_p1913_mulx_u64(&x107, &x108, x99, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x109, &x110, x99, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x111, &x112, x99, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x115, &x116, 0x0, x114, x111); - fiat_p1913_addcarryx_u64(&x117, &x118, x116, x112, x109); - fiat_p1913_addcarryx_u64(&x119, &x120, x118, x110, x107); - fiat_p1913_addcarryx_u64(&x121, &x122, 0x0, x99, x113); - fiat_p1913_addcarryx_u64(&x123, &x124, x122, x101, x115); - fiat_p1913_addcarryx_u64(&x125, &x126, x124, x103, x117); - fiat_p1913_addcarryx_u64(&x127, &x128, x126, x105, x119); - fiat_p1913_mulx_u64(&x129, &x130, x3, UINT64_C(0xd72e7d67c30cd3d)); - fiat_p1913_mulx_u64(&x131, &x132, x3, UINT64_C(0x30a841ab0920655d)); - fiat_p1913_mulx_u64(&x133, &x134, x3, UINT64_C(0x20afd6c1025a1c2e)); - fiat_p1913_mulx_u64(&x135, &x136, x3, UINT64_C(0x233625ae400674d4)); - fiat_p1913_addcarryx_u64(&x137, &x138, 0x0, x136, x133); - fiat_p1913_addcarryx_u64(&x139, &x140, x138, x134, x131); - fiat_p1913_addcarryx_u64(&x141, &x142, x140, x132, x129); - fiat_p1913_addcarryx_u64(&x143, &x144, 0x0, x123, x135); - fiat_p1913_addcarryx_u64(&x145, &x146, x144, x125, x137); - fiat_p1913_addcarryx_u64(&x147, &x148, x146, x127, x139); - fiat_p1913_addcarryx_u64(&x149, &x150, x148, ((x128 + (x106 + (x98 + x86))) + (x120 + x108)), x141); - fiat_p1913_mulx_u64(&x151, &x152, x143, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_mulx_u64(&x153, &x154, x143, UINT64_C(0x33a6a86587407437)); - fiat_p1913_mulx_u64(&x155, &x156, x143, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_mulx_u64(&x157, &x158, x143, UINT64_C(0xffffffffffffffff)); - fiat_p1913_addcarryx_u64(&x159, &x160, 0x0, x158, x155); - fiat_p1913_addcarryx_u64(&x161, &x162, x160, x156, x153); - fiat_p1913_addcarryx_u64(&x163, &x164, x162, x154, x151); - fiat_p1913_addcarryx_u64(&x165, &x166, 0x0, x143, x157); - fiat_p1913_addcarryx_u64(&x167, &x168, x166, x145, x159); - fiat_p1913_addcarryx_u64(&x169, &x170, x168, x147, x161); - fiat_p1913_addcarryx_u64(&x171, &x172, x170, x149, x163); - x173 = ((x172 + (x150 + (x142 + x130))) + (x164 + x152)); - fiat_p1913_subborrowx_u64(&x174, &x175, 0x0, x167, UINT64_C(0xffffffffffffffff)); - fiat_p1913_subborrowx_u64(&x176, &x177, x175, x169, UINT64_C(0x252c9e49355147ff)); - fiat_p1913_subborrowx_u64(&x178, &x179, x177, x171, UINT64_C(0x33a6a86587407437)); - fiat_p1913_subborrowx_u64(&x180, &x181, x179, x173, UINT64_C(0x34e29e286b95d98c)); - fiat_p1913_subborrowx_u64(&x182, &x183, x181, 0x0, 0x0); - fiat_p1913_cmovznz_u64(&x184, x183, x174, x167); - fiat_p1913_cmovznz_u64(&x185, x183, x176, x169); - fiat_p1913_cmovznz_u64(&x186, x183, x178, x171); - fiat_p1913_cmovznz_u64(&x187, x183, x180, x173); - out1[0] = x184; - out1[1] = x185; - out1[2] = x186; - out1[3] = x187; -} - -/* - * The function fiat_p1913_nonzero outputs a single non-zero word if the input is non-zero and zero otherwise. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * out1 = 0 ↔ eval (from_montgomery arg1) mod m = 0 - * - * Input Bounds: - * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p1913_nonzero(uint64_t* out1, const uint64_t arg1[4]) { - uint64_t x1; - x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | (arg1[3])))); - *out1 = x1; -} - -/* - * The function fiat_p1913_selectznz is a multi-limb conditional select. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -void fiat_p1913_selectznz(uint64_t out1[4], fiat_p1913_uint1 arg1, const uint64_t arg2[4], const uint64_t arg3[4]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - fiat_p1913_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0])); - fiat_p1913_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1])); - fiat_p1913_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2])); - fiat_p1913_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; -} - -/* - * The function fiat_p1913_to_bytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..31] - * - * Input Bounds: - * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x3fffffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x3f]] - */ -void fiat_p1913_to_bytes(uint8_t out1[32], const uint64_t arg1[4]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint8_t x5; - uint64_t x6; - uint8_t x7; - uint64_t x8; - uint8_t x9; - uint64_t x10; - uint8_t x11; - uint64_t x12; - uint8_t x13; - uint64_t x14; - uint8_t x15; - uint64_t x16; - uint8_t x17; - uint8_t x18; - uint8_t x19; - uint64_t x20; - uint8_t x21; - uint64_t x22; - uint8_t x23; - uint64_t x24; - uint8_t x25; - uint64_t x26; - uint8_t x27; - uint64_t x28; - uint8_t x29; - uint64_t x30; - uint8_t x31; - uint8_t x32; - uint8_t x33; - uint64_t x34; - uint8_t x35; - uint64_t x36; - uint8_t x37; - uint64_t x38; - uint8_t x39; - uint64_t x40; - uint8_t x41; - uint64_t x42; - uint8_t x43; - uint64_t x44; - uint8_t x45; - uint8_t x46; - uint8_t x47; - uint64_t x48; - uint8_t x49; - uint64_t x50; - uint8_t x51; - uint64_t x52; - uint8_t x53; - uint64_t x54; - uint8_t x55; - uint64_t x56; - uint8_t x57; - uint64_t x58; - uint8_t x59; - uint8_t x60; - x1 = (arg1[3]); - x2 = (arg1[2]); - x3 = (arg1[1]); - x4 = (arg1[0]); - x5 = (uint8_t)(x4 & UINT8_C(0xff)); - x6 = (x4 >> 8); - x7 = (uint8_t)(x6 & UINT8_C(0xff)); - x8 = (x6 >> 8); - x9 = (uint8_t)(x8 & UINT8_C(0xff)); - x10 = (x8 >> 8); - x11 = (uint8_t)(x10 & UINT8_C(0xff)); - x12 = (x10 >> 8); - x13 = (uint8_t)(x12 & UINT8_C(0xff)); - x14 = (x12 >> 8); - x15 = (uint8_t)(x14 & UINT8_C(0xff)); - x16 = (x14 >> 8); - x17 = (uint8_t)(x16 & UINT8_C(0xff)); - x18 = (uint8_t)(x16 >> 8); - x19 = (uint8_t)(x3 & UINT8_C(0xff)); - x20 = (x3 >> 8); - x21 = (uint8_t)(x20 & UINT8_C(0xff)); - x22 = (x20 >> 8); - x23 = (uint8_t)(x22 & UINT8_C(0xff)); - x24 = (x22 >> 8); - x25 = (uint8_t)(x24 & UINT8_C(0xff)); - x26 = (x24 >> 8); - x27 = (uint8_t)(x26 & UINT8_C(0xff)); - x28 = (x26 >> 8); - x29 = (uint8_t)(x28 & UINT8_C(0xff)); - x30 = (x28 >> 8); - x31 = (uint8_t)(x30 & UINT8_C(0xff)); - x32 = (uint8_t)(x30 >> 8); - x33 = (uint8_t)(x2 & UINT8_C(0xff)); - x34 = (x2 >> 8); - x35 = (uint8_t)(x34 & UINT8_C(0xff)); - x36 = (x34 >> 8); - x37 = (uint8_t)(x36 & UINT8_C(0xff)); - x38 = (x36 >> 8); - x39 = (uint8_t)(x38 & UINT8_C(0xff)); - x40 = (x38 >> 8); - x41 = (uint8_t)(x40 & UINT8_C(0xff)); - x42 = (x40 >> 8); - x43 = (uint8_t)(x42 & UINT8_C(0xff)); - x44 = (x42 >> 8); - x45 = (uint8_t)(x44 & UINT8_C(0xff)); - x46 = (uint8_t)(x44 >> 8); - x47 = (uint8_t)(x1 & UINT8_C(0xff)); - x48 = (x1 >> 8); - x49 = (uint8_t)(x48 & UINT8_C(0xff)); - x50 = (x48 >> 8); - x51 = (uint8_t)(x50 & UINT8_C(0xff)); - x52 = (x50 >> 8); - x53 = (uint8_t)(x52 & UINT8_C(0xff)); - x54 = (x52 >> 8); - x55 = (uint8_t)(x54 & UINT8_C(0xff)); - x56 = (x54 >> 8); - x57 = (uint8_t)(x56 & UINT8_C(0xff)); - x58 = (x56 >> 8); - x59 = (uint8_t)(x58 & UINT8_C(0xff)); - x60 = (uint8_t)(x58 >> 8); - out1[0] = x5; - out1[1] = x7; - out1[2] = x9; - out1[3] = x11; - out1[4] = x13; - out1[5] = x15; - out1[6] = x17; - out1[7] = x18; - out1[8] = x19; - out1[9] = x21; - out1[10] = x23; - out1[11] = x25; - out1[12] = x27; - out1[13] = x29; - out1[14] = x31; - out1[15] = x32; - out1[16] = x33; - out1[17] = x35; - out1[18] = x37; - out1[19] = x39; - out1[20] = x41; - out1[21] = x43; - out1[22] = x45; - out1[23] = x46; - out1[24] = x47; - out1[25] = x49; - out1[26] = x51; - out1[27] = x53; - out1[28] = x55; - out1[29] = x57; - out1[30] = x59; - out1[31] = x60; -} - -/* - * The function fiat_p1913_from_bytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order. - * - * Preconditions: - * 0 ≤ bytes_eval arg1 < m - * Postconditions: - * eval out1 mod m = bytes_eval arg1 mod m - * 0 ≤ eval out1 < m - * - * Input Bounds: - * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x3f]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x3fffffffffffffff]] - */ -void fiat_p1913_from_bytes(uint64_t out1[4], const uint8_t arg1[32]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint8_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint8_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint8_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - uint8_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint64_t x55; - uint64_t x56; - uint64_t x57; - uint64_t x58; - uint64_t x59; - uint64_t x60; - x1 = ((uint64_t)(arg1[31]) << 56); - x2 = ((uint64_t)(arg1[30]) << 48); - x3 = ((uint64_t)(arg1[29]) << 40); - x4 = ((uint64_t)(arg1[28]) << 32); - x5 = ((uint64_t)(arg1[27]) << 24); - x6 = ((uint64_t)(arg1[26]) << 16); - x7 = ((uint64_t)(arg1[25]) << 8); - x8 = (arg1[24]); - x9 = ((uint64_t)(arg1[23]) << 56); - x10 = ((uint64_t)(arg1[22]) << 48); - x11 = ((uint64_t)(arg1[21]) << 40); - x12 = ((uint64_t)(arg1[20]) << 32); - x13 = ((uint64_t)(arg1[19]) << 24); - x14 = ((uint64_t)(arg1[18]) << 16); - x15 = ((uint64_t)(arg1[17]) << 8); - x16 = (arg1[16]); - x17 = ((uint64_t)(arg1[15]) << 56); - x18 = ((uint64_t)(arg1[14]) << 48); - x19 = ((uint64_t)(arg1[13]) << 40); - x20 = ((uint64_t)(arg1[12]) << 32); - x21 = ((uint64_t)(arg1[11]) << 24); - x22 = ((uint64_t)(arg1[10]) << 16); - x23 = ((uint64_t)(arg1[9]) << 8); - x24 = (arg1[8]); - x25 = ((uint64_t)(arg1[7]) << 56); - x26 = ((uint64_t)(arg1[6]) << 48); - x27 = ((uint64_t)(arg1[5]) << 40); - x28 = ((uint64_t)(arg1[4]) << 32); - x29 = ((uint64_t)(arg1[3]) << 24); - x30 = ((uint64_t)(arg1[2]) << 16); - x31 = ((uint64_t)(arg1[1]) << 8); - x32 = (arg1[0]); - x33 = (x31 + (uint64_t)x32); - x34 = (x30 + x33); - x35 = (x29 + x34); - x36 = (x28 + x35); - x37 = (x27 + x36); - x38 = (x26 + x37); - x39 = (x25 + x38); - x40 = (x23 + (uint64_t)x24); - x41 = (x22 + x40); - x42 = (x21 + x41); - x43 = (x20 + x42); - x44 = (x19 + x43); - x45 = (x18 + x44); - x46 = (x17 + x45); - x47 = (x15 + (uint64_t)x16); - x48 = (x14 + x47); - x49 = (x13 + x48); - x50 = (x12 + x49); - x51 = (x11 + x50); - x52 = (x10 + x51); - x53 = (x9 + x52); - x54 = (x7 + (uint64_t)x8); - x55 = (x6 + x54); - x56 = (x5 + x55); - x57 = (x4 + x56); - x58 = (x3 + x57); - x59 = (x2 + x58); - x60 = (x1 + x59); - out1[0] = x39; - out1[1] = x46; - out1[2] = x53; - out1[3] = x60; -} - -/* - * The function fiat_p1913_set_one returns the field element one in the Montgomery domain. - * - * Postconditions: - * eval (from_montgomery out1) mod m = 1 mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p1913_set_one(fiat_p1913_montgomery_domain_field_element out1) { - out1[0] = 0x4; - out1[1] = UINT64_C(0x6b4d86db2abae000); - out1[2] = UINT64_C(0x31655e69e2fe2f23); - out1[3] = UINT64_C(0x2c75875e51a899cf); -} - -void fp_add(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p1913_add(out, a, b); -} - -void fp_sub(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p1913_sub(out, a, b); -} - -void fp_sqr(uint64_t* out, const uint64_t* a) { - fiat_p1913_square(out, a); -} - -void fp_mul(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p1913_mul(out, a, b); -} - -void fp_tomont(uint64_t* out, const uint64_t* a) { - fiat_p1913_to_montgomery(out, a); -} - -void fp_frommont(uint64_t* out, const uint64_t* a) { - fiat_p1913_from_montgomery(out, a); -} - -void fp_mont_setone(uint64_t* out) { - fiat_p1913_set_one(out); -} \ No newline at end of file diff --git a/src/gf/ref/lvl1/fp_p3923.c b/src/gf/ref/lvl1/fp_p3923.c deleted file mode 100644 index 2703d72..0000000 --- a/src/gf/ref/lvl1/fp_p3923.c +++ /dev/null @@ -1,1781 +0,0 @@ -/* Autogenerated: 'src/ExtractionOCaml/word_by_word_montgomery' p3923 64 23759399264157352358673788613307970528646815114090876784643387662192449945599 */ -/* curve description: p3923 */ -/* machine_wordsize = 64 (from "64") */ -/* requested operations: (all) */ -/* m = 0x348757eadf5c9530b7311a63633f03db535805fa6e9e48b1ffffffffffffffff (from "23759399264157352358673788613307970528646815114090876784643387662192449945599") */ -/* */ -/* NOTE: In addition to the bounds specified above each function, all */ -/* functions synthesized for this Montgomery arithmetic require the */ -/* input to be strictly less than the prime modulus (m), and also */ -/* require the input to be in the unique saturated representation. */ -/* All functions also ensure that these two properties are true of */ -/* return values. */ -/* */ -/* Computed values: */ -/* eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) */ -/* bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */ -/* twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) in */ -/* if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 */ - -#include -typedef unsigned char fiat_p3923_uint1; -typedef signed char fiat_p3923_int1; -#if defined(__GNUC__) || defined(__clang__) -# define FIAT_P3923_FIAT_EXTENSION __extension__ -# define FIAT_P3923_FIAT_INLINE __inline__ -#else -# define FIAT_P3923_FIAT_EXTENSION -# define FIAT_P3923_FIAT_INLINE -#endif - -FIAT_P3923_FIAT_EXTENSION typedef signed __int128 fiat_p3923_int128; -FIAT_P3923_FIAT_EXTENSION typedef unsigned __int128 fiat_p3923_uint128; - -/* The type fiat_p3923_montgomery_domain_field_element is a field element in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p3923_montgomery_domain_field_element[4]; - -/* The type fiat_p3923_non_montgomery_domain_field_element is a field element NOT in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p3923_non_montgomery_domain_field_element[4]; - -#if (-1 & 3) != 3 -#error "This code only works on a two's complement system" -#endif - - -/* - * The function fiat_p3923_addcarryx_u64 is an addition with carry. - * - * Postconditions: - * out1 = (arg1 + arg2 + arg3) mod 2^64 - * out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_p3923_addcarryx_u64(uint64_t* out1, fiat_p3923_uint1* out2, fiat_p3923_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p3923_uint128 x1; - uint64_t x2; - fiat_p3923_uint1 x3; - x1 = ((arg1 + (fiat_p3923_uint128)arg2) + arg3); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (fiat_p3923_uint1)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p3923_subborrowx_u64 is a subtraction with borrow. - * - * Postconditions: - * out1 = (-arg1 + arg2 + -arg3) mod 2^64 - * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_p3923_subborrowx_u64(uint64_t* out1, fiat_p3923_uint1* out2, fiat_p3923_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p3923_int128 x1; - fiat_p3923_int1 x2; - uint64_t x3; - x1 = ((arg2 - (fiat_p3923_int128)arg1) - arg3); - x2 = (fiat_p3923_int1)(x1 >> 64); - x3 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - *out1 = x3; - *out2 = (fiat_p3923_uint1)(0x0 - x2); -} - -/* - * The function fiat_p3923_mulx_u64 is a multiplication, returning the full double-width result. - * - * Postconditions: - * out1 = (arg1 * arg2) mod 2^64 - * out2 = ⌊arg1 * arg2 / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0xffffffffffffffff] - * arg2: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0xffffffffffffffff] - */ -static void fiat_p3923_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) { - fiat_p3923_uint128 x1; - uint64_t x2; - uint64_t x3; - x1 = ((fiat_p3923_uint128)arg1 * arg2); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (uint64_t)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p3923_cmovznz_u64 is a single-word conditional move. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -static void fiat_p3923_cmovznz_u64(uint64_t* out1, fiat_p3923_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p3923_uint1 x1; - uint64_t x2; - uint64_t x3; - x1 = (!(!arg1)); - x2 = ((fiat_p3923_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff)); - x3 = ((x2 & arg3) | ((~x2) & arg2)); - *out1 = x3; -} - -/* - * The function fiat_p3923_mul multiplies two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_mul(fiat_p3923_montgomery_domain_field_element out1, const fiat_p3923_montgomery_domain_field_element arg1, const fiat_p3923_montgomery_domain_field_element arg2) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - fiat_p3923_uint1 x14; - uint64_t x15; - fiat_p3923_uint1 x16; - uint64_t x17; - fiat_p3923_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - fiat_p3923_uint1 x29; - uint64_t x30; - fiat_p3923_uint1 x31; - uint64_t x32; - fiat_p3923_uint1 x33; - uint64_t x34; - uint64_t x35; - fiat_p3923_uint1 x36; - uint64_t x37; - fiat_p3923_uint1 x38; - uint64_t x39; - fiat_p3923_uint1 x40; - uint64_t x41; - fiat_p3923_uint1 x42; - uint64_t x43; - fiat_p3923_uint1 x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - fiat_p3923_uint1 x54; - uint64_t x55; - fiat_p3923_uint1 x56; - uint64_t x57; - fiat_p3923_uint1 x58; - uint64_t x59; - uint64_t x60; - fiat_p3923_uint1 x61; - uint64_t x62; - fiat_p3923_uint1 x63; - uint64_t x64; - fiat_p3923_uint1 x65; - uint64_t x66; - fiat_p3923_uint1 x67; - uint64_t x68; - fiat_p3923_uint1 x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - fiat_p3923_uint1 x79; - uint64_t x80; - fiat_p3923_uint1 x81; - uint64_t x82; - fiat_p3923_uint1 x83; - uint64_t x84; - uint64_t x85; - fiat_p3923_uint1 x86; - uint64_t x87; - fiat_p3923_uint1 x88; - uint64_t x89; - fiat_p3923_uint1 x90; - uint64_t x91; - fiat_p3923_uint1 x92; - uint64_t x93; - fiat_p3923_uint1 x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - fiat_p3923_uint1 x105; - uint64_t x106; - fiat_p3923_uint1 x107; - uint64_t x108; - fiat_p3923_uint1 x109; - uint64_t x110; - uint64_t x111; - fiat_p3923_uint1 x112; - uint64_t x113; - fiat_p3923_uint1 x114; - uint64_t x115; - fiat_p3923_uint1 x116; - uint64_t x117; - fiat_p3923_uint1 x118; - uint64_t x119; - fiat_p3923_uint1 x120; - uint64_t x121; - uint64_t x122; - uint64_t x123; - uint64_t x124; - uint64_t x125; - uint64_t x126; - uint64_t x127; - uint64_t x128; - uint64_t x129; - fiat_p3923_uint1 x130; - uint64_t x131; - fiat_p3923_uint1 x132; - uint64_t x133; - fiat_p3923_uint1 x134; - uint64_t x135; - uint64_t x136; - fiat_p3923_uint1 x137; - uint64_t x138; - fiat_p3923_uint1 x139; - uint64_t x140; - fiat_p3923_uint1 x141; - uint64_t x142; - fiat_p3923_uint1 x143; - uint64_t x144; - fiat_p3923_uint1 x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - uint64_t x155; - fiat_p3923_uint1 x156; - uint64_t x157; - fiat_p3923_uint1 x158; - uint64_t x159; - fiat_p3923_uint1 x160; - uint64_t x161; - uint64_t x162; - fiat_p3923_uint1 x163; - uint64_t x164; - fiat_p3923_uint1 x165; - uint64_t x166; - fiat_p3923_uint1 x167; - uint64_t x168; - fiat_p3923_uint1 x169; - uint64_t x170; - fiat_p3923_uint1 x171; - uint64_t x172; - uint64_t x173; - uint64_t x174; - uint64_t x175; - uint64_t x176; - uint64_t x177; - uint64_t x178; - uint64_t x179; - uint64_t x180; - fiat_p3923_uint1 x181; - uint64_t x182; - fiat_p3923_uint1 x183; - uint64_t x184; - fiat_p3923_uint1 x185; - uint64_t x186; - uint64_t x187; - fiat_p3923_uint1 x188; - uint64_t x189; - fiat_p3923_uint1 x190; - uint64_t x191; - fiat_p3923_uint1 x192; - uint64_t x193; - fiat_p3923_uint1 x194; - uint64_t x195; - fiat_p3923_uint1 x196; - uint64_t x197; - uint64_t x198; - fiat_p3923_uint1 x199; - uint64_t x200; - fiat_p3923_uint1 x201; - uint64_t x202; - fiat_p3923_uint1 x203; - uint64_t x204; - fiat_p3923_uint1 x205; - uint64_t x206; - fiat_p3923_uint1 x207; - uint64_t x208; - uint64_t x209; - uint64_t x210; - uint64_t x211; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[0]); - fiat_p3923_mulx_u64(&x5, &x6, x4, (arg2[3])); - fiat_p3923_mulx_u64(&x7, &x8, x4, (arg2[2])); - fiat_p3923_mulx_u64(&x9, &x10, x4, (arg2[1])); - fiat_p3923_mulx_u64(&x11, &x12, x4, (arg2[0])); - fiat_p3923_addcarryx_u64(&x13, &x14, 0x0, x12, x9); - fiat_p3923_addcarryx_u64(&x15, &x16, x14, x10, x7); - fiat_p3923_addcarryx_u64(&x17, &x18, x16, x8, x5); - x19 = (x18 + x6); - fiat_p3923_mulx_u64(&x20, &x21, x11, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x22, &x23, x11, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x24, &x25, x11, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x26, &x27, x11, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x28, &x29, 0x0, x27, x24); - fiat_p3923_addcarryx_u64(&x30, &x31, x29, x25, x22); - fiat_p3923_addcarryx_u64(&x32, &x33, x31, x23, x20); - x34 = (x33 + x21); - fiat_p3923_addcarryx_u64(&x35, &x36, 0x0, x11, x26); - fiat_p3923_addcarryx_u64(&x37, &x38, x36, x13, x28); - fiat_p3923_addcarryx_u64(&x39, &x40, x38, x15, x30); - fiat_p3923_addcarryx_u64(&x41, &x42, x40, x17, x32); - fiat_p3923_addcarryx_u64(&x43, &x44, x42, x19, x34); - fiat_p3923_mulx_u64(&x45, &x46, x1, (arg2[3])); - fiat_p3923_mulx_u64(&x47, &x48, x1, (arg2[2])); - fiat_p3923_mulx_u64(&x49, &x50, x1, (arg2[1])); - fiat_p3923_mulx_u64(&x51, &x52, x1, (arg2[0])); - fiat_p3923_addcarryx_u64(&x53, &x54, 0x0, x52, x49); - fiat_p3923_addcarryx_u64(&x55, &x56, x54, x50, x47); - fiat_p3923_addcarryx_u64(&x57, &x58, x56, x48, x45); - x59 = (x58 + x46); - fiat_p3923_addcarryx_u64(&x60, &x61, 0x0, x37, x51); - fiat_p3923_addcarryx_u64(&x62, &x63, x61, x39, x53); - fiat_p3923_addcarryx_u64(&x64, &x65, x63, x41, x55); - fiat_p3923_addcarryx_u64(&x66, &x67, x65, x43, x57); - fiat_p3923_addcarryx_u64(&x68, &x69, x67, x44, x59); - fiat_p3923_mulx_u64(&x70, &x71, x60, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x72, &x73, x60, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x74, &x75, x60, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x76, &x77, x60, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x78, &x79, 0x0, x77, x74); - fiat_p3923_addcarryx_u64(&x80, &x81, x79, x75, x72); - fiat_p3923_addcarryx_u64(&x82, &x83, x81, x73, x70); - x84 = (x83 + x71); - fiat_p3923_addcarryx_u64(&x85, &x86, 0x0, x60, x76); - fiat_p3923_addcarryx_u64(&x87, &x88, x86, x62, x78); - fiat_p3923_addcarryx_u64(&x89, &x90, x88, x64, x80); - fiat_p3923_addcarryx_u64(&x91, &x92, x90, x66, x82); - fiat_p3923_addcarryx_u64(&x93, &x94, x92, x68, x84); - x95 = ((uint64_t)x94 + x69); - fiat_p3923_mulx_u64(&x96, &x97, x2, (arg2[3])); - fiat_p3923_mulx_u64(&x98, &x99, x2, (arg2[2])); - fiat_p3923_mulx_u64(&x100, &x101, x2, (arg2[1])); - fiat_p3923_mulx_u64(&x102, &x103, x2, (arg2[0])); - fiat_p3923_addcarryx_u64(&x104, &x105, 0x0, x103, x100); - fiat_p3923_addcarryx_u64(&x106, &x107, x105, x101, x98); - fiat_p3923_addcarryx_u64(&x108, &x109, x107, x99, x96); - x110 = (x109 + x97); - fiat_p3923_addcarryx_u64(&x111, &x112, 0x0, x87, x102); - fiat_p3923_addcarryx_u64(&x113, &x114, x112, x89, x104); - fiat_p3923_addcarryx_u64(&x115, &x116, x114, x91, x106); - fiat_p3923_addcarryx_u64(&x117, &x118, x116, x93, x108); - fiat_p3923_addcarryx_u64(&x119, &x120, x118, x95, x110); - fiat_p3923_mulx_u64(&x121, &x122, x111, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x123, &x124, x111, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x125, &x126, x111, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x127, &x128, x111, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x129, &x130, 0x0, x128, x125); - fiat_p3923_addcarryx_u64(&x131, &x132, x130, x126, x123); - fiat_p3923_addcarryx_u64(&x133, &x134, x132, x124, x121); - x135 = (x134 + x122); - fiat_p3923_addcarryx_u64(&x136, &x137, 0x0, x111, x127); - fiat_p3923_addcarryx_u64(&x138, &x139, x137, x113, x129); - fiat_p3923_addcarryx_u64(&x140, &x141, x139, x115, x131); - fiat_p3923_addcarryx_u64(&x142, &x143, x141, x117, x133); - fiat_p3923_addcarryx_u64(&x144, &x145, x143, x119, x135); - x146 = ((uint64_t)x145 + x120); - fiat_p3923_mulx_u64(&x147, &x148, x3, (arg2[3])); - fiat_p3923_mulx_u64(&x149, &x150, x3, (arg2[2])); - fiat_p3923_mulx_u64(&x151, &x152, x3, (arg2[1])); - fiat_p3923_mulx_u64(&x153, &x154, x3, (arg2[0])); - fiat_p3923_addcarryx_u64(&x155, &x156, 0x0, x154, x151); - fiat_p3923_addcarryx_u64(&x157, &x158, x156, x152, x149); - fiat_p3923_addcarryx_u64(&x159, &x160, x158, x150, x147); - x161 = (x160 + x148); - fiat_p3923_addcarryx_u64(&x162, &x163, 0x0, x138, x153); - fiat_p3923_addcarryx_u64(&x164, &x165, x163, x140, x155); - fiat_p3923_addcarryx_u64(&x166, &x167, x165, x142, x157); - fiat_p3923_addcarryx_u64(&x168, &x169, x167, x144, x159); - fiat_p3923_addcarryx_u64(&x170, &x171, x169, x146, x161); - fiat_p3923_mulx_u64(&x172, &x173, x162, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x174, &x175, x162, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x176, &x177, x162, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x178, &x179, x162, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x180, &x181, 0x0, x179, x176); - fiat_p3923_addcarryx_u64(&x182, &x183, x181, x177, x174); - fiat_p3923_addcarryx_u64(&x184, &x185, x183, x175, x172); - x186 = (x185 + x173); - fiat_p3923_addcarryx_u64(&x187, &x188, 0x0, x162, x178); - fiat_p3923_addcarryx_u64(&x189, &x190, x188, x164, x180); - fiat_p3923_addcarryx_u64(&x191, &x192, x190, x166, x182); - fiat_p3923_addcarryx_u64(&x193, &x194, x192, x168, x184); - fiat_p3923_addcarryx_u64(&x195, &x196, x194, x170, x186); - x197 = ((uint64_t)x196 + x171); - fiat_p3923_subborrowx_u64(&x198, &x199, 0x0, x189, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x200, &x201, x199, x191, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x202, &x203, x201, x193, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x204, &x205, x203, x195, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x206, &x207, x205, x197, 0x0); - fiat_p3923_cmovznz_u64(&x208, x207, x198, x189); - fiat_p3923_cmovznz_u64(&x209, x207, x200, x191); - fiat_p3923_cmovznz_u64(&x210, x207, x202, x193); - fiat_p3923_cmovznz_u64(&x211, x207, x204, x195); - out1[0] = x208; - out1[1] = x209; - out1[2] = x210; - out1[3] = x211; -} - -/* - * The function fiat_p3923_square squares a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_square(fiat_p3923_montgomery_domain_field_element out1, const fiat_p3923_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - fiat_p3923_uint1 x14; - uint64_t x15; - fiat_p3923_uint1 x16; - uint64_t x17; - fiat_p3923_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - fiat_p3923_uint1 x29; - uint64_t x30; - fiat_p3923_uint1 x31; - uint64_t x32; - fiat_p3923_uint1 x33; - uint64_t x34; - uint64_t x35; - fiat_p3923_uint1 x36; - uint64_t x37; - fiat_p3923_uint1 x38; - uint64_t x39; - fiat_p3923_uint1 x40; - uint64_t x41; - fiat_p3923_uint1 x42; - uint64_t x43; - fiat_p3923_uint1 x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - fiat_p3923_uint1 x54; - uint64_t x55; - fiat_p3923_uint1 x56; - uint64_t x57; - fiat_p3923_uint1 x58; - uint64_t x59; - uint64_t x60; - fiat_p3923_uint1 x61; - uint64_t x62; - fiat_p3923_uint1 x63; - uint64_t x64; - fiat_p3923_uint1 x65; - uint64_t x66; - fiat_p3923_uint1 x67; - uint64_t x68; - fiat_p3923_uint1 x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - fiat_p3923_uint1 x79; - uint64_t x80; - fiat_p3923_uint1 x81; - uint64_t x82; - fiat_p3923_uint1 x83; - uint64_t x84; - uint64_t x85; - fiat_p3923_uint1 x86; - uint64_t x87; - fiat_p3923_uint1 x88; - uint64_t x89; - fiat_p3923_uint1 x90; - uint64_t x91; - fiat_p3923_uint1 x92; - uint64_t x93; - fiat_p3923_uint1 x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - fiat_p3923_uint1 x105; - uint64_t x106; - fiat_p3923_uint1 x107; - uint64_t x108; - fiat_p3923_uint1 x109; - uint64_t x110; - uint64_t x111; - fiat_p3923_uint1 x112; - uint64_t x113; - fiat_p3923_uint1 x114; - uint64_t x115; - fiat_p3923_uint1 x116; - uint64_t x117; - fiat_p3923_uint1 x118; - uint64_t x119; - fiat_p3923_uint1 x120; - uint64_t x121; - uint64_t x122; - uint64_t x123; - uint64_t x124; - uint64_t x125; - uint64_t x126; - uint64_t x127; - uint64_t x128; - uint64_t x129; - fiat_p3923_uint1 x130; - uint64_t x131; - fiat_p3923_uint1 x132; - uint64_t x133; - fiat_p3923_uint1 x134; - uint64_t x135; - uint64_t x136; - fiat_p3923_uint1 x137; - uint64_t x138; - fiat_p3923_uint1 x139; - uint64_t x140; - fiat_p3923_uint1 x141; - uint64_t x142; - fiat_p3923_uint1 x143; - uint64_t x144; - fiat_p3923_uint1 x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - uint64_t x155; - fiat_p3923_uint1 x156; - uint64_t x157; - fiat_p3923_uint1 x158; - uint64_t x159; - fiat_p3923_uint1 x160; - uint64_t x161; - uint64_t x162; - fiat_p3923_uint1 x163; - uint64_t x164; - fiat_p3923_uint1 x165; - uint64_t x166; - fiat_p3923_uint1 x167; - uint64_t x168; - fiat_p3923_uint1 x169; - uint64_t x170; - fiat_p3923_uint1 x171; - uint64_t x172; - uint64_t x173; - uint64_t x174; - uint64_t x175; - uint64_t x176; - uint64_t x177; - uint64_t x178; - uint64_t x179; - uint64_t x180; - fiat_p3923_uint1 x181; - uint64_t x182; - fiat_p3923_uint1 x183; - uint64_t x184; - fiat_p3923_uint1 x185; - uint64_t x186; - uint64_t x187; - fiat_p3923_uint1 x188; - uint64_t x189; - fiat_p3923_uint1 x190; - uint64_t x191; - fiat_p3923_uint1 x192; - uint64_t x193; - fiat_p3923_uint1 x194; - uint64_t x195; - fiat_p3923_uint1 x196; - uint64_t x197; - uint64_t x198; - fiat_p3923_uint1 x199; - uint64_t x200; - fiat_p3923_uint1 x201; - uint64_t x202; - fiat_p3923_uint1 x203; - uint64_t x204; - fiat_p3923_uint1 x205; - uint64_t x206; - fiat_p3923_uint1 x207; - uint64_t x208; - uint64_t x209; - uint64_t x210; - uint64_t x211; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[0]); - fiat_p3923_mulx_u64(&x5, &x6, x4, (arg1[3])); - fiat_p3923_mulx_u64(&x7, &x8, x4, (arg1[2])); - fiat_p3923_mulx_u64(&x9, &x10, x4, (arg1[1])); - fiat_p3923_mulx_u64(&x11, &x12, x4, (arg1[0])); - fiat_p3923_addcarryx_u64(&x13, &x14, 0x0, x12, x9); - fiat_p3923_addcarryx_u64(&x15, &x16, x14, x10, x7); - fiat_p3923_addcarryx_u64(&x17, &x18, x16, x8, x5); - x19 = (x18 + x6); - fiat_p3923_mulx_u64(&x20, &x21, x11, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x22, &x23, x11, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x24, &x25, x11, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x26, &x27, x11, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x28, &x29, 0x0, x27, x24); - fiat_p3923_addcarryx_u64(&x30, &x31, x29, x25, x22); - fiat_p3923_addcarryx_u64(&x32, &x33, x31, x23, x20); - x34 = (x33 + x21); - fiat_p3923_addcarryx_u64(&x35, &x36, 0x0, x11, x26); - fiat_p3923_addcarryx_u64(&x37, &x38, x36, x13, x28); - fiat_p3923_addcarryx_u64(&x39, &x40, x38, x15, x30); - fiat_p3923_addcarryx_u64(&x41, &x42, x40, x17, x32); - fiat_p3923_addcarryx_u64(&x43, &x44, x42, x19, x34); - fiat_p3923_mulx_u64(&x45, &x46, x1, (arg1[3])); - fiat_p3923_mulx_u64(&x47, &x48, x1, (arg1[2])); - fiat_p3923_mulx_u64(&x49, &x50, x1, (arg1[1])); - fiat_p3923_mulx_u64(&x51, &x52, x1, (arg1[0])); - fiat_p3923_addcarryx_u64(&x53, &x54, 0x0, x52, x49); - fiat_p3923_addcarryx_u64(&x55, &x56, x54, x50, x47); - fiat_p3923_addcarryx_u64(&x57, &x58, x56, x48, x45); - x59 = (x58 + x46); - fiat_p3923_addcarryx_u64(&x60, &x61, 0x0, x37, x51); - fiat_p3923_addcarryx_u64(&x62, &x63, x61, x39, x53); - fiat_p3923_addcarryx_u64(&x64, &x65, x63, x41, x55); - fiat_p3923_addcarryx_u64(&x66, &x67, x65, x43, x57); - fiat_p3923_addcarryx_u64(&x68, &x69, x67, x44, x59); - fiat_p3923_mulx_u64(&x70, &x71, x60, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x72, &x73, x60, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x74, &x75, x60, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x76, &x77, x60, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x78, &x79, 0x0, x77, x74); - fiat_p3923_addcarryx_u64(&x80, &x81, x79, x75, x72); - fiat_p3923_addcarryx_u64(&x82, &x83, x81, x73, x70); - x84 = (x83 + x71); - fiat_p3923_addcarryx_u64(&x85, &x86, 0x0, x60, x76); - fiat_p3923_addcarryx_u64(&x87, &x88, x86, x62, x78); - fiat_p3923_addcarryx_u64(&x89, &x90, x88, x64, x80); - fiat_p3923_addcarryx_u64(&x91, &x92, x90, x66, x82); - fiat_p3923_addcarryx_u64(&x93, &x94, x92, x68, x84); - x95 = ((uint64_t)x94 + x69); - fiat_p3923_mulx_u64(&x96, &x97, x2, (arg1[3])); - fiat_p3923_mulx_u64(&x98, &x99, x2, (arg1[2])); - fiat_p3923_mulx_u64(&x100, &x101, x2, (arg1[1])); - fiat_p3923_mulx_u64(&x102, &x103, x2, (arg1[0])); - fiat_p3923_addcarryx_u64(&x104, &x105, 0x0, x103, x100); - fiat_p3923_addcarryx_u64(&x106, &x107, x105, x101, x98); - fiat_p3923_addcarryx_u64(&x108, &x109, x107, x99, x96); - x110 = (x109 + x97); - fiat_p3923_addcarryx_u64(&x111, &x112, 0x0, x87, x102); - fiat_p3923_addcarryx_u64(&x113, &x114, x112, x89, x104); - fiat_p3923_addcarryx_u64(&x115, &x116, x114, x91, x106); - fiat_p3923_addcarryx_u64(&x117, &x118, x116, x93, x108); - fiat_p3923_addcarryx_u64(&x119, &x120, x118, x95, x110); - fiat_p3923_mulx_u64(&x121, &x122, x111, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x123, &x124, x111, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x125, &x126, x111, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x127, &x128, x111, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x129, &x130, 0x0, x128, x125); - fiat_p3923_addcarryx_u64(&x131, &x132, x130, x126, x123); - fiat_p3923_addcarryx_u64(&x133, &x134, x132, x124, x121); - x135 = (x134 + x122); - fiat_p3923_addcarryx_u64(&x136, &x137, 0x0, x111, x127); - fiat_p3923_addcarryx_u64(&x138, &x139, x137, x113, x129); - fiat_p3923_addcarryx_u64(&x140, &x141, x139, x115, x131); - fiat_p3923_addcarryx_u64(&x142, &x143, x141, x117, x133); - fiat_p3923_addcarryx_u64(&x144, &x145, x143, x119, x135); - x146 = ((uint64_t)x145 + x120); - fiat_p3923_mulx_u64(&x147, &x148, x3, (arg1[3])); - fiat_p3923_mulx_u64(&x149, &x150, x3, (arg1[2])); - fiat_p3923_mulx_u64(&x151, &x152, x3, (arg1[1])); - fiat_p3923_mulx_u64(&x153, &x154, x3, (arg1[0])); - fiat_p3923_addcarryx_u64(&x155, &x156, 0x0, x154, x151); - fiat_p3923_addcarryx_u64(&x157, &x158, x156, x152, x149); - fiat_p3923_addcarryx_u64(&x159, &x160, x158, x150, x147); - x161 = (x160 + x148); - fiat_p3923_addcarryx_u64(&x162, &x163, 0x0, x138, x153); - fiat_p3923_addcarryx_u64(&x164, &x165, x163, x140, x155); - fiat_p3923_addcarryx_u64(&x166, &x167, x165, x142, x157); - fiat_p3923_addcarryx_u64(&x168, &x169, x167, x144, x159); - fiat_p3923_addcarryx_u64(&x170, &x171, x169, x146, x161); - fiat_p3923_mulx_u64(&x172, &x173, x162, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x174, &x175, x162, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x176, &x177, x162, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x178, &x179, x162, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x180, &x181, 0x0, x179, x176); - fiat_p3923_addcarryx_u64(&x182, &x183, x181, x177, x174); - fiat_p3923_addcarryx_u64(&x184, &x185, x183, x175, x172); - x186 = (x185 + x173); - fiat_p3923_addcarryx_u64(&x187, &x188, 0x0, x162, x178); - fiat_p3923_addcarryx_u64(&x189, &x190, x188, x164, x180); - fiat_p3923_addcarryx_u64(&x191, &x192, x190, x166, x182); - fiat_p3923_addcarryx_u64(&x193, &x194, x192, x168, x184); - fiat_p3923_addcarryx_u64(&x195, &x196, x194, x170, x186); - x197 = ((uint64_t)x196 + x171); - fiat_p3923_subborrowx_u64(&x198, &x199, 0x0, x189, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x200, &x201, x199, x191, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x202, &x203, x201, x193, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x204, &x205, x203, x195, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x206, &x207, x205, x197, 0x0); - fiat_p3923_cmovznz_u64(&x208, x207, x198, x189); - fiat_p3923_cmovznz_u64(&x209, x207, x200, x191); - fiat_p3923_cmovznz_u64(&x210, x207, x202, x193); - fiat_p3923_cmovznz_u64(&x211, x207, x204, x195); - out1[0] = x208; - out1[1] = x209; - out1[2] = x210; - out1[3] = x211; -} - -/* - * The function fiat_p3923_add adds two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_add(fiat_p3923_montgomery_domain_field_element out1, const fiat_p3923_montgomery_domain_field_element arg1, const fiat_p3923_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p3923_uint1 x2; - uint64_t x3; - fiat_p3923_uint1 x4; - uint64_t x5; - fiat_p3923_uint1 x6; - uint64_t x7; - fiat_p3923_uint1 x8; - uint64_t x9; - fiat_p3923_uint1 x10; - uint64_t x11; - fiat_p3923_uint1 x12; - uint64_t x13; - fiat_p3923_uint1 x14; - uint64_t x15; - fiat_p3923_uint1 x16; - uint64_t x17; - fiat_p3923_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - fiat_p3923_addcarryx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p3923_addcarryx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p3923_addcarryx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p3923_addcarryx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p3923_subborrowx_u64(&x9, &x10, 0x0, x1, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x11, &x12, x10, x3, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x13, &x14, x12, x5, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x15, &x16, x14, x7, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x17, &x18, x16, x8, 0x0); - fiat_p3923_cmovznz_u64(&x19, x18, x9, x1); - fiat_p3923_cmovznz_u64(&x20, x18, x11, x3); - fiat_p3923_cmovznz_u64(&x21, x18, x13, x5); - fiat_p3923_cmovznz_u64(&x22, x18, x15, x7); - out1[0] = x19; - out1[1] = x20; - out1[2] = x21; - out1[3] = x22; -} - -/* - * The function fiat_p3923_sub subtracts two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_sub(fiat_p3923_montgomery_domain_field_element out1, const fiat_p3923_montgomery_domain_field_element arg1, const fiat_p3923_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p3923_uint1 x2; - uint64_t x3; - fiat_p3923_uint1 x4; - uint64_t x5; - fiat_p3923_uint1 x6; - uint64_t x7; - fiat_p3923_uint1 x8; - uint64_t x9; - uint64_t x10; - fiat_p3923_uint1 x11; - uint64_t x12; - fiat_p3923_uint1 x13; - uint64_t x14; - fiat_p3923_uint1 x15; - uint64_t x16; - fiat_p3923_uint1 x17; - fiat_p3923_subborrowx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p3923_subborrowx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p3923_subborrowx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p3923_subborrowx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p3923_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x10, &x11, 0x0, x1, x9); - fiat_p3923_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT64_C(0x535805fa6e9e48b1))); - fiat_p3923_addcarryx_u64(&x14, &x15, x13, x5, (x9 & UINT64_C(0xb7311a63633f03db))); - fiat_p3923_addcarryx_u64(&x16, &x17, x15, x7, (x9 & UINT64_C(0x348757eadf5c9530))); - out1[0] = x10; - out1[1] = x12; - out1[2] = x14; - out1[3] = x16; -} - -/* - * The function fiat_p3923_from_montgomery translates a field element out of the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^4) mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_from_montgomery(fiat_p3923_non_montgomery_domain_field_element out1, const fiat_p3923_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - fiat_p3923_uint1 x11; - uint64_t x12; - fiat_p3923_uint1 x13; - uint64_t x14; - fiat_p3923_uint1 x15; - uint64_t x16; - fiat_p3923_uint1 x17; - uint64_t x18; - fiat_p3923_uint1 x19; - uint64_t x20; - fiat_p3923_uint1 x21; - uint64_t x22; - fiat_p3923_uint1 x23; - uint64_t x24; - fiat_p3923_uint1 x25; - uint64_t x26; - fiat_p3923_uint1 x27; - uint64_t x28; - fiat_p3923_uint1 x29; - uint64_t x30; - uint64_t x31; - uint64_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - fiat_p3923_uint1 x39; - uint64_t x40; - fiat_p3923_uint1 x41; - uint64_t x42; - fiat_p3923_uint1 x43; - uint64_t x44; - fiat_p3923_uint1 x45; - uint64_t x46; - fiat_p3923_uint1 x47; - uint64_t x48; - fiat_p3923_uint1 x49; - uint64_t x50; - fiat_p3923_uint1 x51; - uint64_t x52; - fiat_p3923_uint1 x53; - uint64_t x54; - fiat_p3923_uint1 x55; - uint64_t x56; - fiat_p3923_uint1 x57; - uint64_t x58; - uint64_t x59; - uint64_t x60; - uint64_t x61; - uint64_t x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - fiat_p3923_uint1 x67; - uint64_t x68; - fiat_p3923_uint1 x69; - uint64_t x70; - fiat_p3923_uint1 x71; - uint64_t x72; - fiat_p3923_uint1 x73; - uint64_t x74; - fiat_p3923_uint1 x75; - uint64_t x76; - fiat_p3923_uint1 x77; - uint64_t x78; - fiat_p3923_uint1 x79; - uint64_t x80; - fiat_p3923_uint1 x81; - uint64_t x82; - fiat_p3923_uint1 x83; - uint64_t x84; - fiat_p3923_uint1 x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - fiat_p3923_uint1 x95; - uint64_t x96; - fiat_p3923_uint1 x97; - uint64_t x98; - fiat_p3923_uint1 x99; - uint64_t x100; - fiat_p3923_uint1 x101; - uint64_t x102; - fiat_p3923_uint1 x103; - uint64_t x104; - fiat_p3923_uint1 x105; - uint64_t x106; - fiat_p3923_uint1 x107; - uint64_t x108; - uint64_t x109; - fiat_p3923_uint1 x110; - uint64_t x111; - fiat_p3923_uint1 x112; - uint64_t x113; - fiat_p3923_uint1 x114; - uint64_t x115; - fiat_p3923_uint1 x116; - uint64_t x117; - fiat_p3923_uint1 x118; - uint64_t x119; - uint64_t x120; - uint64_t x121; - uint64_t x122; - x1 = (arg1[0]); - fiat_p3923_mulx_u64(&x2, &x3, x1, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x4, &x5, x1, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x6, &x7, x1, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x8, &x9, x1, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x10, &x11, 0x0, x9, x6); - fiat_p3923_addcarryx_u64(&x12, &x13, x11, x7, x4); - fiat_p3923_addcarryx_u64(&x14, &x15, x13, x5, x2); - fiat_p3923_addcarryx_u64(&x16, &x17, 0x0, x1, x8); - fiat_p3923_addcarryx_u64(&x18, &x19, x17, 0x0, x10); - fiat_p3923_addcarryx_u64(&x20, &x21, x19, 0x0, x12); - fiat_p3923_addcarryx_u64(&x22, &x23, x21, 0x0, x14); - fiat_p3923_addcarryx_u64(&x24, &x25, 0x0, x18, (arg1[1])); - fiat_p3923_addcarryx_u64(&x26, &x27, x25, x20, 0x0); - fiat_p3923_addcarryx_u64(&x28, &x29, x27, x22, 0x0); - fiat_p3923_mulx_u64(&x30, &x31, x24, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x32, &x33, x24, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x34, &x35, x24, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x36, &x37, x24, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x38, &x39, 0x0, x37, x34); - fiat_p3923_addcarryx_u64(&x40, &x41, x39, x35, x32); - fiat_p3923_addcarryx_u64(&x42, &x43, x41, x33, x30); - fiat_p3923_addcarryx_u64(&x44, &x45, 0x0, x24, x36); - fiat_p3923_addcarryx_u64(&x46, &x47, x45, x26, x38); - fiat_p3923_addcarryx_u64(&x48, &x49, x47, x28, x40); - fiat_p3923_addcarryx_u64(&x50, &x51, x49, (x29 + (x23 + (x15 + x3))), x42); - fiat_p3923_addcarryx_u64(&x52, &x53, 0x0, x46, (arg1[2])); - fiat_p3923_addcarryx_u64(&x54, &x55, x53, x48, 0x0); - fiat_p3923_addcarryx_u64(&x56, &x57, x55, x50, 0x0); - fiat_p3923_mulx_u64(&x58, &x59, x52, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x60, &x61, x52, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x62, &x63, x52, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x64, &x65, x52, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x66, &x67, 0x0, x65, x62); - fiat_p3923_addcarryx_u64(&x68, &x69, x67, x63, x60); - fiat_p3923_addcarryx_u64(&x70, &x71, x69, x61, x58); - fiat_p3923_addcarryx_u64(&x72, &x73, 0x0, x52, x64); - fiat_p3923_addcarryx_u64(&x74, &x75, x73, x54, x66); - fiat_p3923_addcarryx_u64(&x76, &x77, x75, x56, x68); - fiat_p3923_addcarryx_u64(&x78, &x79, x77, (x57 + (x51 + (x43 + x31))), x70); - fiat_p3923_addcarryx_u64(&x80, &x81, 0x0, x74, (arg1[3])); - fiat_p3923_addcarryx_u64(&x82, &x83, x81, x76, 0x0); - fiat_p3923_addcarryx_u64(&x84, &x85, x83, x78, 0x0); - fiat_p3923_mulx_u64(&x86, &x87, x80, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x88, &x89, x80, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x90, &x91, x80, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x92, &x93, x80, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x94, &x95, 0x0, x93, x90); - fiat_p3923_addcarryx_u64(&x96, &x97, x95, x91, x88); - fiat_p3923_addcarryx_u64(&x98, &x99, x97, x89, x86); - fiat_p3923_addcarryx_u64(&x100, &x101, 0x0, x80, x92); - fiat_p3923_addcarryx_u64(&x102, &x103, x101, x82, x94); - fiat_p3923_addcarryx_u64(&x104, &x105, x103, x84, x96); - fiat_p3923_addcarryx_u64(&x106, &x107, x105, (x85 + (x79 + (x71 + x59))), x98); - x108 = (x107 + (x99 + x87)); - fiat_p3923_subborrowx_u64(&x109, &x110, 0x0, x102, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x111, &x112, x110, x104, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x113, &x114, x112, x106, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x115, &x116, x114, x108, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x117, &x118, x116, 0x0, 0x0); - fiat_p3923_cmovznz_u64(&x119, x118, x109, x102); - fiat_p3923_cmovznz_u64(&x120, x118, x111, x104); - fiat_p3923_cmovznz_u64(&x121, x118, x113, x106); - fiat_p3923_cmovznz_u64(&x122, x118, x115, x108); - out1[0] = x119; - out1[1] = x120; - out1[2] = x121; - out1[3] = x122; -} - -/* - * The function fiat_p3923_to_montgomery translates a field element into the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = eval arg1 mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_to_montgomery(fiat_p3923_montgomery_domain_field_element out1, const fiat_p3923_non_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - fiat_p3923_uint1 x14; - uint64_t x15; - fiat_p3923_uint1 x16; - uint64_t x17; - fiat_p3923_uint1 x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - fiat_p3923_uint1 x28; - uint64_t x29; - fiat_p3923_uint1 x30; - uint64_t x31; - fiat_p3923_uint1 x32; - uint64_t x33; - fiat_p3923_uint1 x34; - uint64_t x35; - fiat_p3923_uint1 x36; - uint64_t x37; - fiat_p3923_uint1 x38; - uint64_t x39; - fiat_p3923_uint1 x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - fiat_p3923_uint1 x50; - uint64_t x51; - fiat_p3923_uint1 x52; - uint64_t x53; - fiat_p3923_uint1 x54; - uint64_t x55; - fiat_p3923_uint1 x56; - uint64_t x57; - fiat_p3923_uint1 x58; - uint64_t x59; - fiat_p3923_uint1 x60; - uint64_t x61; - fiat_p3923_uint1 x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - fiat_p3923_uint1 x72; - uint64_t x73; - fiat_p3923_uint1 x74; - uint64_t x75; - fiat_p3923_uint1 x76; - uint64_t x77; - fiat_p3923_uint1 x78; - uint64_t x79; - fiat_p3923_uint1 x80; - uint64_t x81; - fiat_p3923_uint1 x82; - uint64_t x83; - fiat_p3923_uint1 x84; - uint64_t x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - fiat_p3923_uint1 x94; - uint64_t x95; - fiat_p3923_uint1 x96; - uint64_t x97; - fiat_p3923_uint1 x98; - uint64_t x99; - fiat_p3923_uint1 x100; - uint64_t x101; - fiat_p3923_uint1 x102; - uint64_t x103; - fiat_p3923_uint1 x104; - uint64_t x105; - fiat_p3923_uint1 x106; - uint64_t x107; - uint64_t x108; - uint64_t x109; - uint64_t x110; - uint64_t x111; - uint64_t x112; - uint64_t x113; - uint64_t x114; - uint64_t x115; - fiat_p3923_uint1 x116; - uint64_t x117; - fiat_p3923_uint1 x118; - uint64_t x119; - fiat_p3923_uint1 x120; - uint64_t x121; - fiat_p3923_uint1 x122; - uint64_t x123; - fiat_p3923_uint1 x124; - uint64_t x125; - fiat_p3923_uint1 x126; - uint64_t x127; - fiat_p3923_uint1 x128; - uint64_t x129; - uint64_t x130; - uint64_t x131; - uint64_t x132; - uint64_t x133; - uint64_t x134; - uint64_t x135; - uint64_t x136; - uint64_t x137; - fiat_p3923_uint1 x138; - uint64_t x139; - fiat_p3923_uint1 x140; - uint64_t x141; - fiat_p3923_uint1 x142; - uint64_t x143; - fiat_p3923_uint1 x144; - uint64_t x145; - fiat_p3923_uint1 x146; - uint64_t x147; - fiat_p3923_uint1 x148; - uint64_t x149; - fiat_p3923_uint1 x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - uint64_t x155; - uint64_t x156; - uint64_t x157; - uint64_t x158; - uint64_t x159; - fiat_p3923_uint1 x160; - uint64_t x161; - fiat_p3923_uint1 x162; - uint64_t x163; - fiat_p3923_uint1 x164; - uint64_t x165; - fiat_p3923_uint1 x166; - uint64_t x167; - fiat_p3923_uint1 x168; - uint64_t x169; - fiat_p3923_uint1 x170; - uint64_t x171; - fiat_p3923_uint1 x172; - uint64_t x173; - uint64_t x174; - fiat_p3923_uint1 x175; - uint64_t x176; - fiat_p3923_uint1 x177; - uint64_t x178; - fiat_p3923_uint1 x179; - uint64_t x180; - fiat_p3923_uint1 x181; - uint64_t x182; - fiat_p3923_uint1 x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[0]); - fiat_p3923_mulx_u64(&x5, &x6, x4, UINT64_C(0x2ed52f29f5b889a8)); - fiat_p3923_mulx_u64(&x7, &x8, x4, UINT64_C(0xf52e01b77a8daf49)); - fiat_p3923_mulx_u64(&x9, &x10, x4, UINT64_C(0x5aefc767151e69b7)); - fiat_p3923_mulx_u64(&x11, &x12, x4, UINT64_C(0xda5a066fea16792e)); - fiat_p3923_addcarryx_u64(&x13, &x14, 0x0, x12, x9); - fiat_p3923_addcarryx_u64(&x15, &x16, x14, x10, x7); - fiat_p3923_addcarryx_u64(&x17, &x18, x16, x8, x5); - fiat_p3923_mulx_u64(&x19, &x20, x11, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x21, &x22, x11, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x23, &x24, x11, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x25, &x26, x11, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x27, &x28, 0x0, x26, x23); - fiat_p3923_addcarryx_u64(&x29, &x30, x28, x24, x21); - fiat_p3923_addcarryx_u64(&x31, &x32, x30, x22, x19); - fiat_p3923_addcarryx_u64(&x33, &x34, 0x0, x11, x25); - fiat_p3923_addcarryx_u64(&x35, &x36, x34, x13, x27); - fiat_p3923_addcarryx_u64(&x37, &x38, x36, x15, x29); - fiat_p3923_addcarryx_u64(&x39, &x40, x38, x17, x31); - fiat_p3923_mulx_u64(&x41, &x42, x1, UINT64_C(0x2ed52f29f5b889a8)); - fiat_p3923_mulx_u64(&x43, &x44, x1, UINT64_C(0xf52e01b77a8daf49)); - fiat_p3923_mulx_u64(&x45, &x46, x1, UINT64_C(0x5aefc767151e69b7)); - fiat_p3923_mulx_u64(&x47, &x48, x1, UINT64_C(0xda5a066fea16792e)); - fiat_p3923_addcarryx_u64(&x49, &x50, 0x0, x48, x45); - fiat_p3923_addcarryx_u64(&x51, &x52, x50, x46, x43); - fiat_p3923_addcarryx_u64(&x53, &x54, x52, x44, x41); - fiat_p3923_addcarryx_u64(&x55, &x56, 0x0, x35, x47); - fiat_p3923_addcarryx_u64(&x57, &x58, x56, x37, x49); - fiat_p3923_addcarryx_u64(&x59, &x60, x58, x39, x51); - fiat_p3923_addcarryx_u64(&x61, &x62, x60, ((x40 + (x18 + x6)) + (x32 + x20)), x53); - fiat_p3923_mulx_u64(&x63, &x64, x55, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x65, &x66, x55, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x67, &x68, x55, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x69, &x70, x55, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x71, &x72, 0x0, x70, x67); - fiat_p3923_addcarryx_u64(&x73, &x74, x72, x68, x65); - fiat_p3923_addcarryx_u64(&x75, &x76, x74, x66, x63); - fiat_p3923_addcarryx_u64(&x77, &x78, 0x0, x55, x69); - fiat_p3923_addcarryx_u64(&x79, &x80, x78, x57, x71); - fiat_p3923_addcarryx_u64(&x81, &x82, x80, x59, x73); - fiat_p3923_addcarryx_u64(&x83, &x84, x82, x61, x75); - fiat_p3923_mulx_u64(&x85, &x86, x2, UINT64_C(0x2ed52f29f5b889a8)); - fiat_p3923_mulx_u64(&x87, &x88, x2, UINT64_C(0xf52e01b77a8daf49)); - fiat_p3923_mulx_u64(&x89, &x90, x2, UINT64_C(0x5aefc767151e69b7)); - fiat_p3923_mulx_u64(&x91, &x92, x2, UINT64_C(0xda5a066fea16792e)); - fiat_p3923_addcarryx_u64(&x93, &x94, 0x0, x92, x89); - fiat_p3923_addcarryx_u64(&x95, &x96, x94, x90, x87); - fiat_p3923_addcarryx_u64(&x97, &x98, x96, x88, x85); - fiat_p3923_addcarryx_u64(&x99, &x100, 0x0, x79, x91); - fiat_p3923_addcarryx_u64(&x101, &x102, x100, x81, x93); - fiat_p3923_addcarryx_u64(&x103, &x104, x102, x83, x95); - fiat_p3923_addcarryx_u64(&x105, &x106, x104, ((x84 + (x62 + (x54 + x42))) + (x76 + x64)), x97); - fiat_p3923_mulx_u64(&x107, &x108, x99, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x109, &x110, x99, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x111, &x112, x99, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x115, &x116, 0x0, x114, x111); - fiat_p3923_addcarryx_u64(&x117, &x118, x116, x112, x109); - fiat_p3923_addcarryx_u64(&x119, &x120, x118, x110, x107); - fiat_p3923_addcarryx_u64(&x121, &x122, 0x0, x99, x113); - fiat_p3923_addcarryx_u64(&x123, &x124, x122, x101, x115); - fiat_p3923_addcarryx_u64(&x125, &x126, x124, x103, x117); - fiat_p3923_addcarryx_u64(&x127, &x128, x126, x105, x119); - fiat_p3923_mulx_u64(&x129, &x130, x3, UINT64_C(0x2ed52f29f5b889a8)); - fiat_p3923_mulx_u64(&x131, &x132, x3, UINT64_C(0xf52e01b77a8daf49)); - fiat_p3923_mulx_u64(&x133, &x134, x3, UINT64_C(0x5aefc767151e69b7)); - fiat_p3923_mulx_u64(&x135, &x136, x3, UINT64_C(0xda5a066fea16792e)); - fiat_p3923_addcarryx_u64(&x137, &x138, 0x0, x136, x133); - fiat_p3923_addcarryx_u64(&x139, &x140, x138, x134, x131); - fiat_p3923_addcarryx_u64(&x141, &x142, x140, x132, x129); - fiat_p3923_addcarryx_u64(&x143, &x144, 0x0, x123, x135); - fiat_p3923_addcarryx_u64(&x145, &x146, x144, x125, x137); - fiat_p3923_addcarryx_u64(&x147, &x148, x146, x127, x139); - fiat_p3923_addcarryx_u64(&x149, &x150, x148, ((x128 + (x106 + (x98 + x86))) + (x120 + x108)), x141); - fiat_p3923_mulx_u64(&x151, &x152, x143, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_mulx_u64(&x153, &x154, x143, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_mulx_u64(&x155, &x156, x143, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_mulx_u64(&x157, &x158, x143, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x159, &x160, 0x0, x158, x155); - fiat_p3923_addcarryx_u64(&x161, &x162, x160, x156, x153); - fiat_p3923_addcarryx_u64(&x163, &x164, x162, x154, x151); - fiat_p3923_addcarryx_u64(&x165, &x166, 0x0, x143, x157); - fiat_p3923_addcarryx_u64(&x167, &x168, x166, x145, x159); - fiat_p3923_addcarryx_u64(&x169, &x170, x168, x147, x161); - fiat_p3923_addcarryx_u64(&x171, &x172, x170, x149, x163); - x173 = ((x172 + (x150 + (x142 + x130))) + (x164 + x152)); - fiat_p3923_subborrowx_u64(&x174, &x175, 0x0, x167, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x176, &x177, x175, x169, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x178, &x179, x177, x171, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x180, &x181, x179, x173, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x182, &x183, x181, 0x0, 0x0); - fiat_p3923_cmovznz_u64(&x184, x183, x174, x167); - fiat_p3923_cmovznz_u64(&x185, x183, x176, x169); - fiat_p3923_cmovznz_u64(&x186, x183, x178, x171); - fiat_p3923_cmovznz_u64(&x187, x183, x180, x173); - out1[0] = x184; - out1[1] = x185; - out1[2] = x186; - out1[3] = x187; -} - -/* - * The function fiat_p3923_set_one returns the field element one in the Montgomery domain. - * - * Postconditions: - * eval (from_montgomery out1) mod m = 1 mod m - * 0 ≤ eval out1 < m - * - */ -static void fiat_p3923_set_one(fiat_p3923_montgomery_domain_field_element out1) { - out1[0] = 0x4; - out1[1] = UINT64_C(0xb29fe8164586dd38); - out1[2] = UINT64_C(0x233b96727303f092); - out1[3] = UINT64_C(0x2de2a054828dab3d); -} - -#if 0 - -/* - * The function fiat_p3923_msat returns the saturated representation of the prime modulus. - * - * Postconditions: - * twos_complement_eval out1 = m - * 0 ≤ eval out1 < m - * - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -static void fiat_p3923_msat(uint64_t out1[5]) { - out1[0] = UINT64_C(0xffffffffffffffff); - out1[1] = UINT64_C(0x535805fa6e9e48b1); - out1[2] = UINT64_C(0xb7311a63633f03db); - out1[3] = UINT64_C(0x348757eadf5c9530); - out1[4] = 0x0; -} - -/* - * The function fiat_p3923_divstep_precomp returns the precomputed value for Bernstein-Yang-inversion (in montgomery form). - * - * Postconditions: - * eval (from_montgomery out1) = ⌊(m - 1) / 2⌋^(if ⌊log2 m⌋ + 1 < 46 then ⌊(49 * (⌊log2 m⌋ + 1) + 80) / 17⌋ else ⌊(49 * (⌊log2 m⌋ + 1) + 57) / 17⌋) - * 0 ≤ eval out1 < m - * - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -static void fiat_p3923_divstep_precomp(uint64_t out1[4]) { - out1[0] = UINT64_C(0xaee112e844291710); - out1[1] = UINT64_C(0x1e0160ba47b5dac7); - out1[2] = UINT64_C(0x24a2c2e843cc0a4f); - out1[3] = UINT64_C(0x24f57f5d3517ab8f); -} - -/* - * The function fiat_p3923_divstep computes a divstep. - * - * Preconditions: - * 0 ≤ eval arg4 < m - * 0 ≤ eval arg5 < m - * Postconditions: - * out1 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then 1 - arg1 else 1 + arg1) - * twos_complement_eval out2 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then twos_complement_eval arg3 else twos_complement_eval arg2) - * twos_complement_eval out3 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then ⌊(twos_complement_eval arg3 - twos_complement_eval arg2) / 2⌋ else ⌊(twos_complement_eval arg3 + (twos_complement_eval arg3 mod 2) * twos_complement_eval arg2) / 2⌋) - * eval (from_montgomery out4) mod m = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then (2 * eval (from_montgomery arg5)) mod m else (2 * eval (from_montgomery arg4)) mod m) - * eval (from_montgomery out5) mod m = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then (eval (from_montgomery arg4) - eval (from_montgomery arg4)) mod m else (eval (from_montgomery arg5) + (twos_complement_eval arg3 mod 2) * eval (from_montgomery arg4)) mod m) - * 0 ≤ eval out5 < m - * 0 ≤ eval out5 < m - * 0 ≤ eval out2 < m - * 0 ≤ eval out3 < m - * - * Input Bounds: - * arg1: [0x0 ~> 0xffffffffffffffff] - * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * out3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * out4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * out5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -static void fiat_p3923_divstep(uint64_t* out1, uint64_t out2[5], uint64_t out3[5], uint64_t out4[4], uint64_t out5[4], uint64_t arg1, const uint64_t arg2[5], const uint64_t arg3[5], const uint64_t arg4[4], const uint64_t arg5[4]) { - uint64_t x1; - fiat_p3923_uint1 x2; - fiat_p3923_uint1 x3; - uint64_t x4; - fiat_p3923_uint1 x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - fiat_p3923_uint1 x13; - uint64_t x14; - fiat_p3923_uint1 x15; - uint64_t x16; - fiat_p3923_uint1 x17; - uint64_t x18; - fiat_p3923_uint1 x19; - uint64_t x20; - fiat_p3923_uint1 x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - fiat_p3923_uint1 x32; - uint64_t x33; - fiat_p3923_uint1 x34; - uint64_t x35; - fiat_p3923_uint1 x36; - uint64_t x37; - fiat_p3923_uint1 x38; - uint64_t x39; - fiat_p3923_uint1 x40; - uint64_t x41; - fiat_p3923_uint1 x42; - uint64_t x43; - fiat_p3923_uint1 x44; - uint64_t x45; - fiat_p3923_uint1 x46; - uint64_t x47; - fiat_p3923_uint1 x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - fiat_p3923_uint1 x54; - uint64_t x55; - fiat_p3923_uint1 x56; - uint64_t x57; - fiat_p3923_uint1 x58; - uint64_t x59; - fiat_p3923_uint1 x60; - uint64_t x61; - uint64_t x62; - fiat_p3923_uint1 x63; - uint64_t x64; - fiat_p3923_uint1 x65; - uint64_t x66; - fiat_p3923_uint1 x67; - uint64_t x68; - fiat_p3923_uint1 x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - fiat_p3923_uint1 x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - uint64_t x79; - uint64_t x80; - fiat_p3923_uint1 x81; - uint64_t x82; - fiat_p3923_uint1 x83; - uint64_t x84; - fiat_p3923_uint1 x85; - uint64_t x86; - fiat_p3923_uint1 x87; - uint64_t x88; - fiat_p3923_uint1 x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - fiat_p3923_uint1 x95; - uint64_t x96; - fiat_p3923_uint1 x97; - uint64_t x98; - fiat_p3923_uint1 x99; - uint64_t x100; - fiat_p3923_uint1 x101; - uint64_t x102; - fiat_p3923_uint1 x103; - uint64_t x104; - fiat_p3923_uint1 x105; - uint64_t x106; - fiat_p3923_uint1 x107; - uint64_t x108; - fiat_p3923_uint1 x109; - uint64_t x110; - fiat_p3923_uint1 x111; - uint64_t x112; - fiat_p3923_uint1 x113; - uint64_t x114; - uint64_t x115; - uint64_t x116; - uint64_t x117; - uint64_t x118; - uint64_t x119; - uint64_t x120; - uint64_t x121; - uint64_t x122; - uint64_t x123; - uint64_t x124; - uint64_t x125; - uint64_t x126; - fiat_p3923_addcarryx_u64(&x1, &x2, 0x0, (~arg1), 0x1); - x3 = (fiat_p3923_uint1)((fiat_p3923_uint1)(x1 >> 63) & (fiat_p3923_uint1)((arg3[0]) & 0x1)); - fiat_p3923_addcarryx_u64(&x4, &x5, 0x0, (~arg1), 0x1); - fiat_p3923_cmovznz_u64(&x6, x3, arg1, x4); - fiat_p3923_cmovznz_u64(&x7, x3, (arg2[0]), (arg3[0])); - fiat_p3923_cmovznz_u64(&x8, x3, (arg2[1]), (arg3[1])); - fiat_p3923_cmovznz_u64(&x9, x3, (arg2[2]), (arg3[2])); - fiat_p3923_cmovznz_u64(&x10, x3, (arg2[3]), (arg3[3])); - fiat_p3923_cmovznz_u64(&x11, x3, (arg2[4]), (arg3[4])); - fiat_p3923_addcarryx_u64(&x12, &x13, 0x0, 0x1, (~(arg2[0]))); - fiat_p3923_addcarryx_u64(&x14, &x15, x13, 0x0, (~(arg2[1]))); - fiat_p3923_addcarryx_u64(&x16, &x17, x15, 0x0, (~(arg2[2]))); - fiat_p3923_addcarryx_u64(&x18, &x19, x17, 0x0, (~(arg2[3]))); - fiat_p3923_addcarryx_u64(&x20, &x21, x19, 0x0, (~(arg2[4]))); - fiat_p3923_cmovznz_u64(&x22, x3, (arg3[0]), x12); - fiat_p3923_cmovznz_u64(&x23, x3, (arg3[1]), x14); - fiat_p3923_cmovznz_u64(&x24, x3, (arg3[2]), x16); - fiat_p3923_cmovznz_u64(&x25, x3, (arg3[3]), x18); - fiat_p3923_cmovznz_u64(&x26, x3, (arg3[4]), x20); - fiat_p3923_cmovznz_u64(&x27, x3, (arg4[0]), (arg5[0])); - fiat_p3923_cmovznz_u64(&x28, x3, (arg4[1]), (arg5[1])); - fiat_p3923_cmovznz_u64(&x29, x3, (arg4[2]), (arg5[2])); - fiat_p3923_cmovznz_u64(&x30, x3, (arg4[3]), (arg5[3])); - fiat_p3923_addcarryx_u64(&x31, &x32, 0x0, x27, x27); - fiat_p3923_addcarryx_u64(&x33, &x34, x32, x28, x28); - fiat_p3923_addcarryx_u64(&x35, &x36, x34, x29, x29); - fiat_p3923_addcarryx_u64(&x37, &x38, x36, x30, x30); - fiat_p3923_subborrowx_u64(&x39, &x40, 0x0, x31, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x41, &x42, x40, x33, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x43, &x44, x42, x35, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x45, &x46, x44, x37, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x47, &x48, x46, x38, 0x0); - x49 = (arg4[3]); - x50 = (arg4[2]); - x51 = (arg4[1]); - x52 = (arg4[0]); - fiat_p3923_subborrowx_u64(&x53, &x54, 0x0, 0x0, x52); - fiat_p3923_subborrowx_u64(&x55, &x56, x54, 0x0, x51); - fiat_p3923_subborrowx_u64(&x57, &x58, x56, 0x0, x50); - fiat_p3923_subborrowx_u64(&x59, &x60, x58, 0x0, x49); - fiat_p3923_cmovznz_u64(&x61, x60, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p3923_addcarryx_u64(&x62, &x63, 0x0, x53, x61); - fiat_p3923_addcarryx_u64(&x64, &x65, x63, x55, (x61 & UINT64_C(0x535805fa6e9e48b1))); - fiat_p3923_addcarryx_u64(&x66, &x67, x65, x57, (x61 & UINT64_C(0xb7311a63633f03db))); - fiat_p3923_addcarryx_u64(&x68, &x69, x67, x59, (x61 & UINT64_C(0x348757eadf5c9530))); - fiat_p3923_cmovznz_u64(&x70, x3, (arg5[0]), x62); - fiat_p3923_cmovznz_u64(&x71, x3, (arg5[1]), x64); - fiat_p3923_cmovznz_u64(&x72, x3, (arg5[2]), x66); - fiat_p3923_cmovznz_u64(&x73, x3, (arg5[3]), x68); - x74 = (fiat_p3923_uint1)(x22 & 0x1); - fiat_p3923_cmovznz_u64(&x75, x74, 0x0, x7); - fiat_p3923_cmovznz_u64(&x76, x74, 0x0, x8); - fiat_p3923_cmovznz_u64(&x77, x74, 0x0, x9); - fiat_p3923_cmovznz_u64(&x78, x74, 0x0, x10); - fiat_p3923_cmovznz_u64(&x79, x74, 0x0, x11); - fiat_p3923_addcarryx_u64(&x80, &x81, 0x0, x22, x75); - fiat_p3923_addcarryx_u64(&x82, &x83, x81, x23, x76); - fiat_p3923_addcarryx_u64(&x84, &x85, x83, x24, x77); - fiat_p3923_addcarryx_u64(&x86, &x87, x85, x25, x78); - fiat_p3923_addcarryx_u64(&x88, &x89, x87, x26, x79); - fiat_p3923_cmovznz_u64(&x90, x74, 0x0, x27); - fiat_p3923_cmovznz_u64(&x91, x74, 0x0, x28); - fiat_p3923_cmovznz_u64(&x92, x74, 0x0, x29); - fiat_p3923_cmovznz_u64(&x93, x74, 0x0, x30); - fiat_p3923_addcarryx_u64(&x94, &x95, 0x0, x70, x90); - fiat_p3923_addcarryx_u64(&x96, &x97, x95, x71, x91); - fiat_p3923_addcarryx_u64(&x98, &x99, x97, x72, x92); - fiat_p3923_addcarryx_u64(&x100, &x101, x99, x73, x93); - fiat_p3923_subborrowx_u64(&x102, &x103, 0x0, x94, UINT64_C(0xffffffffffffffff)); - fiat_p3923_subborrowx_u64(&x104, &x105, x103, x96, UINT64_C(0x535805fa6e9e48b1)); - fiat_p3923_subborrowx_u64(&x106, &x107, x105, x98, UINT64_C(0xb7311a63633f03db)); - fiat_p3923_subborrowx_u64(&x108, &x109, x107, x100, UINT64_C(0x348757eadf5c9530)); - fiat_p3923_subborrowx_u64(&x110, &x111, x109, x101, 0x0); - fiat_p3923_addcarryx_u64(&x112, &x113, 0x0, x6, 0x1); - x114 = ((x80 >> 1) | ((x82 << 63) & UINT64_C(0xffffffffffffffff))); - x115 = ((x82 >> 1) | ((x84 << 63) & UINT64_C(0xffffffffffffffff))); - x116 = ((x84 >> 1) | ((x86 << 63) & UINT64_C(0xffffffffffffffff))); - x117 = ((x86 >> 1) | ((x88 << 63) & UINT64_C(0xffffffffffffffff))); - x118 = ((x88 & UINT64_C(0x8000000000000000)) | (x88 >> 1)); - fiat_p3923_cmovznz_u64(&x119, x48, x39, x31); - fiat_p3923_cmovznz_u64(&x120, x48, x41, x33); - fiat_p3923_cmovznz_u64(&x121, x48, x43, x35); - fiat_p3923_cmovznz_u64(&x122, x48, x45, x37); - fiat_p3923_cmovznz_u64(&x123, x111, x102, x94); - fiat_p3923_cmovznz_u64(&x124, x111, x104, x96); - fiat_p3923_cmovznz_u64(&x125, x111, x106, x98); - fiat_p3923_cmovznz_u64(&x126, x111, x108, x100); - *out1 = x112; - out2[0] = x7; - out2[1] = x8; - out2[2] = x9; - out2[3] = x10; - out2[4] = x11; - out3[0] = x114; - out3[1] = x115; - out3[2] = x116; - out3[3] = x117; - out3[4] = x118; - out4[0] = x119; - out4[1] = x120; - out4[2] = x121; - out4[3] = x122; - out5[0] = x123; - out5[1] = x124; - out5[2] = x125; - out5[3] = x126; -} - -#endif - -void fp_add(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p3923_add(out, a, b); -} - -void fp_sub(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p3923_sub(out, a, b); -} - -void fp_sqr(uint64_t* out, const uint64_t* a) { - fiat_p3923_square(out, a); -} - -void fp_mul(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p3923_mul(out, a, b); -} - -void fp_tomont(uint64_t* out, const uint64_t* a) { - fiat_p3923_to_montgomery(out, a); -} - -void fp_frommont(uint64_t* out, const uint64_t* a) { - fiat_p3923_from_montgomery(out, a); -} - -void fp_mont_setone(uint64_t* out) { - fiat_p3923_set_one(out); -} diff --git a/src/gf/ref/lvl1/fp_p5248_32.c b/src/gf/ref/lvl1/fp_p5248_32.c new file mode 100644 index 0000000..a52add3 --- /dev/null +++ b/src/gf/ref/lvl1/fp_p5248_32.c @@ -0,0 +1,942 @@ +// clang-format off +// Command line : python monty.py 32 +// 0x4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +#include +#include + +#define sspint int32_t +#define spint uint32_t +#define udpint uint64_t +#define dpint uint64_t + +#define Wordlength 32 +#define Nlimbs 9 +#define Radix 29 +#define Nbits 251 +#define Nbytes 32 + +#define MONTGOMERY +// propagate carries +inline static spint prop(spint *n) { + int i; + spint mask = ((spint)1 << 29u) - (spint)1; + sspint carry = (sspint)n[0]; + carry >>= 29u; + n[0] &= mask; + for (i = 1; i < 8; i++) { + carry += (sspint)n[i]; + n[i] = (spint)carry & mask; + carry >>= 29u; + } + n[8] += (spint)carry; + return -((n[8] >> 1) >> 30u); +} + +// propagate carries and add p if negative, propagate carries again +inline static int flatten(spint *n) { + spint carry = prop(n); + n[0] -= (spint)1u & carry; + n[8] += ((spint)0x50000u) & carry; + (void)prop(n); + return (int)(carry & 1); +} + +// Montgomery final subtract +static int modfsb(spint *n) { + n[0] += (spint)1u; + n[8] -= (spint)0x50000u; + return flatten(n); +} + +// Modular addition - reduce less than 2p +static void modadd(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] + b[0]; + n[1] = a[1] + b[1]; + n[2] = a[2] + b[2]; + n[3] = a[3] + b[3]; + n[4] = a[4] + b[4]; + n[5] = a[5] + b[5]; + n[6] = a[6] + b[6]; + n[7] = a[7] + b[7]; + n[8] = a[8] + b[8]; + n[0] += (spint)2u; + n[8] -= (spint)0xa0000u; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[8] += ((spint)0xa0000u) & carry; + (void)prop(n); +} + +// Modular subtraction - reduce less than 2p +static void modsub(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] - b[0]; + n[1] = a[1] - b[1]; + n[2] = a[2] - b[2]; + n[3] = a[3] - b[3]; + n[4] = a[4] - b[4]; + n[5] = a[5] - b[5]; + n[6] = a[6] - b[6]; + n[7] = a[7] - b[7]; + n[8] = a[8] - b[8]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[8] += ((spint)0xa0000u) & carry; + (void)prop(n); +} + +// Modular negation +static void modneg(const spint *b, spint *n) { + spint carry; + n[0] = (spint)0 - b[0]; + n[1] = (spint)0 - b[1]; + n[2] = (spint)0 - b[2]; + n[3] = (spint)0 - b[3]; + n[4] = (spint)0 - b[4]; + n[5] = (spint)0 - b[5]; + n[6] = (spint)0 - b[6]; + n[7] = (spint)0 - b[7]; + n[8] = (spint)0 - b[8]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[8] += ((spint)0xa0000u) & carry; + (void)prop(n); +} + +// Overflow limit = 18446744073709551616 +// maximum possible = 2594249331921584137 +// Modular multiplication, c=a*b mod 2p +static void modmul(const spint *a, const spint *b, spint *c) { + dpint t = 0; + spint p8 = 0x50000u; + spint q = ((spint)1 << 29u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + t += (dpint)a[0] * b[0]; + spint v0 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[1]; + t += (dpint)a[1] * b[0]; + spint v1 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[2]; + t += (dpint)a[1] * b[1]; + t += (dpint)a[2] * b[0]; + spint v2 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[3]; + t += (dpint)a[1] * b[2]; + t += (dpint)a[2] * b[1]; + t += (dpint)a[3] * b[0]; + spint v3 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[4]; + t += (dpint)a[1] * b[3]; + t += (dpint)a[2] * b[2]; + t += (dpint)a[3] * b[1]; + t += (dpint)a[4] * b[0]; + spint v4 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[5]; + t += (dpint)a[1] * b[4]; + t += (dpint)a[2] * b[3]; + t += (dpint)a[3] * b[2]; + t += (dpint)a[4] * b[1]; + t += (dpint)a[5] * b[0]; + spint v5 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[6]; + t += (dpint)a[1] * b[5]; + t += (dpint)a[2] * b[4]; + t += (dpint)a[3] * b[3]; + t += (dpint)a[4] * b[2]; + t += (dpint)a[5] * b[1]; + t += (dpint)a[6] * b[0]; + spint v6 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[7]; + t += (dpint)a[1] * b[6]; + t += (dpint)a[2] * b[5]; + t += (dpint)a[3] * b[4]; + t += (dpint)a[4] * b[3]; + t += (dpint)a[5] * b[2]; + t += (dpint)a[6] * b[1]; + t += (dpint)a[7] * b[0]; + spint v7 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[8]; + t += (dpint)a[1] * b[7]; + t += (dpint)a[2] * b[6]; + t += (dpint)a[3] * b[5]; + t += (dpint)a[4] * b[4]; + t += (dpint)a[5] * b[3]; + t += (dpint)a[6] * b[2]; + t += (dpint)a[7] * b[1]; + t += (dpint)a[8] * b[0]; + t += (dpint)v0 * (dpint)p8; + spint v8 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[1] * b[8]; + t += (dpint)a[2] * b[7]; + t += (dpint)a[3] * b[6]; + t += (dpint)a[4] * b[5]; + t += (dpint)a[5] * b[4]; + t += (dpint)a[6] * b[3]; + t += (dpint)a[7] * b[2]; + t += (dpint)a[8] * b[1]; + t += (dpint)v1 * (dpint)p8; + c[0] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[2] * b[8]; + t += (dpint)a[3] * b[7]; + t += (dpint)a[4] * b[6]; + t += (dpint)a[5] * b[5]; + t += (dpint)a[6] * b[4]; + t += (dpint)a[7] * b[3]; + t += (dpint)a[8] * b[2]; + t += (dpint)v2 * (dpint)p8; + c[1] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[3] * b[8]; + t += (dpint)a[4] * b[7]; + t += (dpint)a[5] * b[6]; + t += (dpint)a[6] * b[5]; + t += (dpint)a[7] * b[4]; + t += (dpint)a[8] * b[3]; + t += (dpint)v3 * (dpint)p8; + c[2] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[4] * b[8]; + t += (dpint)a[5] * b[7]; + t += (dpint)a[6] * b[6]; + t += (dpint)a[7] * b[5]; + t += (dpint)a[8] * b[4]; + t += (dpint)v4 * (dpint)p8; + c[3] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[5] * b[8]; + t += (dpint)a[6] * b[7]; + t += (dpint)a[7] * b[6]; + t += (dpint)a[8] * b[5]; + t += (dpint)v5 * (dpint)p8; + c[4] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[6] * b[8]; + t += (dpint)a[7] * b[7]; + t += (dpint)a[8] * b[6]; + t += (dpint)v6 * (dpint)p8; + c[5] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[7] * b[8]; + t += (dpint)a[8] * b[7]; + t += (dpint)v7 * (dpint)p8; + c[6] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[8] * b[8]; + t += (dpint)v8 * (dpint)p8; + c[7] = ((spint)t & mask); + t >>= 29; + c[8] = (spint)t; +} + +// Modular squaring, c=a*a mod 2p +static void modsqr(const spint *a, spint *c) { + udpint tot; + udpint t = 0; + spint p8 = 0x50000u; + spint q = ((spint)1 << 29u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + tot = (udpint)a[0] * a[0]; + t = tot; + spint v0 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[1]; + tot *= 2; + t += tot; + spint v1 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[2]; + tot *= 2; + tot += (udpint)a[1] * a[1]; + t += tot; + spint v2 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[3]; + tot += (udpint)a[1] * a[2]; + tot *= 2; + t += tot; + spint v3 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[4]; + tot += (udpint)a[1] * a[3]; + tot *= 2; + tot += (udpint)a[2] * a[2]; + t += tot; + spint v4 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[5]; + tot += (udpint)a[1] * a[4]; + tot += (udpint)a[2] * a[3]; + tot *= 2; + t += tot; + spint v5 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[6]; + tot += (udpint)a[1] * a[5]; + tot += (udpint)a[2] * a[4]; + tot *= 2; + tot += (udpint)a[3] * a[3]; + t += tot; + spint v6 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[7]; + tot += (udpint)a[1] * a[6]; + tot += (udpint)a[2] * a[5]; + tot += (udpint)a[3] * a[4]; + tot *= 2; + t += tot; + spint v7 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[8]; + tot += (udpint)a[1] * a[7]; + tot += (udpint)a[2] * a[6]; + tot += (udpint)a[3] * a[5]; + tot *= 2; + tot += (udpint)a[4] * a[4]; + t += tot; + t += (udpint)v0 * p8; + spint v8 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[1] * a[8]; + tot += (udpint)a[2] * a[7]; + tot += (udpint)a[3] * a[6]; + tot += (udpint)a[4] * a[5]; + tot *= 2; + t += tot; + t += (udpint)v1 * p8; + c[0] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[2] * a[8]; + tot += (udpint)a[3] * a[7]; + tot += (udpint)a[4] * a[6]; + tot *= 2; + tot += (udpint)a[5] * a[5]; + t += tot; + t += (udpint)v2 * p8; + c[1] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[3] * a[8]; + tot += (udpint)a[4] * a[7]; + tot += (udpint)a[5] * a[6]; + tot *= 2; + t += tot; + t += (udpint)v3 * p8; + c[2] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[4] * a[8]; + tot += (udpint)a[5] * a[7]; + tot *= 2; + tot += (udpint)a[6] * a[6]; + t += tot; + t += (udpint)v4 * p8; + c[3] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[5] * a[8]; + tot += (udpint)a[6] * a[7]; + tot *= 2; + t += tot; + t += (udpint)v5 * p8; + c[4] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[6] * a[8]; + tot *= 2; + tot += (udpint)a[7] * a[7]; + t += tot; + t += (udpint)v6 * p8; + c[5] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[7] * a[8]; + tot *= 2; + t += tot; + t += (udpint)v7 * p8; + c[6] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[8] * a[8]; + t += tot; + t += (udpint)v8 * p8; + c[7] = ((spint)t & mask); + t >>= 29; + c[8] = (spint)t; +} + +// copy +static void modcpy(const spint *a, spint *c) { + int i; + for (i = 0; i < 9; i++) { + c[i] = a[i]; + } +} + +// square n times +static void modnsqr(spint *a, int n) { + int i; + for (i = 0; i < n; i++) { + modsqr(a, a); + } +} + +// Calculate progenitor +static void modpro(const spint *w, spint *z) { + spint x[9]; + spint t0[9]; + spint t1[9]; + spint t2[9]; + spint t3[9]; + spint t4[9]; + modcpy(w, x); + modsqr(x, z); + modmul(x, z, t0); + modsqr(t0, z); + modmul(x, z, z); + modsqr(z, t1); + modsqr(t1, t3); + modsqr(t3, t2); + modcpy(t2, t4); + modnsqr(t4, 3); + modmul(t2, t4, t2); + modcpy(t2, t4); + modnsqr(t4, 6); + modmul(t2, t4, t2); + modcpy(t2, t4); + modnsqr(t4, 2); + modmul(t3, t4, t3); + modnsqr(t3, 13); + modmul(t2, t3, t2); + modcpy(t2, t3); + modnsqr(t3, 27); + modmul(t2, t3, t2); + modmul(z, t2, z); + modcpy(z, t2); + modnsqr(t2, 4); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modmul(t1, t0, t1); + modmul(t0, t1, t0); + modmul(t1, t0, t2); + modmul(t0, t2, t0); + modmul(t1, t0, t1); + modnsqr(t1, 63); + modmul(t0, t1, t1); + modnsqr(t1, 64); + modmul(t0, t1, t0); + modnsqr(t0, 57); + modmul(z, t0, z); +} + +// calculate inverse, provide progenitor h if available +static void modinv(const spint *x, const spint *h, spint *z) { + spint s[9]; + spint t[9]; + if (h == NULL) { + modpro(x, t); + } else { + modcpy(h, t); + } + modcpy(x, s); + modnsqr(t, 2); + modmul(s, t, z); +} + +// Convert m to n-residue form, n=nres(m) +static void nres(const spint *m, spint *n) { + const spint c[9] = {0xcf5c28fu, 0x6666666u, 0x13333333u, + 0x19999999u, 0xcccccccu, 0x6666666u, + 0x13333333u, 0x19999999u, 0x1ccccu}; + modmul(m, c, n); +} + +// Convert n back to normal form, m=redc(n) +static void redc(const spint *n, spint *m) { + int i; + spint c[9]; + c[0] = 1; + for (i = 1; i < 9; i++) { + c[i] = 0; + } + modmul(n, c, m); + (void)modfsb(m); +} + +// is unity? +static int modis1(const spint *a) { + int i; + spint c[9]; + spint c0; + spint d = 0; + redc(a, c); + for (i = 1; i < 9; i++) { + d |= c[i]; + } + c0 = (spint)c[0]; + return ((spint)1 & ((d - (spint)1) >> 29u) & + (((c0 ^ (spint)1) - (spint)1) >> 29u)); +} + +// is zero? +static int modis0(const spint *a) { + int i; + spint c[9]; + spint d = 0; + redc(a, c); + for (i = 0; i < 9; i++) { + d |= c[i]; + } + return ((spint)1 & ((d - (spint)1) >> 29u)); +} + +// set to zero +static void modzer(spint *a) { + int i; + for (i = 0; i < 9; i++) { + a[i] = 0; + } +} + +// set to one +static void modone(spint *a) { + int i; + a[0] = 1; + for (i = 1; i < 9; i++) { + a[i] = 0; + } + nres(a, a); +} + +// set to integer +static void modint(int x, spint *a) { + int i; + a[0] = (spint)x; + for (i = 1; i < 9; i++) { + a[i] = 0; + } + nres(a, a); +} + +// Modular multiplication by an integer, c=a*b mod 2p +static void modmli(const spint *a, int b, spint *c) { + spint t[9]; + modint(b, t); + modmul(a, t, c); +} + +// Test for quadratic residue +static int modqr(const spint *h, const spint *x) { + spint r[9]; + if (h == NULL) { + modpro(x, r); + modsqr(r, r); + } else { + modsqr(h, r); + } + modmul(r, x, r); + return modis1(r) | modis0(x); +} + +// conditional move g to f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcmv(int b, const spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t; + spint r = 0x5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 9; i++) { + s = g[i]; + t = f[i]; + f[i] = c0 * t + c1 * s; + f[i] -= r * (t + s); + } +} + +// conditional swap g and f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcsw(int b, volatile spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t, w; + spint r = 0x5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 9; i++) { + s = g[i]; + t = f[i]; + w = r * (t + s); + f[i] = c0 * t + c1 * s; + f[i] -= w; + g[i] = c0 * s + c1 * t; + g[i] -= w; + } +} + +// Modular square root, provide progenitor h if available, NULL if not +static void modsqrt(const spint *x, const spint *h, spint *r) { + spint s[9]; + spint y[9]; + if (h == NULL) { + modpro(x, y); + } else { + modcpy(h, y); + } + modmul(y, x, s); + modcpy(s, r); +} + +// shift left by less than a word +static void modshl(unsigned int n, spint *a) { + int i; + a[8] = ((a[8] << n)) | (a[7] >> (29u - n)); + for (i = 7; i > 0; i--) { + a[i] = ((a[i] << n) & (spint)0x1fffffff) | (a[i - 1] >> (29u - n)); + } + a[0] = (a[0] << n) & (spint)0x1fffffff; +} + +// shift right by less than a word. Return shifted out part +static int modshr(unsigned int n, spint *a) { + int i; + spint r = a[0] & (((spint)1 << n) - (spint)1); + for (i = 0; i < 8; i++) { + a[i] = (a[i] >> n) | ((a[i + 1] << (29u - n)) & (spint)0x1fffffff); + } + a[8] = a[8] >> n; + return r; +} + +// set a= 2^r +static void mod2r(unsigned int r, spint *a) { + unsigned int n = r / 29u; + unsigned int m = r % 29u; + modzer(a); + if (r >= 32 * 8) + return; + a[n] = 1; + a[n] <<= m; + nres(a, a); +} + +// export to byte array +static void modexp(const spint *a, char *b) { + int i; + spint c[9]; + redc(a, c); + for (i = 31; i >= 0; i--) { + b[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +// import from byte array +// returns 1 if in range, else 0 +static int modimp(const char *b, spint *a) { + int i, res; + for (i = 0; i < 9; i++) { + a[i] = 0; + } + for (i = 0; i < 32; i++) { + modshl(8, a); + a[0] += (spint)(unsigned char)b[i]; + } + res = modfsb(a); + nres(a, a); + return res; +} + +// determine sign +static int modsign(const spint *a) { + spint c[9]; + redc(a, c); + return c[0] % 2; +} + +// return true if equal +static int modcmp(const spint *a, const spint *b) { + spint c[9], d[9]; + int i, eq = 1; + redc(a, c); + redc(b, d); + for (i = 0; i < 9; i++) { + eq &= (((c[i] ^ d[i]) - 1) >> 29) & 1; + } + return eq; +} + +// clang-format on +/****************************************************************************** + API functions calling generated code above + ******************************************************************************/ + +#include + +const digit_t ZERO[NWORDS_FIELD] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; +const digit_t ONE[NWORDS_FIELD] = { 0x00000666, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00020000 }; +// Montgomery representation of 2^-1 +static const digit_t TWO_INV[NWORDS_FIELD] = { 0x00000333, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00010000 }; +// Montgomery representation of 3^-1 +static const digit_t THREE_INV[NWORDS_FIELD] = { + 0x15555777, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x00025555, +}; +// Montgomery representation of 2^256 +static const digit_t R2[NWORDS_FIELD] = { 0x0667ae14, 0x13333333, 0x19999999, 0x0ccccccc, 0x06666666, + 0x13333333, 0x19999999, 0x0ccccccc, 0x00026666 }; + +void +fp_set_small(fp_t *x, const digit_t val) +{ + modint((int)val, *x); +} + +void +fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val) +{ + modmli(*a, (int)val, *x); +} + +void +fp_set_zero(fp_t *x) +{ + modzer(*x); +} + +void +fp_set_one(fp_t *x) +{ + modone(*x); +} + +uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return -(uint32_t)modcmp(*a, *b); +} + +uint32_t +fp_is_zero(const fp_t *a) +{ + return -(uint32_t)modis0(*a); +} + +void +fp_copy(fp_t *out, const fp_t *a) +{ + modcpy(*a, *out); +} + +void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + modcsw((int)(ctl & 0x1), *a, *b); +} + +void +fp_add(fp_t *out, const fp_t *a, const fp_t *b) +{ + modadd(*a, *b, *out); +} + +void +fp_sub(fp_t *out, const fp_t *a, const fp_t *b) +{ + modsub(*a, *b, *out); +} + +void +fp_neg(fp_t *out, const fp_t *a) +{ + modneg(*a, *out); +} + +void +fp_sqr(fp_t *out, const fp_t *a) +{ + modsqr(*a, *out); +} + +void +fp_mul(fp_t *out, const fp_t *a, const fp_t *b) +{ + modmul(*a, *b, *out); +} + +void +fp_inv(fp_t *x) +{ + modinv(*x, NULL, *x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + return -(uint32_t)modqr(NULL, *a); +} + +void +fp_sqrt(fp_t *a) +{ + modsqrt(*a, NULL, *a); +} + +void +fp_half(fp_t *out, const fp_t *a) +{ + modmul(TWO_INV, *a, *out); +} + +void +fp_exp3div4(fp_t *out, const fp_t *a) +{ + modpro(*a, *out); +} + +void +fp_div3(fp_t *out, const fp_t *a) +{ + modmul(THREE_INV, *a, *out); +} + +void +fp_encode(void *dst, const fp_t *a) +{ + // Modified version of modexp() + int i; + spint c[9]; + redc(*a, c); + for (i = 0; i < 32; i++) { + ((char *)dst)[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +uint32_t +fp_decode(fp_t *d, const void *src) +{ + // Modified version of modimp() + int i; + spint res; + const unsigned char *b = src; + for (i = 0; i < 9; i++) { + (*d)[i] = 0; + } + for (i = 31; i >= 0; i--) { + modshl(8, *d); + (*d)[0] += (spint)b[i]; + } + res = (spint)-modfsb(*d); + nres(*d, *d); + // If the value was canonical then res = -1; otherwise, res = 0 + for (i = 0; i < 9; i++) { + (*d)[i] &= res; + } + return (uint32_t)res; +} + +static inline unsigned char +add_carry(unsigned char cc, spint a, spint b, spint *d) +{ + udpint t = (udpint)a + (udpint)b + cc; + *d = (spint)t; + return (unsigned char)(t >> Wordlength); +} + +static void +partial_reduce(spint *out, const spint *src) +{ + spint h, l, quo, rem; + unsigned char cc; + + // Split value in high (8 bits) and low (248 bits) parts. + h = src[7] >> 24; + l = src[7] & 0x00FFFFFF; + + // 5*2^248 = 1 mod q; hence, we add floor(h/5) + (h mod 5)*2^248 + // to the low part. + quo = (h * 0xCD) >> 10; + rem = h - (5 * quo); + cc = add_carry(0, src[0], quo, &out[0]); + cc = add_carry(cc, src[1], 0, &out[1]); + cc = add_carry(cc, src[2], 0, &out[2]); + cc = add_carry(cc, src[3], 0, &out[3]); + cc = add_carry(cc, src[4], 0, &out[4]); + cc = add_carry(cc, src[5], 0, &out[5]); + cc = add_carry(cc, src[6], 0, &out[6]); + (void)add_carry(cc, l, rem << 24, &out[7]); +} + +// Little-endian encoding of a 32-bit integer. +static inline void +enc32le(void *dst, uint32_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); +} + +// Little-endian decoding of a 32-bit integer. +static inline uint32_t +dec32le(const void *src) +{ + const uint8_t *buf = src; + return (spint)buf[0] | ((spint)buf[1] << 8) | ((spint)buf[2] << 16) | ((spint)buf[3] << 24); +} + +void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + uint32_t t[8]; // Stores Nbytes * 8 bits + uint8_t tmp[32]; // Nbytes + const uint8_t *b = src; + + fp_set_zero(d); + if (len == 0) { + return; + } + + size_t rem = len % 32; + if (rem != 0) { + // Input size is not a multiple of 32, we decode a partial + // block, which is already less than 2^248. + size_t k = len - rem; + memcpy(tmp, b + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + fp_decode(d, tmp); + len = k; + } + // Process all remaining blocks, in descending address order. + while (len > 0) { + fp_mul(d, d, &R2); + len -= 32; + t[0] = dec32le(b + len); + t[1] = dec32le(b + len + 4); + t[2] = dec32le(b + len + 8); + t[3] = dec32le(b + len + 12); + t[4] = dec32le(b + len + 16); + t[5] = dec32le(b + len + 20); + t[6] = dec32le(b + len + 24); + t[7] = dec32le(b + len + 28); + partial_reduce(t, t); + enc32le(tmp, t[0]); + enc32le(tmp + 4, t[1]); + enc32le(tmp + 8, t[2]); + enc32le(tmp + 12, t[3]); + enc32le(tmp + 16, t[4]); + enc32le(tmp + 20, t[5]); + enc32le(tmp + 24, t[6]); + enc32le(tmp + 28, t[7]); + fp_t a; + fp_decode(&a, tmp); + fp_add(d, d, &a); + } +} diff --git a/src/gf/ref/lvl1/fp_p5248_64.c b/src/gf/ref/lvl1/fp_p5248_64.c new file mode 100644 index 0000000..cde28dd --- /dev/null +++ b/src/gf/ref/lvl1/fp_p5248_64.c @@ -0,0 +1,791 @@ +// clang-format off +// Command line : python monty.py 64 +// 0x4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +#include +#include + +#define sspint int64_t +#define spint uint64_t +#define udpint __uint128_t +#define dpint __uint128_t + +#define Wordlength 64 +#define Nlimbs 5 +#define Radix 51 +#define Nbits 251 +#define Nbytes 32 + +#define MONTGOMERY +// propagate carries +inline static spint prop(spint *n) { + int i; + spint mask = ((spint)1 << 51u) - (spint)1; + sspint carry = (sspint)n[0]; + carry >>= 51u; + n[0] &= mask; + for (i = 1; i < 4; i++) { + carry += (sspint)n[i]; + n[i] = (spint)carry & mask; + carry >>= 51u; + } + n[4] += (spint)carry; + return -((n[4] >> 1) >> 62u); +} + +// propagate carries and add p if negative, propagate carries again +inline static int flatten(spint *n) { + spint carry = prop(n); + n[0] -= (spint)1u & carry; + n[4] += ((spint)0x500000000000u) & carry; + (void)prop(n); + return (int)(carry & 1); +} + +// Montgomery final subtract +inline static int modfsb(spint *n) { + n[0] += (spint)1u; + n[4] -= (spint)0x500000000000u; + return flatten(n); +} + +// Modular addition - reduce less than 2p +inline static void modadd(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] + b[0]; + n[1] = a[1] + b[1]; + n[2] = a[2] + b[2]; + n[3] = a[3] + b[3]; + n[4] = a[4] + b[4]; + n[0] += (spint)2u; + n[4] -= (spint)0xa00000000000u; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[4] += ((spint)0xa00000000000u) & carry; + (void)prop(n); +} + +// Modular subtraction - reduce less than 2p +inline static void modsub(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] - b[0]; + n[1] = a[1] - b[1]; + n[2] = a[2] - b[2]; + n[3] = a[3] - b[3]; + n[4] = a[4] - b[4]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[4] += ((spint)0xa00000000000u) & carry; + (void)prop(n); +} + +// Modular negation +inline static void modneg(const spint *b, spint *n) { + spint carry; + n[0] = (spint)0 - b[0]; + n[1] = (spint)0 - b[1]; + n[2] = (spint)0 - b[2]; + n[3] = (spint)0 - b[3]; + n[4] = (spint)0 - b[4]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[4] += ((spint)0xa00000000000u) & carry; + (void)prop(n); +} + +// Overflow limit = 340282366920938463463374607431768211456 +// maximum possible = 25551082561965953719787503747077 +// Modular multiplication, c=a*b mod 2p +inline static void modmul(const spint *a, const spint *b, spint *c) { + dpint t = 0; + spint p4 = 0x500000000000u; + spint q = ((spint)1 << 51u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + t += (dpint)a[0] * b[0]; + spint v0 = ((spint)t & mask); + t >>= 51; + t += (dpint)a[0] * b[1]; + t += (dpint)a[1] * b[0]; + spint v1 = ((spint)t & mask); + t >>= 51; + t += (dpint)a[0] * b[2]; + t += (dpint)a[1] * b[1]; + t += (dpint)a[2] * b[0]; + spint v2 = ((spint)t & mask); + t >>= 51; + t += (dpint)a[0] * b[3]; + t += (dpint)a[1] * b[2]; + t += (dpint)a[2] * b[1]; + t += (dpint)a[3] * b[0]; + spint v3 = ((spint)t & mask); + t >>= 51; + t += (dpint)a[0] * b[4]; + t += (dpint)a[1] * b[3]; + t += (dpint)a[2] * b[2]; + t += (dpint)a[3] * b[1]; + t += (dpint)a[4] * b[0]; + t += (dpint)v0 * (dpint)p4; + spint v4 = ((spint)t & mask); + t >>= 51; + t += (dpint)a[1] * b[4]; + t += (dpint)a[2] * b[3]; + t += (dpint)a[3] * b[2]; + t += (dpint)a[4] * b[1]; + t += (dpint)v1 * (dpint)p4; + c[0] = ((spint)t & mask); + t >>= 51; + t += (dpint)a[2] * b[4]; + t += (dpint)a[3] * b[3]; + t += (dpint)a[4] * b[2]; + t += (dpint)v2 * (dpint)p4; + c[1] = ((spint)t & mask); + t >>= 51; + t += (dpint)a[3] * b[4]; + t += (dpint)a[4] * b[3]; + t += (dpint)v3 * (dpint)p4; + c[2] = ((spint)t & mask); + t >>= 51; + t += (dpint)a[4] * b[4]; + t += (dpint)v4 * (dpint)p4; + c[3] = ((spint)t & mask); + t >>= 51; + c[4] = (spint)t; +} + +// Modular squaring, c=a*a mod 2p +inline static void modsqr(const spint *a, spint *c) { + udpint tot; + udpint t = 0; + spint p4 = 0x500000000000u; + spint q = ((spint)1 << 51u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + tot = (udpint)a[0] * a[0]; + t = tot; + spint v0 = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[0] * a[1]; + tot *= 2; + t += tot; + spint v1 = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[0] * a[2]; + tot *= 2; + tot += (udpint)a[1] * a[1]; + t += tot; + spint v2 = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[0] * a[3]; + tot += (udpint)a[1] * a[2]; + tot *= 2; + t += tot; + spint v3 = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[0] * a[4]; + tot += (udpint)a[1] * a[3]; + tot *= 2; + tot += (udpint)a[2] * a[2]; + t += tot; + t += (udpint)v0 * p4; + spint v4 = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[1] * a[4]; + tot += (udpint)a[2] * a[3]; + tot *= 2; + t += tot; + t += (udpint)v1 * p4; + c[0] = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[2] * a[4]; + tot *= 2; + tot += (udpint)a[3] * a[3]; + t += tot; + t += (udpint)v2 * p4; + c[1] = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[3] * a[4]; + tot *= 2; + t += tot; + t += (udpint)v3 * p4; + c[2] = ((spint)t & mask); + t >>= 51; + tot = (udpint)a[4] * a[4]; + t += tot; + t += (udpint)v4 * p4; + c[3] = ((spint)t & mask); + t >>= 51; + c[4] = (spint)t; +} + +// copy +inline static void modcpy(const spint *a, spint *c) { + int i; + for (i = 0; i < 5; i++) { + c[i] = a[i]; + } +} + +// square n times +static void modnsqr(spint *a, int n) { + int i; + for (i = 0; i < n; i++) { + modsqr(a, a); + } +} + +// Calculate progenitor +static void modpro(const spint *w, spint *z) { + spint x[5]; + spint t0[5]; + spint t1[5]; + spint t2[5]; + spint t3[5]; + spint t4[5]; + modcpy(w, x); + modsqr(x, z); + modmul(x, z, t0); + modsqr(t0, z); + modmul(x, z, z); + modsqr(z, t1); + modsqr(t1, t3); + modsqr(t3, t2); + modcpy(t2, t4); + modnsqr(t4, 3); + modmul(t2, t4, t2); + modcpy(t2, t4); + modnsqr(t4, 6); + modmul(t2, t4, t2); + modcpy(t2, t4); + modnsqr(t4, 2); + modmul(t3, t4, t3); + modnsqr(t3, 13); + modmul(t2, t3, t2); + modcpy(t2, t3); + modnsqr(t3, 27); + modmul(t2, t3, t2); + modmul(z, t2, z); + modcpy(z, t2); + modnsqr(t2, 4); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modmul(t1, t0, t1); + modmul(t0, t1, t0); + modmul(t1, t0, t2); + modmul(t0, t2, t0); + modmul(t1, t0, t1); + modnsqr(t1, 63); + modmul(t0, t1, t1); + modnsqr(t1, 64); + modmul(t0, t1, t0); + modnsqr(t0, 57); + modmul(z, t0, z); +} + +// calculate inverse, provide progenitor h if available +static void modinv(const spint *x, const spint *h, spint *z) { + spint s[5]; + spint t[5]; + if (h == NULL) { + modpro(x, t); + } else { + modcpy(h, t); + } + modcpy(x, s); + modnsqr(t, 2); + modmul(s, t, z); +} + +// Convert m to n-residue form, n=nres(m) +static void nres(const spint *m, spint *n) { + const spint c[5] = {0x4cccccccccf5cu, 0x1999999999999u, 0x3333333333333u, + 0x6666666666666u, 0xcccccccccccu}; + modmul(m, c, n); +} + +// Convert n back to normal form, m=redc(n) +static void redc(const spint *n, spint *m) { + int i; + spint c[5]; + c[0] = 1; + for (i = 1; i < 5; i++) { + c[i] = 0; + } + modmul(n, c, m); + (void)modfsb(m); +} + +// is unity? +static int modis1(const spint *a) { + int i; + spint c[5]; + spint c0; + spint d = 0; + redc(a, c); + for (i = 1; i < 5; i++) { + d |= c[i]; + } + c0 = (spint)c[0]; + return ((spint)1 & ((d - (spint)1) >> 51u) & + (((c0 ^ (spint)1) - (spint)1) >> 51u)); +} + +// is zero? +static int modis0(const spint *a) { + int i; + spint c[5]; + spint d = 0; + redc(a, c); + for (i = 0; i < 5; i++) { + d |= c[i]; + } + return ((spint)1 & ((d - (spint)1) >> 51u)); +} + +// set to zero +static void modzer(spint *a) { + int i; + for (i = 0; i < 5; i++) { + a[i] = 0; + } +} + +// set to one +static void modone(spint *a) { + int i; + a[0] = 1; + for (i = 1; i < 5; i++) { + a[i] = 0; + } + nres(a, a); +} + +// set to integer +static void modint(int x, spint *a) { + int i; + a[0] = (spint)x; + for (i = 1; i < 5; i++) { + a[i] = 0; + } + nres(a, a); +} + +// Modular multiplication by an integer, c=a*b mod 2p +inline static void modmli(const spint *a, int b, spint *c) { + spint t[5]; + modint(b, t); + modmul(a, t, c); +} + +// Test for quadratic residue +static int modqr(const spint *h, const spint *x) { + spint r[5]; + if (h == NULL) { + modpro(x, r); + modsqr(r, r); + } else { + modsqr(h, r); + } + modmul(r, x, r); + return modis1(r) | modis0(x); +} + +// conditional move g to f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcmv(int b, const spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t; + spint r = 0x3cc3c33c5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 5; i++) { + s = g[i]; + t = f[i]; + f[i] = c0 * t + c1 * s; + f[i] -= r * (t + s); + } +} + +// conditional swap g and f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcsw(int b, volatile spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t, w; + spint r = 0x3cc3c33c5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 5; i++) { + s = g[i]; + t = f[i]; + w = r * (t + s); + f[i] = c0 * t + c1 * s; + f[i] -= w; + g[i] = c0 * s + c1 * t; + g[i] -= w; + } +} + +// Modular square root, provide progenitor h if available, NULL if not +static void modsqrt(const spint *x, const spint *h, spint *r) { + spint s[5]; + spint y[5]; + if (h == NULL) { + modpro(x, y); + } else { + modcpy(h, y); + } + modmul(y, x, s); + modcpy(s, r); +} + +// shift left by less than a word +static void modshl(unsigned int n, spint *a) { + int i; + a[4] = ((a[4] << n)) | (a[3] >> (51u - n)); + for (i = 3; i > 0; i--) { + a[i] = ((a[i] << n) & (spint)0x7ffffffffffff) | (a[i - 1] >> (51u - n)); + } + a[0] = (a[0] << n) & (spint)0x7ffffffffffff; +} + +// shift right by less than a word. Return shifted out part +static int modshr(unsigned int n, spint *a) { + int i; + spint r = a[0] & (((spint)1 << n) - (spint)1); + for (i = 0; i < 4; i++) { + a[i] = (a[i] >> n) | ((a[i + 1] << (51u - n)) & (spint)0x7ffffffffffff); + } + a[4] = a[4] >> n; + return r; +} + +// set a= 2^r +static void mod2r(unsigned int r, spint *a) { + unsigned int n = r / 51u; + unsigned int m = r % 51u; + modzer(a); + if (r >= 32 * 8) + return; + a[n] = 1; + a[n] <<= m; + nres(a, a); +} + +// export to byte array +static void modexp(const spint *a, char *b) { + int i; + spint c[5]; + redc(a, c); + for (i = 31; i >= 0; i--) { + b[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +// import from byte array +// returns 1 if in range, else 0 +static int modimp(const char *b, spint *a) { + int i, res; + for (i = 0; i < 5; i++) { + a[i] = 0; + } + for (i = 0; i < 32; i++) { + modshl(8, a); + a[0] += (spint)(unsigned char)b[i]; + } + res = modfsb(a); + nres(a, a); + return res; +} + +// determine sign +static int modsign(const spint *a) { + spint c[5]; + redc(a, c); + return c[0] % 2; +} + +// return true if equal +static int modcmp(const spint *a, const spint *b) { + spint c[5], d[5]; + int i, eq = 1; + redc(a, c); + redc(b, d); + for (i = 0; i < 5; i++) { + eq &= (((c[i] ^ d[i]) - 1) >> 51) & 1; + } + return eq; +} + +// clang-format on +/****************************************************************************** + API functions calling generated code above + ******************************************************************************/ + +#include + +const digit_t ZERO[NWORDS_FIELD] = { 0x0, 0x0, 0x0, 0x0, 0x0 }; +const digit_t ONE[NWORDS_FIELD] = { 0x0000000000000019, + 0x0000000000000000, + 0x0000000000000000, + 0x0000000000000000, + 0x0000300000000000 }; +// Montgomery representation of 2^-1 +static const digit_t TWO_INV[NWORDS_FIELD] = { 0x000000000000000c, + 0x0000000000000000, + 0x0000000000000000, + 0x0000000000000000, + 0x0000400000000000 }; +// Montgomery representation of 3^-1 +static const digit_t THREE_INV[NWORDS_FIELD] = { 0x000555555555555d, + 0x0002aaaaaaaaaaaa, + 0x0005555555555555, + 0x0002aaaaaaaaaaaa, + 0x0000455555555555 }; +// Montgomery representation of 2^256 +static const digit_t R2[NWORDS_FIELD] = { 0x0001999999999eb8, + 0x0003333333333333, + 0x0006666666666666, + 0x0004cccccccccccc, + 0x0000199999999999 }; + +void +fp_set_small(fp_t *x, const digit_t val) +{ + modint((int)val, *x); +} + +void +fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val) +{ + modmli(*a, (int)val, *x); +} + +void +fp_set_zero(fp_t *x) +{ + modzer(*x); +} + +void +fp_set_one(fp_t *x) +{ + modone(*x); +} + +uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return -(uint32_t)modcmp(*a, *b); +} + +uint32_t +fp_is_zero(const fp_t *a) +{ + return -(uint32_t)modis0(*a); +} + +void +fp_copy(fp_t *out, const fp_t *a) +{ + modcpy(*a, *out); +} + +void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + modcsw((int)(ctl & 0x1), *a, *b); +} + +void +fp_add(fp_t *out, const fp_t *a, const fp_t *b) +{ + modadd(*a, *b, *out); +} + +void +fp_sub(fp_t *out, const fp_t *a, const fp_t *b) +{ + modsub(*a, *b, *out); +} + +void +fp_neg(fp_t *out, const fp_t *a) +{ + modneg(*a, *out); +} + +void +fp_sqr(fp_t *out, const fp_t *a) +{ + modsqr(*a, *out); +} + +void +fp_mul(fp_t *out, const fp_t *a, const fp_t *b) +{ + modmul(*a, *b, *out); +} + +void +fp_inv(fp_t *x) +{ + modinv(*x, NULL, *x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + return -(uint32_t)modqr(NULL, *a); +} + +void +fp_sqrt(fp_t *a) +{ + modsqrt(*a, NULL, *a); +} + +void +fp_half(fp_t *out, const fp_t *a) +{ + modmul(TWO_INV, *a, *out); +} + +void +fp_exp3div4(fp_t *out, const fp_t *a) +{ + modpro(*a, *out); +} + +void +fp_div3(fp_t *out, const fp_t *a) +{ + modmul(THREE_INV, *a, *out); +} + +void +fp_encode(void *dst, const fp_t *a) +{ + // Modified version of modexp() + int i; + spint c[5]; + redc(*a, c); + for (i = 0; i < 32; i++) { + ((char *)dst)[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +uint32_t +fp_decode(fp_t *d, const void *src) +{ + // Modified version of modimp() + int i; + spint res; + const unsigned char *b = src; + for (i = 0; i < 5; i++) { + (*d)[i] = 0; + } + for (i = 31; i >= 0; i--) { + modshl(8, *d); + (*d)[0] += (spint)b[i]; + } + res = (spint)-modfsb(*d); + nres(*d, *d); + // If the value was canonical then res = -1; otherwise, res = 0 + for (i = 0; i < 5; i++) { + (*d)[i] &= res; + } + return (uint32_t)res; +} + +static inline unsigned char +add_carry(unsigned char cc, spint a, spint b, spint *d) +{ + udpint t = (udpint)a + (udpint)b + cc; + *d = (spint)t; + return (unsigned char)(t >> Wordlength); +} + +static void +partial_reduce(spint *out, const spint *src) +{ + spint h, l, quo, rem; + unsigned char cc; + + // Split value in high (8 bits) and low (248 bits) parts. + h = src[3] >> 56; + l = src[3] & 0x00FFFFFFFFFFFFFF; + + // 5*2^248 = 1 mod q; hence, we add floor(h/5) + (h mod 5)*2^248 + // to the low part. + quo = (h * 0xCD) >> 10; + rem = h - (5 * quo); + cc = add_carry(0, src[0], quo, &out[0]); + cc = add_carry(cc, src[1], 0, &out[1]); + cc = add_carry(cc, src[2], 0, &out[2]); + (void)add_carry(cc, l, rem << 56, &out[3]); +} + +// Little-endian encoding of a 64-bit integer. +static inline void +enc64le(void *dst, uint64_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); + buf[4] = (uint8_t)(x >> 32); + buf[5] = (uint8_t)(x >> 40); + buf[6] = (uint8_t)(x >> 48); + buf[7] = (uint8_t)(x >> 56); +} + +// Little-endian decoding of a 64-bit integer. +static inline uint64_t +dec64le(const void *src) +{ + const uint8_t *buf = src; + return (spint)buf[0] | ((spint)buf[1] << 8) | ((spint)buf[2] << 16) | ((spint)buf[3] << 24) | + ((spint)buf[4] << 32) | ((spint)buf[5] << 40) | ((spint)buf[6] << 48) | ((spint)buf[7] << 56); +} + +void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + uint64_t t[4]; // Stores Nbytes * 8 bits + uint8_t tmp[32]; // Nbytes + const uint8_t *b = src; + + fp_set_zero(d); + if (len == 0) { + return; + } + + size_t rem = len % 32; + if (rem != 0) { + // Input size is not a multiple of 32, we decode a partial + // block, which is already less than 2^248. + size_t k = len - rem; + memcpy(tmp, b + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + fp_decode(d, tmp); + len = k; + } + // Process all remaining blocks, in descending address order. + while (len > 0) { + fp_mul(d, d, &R2); + len -= 32; + t[0] = dec64le(b + len); + t[1] = dec64le(b + len + 8); + t[2] = dec64le(b + len + 16); + t[3] = dec64le(b + len + 24); + partial_reduce(t, t); + enc64le(tmp, t[0]); + enc64le(tmp + 8, t[1]); + enc64le(tmp + 16, t[2]); + enc64le(tmp + 24, t[3]); + fp_t a; + fp_decode(&a, tmp); + fp_add(d, d, &a); + } +} diff --git a/src/gf/ref/lvl1/include/fp.h b/src/gf/ref/lvl1/include/fp.h deleted file mode 100644 index 833f4c7..0000000 --- a/src/gf/ref/lvl1/include/fp.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef FP_H -#define FP_H - -//////////////////////////////////////////////// NOTE: this is placed here for now -#include -#include -#include -#include -#include -#include -#include - -typedef digit_t fp_t[NWORDS_FIELD]; // Datatype for representing field elements - -void fp_set(digit_t* x, const digit_t val); -bool fp_is_equal(const digit_t* a, const digit_t* b); -bool fp_is_zero(const digit_t* a); -void fp_copy(digit_t* out, const digit_t* a); -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords); -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords); -void fp_add(digit_t* out, const digit_t* a, const digit_t* b); -void fp_sub(digit_t* out, const digit_t* a, const digit_t* b); -void fp_neg(digit_t* out, const digit_t* a); -void fp_sqr(digit_t* out, const digit_t* a); -void fp_mul(digit_t* out, const digit_t* a, const digit_t* b); -void MUL(digit_t* out, const digit_t a, const digit_t b); -void fp_inv(digit_t* x); -bool fp_is_square(const digit_t* a); -void fp_sqrt(digit_t* a); -void fp_tomont(digit_t* out, const digit_t* a); -void fp_frommont(digit_t* out, const digit_t* a); -void fp_mont_setone(digit_t* out); - -/********************** Constant-time unsigned comparisons ***********************/ - -// The following functions return 1 (TRUE) if condition is true, 0 (FALSE) otherwise - -static inline unsigned int is_digit_nonzero_ct(digit_t x) -{ // Is x != 0? - return (unsigned int)((x | (0 - x)) >> (RADIX - 1)); -} - -static inline unsigned int is_digit_zero_ct(digit_t x) -{ // Is x = 0? - return (unsigned int)(1 ^ is_digit_nonzero_ct(x)); -} - -static inline unsigned int is_digit_lessthan_ct(digit_t x, digit_t y) -{ // Is x < y? - return (unsigned int)((x ^ ((x ^ y) | ((x - y) ^ y))) >> (RADIX - 1)); -} - -/********************** Platform-independent macros for digit-size operations **********************/ - -// Digit addition with carry -#define ADDC(sumOut, carryOut, addend1, addend2, carryIn) \ - { digit_t tempReg = (addend1) + (digit_t)(carryIn); \ - (sumOut) = (addend2) + tempReg; \ - (carryOut) = (is_digit_lessthan_ct(tempReg, (digit_t)(carryIn)) | is_digit_lessthan_ct((sumOut), tempReg)); } - -// Digit subtraction with borrow -#define SUBC(differenceOut, borrowOut, minuend, subtrahend, borrowIn) \ - { digit_t tempReg = (minuend) - (subtrahend); \ - unsigned int borrowReg = (is_digit_lessthan_ct((minuend), (subtrahend)) | ((borrowIn) & is_digit_zero_ct(tempReg))); \ - (differenceOut) = tempReg - (digit_t)(borrowIn); \ - (borrowOut) = borrowReg; } - -// Shift right with flexible datatype -#define SHIFTR(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((lowIn) >> (shift)) ^ ((highIn) << (DigitSize - (shift))); - -// Digit shift left -#define SHIFTL(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((highIn) << (shift)) ^ ((lowIn) >> (RADIX - (shift))); - -#endif \ No newline at end of file diff --git a/src/gf/ref/lvl1/include/fp2.h b/src/gf/ref/lvl1/include/fp2.h deleted file mode 100755 index 2e01669..0000000 --- a/src/gf/ref/lvl1/include/fp2.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef FP2_H -#define FP2_H - -#include "fp.h" - -// Structure for representing elements in GF(p^2) -typedef struct fp2_t { - fp_t re, im; -} fp2_t; - -void fp2_set(fp2_t* x, const digit_t val); -bool fp2_is_zero(const fp2_t* a); -bool fp2_is_equal(const fp2_t* a, const fp2_t* b); -void fp2_copy(fp2_t* x, const fp2_t* y); -fp2_t fp2_non_residue(); -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_neg(fp2_t* x, const fp2_t* y); -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sqr(fp2_t* x, const fp2_t* y); -void fp2_inv(fp2_t* x); -bool fp2_is_square(const fp2_t* x); -void fp2_frob(fp2_t* x, const fp2_t* y); -void fp2_sqrt(fp2_t* x); -void fp2_tomont(fp2_t* x, const fp2_t* y); -void fp2_frommont(fp2_t* x, const fp2_t* y); -int fp2_cmp(fp2_t* x, fp2_t* y); - -#endif diff --git a/src/gf/ref/lvl1/test/CMakeLists.txt b/src/gf/ref/lvl1/test/CMakeLists.txt index 2f769a7..316e0a8 100644 --- a/src/gf/ref/lvl1/test/CMakeLists.txt +++ b/src/gf/ref/lvl1/test/CMakeLists.txt @@ -1,9 +1 @@ -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp test_fp.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp sqisign_test_gf_${SVARIANT_LOWER}_fp test ${SQISIGN_TEST_REPS}) - -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp2 test_fp2.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp2 PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp2 sqisign_test_gf_${SVARIANT_LOWER}_fp2 test ${SQISIGN_TEST_REPS}) \ No newline at end of file +include(../../lvlx_test.cmake) diff --git a/src/gf/ref/lvl1/test/test_extras.c b/src/gf/ref/lvl1/test/test_extras.c deleted file mode 100755 index ce61317..0000000 --- a/src/gf/ref/lvl1/test/test_extras.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "test_extras.h" -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; -extern const digit_t R2[NWORDS_FIELD]; - -#if 0 -int64_t cpucycles(void) -{ // Access system counter for benchmarking - unsigned int hi, lo; - - asm volatile ("rdtsc\n\t" : "=a" (lo), "=d"(hi)); - return ((int64_t)lo) | (((int64_t)hi) << 32); -} -#endif - - -int compare_words(digit_t* a, digit_t* b, unsigned int nwords) -{ // Comparing "nword" elements, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) - { - if (a[i] > b[i]) return 1; - else if (a[i] < b[i]) return -1; - } - - return 0; -} - - -static void sub_test(digit_t* out, digit_t* a, digit_t* b, unsigned int nwords) -{ // Subtraction without borrow, out = a-b where a>b - // SECURITY NOTE: this function does not have constant-time execution. It is for TESTING ONLY. - unsigned int i; - digit_t res, carry, borrow = 0; - - for (i = 0; i < nwords; i++) - { - res = a[i] - b[i]; - carry = (a[i] < b[i]); - out[i] = res - borrow; - borrow = carry || (res < borrow); - } -} - - -void fprandom_test(digit_t* a) -{ // Generating a pseudo-random field element in [0, p-1] - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - unsigned int i, diff = 256-254, nwords = NWORDS_FIELD; - unsigned char* string = NULL; - - string = (unsigned char*)a; - for (i = 0; i < sizeof(digit_t)*nwords; i++) { - *(string + i) = (unsigned char)rand(); // Obtain 256-bit number - } - a[nwords-1] &= (((digit_t)(-1) << diff) >> diff); - - while (compare_words((digit_t*)p, a, nwords) < 1) { // Force it to [0, modulus-1] - sub_test(a, a, (digit_t*)p, nwords); - } -} - - -void fp2random_test(fp2_t* a) -{ // Generating a pseudo-random element in GF(p^2) - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - - fprandom_test(a->re); - fprandom_test(a->im); -} \ No newline at end of file diff --git a/src/gf/ref/lvl1/test/test_extras.h b/src/gf/ref/lvl1/test/test_extras.h deleted file mode 100755 index ae24e33..0000000 --- a/src/gf/ref/lvl1/test/test_extras.h +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef TEST_EXTRAS_H -#define TEST_EXTRAS_H - -#include -#include -#include "../include/fp.h" -#include "../include/fp2.h" - -#define PASSED 0 -#define FAILED 1 - -// Access system counter for benchmarking -//int64_t cpucycles(void); - -// Comparing "nword" elements, a=b? : (1) a!=b, (0) a=b -int compare_words(digit_t* a, digit_t* b, unsigned int nwords); - -// Generating a pseudo-random field element in [0, p-1] -void fprandom_test(digit_t* a); - -// Generating a pseudo-random element in GF(p^2) -void fp2random_test(fp2_t* a); - -#endif \ No newline at end of file diff --git a/src/gf/ref/lvl1/test/test_fp.c b/src/gf/ref/lvl1/test/test_fp.c deleted file mode 100755 index 1cdd247..0000000 --- a/src/gf/ref/lvl1/test/test_fp.c +++ /dev/null @@ -1,295 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp_test() -{ // Tests for the field arithmetic - bool OK = true; - int n, passed; - fp_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing field arithmetic over GF(p): \n\n"); - - // Field addition - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/ref/lvl1/test/test_fp2.c b/src/gf/ref/lvl1/test/test_fp2.c deleted file mode 100755 index f6cef7d..0000000 --- a/src/gf/ref/lvl1/test/test_fp2.c +++ /dev/null @@ -1,307 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp2_test() -{ // Tests for the GF(p^2) arithmetic - bool OK = true; - int n, passed; - fp2_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing arithmetic over GF(p^2): \n\n"); - - // Addition in GF(p^2) - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp2_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp2_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/ref/lvl3/CMakeLists.txt b/src/gf/ref/lvl3/CMakeLists.txt index cd81a50..f9d6b64 100644 --- a/src/gf/ref/lvl3/CMakeLists.txt +++ b/src/gf/ref/lvl3/CMakeLists.txt @@ -1,10 +1,5 @@ - -set(SOURCE_FILES_GF_${SVARIANT_UPPER}_REF - fp_p47441.c fp.c fp2.c +set(SOURCE_FILES_GF_SPECIFIC + fp_p65376_${RADIX}.c ) -add_library(${LIB_GF_${SVARIANT_UPPER}} ${SOURCE_FILES_GF_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_GF_${SVARIANT_UPPER}} PRIVATE common ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} include ${PROJECT_SOURCE_DIR}/include ${INC_COMMON}) -target_compile_options(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/gf/ref/lvl3/Makefile b/src/gf/ref/lvl3/Makefile deleted file mode 100644 index f83ebee..0000000 --- a/src/gf/ref/lvl3/Makefile +++ /dev/null @@ -1,43 +0,0 @@ - -CC=gcc -CFLAGS= -O3 -std=gnu11 -Wall -march=native -Wno-missing-braces -Wno-logical-not-parentheses -LDFLAGS=-lm -AR=ar rcs -RANLIB=ranlib - -OBJECTS=objs/fp_p47441.o objs/fp.o objs/fp2.o objs/random.o - -all: lib tests - -objs/fp_p47441.o: fp_p47441.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp_p47441.c -o objs/fp_p47441.o - -objs/fp.o: fp.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp.c -o objs/fp.o - -objs/fp2.o: fp2.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp2.c -o objs/fp2.o - -objs/random.o: ../../../common/generic/randombytes_system.c - $(CC) -c $(CFLAGS) ../../../common/generic/randombytes_system.c -o objs/random.o - -lib: $(OBJECTS) - rm -rf lib - mkdir lib - $(AR) lib/libtest.a $^ - $(RANLIB) lib/libtest.a - -tests: lib - $(CC) $(CFLAGS) -L./lib test/test_fp.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp -lgmp - $(CC) $(CFLAGS) -L./lib test/test_fp2.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp2 -lgmp - -check: tests - -.PHONY: clean - -clean: - rm -rf *.req objs lib test_fp* - diff --git a/src/gf/ref/lvl3/fp.c b/src/gf/ref/lvl3/fp.c deleted file mode 100644 index 6bbbe77..0000000 --- a/src/gf/ref/lvl3/fp.c +++ /dev/null @@ -1,171 +0,0 @@ -#include "include/fp.h" - - -const uint64_t p[NWORDS_FIELD] = { 0xFFFFFFFFFFFFFFFF, 0x4C6174C1FFFFFFFF, 0xC722F669356EA468, 0x65BC2E0A90AEB751, 0xC6AE604A45D10AD6, 0x03DF6EEEAB0871A2 }; -const uint64_t R2[NWORDS_FIELD] = { 0x47B3E8268664617E, 0xDC10C645BFE4A1AC, 0x342C8B98F26F21ED, 0x328905E465CD7DB3, 0x0AFEA5EB6EF0DA10, 0x0389174E2D56216F }; -const uint64_t pp[NWORDS_FIELD] = { 0x01, 0x00, 0x00, 0x00 }; - - - -void fp_set(digit_t* x, const digit_t val) -{ // Set field element x = val, where val has wordsize - - x[0] = val; - for (unsigned int i = 1; i < NWORDS_FIELD; i++) { - x[i] = 0; - } -} - -bool fp_is_equal(const digit_t* a, const digit_t* b) -{ // Compare two field elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ b[i]; - - return (bool)is_digit_zero_ct(r); -} - -bool fp_is_zero(const digit_t* a) -{ // Is a field element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ 0; - - return (bool)is_digit_zero_ct(r); -} - -void fp_copy(digit_t* out, const digit_t* a) -{ - memcpy(out, a, NWORDS_FIELD*RADIX/8); -} - -void fp_neg(digit_t* out, const digit_t* a) -{ // Modular negation, out = -a mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - unsigned int i, borrow = 0; - - for (i = 0; i < NWORDS_FIELD; i++) { - SUBC(out[i], borrow, ((digit_t*)p)[i], a[i], borrow); - } - fp_sub(out, out, (digit_t*)p); -} - -void MUL(digit_t* out, const digit_t a, const digit_t b) -{ // Digit multiplication, digit*digit -> 2-digit result - // Inputs: a, b in [0, 2^w-1], where w is the computer wordsize - // Output: 0 < out < 2^(2w)-1 - register digit_t al, ah, bl, bh, temp; - digit_t albl, albh, ahbl, ahbh, res1, res2, res3, carry; - digit_t mask_low = (digit_t)(-1) >> (sizeof(digit_t)*4), mask_high = (digit_t)(-1) << (sizeof(digit_t)*4); - - al = a & mask_low; // Low part - ah = a >> (sizeof(digit_t)*4); // High part - bl = b & mask_low; - bh = b >> (sizeof(digit_t)*4); - - albl = al * bl; - albh = al * bh; - ahbl = ah * bl; - ahbh = ah * bh; - out[0] = albl & mask_low; // out00 - - res1 = albl >> (sizeof(digit_t)*4); - res2 = ahbl & mask_low; - res3 = albh & mask_low; - temp = res1 + res2 + res3; - carry = temp >> (sizeof(digit_t)*4); - out[0] ^= temp << (sizeof(digit_t)*4); // out01 - - res1 = ahbl >> (sizeof(digit_t)*4); - res2 = albh >> (sizeof(digit_t)*4); - res3 = ahbh & mask_low; - temp = res1 + res2 + res3 + carry; - out[1] = temp & mask_low; // out10 - carry = temp & mask_high; - out[1] ^= (ahbh & mask_high) + carry; // out11 -} - -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision right shift - digit_t bit_out = x[0] & 1; - - for (unsigned int i = 0; i < nwords-1; i++) { - SHIFTR(x[i+1], x[i], shift, x[i], RADIX); - } - x[nwords-1] >>= shift; - return bit_out; -} - -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision left shift - - for (int i = nwords-1; i > 0; i--) { - SHIFTL(x[i], x[i-1], shift, x[i], RADIX); - } - x[0] <<= shift; -} - -static void fp_exp3div4(digit_t* out, const digit_t* a) -{ // Fixed exponentiation out = a^((p-3)/4) mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - // Requirement: p = 3(mod 4) - fp_t p_t, acc; - digit_t bit; - - memcpy((digit_t*)p_t, (digit_t*)p, NWORDS_FIELD*RADIX/8); - memcpy((digit_t*)acc, (digit_t*)a, NWORDS_FIELD*RADIX/8); - mp_shiftr(p_t, 1, NWORDS_FIELD); - mp_shiftr(p_t, 1, NWORDS_FIELD); - fp_set(out, 1); - fp_tomont(out, out); - - for (int i = 0; i < NWORDS_FIELD*RADIX-2; i++) { - bit = p_t[0] & 1; - mp_shiftr(p_t, 1, NWORDS_FIELD); - if (bit == 1) { - fp_mul(out, out, acc); - } - fp_sqr(acc, acc); - } -} - -void fp_inv(digit_t* a) -{ // Modular inversion, out = x^-1*R mod p, where R = 2^(w*nwords), w is the computer wordsize and nwords is the number of words to represent p - // Input: a=xR in [0, p-1] - // Output: out in [0, p-1]. It outputs 0 if the input does not have an inverse - // Requirement: Ceiling(Log(p)) < w*nwords - fp_t t; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_sqr(t, t); - fp_mul(a, t, a); // a^(p-2) -} - -bool fp_is_square(const digit_t* a) -{ // Is field element a square? - // Output: out = 0 (false), 1 (true) - fp_t t, one; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_mul(t, t, a); // a^((p-1)/2) - fp_frommont(t, t); - fp_set(one, 1); - - return fp_is_equal(t, one); -} - -void fp_sqrt(digit_t* a) -{ // Square root computation, out = a^((p+1)/4) mod p - fp_t t; - - fp_exp3div4(t, a); - fp_mul(a, t, a); // a^((p+1)/4) -} \ No newline at end of file diff --git a/src/gf/ref/lvl3/fp2.c b/src/gf/ref/lvl3/fp2.c deleted file mode 100644 index 00ceb76..0000000 --- a/src/gf/ref/lvl3/fp2.c +++ /dev/null @@ -1,194 +0,0 @@ -#include - -extern const digit_t R[NWORDS_FIELD]; - -/* Arithmetic modulo X^2 + 1 */ - -void fp2_set(fp2_t* x, const digit_t val) -{ - fp_set(x->re, val); - fp_set(x->im, 0); -} - -bool fp2_is_zero(const fp2_t* a) -{ // Is a GF(p^2) element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - - return fp_is_zero(a->re) & fp_is_zero(a->im); -} - -bool fp2_is_equal(const fp2_t* a, const fp2_t* b) -{ // Compare two GF(p^2) elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - - return fp_is_equal(a->re, b->re) & fp_is_equal(a->im, b->im); -} - -void fp2_copy(fp2_t* x, const fp2_t* y) -{ - fp_copy(x->re, y->re); - fp_copy(x->im, y->im); -} - -fp2_t fp2_non_residue() -{ // 6 + i is a quadratic non-residue for p47441 - fp_t one = {0}; - fp2_t res; - - one[0] = 1; - fp_tomont(one, one); - fp_copy(res.im, one); - fp_add(one, one, one); - fp_add(res.re, one, one); - fp_add(res.re, res.re, one); - return res; -} - -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_add(x->re, y->re, z->re); - fp_add(x->im, y->im, z->im); -} - -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_sub(x->re, y->re, z->re); - fp_sub(x->im, y->im, z->im); -} - -void fp2_neg(fp2_t* x, const fp2_t* y) -{ - fp_neg(x->re, y->re); - fp_neg(x->im, y->im); -} - -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_t t0, t1; - - fp_add(t0, y->re, y->im); - fp_add(t1, z->re, z->im); - fp_mul(t0, t0, t1); - fp_mul(t1, y->im, z->im); - fp_mul(x->re, y->re, z->re); - fp_sub(x->im, t0, t1); - fp_sub(x->im, x->im, x->re); - fp_sub(x->re, x->re, t1); -} - -void fp2_sqr(fp2_t* x, const fp2_t* y) -{ - fp_t sum, diff; - - fp_add(sum, y->re, y->im); - fp_sub(diff, y->re, y->im); - fp_mul(x->im, y->re, y->im); - fp_add(x->im, x->im, x->im); - fp_mul(x->re, sum, diff); -} - -void fp2_inv(fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - fp_inv(t0); - fp_mul(x->re, x->re, t0); - fp_mul(x->im, x->im, t0); - fp_neg(x->im, x->im); -} - -bool fp2_is_square(const fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - - return fp_is_square(t0); -} - -void fp2_frob(fp2_t* x, const fp2_t* y) -{ - memcpy((digit_t*)x->re, (digit_t*)y->re, NWORDS_FIELD*RADIX/8); - fp_neg(x->im, y->im); -} - -void fp2_tomont(fp2_t* x, const fp2_t* y) -{ - fp_tomont(x->re, y->re); - fp_tomont(x->im, y->im); -} - -void fp2_frommont(fp2_t* x, const fp2_t* y) -{ - fp_frommont(x->re, y->re); - fp_frommont(x->im, y->im); -} - -// NOTE: old, non-constant-time implementation. Could be optimized -void fp2_sqrt(fp2_t* x) -{ - fp_t sdelta, re, tmp1, tmp2, inv2, im; - - if (fp_is_zero(x->im)) { - if (fp_is_square(x->re)) { - fp_sqrt(x->re); - return; - } else { - fp_neg(x->im, x->re); - fp_sqrt(x->im); - fp_set(x->re, 0); - return; - } - } - - // sdelta = sqrt(re^2 + im^2) - fp_sqr(sdelta, x->re); - fp_sqr(tmp1, x->im); - fp_add(sdelta, sdelta, tmp1); - fp_sqrt(sdelta); - - fp_set(inv2, 2); - fp_tomont(inv2, inv2); // inv2 <- 2 - fp_inv(inv2); - fp_add(re, x->re, sdelta); - fp_mul(re, re, inv2); - memcpy((digit_t*)tmp2, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - if (!fp_is_square(tmp2)) { - fp_sub(re, x->re, sdelta); - fp_mul(re, re, inv2); - } - - fp_sqrt(re); - memcpy((digit_t*)im, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - fp_inv(im); - fp_mul(im, im, inv2); - fp_mul(x->im, im, x->im); - memcpy((digit_t*)x->re, (digit_t*)re, NWORDS_FIELD*RADIX/8); -} - -// Lexicographic comparison of two field elements. Returns +1 if x > y, -1 if x < y, 0 if x = y -int fp2_cmp(fp2_t* x, fp2_t* y){ - fp2_t a, b; - fp2_frommont(&a, x); - fp2_frommont(&b, y); - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.re[i] > b.re[i]) - return 1; - if(a.re[i] < b.re[i]) - return -1; - } - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.im[i] > b.im[i]) - return 1; - if(a.im[i] < b.im[i]) - return -1; - } - return 0; -} \ No newline at end of file diff --git a/src/gf/ref/lvl3/fp_p47441.c b/src/gf/ref/lvl3/fp_p47441.c deleted file mode 100644 index 26a79e1..0000000 --- a/src/gf/ref/lvl3/fp_p47441.c +++ /dev/null @@ -1,3424 +0,0 @@ -/* Autogenerated: './src/ExtractionOCaml/word_by_word_montgomery' p47441 64 0x3df6eeeab0871a2c6ae604a45d10ad665bc2e0a90aeb751c722f669356ea4684c6174c1ffffffffffffffffffffffff */ -/* curve description: p47441 */ -/* machine_wordsize = 64 (from "64") */ -/* requested operations: (all) */ -/* m = 0x3df6eeeab0871a2c6ae604a45d10ad665bc2e0a90aeb751c722f669356ea4684c6174c1ffffffffffffffffffffffff (from "0x3df6eeeab0871a2c6ae604a45d10ad665bc2e0a90aeb751c722f669356ea4684c6174c1ffffffffffffffffffffffff") */ -/* */ -/* NOTE: In addition to the bounds specified above each function, all */ -/* functions synthesized for this Montgomery arithmetic require the */ -/* input to be strictly less than the prime modulus (m), and also */ -/* require the input to be in the unique saturated representation. */ -/* All functions also ensure that these two properties are true of */ -/* return values. */ -/* */ -/* Computed values: */ -/* eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) */ -/* bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) + (z[32] << 256) + (z[33] << 0x108) + (z[34] << 0x110) + (z[35] << 0x118) + (z[36] << 0x120) + (z[37] << 0x128) + (z[38] << 0x130) + (z[39] << 0x138) + (z[40] << 0x140) + (z[41] << 0x148) + (z[42] << 0x150) + (z[43] << 0x158) + (z[44] << 0x160) + (z[45] << 0x168) + (z[46] << 0x170) + (z[47] << 0x178) */ -/* twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) in */ -/* if x1 & (2^384-1) < 2^383 then x1 & (2^384-1) else (x1 & (2^384-1)) - 2^384 */ - -#include -typedef unsigned char fiat_p47441_uint1; -typedef signed char fiat_p47441_int1; -#if defined(__GNUC__) || defined(__clang__) -# define FIAT_P47441_FIAT_EXTENSION __extension__ -# define FIAT_P47441_FIAT_INLINE __inline__ -#else -# define FIAT_P47441_FIAT_EXTENSION -# define FIAT_P47441_FIAT_INLINE -#endif - -FIAT_P47441_FIAT_EXTENSION typedef signed __int128 fiat_p47441_int128; -FIAT_P47441_FIAT_EXTENSION typedef unsigned __int128 fiat_p47441_uint128; - -/* The type fiat_p47441_montgomery_domain_field_element is a field element in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p47441_montgomery_domain_field_element[6]; - -/* The type fiat_p47441_non_montgomery_domain_field_element is a field element NOT in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p47441_non_montgomery_domain_field_element[6]; - -#if (-1 & 3) != 3 -#error "This code only works on a two's complement system" -#endif - - -/* - * The function fiat_p47441_addcarryx_u64 is an addition with carry. - * - * Postconditions: - * out1 = (arg1 + arg2 + arg3) mod 2^64 - * out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -void fiat_p47441_addcarryx_u64(uint64_t* out1, fiat_p47441_uint1* out2, fiat_p47441_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p47441_uint128 x1; - uint64_t x2; - fiat_p47441_uint1 x3; - x1 = ((arg1 + (fiat_p47441_uint128)arg2) + arg3); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (fiat_p47441_uint1)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p47441_subborrowx_u64 is a subtraction with borrow. - * - * Postconditions: - * out1 = (-arg1 + arg2 + -arg3) mod 2^64 - * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -void fiat_p47441_subborrowx_u64(uint64_t* out1, fiat_p47441_uint1* out2, fiat_p47441_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p47441_int128 x1; - fiat_p47441_int1 x2; - uint64_t x3; - x1 = ((arg2 - (fiat_p47441_int128)arg1) - arg3); - x2 = (fiat_p47441_int1)(x1 >> 64); - x3 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - *out1 = x3; - *out2 = (fiat_p47441_uint1)(0x0 - x2); -} - -/* - * The function fiat_p47441_mulx_u64 is a multiplication, returning the full double-width result. - * - * Postconditions: - * out1 = (arg1 * arg2) mod 2^64 - * out2 = ⌊arg1 * arg2 / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0xffffffffffffffff] - * arg2: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p47441_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) { - fiat_p47441_uint128 x1; - uint64_t x2; - uint64_t x3; - x1 = ((fiat_p47441_uint128)arg1 * arg2); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (uint64_t)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p47441_cmovznz_u64 is a single-word conditional move. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p47441_cmovznz_u64(uint64_t* out1, fiat_p47441_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p47441_uint1 x1; - uint64_t x2; - uint64_t x3; - x1 = (!(!arg1)); - x2 = ((fiat_p47441_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff)); - x3 = ((x2 & arg3) | ((~x2) & arg2)); - *out1 = x3; -} - -/* - * The function fiat_p47441_mul multiplies two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_mul(fiat_p47441_montgomery_domain_field_element out1, const fiat_p47441_montgomery_domain_field_element arg1, const fiat_p47441_montgomery_domain_field_element arg2) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - fiat_p47441_uint1 x20; - uint64_t x21; - fiat_p47441_uint1 x22; - uint64_t x23; - fiat_p47441_uint1 x24; - uint64_t x25; - fiat_p47441_uint1 x26; - uint64_t x27; - fiat_p47441_uint1 x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - uint64_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - fiat_p47441_uint1 x43; - uint64_t x44; - fiat_p47441_uint1 x45; - uint64_t x46; - fiat_p47441_uint1 x47; - uint64_t x48; - fiat_p47441_uint1 x49; - uint64_t x50; - fiat_p47441_uint1 x51; - uint64_t x52; - uint64_t x53; - fiat_p47441_uint1 x54; - uint64_t x55; - fiat_p47441_uint1 x56; - uint64_t x57; - fiat_p47441_uint1 x58; - uint64_t x59; - fiat_p47441_uint1 x60; - uint64_t x61; - fiat_p47441_uint1 x62; - uint64_t x63; - fiat_p47441_uint1 x64; - uint64_t x65; - fiat_p47441_uint1 x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - uint64_t x79; - fiat_p47441_uint1 x80; - uint64_t x81; - fiat_p47441_uint1 x82; - uint64_t x83; - fiat_p47441_uint1 x84; - uint64_t x85; - fiat_p47441_uint1 x86; - uint64_t x87; - fiat_p47441_uint1 x88; - uint64_t x89; - uint64_t x90; - fiat_p47441_uint1 x91; - uint64_t x92; - fiat_p47441_uint1 x93; - uint64_t x94; - fiat_p47441_uint1 x95; - uint64_t x96; - fiat_p47441_uint1 x97; - uint64_t x98; - fiat_p47441_uint1 x99; - uint64_t x100; - fiat_p47441_uint1 x101; - uint64_t x102; - fiat_p47441_uint1 x103; - uint64_t x104; - uint64_t x105; - uint64_t x106; - uint64_t x107; - uint64_t x108; - uint64_t x109; - uint64_t x110; - uint64_t x111; - uint64_t x112; - uint64_t x113; - uint64_t x114; - uint64_t x115; - uint64_t x116; - fiat_p47441_uint1 x117; - uint64_t x118; - fiat_p47441_uint1 x119; - uint64_t x120; - fiat_p47441_uint1 x121; - uint64_t x122; - fiat_p47441_uint1 x123; - uint64_t x124; - fiat_p47441_uint1 x125; - uint64_t x126; - uint64_t x127; - fiat_p47441_uint1 x128; - uint64_t x129; - fiat_p47441_uint1 x130; - uint64_t x131; - fiat_p47441_uint1 x132; - uint64_t x133; - fiat_p47441_uint1 x134; - uint64_t x135; - fiat_p47441_uint1 x136; - uint64_t x137; - fiat_p47441_uint1 x138; - uint64_t x139; - fiat_p47441_uint1 x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - uint64_t x144; - uint64_t x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - fiat_p47441_uint1 x155; - uint64_t x156; - fiat_p47441_uint1 x157; - uint64_t x158; - fiat_p47441_uint1 x159; - uint64_t x160; - fiat_p47441_uint1 x161; - uint64_t x162; - fiat_p47441_uint1 x163; - uint64_t x164; - uint64_t x165; - fiat_p47441_uint1 x166; - uint64_t x167; - fiat_p47441_uint1 x168; - uint64_t x169; - fiat_p47441_uint1 x170; - uint64_t x171; - fiat_p47441_uint1 x172; - uint64_t x173; - fiat_p47441_uint1 x174; - uint64_t x175; - fiat_p47441_uint1 x176; - uint64_t x177; - fiat_p47441_uint1 x178; - uint64_t x179; - uint64_t x180; - uint64_t x181; - uint64_t x182; - uint64_t x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - uint64_t x191; - fiat_p47441_uint1 x192; - uint64_t x193; - fiat_p47441_uint1 x194; - uint64_t x195; - fiat_p47441_uint1 x196; - uint64_t x197; - fiat_p47441_uint1 x198; - uint64_t x199; - fiat_p47441_uint1 x200; - uint64_t x201; - uint64_t x202; - fiat_p47441_uint1 x203; - uint64_t x204; - fiat_p47441_uint1 x205; - uint64_t x206; - fiat_p47441_uint1 x207; - uint64_t x208; - fiat_p47441_uint1 x209; - uint64_t x210; - fiat_p47441_uint1 x211; - uint64_t x212; - fiat_p47441_uint1 x213; - uint64_t x214; - fiat_p47441_uint1 x215; - uint64_t x216; - uint64_t x217; - uint64_t x218; - uint64_t x219; - uint64_t x220; - uint64_t x221; - uint64_t x222; - uint64_t x223; - uint64_t x224; - uint64_t x225; - uint64_t x226; - uint64_t x227; - uint64_t x228; - uint64_t x229; - fiat_p47441_uint1 x230; - uint64_t x231; - fiat_p47441_uint1 x232; - uint64_t x233; - fiat_p47441_uint1 x234; - uint64_t x235; - fiat_p47441_uint1 x236; - uint64_t x237; - fiat_p47441_uint1 x238; - uint64_t x239; - uint64_t x240; - fiat_p47441_uint1 x241; - uint64_t x242; - fiat_p47441_uint1 x243; - uint64_t x244; - fiat_p47441_uint1 x245; - uint64_t x246; - fiat_p47441_uint1 x247; - uint64_t x248; - fiat_p47441_uint1 x249; - uint64_t x250; - fiat_p47441_uint1 x251; - uint64_t x252; - fiat_p47441_uint1 x253; - uint64_t x254; - uint64_t x255; - uint64_t x256; - uint64_t x257; - uint64_t x258; - uint64_t x259; - uint64_t x260; - uint64_t x261; - uint64_t x262; - uint64_t x263; - uint64_t x264; - uint64_t x265; - uint64_t x266; - fiat_p47441_uint1 x267; - uint64_t x268; - fiat_p47441_uint1 x269; - uint64_t x270; - fiat_p47441_uint1 x271; - uint64_t x272; - fiat_p47441_uint1 x273; - uint64_t x274; - fiat_p47441_uint1 x275; - uint64_t x276; - uint64_t x277; - fiat_p47441_uint1 x278; - uint64_t x279; - fiat_p47441_uint1 x280; - uint64_t x281; - fiat_p47441_uint1 x282; - uint64_t x283; - fiat_p47441_uint1 x284; - uint64_t x285; - fiat_p47441_uint1 x286; - uint64_t x287; - fiat_p47441_uint1 x288; - uint64_t x289; - fiat_p47441_uint1 x290; - uint64_t x291; - uint64_t x292; - uint64_t x293; - uint64_t x294; - uint64_t x295; - uint64_t x296; - uint64_t x297; - uint64_t x298; - uint64_t x299; - uint64_t x300; - uint64_t x301; - uint64_t x302; - uint64_t x303; - uint64_t x304; - fiat_p47441_uint1 x305; - uint64_t x306; - fiat_p47441_uint1 x307; - uint64_t x308; - fiat_p47441_uint1 x309; - uint64_t x310; - fiat_p47441_uint1 x311; - uint64_t x312; - fiat_p47441_uint1 x313; - uint64_t x314; - uint64_t x315; - fiat_p47441_uint1 x316; - uint64_t x317; - fiat_p47441_uint1 x318; - uint64_t x319; - fiat_p47441_uint1 x320; - uint64_t x321; - fiat_p47441_uint1 x322; - uint64_t x323; - fiat_p47441_uint1 x324; - uint64_t x325; - fiat_p47441_uint1 x326; - uint64_t x327; - fiat_p47441_uint1 x328; - uint64_t x329; - uint64_t x330; - uint64_t x331; - uint64_t x332; - uint64_t x333; - uint64_t x334; - uint64_t x335; - uint64_t x336; - uint64_t x337; - uint64_t x338; - uint64_t x339; - uint64_t x340; - uint64_t x341; - fiat_p47441_uint1 x342; - uint64_t x343; - fiat_p47441_uint1 x344; - uint64_t x345; - fiat_p47441_uint1 x346; - uint64_t x347; - fiat_p47441_uint1 x348; - uint64_t x349; - fiat_p47441_uint1 x350; - uint64_t x351; - uint64_t x352; - fiat_p47441_uint1 x353; - uint64_t x354; - fiat_p47441_uint1 x355; - uint64_t x356; - fiat_p47441_uint1 x357; - uint64_t x358; - fiat_p47441_uint1 x359; - uint64_t x360; - fiat_p47441_uint1 x361; - uint64_t x362; - fiat_p47441_uint1 x363; - uint64_t x364; - fiat_p47441_uint1 x365; - uint64_t x366; - uint64_t x367; - uint64_t x368; - uint64_t x369; - uint64_t x370; - uint64_t x371; - uint64_t x372; - uint64_t x373; - uint64_t x374; - uint64_t x375; - uint64_t x376; - uint64_t x377; - uint64_t x378; - uint64_t x379; - fiat_p47441_uint1 x380; - uint64_t x381; - fiat_p47441_uint1 x382; - uint64_t x383; - fiat_p47441_uint1 x384; - uint64_t x385; - fiat_p47441_uint1 x386; - uint64_t x387; - fiat_p47441_uint1 x388; - uint64_t x389; - uint64_t x390; - fiat_p47441_uint1 x391; - uint64_t x392; - fiat_p47441_uint1 x393; - uint64_t x394; - fiat_p47441_uint1 x395; - uint64_t x396; - fiat_p47441_uint1 x397; - uint64_t x398; - fiat_p47441_uint1 x399; - uint64_t x400; - fiat_p47441_uint1 x401; - uint64_t x402; - fiat_p47441_uint1 x403; - uint64_t x404; - uint64_t x405; - uint64_t x406; - uint64_t x407; - uint64_t x408; - uint64_t x409; - uint64_t x410; - uint64_t x411; - uint64_t x412; - uint64_t x413; - uint64_t x414; - uint64_t x415; - uint64_t x416; - fiat_p47441_uint1 x417; - uint64_t x418; - fiat_p47441_uint1 x419; - uint64_t x420; - fiat_p47441_uint1 x421; - uint64_t x422; - fiat_p47441_uint1 x423; - uint64_t x424; - fiat_p47441_uint1 x425; - uint64_t x426; - uint64_t x427; - fiat_p47441_uint1 x428; - uint64_t x429; - fiat_p47441_uint1 x430; - uint64_t x431; - fiat_p47441_uint1 x432; - uint64_t x433; - fiat_p47441_uint1 x434; - uint64_t x435; - fiat_p47441_uint1 x436; - uint64_t x437; - fiat_p47441_uint1 x438; - uint64_t x439; - fiat_p47441_uint1 x440; - uint64_t x441; - uint64_t x442; - fiat_p47441_uint1 x443; - uint64_t x444; - fiat_p47441_uint1 x445; - uint64_t x446; - fiat_p47441_uint1 x447; - uint64_t x448; - fiat_p47441_uint1 x449; - uint64_t x450; - fiat_p47441_uint1 x451; - uint64_t x452; - fiat_p47441_uint1 x453; - uint64_t x454; - fiat_p47441_uint1 x455; - uint64_t x456; - uint64_t x457; - uint64_t x458; - uint64_t x459; - uint64_t x460; - uint64_t x461; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[4]); - x5 = (arg1[5]); - x6 = (arg1[0]); - fiat_p47441_mulx_u64(&x7, &x8, x6, (arg2[5])); - fiat_p47441_mulx_u64(&x9, &x10, x6, (arg2[4])); - fiat_p47441_mulx_u64(&x11, &x12, x6, (arg2[3])); - fiat_p47441_mulx_u64(&x13, &x14, x6, (arg2[2])); - fiat_p47441_mulx_u64(&x15, &x16, x6, (arg2[1])); - fiat_p47441_mulx_u64(&x17, &x18, x6, (arg2[0])); - fiat_p47441_addcarryx_u64(&x19, &x20, 0x0, x18, x15); - fiat_p47441_addcarryx_u64(&x21, &x22, x20, x16, x13); - fiat_p47441_addcarryx_u64(&x23, &x24, x22, x14, x11); - fiat_p47441_addcarryx_u64(&x25, &x26, x24, x12, x9); - fiat_p47441_addcarryx_u64(&x27, &x28, x26, x10, x7); - x29 = (x28 + x8); - fiat_p47441_mulx_u64(&x30, &x31, x17, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x32, &x33, x17, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x34, &x35, x17, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x36, &x37, x17, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x38, &x39, x17, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x40, &x41, x17, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x42, &x43, 0x0, x41, x38); - fiat_p47441_addcarryx_u64(&x44, &x45, x43, x39, x36); - fiat_p47441_addcarryx_u64(&x46, &x47, x45, x37, x34); - fiat_p47441_addcarryx_u64(&x48, &x49, x47, x35, x32); - fiat_p47441_addcarryx_u64(&x50, &x51, x49, x33, x30); - x52 = (x51 + x31); - fiat_p47441_addcarryx_u64(&x53, &x54, 0x0, x17, x40); - fiat_p47441_addcarryx_u64(&x55, &x56, x54, x19, x42); - fiat_p47441_addcarryx_u64(&x57, &x58, x56, x21, x44); - fiat_p47441_addcarryx_u64(&x59, &x60, x58, x23, x46); - fiat_p47441_addcarryx_u64(&x61, &x62, x60, x25, x48); - fiat_p47441_addcarryx_u64(&x63, &x64, x62, x27, x50); - fiat_p47441_addcarryx_u64(&x65, &x66, x64, x29, x52); - fiat_p47441_mulx_u64(&x67, &x68, x1, (arg2[5])); - fiat_p47441_mulx_u64(&x69, &x70, x1, (arg2[4])); - fiat_p47441_mulx_u64(&x71, &x72, x1, (arg2[3])); - fiat_p47441_mulx_u64(&x73, &x74, x1, (arg2[2])); - fiat_p47441_mulx_u64(&x75, &x76, x1, (arg2[1])); - fiat_p47441_mulx_u64(&x77, &x78, x1, (arg2[0])); - fiat_p47441_addcarryx_u64(&x79, &x80, 0x0, x78, x75); - fiat_p47441_addcarryx_u64(&x81, &x82, x80, x76, x73); - fiat_p47441_addcarryx_u64(&x83, &x84, x82, x74, x71); - fiat_p47441_addcarryx_u64(&x85, &x86, x84, x72, x69); - fiat_p47441_addcarryx_u64(&x87, &x88, x86, x70, x67); - x89 = (x88 + x68); - fiat_p47441_addcarryx_u64(&x90, &x91, 0x0, x55, x77); - fiat_p47441_addcarryx_u64(&x92, &x93, x91, x57, x79); - fiat_p47441_addcarryx_u64(&x94, &x95, x93, x59, x81); - fiat_p47441_addcarryx_u64(&x96, &x97, x95, x61, x83); - fiat_p47441_addcarryx_u64(&x98, &x99, x97, x63, x85); - fiat_p47441_addcarryx_u64(&x100, &x101, x99, x65, x87); - fiat_p47441_addcarryx_u64(&x102, &x103, x101, x66, x89); - fiat_p47441_mulx_u64(&x104, &x105, x90, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x106, &x107, x90, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x108, &x109, x90, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x110, &x111, x90, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x112, &x113, x90, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x114, &x115, x90, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x116, &x117, 0x0, x115, x112); - fiat_p47441_addcarryx_u64(&x118, &x119, x117, x113, x110); - fiat_p47441_addcarryx_u64(&x120, &x121, x119, x111, x108); - fiat_p47441_addcarryx_u64(&x122, &x123, x121, x109, x106); - fiat_p47441_addcarryx_u64(&x124, &x125, x123, x107, x104); - x126 = (x125 + x105); - fiat_p47441_addcarryx_u64(&x127, &x128, 0x0, x90, x114); - fiat_p47441_addcarryx_u64(&x129, &x130, x128, x92, x116); - fiat_p47441_addcarryx_u64(&x131, &x132, x130, x94, x118); - fiat_p47441_addcarryx_u64(&x133, &x134, x132, x96, x120); - fiat_p47441_addcarryx_u64(&x135, &x136, x134, x98, x122); - fiat_p47441_addcarryx_u64(&x137, &x138, x136, x100, x124); - fiat_p47441_addcarryx_u64(&x139, &x140, x138, x102, x126); - x141 = ((uint64_t)x140 + x103); - fiat_p47441_mulx_u64(&x142, &x143, x2, (arg2[5])); - fiat_p47441_mulx_u64(&x144, &x145, x2, (arg2[4])); - fiat_p47441_mulx_u64(&x146, &x147, x2, (arg2[3])); - fiat_p47441_mulx_u64(&x148, &x149, x2, (arg2[2])); - fiat_p47441_mulx_u64(&x150, &x151, x2, (arg2[1])); - fiat_p47441_mulx_u64(&x152, &x153, x2, (arg2[0])); - fiat_p47441_addcarryx_u64(&x154, &x155, 0x0, x153, x150); - fiat_p47441_addcarryx_u64(&x156, &x157, x155, x151, x148); - fiat_p47441_addcarryx_u64(&x158, &x159, x157, x149, x146); - fiat_p47441_addcarryx_u64(&x160, &x161, x159, x147, x144); - fiat_p47441_addcarryx_u64(&x162, &x163, x161, x145, x142); - x164 = (x163 + x143); - fiat_p47441_addcarryx_u64(&x165, &x166, 0x0, x129, x152); - fiat_p47441_addcarryx_u64(&x167, &x168, x166, x131, x154); - fiat_p47441_addcarryx_u64(&x169, &x170, x168, x133, x156); - fiat_p47441_addcarryx_u64(&x171, &x172, x170, x135, x158); - fiat_p47441_addcarryx_u64(&x173, &x174, x172, x137, x160); - fiat_p47441_addcarryx_u64(&x175, &x176, x174, x139, x162); - fiat_p47441_addcarryx_u64(&x177, &x178, x176, x141, x164); - fiat_p47441_mulx_u64(&x179, &x180, x165, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x181, &x182, x165, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x183, &x184, x165, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x185, &x186, x165, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x187, &x188, x165, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x189, &x190, x165, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x191, &x192, 0x0, x190, x187); - fiat_p47441_addcarryx_u64(&x193, &x194, x192, x188, x185); - fiat_p47441_addcarryx_u64(&x195, &x196, x194, x186, x183); - fiat_p47441_addcarryx_u64(&x197, &x198, x196, x184, x181); - fiat_p47441_addcarryx_u64(&x199, &x200, x198, x182, x179); - x201 = (x200 + x180); - fiat_p47441_addcarryx_u64(&x202, &x203, 0x0, x165, x189); - fiat_p47441_addcarryx_u64(&x204, &x205, x203, x167, x191); - fiat_p47441_addcarryx_u64(&x206, &x207, x205, x169, x193); - fiat_p47441_addcarryx_u64(&x208, &x209, x207, x171, x195); - fiat_p47441_addcarryx_u64(&x210, &x211, x209, x173, x197); - fiat_p47441_addcarryx_u64(&x212, &x213, x211, x175, x199); - fiat_p47441_addcarryx_u64(&x214, &x215, x213, x177, x201); - x216 = ((uint64_t)x215 + x178); - fiat_p47441_mulx_u64(&x217, &x218, x3, (arg2[5])); - fiat_p47441_mulx_u64(&x219, &x220, x3, (arg2[4])); - fiat_p47441_mulx_u64(&x221, &x222, x3, (arg2[3])); - fiat_p47441_mulx_u64(&x223, &x224, x3, (arg2[2])); - fiat_p47441_mulx_u64(&x225, &x226, x3, (arg2[1])); - fiat_p47441_mulx_u64(&x227, &x228, x3, (arg2[0])); - fiat_p47441_addcarryx_u64(&x229, &x230, 0x0, x228, x225); - fiat_p47441_addcarryx_u64(&x231, &x232, x230, x226, x223); - fiat_p47441_addcarryx_u64(&x233, &x234, x232, x224, x221); - fiat_p47441_addcarryx_u64(&x235, &x236, x234, x222, x219); - fiat_p47441_addcarryx_u64(&x237, &x238, x236, x220, x217); - x239 = (x238 + x218); - fiat_p47441_addcarryx_u64(&x240, &x241, 0x0, x204, x227); - fiat_p47441_addcarryx_u64(&x242, &x243, x241, x206, x229); - fiat_p47441_addcarryx_u64(&x244, &x245, x243, x208, x231); - fiat_p47441_addcarryx_u64(&x246, &x247, x245, x210, x233); - fiat_p47441_addcarryx_u64(&x248, &x249, x247, x212, x235); - fiat_p47441_addcarryx_u64(&x250, &x251, x249, x214, x237); - fiat_p47441_addcarryx_u64(&x252, &x253, x251, x216, x239); - fiat_p47441_mulx_u64(&x254, &x255, x240, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x256, &x257, x240, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x258, &x259, x240, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x260, &x261, x240, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x262, &x263, x240, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x264, &x265, x240, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x266, &x267, 0x0, x265, x262); - fiat_p47441_addcarryx_u64(&x268, &x269, x267, x263, x260); - fiat_p47441_addcarryx_u64(&x270, &x271, x269, x261, x258); - fiat_p47441_addcarryx_u64(&x272, &x273, x271, x259, x256); - fiat_p47441_addcarryx_u64(&x274, &x275, x273, x257, x254); - x276 = (x275 + x255); - fiat_p47441_addcarryx_u64(&x277, &x278, 0x0, x240, x264); - fiat_p47441_addcarryx_u64(&x279, &x280, x278, x242, x266); - fiat_p47441_addcarryx_u64(&x281, &x282, x280, x244, x268); - fiat_p47441_addcarryx_u64(&x283, &x284, x282, x246, x270); - fiat_p47441_addcarryx_u64(&x285, &x286, x284, x248, x272); - fiat_p47441_addcarryx_u64(&x287, &x288, x286, x250, x274); - fiat_p47441_addcarryx_u64(&x289, &x290, x288, x252, x276); - x291 = ((uint64_t)x290 + x253); - fiat_p47441_mulx_u64(&x292, &x293, x4, (arg2[5])); - fiat_p47441_mulx_u64(&x294, &x295, x4, (arg2[4])); - fiat_p47441_mulx_u64(&x296, &x297, x4, (arg2[3])); - fiat_p47441_mulx_u64(&x298, &x299, x4, (arg2[2])); - fiat_p47441_mulx_u64(&x300, &x301, x4, (arg2[1])); - fiat_p47441_mulx_u64(&x302, &x303, x4, (arg2[0])); - fiat_p47441_addcarryx_u64(&x304, &x305, 0x0, x303, x300); - fiat_p47441_addcarryx_u64(&x306, &x307, x305, x301, x298); - fiat_p47441_addcarryx_u64(&x308, &x309, x307, x299, x296); - fiat_p47441_addcarryx_u64(&x310, &x311, x309, x297, x294); - fiat_p47441_addcarryx_u64(&x312, &x313, x311, x295, x292); - x314 = (x313 + x293); - fiat_p47441_addcarryx_u64(&x315, &x316, 0x0, x279, x302); - fiat_p47441_addcarryx_u64(&x317, &x318, x316, x281, x304); - fiat_p47441_addcarryx_u64(&x319, &x320, x318, x283, x306); - fiat_p47441_addcarryx_u64(&x321, &x322, x320, x285, x308); - fiat_p47441_addcarryx_u64(&x323, &x324, x322, x287, x310); - fiat_p47441_addcarryx_u64(&x325, &x326, x324, x289, x312); - fiat_p47441_addcarryx_u64(&x327, &x328, x326, x291, x314); - fiat_p47441_mulx_u64(&x329, &x330, x315, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x331, &x332, x315, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x333, &x334, x315, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x335, &x336, x315, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x337, &x338, x315, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x339, &x340, x315, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x341, &x342, 0x0, x340, x337); - fiat_p47441_addcarryx_u64(&x343, &x344, x342, x338, x335); - fiat_p47441_addcarryx_u64(&x345, &x346, x344, x336, x333); - fiat_p47441_addcarryx_u64(&x347, &x348, x346, x334, x331); - fiat_p47441_addcarryx_u64(&x349, &x350, x348, x332, x329); - x351 = (x350 + x330); - fiat_p47441_addcarryx_u64(&x352, &x353, 0x0, x315, x339); - fiat_p47441_addcarryx_u64(&x354, &x355, x353, x317, x341); - fiat_p47441_addcarryx_u64(&x356, &x357, x355, x319, x343); - fiat_p47441_addcarryx_u64(&x358, &x359, x357, x321, x345); - fiat_p47441_addcarryx_u64(&x360, &x361, x359, x323, x347); - fiat_p47441_addcarryx_u64(&x362, &x363, x361, x325, x349); - fiat_p47441_addcarryx_u64(&x364, &x365, x363, x327, x351); - x366 = ((uint64_t)x365 + x328); - fiat_p47441_mulx_u64(&x367, &x368, x5, (arg2[5])); - fiat_p47441_mulx_u64(&x369, &x370, x5, (arg2[4])); - fiat_p47441_mulx_u64(&x371, &x372, x5, (arg2[3])); - fiat_p47441_mulx_u64(&x373, &x374, x5, (arg2[2])); - fiat_p47441_mulx_u64(&x375, &x376, x5, (arg2[1])); - fiat_p47441_mulx_u64(&x377, &x378, x5, (arg2[0])); - fiat_p47441_addcarryx_u64(&x379, &x380, 0x0, x378, x375); - fiat_p47441_addcarryx_u64(&x381, &x382, x380, x376, x373); - fiat_p47441_addcarryx_u64(&x383, &x384, x382, x374, x371); - fiat_p47441_addcarryx_u64(&x385, &x386, x384, x372, x369); - fiat_p47441_addcarryx_u64(&x387, &x388, x386, x370, x367); - x389 = (x388 + x368); - fiat_p47441_addcarryx_u64(&x390, &x391, 0x0, x354, x377); - fiat_p47441_addcarryx_u64(&x392, &x393, x391, x356, x379); - fiat_p47441_addcarryx_u64(&x394, &x395, x393, x358, x381); - fiat_p47441_addcarryx_u64(&x396, &x397, x395, x360, x383); - fiat_p47441_addcarryx_u64(&x398, &x399, x397, x362, x385); - fiat_p47441_addcarryx_u64(&x400, &x401, x399, x364, x387); - fiat_p47441_addcarryx_u64(&x402, &x403, x401, x366, x389); - fiat_p47441_mulx_u64(&x404, &x405, x390, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x406, &x407, x390, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x408, &x409, x390, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x410, &x411, x390, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x412, &x413, x390, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x414, &x415, x390, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x416, &x417, 0x0, x415, x412); - fiat_p47441_addcarryx_u64(&x418, &x419, x417, x413, x410); - fiat_p47441_addcarryx_u64(&x420, &x421, x419, x411, x408); - fiat_p47441_addcarryx_u64(&x422, &x423, x421, x409, x406); - fiat_p47441_addcarryx_u64(&x424, &x425, x423, x407, x404); - x426 = (x425 + x405); - fiat_p47441_addcarryx_u64(&x427, &x428, 0x0, x390, x414); - fiat_p47441_addcarryx_u64(&x429, &x430, x428, x392, x416); - fiat_p47441_addcarryx_u64(&x431, &x432, x430, x394, x418); - fiat_p47441_addcarryx_u64(&x433, &x434, x432, x396, x420); - fiat_p47441_addcarryx_u64(&x435, &x436, x434, x398, x422); - fiat_p47441_addcarryx_u64(&x437, &x438, x436, x400, x424); - fiat_p47441_addcarryx_u64(&x439, &x440, x438, x402, x426); - x441 = ((uint64_t)x440 + x403); - fiat_p47441_subborrowx_u64(&x442, &x443, 0x0, x429, UINT64_C(0xffffffffffffffff)); - fiat_p47441_subborrowx_u64(&x444, &x445, x443, x431, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_subborrowx_u64(&x446, &x447, x445, x433, UINT64_C(0xc722f669356ea468)); - fiat_p47441_subborrowx_u64(&x448, &x449, x447, x435, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_subborrowx_u64(&x450, &x451, x449, x437, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_subborrowx_u64(&x452, &x453, x451, x439, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_subborrowx_u64(&x454, &x455, x453, x441, 0x0); - fiat_p47441_cmovznz_u64(&x456, x455, x442, x429); - fiat_p47441_cmovznz_u64(&x457, x455, x444, x431); - fiat_p47441_cmovznz_u64(&x458, x455, x446, x433); - fiat_p47441_cmovznz_u64(&x459, x455, x448, x435); - fiat_p47441_cmovznz_u64(&x460, x455, x450, x437); - fiat_p47441_cmovznz_u64(&x461, x455, x452, x439); - out1[0] = x456; - out1[1] = x457; - out1[2] = x458; - out1[3] = x459; - out1[4] = x460; - out1[5] = x461; -} - -/* - * The function fiat_p47441_square squares a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_square(fiat_p47441_montgomery_domain_field_element out1, const fiat_p47441_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - fiat_p47441_uint1 x20; - uint64_t x21; - fiat_p47441_uint1 x22; - uint64_t x23; - fiat_p47441_uint1 x24; - uint64_t x25; - fiat_p47441_uint1 x26; - uint64_t x27; - fiat_p47441_uint1 x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - uint64_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - fiat_p47441_uint1 x43; - uint64_t x44; - fiat_p47441_uint1 x45; - uint64_t x46; - fiat_p47441_uint1 x47; - uint64_t x48; - fiat_p47441_uint1 x49; - uint64_t x50; - fiat_p47441_uint1 x51; - uint64_t x52; - uint64_t x53; - fiat_p47441_uint1 x54; - uint64_t x55; - fiat_p47441_uint1 x56; - uint64_t x57; - fiat_p47441_uint1 x58; - uint64_t x59; - fiat_p47441_uint1 x60; - uint64_t x61; - fiat_p47441_uint1 x62; - uint64_t x63; - fiat_p47441_uint1 x64; - uint64_t x65; - fiat_p47441_uint1 x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - uint64_t x79; - fiat_p47441_uint1 x80; - uint64_t x81; - fiat_p47441_uint1 x82; - uint64_t x83; - fiat_p47441_uint1 x84; - uint64_t x85; - fiat_p47441_uint1 x86; - uint64_t x87; - fiat_p47441_uint1 x88; - uint64_t x89; - uint64_t x90; - fiat_p47441_uint1 x91; - uint64_t x92; - fiat_p47441_uint1 x93; - uint64_t x94; - fiat_p47441_uint1 x95; - uint64_t x96; - fiat_p47441_uint1 x97; - uint64_t x98; - fiat_p47441_uint1 x99; - uint64_t x100; - fiat_p47441_uint1 x101; - uint64_t x102; - fiat_p47441_uint1 x103; - uint64_t x104; - uint64_t x105; - uint64_t x106; - uint64_t x107; - uint64_t x108; - uint64_t x109; - uint64_t x110; - uint64_t x111; - uint64_t x112; - uint64_t x113; - uint64_t x114; - uint64_t x115; - uint64_t x116; - fiat_p47441_uint1 x117; - uint64_t x118; - fiat_p47441_uint1 x119; - uint64_t x120; - fiat_p47441_uint1 x121; - uint64_t x122; - fiat_p47441_uint1 x123; - uint64_t x124; - fiat_p47441_uint1 x125; - uint64_t x126; - uint64_t x127; - fiat_p47441_uint1 x128; - uint64_t x129; - fiat_p47441_uint1 x130; - uint64_t x131; - fiat_p47441_uint1 x132; - uint64_t x133; - fiat_p47441_uint1 x134; - uint64_t x135; - fiat_p47441_uint1 x136; - uint64_t x137; - fiat_p47441_uint1 x138; - uint64_t x139; - fiat_p47441_uint1 x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - uint64_t x144; - uint64_t x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - fiat_p47441_uint1 x155; - uint64_t x156; - fiat_p47441_uint1 x157; - uint64_t x158; - fiat_p47441_uint1 x159; - uint64_t x160; - fiat_p47441_uint1 x161; - uint64_t x162; - fiat_p47441_uint1 x163; - uint64_t x164; - uint64_t x165; - fiat_p47441_uint1 x166; - uint64_t x167; - fiat_p47441_uint1 x168; - uint64_t x169; - fiat_p47441_uint1 x170; - uint64_t x171; - fiat_p47441_uint1 x172; - uint64_t x173; - fiat_p47441_uint1 x174; - uint64_t x175; - fiat_p47441_uint1 x176; - uint64_t x177; - fiat_p47441_uint1 x178; - uint64_t x179; - uint64_t x180; - uint64_t x181; - uint64_t x182; - uint64_t x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - uint64_t x191; - fiat_p47441_uint1 x192; - uint64_t x193; - fiat_p47441_uint1 x194; - uint64_t x195; - fiat_p47441_uint1 x196; - uint64_t x197; - fiat_p47441_uint1 x198; - uint64_t x199; - fiat_p47441_uint1 x200; - uint64_t x201; - uint64_t x202; - fiat_p47441_uint1 x203; - uint64_t x204; - fiat_p47441_uint1 x205; - uint64_t x206; - fiat_p47441_uint1 x207; - uint64_t x208; - fiat_p47441_uint1 x209; - uint64_t x210; - fiat_p47441_uint1 x211; - uint64_t x212; - fiat_p47441_uint1 x213; - uint64_t x214; - fiat_p47441_uint1 x215; - uint64_t x216; - uint64_t x217; - uint64_t x218; - uint64_t x219; - uint64_t x220; - uint64_t x221; - uint64_t x222; - uint64_t x223; - uint64_t x224; - uint64_t x225; - uint64_t x226; - uint64_t x227; - uint64_t x228; - uint64_t x229; - fiat_p47441_uint1 x230; - uint64_t x231; - fiat_p47441_uint1 x232; - uint64_t x233; - fiat_p47441_uint1 x234; - uint64_t x235; - fiat_p47441_uint1 x236; - uint64_t x237; - fiat_p47441_uint1 x238; - uint64_t x239; - uint64_t x240; - fiat_p47441_uint1 x241; - uint64_t x242; - fiat_p47441_uint1 x243; - uint64_t x244; - fiat_p47441_uint1 x245; - uint64_t x246; - fiat_p47441_uint1 x247; - uint64_t x248; - fiat_p47441_uint1 x249; - uint64_t x250; - fiat_p47441_uint1 x251; - uint64_t x252; - fiat_p47441_uint1 x253; - uint64_t x254; - uint64_t x255; - uint64_t x256; - uint64_t x257; - uint64_t x258; - uint64_t x259; - uint64_t x260; - uint64_t x261; - uint64_t x262; - uint64_t x263; - uint64_t x264; - uint64_t x265; - uint64_t x266; - fiat_p47441_uint1 x267; - uint64_t x268; - fiat_p47441_uint1 x269; - uint64_t x270; - fiat_p47441_uint1 x271; - uint64_t x272; - fiat_p47441_uint1 x273; - uint64_t x274; - fiat_p47441_uint1 x275; - uint64_t x276; - uint64_t x277; - fiat_p47441_uint1 x278; - uint64_t x279; - fiat_p47441_uint1 x280; - uint64_t x281; - fiat_p47441_uint1 x282; - uint64_t x283; - fiat_p47441_uint1 x284; - uint64_t x285; - fiat_p47441_uint1 x286; - uint64_t x287; - fiat_p47441_uint1 x288; - uint64_t x289; - fiat_p47441_uint1 x290; - uint64_t x291; - uint64_t x292; - uint64_t x293; - uint64_t x294; - uint64_t x295; - uint64_t x296; - uint64_t x297; - uint64_t x298; - uint64_t x299; - uint64_t x300; - uint64_t x301; - uint64_t x302; - uint64_t x303; - uint64_t x304; - fiat_p47441_uint1 x305; - uint64_t x306; - fiat_p47441_uint1 x307; - uint64_t x308; - fiat_p47441_uint1 x309; - uint64_t x310; - fiat_p47441_uint1 x311; - uint64_t x312; - fiat_p47441_uint1 x313; - uint64_t x314; - uint64_t x315; - fiat_p47441_uint1 x316; - uint64_t x317; - fiat_p47441_uint1 x318; - uint64_t x319; - fiat_p47441_uint1 x320; - uint64_t x321; - fiat_p47441_uint1 x322; - uint64_t x323; - fiat_p47441_uint1 x324; - uint64_t x325; - fiat_p47441_uint1 x326; - uint64_t x327; - fiat_p47441_uint1 x328; - uint64_t x329; - uint64_t x330; - uint64_t x331; - uint64_t x332; - uint64_t x333; - uint64_t x334; - uint64_t x335; - uint64_t x336; - uint64_t x337; - uint64_t x338; - uint64_t x339; - uint64_t x340; - uint64_t x341; - fiat_p47441_uint1 x342; - uint64_t x343; - fiat_p47441_uint1 x344; - uint64_t x345; - fiat_p47441_uint1 x346; - uint64_t x347; - fiat_p47441_uint1 x348; - uint64_t x349; - fiat_p47441_uint1 x350; - uint64_t x351; - uint64_t x352; - fiat_p47441_uint1 x353; - uint64_t x354; - fiat_p47441_uint1 x355; - uint64_t x356; - fiat_p47441_uint1 x357; - uint64_t x358; - fiat_p47441_uint1 x359; - uint64_t x360; - fiat_p47441_uint1 x361; - uint64_t x362; - fiat_p47441_uint1 x363; - uint64_t x364; - fiat_p47441_uint1 x365; - uint64_t x366; - uint64_t x367; - uint64_t x368; - uint64_t x369; - uint64_t x370; - uint64_t x371; - uint64_t x372; - uint64_t x373; - uint64_t x374; - uint64_t x375; - uint64_t x376; - uint64_t x377; - uint64_t x378; - uint64_t x379; - fiat_p47441_uint1 x380; - uint64_t x381; - fiat_p47441_uint1 x382; - uint64_t x383; - fiat_p47441_uint1 x384; - uint64_t x385; - fiat_p47441_uint1 x386; - uint64_t x387; - fiat_p47441_uint1 x388; - uint64_t x389; - uint64_t x390; - fiat_p47441_uint1 x391; - uint64_t x392; - fiat_p47441_uint1 x393; - uint64_t x394; - fiat_p47441_uint1 x395; - uint64_t x396; - fiat_p47441_uint1 x397; - uint64_t x398; - fiat_p47441_uint1 x399; - uint64_t x400; - fiat_p47441_uint1 x401; - uint64_t x402; - fiat_p47441_uint1 x403; - uint64_t x404; - uint64_t x405; - uint64_t x406; - uint64_t x407; - uint64_t x408; - uint64_t x409; - uint64_t x410; - uint64_t x411; - uint64_t x412; - uint64_t x413; - uint64_t x414; - uint64_t x415; - uint64_t x416; - fiat_p47441_uint1 x417; - uint64_t x418; - fiat_p47441_uint1 x419; - uint64_t x420; - fiat_p47441_uint1 x421; - uint64_t x422; - fiat_p47441_uint1 x423; - uint64_t x424; - fiat_p47441_uint1 x425; - uint64_t x426; - uint64_t x427; - fiat_p47441_uint1 x428; - uint64_t x429; - fiat_p47441_uint1 x430; - uint64_t x431; - fiat_p47441_uint1 x432; - uint64_t x433; - fiat_p47441_uint1 x434; - uint64_t x435; - fiat_p47441_uint1 x436; - uint64_t x437; - fiat_p47441_uint1 x438; - uint64_t x439; - fiat_p47441_uint1 x440; - uint64_t x441; - uint64_t x442; - fiat_p47441_uint1 x443; - uint64_t x444; - fiat_p47441_uint1 x445; - uint64_t x446; - fiat_p47441_uint1 x447; - uint64_t x448; - fiat_p47441_uint1 x449; - uint64_t x450; - fiat_p47441_uint1 x451; - uint64_t x452; - fiat_p47441_uint1 x453; - uint64_t x454; - fiat_p47441_uint1 x455; - uint64_t x456; - uint64_t x457; - uint64_t x458; - uint64_t x459; - uint64_t x460; - uint64_t x461; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[4]); - x5 = (arg1[5]); - x6 = (arg1[0]); - fiat_p47441_mulx_u64(&x7, &x8, x6, (arg1[5])); - fiat_p47441_mulx_u64(&x9, &x10, x6, (arg1[4])); - fiat_p47441_mulx_u64(&x11, &x12, x6, (arg1[3])); - fiat_p47441_mulx_u64(&x13, &x14, x6, (arg1[2])); - fiat_p47441_mulx_u64(&x15, &x16, x6, (arg1[1])); - fiat_p47441_mulx_u64(&x17, &x18, x6, (arg1[0])); - fiat_p47441_addcarryx_u64(&x19, &x20, 0x0, x18, x15); - fiat_p47441_addcarryx_u64(&x21, &x22, x20, x16, x13); - fiat_p47441_addcarryx_u64(&x23, &x24, x22, x14, x11); - fiat_p47441_addcarryx_u64(&x25, &x26, x24, x12, x9); - fiat_p47441_addcarryx_u64(&x27, &x28, x26, x10, x7); - x29 = (x28 + x8); - fiat_p47441_mulx_u64(&x30, &x31, x17, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x32, &x33, x17, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x34, &x35, x17, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x36, &x37, x17, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x38, &x39, x17, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x40, &x41, x17, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x42, &x43, 0x0, x41, x38); - fiat_p47441_addcarryx_u64(&x44, &x45, x43, x39, x36); - fiat_p47441_addcarryx_u64(&x46, &x47, x45, x37, x34); - fiat_p47441_addcarryx_u64(&x48, &x49, x47, x35, x32); - fiat_p47441_addcarryx_u64(&x50, &x51, x49, x33, x30); - x52 = (x51 + x31); - fiat_p47441_addcarryx_u64(&x53, &x54, 0x0, x17, x40); - fiat_p47441_addcarryx_u64(&x55, &x56, x54, x19, x42); - fiat_p47441_addcarryx_u64(&x57, &x58, x56, x21, x44); - fiat_p47441_addcarryx_u64(&x59, &x60, x58, x23, x46); - fiat_p47441_addcarryx_u64(&x61, &x62, x60, x25, x48); - fiat_p47441_addcarryx_u64(&x63, &x64, x62, x27, x50); - fiat_p47441_addcarryx_u64(&x65, &x66, x64, x29, x52); - fiat_p47441_mulx_u64(&x67, &x68, x1, (arg1[5])); - fiat_p47441_mulx_u64(&x69, &x70, x1, (arg1[4])); - fiat_p47441_mulx_u64(&x71, &x72, x1, (arg1[3])); - fiat_p47441_mulx_u64(&x73, &x74, x1, (arg1[2])); - fiat_p47441_mulx_u64(&x75, &x76, x1, (arg1[1])); - fiat_p47441_mulx_u64(&x77, &x78, x1, (arg1[0])); - fiat_p47441_addcarryx_u64(&x79, &x80, 0x0, x78, x75); - fiat_p47441_addcarryx_u64(&x81, &x82, x80, x76, x73); - fiat_p47441_addcarryx_u64(&x83, &x84, x82, x74, x71); - fiat_p47441_addcarryx_u64(&x85, &x86, x84, x72, x69); - fiat_p47441_addcarryx_u64(&x87, &x88, x86, x70, x67); - x89 = (x88 + x68); - fiat_p47441_addcarryx_u64(&x90, &x91, 0x0, x55, x77); - fiat_p47441_addcarryx_u64(&x92, &x93, x91, x57, x79); - fiat_p47441_addcarryx_u64(&x94, &x95, x93, x59, x81); - fiat_p47441_addcarryx_u64(&x96, &x97, x95, x61, x83); - fiat_p47441_addcarryx_u64(&x98, &x99, x97, x63, x85); - fiat_p47441_addcarryx_u64(&x100, &x101, x99, x65, x87); - fiat_p47441_addcarryx_u64(&x102, &x103, x101, x66, x89); - fiat_p47441_mulx_u64(&x104, &x105, x90, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x106, &x107, x90, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x108, &x109, x90, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x110, &x111, x90, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x112, &x113, x90, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x114, &x115, x90, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x116, &x117, 0x0, x115, x112); - fiat_p47441_addcarryx_u64(&x118, &x119, x117, x113, x110); - fiat_p47441_addcarryx_u64(&x120, &x121, x119, x111, x108); - fiat_p47441_addcarryx_u64(&x122, &x123, x121, x109, x106); - fiat_p47441_addcarryx_u64(&x124, &x125, x123, x107, x104); - x126 = (x125 + x105); - fiat_p47441_addcarryx_u64(&x127, &x128, 0x0, x90, x114); - fiat_p47441_addcarryx_u64(&x129, &x130, x128, x92, x116); - fiat_p47441_addcarryx_u64(&x131, &x132, x130, x94, x118); - fiat_p47441_addcarryx_u64(&x133, &x134, x132, x96, x120); - fiat_p47441_addcarryx_u64(&x135, &x136, x134, x98, x122); - fiat_p47441_addcarryx_u64(&x137, &x138, x136, x100, x124); - fiat_p47441_addcarryx_u64(&x139, &x140, x138, x102, x126); - x141 = ((uint64_t)x140 + x103); - fiat_p47441_mulx_u64(&x142, &x143, x2, (arg1[5])); - fiat_p47441_mulx_u64(&x144, &x145, x2, (arg1[4])); - fiat_p47441_mulx_u64(&x146, &x147, x2, (arg1[3])); - fiat_p47441_mulx_u64(&x148, &x149, x2, (arg1[2])); - fiat_p47441_mulx_u64(&x150, &x151, x2, (arg1[1])); - fiat_p47441_mulx_u64(&x152, &x153, x2, (arg1[0])); - fiat_p47441_addcarryx_u64(&x154, &x155, 0x0, x153, x150); - fiat_p47441_addcarryx_u64(&x156, &x157, x155, x151, x148); - fiat_p47441_addcarryx_u64(&x158, &x159, x157, x149, x146); - fiat_p47441_addcarryx_u64(&x160, &x161, x159, x147, x144); - fiat_p47441_addcarryx_u64(&x162, &x163, x161, x145, x142); - x164 = (x163 + x143); - fiat_p47441_addcarryx_u64(&x165, &x166, 0x0, x129, x152); - fiat_p47441_addcarryx_u64(&x167, &x168, x166, x131, x154); - fiat_p47441_addcarryx_u64(&x169, &x170, x168, x133, x156); - fiat_p47441_addcarryx_u64(&x171, &x172, x170, x135, x158); - fiat_p47441_addcarryx_u64(&x173, &x174, x172, x137, x160); - fiat_p47441_addcarryx_u64(&x175, &x176, x174, x139, x162); - fiat_p47441_addcarryx_u64(&x177, &x178, x176, x141, x164); - fiat_p47441_mulx_u64(&x179, &x180, x165, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x181, &x182, x165, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x183, &x184, x165, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x185, &x186, x165, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x187, &x188, x165, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x189, &x190, x165, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x191, &x192, 0x0, x190, x187); - fiat_p47441_addcarryx_u64(&x193, &x194, x192, x188, x185); - fiat_p47441_addcarryx_u64(&x195, &x196, x194, x186, x183); - fiat_p47441_addcarryx_u64(&x197, &x198, x196, x184, x181); - fiat_p47441_addcarryx_u64(&x199, &x200, x198, x182, x179); - x201 = (x200 + x180); - fiat_p47441_addcarryx_u64(&x202, &x203, 0x0, x165, x189); - fiat_p47441_addcarryx_u64(&x204, &x205, x203, x167, x191); - fiat_p47441_addcarryx_u64(&x206, &x207, x205, x169, x193); - fiat_p47441_addcarryx_u64(&x208, &x209, x207, x171, x195); - fiat_p47441_addcarryx_u64(&x210, &x211, x209, x173, x197); - fiat_p47441_addcarryx_u64(&x212, &x213, x211, x175, x199); - fiat_p47441_addcarryx_u64(&x214, &x215, x213, x177, x201); - x216 = ((uint64_t)x215 + x178); - fiat_p47441_mulx_u64(&x217, &x218, x3, (arg1[5])); - fiat_p47441_mulx_u64(&x219, &x220, x3, (arg1[4])); - fiat_p47441_mulx_u64(&x221, &x222, x3, (arg1[3])); - fiat_p47441_mulx_u64(&x223, &x224, x3, (arg1[2])); - fiat_p47441_mulx_u64(&x225, &x226, x3, (arg1[1])); - fiat_p47441_mulx_u64(&x227, &x228, x3, (arg1[0])); - fiat_p47441_addcarryx_u64(&x229, &x230, 0x0, x228, x225); - fiat_p47441_addcarryx_u64(&x231, &x232, x230, x226, x223); - fiat_p47441_addcarryx_u64(&x233, &x234, x232, x224, x221); - fiat_p47441_addcarryx_u64(&x235, &x236, x234, x222, x219); - fiat_p47441_addcarryx_u64(&x237, &x238, x236, x220, x217); - x239 = (x238 + x218); - fiat_p47441_addcarryx_u64(&x240, &x241, 0x0, x204, x227); - fiat_p47441_addcarryx_u64(&x242, &x243, x241, x206, x229); - fiat_p47441_addcarryx_u64(&x244, &x245, x243, x208, x231); - fiat_p47441_addcarryx_u64(&x246, &x247, x245, x210, x233); - fiat_p47441_addcarryx_u64(&x248, &x249, x247, x212, x235); - fiat_p47441_addcarryx_u64(&x250, &x251, x249, x214, x237); - fiat_p47441_addcarryx_u64(&x252, &x253, x251, x216, x239); - fiat_p47441_mulx_u64(&x254, &x255, x240, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x256, &x257, x240, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x258, &x259, x240, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x260, &x261, x240, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x262, &x263, x240, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x264, &x265, x240, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x266, &x267, 0x0, x265, x262); - fiat_p47441_addcarryx_u64(&x268, &x269, x267, x263, x260); - fiat_p47441_addcarryx_u64(&x270, &x271, x269, x261, x258); - fiat_p47441_addcarryx_u64(&x272, &x273, x271, x259, x256); - fiat_p47441_addcarryx_u64(&x274, &x275, x273, x257, x254); - x276 = (x275 + x255); - fiat_p47441_addcarryx_u64(&x277, &x278, 0x0, x240, x264); - fiat_p47441_addcarryx_u64(&x279, &x280, x278, x242, x266); - fiat_p47441_addcarryx_u64(&x281, &x282, x280, x244, x268); - fiat_p47441_addcarryx_u64(&x283, &x284, x282, x246, x270); - fiat_p47441_addcarryx_u64(&x285, &x286, x284, x248, x272); - fiat_p47441_addcarryx_u64(&x287, &x288, x286, x250, x274); - fiat_p47441_addcarryx_u64(&x289, &x290, x288, x252, x276); - x291 = ((uint64_t)x290 + x253); - fiat_p47441_mulx_u64(&x292, &x293, x4, (arg1[5])); - fiat_p47441_mulx_u64(&x294, &x295, x4, (arg1[4])); - fiat_p47441_mulx_u64(&x296, &x297, x4, (arg1[3])); - fiat_p47441_mulx_u64(&x298, &x299, x4, (arg1[2])); - fiat_p47441_mulx_u64(&x300, &x301, x4, (arg1[1])); - fiat_p47441_mulx_u64(&x302, &x303, x4, (arg1[0])); - fiat_p47441_addcarryx_u64(&x304, &x305, 0x0, x303, x300); - fiat_p47441_addcarryx_u64(&x306, &x307, x305, x301, x298); - fiat_p47441_addcarryx_u64(&x308, &x309, x307, x299, x296); - fiat_p47441_addcarryx_u64(&x310, &x311, x309, x297, x294); - fiat_p47441_addcarryx_u64(&x312, &x313, x311, x295, x292); - x314 = (x313 + x293); - fiat_p47441_addcarryx_u64(&x315, &x316, 0x0, x279, x302); - fiat_p47441_addcarryx_u64(&x317, &x318, x316, x281, x304); - fiat_p47441_addcarryx_u64(&x319, &x320, x318, x283, x306); - fiat_p47441_addcarryx_u64(&x321, &x322, x320, x285, x308); - fiat_p47441_addcarryx_u64(&x323, &x324, x322, x287, x310); - fiat_p47441_addcarryx_u64(&x325, &x326, x324, x289, x312); - fiat_p47441_addcarryx_u64(&x327, &x328, x326, x291, x314); - fiat_p47441_mulx_u64(&x329, &x330, x315, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x331, &x332, x315, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x333, &x334, x315, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x335, &x336, x315, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x337, &x338, x315, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x339, &x340, x315, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x341, &x342, 0x0, x340, x337); - fiat_p47441_addcarryx_u64(&x343, &x344, x342, x338, x335); - fiat_p47441_addcarryx_u64(&x345, &x346, x344, x336, x333); - fiat_p47441_addcarryx_u64(&x347, &x348, x346, x334, x331); - fiat_p47441_addcarryx_u64(&x349, &x350, x348, x332, x329); - x351 = (x350 + x330); - fiat_p47441_addcarryx_u64(&x352, &x353, 0x0, x315, x339); - fiat_p47441_addcarryx_u64(&x354, &x355, x353, x317, x341); - fiat_p47441_addcarryx_u64(&x356, &x357, x355, x319, x343); - fiat_p47441_addcarryx_u64(&x358, &x359, x357, x321, x345); - fiat_p47441_addcarryx_u64(&x360, &x361, x359, x323, x347); - fiat_p47441_addcarryx_u64(&x362, &x363, x361, x325, x349); - fiat_p47441_addcarryx_u64(&x364, &x365, x363, x327, x351); - x366 = ((uint64_t)x365 + x328); - fiat_p47441_mulx_u64(&x367, &x368, x5, (arg1[5])); - fiat_p47441_mulx_u64(&x369, &x370, x5, (arg1[4])); - fiat_p47441_mulx_u64(&x371, &x372, x5, (arg1[3])); - fiat_p47441_mulx_u64(&x373, &x374, x5, (arg1[2])); - fiat_p47441_mulx_u64(&x375, &x376, x5, (arg1[1])); - fiat_p47441_mulx_u64(&x377, &x378, x5, (arg1[0])); - fiat_p47441_addcarryx_u64(&x379, &x380, 0x0, x378, x375); - fiat_p47441_addcarryx_u64(&x381, &x382, x380, x376, x373); - fiat_p47441_addcarryx_u64(&x383, &x384, x382, x374, x371); - fiat_p47441_addcarryx_u64(&x385, &x386, x384, x372, x369); - fiat_p47441_addcarryx_u64(&x387, &x388, x386, x370, x367); - x389 = (x388 + x368); - fiat_p47441_addcarryx_u64(&x390, &x391, 0x0, x354, x377); - fiat_p47441_addcarryx_u64(&x392, &x393, x391, x356, x379); - fiat_p47441_addcarryx_u64(&x394, &x395, x393, x358, x381); - fiat_p47441_addcarryx_u64(&x396, &x397, x395, x360, x383); - fiat_p47441_addcarryx_u64(&x398, &x399, x397, x362, x385); - fiat_p47441_addcarryx_u64(&x400, &x401, x399, x364, x387); - fiat_p47441_addcarryx_u64(&x402, &x403, x401, x366, x389); - fiat_p47441_mulx_u64(&x404, &x405, x390, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x406, &x407, x390, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x408, &x409, x390, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x410, &x411, x390, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x412, &x413, x390, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x414, &x415, x390, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x416, &x417, 0x0, x415, x412); - fiat_p47441_addcarryx_u64(&x418, &x419, x417, x413, x410); - fiat_p47441_addcarryx_u64(&x420, &x421, x419, x411, x408); - fiat_p47441_addcarryx_u64(&x422, &x423, x421, x409, x406); - fiat_p47441_addcarryx_u64(&x424, &x425, x423, x407, x404); - x426 = (x425 + x405); - fiat_p47441_addcarryx_u64(&x427, &x428, 0x0, x390, x414); - fiat_p47441_addcarryx_u64(&x429, &x430, x428, x392, x416); - fiat_p47441_addcarryx_u64(&x431, &x432, x430, x394, x418); - fiat_p47441_addcarryx_u64(&x433, &x434, x432, x396, x420); - fiat_p47441_addcarryx_u64(&x435, &x436, x434, x398, x422); - fiat_p47441_addcarryx_u64(&x437, &x438, x436, x400, x424); - fiat_p47441_addcarryx_u64(&x439, &x440, x438, x402, x426); - x441 = ((uint64_t)x440 + x403); - fiat_p47441_subborrowx_u64(&x442, &x443, 0x0, x429, UINT64_C(0xffffffffffffffff)); - fiat_p47441_subborrowx_u64(&x444, &x445, x443, x431, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_subborrowx_u64(&x446, &x447, x445, x433, UINT64_C(0xc722f669356ea468)); - fiat_p47441_subborrowx_u64(&x448, &x449, x447, x435, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_subborrowx_u64(&x450, &x451, x449, x437, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_subborrowx_u64(&x452, &x453, x451, x439, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_subborrowx_u64(&x454, &x455, x453, x441, 0x0); - fiat_p47441_cmovznz_u64(&x456, x455, x442, x429); - fiat_p47441_cmovznz_u64(&x457, x455, x444, x431); - fiat_p47441_cmovznz_u64(&x458, x455, x446, x433); - fiat_p47441_cmovznz_u64(&x459, x455, x448, x435); - fiat_p47441_cmovznz_u64(&x460, x455, x450, x437); - fiat_p47441_cmovznz_u64(&x461, x455, x452, x439); - out1[0] = x456; - out1[1] = x457; - out1[2] = x458; - out1[3] = x459; - out1[4] = x460; - out1[5] = x461; -} - -/* - * The function fiat_p47441_add adds two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_add(fiat_p47441_montgomery_domain_field_element out1, const fiat_p47441_montgomery_domain_field_element arg1, const fiat_p47441_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p47441_uint1 x2; - uint64_t x3; - fiat_p47441_uint1 x4; - uint64_t x5; - fiat_p47441_uint1 x6; - uint64_t x7; - fiat_p47441_uint1 x8; - uint64_t x9; - fiat_p47441_uint1 x10; - uint64_t x11; - fiat_p47441_uint1 x12; - uint64_t x13; - fiat_p47441_uint1 x14; - uint64_t x15; - fiat_p47441_uint1 x16; - uint64_t x17; - fiat_p47441_uint1 x18; - uint64_t x19; - fiat_p47441_uint1 x20; - uint64_t x21; - fiat_p47441_uint1 x22; - uint64_t x23; - fiat_p47441_uint1 x24; - uint64_t x25; - fiat_p47441_uint1 x26; - uint64_t x27; - uint64_t x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - uint64_t x32; - fiat_p47441_addcarryx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p47441_addcarryx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p47441_addcarryx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p47441_addcarryx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p47441_addcarryx_u64(&x9, &x10, x8, (arg1[4]), (arg2[4])); - fiat_p47441_addcarryx_u64(&x11, &x12, x10, (arg1[5]), (arg2[5])); - fiat_p47441_subborrowx_u64(&x13, &x14, 0x0, x1, UINT64_C(0xffffffffffffffff)); - fiat_p47441_subborrowx_u64(&x15, &x16, x14, x3, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_subborrowx_u64(&x17, &x18, x16, x5, UINT64_C(0xc722f669356ea468)); - fiat_p47441_subborrowx_u64(&x19, &x20, x18, x7, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_subborrowx_u64(&x21, &x22, x20, x9, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_subborrowx_u64(&x23, &x24, x22, x11, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_subborrowx_u64(&x25, &x26, x24, x12, 0x0); - fiat_p47441_cmovznz_u64(&x27, x26, x13, x1); - fiat_p47441_cmovznz_u64(&x28, x26, x15, x3); - fiat_p47441_cmovznz_u64(&x29, x26, x17, x5); - fiat_p47441_cmovznz_u64(&x30, x26, x19, x7); - fiat_p47441_cmovznz_u64(&x31, x26, x21, x9); - fiat_p47441_cmovznz_u64(&x32, x26, x23, x11); - out1[0] = x27; - out1[1] = x28; - out1[2] = x29; - out1[3] = x30; - out1[4] = x31; - out1[5] = x32; -} - -/* - * The function fiat_p47441_sub subtracts two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_sub(fiat_p47441_montgomery_domain_field_element out1, const fiat_p47441_montgomery_domain_field_element arg1, const fiat_p47441_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p47441_uint1 x2; - uint64_t x3; - fiat_p47441_uint1 x4; - uint64_t x5; - fiat_p47441_uint1 x6; - uint64_t x7; - fiat_p47441_uint1 x8; - uint64_t x9; - fiat_p47441_uint1 x10; - uint64_t x11; - fiat_p47441_uint1 x12; - uint64_t x13; - uint64_t x14; - fiat_p47441_uint1 x15; - uint64_t x16; - fiat_p47441_uint1 x17; - uint64_t x18; - fiat_p47441_uint1 x19; - uint64_t x20; - fiat_p47441_uint1 x21; - uint64_t x22; - fiat_p47441_uint1 x23; - uint64_t x24; - fiat_p47441_uint1 x25; - fiat_p47441_subborrowx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p47441_subborrowx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p47441_subborrowx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p47441_subborrowx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p47441_subborrowx_u64(&x9, &x10, x8, (arg1[4]), (arg2[4])); - fiat_p47441_subborrowx_u64(&x11, &x12, x10, (arg1[5]), (arg2[5])); - fiat_p47441_cmovznz_u64(&x13, x12, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x14, &x15, 0x0, x1, x13); - fiat_p47441_addcarryx_u64(&x16, &x17, x15, x3, (x13 & UINT64_C(0x4c6174c1ffffffff))); - fiat_p47441_addcarryx_u64(&x18, &x19, x17, x5, (x13 & UINT64_C(0xc722f669356ea468))); - fiat_p47441_addcarryx_u64(&x20, &x21, x19, x7, (x13 & UINT64_C(0x65bc2e0a90aeb751))); - fiat_p47441_addcarryx_u64(&x22, &x23, x21, x9, (x13 & UINT64_C(0xc6ae604a45d10ad6))); - fiat_p47441_addcarryx_u64(&x24, &x25, x23, x11, (x13 & UINT64_C(0x3df6eeeab0871a2))); - out1[0] = x14; - out1[1] = x16; - out1[2] = x18; - out1[3] = x20; - out1[4] = x22; - out1[5] = x24; -} - -/* - * The function fiat_p47441_opp negates a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = -eval (from_montgomery arg1) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_opp(fiat_p47441_montgomery_domain_field_element out1, const fiat_p47441_montgomery_domain_field_element arg1) { - uint64_t x1; - fiat_p47441_uint1 x2; - uint64_t x3; - fiat_p47441_uint1 x4; - uint64_t x5; - fiat_p47441_uint1 x6; - uint64_t x7; - fiat_p47441_uint1 x8; - uint64_t x9; - fiat_p47441_uint1 x10; - uint64_t x11; - fiat_p47441_uint1 x12; - uint64_t x13; - uint64_t x14; - fiat_p47441_uint1 x15; - uint64_t x16; - fiat_p47441_uint1 x17; - uint64_t x18; - fiat_p47441_uint1 x19; - uint64_t x20; - fiat_p47441_uint1 x21; - uint64_t x22; - fiat_p47441_uint1 x23; - uint64_t x24; - fiat_p47441_uint1 x25; - fiat_p47441_subborrowx_u64(&x1, &x2, 0x0, 0x0, (arg1[0])); - fiat_p47441_subborrowx_u64(&x3, &x4, x2, 0x0, (arg1[1])); - fiat_p47441_subborrowx_u64(&x5, &x6, x4, 0x0, (arg1[2])); - fiat_p47441_subborrowx_u64(&x7, &x8, x6, 0x0, (arg1[3])); - fiat_p47441_subborrowx_u64(&x9, &x10, x8, 0x0, (arg1[4])); - fiat_p47441_subborrowx_u64(&x11, &x12, x10, 0x0, (arg1[5])); - fiat_p47441_cmovznz_u64(&x13, x12, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x14, &x15, 0x0, x1, x13); - fiat_p47441_addcarryx_u64(&x16, &x17, x15, x3, (x13 & UINT64_C(0x4c6174c1ffffffff))); - fiat_p47441_addcarryx_u64(&x18, &x19, x17, x5, (x13 & UINT64_C(0xc722f669356ea468))); - fiat_p47441_addcarryx_u64(&x20, &x21, x19, x7, (x13 & UINT64_C(0x65bc2e0a90aeb751))); - fiat_p47441_addcarryx_u64(&x22, &x23, x21, x9, (x13 & UINT64_C(0xc6ae604a45d10ad6))); - fiat_p47441_addcarryx_u64(&x24, &x25, x23, x11, (x13 & UINT64_C(0x3df6eeeab0871a2))); - out1[0] = x14; - out1[1] = x16; - out1[2] = x18; - out1[3] = x20; - out1[4] = x22; - out1[5] = x24; -} - -/* - * The function fiat_p47441_from_montgomery translates a field element out of the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^6) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_from_montgomery(fiat_p47441_non_montgomery_domain_field_element out1, const fiat_p47441_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - fiat_p47441_uint1 x15; - uint64_t x16; - fiat_p47441_uint1 x17; - uint64_t x18; - fiat_p47441_uint1 x19; - uint64_t x20; - fiat_p47441_uint1 x21; - uint64_t x22; - fiat_p47441_uint1 x23; - uint64_t x24; - fiat_p47441_uint1 x25; - uint64_t x26; - fiat_p47441_uint1 x27; - uint64_t x28; - fiat_p47441_uint1 x29; - uint64_t x30; - fiat_p47441_uint1 x31; - uint64_t x32; - fiat_p47441_uint1 x33; - uint64_t x34; - fiat_p47441_uint1 x35; - uint64_t x36; - fiat_p47441_uint1 x37; - uint64_t x38; - fiat_p47441_uint1 x39; - uint64_t x40; - fiat_p47441_uint1 x41; - uint64_t x42; - fiat_p47441_uint1 x43; - uint64_t x44; - fiat_p47441_uint1 x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint64_t x55; - uint64_t x56; - uint64_t x57; - uint64_t x58; - fiat_p47441_uint1 x59; - uint64_t x60; - fiat_p47441_uint1 x61; - uint64_t x62; - fiat_p47441_uint1 x63; - uint64_t x64; - fiat_p47441_uint1 x65; - uint64_t x66; - fiat_p47441_uint1 x67; - uint64_t x68; - fiat_p47441_uint1 x69; - uint64_t x70; - fiat_p47441_uint1 x71; - uint64_t x72; - fiat_p47441_uint1 x73; - uint64_t x74; - fiat_p47441_uint1 x75; - uint64_t x76; - fiat_p47441_uint1 x77; - uint64_t x78; - fiat_p47441_uint1 x79; - uint64_t x80; - fiat_p47441_uint1 x81; - uint64_t x82; - fiat_p47441_uint1 x83; - uint64_t x84; - fiat_p47441_uint1 x85; - uint64_t x86; - fiat_p47441_uint1 x87; - uint64_t x88; - fiat_p47441_uint1 x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - fiat_p47441_uint1 x103; - uint64_t x104; - fiat_p47441_uint1 x105; - uint64_t x106; - fiat_p47441_uint1 x107; - uint64_t x108; - fiat_p47441_uint1 x109; - uint64_t x110; - fiat_p47441_uint1 x111; - uint64_t x112; - fiat_p47441_uint1 x113; - uint64_t x114; - fiat_p47441_uint1 x115; - uint64_t x116; - fiat_p47441_uint1 x117; - uint64_t x118; - fiat_p47441_uint1 x119; - uint64_t x120; - fiat_p47441_uint1 x121; - uint64_t x122; - fiat_p47441_uint1 x123; - uint64_t x124; - fiat_p47441_uint1 x125; - uint64_t x126; - fiat_p47441_uint1 x127; - uint64_t x128; - fiat_p47441_uint1 x129; - uint64_t x130; - fiat_p47441_uint1 x131; - uint64_t x132; - fiat_p47441_uint1 x133; - uint64_t x134; - uint64_t x135; - uint64_t x136; - uint64_t x137; - uint64_t x138; - uint64_t x139; - uint64_t x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - uint64_t x144; - uint64_t x145; - uint64_t x146; - fiat_p47441_uint1 x147; - uint64_t x148; - fiat_p47441_uint1 x149; - uint64_t x150; - fiat_p47441_uint1 x151; - uint64_t x152; - fiat_p47441_uint1 x153; - uint64_t x154; - fiat_p47441_uint1 x155; - uint64_t x156; - fiat_p47441_uint1 x157; - uint64_t x158; - fiat_p47441_uint1 x159; - uint64_t x160; - fiat_p47441_uint1 x161; - uint64_t x162; - fiat_p47441_uint1 x163; - uint64_t x164; - fiat_p47441_uint1 x165; - uint64_t x166; - fiat_p47441_uint1 x167; - uint64_t x168; - fiat_p47441_uint1 x169; - uint64_t x170; - fiat_p47441_uint1 x171; - uint64_t x172; - fiat_p47441_uint1 x173; - uint64_t x174; - fiat_p47441_uint1 x175; - uint64_t x176; - fiat_p47441_uint1 x177; - uint64_t x178; - uint64_t x179; - uint64_t x180; - uint64_t x181; - uint64_t x182; - uint64_t x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - fiat_p47441_uint1 x191; - uint64_t x192; - fiat_p47441_uint1 x193; - uint64_t x194; - fiat_p47441_uint1 x195; - uint64_t x196; - fiat_p47441_uint1 x197; - uint64_t x198; - fiat_p47441_uint1 x199; - uint64_t x200; - fiat_p47441_uint1 x201; - uint64_t x202; - fiat_p47441_uint1 x203; - uint64_t x204; - fiat_p47441_uint1 x205; - uint64_t x206; - fiat_p47441_uint1 x207; - uint64_t x208; - fiat_p47441_uint1 x209; - uint64_t x210; - fiat_p47441_uint1 x211; - uint64_t x212; - fiat_p47441_uint1 x213; - uint64_t x214; - fiat_p47441_uint1 x215; - uint64_t x216; - fiat_p47441_uint1 x217; - uint64_t x218; - fiat_p47441_uint1 x219; - uint64_t x220; - fiat_p47441_uint1 x221; - uint64_t x222; - uint64_t x223; - uint64_t x224; - uint64_t x225; - uint64_t x226; - uint64_t x227; - uint64_t x228; - uint64_t x229; - uint64_t x230; - uint64_t x231; - uint64_t x232; - uint64_t x233; - uint64_t x234; - fiat_p47441_uint1 x235; - uint64_t x236; - fiat_p47441_uint1 x237; - uint64_t x238; - fiat_p47441_uint1 x239; - uint64_t x240; - fiat_p47441_uint1 x241; - uint64_t x242; - fiat_p47441_uint1 x243; - uint64_t x244; - fiat_p47441_uint1 x245; - uint64_t x246; - fiat_p47441_uint1 x247; - uint64_t x248; - fiat_p47441_uint1 x249; - uint64_t x250; - fiat_p47441_uint1 x251; - uint64_t x252; - fiat_p47441_uint1 x253; - uint64_t x254; - fiat_p47441_uint1 x255; - uint64_t x256; - uint64_t x257; - fiat_p47441_uint1 x258; - uint64_t x259; - fiat_p47441_uint1 x260; - uint64_t x261; - fiat_p47441_uint1 x262; - uint64_t x263; - fiat_p47441_uint1 x264; - uint64_t x265; - fiat_p47441_uint1 x266; - uint64_t x267; - fiat_p47441_uint1 x268; - uint64_t x269; - fiat_p47441_uint1 x270; - uint64_t x271; - uint64_t x272; - uint64_t x273; - uint64_t x274; - uint64_t x275; - uint64_t x276; - x1 = (arg1[0]); - fiat_p47441_mulx_u64(&x2, &x3, x1, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x4, &x5, x1, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x6, &x7, x1, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x8, &x9, x1, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x10, &x11, x1, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x12, &x13, x1, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x14, &x15, 0x0, x13, x10); - fiat_p47441_addcarryx_u64(&x16, &x17, x15, x11, x8); - fiat_p47441_addcarryx_u64(&x18, &x19, x17, x9, x6); - fiat_p47441_addcarryx_u64(&x20, &x21, x19, x7, x4); - fiat_p47441_addcarryx_u64(&x22, &x23, x21, x5, x2); - fiat_p47441_addcarryx_u64(&x24, &x25, 0x0, x1, x12); - fiat_p47441_addcarryx_u64(&x26, &x27, x25, 0x0, x14); - fiat_p47441_addcarryx_u64(&x28, &x29, x27, 0x0, x16); - fiat_p47441_addcarryx_u64(&x30, &x31, x29, 0x0, x18); - fiat_p47441_addcarryx_u64(&x32, &x33, x31, 0x0, x20); - fiat_p47441_addcarryx_u64(&x34, &x35, x33, 0x0, x22); - fiat_p47441_addcarryx_u64(&x36, &x37, 0x0, x26, (arg1[1])); - fiat_p47441_addcarryx_u64(&x38, &x39, x37, x28, 0x0); - fiat_p47441_addcarryx_u64(&x40, &x41, x39, x30, 0x0); - fiat_p47441_addcarryx_u64(&x42, &x43, x41, x32, 0x0); - fiat_p47441_addcarryx_u64(&x44, &x45, x43, x34, 0x0); - fiat_p47441_mulx_u64(&x46, &x47, x36, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x48, &x49, x36, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x50, &x51, x36, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x52, &x53, x36, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x54, &x55, x36, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x56, &x57, x36, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x58, &x59, 0x0, x57, x54); - fiat_p47441_addcarryx_u64(&x60, &x61, x59, x55, x52); - fiat_p47441_addcarryx_u64(&x62, &x63, x61, x53, x50); - fiat_p47441_addcarryx_u64(&x64, &x65, x63, x51, x48); - fiat_p47441_addcarryx_u64(&x66, &x67, x65, x49, x46); - fiat_p47441_addcarryx_u64(&x68, &x69, 0x0, x36, x56); - fiat_p47441_addcarryx_u64(&x70, &x71, x69, x38, x58); - fiat_p47441_addcarryx_u64(&x72, &x73, x71, x40, x60); - fiat_p47441_addcarryx_u64(&x74, &x75, x73, x42, x62); - fiat_p47441_addcarryx_u64(&x76, &x77, x75, x44, x64); - fiat_p47441_addcarryx_u64(&x78, &x79, x77, (x45 + (x35 + (x23 + x3))), x66); - fiat_p47441_addcarryx_u64(&x80, &x81, 0x0, x70, (arg1[2])); - fiat_p47441_addcarryx_u64(&x82, &x83, x81, x72, 0x0); - fiat_p47441_addcarryx_u64(&x84, &x85, x83, x74, 0x0); - fiat_p47441_addcarryx_u64(&x86, &x87, x85, x76, 0x0); - fiat_p47441_addcarryx_u64(&x88, &x89, x87, x78, 0x0); - fiat_p47441_mulx_u64(&x90, &x91, x80, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x92, &x93, x80, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x94, &x95, x80, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x96, &x97, x80, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x98, &x99, x80, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x100, &x101, x80, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x102, &x103, 0x0, x101, x98); - fiat_p47441_addcarryx_u64(&x104, &x105, x103, x99, x96); - fiat_p47441_addcarryx_u64(&x106, &x107, x105, x97, x94); - fiat_p47441_addcarryx_u64(&x108, &x109, x107, x95, x92); - fiat_p47441_addcarryx_u64(&x110, &x111, x109, x93, x90); - fiat_p47441_addcarryx_u64(&x112, &x113, 0x0, x80, x100); - fiat_p47441_addcarryx_u64(&x114, &x115, x113, x82, x102); - fiat_p47441_addcarryx_u64(&x116, &x117, x115, x84, x104); - fiat_p47441_addcarryx_u64(&x118, &x119, x117, x86, x106); - fiat_p47441_addcarryx_u64(&x120, &x121, x119, x88, x108); - fiat_p47441_addcarryx_u64(&x122, &x123, x121, (x89 + (x79 + (x67 + x47))), x110); - fiat_p47441_addcarryx_u64(&x124, &x125, 0x0, x114, (arg1[3])); - fiat_p47441_addcarryx_u64(&x126, &x127, x125, x116, 0x0); - fiat_p47441_addcarryx_u64(&x128, &x129, x127, x118, 0x0); - fiat_p47441_addcarryx_u64(&x130, &x131, x129, x120, 0x0); - fiat_p47441_addcarryx_u64(&x132, &x133, x131, x122, 0x0); - fiat_p47441_mulx_u64(&x134, &x135, x124, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x136, &x137, x124, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x138, &x139, x124, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x140, &x141, x124, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x142, &x143, x124, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x144, &x145, x124, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x146, &x147, 0x0, x145, x142); - fiat_p47441_addcarryx_u64(&x148, &x149, x147, x143, x140); - fiat_p47441_addcarryx_u64(&x150, &x151, x149, x141, x138); - fiat_p47441_addcarryx_u64(&x152, &x153, x151, x139, x136); - fiat_p47441_addcarryx_u64(&x154, &x155, x153, x137, x134); - fiat_p47441_addcarryx_u64(&x156, &x157, 0x0, x124, x144); - fiat_p47441_addcarryx_u64(&x158, &x159, x157, x126, x146); - fiat_p47441_addcarryx_u64(&x160, &x161, x159, x128, x148); - fiat_p47441_addcarryx_u64(&x162, &x163, x161, x130, x150); - fiat_p47441_addcarryx_u64(&x164, &x165, x163, x132, x152); - fiat_p47441_addcarryx_u64(&x166, &x167, x165, (x133 + (x123 + (x111 + x91))), x154); - fiat_p47441_addcarryx_u64(&x168, &x169, 0x0, x158, (arg1[4])); - fiat_p47441_addcarryx_u64(&x170, &x171, x169, x160, 0x0); - fiat_p47441_addcarryx_u64(&x172, &x173, x171, x162, 0x0); - fiat_p47441_addcarryx_u64(&x174, &x175, x173, x164, 0x0); - fiat_p47441_addcarryx_u64(&x176, &x177, x175, x166, 0x0); - fiat_p47441_mulx_u64(&x178, &x179, x168, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x180, &x181, x168, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x182, &x183, x168, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x184, &x185, x168, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x186, &x187, x168, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x188, &x189, x168, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x190, &x191, 0x0, x189, x186); - fiat_p47441_addcarryx_u64(&x192, &x193, x191, x187, x184); - fiat_p47441_addcarryx_u64(&x194, &x195, x193, x185, x182); - fiat_p47441_addcarryx_u64(&x196, &x197, x195, x183, x180); - fiat_p47441_addcarryx_u64(&x198, &x199, x197, x181, x178); - fiat_p47441_addcarryx_u64(&x200, &x201, 0x0, x168, x188); - fiat_p47441_addcarryx_u64(&x202, &x203, x201, x170, x190); - fiat_p47441_addcarryx_u64(&x204, &x205, x203, x172, x192); - fiat_p47441_addcarryx_u64(&x206, &x207, x205, x174, x194); - fiat_p47441_addcarryx_u64(&x208, &x209, x207, x176, x196); - fiat_p47441_addcarryx_u64(&x210, &x211, x209, (x177 + (x167 + (x155 + x135))), x198); - fiat_p47441_addcarryx_u64(&x212, &x213, 0x0, x202, (arg1[5])); - fiat_p47441_addcarryx_u64(&x214, &x215, x213, x204, 0x0); - fiat_p47441_addcarryx_u64(&x216, &x217, x215, x206, 0x0); - fiat_p47441_addcarryx_u64(&x218, &x219, x217, x208, 0x0); - fiat_p47441_addcarryx_u64(&x220, &x221, x219, x210, 0x0); - fiat_p47441_mulx_u64(&x222, &x223, x212, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x224, &x225, x212, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x226, &x227, x212, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x228, &x229, x212, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x230, &x231, x212, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x232, &x233, x212, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x234, &x235, 0x0, x233, x230); - fiat_p47441_addcarryx_u64(&x236, &x237, x235, x231, x228); - fiat_p47441_addcarryx_u64(&x238, &x239, x237, x229, x226); - fiat_p47441_addcarryx_u64(&x240, &x241, x239, x227, x224); - fiat_p47441_addcarryx_u64(&x242, &x243, x241, x225, x222); - fiat_p47441_addcarryx_u64(&x244, &x245, 0x0, x212, x232); - fiat_p47441_addcarryx_u64(&x246, &x247, x245, x214, x234); - fiat_p47441_addcarryx_u64(&x248, &x249, x247, x216, x236); - fiat_p47441_addcarryx_u64(&x250, &x251, x249, x218, x238); - fiat_p47441_addcarryx_u64(&x252, &x253, x251, x220, x240); - fiat_p47441_addcarryx_u64(&x254, &x255, x253, (x221 + (x211 + (x199 + x179))), x242); - x256 = (x255 + (x243 + x223)); - fiat_p47441_subborrowx_u64(&x257, &x258, 0x0, x246, UINT64_C(0xffffffffffffffff)); - fiat_p47441_subborrowx_u64(&x259, &x260, x258, x248, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_subborrowx_u64(&x261, &x262, x260, x250, UINT64_C(0xc722f669356ea468)); - fiat_p47441_subborrowx_u64(&x263, &x264, x262, x252, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_subborrowx_u64(&x265, &x266, x264, x254, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_subborrowx_u64(&x267, &x268, x266, x256, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_subborrowx_u64(&x269, &x270, x268, 0x0, 0x0); - fiat_p47441_cmovznz_u64(&x271, x270, x257, x246); - fiat_p47441_cmovznz_u64(&x272, x270, x259, x248); - fiat_p47441_cmovznz_u64(&x273, x270, x261, x250); - fiat_p47441_cmovznz_u64(&x274, x270, x263, x252); - fiat_p47441_cmovznz_u64(&x275, x270, x265, x254); - fiat_p47441_cmovznz_u64(&x276, x270, x267, x256); - out1[0] = x271; - out1[1] = x272; - out1[2] = x273; - out1[3] = x274; - out1[4] = x275; - out1[5] = x276; -} - -/* - * The function fiat_p47441_to_montgomery translates a field element into the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = eval arg1 mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_to_montgomery(fiat_p47441_montgomery_domain_field_element out1, const fiat_p47441_non_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - fiat_p47441_uint1 x20; - uint64_t x21; - fiat_p47441_uint1 x22; - uint64_t x23; - fiat_p47441_uint1 x24; - uint64_t x25; - fiat_p47441_uint1 x26; - uint64_t x27; - fiat_p47441_uint1 x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - uint64_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - fiat_p47441_uint1 x42; - uint64_t x43; - fiat_p47441_uint1 x44; - uint64_t x45; - fiat_p47441_uint1 x46; - uint64_t x47; - fiat_p47441_uint1 x48; - uint64_t x49; - fiat_p47441_uint1 x50; - uint64_t x51; - fiat_p47441_uint1 x52; - uint64_t x53; - fiat_p47441_uint1 x54; - uint64_t x55; - fiat_p47441_uint1 x56; - uint64_t x57; - fiat_p47441_uint1 x58; - uint64_t x59; - fiat_p47441_uint1 x60; - uint64_t x61; - fiat_p47441_uint1 x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - fiat_p47441_uint1 x76; - uint64_t x77; - fiat_p47441_uint1 x78; - uint64_t x79; - fiat_p47441_uint1 x80; - uint64_t x81; - fiat_p47441_uint1 x82; - uint64_t x83; - fiat_p47441_uint1 x84; - uint64_t x85; - fiat_p47441_uint1 x86; - uint64_t x87; - fiat_p47441_uint1 x88; - uint64_t x89; - fiat_p47441_uint1 x90; - uint64_t x91; - fiat_p47441_uint1 x92; - uint64_t x93; - fiat_p47441_uint1 x94; - uint64_t x95; - fiat_p47441_uint1 x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - uint64_t x105; - uint64_t x106; - uint64_t x107; - uint64_t x108; - uint64_t x109; - fiat_p47441_uint1 x110; - uint64_t x111; - fiat_p47441_uint1 x112; - uint64_t x113; - fiat_p47441_uint1 x114; - uint64_t x115; - fiat_p47441_uint1 x116; - uint64_t x117; - fiat_p47441_uint1 x118; - uint64_t x119; - fiat_p47441_uint1 x120; - uint64_t x121; - fiat_p47441_uint1 x122; - uint64_t x123; - fiat_p47441_uint1 x124; - uint64_t x125; - fiat_p47441_uint1 x126; - uint64_t x127; - fiat_p47441_uint1 x128; - uint64_t x129; - fiat_p47441_uint1 x130; - uint64_t x131; - uint64_t x132; - uint64_t x133; - uint64_t x134; - uint64_t x135; - uint64_t x136; - uint64_t x137; - uint64_t x138; - uint64_t x139; - uint64_t x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - fiat_p47441_uint1 x144; - uint64_t x145; - fiat_p47441_uint1 x146; - uint64_t x147; - fiat_p47441_uint1 x148; - uint64_t x149; - fiat_p47441_uint1 x150; - uint64_t x151; - fiat_p47441_uint1 x152; - uint64_t x153; - fiat_p47441_uint1 x154; - uint64_t x155; - fiat_p47441_uint1 x156; - uint64_t x157; - fiat_p47441_uint1 x158; - uint64_t x159; - fiat_p47441_uint1 x160; - uint64_t x161; - fiat_p47441_uint1 x162; - uint64_t x163; - fiat_p47441_uint1 x164; - uint64_t x165; - uint64_t x166; - uint64_t x167; - uint64_t x168; - uint64_t x169; - uint64_t x170; - uint64_t x171; - uint64_t x172; - uint64_t x173; - uint64_t x174; - uint64_t x175; - uint64_t x176; - uint64_t x177; - fiat_p47441_uint1 x178; - uint64_t x179; - fiat_p47441_uint1 x180; - uint64_t x181; - fiat_p47441_uint1 x182; - uint64_t x183; - fiat_p47441_uint1 x184; - uint64_t x185; - fiat_p47441_uint1 x186; - uint64_t x187; - fiat_p47441_uint1 x188; - uint64_t x189; - fiat_p47441_uint1 x190; - uint64_t x191; - fiat_p47441_uint1 x192; - uint64_t x193; - fiat_p47441_uint1 x194; - uint64_t x195; - fiat_p47441_uint1 x196; - uint64_t x197; - fiat_p47441_uint1 x198; - uint64_t x199; - uint64_t x200; - uint64_t x201; - uint64_t x202; - uint64_t x203; - uint64_t x204; - uint64_t x205; - uint64_t x206; - uint64_t x207; - uint64_t x208; - uint64_t x209; - uint64_t x210; - uint64_t x211; - fiat_p47441_uint1 x212; - uint64_t x213; - fiat_p47441_uint1 x214; - uint64_t x215; - fiat_p47441_uint1 x216; - uint64_t x217; - fiat_p47441_uint1 x218; - uint64_t x219; - fiat_p47441_uint1 x220; - uint64_t x221; - fiat_p47441_uint1 x222; - uint64_t x223; - fiat_p47441_uint1 x224; - uint64_t x225; - fiat_p47441_uint1 x226; - uint64_t x227; - fiat_p47441_uint1 x228; - uint64_t x229; - fiat_p47441_uint1 x230; - uint64_t x231; - fiat_p47441_uint1 x232; - uint64_t x233; - uint64_t x234; - uint64_t x235; - uint64_t x236; - uint64_t x237; - uint64_t x238; - uint64_t x239; - uint64_t x240; - uint64_t x241; - uint64_t x242; - uint64_t x243; - uint64_t x244; - uint64_t x245; - fiat_p47441_uint1 x246; - uint64_t x247; - fiat_p47441_uint1 x248; - uint64_t x249; - fiat_p47441_uint1 x250; - uint64_t x251; - fiat_p47441_uint1 x252; - uint64_t x253; - fiat_p47441_uint1 x254; - uint64_t x255; - fiat_p47441_uint1 x256; - uint64_t x257; - fiat_p47441_uint1 x258; - uint64_t x259; - fiat_p47441_uint1 x260; - uint64_t x261; - fiat_p47441_uint1 x262; - uint64_t x263; - fiat_p47441_uint1 x264; - uint64_t x265; - fiat_p47441_uint1 x266; - uint64_t x267; - uint64_t x268; - uint64_t x269; - uint64_t x270; - uint64_t x271; - uint64_t x272; - uint64_t x273; - uint64_t x274; - uint64_t x275; - uint64_t x276; - uint64_t x277; - uint64_t x278; - uint64_t x279; - fiat_p47441_uint1 x280; - uint64_t x281; - fiat_p47441_uint1 x282; - uint64_t x283; - fiat_p47441_uint1 x284; - uint64_t x285; - fiat_p47441_uint1 x286; - uint64_t x287; - fiat_p47441_uint1 x288; - uint64_t x289; - fiat_p47441_uint1 x290; - uint64_t x291; - fiat_p47441_uint1 x292; - uint64_t x293; - fiat_p47441_uint1 x294; - uint64_t x295; - fiat_p47441_uint1 x296; - uint64_t x297; - fiat_p47441_uint1 x298; - uint64_t x299; - fiat_p47441_uint1 x300; - uint64_t x301; - uint64_t x302; - uint64_t x303; - uint64_t x304; - uint64_t x305; - uint64_t x306; - uint64_t x307; - uint64_t x308; - uint64_t x309; - uint64_t x310; - uint64_t x311; - uint64_t x312; - uint64_t x313; - fiat_p47441_uint1 x314; - uint64_t x315; - fiat_p47441_uint1 x316; - uint64_t x317; - fiat_p47441_uint1 x318; - uint64_t x319; - fiat_p47441_uint1 x320; - uint64_t x321; - fiat_p47441_uint1 x322; - uint64_t x323; - fiat_p47441_uint1 x324; - uint64_t x325; - fiat_p47441_uint1 x326; - uint64_t x327; - fiat_p47441_uint1 x328; - uint64_t x329; - fiat_p47441_uint1 x330; - uint64_t x331; - fiat_p47441_uint1 x332; - uint64_t x333; - fiat_p47441_uint1 x334; - uint64_t x335; - uint64_t x336; - uint64_t x337; - uint64_t x338; - uint64_t x339; - uint64_t x340; - uint64_t x341; - uint64_t x342; - uint64_t x343; - uint64_t x344; - uint64_t x345; - uint64_t x346; - uint64_t x347; - fiat_p47441_uint1 x348; - uint64_t x349; - fiat_p47441_uint1 x350; - uint64_t x351; - fiat_p47441_uint1 x352; - uint64_t x353; - fiat_p47441_uint1 x354; - uint64_t x355; - fiat_p47441_uint1 x356; - uint64_t x357; - fiat_p47441_uint1 x358; - uint64_t x359; - fiat_p47441_uint1 x360; - uint64_t x361; - fiat_p47441_uint1 x362; - uint64_t x363; - fiat_p47441_uint1 x364; - uint64_t x365; - fiat_p47441_uint1 x366; - uint64_t x367; - fiat_p47441_uint1 x368; - uint64_t x369; - uint64_t x370; - uint64_t x371; - uint64_t x372; - uint64_t x373; - uint64_t x374; - uint64_t x375; - uint64_t x376; - uint64_t x377; - uint64_t x378; - uint64_t x379; - uint64_t x380; - uint64_t x381; - fiat_p47441_uint1 x382; - uint64_t x383; - fiat_p47441_uint1 x384; - uint64_t x385; - fiat_p47441_uint1 x386; - uint64_t x387; - fiat_p47441_uint1 x388; - uint64_t x389; - fiat_p47441_uint1 x390; - uint64_t x391; - fiat_p47441_uint1 x392; - uint64_t x393; - fiat_p47441_uint1 x394; - uint64_t x395; - fiat_p47441_uint1 x396; - uint64_t x397; - fiat_p47441_uint1 x398; - uint64_t x399; - fiat_p47441_uint1 x400; - uint64_t x401; - fiat_p47441_uint1 x402; - uint64_t x403; - uint64_t x404; - fiat_p47441_uint1 x405; - uint64_t x406; - fiat_p47441_uint1 x407; - uint64_t x408; - fiat_p47441_uint1 x409; - uint64_t x410; - fiat_p47441_uint1 x411; - uint64_t x412; - fiat_p47441_uint1 x413; - uint64_t x414; - fiat_p47441_uint1 x415; - uint64_t x416; - fiat_p47441_uint1 x417; - uint64_t x418; - uint64_t x419; - uint64_t x420; - uint64_t x421; - uint64_t x422; - uint64_t x423; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[4]); - x5 = (arg1[5]); - x6 = (arg1[0]); - fiat_p47441_mulx_u64(&x7, &x8, x6, UINT64_C(0x389174e2d56216f)); - fiat_p47441_mulx_u64(&x9, &x10, x6, UINT64_C(0xafea5eb6ef0da10)); - fiat_p47441_mulx_u64(&x11, &x12, x6, UINT64_C(0x328905e465cd7db3)); - fiat_p47441_mulx_u64(&x13, &x14, x6, UINT64_C(0x342c8b98f26f21ed)); - fiat_p47441_mulx_u64(&x15, &x16, x6, UINT64_C(0xdc10c645bfe4a1ac)); - fiat_p47441_mulx_u64(&x17, &x18, x6, UINT64_C(0x47b3e8268664617e)); - fiat_p47441_addcarryx_u64(&x19, &x20, 0x0, x18, x15); - fiat_p47441_addcarryx_u64(&x21, &x22, x20, x16, x13); - fiat_p47441_addcarryx_u64(&x23, &x24, x22, x14, x11); - fiat_p47441_addcarryx_u64(&x25, &x26, x24, x12, x9); - fiat_p47441_addcarryx_u64(&x27, &x28, x26, x10, x7); - fiat_p47441_mulx_u64(&x29, &x30, x17, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x31, &x32, x17, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x33, &x34, x17, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x35, &x36, x17, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x37, &x38, x17, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x39, &x40, x17, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x41, &x42, 0x0, x40, x37); - fiat_p47441_addcarryx_u64(&x43, &x44, x42, x38, x35); - fiat_p47441_addcarryx_u64(&x45, &x46, x44, x36, x33); - fiat_p47441_addcarryx_u64(&x47, &x48, x46, x34, x31); - fiat_p47441_addcarryx_u64(&x49, &x50, x48, x32, x29); - fiat_p47441_addcarryx_u64(&x51, &x52, 0x0, x17, x39); - fiat_p47441_addcarryx_u64(&x53, &x54, x52, x19, x41); - fiat_p47441_addcarryx_u64(&x55, &x56, x54, x21, x43); - fiat_p47441_addcarryx_u64(&x57, &x58, x56, x23, x45); - fiat_p47441_addcarryx_u64(&x59, &x60, x58, x25, x47); - fiat_p47441_addcarryx_u64(&x61, &x62, x60, x27, x49); - fiat_p47441_mulx_u64(&x63, &x64, x1, UINT64_C(0x389174e2d56216f)); - fiat_p47441_mulx_u64(&x65, &x66, x1, UINT64_C(0xafea5eb6ef0da10)); - fiat_p47441_mulx_u64(&x67, &x68, x1, UINT64_C(0x328905e465cd7db3)); - fiat_p47441_mulx_u64(&x69, &x70, x1, UINT64_C(0x342c8b98f26f21ed)); - fiat_p47441_mulx_u64(&x71, &x72, x1, UINT64_C(0xdc10c645bfe4a1ac)); - fiat_p47441_mulx_u64(&x73, &x74, x1, UINT64_C(0x47b3e8268664617e)); - fiat_p47441_addcarryx_u64(&x75, &x76, 0x0, x74, x71); - fiat_p47441_addcarryx_u64(&x77, &x78, x76, x72, x69); - fiat_p47441_addcarryx_u64(&x79, &x80, x78, x70, x67); - fiat_p47441_addcarryx_u64(&x81, &x82, x80, x68, x65); - fiat_p47441_addcarryx_u64(&x83, &x84, x82, x66, x63); - fiat_p47441_addcarryx_u64(&x85, &x86, 0x0, x53, x73); - fiat_p47441_addcarryx_u64(&x87, &x88, x86, x55, x75); - fiat_p47441_addcarryx_u64(&x89, &x90, x88, x57, x77); - fiat_p47441_addcarryx_u64(&x91, &x92, x90, x59, x79); - fiat_p47441_addcarryx_u64(&x93, &x94, x92, x61, x81); - fiat_p47441_addcarryx_u64(&x95, &x96, x94, ((x62 + (x28 + x8)) + (x50 + x30)), x83); - fiat_p47441_mulx_u64(&x97, &x98, x85, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x99, &x100, x85, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x101, &x102, x85, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x103, &x104, x85, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x105, &x106, x85, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x107, &x108, x85, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x109, &x110, 0x0, x108, x105); - fiat_p47441_addcarryx_u64(&x111, &x112, x110, x106, x103); - fiat_p47441_addcarryx_u64(&x113, &x114, x112, x104, x101); - fiat_p47441_addcarryx_u64(&x115, &x116, x114, x102, x99); - fiat_p47441_addcarryx_u64(&x117, &x118, x116, x100, x97); - fiat_p47441_addcarryx_u64(&x119, &x120, 0x0, x85, x107); - fiat_p47441_addcarryx_u64(&x121, &x122, x120, x87, x109); - fiat_p47441_addcarryx_u64(&x123, &x124, x122, x89, x111); - fiat_p47441_addcarryx_u64(&x125, &x126, x124, x91, x113); - fiat_p47441_addcarryx_u64(&x127, &x128, x126, x93, x115); - fiat_p47441_addcarryx_u64(&x129, &x130, x128, x95, x117); - fiat_p47441_mulx_u64(&x131, &x132, x2, UINT64_C(0x389174e2d56216f)); - fiat_p47441_mulx_u64(&x133, &x134, x2, UINT64_C(0xafea5eb6ef0da10)); - fiat_p47441_mulx_u64(&x135, &x136, x2, UINT64_C(0x328905e465cd7db3)); - fiat_p47441_mulx_u64(&x137, &x138, x2, UINT64_C(0x342c8b98f26f21ed)); - fiat_p47441_mulx_u64(&x139, &x140, x2, UINT64_C(0xdc10c645bfe4a1ac)); - fiat_p47441_mulx_u64(&x141, &x142, x2, UINT64_C(0x47b3e8268664617e)); - fiat_p47441_addcarryx_u64(&x143, &x144, 0x0, x142, x139); - fiat_p47441_addcarryx_u64(&x145, &x146, x144, x140, x137); - fiat_p47441_addcarryx_u64(&x147, &x148, x146, x138, x135); - fiat_p47441_addcarryx_u64(&x149, &x150, x148, x136, x133); - fiat_p47441_addcarryx_u64(&x151, &x152, x150, x134, x131); - fiat_p47441_addcarryx_u64(&x153, &x154, 0x0, x121, x141); - fiat_p47441_addcarryx_u64(&x155, &x156, x154, x123, x143); - fiat_p47441_addcarryx_u64(&x157, &x158, x156, x125, x145); - fiat_p47441_addcarryx_u64(&x159, &x160, x158, x127, x147); - fiat_p47441_addcarryx_u64(&x161, &x162, x160, x129, x149); - fiat_p47441_addcarryx_u64(&x163, &x164, x162, ((x130 + (x96 + (x84 + x64))) + (x118 + x98)), x151); - fiat_p47441_mulx_u64(&x165, &x166, x153, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x167, &x168, x153, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x169, &x170, x153, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x171, &x172, x153, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x173, &x174, x153, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x175, &x176, x153, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x177, &x178, 0x0, x176, x173); - fiat_p47441_addcarryx_u64(&x179, &x180, x178, x174, x171); - fiat_p47441_addcarryx_u64(&x181, &x182, x180, x172, x169); - fiat_p47441_addcarryx_u64(&x183, &x184, x182, x170, x167); - fiat_p47441_addcarryx_u64(&x185, &x186, x184, x168, x165); - fiat_p47441_addcarryx_u64(&x187, &x188, 0x0, x153, x175); - fiat_p47441_addcarryx_u64(&x189, &x190, x188, x155, x177); - fiat_p47441_addcarryx_u64(&x191, &x192, x190, x157, x179); - fiat_p47441_addcarryx_u64(&x193, &x194, x192, x159, x181); - fiat_p47441_addcarryx_u64(&x195, &x196, x194, x161, x183); - fiat_p47441_addcarryx_u64(&x197, &x198, x196, x163, x185); - fiat_p47441_mulx_u64(&x199, &x200, x3, UINT64_C(0x389174e2d56216f)); - fiat_p47441_mulx_u64(&x201, &x202, x3, UINT64_C(0xafea5eb6ef0da10)); - fiat_p47441_mulx_u64(&x203, &x204, x3, UINT64_C(0x328905e465cd7db3)); - fiat_p47441_mulx_u64(&x205, &x206, x3, UINT64_C(0x342c8b98f26f21ed)); - fiat_p47441_mulx_u64(&x207, &x208, x3, UINT64_C(0xdc10c645bfe4a1ac)); - fiat_p47441_mulx_u64(&x209, &x210, x3, UINT64_C(0x47b3e8268664617e)); - fiat_p47441_addcarryx_u64(&x211, &x212, 0x0, x210, x207); - fiat_p47441_addcarryx_u64(&x213, &x214, x212, x208, x205); - fiat_p47441_addcarryx_u64(&x215, &x216, x214, x206, x203); - fiat_p47441_addcarryx_u64(&x217, &x218, x216, x204, x201); - fiat_p47441_addcarryx_u64(&x219, &x220, x218, x202, x199); - fiat_p47441_addcarryx_u64(&x221, &x222, 0x0, x189, x209); - fiat_p47441_addcarryx_u64(&x223, &x224, x222, x191, x211); - fiat_p47441_addcarryx_u64(&x225, &x226, x224, x193, x213); - fiat_p47441_addcarryx_u64(&x227, &x228, x226, x195, x215); - fiat_p47441_addcarryx_u64(&x229, &x230, x228, x197, x217); - fiat_p47441_addcarryx_u64(&x231, &x232, x230, ((x198 + (x164 + (x152 + x132))) + (x186 + x166)), x219); - fiat_p47441_mulx_u64(&x233, &x234, x221, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x235, &x236, x221, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x237, &x238, x221, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x239, &x240, x221, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x241, &x242, x221, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x243, &x244, x221, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x245, &x246, 0x0, x244, x241); - fiat_p47441_addcarryx_u64(&x247, &x248, x246, x242, x239); - fiat_p47441_addcarryx_u64(&x249, &x250, x248, x240, x237); - fiat_p47441_addcarryx_u64(&x251, &x252, x250, x238, x235); - fiat_p47441_addcarryx_u64(&x253, &x254, x252, x236, x233); - fiat_p47441_addcarryx_u64(&x255, &x256, 0x0, x221, x243); - fiat_p47441_addcarryx_u64(&x257, &x258, x256, x223, x245); - fiat_p47441_addcarryx_u64(&x259, &x260, x258, x225, x247); - fiat_p47441_addcarryx_u64(&x261, &x262, x260, x227, x249); - fiat_p47441_addcarryx_u64(&x263, &x264, x262, x229, x251); - fiat_p47441_addcarryx_u64(&x265, &x266, x264, x231, x253); - fiat_p47441_mulx_u64(&x267, &x268, x4, UINT64_C(0x389174e2d56216f)); - fiat_p47441_mulx_u64(&x269, &x270, x4, UINT64_C(0xafea5eb6ef0da10)); - fiat_p47441_mulx_u64(&x271, &x272, x4, UINT64_C(0x328905e465cd7db3)); - fiat_p47441_mulx_u64(&x273, &x274, x4, UINT64_C(0x342c8b98f26f21ed)); - fiat_p47441_mulx_u64(&x275, &x276, x4, UINT64_C(0xdc10c645bfe4a1ac)); - fiat_p47441_mulx_u64(&x277, &x278, x4, UINT64_C(0x47b3e8268664617e)); - fiat_p47441_addcarryx_u64(&x279, &x280, 0x0, x278, x275); - fiat_p47441_addcarryx_u64(&x281, &x282, x280, x276, x273); - fiat_p47441_addcarryx_u64(&x283, &x284, x282, x274, x271); - fiat_p47441_addcarryx_u64(&x285, &x286, x284, x272, x269); - fiat_p47441_addcarryx_u64(&x287, &x288, x286, x270, x267); - fiat_p47441_addcarryx_u64(&x289, &x290, 0x0, x257, x277); - fiat_p47441_addcarryx_u64(&x291, &x292, x290, x259, x279); - fiat_p47441_addcarryx_u64(&x293, &x294, x292, x261, x281); - fiat_p47441_addcarryx_u64(&x295, &x296, x294, x263, x283); - fiat_p47441_addcarryx_u64(&x297, &x298, x296, x265, x285); - fiat_p47441_addcarryx_u64(&x299, &x300, x298, ((x266 + (x232 + (x220 + x200))) + (x254 + x234)), x287); - fiat_p47441_mulx_u64(&x301, &x302, x289, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x303, &x304, x289, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x305, &x306, x289, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x307, &x308, x289, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x309, &x310, x289, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x311, &x312, x289, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x313, &x314, 0x0, x312, x309); - fiat_p47441_addcarryx_u64(&x315, &x316, x314, x310, x307); - fiat_p47441_addcarryx_u64(&x317, &x318, x316, x308, x305); - fiat_p47441_addcarryx_u64(&x319, &x320, x318, x306, x303); - fiat_p47441_addcarryx_u64(&x321, &x322, x320, x304, x301); - fiat_p47441_addcarryx_u64(&x323, &x324, 0x0, x289, x311); - fiat_p47441_addcarryx_u64(&x325, &x326, x324, x291, x313); - fiat_p47441_addcarryx_u64(&x327, &x328, x326, x293, x315); - fiat_p47441_addcarryx_u64(&x329, &x330, x328, x295, x317); - fiat_p47441_addcarryx_u64(&x331, &x332, x330, x297, x319); - fiat_p47441_addcarryx_u64(&x333, &x334, x332, x299, x321); - fiat_p47441_mulx_u64(&x335, &x336, x5, UINT64_C(0x389174e2d56216f)); - fiat_p47441_mulx_u64(&x337, &x338, x5, UINT64_C(0xafea5eb6ef0da10)); - fiat_p47441_mulx_u64(&x339, &x340, x5, UINT64_C(0x328905e465cd7db3)); - fiat_p47441_mulx_u64(&x341, &x342, x5, UINT64_C(0x342c8b98f26f21ed)); - fiat_p47441_mulx_u64(&x343, &x344, x5, UINT64_C(0xdc10c645bfe4a1ac)); - fiat_p47441_mulx_u64(&x345, &x346, x5, UINT64_C(0x47b3e8268664617e)); - fiat_p47441_addcarryx_u64(&x347, &x348, 0x0, x346, x343); - fiat_p47441_addcarryx_u64(&x349, &x350, x348, x344, x341); - fiat_p47441_addcarryx_u64(&x351, &x352, x350, x342, x339); - fiat_p47441_addcarryx_u64(&x353, &x354, x352, x340, x337); - fiat_p47441_addcarryx_u64(&x355, &x356, x354, x338, x335); - fiat_p47441_addcarryx_u64(&x357, &x358, 0x0, x325, x345); - fiat_p47441_addcarryx_u64(&x359, &x360, x358, x327, x347); - fiat_p47441_addcarryx_u64(&x361, &x362, x360, x329, x349); - fiat_p47441_addcarryx_u64(&x363, &x364, x362, x331, x351); - fiat_p47441_addcarryx_u64(&x365, &x366, x364, x333, x353); - fiat_p47441_addcarryx_u64(&x367, &x368, x366, ((x334 + (x300 + (x288 + x268))) + (x322 + x302)), x355); - fiat_p47441_mulx_u64(&x369, &x370, x357, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_mulx_u64(&x371, &x372, x357, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_mulx_u64(&x373, &x374, x357, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_mulx_u64(&x375, &x376, x357, UINT64_C(0xc722f669356ea468)); - fiat_p47441_mulx_u64(&x377, &x378, x357, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_mulx_u64(&x379, &x380, x357, UINT64_C(0xffffffffffffffff)); - fiat_p47441_addcarryx_u64(&x381, &x382, 0x0, x380, x377); - fiat_p47441_addcarryx_u64(&x383, &x384, x382, x378, x375); - fiat_p47441_addcarryx_u64(&x385, &x386, x384, x376, x373); - fiat_p47441_addcarryx_u64(&x387, &x388, x386, x374, x371); - fiat_p47441_addcarryx_u64(&x389, &x390, x388, x372, x369); - fiat_p47441_addcarryx_u64(&x391, &x392, 0x0, x357, x379); - fiat_p47441_addcarryx_u64(&x393, &x394, x392, x359, x381); - fiat_p47441_addcarryx_u64(&x395, &x396, x394, x361, x383); - fiat_p47441_addcarryx_u64(&x397, &x398, x396, x363, x385); - fiat_p47441_addcarryx_u64(&x399, &x400, x398, x365, x387); - fiat_p47441_addcarryx_u64(&x401, &x402, x400, x367, x389); - x403 = ((x402 + (x368 + (x356 + x336))) + (x390 + x370)); - fiat_p47441_subborrowx_u64(&x404, &x405, 0x0, x393, UINT64_C(0xffffffffffffffff)); - fiat_p47441_subborrowx_u64(&x406, &x407, x405, x395, UINT64_C(0x4c6174c1ffffffff)); - fiat_p47441_subborrowx_u64(&x408, &x409, x407, x397, UINT64_C(0xc722f669356ea468)); - fiat_p47441_subborrowx_u64(&x410, &x411, x409, x399, UINT64_C(0x65bc2e0a90aeb751)); - fiat_p47441_subborrowx_u64(&x412, &x413, x411, x401, UINT64_C(0xc6ae604a45d10ad6)); - fiat_p47441_subborrowx_u64(&x414, &x415, x413, x403, UINT64_C(0x3df6eeeab0871a2)); - fiat_p47441_subborrowx_u64(&x416, &x417, x415, 0x0, 0x0); - fiat_p47441_cmovznz_u64(&x418, x417, x404, x393); - fiat_p47441_cmovznz_u64(&x419, x417, x406, x395); - fiat_p47441_cmovznz_u64(&x420, x417, x408, x397); - fiat_p47441_cmovznz_u64(&x421, x417, x410, x399); - fiat_p47441_cmovznz_u64(&x422, x417, x412, x401); - fiat_p47441_cmovznz_u64(&x423, x417, x414, x403); - out1[0] = x418; - out1[1] = x419; - out1[2] = x420; - out1[3] = x421; - out1[4] = x422; - out1[5] = x423; -} - -/* - * The function fiat_p47441_nonzero outputs a single non-zero word if the input is non-zero and zero otherwise. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * out1 = 0 ↔ eval (from_montgomery arg1) mod m = 0 - * - * Input Bounds: - * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p47441_nonzero(uint64_t* out1, const uint64_t arg1[6]) { - uint64_t x1; - x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | ((arg1[3]) | ((arg1[4]) | (arg1[5])))))); - *out1 = x1; -} - -/* - * The function fiat_p47441_selectznz is a multi-limb conditional select. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -void fiat_p47441_selectznz(uint64_t out1[6], fiat_p47441_uint1 arg1, const uint64_t arg2[6], const uint64_t arg3[6]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - fiat_p47441_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0])); - fiat_p47441_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1])); - fiat_p47441_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2])); - fiat_p47441_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3])); - fiat_p47441_cmovznz_u64(&x5, arg1, (arg2[4]), (arg3[4])); - fiat_p47441_cmovznz_u64(&x6, arg1, (arg2[5]), (arg3[5])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; - out1[5] = x6; -} - -/* - * The function fiat_p47441_to_bytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..47] - * - * Input Bounds: - * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x3ffffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x3]] - */ -void fiat_p47441_to_bytes(uint8_t out1[48], const uint64_t arg1[6]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint8_t x7; - uint64_t x8; - uint8_t x9; - uint64_t x10; - uint8_t x11; - uint64_t x12; - uint8_t x13; - uint64_t x14; - uint8_t x15; - uint64_t x16; - uint8_t x17; - uint64_t x18; - uint8_t x19; - uint8_t x20; - uint8_t x21; - uint64_t x22; - uint8_t x23; - uint64_t x24; - uint8_t x25; - uint64_t x26; - uint8_t x27; - uint64_t x28; - uint8_t x29; - uint64_t x30; - uint8_t x31; - uint64_t x32; - uint8_t x33; - uint8_t x34; - uint8_t x35; - uint64_t x36; - uint8_t x37; - uint64_t x38; - uint8_t x39; - uint64_t x40; - uint8_t x41; - uint64_t x42; - uint8_t x43; - uint64_t x44; - uint8_t x45; - uint64_t x46; - uint8_t x47; - uint8_t x48; - uint8_t x49; - uint64_t x50; - uint8_t x51; - uint64_t x52; - uint8_t x53; - uint64_t x54; - uint8_t x55; - uint64_t x56; - uint8_t x57; - uint64_t x58; - uint8_t x59; - uint64_t x60; - uint8_t x61; - uint8_t x62; - uint8_t x63; - uint64_t x64; - uint8_t x65; - uint64_t x66; - uint8_t x67; - uint64_t x68; - uint8_t x69; - uint64_t x70; - uint8_t x71; - uint64_t x72; - uint8_t x73; - uint64_t x74; - uint8_t x75; - uint8_t x76; - uint8_t x77; - uint64_t x78; - uint8_t x79; - uint64_t x80; - uint8_t x81; - uint64_t x82; - uint8_t x83; - uint64_t x84; - uint8_t x85; - uint64_t x86; - uint8_t x87; - uint64_t x88; - uint8_t x89; - uint8_t x90; - x1 = (arg1[5]); - x2 = (arg1[4]); - x3 = (arg1[3]); - x4 = (arg1[2]); - x5 = (arg1[1]); - x6 = (arg1[0]); - x7 = (uint8_t)(x6 & UINT8_C(0xff)); - x8 = (x6 >> 8); - x9 = (uint8_t)(x8 & UINT8_C(0xff)); - x10 = (x8 >> 8); - x11 = (uint8_t)(x10 & UINT8_C(0xff)); - x12 = (x10 >> 8); - x13 = (uint8_t)(x12 & UINT8_C(0xff)); - x14 = (x12 >> 8); - x15 = (uint8_t)(x14 & UINT8_C(0xff)); - x16 = (x14 >> 8); - x17 = (uint8_t)(x16 & UINT8_C(0xff)); - x18 = (x16 >> 8); - x19 = (uint8_t)(x18 & UINT8_C(0xff)); - x20 = (uint8_t)(x18 >> 8); - x21 = (uint8_t)(x5 & UINT8_C(0xff)); - x22 = (x5 >> 8); - x23 = (uint8_t)(x22 & UINT8_C(0xff)); - x24 = (x22 >> 8); - x25 = (uint8_t)(x24 & UINT8_C(0xff)); - x26 = (x24 >> 8); - x27 = (uint8_t)(x26 & UINT8_C(0xff)); - x28 = (x26 >> 8); - x29 = (uint8_t)(x28 & UINT8_C(0xff)); - x30 = (x28 >> 8); - x31 = (uint8_t)(x30 & UINT8_C(0xff)); - x32 = (x30 >> 8); - x33 = (uint8_t)(x32 & UINT8_C(0xff)); - x34 = (uint8_t)(x32 >> 8); - x35 = (uint8_t)(x4 & UINT8_C(0xff)); - x36 = (x4 >> 8); - x37 = (uint8_t)(x36 & UINT8_C(0xff)); - x38 = (x36 >> 8); - x39 = (uint8_t)(x38 & UINT8_C(0xff)); - x40 = (x38 >> 8); - x41 = (uint8_t)(x40 & UINT8_C(0xff)); - x42 = (x40 >> 8); - x43 = (uint8_t)(x42 & UINT8_C(0xff)); - x44 = (x42 >> 8); - x45 = (uint8_t)(x44 & UINT8_C(0xff)); - x46 = (x44 >> 8); - x47 = (uint8_t)(x46 & UINT8_C(0xff)); - x48 = (uint8_t)(x46 >> 8); - x49 = (uint8_t)(x3 & UINT8_C(0xff)); - x50 = (x3 >> 8); - x51 = (uint8_t)(x50 & UINT8_C(0xff)); - x52 = (x50 >> 8); - x53 = (uint8_t)(x52 & UINT8_C(0xff)); - x54 = (x52 >> 8); - x55 = (uint8_t)(x54 & UINT8_C(0xff)); - x56 = (x54 >> 8); - x57 = (uint8_t)(x56 & UINT8_C(0xff)); - x58 = (x56 >> 8); - x59 = (uint8_t)(x58 & UINT8_C(0xff)); - x60 = (x58 >> 8); - x61 = (uint8_t)(x60 & UINT8_C(0xff)); - x62 = (uint8_t)(x60 >> 8); - x63 = (uint8_t)(x2 & UINT8_C(0xff)); - x64 = (x2 >> 8); - x65 = (uint8_t)(x64 & UINT8_C(0xff)); - x66 = (x64 >> 8); - x67 = (uint8_t)(x66 & UINT8_C(0xff)); - x68 = (x66 >> 8); - x69 = (uint8_t)(x68 & UINT8_C(0xff)); - x70 = (x68 >> 8); - x71 = (uint8_t)(x70 & UINT8_C(0xff)); - x72 = (x70 >> 8); - x73 = (uint8_t)(x72 & UINT8_C(0xff)); - x74 = (x72 >> 8); - x75 = (uint8_t)(x74 & UINT8_C(0xff)); - x76 = (uint8_t)(x74 >> 8); - x77 = (uint8_t)(x1 & UINT8_C(0xff)); - x78 = (x1 >> 8); - x79 = (uint8_t)(x78 & UINT8_C(0xff)); - x80 = (x78 >> 8); - x81 = (uint8_t)(x80 & UINT8_C(0xff)); - x82 = (x80 >> 8); - x83 = (uint8_t)(x82 & UINT8_C(0xff)); - x84 = (x82 >> 8); - x85 = (uint8_t)(x84 & UINT8_C(0xff)); - x86 = (x84 >> 8); - x87 = (uint8_t)(x86 & UINT8_C(0xff)); - x88 = (x86 >> 8); - x89 = (uint8_t)(x88 & UINT8_C(0xff)); - x90 = (uint8_t)(x88 >> 8); - out1[0] = x7; - out1[1] = x9; - out1[2] = x11; - out1[3] = x13; - out1[4] = x15; - out1[5] = x17; - out1[6] = x19; - out1[7] = x20; - out1[8] = x21; - out1[9] = x23; - out1[10] = x25; - out1[11] = x27; - out1[12] = x29; - out1[13] = x31; - out1[14] = x33; - out1[15] = x34; - out1[16] = x35; - out1[17] = x37; - out1[18] = x39; - out1[19] = x41; - out1[20] = x43; - out1[21] = x45; - out1[22] = x47; - out1[23] = x48; - out1[24] = x49; - out1[25] = x51; - out1[26] = x53; - out1[27] = x55; - out1[28] = x57; - out1[29] = x59; - out1[30] = x61; - out1[31] = x62; - out1[32] = x63; - out1[33] = x65; - out1[34] = x67; - out1[35] = x69; - out1[36] = x71; - out1[37] = x73; - out1[38] = x75; - out1[39] = x76; - out1[40] = x77; - out1[41] = x79; - out1[42] = x81; - out1[43] = x83; - out1[44] = x85; - out1[45] = x87; - out1[46] = x89; - out1[47] = x90; -} - -/* - * The function fiat_p47441_from_bytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order. - * - * Preconditions: - * 0 ≤ bytes_eval arg1 < m - * Postconditions: - * eval out1 mod m = bytes_eval arg1 mod m - * 0 ≤ eval out1 < m - * - * Input Bounds: - * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x3]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x3ffffffffffffff]] - */ -void fiat_p47441_from_bytes(uint64_t out1[6], const uint8_t arg1[48]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint8_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint8_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint8_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - uint64_t x29; - uint64_t x30; - uint64_t x31; - uint8_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint64_t x39; - uint8_t x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint8_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint64_t x55; - uint64_t x56; - uint64_t x57; - uint64_t x58; - uint64_t x59; - uint64_t x60; - uint64_t x61; - uint64_t x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - uint64_t x79; - uint64_t x80; - uint64_t x81; - uint64_t x82; - uint64_t x83; - uint64_t x84; - uint64_t x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - x1 = ((uint64_t)(arg1[47]) << 56); - x2 = ((uint64_t)(arg1[46]) << 48); - x3 = ((uint64_t)(arg1[45]) << 40); - x4 = ((uint64_t)(arg1[44]) << 32); - x5 = ((uint64_t)(arg1[43]) << 24); - x6 = ((uint64_t)(arg1[42]) << 16); - x7 = ((uint64_t)(arg1[41]) << 8); - x8 = (arg1[40]); - x9 = ((uint64_t)(arg1[39]) << 56); - x10 = ((uint64_t)(arg1[38]) << 48); - x11 = ((uint64_t)(arg1[37]) << 40); - x12 = ((uint64_t)(arg1[36]) << 32); - x13 = ((uint64_t)(arg1[35]) << 24); - x14 = ((uint64_t)(arg1[34]) << 16); - x15 = ((uint64_t)(arg1[33]) << 8); - x16 = (arg1[32]); - x17 = ((uint64_t)(arg1[31]) << 56); - x18 = ((uint64_t)(arg1[30]) << 48); - x19 = ((uint64_t)(arg1[29]) << 40); - x20 = ((uint64_t)(arg1[28]) << 32); - x21 = ((uint64_t)(arg1[27]) << 24); - x22 = ((uint64_t)(arg1[26]) << 16); - x23 = ((uint64_t)(arg1[25]) << 8); - x24 = (arg1[24]); - x25 = ((uint64_t)(arg1[23]) << 56); - x26 = ((uint64_t)(arg1[22]) << 48); - x27 = ((uint64_t)(arg1[21]) << 40); - x28 = ((uint64_t)(arg1[20]) << 32); - x29 = ((uint64_t)(arg1[19]) << 24); - x30 = ((uint64_t)(arg1[18]) << 16); - x31 = ((uint64_t)(arg1[17]) << 8); - x32 = (arg1[16]); - x33 = ((uint64_t)(arg1[15]) << 56); - x34 = ((uint64_t)(arg1[14]) << 48); - x35 = ((uint64_t)(arg1[13]) << 40); - x36 = ((uint64_t)(arg1[12]) << 32); - x37 = ((uint64_t)(arg1[11]) << 24); - x38 = ((uint64_t)(arg1[10]) << 16); - x39 = ((uint64_t)(arg1[9]) << 8); - x40 = (arg1[8]); - x41 = ((uint64_t)(arg1[7]) << 56); - x42 = ((uint64_t)(arg1[6]) << 48); - x43 = ((uint64_t)(arg1[5]) << 40); - x44 = ((uint64_t)(arg1[4]) << 32); - x45 = ((uint64_t)(arg1[3]) << 24); - x46 = ((uint64_t)(arg1[2]) << 16); - x47 = ((uint64_t)(arg1[1]) << 8); - x48 = (arg1[0]); - x49 = (x47 + (uint64_t)x48); - x50 = (x46 + x49); - x51 = (x45 + x50); - x52 = (x44 + x51); - x53 = (x43 + x52); - x54 = (x42 + x53); - x55 = (x41 + x54); - x56 = (x39 + (uint64_t)x40); - x57 = (x38 + x56); - x58 = (x37 + x57); - x59 = (x36 + x58); - x60 = (x35 + x59); - x61 = (x34 + x60); - x62 = (x33 + x61); - x63 = (x31 + (uint64_t)x32); - x64 = (x30 + x63); - x65 = (x29 + x64); - x66 = (x28 + x65); - x67 = (x27 + x66); - x68 = (x26 + x67); - x69 = (x25 + x68); - x70 = (x23 + (uint64_t)x24); - x71 = (x22 + x70); - x72 = (x21 + x71); - x73 = (x20 + x72); - x74 = (x19 + x73); - x75 = (x18 + x74); - x76 = (x17 + x75); - x77 = (x15 + (uint64_t)x16); - x78 = (x14 + x77); - x79 = (x13 + x78); - x80 = (x12 + x79); - x81 = (x11 + x80); - x82 = (x10 + x81); - x83 = (x9 + x82); - x84 = (x7 + (uint64_t)x8); - x85 = (x6 + x84); - x86 = (x5 + x85); - x87 = (x4 + x86); - x88 = (x3 + x87); - x89 = (x2 + x88); - x90 = (x1 + x89); - out1[0] = x55; - out1[1] = x62; - out1[2] = x69; - out1[3] = x76; - out1[4] = x83; - out1[5] = x90; -} - -/* - * The function fiat_p47441_set_one returns the field element one in the Montgomery domain. - * - * Postconditions: - * eval (from_montgomery out1) mod m = 1 mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p47441_set_one(fiat_p47441_montgomery_domain_field_element out1) { - out1[0] = UINT8_C(0x42); - out1[1] = UINT64_C(0x4edfe5fc00000000); - out1[2] = UINT64_C(0xa8fc78e039799d1c); - out1[3] = UINT64_C(0xc57c2146b2f4bcea); - out1[4] = UINT64_C(0xc70b2cda001b34b9); - out1[5] = UINT64_C(0x656677e7d2b408); -} - -void fp_add(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p47441_add(out, a, b); -} - -void fp_sub(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p47441_sub(out, a, b); -} - -void fp_sqr(uint64_t* out, const uint64_t* a) { - fiat_p47441_square(out, a); -} - -void fp_mul(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p47441_mul(out, a, b); -} - -void fp_tomont(uint64_t* out, const uint64_t* a) { - fiat_p47441_to_montgomery(out, a); -} - -void fp_frommont(uint64_t* out, const uint64_t* a) { - fiat_p47441_from_montgomery(out, a); -} - -void fp_mont_setone(uint64_t* out) { - fiat_p47441_set_one(out); -} \ No newline at end of file diff --git a/src/gf/ref/lvl3/fp_p65376_32.c b/src/gf/ref/lvl3/fp_p65376_32.c new file mode 100644 index 0000000..1483461 --- /dev/null +++ b/src/gf/ref/lvl3/fp_p65376_32.c @@ -0,0 +1,1231 @@ +// clang-format off +// Command line : python monty.py 32 +// 0x40ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +#include +#include + +#define sspint int32_t +#define spint uint32_t +#define udpint uint64_t +#define dpint uint64_t + +#define Wordlength 32 +#define Nlimbs 14 +#define Radix 28 +#define Nbits 383 +#define Nbytes 48 + +#define MONTGOMERY +// propagate carries +inline static spint prop(spint *n) { + int i; + spint mask = ((spint)1 << 28u) - (spint)1; + sspint carry = (sspint)n[0]; + carry >>= 28u; + n[0] &= mask; + for (i = 1; i < 13; i++) { + carry += (sspint)n[i]; + n[i] = (spint)carry & mask; + carry >>= 28u; + } + n[13] += (spint)carry; + return -((n[13] >> 1) >> 30u); +} + +// propagate carries and add p if negative, propagate carries again +inline static int flatten(spint *n) { + spint carry = prop(n); + n[0] -= (spint)1u & carry; + n[13] += ((spint)0x41000u) & carry; + (void)prop(n); + return (int)(carry & 1); +} + +// Montgomery final subtract +static int modfsb(spint *n) { + n[0] += (spint)1u; + n[13] -= (spint)0x41000u; + return flatten(n); +} + +// Modular addition - reduce less than 2p +static void modadd(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] + b[0]; + n[1] = a[1] + b[1]; + n[2] = a[2] + b[2]; + n[3] = a[3] + b[3]; + n[4] = a[4] + b[4]; + n[5] = a[5] + b[5]; + n[6] = a[6] + b[6]; + n[7] = a[7] + b[7]; + n[8] = a[8] + b[8]; + n[9] = a[9] + b[9]; + n[10] = a[10] + b[10]; + n[11] = a[11] + b[11]; + n[12] = a[12] + b[12]; + n[13] = a[13] + b[13]; + n[0] += (spint)2u; + n[13] -= (spint)0x82000u; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[13] += ((spint)0x82000u) & carry; + (void)prop(n); +} + +// Modular subtraction - reduce less than 2p +static void modsub(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] - b[0]; + n[1] = a[1] - b[1]; + n[2] = a[2] - b[2]; + n[3] = a[3] - b[3]; + n[4] = a[4] - b[4]; + n[5] = a[5] - b[5]; + n[6] = a[6] - b[6]; + n[7] = a[7] - b[7]; + n[8] = a[8] - b[8]; + n[9] = a[9] - b[9]; + n[10] = a[10] - b[10]; + n[11] = a[11] - b[11]; + n[12] = a[12] - b[12]; + n[13] = a[13] - b[13]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[13] += ((spint)0x82000u) & carry; + (void)prop(n); +} + +// Modular negation +static void modneg(const spint *b, spint *n) { + spint carry; + n[0] = (spint)0 - b[0]; + n[1] = (spint)0 - b[1]; + n[2] = (spint)0 - b[2]; + n[3] = (spint)0 - b[3]; + n[4] = (spint)0 - b[4]; + n[5] = (spint)0 - b[5]; + n[6] = (spint)0 - b[6]; + n[7] = (spint)0 - b[7]; + n[8] = (spint)0 - b[8]; + n[9] = (spint)0 - b[9]; + n[10] = (spint)0 - b[10]; + n[11] = (spint)0 - b[11]; + n[12] = (spint)0 - b[12]; + n[13] = (spint)0 - b[13]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[13] += ((spint)0x82000u) & carry; + (void)prop(n); +} + +// Overflow limit = 18446744073709551616 +// maximum possible = 1008877845989814286 +// Modular multiplication, c=a*b mod 2p +static void modmul(const spint *a, const spint *b, spint *c) { + dpint t = 0; + spint p13 = 0x41000u; + spint q = ((spint)1 << 28u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + t += (dpint)a[0] * b[0]; + spint v0 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[1]; + t += (dpint)a[1] * b[0]; + spint v1 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[2]; + t += (dpint)a[1] * b[1]; + t += (dpint)a[2] * b[0]; + spint v2 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[3]; + t += (dpint)a[1] * b[2]; + t += (dpint)a[2] * b[1]; + t += (dpint)a[3] * b[0]; + spint v3 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[4]; + t += (dpint)a[1] * b[3]; + t += (dpint)a[2] * b[2]; + t += (dpint)a[3] * b[1]; + t += (dpint)a[4] * b[0]; + spint v4 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[5]; + t += (dpint)a[1] * b[4]; + t += (dpint)a[2] * b[3]; + t += (dpint)a[3] * b[2]; + t += (dpint)a[4] * b[1]; + t += (dpint)a[5] * b[0]; + spint v5 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[6]; + t += (dpint)a[1] * b[5]; + t += (dpint)a[2] * b[4]; + t += (dpint)a[3] * b[3]; + t += (dpint)a[4] * b[2]; + t += (dpint)a[5] * b[1]; + t += (dpint)a[6] * b[0]; + spint v6 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[7]; + t += (dpint)a[1] * b[6]; + t += (dpint)a[2] * b[5]; + t += (dpint)a[3] * b[4]; + t += (dpint)a[4] * b[3]; + t += (dpint)a[5] * b[2]; + t += (dpint)a[6] * b[1]; + t += (dpint)a[7] * b[0]; + spint v7 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[8]; + t += (dpint)a[1] * b[7]; + t += (dpint)a[2] * b[6]; + t += (dpint)a[3] * b[5]; + t += (dpint)a[4] * b[4]; + t += (dpint)a[5] * b[3]; + t += (dpint)a[6] * b[2]; + t += (dpint)a[7] * b[1]; + t += (dpint)a[8] * b[0]; + spint v8 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[9]; + t += (dpint)a[1] * b[8]; + t += (dpint)a[2] * b[7]; + t += (dpint)a[3] * b[6]; + t += (dpint)a[4] * b[5]; + t += (dpint)a[5] * b[4]; + t += (dpint)a[6] * b[3]; + t += (dpint)a[7] * b[2]; + t += (dpint)a[8] * b[1]; + t += (dpint)a[9] * b[0]; + spint v9 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[10]; + t += (dpint)a[1] * b[9]; + t += (dpint)a[2] * b[8]; + t += (dpint)a[3] * b[7]; + t += (dpint)a[4] * b[6]; + t += (dpint)a[5] * b[5]; + t += (dpint)a[6] * b[4]; + t += (dpint)a[7] * b[3]; + t += (dpint)a[8] * b[2]; + t += (dpint)a[9] * b[1]; + t += (dpint)a[10] * b[0]; + spint v10 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[11]; + t += (dpint)a[1] * b[10]; + t += (dpint)a[2] * b[9]; + t += (dpint)a[3] * b[8]; + t += (dpint)a[4] * b[7]; + t += (dpint)a[5] * b[6]; + t += (dpint)a[6] * b[5]; + t += (dpint)a[7] * b[4]; + t += (dpint)a[8] * b[3]; + t += (dpint)a[9] * b[2]; + t += (dpint)a[10] * b[1]; + t += (dpint)a[11] * b[0]; + spint v11 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[12]; + t += (dpint)a[1] * b[11]; + t += (dpint)a[2] * b[10]; + t += (dpint)a[3] * b[9]; + t += (dpint)a[4] * b[8]; + t += (dpint)a[5] * b[7]; + t += (dpint)a[6] * b[6]; + t += (dpint)a[7] * b[5]; + t += (dpint)a[8] * b[4]; + t += (dpint)a[9] * b[3]; + t += (dpint)a[10] * b[2]; + t += (dpint)a[11] * b[1]; + t += (dpint)a[12] * b[0]; + spint v12 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[0] * b[13]; + t += (dpint)a[1] * b[12]; + t += (dpint)a[2] * b[11]; + t += (dpint)a[3] * b[10]; + t += (dpint)a[4] * b[9]; + t += (dpint)a[5] * b[8]; + t += (dpint)a[6] * b[7]; + t += (dpint)a[7] * b[6]; + t += (dpint)a[8] * b[5]; + t += (dpint)a[9] * b[4]; + t += (dpint)a[10] * b[3]; + t += (dpint)a[11] * b[2]; + t += (dpint)a[12] * b[1]; + t += (dpint)a[13] * b[0]; + t += (dpint)v0 * (dpint)p13; + spint v13 = ((spint)t & mask); + t >>= 28; + t += (dpint)a[1] * b[13]; + t += (dpint)a[2] * b[12]; + t += (dpint)a[3] * b[11]; + t += (dpint)a[4] * b[10]; + t += (dpint)a[5] * b[9]; + t += (dpint)a[6] * b[8]; + t += (dpint)a[7] * b[7]; + t += (dpint)a[8] * b[6]; + t += (dpint)a[9] * b[5]; + t += (dpint)a[10] * b[4]; + t += (dpint)a[11] * b[3]; + t += (dpint)a[12] * b[2]; + t += (dpint)a[13] * b[1]; + t += (dpint)v1 * (dpint)p13; + c[0] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[2] * b[13]; + t += (dpint)a[3] * b[12]; + t += (dpint)a[4] * b[11]; + t += (dpint)a[5] * b[10]; + t += (dpint)a[6] * b[9]; + t += (dpint)a[7] * b[8]; + t += (dpint)a[8] * b[7]; + t += (dpint)a[9] * b[6]; + t += (dpint)a[10] * b[5]; + t += (dpint)a[11] * b[4]; + t += (dpint)a[12] * b[3]; + t += (dpint)a[13] * b[2]; + t += (dpint)v2 * (dpint)p13; + c[1] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[3] * b[13]; + t += (dpint)a[4] * b[12]; + t += (dpint)a[5] * b[11]; + t += (dpint)a[6] * b[10]; + t += (dpint)a[7] * b[9]; + t += (dpint)a[8] * b[8]; + t += (dpint)a[9] * b[7]; + t += (dpint)a[10] * b[6]; + t += (dpint)a[11] * b[5]; + t += (dpint)a[12] * b[4]; + t += (dpint)a[13] * b[3]; + t += (dpint)v3 * (dpint)p13; + c[2] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[4] * b[13]; + t += (dpint)a[5] * b[12]; + t += (dpint)a[6] * b[11]; + t += (dpint)a[7] * b[10]; + t += (dpint)a[8] * b[9]; + t += (dpint)a[9] * b[8]; + t += (dpint)a[10] * b[7]; + t += (dpint)a[11] * b[6]; + t += (dpint)a[12] * b[5]; + t += (dpint)a[13] * b[4]; + t += (dpint)v4 * (dpint)p13; + c[3] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[5] * b[13]; + t += (dpint)a[6] * b[12]; + t += (dpint)a[7] * b[11]; + t += (dpint)a[8] * b[10]; + t += (dpint)a[9] * b[9]; + t += (dpint)a[10] * b[8]; + t += (dpint)a[11] * b[7]; + t += (dpint)a[12] * b[6]; + t += (dpint)a[13] * b[5]; + t += (dpint)v5 * (dpint)p13; + c[4] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[6] * b[13]; + t += (dpint)a[7] * b[12]; + t += (dpint)a[8] * b[11]; + t += (dpint)a[9] * b[10]; + t += (dpint)a[10] * b[9]; + t += (dpint)a[11] * b[8]; + t += (dpint)a[12] * b[7]; + t += (dpint)a[13] * b[6]; + t += (dpint)v6 * (dpint)p13; + c[5] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[7] * b[13]; + t += (dpint)a[8] * b[12]; + t += (dpint)a[9] * b[11]; + t += (dpint)a[10] * b[10]; + t += (dpint)a[11] * b[9]; + t += (dpint)a[12] * b[8]; + t += (dpint)a[13] * b[7]; + t += (dpint)v7 * (dpint)p13; + c[6] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[8] * b[13]; + t += (dpint)a[9] * b[12]; + t += (dpint)a[10] * b[11]; + t += (dpint)a[11] * b[10]; + t += (dpint)a[12] * b[9]; + t += (dpint)a[13] * b[8]; + t += (dpint)v8 * (dpint)p13; + c[7] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[9] * b[13]; + t += (dpint)a[10] * b[12]; + t += (dpint)a[11] * b[11]; + t += (dpint)a[12] * b[10]; + t += (dpint)a[13] * b[9]; + t += (dpint)v9 * (dpint)p13; + c[8] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[10] * b[13]; + t += (dpint)a[11] * b[12]; + t += (dpint)a[12] * b[11]; + t += (dpint)a[13] * b[10]; + t += (dpint)v10 * (dpint)p13; + c[9] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[11] * b[13]; + t += (dpint)a[12] * b[12]; + t += (dpint)a[13] * b[11]; + t += (dpint)v11 * (dpint)p13; + c[10] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[12] * b[13]; + t += (dpint)a[13] * b[12]; + t += (dpint)v12 * (dpint)p13; + c[11] = ((spint)t & mask); + t >>= 28; + t += (dpint)a[13] * b[13]; + t += (dpint)v13 * (dpint)p13; + c[12] = ((spint)t & mask); + t >>= 28; + c[13] = (spint)t; +} + +// Modular squaring, c=a*a mod 2p +static void modsqr(const spint *a, spint *c) { + udpint tot; + udpint t = 0; + spint p13 = 0x41000u; + spint q = ((spint)1 << 28u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + tot = (udpint)a[0] * a[0]; + t = tot; + spint v0 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[1]; + tot *= 2; + t += tot; + spint v1 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[2]; + tot *= 2; + tot += (udpint)a[1] * a[1]; + t += tot; + spint v2 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[3]; + tot += (udpint)a[1] * a[2]; + tot *= 2; + t += tot; + spint v3 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[4]; + tot += (udpint)a[1] * a[3]; + tot *= 2; + tot += (udpint)a[2] * a[2]; + t += tot; + spint v4 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[5]; + tot += (udpint)a[1] * a[4]; + tot += (udpint)a[2] * a[3]; + tot *= 2; + t += tot; + spint v5 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[6]; + tot += (udpint)a[1] * a[5]; + tot += (udpint)a[2] * a[4]; + tot *= 2; + tot += (udpint)a[3] * a[3]; + t += tot; + spint v6 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[7]; + tot += (udpint)a[1] * a[6]; + tot += (udpint)a[2] * a[5]; + tot += (udpint)a[3] * a[4]; + tot *= 2; + t += tot; + spint v7 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[8]; + tot += (udpint)a[1] * a[7]; + tot += (udpint)a[2] * a[6]; + tot += (udpint)a[3] * a[5]; + tot *= 2; + tot += (udpint)a[4] * a[4]; + t += tot; + spint v8 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[9]; + tot += (udpint)a[1] * a[8]; + tot += (udpint)a[2] * a[7]; + tot += (udpint)a[3] * a[6]; + tot += (udpint)a[4] * a[5]; + tot *= 2; + t += tot; + spint v9 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[10]; + tot += (udpint)a[1] * a[9]; + tot += (udpint)a[2] * a[8]; + tot += (udpint)a[3] * a[7]; + tot += (udpint)a[4] * a[6]; + tot *= 2; + tot += (udpint)a[5] * a[5]; + t += tot; + spint v10 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[11]; + tot += (udpint)a[1] * a[10]; + tot += (udpint)a[2] * a[9]; + tot += (udpint)a[3] * a[8]; + tot += (udpint)a[4] * a[7]; + tot += (udpint)a[5] * a[6]; + tot *= 2; + t += tot; + spint v11 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[12]; + tot += (udpint)a[1] * a[11]; + tot += (udpint)a[2] * a[10]; + tot += (udpint)a[3] * a[9]; + tot += (udpint)a[4] * a[8]; + tot += (udpint)a[5] * a[7]; + tot *= 2; + tot += (udpint)a[6] * a[6]; + t += tot; + spint v12 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[0] * a[13]; + tot += (udpint)a[1] * a[12]; + tot += (udpint)a[2] * a[11]; + tot += (udpint)a[3] * a[10]; + tot += (udpint)a[4] * a[9]; + tot += (udpint)a[5] * a[8]; + tot += (udpint)a[6] * a[7]; + tot *= 2; + t += tot; + t += (udpint)v0 * p13; + spint v13 = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[1] * a[13]; + tot += (udpint)a[2] * a[12]; + tot += (udpint)a[3] * a[11]; + tot += (udpint)a[4] * a[10]; + tot += (udpint)a[5] * a[9]; + tot += (udpint)a[6] * a[8]; + tot *= 2; + tot += (udpint)a[7] * a[7]; + t += tot; + t += (udpint)v1 * p13; + c[0] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[2] * a[13]; + tot += (udpint)a[3] * a[12]; + tot += (udpint)a[4] * a[11]; + tot += (udpint)a[5] * a[10]; + tot += (udpint)a[6] * a[9]; + tot += (udpint)a[7] * a[8]; + tot *= 2; + t += tot; + t += (udpint)v2 * p13; + c[1] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[3] * a[13]; + tot += (udpint)a[4] * a[12]; + tot += (udpint)a[5] * a[11]; + tot += (udpint)a[6] * a[10]; + tot += (udpint)a[7] * a[9]; + tot *= 2; + tot += (udpint)a[8] * a[8]; + t += tot; + t += (udpint)v3 * p13; + c[2] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[4] * a[13]; + tot += (udpint)a[5] * a[12]; + tot += (udpint)a[6] * a[11]; + tot += (udpint)a[7] * a[10]; + tot += (udpint)a[8] * a[9]; + tot *= 2; + t += tot; + t += (udpint)v4 * p13; + c[3] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[5] * a[13]; + tot += (udpint)a[6] * a[12]; + tot += (udpint)a[7] * a[11]; + tot += (udpint)a[8] * a[10]; + tot *= 2; + tot += (udpint)a[9] * a[9]; + t += tot; + t += (udpint)v5 * p13; + c[4] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[6] * a[13]; + tot += (udpint)a[7] * a[12]; + tot += (udpint)a[8] * a[11]; + tot += (udpint)a[9] * a[10]; + tot *= 2; + t += tot; + t += (udpint)v6 * p13; + c[5] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[7] * a[13]; + tot += (udpint)a[8] * a[12]; + tot += (udpint)a[9] * a[11]; + tot *= 2; + tot += (udpint)a[10] * a[10]; + t += tot; + t += (udpint)v7 * p13; + c[6] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[8] * a[13]; + tot += (udpint)a[9] * a[12]; + tot += (udpint)a[10] * a[11]; + tot *= 2; + t += tot; + t += (udpint)v8 * p13; + c[7] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[9] * a[13]; + tot += (udpint)a[10] * a[12]; + tot *= 2; + tot += (udpint)a[11] * a[11]; + t += tot; + t += (udpint)v9 * p13; + c[8] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[10] * a[13]; + tot += (udpint)a[11] * a[12]; + tot *= 2; + t += tot; + t += (udpint)v10 * p13; + c[9] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[11] * a[13]; + tot *= 2; + tot += (udpint)a[12] * a[12]; + t += tot; + t += (udpint)v11 * p13; + c[10] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[12] * a[13]; + tot *= 2; + t += tot; + t += (udpint)v12 * p13; + c[11] = ((spint)t & mask); + t >>= 28; + tot = (udpint)a[13] * a[13]; + t += tot; + t += (udpint)v13 * p13; + c[12] = ((spint)t & mask); + t >>= 28; + c[13] = (spint)t; +} + +// copy +static void modcpy(const spint *a, spint *c) { + int i; + for (i = 0; i < 14; i++) { + c[i] = a[i]; + } +} + +// square n times +static void modnsqr(spint *a, int n) { + int i; + for (i = 0; i < n; i++) { + modsqr(a, a); + } +} + +// Calculate progenitor +static void modpro(const spint *w, spint *z) { + spint x[14]; + spint t0[14]; + spint t1[14]; + spint t2[14]; + spint t3[14]; + spint t4[14]; + spint t5[14]; + modcpy(w, x); + modsqr(x, z); + modsqr(z, t0); + modmul(x, t0, t1); + modmul(z, t1, z); + modsqr(z, t0); + modsqr(t0, t3); + modsqr(t3, t4); + modsqr(t4, t2); + modcpy(t2, t5); + modnsqr(t5, 3); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 6); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 2); + modmul(t4, t5, t5); + modnsqr(t5, 13); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 2); + modmul(t4, t5, t4); + modnsqr(t4, 28); + modmul(t2, t4, t2); + modsqr(t2, t4); + modmul(t3, t4, t3); + modnsqr(t3, 59); + modmul(t2, t3, t2); + modmul(t1, t2, t1); + modmul(z, t1, z); + modmul(t0, z, t0); + modmul(t1, t0, t1); + modsqr(t1, t2); + modmul(t1, t2, t2); + modsqr(t2, t2); + modmul(t1, t2, t2); + modmul(t0, t2, t0); + modmul(z, t0, z); + modsqr(z, t2); + modmul(z, t2, t2); + modmul(t0, t2, t0); + modmul(t1, t0, t1); + modcpy(t1, t2); + modnsqr(t2, 128); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modnsqr(t0, 125); + modmul(z, t0, z); +} + +// calculate inverse, provide progenitor h if available +static void modinv(const spint *x, const spint *h, spint *z) { + spint s[14]; + spint t[14]; + if (h == NULL) { + modpro(x, t); + } else { + modcpy(h, t); + } + modcpy(x, s); + modnsqr(t, 2); + modmul(s, t, z); +} + +// Convert m to n-residue form, n=nres(m) +static void nres(const spint *m, spint *n) { + const spint c[14] = {0xf13732fu, 0x3f03f03u, 0x3f03f0u, 0xf03f03fu, + 0x3f03f03u, 0x3f03f0u, 0xf03f03fu, 0x3f03f03u, + 0x3f03f0u, 0xf03f03fu, 0x3f03f03u, 0x3f03f0u, + 0xf03f03fu, 0x14f03u}; + modmul(m, c, n); +} + +// Convert n back to normal form, m=redc(n) +static void redc(const spint *n, spint *m) { + int i; + spint c[14]; + c[0] = 1; + for (i = 1; i < 14; i++) { + c[i] = 0; + } + modmul(n, c, m); + (void)modfsb(m); +} + +// is unity? +static int modis1(const spint *a) { + int i; + spint c[14]; + spint c0; + spint d = 0; + redc(a, c); + for (i = 1; i < 14; i++) { + d |= c[i]; + } + c0 = (spint)c[0]; + return ((spint)1 & ((d - (spint)1) >> 28u) & + (((c0 ^ (spint)1) - (spint)1) >> 28u)); +} + +// is zero? +static int modis0(const spint *a) { + int i; + spint c[14]; + spint d = 0; + redc(a, c); + for (i = 0; i < 14; i++) { + d |= c[i]; + } + return ((spint)1 & ((d - (spint)1) >> 28u)); +} + +// set to zero +static void modzer(spint *a) { + int i; + for (i = 0; i < 14; i++) { + a[i] = 0; + } +} + +// set to one +static void modone(spint *a) { + int i; + a[0] = 1; + for (i = 1; i < 14; i++) { + a[i] = 0; + } + nres(a, a); +} + +// set to integer +static void modint(int x, spint *a) { + int i; + a[0] = (spint)x; + for (i = 1; i < 14; i++) { + a[i] = 0; + } + nres(a, a); +} + +// Modular multiplication by an integer, c=a*b mod 2p +static void modmli(const spint *a, int b, spint *c) { + spint t[14]; + modint(b, t); + modmul(a, t, c); +} + +// Test for quadratic residue +static int modqr(const spint *h, const spint *x) { + spint r[14]; + if (h == NULL) { + modpro(x, r); + modsqr(r, r); + } else { + modsqr(h, r); + } + modmul(r, x, r); + return modis1(r) | modis0(x); +} + +// conditional move g to f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcmv(int b, const spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t; + spint r = 0x5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 14; i++) { + s = g[i]; + t = f[i]; + f[i] = c0 * t + c1 * s; + f[i] -= r * (t + s); + } +} + +// conditional swap g and f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcsw(int b, volatile spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t, w; + spint r = 0x5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 14; i++) { + s = g[i]; + t = f[i]; + w = r * (t + s); + f[i] = c0 * t + c1 * s; + f[i] -= w; + g[i] = c0 * s + c1 * t; + g[i] -= w; + } +} + +// Modular square root, provide progenitor h if available, NULL if not +static void modsqrt(const spint *x, const spint *h, spint *r) { + spint s[14]; + spint y[14]; + if (h == NULL) { + modpro(x, y); + } else { + modcpy(h, y); + } + modmul(y, x, s); + modcpy(s, r); +} + +// shift left by less than a word +static void modshl(unsigned int n, spint *a) { + int i; + a[13] = ((a[13] << n)) | (a[12] >> (28u - n)); + for (i = 12; i > 0; i--) { + a[i] = ((a[i] << n) & (spint)0xfffffff) | (a[i - 1] >> (28u - n)); + } + a[0] = (a[0] << n) & (spint)0xfffffff; +} + +// shift right by less than a word. Return shifted out part +static int modshr(unsigned int n, spint *a) { + int i; + spint r = a[0] & (((spint)1 << n) - (spint)1); + for (i = 0; i < 13; i++) { + a[i] = (a[i] >> n) | ((a[i + 1] << (28u - n)) & (spint)0xfffffff); + } + a[13] = a[13] >> n; + return r; +} + +// set a= 2^r +static void mod2r(unsigned int r, spint *a) { + unsigned int n = r / 28u; + unsigned int m = r % 28u; + modzer(a); + if (r >= 48 * 8) + return; + a[n] = 1; + a[n] <<= m; + nres(a, a); +} + +// export to byte array +static void modexp(const spint *a, char *b) { + int i; + spint c[14]; + redc(a, c); + for (i = 47; i >= 0; i--) { + b[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +// import from byte array +// returns 1 if in range, else 0 +static int modimp(const char *b, spint *a) { + int i, res; + for (i = 0; i < 14; i++) { + a[i] = 0; + } + for (i = 0; i < 48; i++) { + modshl(8, a); + a[0] += (spint)(unsigned char)b[i]; + } + res = modfsb(a); + nres(a, a); + return res; +} + +// determine sign +static int modsign(const spint *a) { + spint c[14]; + redc(a, c); + return c[0] % 2; +} + +// return true if equal +static int modcmp(const spint *a, const spint *b) { + spint c[14], d[14]; + int i, eq = 1; + redc(a, c); + redc(b, d); + for (i = 0; i < 14; i++) { + eq &= (((c[i] ^ d[i]) - 1) >> 28) & 1; + } + return eq; +} + +// clang-format on +/****************************************************************************** + API functions calling generated code above + ******************************************************************************/ + +#include + +const digit_t ZERO[NWORDS_FIELD] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; +const digit_t ONE[NWORDS_FIELD] = { + 0x000003f0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000 +}; +// Montgomery representation of 2^-1 +static const digit_t TWO_INV[NWORDS_FIELD] = { 0x000001f8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00008000 }; +// Montgomery representation of 3^-1 +static const digit_t THREE_INV[NWORDS_FIELD] = { 0x0aaaabfa, 0x0aaaaaaa, 0x0aaaaaaa, 0x0aaaaaaa, 0x0aaaaaaa, + 0x0aaaaaaa, 0x0aaaaaaa, 0x0aaaaaaa, 0x0aaaaaaa, 0x0aaaaaaa, + 0x0aaaaaaa, 0x0aaaaaaa, 0x0aaaaaaa, 0x00030aaa }; +// Montgomery representation of 2^384 +static const digit_t R2[NWORDS_FIELD] = { 0x003f1373, 0x0f03f03f, 0x03f03f03, 0x003f03f0, 0x0f03f03f, + 0x03f03f03, 0x003f03f0, 0x0f03f03f, 0x03f03f03, 0x003f03f0, + 0x0f03f03f, 0x03f03f03, 0x003f03f0, 0x0000c03f }; + +void +fp_set_small(fp_t *x, const digit_t val) +{ + modint((int)val, *x); +} + +void +fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val) +{ + modmli(*a, (int)val, *x); +} + +void +fp_set_zero(fp_t *x) +{ + modzer(*x); +} + +void +fp_set_one(fp_t *x) +{ + modone(*x); +} + +uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return -(uint32_t)modcmp(*a, *b); +} + +uint32_t +fp_is_zero(const fp_t *a) +{ + return -(uint32_t)modis0(*a); +} + +void +fp_copy(fp_t *out, const fp_t *a) +{ + modcpy(*a, *out); +} + +void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + modcsw((int)(ctl & 0x1), *a, *b); +} + +void +fp_add(fp_t *out, const fp_t *a, const fp_t *b) +{ + modadd(*a, *b, *out); +} + +void +fp_sub(fp_t *out, const fp_t *a, const fp_t *b) +{ + modsub(*a, *b, *out); +} + +void +fp_neg(fp_t *out, const fp_t *a) +{ + modneg(*a, *out); +} + +void +fp_sqr(fp_t *out, const fp_t *a) +{ + modsqr(*a, *out); +} + +void +fp_mul(fp_t *out, const fp_t *a, const fp_t *b) +{ + modmul(*a, *b, *out); +} + +void +fp_inv(fp_t *x) +{ + modinv(*x, NULL, *x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + return -(uint32_t)modqr(NULL, *a); +} + +void +fp_sqrt(fp_t *a) +{ + modsqrt(*a, NULL, *a); +} + +void +fp_half(fp_t *out, const fp_t *a) +{ + modmul(TWO_INV, *a, *out); +} + +void +fp_exp3div4(fp_t *out, const fp_t *a) +{ + modpro(*a, *out); +} + +void +fp_div3(fp_t *out, const fp_t *a) +{ + modmul(THREE_INV, *a, *out); +} + +void +fp_encode(void *dst, const fp_t *a) +{ + // Modified version of modexp() + int i; + spint c[14]; + redc(*a, c); + for (i = 0; i < 48; i++) { + ((char *)dst)[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +uint32_t +fp_decode(fp_t *d, const void *src) +{ + // Modified version of modimp() + int i; + spint res; + const unsigned char *b = src; + for (i = 0; i < 14; i++) { + (*d)[i] = 0; + } + for (i = 47; i >= 0; i--) { + modshl(8, *d); + (*d)[0] += (spint)b[i]; + } + res = (spint)-modfsb(*d); + nres(*d, *d); + // If the value was canonical then res = -1; otherwise, res = 0 + for (i = 0; i < 14; i++) { + (*d)[i] &= res; + } + return (uint32_t)res; +} + +static inline unsigned char +add_carry(unsigned char cc, spint a, spint b, spint *d) +{ + udpint t = (udpint)a + (udpint)b + cc; + *d = (spint)t; + return (unsigned char)(t >> Wordlength); +} + +static void +partial_reduce(spint *out, const spint *src) +{ + spint h, l, quo, rem; + unsigned char cc; + + // Split value in high (8 bits) and low (376 bits) parts. + h = src[11] >> 24; + l = src[11] & 0x00FFFFFF; + + // 65*2^376 = 1 mod q; hence, we add floor(h/65) + (h mod 65)*2^376 + // to the low part. + quo = (h * 0xFC1) >> 18; + rem = h - (65 * quo); + cc = add_carry(0, src[0], quo, &out[0]); + cc = add_carry(cc, src[1], 0, &out[1]); + cc = add_carry(cc, src[2], 0, &out[2]); + cc = add_carry(cc, src[3], 0, &out[3]); + cc = add_carry(cc, src[4], 0, &out[4]); + cc = add_carry(cc, src[5], 0, &out[5]); + cc = add_carry(cc, src[6], 0, &out[6]); + cc = add_carry(cc, src[7], 0, &out[7]); + cc = add_carry(cc, src[8], 0, &out[8]); + cc = add_carry(cc, src[9], 0, &out[9]); + cc = add_carry(cc, src[10], 0, &out[10]); + (void)add_carry(cc, l, rem << 24, &out[11]); +} + +// Little-endian encoding of a 32-bit integer. +static inline void +enc32le(void *dst, uint32_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); +} + +// Little-endian decoding of a 32-bit integer. +static inline uint32_t +dec32le(const void *src) +{ + const uint8_t *buf = src; + return (spint)buf[0] | ((spint)buf[1] << 8) | ((spint)buf[2] << 16) | ((spint)buf[3] << 24); +} + +void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + uint32_t t[12]; // Stores Nbytes * 8 bits + uint8_t tmp[48]; // Nbytes + const uint8_t *b = src; + + fp_set_zero(d); + if (len == 0) { + return; + } + + size_t rem = len % 48; + if (rem != 0) { + // Input size is not a multiple of 48, we decode a partial + // block, which is already less than 2^376. + size_t k = len - rem; + memcpy(tmp, b + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + fp_decode(d, tmp); + len = k; + } + // Process all remaining blocks, in descending address order. + while (len > 0) { + fp_mul(d, d, &R2); + len -= 48; + t[0] = dec32le(b + len); + t[1] = dec32le(b + len + 4); + t[2] = dec32le(b + len + 8); + t[3] = dec32le(b + len + 12); + t[4] = dec32le(b + len + 16); + t[5] = dec32le(b + len + 20); + t[6] = dec32le(b + len + 24); + t[7] = dec32le(b + len + 28); + t[8] = dec32le(b + len + 32); + t[9] = dec32le(b + len + 36); + t[10] = dec32le(b + len + 40); + t[11] = dec32le(b + len + 44); + partial_reduce(t, t); + enc32le(tmp, t[0]); + enc32le(tmp + 4, t[1]); + enc32le(tmp + 8, t[2]); + enc32le(tmp + 12, t[3]); + enc32le(tmp + 16, t[4]); + enc32le(tmp + 20, t[5]); + enc32le(tmp + 24, t[6]); + enc32le(tmp + 28, t[7]); + enc32le(tmp + 32, t[8]); + enc32le(tmp + 36, t[9]); + enc32le(tmp + 40, t[10]); + enc32le(tmp + 44, t[11]); + fp_t a; + fp_decode(&a, tmp); + fp_add(d, d, &a); + } +} diff --git a/src/gf/ref/lvl3/fp_p65376_64.c b/src/gf/ref/lvl3/fp_p65376_64.c new file mode 100644 index 0000000..539cde5 --- /dev/null +++ b/src/gf/ref/lvl3/fp_p65376_64.c @@ -0,0 +1,872 @@ +// clang-format off +// Command line : python monty.py 64 +// 0x40ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +#include +#include + +#define sspint int64_t +#define spint uint64_t +#define udpint __uint128_t +#define dpint __uint128_t + +#define Wordlength 64 +#define Nlimbs 7 +#define Radix 55 +#define Nbits 383 +#define Nbytes 48 + +#define MONTGOMERY +// propagate carries +inline static spint prop(spint *n) { + int i; + spint mask = ((spint)1 << 55u) - (spint)1; + sspint carry = (sspint)n[0]; + carry >>= 55u; + n[0] &= mask; + for (i = 1; i < 6; i++) { + carry += (sspint)n[i]; + n[i] = (spint)carry & mask; + carry >>= 55u; + } + n[6] += (spint)carry; + return -((n[6] >> 1) >> 62u); +} + +// propagate carries and add p if negative, propagate carries again +inline static int flatten(spint *n) { + spint carry = prop(n); + n[0] -= (spint)1u & carry; + n[6] += ((spint)0x10400000000000u) & carry; + (void)prop(n); + return (int)(carry & 1); +} + +// Montgomery final subtract +inline static int modfsb(spint *n) { + n[0] += (spint)1u; + n[6] -= (spint)0x10400000000000u; + return flatten(n); +} + +// Modular addition - reduce less than 2p +inline static void modadd(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] + b[0]; + n[1] = a[1] + b[1]; + n[2] = a[2] + b[2]; + n[3] = a[3] + b[3]; + n[4] = a[4] + b[4]; + n[5] = a[5] + b[5]; + n[6] = a[6] + b[6]; + n[0] += (spint)2u; + n[6] -= (spint)0x20800000000000u; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[6] += ((spint)0x20800000000000u) & carry; + (void)prop(n); +} + +// Modular subtraction - reduce less than 2p +inline static void modsub(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] - b[0]; + n[1] = a[1] - b[1]; + n[2] = a[2] - b[2]; + n[3] = a[3] - b[3]; + n[4] = a[4] - b[4]; + n[5] = a[5] - b[5]; + n[6] = a[6] - b[6]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[6] += ((spint)0x20800000000000u) & carry; + (void)prop(n); +} + +// Modular negation +inline static void modneg(const spint *b, spint *n) { + spint carry; + n[0] = (spint)0 - b[0]; + n[1] = (spint)0 - b[1]; + n[2] = (spint)0 - b[2]; + n[3] = (spint)0 - b[3]; + n[4] = (spint)0 - b[4]; + n[5] = (spint)0 - b[5]; + n[6] = (spint)0 - b[6]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[6] += ((spint)0x20800000000000u) & carry; + (void)prop(n); +} + +// Overflow limit = 340282366920938463463374607431768211456 +// maximum possible = 9251314080475062396111552646217735 +// Modular multiplication, c=a*b mod 2p +inline static void modmul(const spint *a, const spint *b, spint *c) { + dpint t = 0; + spint p6 = 0x10400000000000u; + spint q = ((spint)1 << 55u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + t += (dpint)a[0] * b[0]; + spint v0 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[0] * b[1]; + t += (dpint)a[1] * b[0]; + spint v1 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[0] * b[2]; + t += (dpint)a[1] * b[1]; + t += (dpint)a[2] * b[0]; + spint v2 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[0] * b[3]; + t += (dpint)a[1] * b[2]; + t += (dpint)a[2] * b[1]; + t += (dpint)a[3] * b[0]; + spint v3 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[0] * b[4]; + t += (dpint)a[1] * b[3]; + t += (dpint)a[2] * b[2]; + t += (dpint)a[3] * b[1]; + t += (dpint)a[4] * b[0]; + spint v4 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[0] * b[5]; + t += (dpint)a[1] * b[4]; + t += (dpint)a[2] * b[3]; + t += (dpint)a[3] * b[2]; + t += (dpint)a[4] * b[1]; + t += (dpint)a[5] * b[0]; + spint v5 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[0] * b[6]; + t += (dpint)a[1] * b[5]; + t += (dpint)a[2] * b[4]; + t += (dpint)a[3] * b[3]; + t += (dpint)a[4] * b[2]; + t += (dpint)a[5] * b[1]; + t += (dpint)a[6] * b[0]; + t += (dpint)v0 * (dpint)p6; + spint v6 = ((spint)t & mask); + t >>= 55; + t += (dpint)a[1] * b[6]; + t += (dpint)a[2] * b[5]; + t += (dpint)a[3] * b[4]; + t += (dpint)a[4] * b[3]; + t += (dpint)a[5] * b[2]; + t += (dpint)a[6] * b[1]; + t += (dpint)v1 * (dpint)p6; + c[0] = ((spint)t & mask); + t >>= 55; + t += (dpint)a[2] * b[6]; + t += (dpint)a[3] * b[5]; + t += (dpint)a[4] * b[4]; + t += (dpint)a[5] * b[3]; + t += (dpint)a[6] * b[2]; + t += (dpint)v2 * (dpint)p6; + c[1] = ((spint)t & mask); + t >>= 55; + t += (dpint)a[3] * b[6]; + t += (dpint)a[4] * b[5]; + t += (dpint)a[5] * b[4]; + t += (dpint)a[6] * b[3]; + t += (dpint)v3 * (dpint)p6; + c[2] = ((spint)t & mask); + t >>= 55; + t += (dpint)a[4] * b[6]; + t += (dpint)a[5] * b[5]; + t += (dpint)a[6] * b[4]; + t += (dpint)v4 * (dpint)p6; + c[3] = ((spint)t & mask); + t >>= 55; + t += (dpint)a[5] * b[6]; + t += (dpint)a[6] * b[5]; + t += (dpint)v5 * (dpint)p6; + c[4] = ((spint)t & mask); + t >>= 55; + t += (dpint)a[6] * b[6]; + t += (dpint)v6 * (dpint)p6; + c[5] = ((spint)t & mask); + t >>= 55; + c[6] = (spint)t; +} + +// Modular squaring, c=a*a mod 2p +inline static void modsqr(const spint *a, spint *c) { + udpint tot; + udpint t = 0; + spint p6 = 0x10400000000000u; + spint q = ((spint)1 << 55u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + tot = (udpint)a[0] * a[0]; + t = tot; + spint v0 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[0] * a[1]; + tot *= 2; + t += tot; + spint v1 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[0] * a[2]; + tot *= 2; + tot += (udpint)a[1] * a[1]; + t += tot; + spint v2 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[0] * a[3]; + tot += (udpint)a[1] * a[2]; + tot *= 2; + t += tot; + spint v3 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[0] * a[4]; + tot += (udpint)a[1] * a[3]; + tot *= 2; + tot += (udpint)a[2] * a[2]; + t += tot; + spint v4 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[0] * a[5]; + tot += (udpint)a[1] * a[4]; + tot += (udpint)a[2] * a[3]; + tot *= 2; + t += tot; + spint v5 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[0] * a[6]; + tot += (udpint)a[1] * a[5]; + tot += (udpint)a[2] * a[4]; + tot *= 2; + tot += (udpint)a[3] * a[3]; + t += tot; + t += (udpint)v0 * p6; + spint v6 = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[1] * a[6]; + tot += (udpint)a[2] * a[5]; + tot += (udpint)a[3] * a[4]; + tot *= 2; + t += tot; + t += (udpint)v1 * p6; + c[0] = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[2] * a[6]; + tot += (udpint)a[3] * a[5]; + tot *= 2; + tot += (udpint)a[4] * a[4]; + t += tot; + t += (udpint)v2 * p6; + c[1] = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[3] * a[6]; + tot += (udpint)a[4] * a[5]; + tot *= 2; + t += tot; + t += (udpint)v3 * p6; + c[2] = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[4] * a[6]; + tot *= 2; + tot += (udpint)a[5] * a[5]; + t += tot; + t += (udpint)v4 * p6; + c[3] = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[5] * a[6]; + tot *= 2; + t += tot; + t += (udpint)v5 * p6; + c[4] = ((spint)t & mask); + t >>= 55; + tot = (udpint)a[6] * a[6]; + t += tot; + t += (udpint)v6 * p6; + c[5] = ((spint)t & mask); + t >>= 55; + c[6] = (spint)t; +} + +// copy +inline static void modcpy(const spint *a, spint *c) { + int i; + for (i = 0; i < 7; i++) { + c[i] = a[i]; + } +} + +// square n times +static void modnsqr(spint *a, int n) { + int i; + for (i = 0; i < n; i++) { + modsqr(a, a); + } +} + +// Calculate progenitor +static void modpro(const spint *w, spint *z) { + spint x[7]; + spint t0[7]; + spint t1[7]; + spint t2[7]; + spint t3[7]; + spint t4[7]; + spint t5[7]; + modcpy(w, x); + modsqr(x, z); + modsqr(z, t0); + modmul(x, t0, t1); + modmul(z, t1, z); + modsqr(z, t0); + modsqr(t0, t3); + modsqr(t3, t4); + modsqr(t4, t2); + modcpy(t2, t5); + modnsqr(t5, 3); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 6); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 2); + modmul(t4, t5, t5); + modnsqr(t5, 13); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 2); + modmul(t4, t5, t4); + modnsqr(t4, 28); + modmul(t2, t4, t2); + modsqr(t2, t4); + modmul(t3, t4, t3); + modnsqr(t3, 59); + modmul(t2, t3, t2); + modmul(t1, t2, t1); + modmul(z, t1, z); + modmul(t0, z, t0); + modmul(t1, t0, t1); + modsqr(t1, t2); + modmul(t1, t2, t2); + modsqr(t2, t2); + modmul(t1, t2, t2); + modmul(t0, t2, t0); + modmul(z, t0, z); + modsqr(z, t2); + modmul(z, t2, t2); + modmul(t0, t2, t0); + modmul(t1, t0, t1); + modcpy(t1, t2); + modnsqr(t2, 128); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modnsqr(t0, 125); + modmul(z, t0, z); +} + +// calculate inverse, provide progenitor h if available +static void modinv(const spint *x, const spint *h, spint *z) { + spint s[7]; + spint t[7]; + if (h == NULL) { + modpro(x, t); + } else { + modcpy(h, t); + } + modcpy(x, s); + modnsqr(t, 2); + modmul(s, t, z); +} + +// Convert m to n-residue form, n=nres(m) +static void nres(const spint *m, spint *n) { + const spint c[7] = {0xfc0fc0fc0fc4du, 0x781f81f81f81f8u, 0x3f03f03f03f03u, + 0x7e07e07e07e07eu, 0x40fc0fc0fc0fc0u, 0x1f81f81f81f81fu, + 0xcff03f03f03f0u}; + modmul(m, c, n); +} + +// Convert n back to normal form, m=redc(n) +static void redc(const spint *n, spint *m) { + int i; + spint c[7]; + c[0] = 1; + for (i = 1; i < 7; i++) { + c[i] = 0; + } + modmul(n, c, m); + (void)modfsb(m); +} + +// is unity? +static int modis1(const spint *a) { + int i; + spint c[7]; + spint c0; + spint d = 0; + redc(a, c); + for (i = 1; i < 7; i++) { + d |= c[i]; + } + c0 = (spint)c[0]; + return ((spint)1 & ((d - (spint)1) >> 55u) & + (((c0 ^ (spint)1) - (spint)1) >> 55u)); +} + +// is zero? +static int modis0(const spint *a) { + int i; + spint c[7]; + spint d = 0; + redc(a, c); + for (i = 0; i < 7; i++) { + d |= c[i]; + } + return ((spint)1 & ((d - (spint)1) >> 55u)); +} + +// set to zero +static void modzer(spint *a) { + int i; + for (i = 0; i < 7; i++) { + a[i] = 0; + } +} + +// set to one +static void modone(spint *a) { + int i; + a[0] = 1; + for (i = 1; i < 7; i++) { + a[i] = 0; + } + nres(a, a); +} + +// set to integer +static void modint(int x, spint *a) { + int i; + a[0] = (spint)x; + for (i = 1; i < 7; i++) { + a[i] = 0; + } + nres(a, a); +} + +// Modular multiplication by an integer, c=a*b mod 2p +inline static void modmli(const spint *a, int b, spint *c) { + spint t[7]; + modint(b, t); + modmul(a, t, c); +} + +// Test for quadratic residue +static int modqr(const spint *h, const spint *x) { + spint r[7]; + if (h == NULL) { + modpro(x, r); + modsqr(r, r); + } else { + modsqr(h, r); + } + modmul(r, x, r); + return modis1(r) | modis0(x); +} + +// conditional move g to f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcmv(int b, const spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t; + spint r = 0x3cc3c33c5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 7; i++) { + s = g[i]; + t = f[i]; + f[i] = c0 * t + c1 * s; + f[i] -= r * (t + s); + } +} + +// conditional swap g and f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcsw(int b, volatile spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t, w; + spint r = 0x3cc3c33c5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 7; i++) { + s = g[i]; + t = f[i]; + w = r * (t + s); + f[i] = c0 * t + c1 * s; + f[i] -= w; + g[i] = c0 * s + c1 * t; + g[i] -= w; + } +} + +// Modular square root, provide progenitor h if available, NULL if not +static void modsqrt(const spint *x, const spint *h, spint *r) { + spint s[7]; + spint y[7]; + if (h == NULL) { + modpro(x, y); + } else { + modcpy(h, y); + } + modmul(y, x, s); + modcpy(s, r); +} + +// shift left by less than a word +static void modshl(unsigned int n, spint *a) { + int i; + a[6] = ((a[6] << n)) | (a[5] >> (55u - n)); + for (i = 5; i > 0; i--) { + a[i] = ((a[i] << n) & (spint)0x7fffffffffffff) | (a[i - 1] >> (55u - n)); + } + a[0] = (a[0] << n) & (spint)0x7fffffffffffff; +} + +// shift right by less than a word. Return shifted out part +static int modshr(unsigned int n, spint *a) { + int i; + spint r = a[0] & (((spint)1 << n) - (spint)1); + for (i = 0; i < 6; i++) { + a[i] = (a[i] >> n) | ((a[i + 1] << (55u - n)) & (spint)0x7fffffffffffff); + } + a[6] = a[6] >> n; + return r; +} + +// set a= 2^r +static void mod2r(unsigned int r, spint *a) { + unsigned int n = r / 55u; + unsigned int m = r % 55u; + modzer(a); + if (r >= 48 * 8) + return; + a[n] = 1; + a[n] <<= m; + nres(a, a); +} + +// export to byte array +static void modexp(const spint *a, char *b) { + int i; + spint c[7]; + redc(a, c); + for (i = 47; i >= 0; i--) { + b[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +// import from byte array +// returns 1 if in range, else 0 +static int modimp(const char *b, spint *a) { + int i, res; + for (i = 0; i < 7; i++) { + a[i] = 0; + } + for (i = 0; i < 48; i++) { + modshl(8, a); + a[0] += (spint)(unsigned char)b[i]; + } + res = modfsb(a); + nres(a, a); + return res; +} + +// determine sign +static int modsign(const spint *a) { + spint c[7]; + redc(a, c); + return c[0] % 2; +} + +// return true if equal +static int modcmp(const spint *a, const spint *b) { + spint c[7], d[7]; + int i, eq = 1; + redc(a, c); + redc(b, d); + for (i = 0; i < 7; i++) { + eq &= (((c[i] ^ d[i]) - 1) >> 55) & 1; + } + return eq; +} + +// clang-format on +/****************************************************************************** + API functions calling generated code above + ******************************************************************************/ + +#include + +const digit_t ZERO[NWORDS_FIELD] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; +const digit_t ONE[NWORDS_FIELD] = { 0x0000000000000007, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x000e400000000000 }; +// Montgomery representation of 2^-1 +static const digit_t TWO_INV[NWORDS_FIELD] = { 0x0000000000000003, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x000f400000000000 }; +// Montgomery representation of 3^-1 +static const digit_t THREE_INV[NWORDS_FIELD] = { 0x0055555555555557, 0x002aaaaaaaaaaaaa, 0x0055555555555555, + 0x002aaaaaaaaaaaaa, 0x0055555555555555, 0x002aaaaaaaaaaaaa, + 0x000f955555555555 }; +// Montgomery representation of 2^384 +static const digit_t R2[NWORDS_FIELD] = { 0x0007e07e07e07e26, 0x007c0fc0fc0fc0fc, 0x0001f81f81f81f81, + 0x003f03f03f03f03f, 0x00607e07e07e07e0, 0x000fc0fc0fc0fc0f, + 0x000e9f81f81f81f8 }; + +void +fp_set_small(fp_t *x, const digit_t val) +{ + modint((int)val, *x); +} + +void +fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val) +{ + modmli(*a, (int)val, *x); +} + +void +fp_set_zero(fp_t *x) +{ + modzer(*x); +} + +void +fp_set_one(fp_t *x) +{ + modone(*x); +} + +uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return -(uint32_t)modcmp(*a, *b); +} + +uint32_t +fp_is_zero(const fp_t *a) +{ + return -(uint32_t)modis0(*a); +} + +void +fp_copy(fp_t *out, const fp_t *a) +{ + modcpy(*a, *out); +} + +void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + modcsw((int)(ctl & 0x1), *a, *b); +} + +void +fp_add(fp_t *out, const fp_t *a, const fp_t *b) +{ + modadd(*a, *b, *out); +} + +void +fp_sub(fp_t *out, const fp_t *a, const fp_t *b) +{ + modsub(*a, *b, *out); +} + +void +fp_neg(fp_t *out, const fp_t *a) +{ + modneg(*a, *out); +} + +void +fp_sqr(fp_t *out, const fp_t *a) +{ + modsqr(*a, *out); +} + +void +fp_mul(fp_t *out, const fp_t *a, const fp_t *b) +{ + modmul(*a, *b, *out); +} + +void +fp_inv(fp_t *x) +{ + modinv(*x, NULL, *x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + return -(uint32_t)modqr(NULL, *a); +} + +void +fp_sqrt(fp_t *a) +{ + modsqrt(*a, NULL, *a); +} + +void +fp_half(fp_t *out, const fp_t *a) +{ + modmul(TWO_INV, *a, *out); +} + +void +fp_exp3div4(fp_t *out, const fp_t *a) +{ + modpro(*a, *out); +} + +void +fp_div3(fp_t *out, const fp_t *a) +{ + modmul(THREE_INV, *a, *out); +} + +void +fp_encode(void *dst, const fp_t *a) +{ + // Modified version of modexp() + int i; + spint c[7]; + redc(*a, c); + for (i = 0; i < 48; i++) { + ((char *)dst)[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +uint32_t +fp_decode(fp_t *d, const void *src) +{ + // Modified version of modimp() + int i; + spint res; + const unsigned char *b = src; + for (i = 0; i < 7; i++) { + (*d)[i] = 0; + } + for (i = 47; i >= 0; i--) { + modshl(8, *d); + (*d)[0] += (spint)b[i]; + } + res = (spint)-modfsb(*d); + nres(*d, *d); + // If the value was canonical then res = -1; otherwise, res = 0 + for (i = 0; i < 7; i++) { + (*d)[i] &= res; + } + return (uint32_t)res; +} + +static inline unsigned char +add_carry(unsigned char cc, spint a, spint b, spint *d) +{ + udpint t = (udpint)a + (udpint)b + cc; + *d = (spint)t; + return (unsigned char)(t >> Wordlength); +} + +static void +partial_reduce(spint *out, const spint *src) +{ + spint h, l, quo, rem; + unsigned char cc; + + // Split value in high (8 bits) and low (376 bits) parts. + h = src[5] >> 56; + l = src[5] & 0x00FFFFFFFFFFFFFF; + + // 65*2^376 = 1 mod q; hence, we add floor(h/65) + (h mod 65)*2^376 + // to the low part. + quo = (h * 0xFC1) >> 18; + rem = h - (65 * quo); + cc = add_carry(0, src[0], quo, &out[0]); + cc = add_carry(cc, src[1], 0, &out[1]); + cc = add_carry(cc, src[2], 0, &out[2]); + cc = add_carry(cc, src[3], 0, &out[3]); + cc = add_carry(cc, src[4], 0, &out[4]); + (void)add_carry(cc, l, rem << 56, &out[5]); +} + +// Little-endian encoding of a 64-bit integer. +static inline void +enc64le(void *dst, uint64_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); + buf[4] = (uint8_t)(x >> 32); + buf[5] = (uint8_t)(x >> 40); + buf[6] = (uint8_t)(x >> 48); + buf[7] = (uint8_t)(x >> 56); +} + +// Little-endian decoding of a 64-bit integer. +static inline uint64_t +dec64le(const void *src) +{ + const uint8_t *buf = src; + return (spint)buf[0] | ((spint)buf[1] << 8) | ((spint)buf[2] << 16) | ((spint)buf[3] << 24) | + ((spint)buf[4] << 32) | ((spint)buf[5] << 40) | ((spint)buf[6] << 48) | ((spint)buf[7] << 56); +} + +void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + uint64_t t[6]; // Stores Nbytes * 8 bits + uint8_t tmp[48]; // Nbytes + const uint8_t *b = src; + + fp_set_zero(d); + if (len == 0) { + return; + } + + size_t rem = len % 48; + if (rem != 0) { + // Input size is not a multiple of 48, we decode a partial + // block, which is already less than 2^376. + size_t k = len - rem; + memcpy(tmp, b + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + fp_decode(d, tmp); + len = k; + } + // Process all remaining blocks, in descending address order. + while (len > 0) { + fp_mul(d, d, &R2); + len -= 48; + t[0] = dec64le(b + len); + t[1] = dec64le(b + len + 8); + t[2] = dec64le(b + len + 16); + t[3] = dec64le(b + len + 24); + t[4] = dec64le(b + len + 32); + t[5] = dec64le(b + len + 40); + partial_reduce(t, t); + enc64le(tmp, t[0]); + enc64le(tmp + 8, t[1]); + enc64le(tmp + 16, t[2]); + enc64le(tmp + 24, t[3]); + enc64le(tmp + 32, t[4]); + enc64le(tmp + 40, t[5]); + fp_t a; + fp_decode(&a, tmp); + fp_add(d, d, &a); + } +} diff --git a/src/gf/ref/lvl3/include/fp.h b/src/gf/ref/lvl3/include/fp.h deleted file mode 100644 index 7fb11af..0000000 --- a/src/gf/ref/lvl3/include/fp.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef FP_H -#define FP_H - -//////////////////////////////////////////////// NOTE: this is placed here for now -#include -#include -#include -#include -#include -#include -#include - -typedef digit_t fp_t[NWORDS_FIELD]; // Datatype for representing field elements - -void fp_set(digit_t* x, const digit_t val); -bool fp_is_equal(const digit_t* a, const digit_t* b); -bool fp_is_zero(const digit_t* a); -void fp_copy(digit_t* out, const digit_t* a); -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords); -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords); -void fp_add(digit_t* out, const digit_t* a, const digit_t* b); -void fp_sub(digit_t* out, const digit_t* a, const digit_t* b); -void fp_neg(digit_t* out, const digit_t* a); -void fp_sqr(digit_t* out, const digit_t* a); -void fp_mul(digit_t* out, const digit_t* a, const digit_t* b); -void MUL(digit_t* out, const digit_t a, const digit_t b); -void fp_inv(digit_t* x); -bool fp_is_square(const digit_t* a); -void fp_sqrt(digit_t* a); -void fp_tomont(digit_t* out, const digit_t* a); -void fp_frommont(digit_t* out, const digit_t* a); -void fp_mont_setone(digit_t* out); - -/********************** Constant-time unsigned comparisons ***********************/ - -// The following functions return 1 (TRUE) if condition is true, 0 (FALSE) otherwise - -static inline unsigned int is_digit_nonzero_ct(digit_t x) -{ // Is x != 0? - return (unsigned int)((x | (0 - x)) >> (RADIX - 1)); -} - -static inline unsigned int is_digit_zero_ct(digit_t x) -{ // Is x = 0? - return (unsigned int)(1 ^ is_digit_nonzero_ct(x)); -} - -static inline unsigned int is_digit_lessthan_ct(digit_t x, digit_t y) -{ // Is x < y? - return (unsigned int)((x ^ ((x ^ y) | ((x - y) ^ y))) >> (RADIX - 1)); -} - -/********************** Platform-independent macros for digit-size operations **********************/ - -// Digit addition with carry -#define ADDC(sumOut, carryOut, addend1, addend2, carryIn) \ - { digit_t tempReg = (addend1) + (digit_t)(carryIn); \ - (sumOut) = (addend2) + tempReg; \ - (carryOut) = (is_digit_lessthan_ct(tempReg, (digit_t)(carryIn)) | is_digit_lessthan_ct((sumOut), tempReg)); } - -// Digit subtraction with borrow -#define SUBC(differenceOut, borrowOut, minuend, subtrahend, borrowIn) \ - { digit_t tempReg = (minuend) - (subtrahend); \ - unsigned int borrowReg = (is_digit_lessthan_ct((minuend), (subtrahend)) | ((borrowIn) & is_digit_zero_ct(tempReg))); \ - (differenceOut) = tempReg - (digit_t)(borrowIn); \ - (borrowOut) = borrowReg; } - -// Shift right with flexible datatype -#define SHIFTR(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((lowIn) >> (shift)) ^ ((highIn) << (DigitSize - (shift))); - -// Digit shift left -#define SHIFTL(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((highIn) << (shift)) ^ ((lowIn) >> (RADIX - (shift))); - -#endif \ No newline at end of file diff --git a/src/gf/ref/lvl3/include/fp2.h b/src/gf/ref/lvl3/include/fp2.h deleted file mode 100644 index 8015de0..0000000 --- a/src/gf/ref/lvl3/include/fp2.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef FP2_H -#define FP2_H - -#include "fp.h" - -// Structure for representing elements in GF(p^2) -typedef struct fp2_t { - fp_t re, im; -} fp2_t; - -void fp2_set(fp2_t* x, const digit_t val); -bool fp2_is_zero(const fp2_t* a); -bool fp2_is_equal(const fp2_t* a, const fp2_t* b); -void fp2_copy(fp2_t* x, const fp2_t* y); -fp2_t fp2_non_residue(); -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_neg(fp2_t* x, const fp2_t* y); -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sqr(fp2_t* x, const fp2_t* y); -void fp2_inv(fp2_t* x); -bool fp2_is_square(const fp2_t* x); -void fp2_frob(fp2_t* x, const fp2_t* y); -void fp2_sqrt(fp2_t* x); -void fp2_tomont(fp2_t* x, const fp2_t* y); -void fp2_frommont(fp2_t* x, const fp2_t* y); -int fp2_cmp(fp2_t* x, fp2_t* y); - -#endif diff --git a/src/gf/ref/lvl3/test/CMakeLists.txt b/src/gf/ref/lvl3/test/CMakeLists.txt index 2f769a7..316e0a8 100644 --- a/src/gf/ref/lvl3/test/CMakeLists.txt +++ b/src/gf/ref/lvl3/test/CMakeLists.txt @@ -1,9 +1 @@ -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp test_fp.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp sqisign_test_gf_${SVARIANT_LOWER}_fp test ${SQISIGN_TEST_REPS}) - -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp2 test_fp2.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp2 PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp2 sqisign_test_gf_${SVARIANT_LOWER}_fp2 test ${SQISIGN_TEST_REPS}) \ No newline at end of file +include(../../lvlx_test.cmake) diff --git a/src/gf/ref/lvl3/test/test_extras.c b/src/gf/ref/lvl3/test/test_extras.c deleted file mode 100644 index d0689c6..0000000 --- a/src/gf/ref/lvl3/test/test_extras.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "test_extras.h" -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; -extern const digit_t R2[NWORDS_FIELD]; - -#if 0 -int64_t cpucycles(void) -{ // Access system counter for benchmarking - unsigned int hi, lo; - - asm volatile ("rdtsc\n\t" : "=a" (lo), "=d"(hi)); - return ((int64_t)lo) | (((int64_t)hi) << 32); -} -#endif - - -int compare_words(digit_t* a, digit_t* b, unsigned int nwords) -{ // Comparing "nword" elements, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) - { - if (a[i] > b[i]) return 1; - else if (a[i] < b[i]) return -1; - } - - return 0; -} - - -static void sub_test(digit_t* out, digit_t* a, digit_t* b, unsigned int nwords) -{ // Subtraction without borrow, out = a-b where a>b - // SECURITY NOTE: this function does not have constant-time execution. It is for TESTING ONLY. - unsigned int i; - digit_t res, carry, borrow = 0; - - for (i = 0; i < nwords; i++) - { - res = a[i] - b[i]; - carry = (a[i] < b[i]); - out[i] = res - borrow; - borrow = carry || (res < borrow); - } -} - - -void fprandom_test(digit_t* a) -{ // Generating a pseudo-random field element in [0, p-1] - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - unsigned int i, diff = 256-254, nwords = NWORDS_FIELD; - unsigned char* string = NULL; - - string = (unsigned char*)a; - for (i = 0; i < sizeof(digit_t)*nwords; i++) { - *(string + i) = (unsigned char)rand(); // Obtain 256-bit number - } - a[nwords-1] &= (((digit_t)(-1) << diff) >> diff); - - while (compare_words((digit_t*)p, a, nwords) < 1) { // Force it to [0, modulus-1] - sub_test(a, a, (digit_t*)p, nwords); - } -} - - -void fp2random_test(fp2_t* a) -{ // Generating a pseudo-random element in GF(p^2) - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - - fprandom_test(a->re); - fprandom_test(a->im); -} \ No newline at end of file diff --git a/src/gf/ref/lvl3/test/test_extras.h b/src/gf/ref/lvl3/test/test_extras.h deleted file mode 100644 index 3de524d..0000000 --- a/src/gf/ref/lvl3/test/test_extras.h +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef TEST_EXTRAS_H -#define TEST_EXTRAS_H - -#include -#include -#include "../include/fp.h" -#include "../include/fp2.h" - -#define PASSED 0 -#define FAILED 1 - -// Access system counter for benchmarking -//int64_t cpucycles(void); - -// Comparing "nword" elements, a=b? : (1) a!=b, (0) a=b -int compare_words(digit_t* a, digit_t* b, unsigned int nwords); - -// Generating a pseudo-random field element in [0, p-1] -void fprandom_test(digit_t* a); - -// Generating a pseudo-random element in GF(p^2) -void fp2random_test(fp2_t* a); - -#endif \ No newline at end of file diff --git a/src/gf/ref/lvl3/test/test_fp.c b/src/gf/ref/lvl3/test/test_fp.c deleted file mode 100644 index 033c570..0000000 --- a/src/gf/ref/lvl3/test/test_fp.c +++ /dev/null @@ -1,295 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp_test() -{ // Tests for the field arithmetic - bool OK = true; - int n, passed; - fp_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing field arithmetic over GF(p): \n\n"); - - // Field addition - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/ref/lvl3/test/test_fp2.c b/src/gf/ref/lvl3/test/test_fp2.c deleted file mode 100644 index 48b08c7..0000000 --- a/src/gf/ref/lvl3/test/test_fp2.c +++ /dev/null @@ -1,307 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp2_test() -{ // Tests for the GF(p^2) arithmetic - bool OK = true; - int n, passed; - fp2_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing arithmetic over GF(p^2): \n\n"); - - // Addition in GF(p^2) - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp2_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp2_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/ref/lvl5/CMakeLists.txt b/src/gf/ref/lvl5/CMakeLists.txt index 22784ae..ea5c83f 100644 --- a/src/gf/ref/lvl5/CMakeLists.txt +++ b/src/gf/ref/lvl5/CMakeLists.txt @@ -1,10 +1,5 @@ - -set(SOURCE_FILES_GF_${SVARIANT_UPPER}_REF - fp_p318233.c fp.c fp2.c +set(SOURCE_FILES_GF_SPECIFIC + fp_p27500_${RADIX}.c ) -add_library(${LIB_GF_${SVARIANT_UPPER}} ${SOURCE_FILES_GF_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_GF_${SVARIANT_UPPER}} PRIVATE common ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} include ${PROJECT_SOURCE_DIR}/include ${INC_COMMON}) -target_compile_options(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/gf/ref/lvl5/Makefile b/src/gf/ref/lvl5/Makefile deleted file mode 100644 index 036be07..0000000 --- a/src/gf/ref/lvl5/Makefile +++ /dev/null @@ -1,43 +0,0 @@ - -CC=gcc -CFLAGS= -O3 -std=gnu11 -Wall -march=native -Wno-missing-braces -Wno-logical-not-parentheses -LDFLAGS=-lm -AR=ar rcs -RANLIB=ranlib - -OBJECTS=objs/fp_p318233.o objs/fp.o objs/fp2.o objs/random.o - -all: lib tests - -objs/fp_p318233.o: fp_p318233.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp_p318233.c -o objs/fp_p318233.o - -objs/fp.o: fp.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp.c -o objs/fp.o - -objs/fp2.o: fp2.c - @mkdir -p $(@D) - $(CC) -c $(CFLAGS) fp2.c -o objs/fp2.o - -objs/random.o: ../../../common/generic/randombytes_system.c - $(CC) -c $(CFLAGS) ../../../common/generic/randombytes_system.c -o objs/random.o - -lib: $(OBJECTS) - rm -rf lib - mkdir lib - $(AR) lib/libtest.a $^ - $(RANLIB) lib/libtest.a - -tests: lib - $(CC) $(CFLAGS) -L./lib test/test_fp.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp -lgmp - $(CC) $(CFLAGS) -L./lib test/test_fp2.c test/test_extras.c -ltest $(LDFLAGS) -o test_fp2 -lgmp - -check: tests - -.PHONY: clean - -clean: - rm -rf *.req objs lib test_fp* - diff --git a/src/gf/ref/lvl5/fp.c b/src/gf/ref/lvl5/fp.c deleted file mode 100644 index 565cf1f..0000000 --- a/src/gf/ref/lvl5/fp.c +++ /dev/null @@ -1,168 +0,0 @@ -#include "include/fp.h" - -const uint64_t p[NWORDS_FIELD] = { 0xffffffffffffffff, 0xFFFFFFFFFFFFFFFF, 0x994C68ADA6E1FFFF, 0xFAF0A29A781974CE, 0xFE3AC5904A0DEA65, 0x02BDBE6326507D01, 0x8C15B0036936E792, 0x255946A8869BC6 }; -const uint64_t R2[NWORDS_FIELD] = { 0x46E4E8A0C7549CBD, 0xCB993B5943E89EA5, 0x545AC09F2F1B55C8, 0x1ADB99DDACAA06EC, 0x87994B8955D8B8D4, 0x2CC2EA622F9E57C8, 0x2780B5F2DAF1003C, 0x1691676B8674B8 }; -const uint64_t pp[NWORDS_FIELD] = { 0x01, 0x00, 0x00, 0x00 }; - -void fp_set(digit_t* x, const digit_t val) -{ // Set field element x = val, where val has wordsize - - x[0] = val; - for (unsigned int i = 1; i < NWORDS_FIELD; i++) { - x[i] = 0; - } -} - -bool fp_is_equal(const digit_t* a, const digit_t* b) -{ // Compare two field elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ b[i]; - - return (bool)is_digit_zero_ct(r); -} - -bool fp_is_zero(const digit_t* a) -{ // Is a field element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - digit_t r = 0; - - for (unsigned int i = 0; i < NWORDS_FIELD; i++) - r |= a[i] ^ 0; - - return (bool)is_digit_zero_ct(r); -} - -void fp_copy(digit_t* out, const digit_t* a) -{ - memcpy(out, a, NWORDS_FIELD*RADIX/8); -} - -void fp_neg(digit_t* out, const digit_t* a) -{ // Modular negation, out = -a mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - unsigned int i, borrow = 0; - - for (i = 0; i < NWORDS_FIELD; i++) { - SUBC(out[i], borrow, ((digit_t*)p)[i], a[i], borrow); - } - fp_sub(out, out, (digit_t*)p); -} - -void MUL(digit_t* out, const digit_t a, const digit_t b) -{ // Digit multiplication, digit*digit -> 2-digit result - // Inputs: a, b in [0, 2^w-1], where w is the computer wordsize - // Output: 0 < out < 2^(2w)-1 - register digit_t al, ah, bl, bh, temp; - digit_t albl, albh, ahbl, ahbh, res1, res2, res3, carry; - digit_t mask_low = (digit_t)(-1) >> (sizeof(digit_t)*4), mask_high = (digit_t)(-1) << (sizeof(digit_t)*4); - - al = a & mask_low; // Low part - ah = a >> (sizeof(digit_t)*4); // High part - bl = b & mask_low; - bh = b >> (sizeof(digit_t)*4); - - albl = al * bl; - albh = al * bh; - ahbl = ah * bl; - ahbh = ah * bh; - out[0] = albl & mask_low; // out00 - - res1 = albl >> (sizeof(digit_t)*4); - res2 = ahbl & mask_low; - res3 = albh & mask_low; - temp = res1 + res2 + res3; - carry = temp >> (sizeof(digit_t)*4); - out[0] ^= temp << (sizeof(digit_t)*4); // out01 - - res1 = ahbl >> (sizeof(digit_t)*4); - res2 = albh >> (sizeof(digit_t)*4); - res3 = ahbh & mask_low; - temp = res1 + res2 + res3 + carry; - out[1] = temp & mask_low; // out10 - carry = temp & mask_high; - out[1] ^= (ahbh & mask_high) + carry; // out11 -} - -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision right shift - digit_t bit_out = x[0] & 1; - - for (unsigned int i = 0; i < nwords-1; i++) { - SHIFTR(x[i+1], x[i], shift, x[i], RADIX); - } - x[nwords-1] >>= shift; - return bit_out; -} - -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords) -{ // Multiprecision left shift - - for (int i = nwords-1; i > 0; i--) { - SHIFTL(x[i], x[i-1], shift, x[i], RADIX); - } - x[0] <<= shift; -} - -static void fp_exp3div4(digit_t* out, const digit_t* a) -{ // Fixed exponentiation out = a^((p-3)/4) mod p - // Input: a in [0, p-1] - // Output: out in [0, p-1] - // Requirement: p = 3(mod 4) - fp_t p_t, acc; - digit_t bit; - - memcpy((digit_t*)p_t, (digit_t*)p, NWORDS_FIELD*RADIX/8); - memcpy((digit_t*)acc, (digit_t*)a, NWORDS_FIELD*RADIX/8); - mp_shiftr(p_t, 1, NWORDS_FIELD); - mp_shiftr(p_t, 1, NWORDS_FIELD); - fp_set(out, 1); - fp_tomont(out, out); - - for (int i = 0; i < NWORDS_FIELD*RADIX-2; i++) { - bit = p_t[0] & 1; - mp_shiftr(p_t, 1, NWORDS_FIELD); - if (bit == 1) { - fp_mul(out, out, acc); - } - fp_sqr(acc, acc); - } -} - -void fp_inv(digit_t* a) -{ // Modular inversion, out = x^-1*R mod p, where R = 2^(w*nwords), w is the computer wordsize and nwords is the number of words to represent p - // Input: a=xR in [0, p-1] - // Output: out in [0, p-1]. It outputs 0 if the input does not have an inverse - // Requirement: Ceiling(Log(p)) < w*nwords - fp_t t; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_sqr(t, t); - fp_mul(a, t, a); // a^(p-2) -} - -bool fp_is_square(const digit_t* a) -{ // Is field element a square? - // Output: out = 0 (false), 1 (true) - fp_t t, one; - - fp_exp3div4(t, a); - fp_sqr(t, t); - fp_mul(t, t, a); // a^((p-1)/2) - fp_frommont(t, t); - fp_set(one, 1); - - return fp_is_equal(t, one); -} - -void fp_sqrt(digit_t* a) -{ // Square root computation, out = a^((p+1)/4) mod p - fp_t t; - - fp_exp3div4(t, a); - fp_mul(a, t, a); // a^((p+1)/4) -} \ No newline at end of file diff --git a/src/gf/ref/lvl5/fp2.c b/src/gf/ref/lvl5/fp2.c deleted file mode 100644 index 5fe0e84..0000000 --- a/src/gf/ref/lvl5/fp2.c +++ /dev/null @@ -1,193 +0,0 @@ -#include - -extern const digit_t R[NWORDS_FIELD]; - -/* Arithmetic modulo X^2 + 1 */ - -void fp2_set(fp2_t* x, const digit_t val) -{ - fp_set(x->re, val); - fp_set(x->im, 0); -} - -bool fp2_is_zero(const fp2_t* a) -{ // Is a GF(p^2) element zero? - // Returns 1 (true) if a=0, 0 (false) otherwise - - return fp_is_zero(a->re) & fp_is_zero(a->im); -} - -bool fp2_is_equal(const fp2_t* a, const fp2_t* b) -{ // Compare two GF(p^2) elements in constant time - // Returns 1 (true) if a=b, 0 (false) otherwise - - return fp_is_equal(a->re, b->re) & fp_is_equal(a->im, b->im); -} - -void fp2_copy(fp2_t* x, const fp2_t* y) -{ - fp_copy(x->re, y->re); - fp_copy(x->im, y->im); -} - -fp2_t fp2_non_residue() -{ // 5 + 2i is a quadratic non-residue for p318233 - fp_t one = {0}; - fp2_t res; - - one[0] = 1; - fp_tomont(one, one); - fp_add(res.im, one, one); - fp_add(res.re, res.im, res.im); - fp_add(res.re, res.re, one); - return res; -} - -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_add(x->re, y->re, z->re); - fp_add(x->im, y->im, z->im); -} - -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_sub(x->re, y->re, z->re); - fp_sub(x->im, y->im, z->im); -} - -void fp2_neg(fp2_t* x, const fp2_t* y) -{ - fp_neg(x->re, y->re); - fp_neg(x->im, y->im); -} - -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z) -{ - fp_t t0, t1; - - fp_add(t0, y->re, y->im); - fp_add(t1, z->re, z->im); - fp_mul(t0, t0, t1); - fp_mul(t1, y->im, z->im); - fp_mul(x->re, y->re, z->re); - fp_sub(x->im, t0, t1); - fp_sub(x->im, x->im, x->re); - fp_sub(x->re, x->re, t1); -} - -void fp2_sqr(fp2_t* x, const fp2_t* y) -{ - fp_t sum, diff; - - fp_add(sum, y->re, y->im); - fp_sub(diff, y->re, y->im); - fp_mul(x->im, y->re, y->im); - fp_add(x->im, x->im, x->im); - fp_mul(x->re, sum, diff); -} - -void fp2_inv(fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - fp_inv(t0); - fp_mul(x->re, x->re, t0); - fp_mul(x->im, x->im, t0); - fp_neg(x->im, x->im); -} - -bool fp2_is_square(const fp2_t* x) -{ - fp_t t0, t1; - - fp_sqr(t0, x->re); - fp_sqr(t1, x->im); - fp_add(t0, t0, t1); - - return fp_is_square(t0); -} - -void fp2_frob(fp2_t* x, const fp2_t* y) -{ - memcpy((digit_t*)x->re, (digit_t*)y->re, NWORDS_FIELD*RADIX/8); - fp_neg(x->im, y->im); -} - -void fp2_tomont(fp2_t* x, const fp2_t* y) -{ - fp_tomont(x->re, y->re); - fp_tomont(x->im, y->im); -} - -void fp2_frommont(fp2_t* x, const fp2_t* y) -{ - fp_frommont(x->re, y->re); - fp_frommont(x->im, y->im); -} - -// NOTE: old, non-constant-time implementation. Could be optimized -void fp2_sqrt(fp2_t* x) -{ - fp_t sdelta, re, tmp1, tmp2, inv2, im; - - if (fp_is_zero(x->im)) { - if (fp_is_square(x->re)) { - fp_sqrt(x->re); - return; - } else { - fp_neg(x->im, x->re); - fp_sqrt(x->im); - fp_set(x->re, 0); - return; - } - } - - // sdelta = sqrt(re^2 + im^2) - fp_sqr(sdelta, x->re); - fp_sqr(tmp1, x->im); - fp_add(sdelta, sdelta, tmp1); - fp_sqrt(sdelta); - - fp_set(inv2, 2); - fp_tomont(inv2, inv2); // inv2 <- 2 - fp_inv(inv2); - fp_add(re, x->re, sdelta); - fp_mul(re, re, inv2); - memcpy((digit_t*)tmp2, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - if (!fp_is_square(tmp2)) { - fp_sub(re, x->re, sdelta); - fp_mul(re, re, inv2); - } - - fp_sqrt(re); - memcpy((digit_t*)im, (digit_t*)re, NWORDS_FIELD*RADIX/8); - - fp_inv(im); - fp_mul(im, im, inv2); - fp_mul(x->im, im, x->im); - memcpy((digit_t*)x->re, (digit_t*)re, NWORDS_FIELD*RADIX/8); -} - -// Lexicographic comparison of two field elements. Returns +1 if x > y, -1 if x < y, 0 if x = y -int fp2_cmp(fp2_t* x, fp2_t* y){ - fp2_t a, b; - fp2_frommont(&a, x); - fp2_frommont(&b, y); - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.re[i] > b.re[i]) - return 1; - if(a.re[i] < b.re[i]) - return -1; - } - for(int i = NWORDS_FIELD-1; i >= 0; i--){ - if(a.im[i] > b.im[i]) - return 1; - if(a.im[i] < b.im[i]) - return -1; - } - return 0; -} \ No newline at end of file diff --git a/src/gf/ref/lvl5/fp_p27500_32.c b/src/gf/ref/lvl5/fp_p27500_32.c new file mode 100644 index 0000000..ecf5ea7 --- /dev/null +++ b/src/gf/ref/lvl5/fp_p27500_32.c @@ -0,0 +1,1514 @@ +// clang-format off +// Command line : python monty.py 32 +// 0x1afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +#include +#include + +#define sspint int32_t +#define spint uint32_t +#define udpint uint64_t +#define dpint uint64_t + +#define Wordlength 32 +#define Nlimbs 18 +#define Radix 29 +#define Nbits 505 +#define Nbytes 64 + +#define MONTGOMERY +// propagate carries +inline static spint prop(spint *n) { + int i; + spint mask = ((spint)1 << 29u) - (spint)1; + sspint carry = (sspint)n[0]; + carry >>= 29u; + n[0] &= mask; + for (i = 1; i < 17; i++) { + carry += (sspint)n[i]; + n[i] = (spint)carry & mask; + carry >>= 29u; + } + n[17] += (spint)carry; + return -((n[17] >> 1) >> 30u); +} + +// propagate carries and add p if negative, propagate carries again +inline static int flatten(spint *n) { + spint carry = prop(n); + n[0] -= (spint)1u & carry; + n[17] += ((spint)0xd80u) & carry; + (void)prop(n); + return (int)(carry & 1); +} + +// Montgomery final subtract +static int modfsb(spint *n) { + n[0] += (spint)1u; + n[17] -= (spint)0xd80u; + return flatten(n); +} + +// Modular addition - reduce less than 2p +static void modadd(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] + b[0]; + n[1] = a[1] + b[1]; + n[2] = a[2] + b[2]; + n[3] = a[3] + b[3]; + n[4] = a[4] + b[4]; + n[5] = a[5] + b[5]; + n[6] = a[6] + b[6]; + n[7] = a[7] + b[7]; + n[8] = a[8] + b[8]; + n[9] = a[9] + b[9]; + n[10] = a[10] + b[10]; + n[11] = a[11] + b[11]; + n[12] = a[12] + b[12]; + n[13] = a[13] + b[13]; + n[14] = a[14] + b[14]; + n[15] = a[15] + b[15]; + n[16] = a[16] + b[16]; + n[17] = a[17] + b[17]; + n[0] += (spint)2u; + n[17] -= (spint)0x1b00u; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[17] += ((spint)0x1b00u) & carry; + (void)prop(n); +} + +// Modular subtraction - reduce less than 2p +static void modsub(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] - b[0]; + n[1] = a[1] - b[1]; + n[2] = a[2] - b[2]; + n[3] = a[3] - b[3]; + n[4] = a[4] - b[4]; + n[5] = a[5] - b[5]; + n[6] = a[6] - b[6]; + n[7] = a[7] - b[7]; + n[8] = a[8] - b[8]; + n[9] = a[9] - b[9]; + n[10] = a[10] - b[10]; + n[11] = a[11] - b[11]; + n[12] = a[12] - b[12]; + n[13] = a[13] - b[13]; + n[14] = a[14] - b[14]; + n[15] = a[15] - b[15]; + n[16] = a[16] - b[16]; + n[17] = a[17] - b[17]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[17] += ((spint)0x1b00u) & carry; + (void)prop(n); +} + +// Modular negation +static void modneg(const spint *b, spint *n) { + spint carry; + n[0] = (spint)0 - b[0]; + n[1] = (spint)0 - b[1]; + n[2] = (spint)0 - b[2]; + n[3] = (spint)0 - b[3]; + n[4] = (spint)0 - b[4]; + n[5] = (spint)0 - b[5]; + n[6] = (spint)0 - b[6]; + n[7] = (spint)0 - b[7]; + n[8] = (spint)0 - b[8]; + n[9] = (spint)0 - b[9]; + n[10] = (spint)0 - b[10]; + n[11] = (spint)0 - b[11]; + n[12] = (spint)0 - b[12]; + n[13] = (spint)0 - b[13]; + n[14] = (spint)0 - b[14]; + n[15] = (spint)0 - b[15]; + n[16] = (spint)0 - b[16]; + n[17] = (spint)0 - b[17]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[17] += ((spint)0x1b00u) & carry; + (void)prop(n); +} + +// Overflow limit = 18446744073709551616 +// maximum possible = 5188148641189065362 +// Modular multiplication, c=a*b mod 2p +static void modmul(const spint *a, const spint *b, spint *c) { + dpint t = 0; + spint p17 = 0xd80u; + spint q = ((spint)1 << 29u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + t += (dpint)a[0] * b[0]; + spint v0 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[1]; + t += (dpint)a[1] * b[0]; + spint v1 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[2]; + t += (dpint)a[1] * b[1]; + t += (dpint)a[2] * b[0]; + spint v2 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[3]; + t += (dpint)a[1] * b[2]; + t += (dpint)a[2] * b[1]; + t += (dpint)a[3] * b[0]; + spint v3 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[4]; + t += (dpint)a[1] * b[3]; + t += (dpint)a[2] * b[2]; + t += (dpint)a[3] * b[1]; + t += (dpint)a[4] * b[0]; + spint v4 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[5]; + t += (dpint)a[1] * b[4]; + t += (dpint)a[2] * b[3]; + t += (dpint)a[3] * b[2]; + t += (dpint)a[4] * b[1]; + t += (dpint)a[5] * b[0]; + spint v5 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[6]; + t += (dpint)a[1] * b[5]; + t += (dpint)a[2] * b[4]; + t += (dpint)a[3] * b[3]; + t += (dpint)a[4] * b[2]; + t += (dpint)a[5] * b[1]; + t += (dpint)a[6] * b[0]; + spint v6 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[7]; + t += (dpint)a[1] * b[6]; + t += (dpint)a[2] * b[5]; + t += (dpint)a[3] * b[4]; + t += (dpint)a[4] * b[3]; + t += (dpint)a[5] * b[2]; + t += (dpint)a[6] * b[1]; + t += (dpint)a[7] * b[0]; + spint v7 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[8]; + t += (dpint)a[1] * b[7]; + t += (dpint)a[2] * b[6]; + t += (dpint)a[3] * b[5]; + t += (dpint)a[4] * b[4]; + t += (dpint)a[5] * b[3]; + t += (dpint)a[6] * b[2]; + t += (dpint)a[7] * b[1]; + t += (dpint)a[8] * b[0]; + spint v8 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[9]; + t += (dpint)a[1] * b[8]; + t += (dpint)a[2] * b[7]; + t += (dpint)a[3] * b[6]; + t += (dpint)a[4] * b[5]; + t += (dpint)a[5] * b[4]; + t += (dpint)a[6] * b[3]; + t += (dpint)a[7] * b[2]; + t += (dpint)a[8] * b[1]; + t += (dpint)a[9] * b[0]; + spint v9 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[10]; + t += (dpint)a[1] * b[9]; + t += (dpint)a[2] * b[8]; + t += (dpint)a[3] * b[7]; + t += (dpint)a[4] * b[6]; + t += (dpint)a[5] * b[5]; + t += (dpint)a[6] * b[4]; + t += (dpint)a[7] * b[3]; + t += (dpint)a[8] * b[2]; + t += (dpint)a[9] * b[1]; + t += (dpint)a[10] * b[0]; + spint v10 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[11]; + t += (dpint)a[1] * b[10]; + t += (dpint)a[2] * b[9]; + t += (dpint)a[3] * b[8]; + t += (dpint)a[4] * b[7]; + t += (dpint)a[5] * b[6]; + t += (dpint)a[6] * b[5]; + t += (dpint)a[7] * b[4]; + t += (dpint)a[8] * b[3]; + t += (dpint)a[9] * b[2]; + t += (dpint)a[10] * b[1]; + t += (dpint)a[11] * b[0]; + spint v11 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[12]; + t += (dpint)a[1] * b[11]; + t += (dpint)a[2] * b[10]; + t += (dpint)a[3] * b[9]; + t += (dpint)a[4] * b[8]; + t += (dpint)a[5] * b[7]; + t += (dpint)a[6] * b[6]; + t += (dpint)a[7] * b[5]; + t += (dpint)a[8] * b[4]; + t += (dpint)a[9] * b[3]; + t += (dpint)a[10] * b[2]; + t += (dpint)a[11] * b[1]; + t += (dpint)a[12] * b[0]; + spint v12 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[13]; + t += (dpint)a[1] * b[12]; + t += (dpint)a[2] * b[11]; + t += (dpint)a[3] * b[10]; + t += (dpint)a[4] * b[9]; + t += (dpint)a[5] * b[8]; + t += (dpint)a[6] * b[7]; + t += (dpint)a[7] * b[6]; + t += (dpint)a[8] * b[5]; + t += (dpint)a[9] * b[4]; + t += (dpint)a[10] * b[3]; + t += (dpint)a[11] * b[2]; + t += (dpint)a[12] * b[1]; + t += (dpint)a[13] * b[0]; + spint v13 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[14]; + t += (dpint)a[1] * b[13]; + t += (dpint)a[2] * b[12]; + t += (dpint)a[3] * b[11]; + t += (dpint)a[4] * b[10]; + t += (dpint)a[5] * b[9]; + t += (dpint)a[6] * b[8]; + t += (dpint)a[7] * b[7]; + t += (dpint)a[8] * b[6]; + t += (dpint)a[9] * b[5]; + t += (dpint)a[10] * b[4]; + t += (dpint)a[11] * b[3]; + t += (dpint)a[12] * b[2]; + t += (dpint)a[13] * b[1]; + t += (dpint)a[14] * b[0]; + spint v14 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[15]; + t += (dpint)a[1] * b[14]; + t += (dpint)a[2] * b[13]; + t += (dpint)a[3] * b[12]; + t += (dpint)a[4] * b[11]; + t += (dpint)a[5] * b[10]; + t += (dpint)a[6] * b[9]; + t += (dpint)a[7] * b[8]; + t += (dpint)a[8] * b[7]; + t += (dpint)a[9] * b[6]; + t += (dpint)a[10] * b[5]; + t += (dpint)a[11] * b[4]; + t += (dpint)a[12] * b[3]; + t += (dpint)a[13] * b[2]; + t += (dpint)a[14] * b[1]; + t += (dpint)a[15] * b[0]; + spint v15 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[16]; + t += (dpint)a[1] * b[15]; + t += (dpint)a[2] * b[14]; + t += (dpint)a[3] * b[13]; + t += (dpint)a[4] * b[12]; + t += (dpint)a[5] * b[11]; + t += (dpint)a[6] * b[10]; + t += (dpint)a[7] * b[9]; + t += (dpint)a[8] * b[8]; + t += (dpint)a[9] * b[7]; + t += (dpint)a[10] * b[6]; + t += (dpint)a[11] * b[5]; + t += (dpint)a[12] * b[4]; + t += (dpint)a[13] * b[3]; + t += (dpint)a[14] * b[2]; + t += (dpint)a[15] * b[1]; + t += (dpint)a[16] * b[0]; + spint v16 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[0] * b[17]; + t += (dpint)a[1] * b[16]; + t += (dpint)a[2] * b[15]; + t += (dpint)a[3] * b[14]; + t += (dpint)a[4] * b[13]; + t += (dpint)a[5] * b[12]; + t += (dpint)a[6] * b[11]; + t += (dpint)a[7] * b[10]; + t += (dpint)a[8] * b[9]; + t += (dpint)a[9] * b[8]; + t += (dpint)a[10] * b[7]; + t += (dpint)a[11] * b[6]; + t += (dpint)a[12] * b[5]; + t += (dpint)a[13] * b[4]; + t += (dpint)a[14] * b[3]; + t += (dpint)a[15] * b[2]; + t += (dpint)a[16] * b[1]; + t += (dpint)a[17] * b[0]; + t += (dpint)v0 * (dpint)p17; + spint v17 = ((spint)t & mask); + t >>= 29; + t += (dpint)a[1] * b[17]; + t += (dpint)a[2] * b[16]; + t += (dpint)a[3] * b[15]; + t += (dpint)a[4] * b[14]; + t += (dpint)a[5] * b[13]; + t += (dpint)a[6] * b[12]; + t += (dpint)a[7] * b[11]; + t += (dpint)a[8] * b[10]; + t += (dpint)a[9] * b[9]; + t += (dpint)a[10] * b[8]; + t += (dpint)a[11] * b[7]; + t += (dpint)a[12] * b[6]; + t += (dpint)a[13] * b[5]; + t += (dpint)a[14] * b[4]; + t += (dpint)a[15] * b[3]; + t += (dpint)a[16] * b[2]; + t += (dpint)a[17] * b[1]; + t += (dpint)v1 * (dpint)p17; + c[0] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[2] * b[17]; + t += (dpint)a[3] * b[16]; + t += (dpint)a[4] * b[15]; + t += (dpint)a[5] * b[14]; + t += (dpint)a[6] * b[13]; + t += (dpint)a[7] * b[12]; + t += (dpint)a[8] * b[11]; + t += (dpint)a[9] * b[10]; + t += (dpint)a[10] * b[9]; + t += (dpint)a[11] * b[8]; + t += (dpint)a[12] * b[7]; + t += (dpint)a[13] * b[6]; + t += (dpint)a[14] * b[5]; + t += (dpint)a[15] * b[4]; + t += (dpint)a[16] * b[3]; + t += (dpint)a[17] * b[2]; + t += (dpint)v2 * (dpint)p17; + c[1] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[3] * b[17]; + t += (dpint)a[4] * b[16]; + t += (dpint)a[5] * b[15]; + t += (dpint)a[6] * b[14]; + t += (dpint)a[7] * b[13]; + t += (dpint)a[8] * b[12]; + t += (dpint)a[9] * b[11]; + t += (dpint)a[10] * b[10]; + t += (dpint)a[11] * b[9]; + t += (dpint)a[12] * b[8]; + t += (dpint)a[13] * b[7]; + t += (dpint)a[14] * b[6]; + t += (dpint)a[15] * b[5]; + t += (dpint)a[16] * b[4]; + t += (dpint)a[17] * b[3]; + t += (dpint)v3 * (dpint)p17; + c[2] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[4] * b[17]; + t += (dpint)a[5] * b[16]; + t += (dpint)a[6] * b[15]; + t += (dpint)a[7] * b[14]; + t += (dpint)a[8] * b[13]; + t += (dpint)a[9] * b[12]; + t += (dpint)a[10] * b[11]; + t += (dpint)a[11] * b[10]; + t += (dpint)a[12] * b[9]; + t += (dpint)a[13] * b[8]; + t += (dpint)a[14] * b[7]; + t += (dpint)a[15] * b[6]; + t += (dpint)a[16] * b[5]; + t += (dpint)a[17] * b[4]; + t += (dpint)v4 * (dpint)p17; + c[3] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[5] * b[17]; + t += (dpint)a[6] * b[16]; + t += (dpint)a[7] * b[15]; + t += (dpint)a[8] * b[14]; + t += (dpint)a[9] * b[13]; + t += (dpint)a[10] * b[12]; + t += (dpint)a[11] * b[11]; + t += (dpint)a[12] * b[10]; + t += (dpint)a[13] * b[9]; + t += (dpint)a[14] * b[8]; + t += (dpint)a[15] * b[7]; + t += (dpint)a[16] * b[6]; + t += (dpint)a[17] * b[5]; + t += (dpint)v5 * (dpint)p17; + c[4] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[6] * b[17]; + t += (dpint)a[7] * b[16]; + t += (dpint)a[8] * b[15]; + t += (dpint)a[9] * b[14]; + t += (dpint)a[10] * b[13]; + t += (dpint)a[11] * b[12]; + t += (dpint)a[12] * b[11]; + t += (dpint)a[13] * b[10]; + t += (dpint)a[14] * b[9]; + t += (dpint)a[15] * b[8]; + t += (dpint)a[16] * b[7]; + t += (dpint)a[17] * b[6]; + t += (dpint)v6 * (dpint)p17; + c[5] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[7] * b[17]; + t += (dpint)a[8] * b[16]; + t += (dpint)a[9] * b[15]; + t += (dpint)a[10] * b[14]; + t += (dpint)a[11] * b[13]; + t += (dpint)a[12] * b[12]; + t += (dpint)a[13] * b[11]; + t += (dpint)a[14] * b[10]; + t += (dpint)a[15] * b[9]; + t += (dpint)a[16] * b[8]; + t += (dpint)a[17] * b[7]; + t += (dpint)v7 * (dpint)p17; + c[6] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[8] * b[17]; + t += (dpint)a[9] * b[16]; + t += (dpint)a[10] * b[15]; + t += (dpint)a[11] * b[14]; + t += (dpint)a[12] * b[13]; + t += (dpint)a[13] * b[12]; + t += (dpint)a[14] * b[11]; + t += (dpint)a[15] * b[10]; + t += (dpint)a[16] * b[9]; + t += (dpint)a[17] * b[8]; + t += (dpint)v8 * (dpint)p17; + c[7] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[9] * b[17]; + t += (dpint)a[10] * b[16]; + t += (dpint)a[11] * b[15]; + t += (dpint)a[12] * b[14]; + t += (dpint)a[13] * b[13]; + t += (dpint)a[14] * b[12]; + t += (dpint)a[15] * b[11]; + t += (dpint)a[16] * b[10]; + t += (dpint)a[17] * b[9]; + t += (dpint)v9 * (dpint)p17; + c[8] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[10] * b[17]; + t += (dpint)a[11] * b[16]; + t += (dpint)a[12] * b[15]; + t += (dpint)a[13] * b[14]; + t += (dpint)a[14] * b[13]; + t += (dpint)a[15] * b[12]; + t += (dpint)a[16] * b[11]; + t += (dpint)a[17] * b[10]; + t += (dpint)v10 * (dpint)p17; + c[9] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[11] * b[17]; + t += (dpint)a[12] * b[16]; + t += (dpint)a[13] * b[15]; + t += (dpint)a[14] * b[14]; + t += (dpint)a[15] * b[13]; + t += (dpint)a[16] * b[12]; + t += (dpint)a[17] * b[11]; + t += (dpint)v11 * (dpint)p17; + c[10] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[12] * b[17]; + t += (dpint)a[13] * b[16]; + t += (dpint)a[14] * b[15]; + t += (dpint)a[15] * b[14]; + t += (dpint)a[16] * b[13]; + t += (dpint)a[17] * b[12]; + t += (dpint)v12 * (dpint)p17; + c[11] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[13] * b[17]; + t += (dpint)a[14] * b[16]; + t += (dpint)a[15] * b[15]; + t += (dpint)a[16] * b[14]; + t += (dpint)a[17] * b[13]; + t += (dpint)v13 * (dpint)p17; + c[12] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[14] * b[17]; + t += (dpint)a[15] * b[16]; + t += (dpint)a[16] * b[15]; + t += (dpint)a[17] * b[14]; + t += (dpint)v14 * (dpint)p17; + c[13] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[15] * b[17]; + t += (dpint)a[16] * b[16]; + t += (dpint)a[17] * b[15]; + t += (dpint)v15 * (dpint)p17; + c[14] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[16] * b[17]; + t += (dpint)a[17] * b[16]; + t += (dpint)v16 * (dpint)p17; + c[15] = ((spint)t & mask); + t >>= 29; + t += (dpint)a[17] * b[17]; + t += (dpint)v17 * (dpint)p17; + c[16] = ((spint)t & mask); + t >>= 29; + c[17] = (spint)t; +} + +// Modular squaring, c=a*a mod 2p +static void modsqr(const spint *a, spint *c) { + udpint tot; + udpint t = 0; + spint p17 = 0xd80u; + spint q = ((spint)1 << 29u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + tot = (udpint)a[0] * a[0]; + t = tot; + spint v0 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[1]; + tot *= 2; + t += tot; + spint v1 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[2]; + tot *= 2; + tot += (udpint)a[1] * a[1]; + t += tot; + spint v2 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[3]; + tot += (udpint)a[1] * a[2]; + tot *= 2; + t += tot; + spint v3 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[4]; + tot += (udpint)a[1] * a[3]; + tot *= 2; + tot += (udpint)a[2] * a[2]; + t += tot; + spint v4 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[5]; + tot += (udpint)a[1] * a[4]; + tot += (udpint)a[2] * a[3]; + tot *= 2; + t += tot; + spint v5 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[6]; + tot += (udpint)a[1] * a[5]; + tot += (udpint)a[2] * a[4]; + tot *= 2; + tot += (udpint)a[3] * a[3]; + t += tot; + spint v6 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[7]; + tot += (udpint)a[1] * a[6]; + tot += (udpint)a[2] * a[5]; + tot += (udpint)a[3] * a[4]; + tot *= 2; + t += tot; + spint v7 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[8]; + tot += (udpint)a[1] * a[7]; + tot += (udpint)a[2] * a[6]; + tot += (udpint)a[3] * a[5]; + tot *= 2; + tot += (udpint)a[4] * a[4]; + t += tot; + spint v8 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[9]; + tot += (udpint)a[1] * a[8]; + tot += (udpint)a[2] * a[7]; + tot += (udpint)a[3] * a[6]; + tot += (udpint)a[4] * a[5]; + tot *= 2; + t += tot; + spint v9 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[10]; + tot += (udpint)a[1] * a[9]; + tot += (udpint)a[2] * a[8]; + tot += (udpint)a[3] * a[7]; + tot += (udpint)a[4] * a[6]; + tot *= 2; + tot += (udpint)a[5] * a[5]; + t += tot; + spint v10 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[11]; + tot += (udpint)a[1] * a[10]; + tot += (udpint)a[2] * a[9]; + tot += (udpint)a[3] * a[8]; + tot += (udpint)a[4] * a[7]; + tot += (udpint)a[5] * a[6]; + tot *= 2; + t += tot; + spint v11 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[12]; + tot += (udpint)a[1] * a[11]; + tot += (udpint)a[2] * a[10]; + tot += (udpint)a[3] * a[9]; + tot += (udpint)a[4] * a[8]; + tot += (udpint)a[5] * a[7]; + tot *= 2; + tot += (udpint)a[6] * a[6]; + t += tot; + spint v12 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[13]; + tot += (udpint)a[1] * a[12]; + tot += (udpint)a[2] * a[11]; + tot += (udpint)a[3] * a[10]; + tot += (udpint)a[4] * a[9]; + tot += (udpint)a[5] * a[8]; + tot += (udpint)a[6] * a[7]; + tot *= 2; + t += tot; + spint v13 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[14]; + tot += (udpint)a[1] * a[13]; + tot += (udpint)a[2] * a[12]; + tot += (udpint)a[3] * a[11]; + tot += (udpint)a[4] * a[10]; + tot += (udpint)a[5] * a[9]; + tot += (udpint)a[6] * a[8]; + tot *= 2; + tot += (udpint)a[7] * a[7]; + t += tot; + spint v14 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[15]; + tot += (udpint)a[1] * a[14]; + tot += (udpint)a[2] * a[13]; + tot += (udpint)a[3] * a[12]; + tot += (udpint)a[4] * a[11]; + tot += (udpint)a[5] * a[10]; + tot += (udpint)a[6] * a[9]; + tot += (udpint)a[7] * a[8]; + tot *= 2; + t += tot; + spint v15 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[16]; + tot += (udpint)a[1] * a[15]; + tot += (udpint)a[2] * a[14]; + tot += (udpint)a[3] * a[13]; + tot += (udpint)a[4] * a[12]; + tot += (udpint)a[5] * a[11]; + tot += (udpint)a[6] * a[10]; + tot += (udpint)a[7] * a[9]; + tot *= 2; + tot += (udpint)a[8] * a[8]; + t += tot; + spint v16 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[0] * a[17]; + tot += (udpint)a[1] * a[16]; + tot += (udpint)a[2] * a[15]; + tot += (udpint)a[3] * a[14]; + tot += (udpint)a[4] * a[13]; + tot += (udpint)a[5] * a[12]; + tot += (udpint)a[6] * a[11]; + tot += (udpint)a[7] * a[10]; + tot += (udpint)a[8] * a[9]; + tot *= 2; + t += tot; + t += (udpint)v0 * p17; + spint v17 = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[1] * a[17]; + tot += (udpint)a[2] * a[16]; + tot += (udpint)a[3] * a[15]; + tot += (udpint)a[4] * a[14]; + tot += (udpint)a[5] * a[13]; + tot += (udpint)a[6] * a[12]; + tot += (udpint)a[7] * a[11]; + tot += (udpint)a[8] * a[10]; + tot *= 2; + tot += (udpint)a[9] * a[9]; + t += tot; + t += (udpint)v1 * p17; + c[0] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[2] * a[17]; + tot += (udpint)a[3] * a[16]; + tot += (udpint)a[4] * a[15]; + tot += (udpint)a[5] * a[14]; + tot += (udpint)a[6] * a[13]; + tot += (udpint)a[7] * a[12]; + tot += (udpint)a[8] * a[11]; + tot += (udpint)a[9] * a[10]; + tot *= 2; + t += tot; + t += (udpint)v2 * p17; + c[1] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[3] * a[17]; + tot += (udpint)a[4] * a[16]; + tot += (udpint)a[5] * a[15]; + tot += (udpint)a[6] * a[14]; + tot += (udpint)a[7] * a[13]; + tot += (udpint)a[8] * a[12]; + tot += (udpint)a[9] * a[11]; + tot *= 2; + tot += (udpint)a[10] * a[10]; + t += tot; + t += (udpint)v3 * p17; + c[2] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[4] * a[17]; + tot += (udpint)a[5] * a[16]; + tot += (udpint)a[6] * a[15]; + tot += (udpint)a[7] * a[14]; + tot += (udpint)a[8] * a[13]; + tot += (udpint)a[9] * a[12]; + tot += (udpint)a[10] * a[11]; + tot *= 2; + t += tot; + t += (udpint)v4 * p17; + c[3] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[5] * a[17]; + tot += (udpint)a[6] * a[16]; + tot += (udpint)a[7] * a[15]; + tot += (udpint)a[8] * a[14]; + tot += (udpint)a[9] * a[13]; + tot += (udpint)a[10] * a[12]; + tot *= 2; + tot += (udpint)a[11] * a[11]; + t += tot; + t += (udpint)v5 * p17; + c[4] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[6] * a[17]; + tot += (udpint)a[7] * a[16]; + tot += (udpint)a[8] * a[15]; + tot += (udpint)a[9] * a[14]; + tot += (udpint)a[10] * a[13]; + tot += (udpint)a[11] * a[12]; + tot *= 2; + t += tot; + t += (udpint)v6 * p17; + c[5] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[7] * a[17]; + tot += (udpint)a[8] * a[16]; + tot += (udpint)a[9] * a[15]; + tot += (udpint)a[10] * a[14]; + tot += (udpint)a[11] * a[13]; + tot *= 2; + tot += (udpint)a[12] * a[12]; + t += tot; + t += (udpint)v7 * p17; + c[6] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[8] * a[17]; + tot += (udpint)a[9] * a[16]; + tot += (udpint)a[10] * a[15]; + tot += (udpint)a[11] * a[14]; + tot += (udpint)a[12] * a[13]; + tot *= 2; + t += tot; + t += (udpint)v8 * p17; + c[7] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[9] * a[17]; + tot += (udpint)a[10] * a[16]; + tot += (udpint)a[11] * a[15]; + tot += (udpint)a[12] * a[14]; + tot *= 2; + tot += (udpint)a[13] * a[13]; + t += tot; + t += (udpint)v9 * p17; + c[8] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[10] * a[17]; + tot += (udpint)a[11] * a[16]; + tot += (udpint)a[12] * a[15]; + tot += (udpint)a[13] * a[14]; + tot *= 2; + t += tot; + t += (udpint)v10 * p17; + c[9] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[11] * a[17]; + tot += (udpint)a[12] * a[16]; + tot += (udpint)a[13] * a[15]; + tot *= 2; + tot += (udpint)a[14] * a[14]; + t += tot; + t += (udpint)v11 * p17; + c[10] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[12] * a[17]; + tot += (udpint)a[13] * a[16]; + tot += (udpint)a[14] * a[15]; + tot *= 2; + t += tot; + t += (udpint)v12 * p17; + c[11] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[13] * a[17]; + tot += (udpint)a[14] * a[16]; + tot *= 2; + tot += (udpint)a[15] * a[15]; + t += tot; + t += (udpint)v13 * p17; + c[12] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[14] * a[17]; + tot += (udpint)a[15] * a[16]; + tot *= 2; + t += tot; + t += (udpint)v14 * p17; + c[13] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[15] * a[17]; + tot *= 2; + tot += (udpint)a[16] * a[16]; + t += tot; + t += (udpint)v15 * p17; + c[14] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[16] * a[17]; + tot *= 2; + t += tot; + t += (udpint)v16 * p17; + c[15] = ((spint)t & mask); + t >>= 29; + tot = (udpint)a[17] * a[17]; + t += tot; + t += (udpint)v17 * p17; + c[16] = ((spint)t & mask); + t >>= 29; + c[17] = (spint)t; +} + +// copy +static void modcpy(const spint *a, spint *c) { + int i; + for (i = 0; i < 18; i++) { + c[i] = a[i]; + } +} + +// square n times +static void modnsqr(spint *a, int n) { + int i; + for (i = 0; i < n; i++) { + modsqr(a, a); + } +} + +// Calculate progenitor +static void modpro(const spint *w, spint *z) { + spint x[18]; + spint t0[18]; + spint t1[18]; + spint t2[18]; + spint t3[18]; + spint t4[18]; + spint t5[18]; + spint t6[18]; + modcpy(w, x); + modcpy(x, z); + modnsqr(z, 2); + modmul(x, z, t0); + modmul(x, t0, z); + modsqr(z, t1); + modmul(x, t1, t1); + modsqr(t1, t3); + modsqr(t3, t2); + modmul(t3, t2, t4); + modsqr(t4, t5); + modcpy(t5, t2); + modnsqr(t2, 2); + modsqr(t2, t6); + modmul(t2, t6, t6); + modmul(t5, t6, t5); + modnsqr(t5, 5); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 12); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 2); + modmul(t2, t5, t5); + modmul(t4, t5, t4); + modsqr(t4, t5); + modmul(t2, t5, t2); + modmul(t4, t2, t4); + modnsqr(t4, 27); + modmul(t2, t4, t2); + modmul(t1, t2, t2); + modcpy(t2, t4); + modnsqr(t4, 2); + modmul(t3, t4, t3); + modnsqr(t3, 58); + modmul(t2, t3, t2); + modmul(z, t2, z); + modcpy(z, t2); + modnsqr(t2, 4); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modmul(t1, t0, t1); + modsqr(t1, t2); + modmul(t0, t2, t0); + modcpy(t0, t2); + modnsqr(t2, 2); + modmul(t0, t2, t2); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modnsqr(t1, 128); + modmul(t0, t1, t1); + modnsqr(t1, 128); + modmul(t0, t1, t0); + modnsqr(t0, 119); + modmul(z, t0, z); +} + +// calculate inverse, provide progenitor h if available +static void modinv(const spint *x, const spint *h, spint *z) { + spint s[18]; + spint t[18]; + if (h == NULL) { + modpro(x, t); + } else { + modcpy(h, t); + } + modcpy(x, s); + modnsqr(t, 2); + modmul(s, t, z); +} + +// Convert m to n-residue form, n=nres(m) +static void nres(const spint *m, spint *n) { + const spint c[18] = {0x19a29700u, 0x12f6878u, 0x17b425edu, 0x1a12f684u, + 0x97b425eu, 0x1da12f68u, 0x1097b425u, 0xbda12f6u, + 0xd097b42u, 0x4bda12fu, 0x1ed097b4u, 0x84bda12u, + 0x5ed097bu, 0x1684bda1u, 0x25ed097u, 0xf684bdau, + 0x1425ed09u, 0x4bdu}; + modmul(m, c, n); +} + +// Convert n back to normal form, m=redc(n) +static void redc(const spint *n, spint *m) { + int i; + spint c[18]; + c[0] = 1; + for (i = 1; i < 18; i++) { + c[i] = 0; + } + modmul(n, c, m); + (void)modfsb(m); +} + +// is unity? +static int modis1(const spint *a) { + int i; + spint c[18]; + spint c0; + spint d = 0; + redc(a, c); + for (i = 1; i < 18; i++) { + d |= c[i]; + } + c0 = (spint)c[0]; + return ((spint)1 & ((d - (spint)1) >> 29u) & + (((c0 ^ (spint)1) - (spint)1) >> 29u)); +} + +// is zero? +static int modis0(const spint *a) { + int i; + spint c[18]; + spint d = 0; + redc(a, c); + for (i = 0; i < 18; i++) { + d |= c[i]; + } + return ((spint)1 & ((d - (spint)1) >> 29u)); +} + +// set to zero +static void modzer(spint *a) { + int i; + for (i = 0; i < 18; i++) { + a[i] = 0; + } +} + +// set to one +static void modone(spint *a) { + int i; + a[0] = 1; + for (i = 1; i < 18; i++) { + a[i] = 0; + } + nres(a, a); +} + +// set to integer +static void modint(int x, spint *a) { + int i; + a[0] = (spint)x; + for (i = 1; i < 18; i++) { + a[i] = 0; + } + nres(a, a); +} + +// Modular multiplication by an integer, c=a*b mod 2p +static void modmli(const spint *a, int b, spint *c) { + spint t[18]; + modint(b, t); + modmul(a, t, c); +} + +// Test for quadratic residue +static int modqr(const spint *h, const spint *x) { + spint r[18]; + if (h == NULL) { + modpro(x, r); + modsqr(r, r); + } else { + modsqr(h, r); + } + modmul(r, x, r); + return modis1(r) | modis0(x); +} + +// conditional move g to f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcmv(int b, const spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t; + spint r = 0x5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 18; i++) { + s = g[i]; + t = f[i]; + f[i] = c0 * t + c1 * s; + f[i] -= r * (t + s); + } +} + +// conditional swap g and f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcsw(int b, volatile spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t, w; + spint r = 0x5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 18; i++) { + s = g[i]; + t = f[i]; + w = r * (t + s); + f[i] = c0 * t + c1 * s; + f[i] -= w; + g[i] = c0 * s + c1 * t; + g[i] -= w; + } +} + +// Modular square root, provide progenitor h if available, NULL if not +static void modsqrt(const spint *x, const spint *h, spint *r) { + spint s[18]; + spint y[18]; + if (h == NULL) { + modpro(x, y); + } else { + modcpy(h, y); + } + modmul(y, x, s); + modcpy(s, r); +} + +// shift left by less than a word +static void modshl(unsigned int n, spint *a) { + int i; + a[17] = ((a[17] << n)) | (a[16] >> (29u - n)); + for (i = 16; i > 0; i--) { + a[i] = ((a[i] << n) & (spint)0x1fffffff) | (a[i - 1] >> (29u - n)); + } + a[0] = (a[0] << n) & (spint)0x1fffffff; +} + +// shift right by less than a word. Return shifted out part +static int modshr(unsigned int n, spint *a) { + int i; + spint r = a[0] & (((spint)1 << n) - (spint)1); + for (i = 0; i < 17; i++) { + a[i] = (a[i] >> n) | ((a[i + 1] << (29u - n)) & (spint)0x1fffffff); + } + a[17] = a[17] >> n; + return r; +} + +// set a= 2^r +static void mod2r(unsigned int r, spint *a) { + unsigned int n = r / 29u; + unsigned int m = r % 29u; + modzer(a); + if (r >= 64 * 8) + return; + a[n] = 1; + a[n] <<= m; + nres(a, a); +} + +// export to byte array +static void modexp(const spint *a, char *b) { + int i; + spint c[18]; + redc(a, c); + for (i = 63; i >= 0; i--) { + b[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +// import from byte array +// returns 1 if in range, else 0 +static int modimp(const char *b, spint *a) { + int i, res; + for (i = 0; i < 18; i++) { + a[i] = 0; + } + for (i = 0; i < 64; i++) { + modshl(8, a); + a[0] += (spint)(unsigned char)b[i]; + } + res = modfsb(a); + nres(a, a); + return res; +} + +// determine sign +static int modsign(const spint *a) { + spint c[18]; + redc(a, c); + return c[0] % 2; +} + +// return true if equal +static int modcmp(const spint *a, const spint *b) { + spint c[18], d[18]; + int i, eq = 1; + redc(a, c); + redc(b, d); + for (i = 0; i < 18; i++) { + eq &= (((c[i] ^ d[i]) - 1) >> 29) & 1; + } + return eq; +} + +// clang-format on +/****************************************************************************** + API functions calling generated code above + ******************************************************************************/ + +#include + +const digit_t ZERO[NWORDS_FIELD] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; +const digit_t ONE[NWORDS_FIELD] = { 0x00025ed0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800 }; +// Montgomery representation of 2^-1 +static const digit_t TWO_INV[NWORDS_FIELD] = { 0x00012f68, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400 }; +// Montgomery representation of 3^-1 +static const digit_t THREE_INV[NWORDS_FIELD] = { + 0x15561f9a, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, + 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x0aaaaaaa, 0x15555555, 0x00000baa +}; +// Montgomery representation of 2^512 +static const digit_t R2[NWORDS_FIELD] = { 0x03c668a5, 0x0f684bda, 0x1425ed09, 0x12f684bd, 0x1b425ed0, 0x012f684b, + 0x17b425ed, 0x1a12f684, 0x097b425e, 0x1da12f68, 0x1097b425, 0x0bda12f6, + 0x0d097b42, 0x04bda12f, 0x1ed097b4, 0x084bda12, 0x05ed097b, 0x00000a21 }; + +void +fp_set_small(fp_t *x, const digit_t val) +{ + modint((int)val, *x); +} + +void +fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val) +{ + modmli(*a, (int)val, *x); +} + +void +fp_set_zero(fp_t *x) +{ + modzer(*x); +} + +void +fp_set_one(fp_t *x) +{ + modone(*x); +} + +uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return -(uint32_t)modcmp(*a, *b); +} + +uint32_t +fp_is_zero(const fp_t *a) +{ + return -(uint32_t)modis0(*a); +} + +void +fp_copy(fp_t *out, const fp_t *a) +{ + modcpy(*a, *out); +} + +void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + modcsw((int)(ctl & 0x1), *a, *b); +} + +void +fp_add(fp_t *out, const fp_t *a, const fp_t *b) +{ + modadd(*a, *b, *out); +} + +void +fp_sub(fp_t *out, const fp_t *a, const fp_t *b) +{ + modsub(*a, *b, *out); +} + +void +fp_neg(fp_t *out, const fp_t *a) +{ + modneg(*a, *out); +} + +void +fp_sqr(fp_t *out, const fp_t *a) +{ + modsqr(*a, *out); +} + +void +fp_mul(fp_t *out, const fp_t *a, const fp_t *b) +{ + modmul(*a, *b, *out); +} + +void +fp_inv(fp_t *x) +{ + modinv(*x, NULL, *x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + return -(uint32_t)modqr(NULL, *a); +} + +void +fp_sqrt(fp_t *a) +{ + modsqrt(*a, NULL, *a); +} + +void +fp_half(fp_t *out, const fp_t *a) +{ + modmul(TWO_INV, *a, *out); +} + +void +fp_exp3div4(fp_t *out, const fp_t *a) +{ + modpro(*a, *out); +} + +void +fp_div3(fp_t *out, const fp_t *a) +{ + modmul(THREE_INV, *a, *out); +} + +void +fp_encode(void *dst, const fp_t *a) +{ + // Modified version of modexp() + int i; + spint c[18]; + redc(*a, c); + for (i = 0; i < 64; i++) { + ((char *)dst)[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +uint32_t +fp_decode(fp_t *d, const void *src) +{ + // Modified version of modimp() + int i; + spint res; + const unsigned char *b = src; + for (i = 0; i < 18; i++) { + (*d)[i] = 0; + } + for (i = 63; i >= 0; i--) { + modshl(8, *d); + (*d)[0] += (spint)b[i]; + } + res = (spint)-modfsb(*d); + nres(*d, *d); + // If the value was canonical then res = -1; otherwise, res = 0 + for (i = 0; i < 18; i++) { + (*d)[i] &= res; + } + return (uint32_t)res; +} + +static inline unsigned char +add_carry(unsigned char cc, spint a, spint b, spint *d) +{ + udpint t = (udpint)a + (udpint)b + cc; + *d = (spint)t; + return (unsigned char)(t >> Wordlength); +} + +static void +partial_reduce(spint *out, const spint *src) +{ + spint h, l, quo, rem; + unsigned char cc; + + // Split value in high (12 bits) and low (500 bits) parts. + h = src[15] >> 20; + l = src[15] & 0x000FFFFF; + + // 27*2^500 = 1 mod q; hence, we add floor(h/27) + (h mod 27)*2^500 + // to the low part. + quo = (h * 0x12F7) >> 17; + rem = h - (27 * quo); + cc = add_carry(0, src[0], quo, &out[0]); + cc = add_carry(cc, src[1], 0, &out[1]); + cc = add_carry(cc, src[2], 0, &out[2]); + cc = add_carry(cc, src[3], 0, &out[3]); + cc = add_carry(cc, src[4], 0, &out[4]); + cc = add_carry(cc, src[5], 0, &out[5]); + cc = add_carry(cc, src[6], 0, &out[6]); + cc = add_carry(cc, src[7], 0, &out[7]); + cc = add_carry(cc, src[8], 0, &out[8]); + cc = add_carry(cc, src[9], 0, &out[9]); + cc = add_carry(cc, src[10], 0, &out[10]); + cc = add_carry(cc, src[11], 0, &out[11]); + cc = add_carry(cc, src[12], 0, &out[12]); + cc = add_carry(cc, src[13], 0, &out[13]); + cc = add_carry(cc, src[14], 0, &out[14]); + (void)add_carry(cc, l, rem << 20, &out[15]); +} + +// Little-endian encoding of a 32-bit integer. +static inline void +enc32le(void *dst, uint32_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); +} + +// Little-endian decoding of a 32-bit integer. +static inline uint32_t +dec32le(const void *src) +{ + const uint8_t *buf = src; + return (spint)buf[0] | ((spint)buf[1] << 8) | ((spint)buf[2] << 16) | ((spint)buf[3] << 24); +} + +void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + uint32_t t[16]; // Stores Nbytes * 8 bits + uint8_t tmp[64]; // Nbytes + const uint8_t *b = src; + + fp_set_zero(d); + if (len == 0) { + return; + } + + size_t rem = len % 64; + if (rem != 0) { + // Input size is not a multiple of 64, we decode a partial + // block, which is already less than 2^500. + size_t k = len - rem; + memcpy(tmp, b + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + fp_decode(d, tmp); + len = k; + } + // Process all remaining blocks, in descending address order. + while (len > 0) { + fp_mul(d, d, &R2); + len -= 64; + t[0] = dec32le(b + len); + t[1] = dec32le(b + len + 4); + t[2] = dec32le(b + len + 8); + t[3] = dec32le(b + len + 12); + t[4] = dec32le(b + len + 16); + t[5] = dec32le(b + len + 20); + t[6] = dec32le(b + len + 24); + t[7] = dec32le(b + len + 28); + t[8] = dec32le(b + len + 32); + t[9] = dec32le(b + len + 36); + t[10] = dec32le(b + len + 40); + t[11] = dec32le(b + len + 44); + t[12] = dec32le(b + len + 48); + t[13] = dec32le(b + len + 52); + t[14] = dec32le(b + len + 56); + t[15] = dec32le(b + len + 60); + partial_reduce(t, t); + enc32le(tmp, t[0]); + enc32le(tmp + 4, t[1]); + enc32le(tmp + 8, t[2]); + enc32le(tmp + 12, t[3]); + enc32le(tmp + 16, t[4]); + enc32le(tmp + 20, t[5]); + enc32le(tmp + 24, t[6]); + enc32le(tmp + 28, t[7]); + enc32le(tmp + 32, t[8]); + enc32le(tmp + 36, t[9]); + enc32le(tmp + 40, t[10]); + enc32le(tmp + 44, t[11]); + enc32le(tmp + 48, t[12]); + enc32le(tmp + 52, t[13]); + enc32le(tmp + 56, t[14]); + enc32le(tmp + 60, t[15]); + fp_t a; + fp_decode(&a, tmp); + fp_add(d, d, &a); + } +} diff --git a/src/gf/ref/lvl5/fp_p27500_64.c b/src/gf/ref/lvl5/fp_p27500_64.c new file mode 100644 index 0000000..33bb75e --- /dev/null +++ b/src/gf/ref/lvl5/fp_p27500_64.c @@ -0,0 +1,970 @@ +// clang-format off +// Command line : python monty.py 64 +// 0x1afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +#include +#include + +#define sspint int64_t +#define spint uint64_t +#define udpint __uint128_t +#define dpint __uint128_t + +#define Wordlength 64 +#define Nlimbs 9 +#define Radix 57 +#define Nbits 505 +#define Nbytes 64 + +#define MONTGOMERY +// propagate carries +inline static spint prop(spint *n) { + int i; + spint mask = ((spint)1 << 57u) - (spint)1; + sspint carry = (sspint)n[0]; + carry >>= 57u; + n[0] &= mask; + for (i = 1; i < 8; i++) { + carry += (sspint)n[i]; + n[i] = (spint)carry & mask; + carry >>= 57u; + } + n[8] += (spint)carry; + return -((n[8] >> 1) >> 62u); +} + +// propagate carries and add p if negative, propagate carries again +inline static int flatten(spint *n) { + spint carry = prop(n); + n[0] -= (spint)1u & carry; + n[8] += ((spint)0x1b00000000000u) & carry; + (void)prop(n); + return (int)(carry & 1); +} + +// Montgomery final subtract +inline static int modfsb(spint *n) { + n[0] += (spint)1u; + n[8] -= (spint)0x1b00000000000u; + return flatten(n); +} + +// Modular addition - reduce less than 2p +inline static void modadd(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] + b[0]; + n[1] = a[1] + b[1]; + n[2] = a[2] + b[2]; + n[3] = a[3] + b[3]; + n[4] = a[4] + b[4]; + n[5] = a[5] + b[5]; + n[6] = a[6] + b[6]; + n[7] = a[7] + b[7]; + n[8] = a[8] + b[8]; + n[0] += (spint)2u; + n[8] -= (spint)0x3600000000000u; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[8] += ((spint)0x3600000000000u) & carry; + (void)prop(n); +} + +// Modular subtraction - reduce less than 2p +inline static void modsub(const spint *a, const spint *b, spint *n) { + spint carry; + n[0] = a[0] - b[0]; + n[1] = a[1] - b[1]; + n[2] = a[2] - b[2]; + n[3] = a[3] - b[3]; + n[4] = a[4] - b[4]; + n[5] = a[5] - b[5]; + n[6] = a[6] - b[6]; + n[7] = a[7] - b[7]; + n[8] = a[8] - b[8]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[8] += ((spint)0x3600000000000u) & carry; + (void)prop(n); +} + +// Modular negation +inline static void modneg(const spint *b, spint *n) { + spint carry; + n[0] = (spint)0 - b[0]; + n[1] = (spint)0 - b[1]; + n[2] = (spint)0 - b[2]; + n[3] = (spint)0 - b[3]; + n[4] = (spint)0 - b[4]; + n[5] = (spint)0 - b[5]; + n[6] = (spint)0 - b[6]; + n[7] = (spint)0 - b[7]; + n[8] = (spint)0 - b[8]; + carry = prop(n); + n[0] -= (spint)2u & carry; + n[8] += ((spint)0x3600000000000u) & carry; + (void)prop(n); +} + +// Overflow limit = 340282366920938463463374607431768211456 +// maximum possible = 186991140039668477603471750259015689 +// Modular multiplication, c=a*b mod 2p +inline static void modmul(const spint *a, const spint *b, spint *c) { + dpint t = 0; + spint p8 = 0x1b00000000000u; + spint q = ((spint)1 << 57u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + t += (dpint)a[0] * b[0]; + spint v0 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[1]; + t += (dpint)a[1] * b[0]; + spint v1 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[2]; + t += (dpint)a[1] * b[1]; + t += (dpint)a[2] * b[0]; + spint v2 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[3]; + t += (dpint)a[1] * b[2]; + t += (dpint)a[2] * b[1]; + t += (dpint)a[3] * b[0]; + spint v3 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[4]; + t += (dpint)a[1] * b[3]; + t += (dpint)a[2] * b[2]; + t += (dpint)a[3] * b[1]; + t += (dpint)a[4] * b[0]; + spint v4 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[5]; + t += (dpint)a[1] * b[4]; + t += (dpint)a[2] * b[3]; + t += (dpint)a[3] * b[2]; + t += (dpint)a[4] * b[1]; + t += (dpint)a[5] * b[0]; + spint v5 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[6]; + t += (dpint)a[1] * b[5]; + t += (dpint)a[2] * b[4]; + t += (dpint)a[3] * b[3]; + t += (dpint)a[4] * b[2]; + t += (dpint)a[5] * b[1]; + t += (dpint)a[6] * b[0]; + spint v6 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[7]; + t += (dpint)a[1] * b[6]; + t += (dpint)a[2] * b[5]; + t += (dpint)a[3] * b[4]; + t += (dpint)a[4] * b[3]; + t += (dpint)a[5] * b[2]; + t += (dpint)a[6] * b[1]; + t += (dpint)a[7] * b[0]; + spint v7 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[0] * b[8]; + t += (dpint)a[1] * b[7]; + t += (dpint)a[2] * b[6]; + t += (dpint)a[3] * b[5]; + t += (dpint)a[4] * b[4]; + t += (dpint)a[5] * b[3]; + t += (dpint)a[6] * b[2]; + t += (dpint)a[7] * b[1]; + t += (dpint)a[8] * b[0]; + t += (dpint)v0 * (dpint)p8; + spint v8 = ((spint)t & mask); + t >>= 57; + t += (dpint)a[1] * b[8]; + t += (dpint)a[2] * b[7]; + t += (dpint)a[3] * b[6]; + t += (dpint)a[4] * b[5]; + t += (dpint)a[5] * b[4]; + t += (dpint)a[6] * b[3]; + t += (dpint)a[7] * b[2]; + t += (dpint)a[8] * b[1]; + t += (dpint)v1 * (dpint)p8; + c[0] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[2] * b[8]; + t += (dpint)a[3] * b[7]; + t += (dpint)a[4] * b[6]; + t += (dpint)a[5] * b[5]; + t += (dpint)a[6] * b[4]; + t += (dpint)a[7] * b[3]; + t += (dpint)a[8] * b[2]; + t += (dpint)v2 * (dpint)p8; + c[1] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[3] * b[8]; + t += (dpint)a[4] * b[7]; + t += (dpint)a[5] * b[6]; + t += (dpint)a[6] * b[5]; + t += (dpint)a[7] * b[4]; + t += (dpint)a[8] * b[3]; + t += (dpint)v3 * (dpint)p8; + c[2] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[4] * b[8]; + t += (dpint)a[5] * b[7]; + t += (dpint)a[6] * b[6]; + t += (dpint)a[7] * b[5]; + t += (dpint)a[8] * b[4]; + t += (dpint)v4 * (dpint)p8; + c[3] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[5] * b[8]; + t += (dpint)a[6] * b[7]; + t += (dpint)a[7] * b[6]; + t += (dpint)a[8] * b[5]; + t += (dpint)v5 * (dpint)p8; + c[4] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[6] * b[8]; + t += (dpint)a[7] * b[7]; + t += (dpint)a[8] * b[6]; + t += (dpint)v6 * (dpint)p8; + c[5] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[7] * b[8]; + t += (dpint)a[8] * b[7]; + t += (dpint)v7 * (dpint)p8; + c[6] = ((spint)t & mask); + t >>= 57; + t += (dpint)a[8] * b[8]; + t += (dpint)v8 * (dpint)p8; + c[7] = ((spint)t & mask); + t >>= 57; + c[8] = (spint)t; +} + +// Modular squaring, c=a*a mod 2p +inline static void modsqr(const spint *a, spint *c) { + udpint tot; + udpint t = 0; + spint p8 = 0x1b00000000000u; + spint q = ((spint)1 << 57u); // q is unsaturated radix + spint mask = (spint)(q - (spint)1); + tot = (udpint)a[0] * a[0]; + t = tot; + spint v0 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[1]; + tot *= 2; + t += tot; + spint v1 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[2]; + tot *= 2; + tot += (udpint)a[1] * a[1]; + t += tot; + spint v2 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[3]; + tot += (udpint)a[1] * a[2]; + tot *= 2; + t += tot; + spint v3 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[4]; + tot += (udpint)a[1] * a[3]; + tot *= 2; + tot += (udpint)a[2] * a[2]; + t += tot; + spint v4 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[5]; + tot += (udpint)a[1] * a[4]; + tot += (udpint)a[2] * a[3]; + tot *= 2; + t += tot; + spint v5 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[6]; + tot += (udpint)a[1] * a[5]; + tot += (udpint)a[2] * a[4]; + tot *= 2; + tot += (udpint)a[3] * a[3]; + t += tot; + spint v6 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[7]; + tot += (udpint)a[1] * a[6]; + tot += (udpint)a[2] * a[5]; + tot += (udpint)a[3] * a[4]; + tot *= 2; + t += tot; + spint v7 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[0] * a[8]; + tot += (udpint)a[1] * a[7]; + tot += (udpint)a[2] * a[6]; + tot += (udpint)a[3] * a[5]; + tot *= 2; + tot += (udpint)a[4] * a[4]; + t += tot; + t += (udpint)v0 * p8; + spint v8 = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[1] * a[8]; + tot += (udpint)a[2] * a[7]; + tot += (udpint)a[3] * a[6]; + tot += (udpint)a[4] * a[5]; + tot *= 2; + t += tot; + t += (udpint)v1 * p8; + c[0] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[2] * a[8]; + tot += (udpint)a[3] * a[7]; + tot += (udpint)a[4] * a[6]; + tot *= 2; + tot += (udpint)a[5] * a[5]; + t += tot; + t += (udpint)v2 * p8; + c[1] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[3] * a[8]; + tot += (udpint)a[4] * a[7]; + tot += (udpint)a[5] * a[6]; + tot *= 2; + t += tot; + t += (udpint)v3 * p8; + c[2] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[4] * a[8]; + tot += (udpint)a[5] * a[7]; + tot *= 2; + tot += (udpint)a[6] * a[6]; + t += tot; + t += (udpint)v4 * p8; + c[3] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[5] * a[8]; + tot += (udpint)a[6] * a[7]; + tot *= 2; + t += tot; + t += (udpint)v5 * p8; + c[4] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[6] * a[8]; + tot *= 2; + tot += (udpint)a[7] * a[7]; + t += tot; + t += (udpint)v6 * p8; + c[5] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[7] * a[8]; + tot *= 2; + t += tot; + t += (udpint)v7 * p8; + c[6] = ((spint)t & mask); + t >>= 57; + tot = (udpint)a[8] * a[8]; + t += tot; + t += (udpint)v8 * p8; + c[7] = ((spint)t & mask); + t >>= 57; + c[8] = (spint)t; +} + +// copy +inline static void modcpy(const spint *a, spint *c) { + int i; + for (i = 0; i < 9; i++) { + c[i] = a[i]; + } +} + +// square n times +static void modnsqr(spint *a, int n) { + int i; + for (i = 0; i < n; i++) { + modsqr(a, a); + } +} + +// Calculate progenitor +static void modpro(const spint *w, spint *z) { + spint x[9]; + spint t0[9]; + spint t1[9]; + spint t2[9]; + spint t3[9]; + spint t4[9]; + spint t5[9]; + spint t6[9]; + modcpy(w, x); + modcpy(x, z); + modnsqr(z, 2); + modmul(x, z, t0); + modmul(x, t0, z); + modsqr(z, t1); + modmul(x, t1, t1); + modsqr(t1, t3); + modsqr(t3, t2); + modmul(t3, t2, t4); + modsqr(t4, t5); + modcpy(t5, t2); + modnsqr(t2, 2); + modsqr(t2, t6); + modmul(t2, t6, t6); + modmul(t5, t6, t5); + modnsqr(t5, 5); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 12); + modmul(t2, t5, t2); + modcpy(t2, t5); + modnsqr(t5, 2); + modmul(t2, t5, t5); + modmul(t4, t5, t4); + modsqr(t4, t5); + modmul(t2, t5, t2); + modmul(t4, t2, t4); + modnsqr(t4, 27); + modmul(t2, t4, t2); + modmul(t1, t2, t2); + modcpy(t2, t4); + modnsqr(t4, 2); + modmul(t3, t4, t3); + modnsqr(t3, 58); + modmul(t2, t3, t2); + modmul(z, t2, z); + modcpy(z, t2); + modnsqr(t2, 4); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modmul(t1, t0, t1); + modsqr(t1, t2); + modmul(t0, t2, t0); + modcpy(t0, t2); + modnsqr(t2, 2); + modmul(t0, t2, t2); + modmul(t1, t2, t1); + modmul(t0, t1, t0); + modnsqr(t1, 128); + modmul(t0, t1, t1); + modnsqr(t1, 128); + modmul(t0, t1, t0); + modnsqr(t0, 119); + modmul(z, t0, z); +} + +// calculate inverse, provide progenitor h if available +static void modinv(const spint *x, const spint *h, spint *z) { + spint s[9]; + spint t[9]; + if (h == NULL) { + modpro(x, t); + } else { + modcpy(h, t); + } + modcpy(x, s); + modnsqr(t, 2); + modmul(s, t, z); +} + +// Convert m to n-residue form, n=nres(m) +static void nres(const spint *m, spint *n) { + const spint c[9] = { + 0x25ed097b43c668u, 0x84bda12f684bdau, 0xd097b425ed097bu, + 0x1da12f684bda12fu, 0x17b425ed097b425u, 0x12f684bda12f684u, + 0x25ed097b425ed0u, 0x84bda12f684bdau, 0x117b425ed097bu}; + modmul(m, c, n); +} + +// Convert n back to normal form, m=redc(n) +static void redc(const spint *n, spint *m) { + int i; + spint c[9]; + c[0] = 1; + for (i = 1; i < 9; i++) { + c[i] = 0; + } + modmul(n, c, m); + (void)modfsb(m); +} + +// is unity? +static int modis1(const spint *a) { + int i; + spint c[9]; + spint c0; + spint d = 0; + redc(a, c); + for (i = 1; i < 9; i++) { + d |= c[i]; + } + c0 = (spint)c[0]; + return ((spint)1 & ((d - (spint)1) >> 57u) & + (((c0 ^ (spint)1) - (spint)1) >> 57u)); +} + +// is zero? +static int modis0(const spint *a) { + int i; + spint c[9]; + spint d = 0; + redc(a, c); + for (i = 0; i < 9; i++) { + d |= c[i]; + } + return ((spint)1 & ((d - (spint)1) >> 57u)); +} + +// set to zero +static void modzer(spint *a) { + int i; + for (i = 0; i < 9; i++) { + a[i] = 0; + } +} + +// set to one +static void modone(spint *a) { + int i; + a[0] = 1; + for (i = 1; i < 9; i++) { + a[i] = 0; + } + nres(a, a); +} + +// set to integer +static void modint(int x, spint *a) { + int i; + a[0] = (spint)x; + for (i = 1; i < 9; i++) { + a[i] = 0; + } + nres(a, a); +} + +// Modular multiplication by an integer, c=a*b mod 2p +inline static void modmli(const spint *a, int b, spint *c) { + spint t[9]; + modint(b, t); + modmul(a, t, c); +} + +// Test for quadratic residue +static int modqr(const spint *h, const spint *x) { + spint r[9]; + if (h == NULL) { + modpro(x, r); + modsqr(r, r); + } else { + modsqr(h, r); + } + modmul(r, x, r); + return modis1(r) | modis0(x); +} + +// conditional move g to f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcmv(int b, const spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t; + spint r = 0x3cc3c33c5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 9; i++) { + s = g[i]; + t = f[i]; + f[i] = c0 * t + c1 * s; + f[i] -= r * (t + s); + } +} + +// conditional swap g and f if d=1 +// strongly recommend inlining be disabled using compiler specific syntax +static void modcsw(int b, volatile spint *g, volatile spint *f) { + int i; + spint c0, c1, s, t, w; + spint r = 0x3cc3c33c5aa5a55au; + c0 = (1 - b) + r; + c1 = b + r; + for (i = 0; i < 9; i++) { + s = g[i]; + t = f[i]; + w = r * (t + s); + f[i] = c0 * t + c1 * s; + f[i] -= w; + g[i] = c0 * s + c1 * t; + g[i] -= w; + } +} + +// Modular square root, provide progenitor h if available, NULL if not +static void modsqrt(const spint *x, const spint *h, spint *r) { + spint s[9]; + spint y[9]; + if (h == NULL) { + modpro(x, y); + } else { + modcpy(h, y); + } + modmul(y, x, s); + modcpy(s, r); +} + +// shift left by less than a word +static void modshl(unsigned int n, spint *a) { + int i; + a[8] = ((a[8] << n)) | (a[7] >> (57u - n)); + for (i = 7; i > 0; i--) { + a[i] = ((a[i] << n) & (spint)0x1ffffffffffffff) | (a[i - 1] >> (57u - n)); + } + a[0] = (a[0] << n) & (spint)0x1ffffffffffffff; +} + +// shift right by less than a word. Return shifted out part +static int modshr(unsigned int n, spint *a) { + int i; + spint r = a[0] & (((spint)1 << n) - (spint)1); + for (i = 0; i < 8; i++) { + a[i] = (a[i] >> n) | ((a[i + 1] << (57u - n)) & (spint)0x1ffffffffffffff); + } + a[8] = a[8] >> n; + return r; +} + +// set a= 2^r +static void mod2r(unsigned int r, spint *a) { + unsigned int n = r / 57u; + unsigned int m = r % 57u; + modzer(a); + if (r >= 64 * 8) + return; + a[n] = 1; + a[n] <<= m; + nres(a, a); +} + +// export to byte array +static void modexp(const spint *a, char *b) { + int i; + spint c[9]; + redc(a, c); + for (i = 63; i >= 0; i--) { + b[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +// import from byte array +// returns 1 if in range, else 0 +static int modimp(const char *b, spint *a) { + int i, res; + for (i = 0; i < 9; i++) { + a[i] = 0; + } + for (i = 0; i < 64; i++) { + modshl(8, a); + a[0] += (spint)(unsigned char)b[i]; + } + res = modfsb(a); + nres(a, a); + return res; +} + +// determine sign +static int modsign(const spint *a) { + spint c[9]; + redc(a, c); + return c[0] % 2; +} + +// return true if equal +static int modcmp(const spint *a, const spint *b) { + spint c[9], d[9]; + int i, eq = 1; + redc(a, c); + redc(b, d); + for (i = 0; i < 9; i++) { + eq &= (((c[i] ^ d[i]) - 1) >> 57) & 1; + } + return eq; +} + +// clang-format on +/****************************************************************************** + API functions calling generated code above + ******************************************************************************/ + +#include + +const digit_t ZERO[NWORDS_FIELD] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; +const digit_t ONE[NWORDS_FIELD] = { 0x000000000000012f, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000b00000000000 }; +// Montgomery representation of 2^-1 +static const digit_t TWO_INV[NWORDS_FIELD] = { 0x0000000000000097, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0001300000000000 }; +// Montgomery representation of 3^-1 +static const digit_t THREE_INV[NWORDS_FIELD] = { 0x00aaaaaaaaaaab0f, 0x0155555555555555, 0x00aaaaaaaaaaaaaa, + 0x0155555555555555, 0x00aaaaaaaaaaaaaa, 0x0155555555555555, + 0x00aaaaaaaaaaaaaa, 0x0155555555555555, 0x00015aaaaaaaaaaa }; +// Montgomery representation of 2^512 +static const digit_t R2[NWORDS_FIELD] = { 0x0012f684bda1e334, 0x01425ed097b425ed, 0x01684bda12f684bd, + 0x01ed097b425ed097, 0x00bda12f684bda12, 0x0097b425ed097b42, + 0x0012f684bda12f68, 0x01425ed097b425ed, 0x00008bda12f684bd }; + +void +fp_set_small(fp_t *x, const digit_t val) +{ + modint((int)val, *x); +} + +void +fp_mul_small(fp_t *x, const fp_t *a, const uint32_t val) +{ + modmli(*a, (int)val, *x); +} + +void +fp_set_zero(fp_t *x) +{ + modzer(*x); +} + +void +fp_set_one(fp_t *x) +{ + modone(*x); +} + +uint32_t +fp_is_equal(const fp_t *a, const fp_t *b) +{ + return -(uint32_t)modcmp(*a, *b); +} + +uint32_t +fp_is_zero(const fp_t *a) +{ + return -(uint32_t)modis0(*a); +} + +void +fp_copy(fp_t *out, const fp_t *a) +{ + modcpy(*a, *out); +} + +void +fp_cswap(fp_t *a, fp_t *b, uint32_t ctl) +{ + modcsw((int)(ctl & 0x1), *a, *b); +} + +void +fp_add(fp_t *out, const fp_t *a, const fp_t *b) +{ + modadd(*a, *b, *out); +} + +void +fp_sub(fp_t *out, const fp_t *a, const fp_t *b) +{ + modsub(*a, *b, *out); +} + +void +fp_neg(fp_t *out, const fp_t *a) +{ + modneg(*a, *out); +} + +void +fp_sqr(fp_t *out, const fp_t *a) +{ + modsqr(*a, *out); +} + +void +fp_mul(fp_t *out, const fp_t *a, const fp_t *b) +{ + modmul(*a, *b, *out); +} + +void +fp_inv(fp_t *x) +{ + modinv(*x, NULL, *x); +} + +uint32_t +fp_is_square(const fp_t *a) +{ + return -(uint32_t)modqr(NULL, *a); +} + +void +fp_sqrt(fp_t *a) +{ + modsqrt(*a, NULL, *a); +} + +void +fp_half(fp_t *out, const fp_t *a) +{ + modmul(TWO_INV, *a, *out); +} + +void +fp_exp3div4(fp_t *out, const fp_t *a) +{ + modpro(*a, *out); +} + +void +fp_div3(fp_t *out, const fp_t *a) +{ + modmul(THREE_INV, *a, *out); +} + +void +fp_encode(void *dst, const fp_t *a) +{ + // Modified version of modexp() + int i; + spint c[9]; + redc(*a, c); + for (i = 0; i < 64; i++) { + ((char *)dst)[i] = c[0] & (spint)0xff; + (void)modshr(8, c); + } +} + +uint32_t +fp_decode(fp_t *d, const void *src) +{ + // Modified version of modimp() + int i; + spint res; + const unsigned char *b = src; + for (i = 0; i < 9; i++) { + (*d)[i] = 0; + } + for (i = 63; i >= 0; i--) { + modshl(8, *d); + (*d)[0] += (spint)b[i]; + } + res = (spint)-modfsb(*d); + nres(*d, *d); + // If the value was canonical then res = -1; otherwise, res = 0 + for (i = 0; i < 9; i++) { + (*d)[i] &= res; + } + return (uint32_t)res; +} + +static inline unsigned char +add_carry(unsigned char cc, spint a, spint b, spint *d) +{ + udpint t = (udpint)a + (udpint)b + cc; + *d = (spint)t; + return (unsigned char)(t >> Wordlength); +} + +static void +partial_reduce(spint *out, const spint *src) +{ + spint h, l, quo, rem; + unsigned char cc; + + // Split value in high (12 bits) and low (500 bits) parts. + h = src[7] >> 52; + l = src[7] & 0x000FFFFFFFFFFFFF; + + // 27*2^500 = 1 mod q; hence, we add floor(h/27) + (h mod 27)*2^500 + // to the low part. + quo = (h * 0x12F7) >> 17; + rem = h - (27 * quo); + cc = add_carry(0, src[0], quo, &out[0]); + cc = add_carry(cc, src[1], 0, &out[1]); + cc = add_carry(cc, src[2], 0, &out[2]); + cc = add_carry(cc, src[3], 0, &out[3]); + cc = add_carry(cc, src[4], 0, &out[4]); + cc = add_carry(cc, src[5], 0, &out[5]); + cc = add_carry(cc, src[6], 0, &out[6]); + (void)add_carry(cc, l, rem << 52, &out[7]); +} + +// Little-endian encoding of a 64-bit integer. +static inline void +enc64le(void *dst, uint64_t x) +{ + uint8_t *buf = dst; + buf[0] = (uint8_t)x; + buf[1] = (uint8_t)(x >> 8); + buf[2] = (uint8_t)(x >> 16); + buf[3] = (uint8_t)(x >> 24); + buf[4] = (uint8_t)(x >> 32); + buf[5] = (uint8_t)(x >> 40); + buf[6] = (uint8_t)(x >> 48); + buf[7] = (uint8_t)(x >> 56); +} + +// Little-endian decoding of a 64-bit integer. +static inline uint64_t +dec64le(const void *src) +{ + const uint8_t *buf = src; + return (spint)buf[0] | ((spint)buf[1] << 8) | ((spint)buf[2] << 16) | ((spint)buf[3] << 24) | + ((spint)buf[4] << 32) | ((spint)buf[5] << 40) | ((spint)buf[6] << 48) | ((spint)buf[7] << 56); +} + +void +fp_decode_reduce(fp_t *d, const void *src, size_t len) +{ + uint64_t t[8]; // Stores Nbytes * 8 bits + uint8_t tmp[64]; // Nbytes + const uint8_t *b = src; + + fp_set_zero(d); + if (len == 0) { + return; + } + + size_t rem = len % 64; + if (rem != 0) { + // Input size is not a multiple of 64, we decode a partial + // block, which is already less than 2^500. + size_t k = len - rem; + memcpy(tmp, b + k, len - k); + memset(tmp + len - k, 0, (sizeof tmp) - (len - k)); + fp_decode(d, tmp); + len = k; + } + // Process all remaining blocks, in descending address order. + while (len > 0) { + fp_mul(d, d, &R2); + len -= 64; + t[0] = dec64le(b + len); + t[1] = dec64le(b + len + 8); + t[2] = dec64le(b + len + 16); + t[3] = dec64le(b + len + 24); + t[4] = dec64le(b + len + 32); + t[5] = dec64le(b + len + 40); + t[6] = dec64le(b + len + 48); + t[7] = dec64le(b + len + 56); + partial_reduce(t, t); + enc64le(tmp, t[0]); + enc64le(tmp + 8, t[1]); + enc64le(tmp + 16, t[2]); + enc64le(tmp + 24, t[3]); + enc64le(tmp + 32, t[4]); + enc64le(tmp + 40, t[5]); + enc64le(tmp + 48, t[6]); + enc64le(tmp + 56, t[7]); + fp_t a; + fp_decode(&a, tmp); + fp_add(d, d, &a); + } +} diff --git a/src/gf/ref/lvl5/fp_p318233.c b/src/gf/ref/lvl5/fp_p318233.c deleted file mode 100644 index c76c4bb..0000000 --- a/src/gf/ref/lvl5/fp_p318233.c +++ /dev/null @@ -1,5491 +0,0 @@ -/* Autogenerated: './src/ExtractionOCaml/word_by_word_montgomery' p318233 64 0x255946a8869bc68c15b0036936e79202bdbe6326507d01fe3ac5904a0dea65faf0a29a781974ce994c68ada6e1ffffffffffffffffffffffffffffffffffff */ -/* curve description: p318233 */ -/* machine_wordsize = 64 (from "64") */ -/* requested operations: (all) */ -/* m = 0x255946a8869bc68c15b0036936e79202bdbe6326507d01fe3ac5904a0dea65faf0a29a781974ce994c68ada6e1ffffffffffffffffffffffffffffffffffff (from "0x255946a8869bc68c15b0036936e79202bdbe6326507d01fe3ac5904a0dea65faf0a29a781974ce994c68ada6e1ffffffffffffffffffffffffffffffffffff") */ -/* */ -/* NOTE: In addition to the bounds specified above each function, all */ -/* functions synthesized for this Montgomery arithmetic require the */ -/* input to be strictly less than the prime modulus (m), and also */ -/* require the input to be in the unique saturated representation. */ -/* All functions also ensure that these two properties are true of */ -/* return values. */ -/* */ -/* Computed values: */ -/* eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) + (z[6] << 0x180) + (z[7] << 0x1c0) */ -/* bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) + (z[32] << 256) + (z[33] << 0x108) + (z[34] << 0x110) + (z[35] << 0x118) + (z[36] << 0x120) + (z[37] << 0x128) + (z[38] << 0x130) + (z[39] << 0x138) + (z[40] << 0x140) + (z[41] << 0x148) + (z[42] << 0x150) + (z[43] << 0x158) + (z[44] << 0x160) + (z[45] << 0x168) + (z[46] << 0x170) + (z[47] << 0x178) + (z[48] << 0x180) + (z[49] << 0x188) + (z[50] << 0x190) + (z[51] << 0x198) + (z[52] << 0x1a0) + (z[53] << 0x1a8) + (z[54] << 0x1b0) + (z[55] << 0x1b8) + (z[56] << 0x1c0) + (z[57] << 0x1c8) + (z[58] << 0x1d0) + (z[59] << 0x1d8) + (z[60] << 0x1e0) + (z[61] << 0x1e8) + (z[62] << 0x1f0) */ -/* twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) + (z[6] << 0x180) + (z[7] << 0x1c0) in */ -/* if x1 & (2^512-1) < 2^511 then x1 & (2^512-1) else (x1 & (2^512-1)) - 2^512 */ - -#include -typedef unsigned char fiat_p318233_uint1; -typedef signed char fiat_p318233_int1; -#if defined(__GNUC__) || defined(__clang__) -# define FIAT_P318233_FIAT_EXTENSION __extension__ -# define FIAT_P318233_FIAT_INLINE __inline__ -#else -# define FIAT_P318233_FIAT_EXTENSION -# define FIAT_P318233_FIAT_INLINE -#endif - -FIAT_P318233_FIAT_EXTENSION typedef signed __int128 fiat_p318233_int128; -FIAT_P318233_FIAT_EXTENSION typedef unsigned __int128 fiat_p318233_uint128; - -/* The type fiat_p318233_montgomery_domain_field_element is a field element in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p318233_montgomery_domain_field_element[8]; - -/* The type fiat_p318233_non_montgomery_domain_field_element is a field element NOT in the Montgomery domain. */ -/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ -typedef uint64_t fiat_p318233_non_montgomery_domain_field_element[8]; - -#if (-1 & 3) != 3 -#error "This code only works on a two's complement system" -#endif - - -/* - * The function fiat_p318233_addcarryx_u64 is an addition with carry. - * - * Postconditions: - * out1 = (arg1 + arg2 + arg3) mod 2^64 - * out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -void fiat_p318233_addcarryx_u64(uint64_t* out1, fiat_p318233_uint1* out2, fiat_p318233_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p318233_uint128 x1; - uint64_t x2; - fiat_p318233_uint1 x3; - x1 = ((arg1 + (fiat_p318233_uint128)arg2) + arg3); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (fiat_p318233_uint1)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p318233_subborrowx_u64 is a subtraction with borrow. - * - * Postconditions: - * out1 = (-arg1 + arg2 + -arg3) mod 2^64 - * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0x1] - */ -void fiat_p318233_subborrowx_u64(uint64_t* out1, fiat_p318233_uint1* out2, fiat_p318233_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p318233_int128 x1; - fiat_p318233_int1 x2; - uint64_t x3; - x1 = ((arg2 - (fiat_p318233_int128)arg1) - arg3); - x2 = (fiat_p318233_int1)(x1 >> 64); - x3 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - *out1 = x3; - *out2 = (fiat_p318233_uint1)(0x0 - x2); -} - -/* - * The function fiat_p318233_mulx_u64 is a multiplication, returning the full double-width result. - * - * Postconditions: - * out1 = (arg1 * arg2) mod 2^64 - * out2 = ⌊arg1 * arg2 / 2^64⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0xffffffffffffffff] - * arg2: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - * out2: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p318233_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) { - fiat_p318233_uint128 x1; - uint64_t x2; - uint64_t x3; - x1 = ((fiat_p318233_uint128)arg1 * arg2); - x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff)); - x3 = (uint64_t)(x1 >> 64); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_p318233_cmovznz_u64 is a single-word conditional move. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p318233_cmovznz_u64(uint64_t* out1, fiat_p318233_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_p318233_uint1 x1; - uint64_t x2; - uint64_t x3; - x1 = (!(!arg1)); - x2 = ((fiat_p318233_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff)); - x3 = ((x2 & arg3) | ((~x2) & arg2)); - *out1 = x3; -} - -/* - * The function fiat_p318233_mul multiplies two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_mul(fiat_p318233_montgomery_domain_field_element out1, const fiat_p318233_montgomery_domain_field_element arg1, const fiat_p318233_montgomery_domain_field_element arg2) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - fiat_p318233_uint1 x26; - uint64_t x27; - fiat_p318233_uint1 x28; - uint64_t x29; - fiat_p318233_uint1 x30; - uint64_t x31; - fiat_p318233_uint1 x32; - uint64_t x33; - fiat_p318233_uint1 x34; - uint64_t x35; - fiat_p318233_uint1 x36; - uint64_t x37; - fiat_p318233_uint1 x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint64_t x55; - uint64_t x56; - fiat_p318233_uint1 x57; - uint64_t x58; - fiat_p318233_uint1 x59; - uint64_t x60; - fiat_p318233_uint1 x61; - uint64_t x62; - fiat_p318233_uint1 x63; - uint64_t x64; - fiat_p318233_uint1 x65; - uint64_t x66; - fiat_p318233_uint1 x67; - uint64_t x68; - fiat_p318233_uint1 x69; - uint64_t x70; - uint64_t x71; - fiat_p318233_uint1 x72; - uint64_t x73; - fiat_p318233_uint1 x74; - uint64_t x75; - fiat_p318233_uint1 x76; - uint64_t x77; - fiat_p318233_uint1 x78; - uint64_t x79; - fiat_p318233_uint1 x80; - uint64_t x81; - fiat_p318233_uint1 x82; - uint64_t x83; - fiat_p318233_uint1 x84; - uint64_t x85; - fiat_p318233_uint1 x86; - uint64_t x87; - fiat_p318233_uint1 x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - uint64_t x105; - fiat_p318233_uint1 x106; - uint64_t x107; - fiat_p318233_uint1 x108; - uint64_t x109; - fiat_p318233_uint1 x110; - uint64_t x111; - fiat_p318233_uint1 x112; - uint64_t x113; - fiat_p318233_uint1 x114; - uint64_t x115; - fiat_p318233_uint1 x116; - uint64_t x117; - fiat_p318233_uint1 x118; - uint64_t x119; - uint64_t x120; - fiat_p318233_uint1 x121; - uint64_t x122; - fiat_p318233_uint1 x123; - uint64_t x124; - fiat_p318233_uint1 x125; - uint64_t x126; - fiat_p318233_uint1 x127; - uint64_t x128; - fiat_p318233_uint1 x129; - uint64_t x130; - fiat_p318233_uint1 x131; - uint64_t x132; - fiat_p318233_uint1 x133; - uint64_t x134; - fiat_p318233_uint1 x135; - uint64_t x136; - fiat_p318233_uint1 x137; - uint64_t x138; - uint64_t x139; - uint64_t x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - uint64_t x144; - uint64_t x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - fiat_p318233_uint1 x155; - uint64_t x156; - fiat_p318233_uint1 x157; - uint64_t x158; - fiat_p318233_uint1 x159; - uint64_t x160; - fiat_p318233_uint1 x161; - uint64_t x162; - fiat_p318233_uint1 x163; - uint64_t x164; - fiat_p318233_uint1 x165; - uint64_t x166; - fiat_p318233_uint1 x167; - uint64_t x168; - uint64_t x169; - fiat_p318233_uint1 x170; - uint64_t x171; - fiat_p318233_uint1 x172; - uint64_t x173; - fiat_p318233_uint1 x174; - uint64_t x175; - fiat_p318233_uint1 x176; - uint64_t x177; - fiat_p318233_uint1 x178; - uint64_t x179; - fiat_p318233_uint1 x180; - uint64_t x181; - fiat_p318233_uint1 x182; - uint64_t x183; - fiat_p318233_uint1 x184; - uint64_t x185; - fiat_p318233_uint1 x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - uint64_t x191; - uint64_t x192; - uint64_t x193; - uint64_t x194; - uint64_t x195; - uint64_t x196; - uint64_t x197; - uint64_t x198; - uint64_t x199; - uint64_t x200; - uint64_t x201; - uint64_t x202; - uint64_t x203; - uint64_t x204; - fiat_p318233_uint1 x205; - uint64_t x206; - fiat_p318233_uint1 x207; - uint64_t x208; - fiat_p318233_uint1 x209; - uint64_t x210; - fiat_p318233_uint1 x211; - uint64_t x212; - fiat_p318233_uint1 x213; - uint64_t x214; - fiat_p318233_uint1 x215; - uint64_t x216; - fiat_p318233_uint1 x217; - uint64_t x218; - uint64_t x219; - fiat_p318233_uint1 x220; - uint64_t x221; - fiat_p318233_uint1 x222; - uint64_t x223; - fiat_p318233_uint1 x224; - uint64_t x225; - fiat_p318233_uint1 x226; - uint64_t x227; - fiat_p318233_uint1 x228; - uint64_t x229; - fiat_p318233_uint1 x230; - uint64_t x231; - fiat_p318233_uint1 x232; - uint64_t x233; - fiat_p318233_uint1 x234; - uint64_t x235; - fiat_p318233_uint1 x236; - uint64_t x237; - uint64_t x238; - uint64_t x239; - uint64_t x240; - uint64_t x241; - uint64_t x242; - uint64_t x243; - uint64_t x244; - uint64_t x245; - uint64_t x246; - uint64_t x247; - uint64_t x248; - uint64_t x249; - uint64_t x250; - uint64_t x251; - uint64_t x252; - uint64_t x253; - fiat_p318233_uint1 x254; - uint64_t x255; - fiat_p318233_uint1 x256; - uint64_t x257; - fiat_p318233_uint1 x258; - uint64_t x259; - fiat_p318233_uint1 x260; - uint64_t x261; - fiat_p318233_uint1 x262; - uint64_t x263; - fiat_p318233_uint1 x264; - uint64_t x265; - fiat_p318233_uint1 x266; - uint64_t x267; - uint64_t x268; - fiat_p318233_uint1 x269; - uint64_t x270; - fiat_p318233_uint1 x271; - uint64_t x272; - fiat_p318233_uint1 x273; - uint64_t x274; - fiat_p318233_uint1 x275; - uint64_t x276; - fiat_p318233_uint1 x277; - uint64_t x278; - fiat_p318233_uint1 x279; - uint64_t x280; - fiat_p318233_uint1 x281; - uint64_t x282; - fiat_p318233_uint1 x283; - uint64_t x284; - fiat_p318233_uint1 x285; - uint64_t x286; - uint64_t x287; - uint64_t x288; - uint64_t x289; - uint64_t x290; - uint64_t x291; - uint64_t x292; - uint64_t x293; - uint64_t x294; - uint64_t x295; - uint64_t x296; - uint64_t x297; - uint64_t x298; - uint64_t x299; - uint64_t x300; - uint64_t x301; - uint64_t x302; - uint64_t x303; - fiat_p318233_uint1 x304; - uint64_t x305; - fiat_p318233_uint1 x306; - uint64_t x307; - fiat_p318233_uint1 x308; - uint64_t x309; - fiat_p318233_uint1 x310; - uint64_t x311; - fiat_p318233_uint1 x312; - uint64_t x313; - fiat_p318233_uint1 x314; - uint64_t x315; - fiat_p318233_uint1 x316; - uint64_t x317; - uint64_t x318; - fiat_p318233_uint1 x319; - uint64_t x320; - fiat_p318233_uint1 x321; - uint64_t x322; - fiat_p318233_uint1 x323; - uint64_t x324; - fiat_p318233_uint1 x325; - uint64_t x326; - fiat_p318233_uint1 x327; - uint64_t x328; - fiat_p318233_uint1 x329; - uint64_t x330; - fiat_p318233_uint1 x331; - uint64_t x332; - fiat_p318233_uint1 x333; - uint64_t x334; - fiat_p318233_uint1 x335; - uint64_t x336; - uint64_t x337; - uint64_t x338; - uint64_t x339; - uint64_t x340; - uint64_t x341; - uint64_t x342; - uint64_t x343; - uint64_t x344; - uint64_t x345; - uint64_t x346; - uint64_t x347; - uint64_t x348; - uint64_t x349; - uint64_t x350; - uint64_t x351; - uint64_t x352; - fiat_p318233_uint1 x353; - uint64_t x354; - fiat_p318233_uint1 x355; - uint64_t x356; - fiat_p318233_uint1 x357; - uint64_t x358; - fiat_p318233_uint1 x359; - uint64_t x360; - fiat_p318233_uint1 x361; - uint64_t x362; - fiat_p318233_uint1 x363; - uint64_t x364; - fiat_p318233_uint1 x365; - uint64_t x366; - uint64_t x367; - fiat_p318233_uint1 x368; - uint64_t x369; - fiat_p318233_uint1 x370; - uint64_t x371; - fiat_p318233_uint1 x372; - uint64_t x373; - fiat_p318233_uint1 x374; - uint64_t x375; - fiat_p318233_uint1 x376; - uint64_t x377; - fiat_p318233_uint1 x378; - uint64_t x379; - fiat_p318233_uint1 x380; - uint64_t x381; - fiat_p318233_uint1 x382; - uint64_t x383; - fiat_p318233_uint1 x384; - uint64_t x385; - uint64_t x386; - uint64_t x387; - uint64_t x388; - uint64_t x389; - uint64_t x390; - uint64_t x391; - uint64_t x392; - uint64_t x393; - uint64_t x394; - uint64_t x395; - uint64_t x396; - uint64_t x397; - uint64_t x398; - uint64_t x399; - uint64_t x400; - uint64_t x401; - uint64_t x402; - fiat_p318233_uint1 x403; - uint64_t x404; - fiat_p318233_uint1 x405; - uint64_t x406; - fiat_p318233_uint1 x407; - uint64_t x408; - fiat_p318233_uint1 x409; - uint64_t x410; - fiat_p318233_uint1 x411; - uint64_t x412; - fiat_p318233_uint1 x413; - uint64_t x414; - fiat_p318233_uint1 x415; - uint64_t x416; - uint64_t x417; - fiat_p318233_uint1 x418; - uint64_t x419; - fiat_p318233_uint1 x420; - uint64_t x421; - fiat_p318233_uint1 x422; - uint64_t x423; - fiat_p318233_uint1 x424; - uint64_t x425; - fiat_p318233_uint1 x426; - uint64_t x427; - fiat_p318233_uint1 x428; - uint64_t x429; - fiat_p318233_uint1 x430; - uint64_t x431; - fiat_p318233_uint1 x432; - uint64_t x433; - fiat_p318233_uint1 x434; - uint64_t x435; - uint64_t x436; - uint64_t x437; - uint64_t x438; - uint64_t x439; - uint64_t x440; - uint64_t x441; - uint64_t x442; - uint64_t x443; - uint64_t x444; - uint64_t x445; - uint64_t x446; - uint64_t x447; - uint64_t x448; - uint64_t x449; - uint64_t x450; - uint64_t x451; - fiat_p318233_uint1 x452; - uint64_t x453; - fiat_p318233_uint1 x454; - uint64_t x455; - fiat_p318233_uint1 x456; - uint64_t x457; - fiat_p318233_uint1 x458; - uint64_t x459; - fiat_p318233_uint1 x460; - uint64_t x461; - fiat_p318233_uint1 x462; - uint64_t x463; - fiat_p318233_uint1 x464; - uint64_t x465; - uint64_t x466; - fiat_p318233_uint1 x467; - uint64_t x468; - fiat_p318233_uint1 x469; - uint64_t x470; - fiat_p318233_uint1 x471; - uint64_t x472; - fiat_p318233_uint1 x473; - uint64_t x474; - fiat_p318233_uint1 x475; - uint64_t x476; - fiat_p318233_uint1 x477; - uint64_t x478; - fiat_p318233_uint1 x479; - uint64_t x480; - fiat_p318233_uint1 x481; - uint64_t x482; - fiat_p318233_uint1 x483; - uint64_t x484; - uint64_t x485; - uint64_t x486; - uint64_t x487; - uint64_t x488; - uint64_t x489; - uint64_t x490; - uint64_t x491; - uint64_t x492; - uint64_t x493; - uint64_t x494; - uint64_t x495; - uint64_t x496; - uint64_t x497; - uint64_t x498; - uint64_t x499; - uint64_t x500; - uint64_t x501; - fiat_p318233_uint1 x502; - uint64_t x503; - fiat_p318233_uint1 x504; - uint64_t x505; - fiat_p318233_uint1 x506; - uint64_t x507; - fiat_p318233_uint1 x508; - uint64_t x509; - fiat_p318233_uint1 x510; - uint64_t x511; - fiat_p318233_uint1 x512; - uint64_t x513; - fiat_p318233_uint1 x514; - uint64_t x515; - uint64_t x516; - fiat_p318233_uint1 x517; - uint64_t x518; - fiat_p318233_uint1 x519; - uint64_t x520; - fiat_p318233_uint1 x521; - uint64_t x522; - fiat_p318233_uint1 x523; - uint64_t x524; - fiat_p318233_uint1 x525; - uint64_t x526; - fiat_p318233_uint1 x527; - uint64_t x528; - fiat_p318233_uint1 x529; - uint64_t x530; - fiat_p318233_uint1 x531; - uint64_t x532; - fiat_p318233_uint1 x533; - uint64_t x534; - uint64_t x535; - uint64_t x536; - uint64_t x537; - uint64_t x538; - uint64_t x539; - uint64_t x540; - uint64_t x541; - uint64_t x542; - uint64_t x543; - uint64_t x544; - uint64_t x545; - uint64_t x546; - uint64_t x547; - uint64_t x548; - uint64_t x549; - uint64_t x550; - fiat_p318233_uint1 x551; - uint64_t x552; - fiat_p318233_uint1 x553; - uint64_t x554; - fiat_p318233_uint1 x555; - uint64_t x556; - fiat_p318233_uint1 x557; - uint64_t x558; - fiat_p318233_uint1 x559; - uint64_t x560; - fiat_p318233_uint1 x561; - uint64_t x562; - fiat_p318233_uint1 x563; - uint64_t x564; - uint64_t x565; - fiat_p318233_uint1 x566; - uint64_t x567; - fiat_p318233_uint1 x568; - uint64_t x569; - fiat_p318233_uint1 x570; - uint64_t x571; - fiat_p318233_uint1 x572; - uint64_t x573; - fiat_p318233_uint1 x574; - uint64_t x575; - fiat_p318233_uint1 x576; - uint64_t x577; - fiat_p318233_uint1 x578; - uint64_t x579; - fiat_p318233_uint1 x580; - uint64_t x581; - fiat_p318233_uint1 x582; - uint64_t x583; - uint64_t x584; - uint64_t x585; - uint64_t x586; - uint64_t x587; - uint64_t x588; - uint64_t x589; - uint64_t x590; - uint64_t x591; - uint64_t x592; - uint64_t x593; - uint64_t x594; - uint64_t x595; - uint64_t x596; - uint64_t x597; - uint64_t x598; - uint64_t x599; - uint64_t x600; - fiat_p318233_uint1 x601; - uint64_t x602; - fiat_p318233_uint1 x603; - uint64_t x604; - fiat_p318233_uint1 x605; - uint64_t x606; - fiat_p318233_uint1 x607; - uint64_t x608; - fiat_p318233_uint1 x609; - uint64_t x610; - fiat_p318233_uint1 x611; - uint64_t x612; - fiat_p318233_uint1 x613; - uint64_t x614; - uint64_t x615; - fiat_p318233_uint1 x616; - uint64_t x617; - fiat_p318233_uint1 x618; - uint64_t x619; - fiat_p318233_uint1 x620; - uint64_t x621; - fiat_p318233_uint1 x622; - uint64_t x623; - fiat_p318233_uint1 x624; - uint64_t x625; - fiat_p318233_uint1 x626; - uint64_t x627; - fiat_p318233_uint1 x628; - uint64_t x629; - fiat_p318233_uint1 x630; - uint64_t x631; - fiat_p318233_uint1 x632; - uint64_t x633; - uint64_t x634; - uint64_t x635; - uint64_t x636; - uint64_t x637; - uint64_t x638; - uint64_t x639; - uint64_t x640; - uint64_t x641; - uint64_t x642; - uint64_t x643; - uint64_t x644; - uint64_t x645; - uint64_t x646; - uint64_t x647; - uint64_t x648; - uint64_t x649; - fiat_p318233_uint1 x650; - uint64_t x651; - fiat_p318233_uint1 x652; - uint64_t x653; - fiat_p318233_uint1 x654; - uint64_t x655; - fiat_p318233_uint1 x656; - uint64_t x657; - fiat_p318233_uint1 x658; - uint64_t x659; - fiat_p318233_uint1 x660; - uint64_t x661; - fiat_p318233_uint1 x662; - uint64_t x663; - uint64_t x664; - fiat_p318233_uint1 x665; - uint64_t x666; - fiat_p318233_uint1 x667; - uint64_t x668; - fiat_p318233_uint1 x669; - uint64_t x670; - fiat_p318233_uint1 x671; - uint64_t x672; - fiat_p318233_uint1 x673; - uint64_t x674; - fiat_p318233_uint1 x675; - uint64_t x676; - fiat_p318233_uint1 x677; - uint64_t x678; - fiat_p318233_uint1 x679; - uint64_t x680; - fiat_p318233_uint1 x681; - uint64_t x682; - uint64_t x683; - uint64_t x684; - uint64_t x685; - uint64_t x686; - uint64_t x687; - uint64_t x688; - uint64_t x689; - uint64_t x690; - uint64_t x691; - uint64_t x692; - uint64_t x693; - uint64_t x694; - uint64_t x695; - uint64_t x696; - uint64_t x697; - uint64_t x698; - uint64_t x699; - fiat_p318233_uint1 x700; - uint64_t x701; - fiat_p318233_uint1 x702; - uint64_t x703; - fiat_p318233_uint1 x704; - uint64_t x705; - fiat_p318233_uint1 x706; - uint64_t x707; - fiat_p318233_uint1 x708; - uint64_t x709; - fiat_p318233_uint1 x710; - uint64_t x711; - fiat_p318233_uint1 x712; - uint64_t x713; - uint64_t x714; - fiat_p318233_uint1 x715; - uint64_t x716; - fiat_p318233_uint1 x717; - uint64_t x718; - fiat_p318233_uint1 x719; - uint64_t x720; - fiat_p318233_uint1 x721; - uint64_t x722; - fiat_p318233_uint1 x723; - uint64_t x724; - fiat_p318233_uint1 x725; - uint64_t x726; - fiat_p318233_uint1 x727; - uint64_t x728; - fiat_p318233_uint1 x729; - uint64_t x730; - fiat_p318233_uint1 x731; - uint64_t x732; - uint64_t x733; - uint64_t x734; - uint64_t x735; - uint64_t x736; - uint64_t x737; - uint64_t x738; - uint64_t x739; - uint64_t x740; - uint64_t x741; - uint64_t x742; - uint64_t x743; - uint64_t x744; - uint64_t x745; - uint64_t x746; - uint64_t x747; - uint64_t x748; - fiat_p318233_uint1 x749; - uint64_t x750; - fiat_p318233_uint1 x751; - uint64_t x752; - fiat_p318233_uint1 x753; - uint64_t x754; - fiat_p318233_uint1 x755; - uint64_t x756; - fiat_p318233_uint1 x757; - uint64_t x758; - fiat_p318233_uint1 x759; - uint64_t x760; - fiat_p318233_uint1 x761; - uint64_t x762; - uint64_t x763; - fiat_p318233_uint1 x764; - uint64_t x765; - fiat_p318233_uint1 x766; - uint64_t x767; - fiat_p318233_uint1 x768; - uint64_t x769; - fiat_p318233_uint1 x770; - uint64_t x771; - fiat_p318233_uint1 x772; - uint64_t x773; - fiat_p318233_uint1 x774; - uint64_t x775; - fiat_p318233_uint1 x776; - uint64_t x777; - fiat_p318233_uint1 x778; - uint64_t x779; - fiat_p318233_uint1 x780; - uint64_t x781; - uint64_t x782; - fiat_p318233_uint1 x783; - uint64_t x784; - fiat_p318233_uint1 x785; - uint64_t x786; - fiat_p318233_uint1 x787; - uint64_t x788; - fiat_p318233_uint1 x789; - uint64_t x790; - fiat_p318233_uint1 x791; - uint64_t x792; - fiat_p318233_uint1 x793; - uint64_t x794; - fiat_p318233_uint1 x795; - uint64_t x796; - fiat_p318233_uint1 x797; - uint64_t x798; - fiat_p318233_uint1 x799; - uint64_t x800; - uint64_t x801; - uint64_t x802; - uint64_t x803; - uint64_t x804; - uint64_t x805; - uint64_t x806; - uint64_t x807; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[4]); - x5 = (arg1[5]); - x6 = (arg1[6]); - x7 = (arg1[7]); - x8 = (arg1[0]); - fiat_p318233_mulx_u64(&x9, &x10, x8, (arg2[7])); - fiat_p318233_mulx_u64(&x11, &x12, x8, (arg2[6])); - fiat_p318233_mulx_u64(&x13, &x14, x8, (arg2[5])); - fiat_p318233_mulx_u64(&x15, &x16, x8, (arg2[4])); - fiat_p318233_mulx_u64(&x17, &x18, x8, (arg2[3])); - fiat_p318233_mulx_u64(&x19, &x20, x8, (arg2[2])); - fiat_p318233_mulx_u64(&x21, &x22, x8, (arg2[1])); - fiat_p318233_mulx_u64(&x23, &x24, x8, (arg2[0])); - fiat_p318233_addcarryx_u64(&x25, &x26, 0x0, x24, x21); - fiat_p318233_addcarryx_u64(&x27, &x28, x26, x22, x19); - fiat_p318233_addcarryx_u64(&x29, &x30, x28, x20, x17); - fiat_p318233_addcarryx_u64(&x31, &x32, x30, x18, x15); - fiat_p318233_addcarryx_u64(&x33, &x34, x32, x16, x13); - fiat_p318233_addcarryx_u64(&x35, &x36, x34, x14, x11); - fiat_p318233_addcarryx_u64(&x37, &x38, x36, x12, x9); - x39 = (x38 + x10); - fiat_p318233_mulx_u64(&x40, &x41, x23, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x42, &x43, x23, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x44, &x45, x23, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x46, &x47, x23, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x48, &x49, x23, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x50, &x51, x23, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x52, &x53, x23, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x54, &x55, x23, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x56, &x57, 0x0, x55, x52); - fiat_p318233_addcarryx_u64(&x58, &x59, x57, x53, x50); - fiat_p318233_addcarryx_u64(&x60, &x61, x59, x51, x48); - fiat_p318233_addcarryx_u64(&x62, &x63, x61, x49, x46); - fiat_p318233_addcarryx_u64(&x64, &x65, x63, x47, x44); - fiat_p318233_addcarryx_u64(&x66, &x67, x65, x45, x42); - fiat_p318233_addcarryx_u64(&x68, &x69, x67, x43, x40); - x70 = (x69 + x41); - fiat_p318233_addcarryx_u64(&x71, &x72, 0x0, x23, x54); - fiat_p318233_addcarryx_u64(&x73, &x74, x72, x25, x56); - fiat_p318233_addcarryx_u64(&x75, &x76, x74, x27, x58); - fiat_p318233_addcarryx_u64(&x77, &x78, x76, x29, x60); - fiat_p318233_addcarryx_u64(&x79, &x80, x78, x31, x62); - fiat_p318233_addcarryx_u64(&x81, &x82, x80, x33, x64); - fiat_p318233_addcarryx_u64(&x83, &x84, x82, x35, x66); - fiat_p318233_addcarryx_u64(&x85, &x86, x84, x37, x68); - fiat_p318233_addcarryx_u64(&x87, &x88, x86, x39, x70); - fiat_p318233_mulx_u64(&x89, &x90, x1, (arg2[7])); - fiat_p318233_mulx_u64(&x91, &x92, x1, (arg2[6])); - fiat_p318233_mulx_u64(&x93, &x94, x1, (arg2[5])); - fiat_p318233_mulx_u64(&x95, &x96, x1, (arg2[4])); - fiat_p318233_mulx_u64(&x97, &x98, x1, (arg2[3])); - fiat_p318233_mulx_u64(&x99, &x100, x1, (arg2[2])); - fiat_p318233_mulx_u64(&x101, &x102, x1, (arg2[1])); - fiat_p318233_mulx_u64(&x103, &x104, x1, (arg2[0])); - fiat_p318233_addcarryx_u64(&x105, &x106, 0x0, x104, x101); - fiat_p318233_addcarryx_u64(&x107, &x108, x106, x102, x99); - fiat_p318233_addcarryx_u64(&x109, &x110, x108, x100, x97); - fiat_p318233_addcarryx_u64(&x111, &x112, x110, x98, x95); - fiat_p318233_addcarryx_u64(&x113, &x114, x112, x96, x93); - fiat_p318233_addcarryx_u64(&x115, &x116, x114, x94, x91); - fiat_p318233_addcarryx_u64(&x117, &x118, x116, x92, x89); - x119 = (x118 + x90); - fiat_p318233_addcarryx_u64(&x120, &x121, 0x0, x73, x103); - fiat_p318233_addcarryx_u64(&x122, &x123, x121, x75, x105); - fiat_p318233_addcarryx_u64(&x124, &x125, x123, x77, x107); - fiat_p318233_addcarryx_u64(&x126, &x127, x125, x79, x109); - fiat_p318233_addcarryx_u64(&x128, &x129, x127, x81, x111); - fiat_p318233_addcarryx_u64(&x130, &x131, x129, x83, x113); - fiat_p318233_addcarryx_u64(&x132, &x133, x131, x85, x115); - fiat_p318233_addcarryx_u64(&x134, &x135, x133, x87, x117); - fiat_p318233_addcarryx_u64(&x136, &x137, x135, x88, x119); - fiat_p318233_mulx_u64(&x138, &x139, x120, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x140, &x141, x120, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x142, &x143, x120, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x144, &x145, x120, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x146, &x147, x120, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x148, &x149, x120, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x150, &x151, x120, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x152, &x153, x120, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x154, &x155, 0x0, x153, x150); - fiat_p318233_addcarryx_u64(&x156, &x157, x155, x151, x148); - fiat_p318233_addcarryx_u64(&x158, &x159, x157, x149, x146); - fiat_p318233_addcarryx_u64(&x160, &x161, x159, x147, x144); - fiat_p318233_addcarryx_u64(&x162, &x163, x161, x145, x142); - fiat_p318233_addcarryx_u64(&x164, &x165, x163, x143, x140); - fiat_p318233_addcarryx_u64(&x166, &x167, x165, x141, x138); - x168 = (x167 + x139); - fiat_p318233_addcarryx_u64(&x169, &x170, 0x0, x120, x152); - fiat_p318233_addcarryx_u64(&x171, &x172, x170, x122, x154); - fiat_p318233_addcarryx_u64(&x173, &x174, x172, x124, x156); - fiat_p318233_addcarryx_u64(&x175, &x176, x174, x126, x158); - fiat_p318233_addcarryx_u64(&x177, &x178, x176, x128, x160); - fiat_p318233_addcarryx_u64(&x179, &x180, x178, x130, x162); - fiat_p318233_addcarryx_u64(&x181, &x182, x180, x132, x164); - fiat_p318233_addcarryx_u64(&x183, &x184, x182, x134, x166); - fiat_p318233_addcarryx_u64(&x185, &x186, x184, x136, x168); - x187 = ((uint64_t)x186 + x137); - fiat_p318233_mulx_u64(&x188, &x189, x2, (arg2[7])); - fiat_p318233_mulx_u64(&x190, &x191, x2, (arg2[6])); - fiat_p318233_mulx_u64(&x192, &x193, x2, (arg2[5])); - fiat_p318233_mulx_u64(&x194, &x195, x2, (arg2[4])); - fiat_p318233_mulx_u64(&x196, &x197, x2, (arg2[3])); - fiat_p318233_mulx_u64(&x198, &x199, x2, (arg2[2])); - fiat_p318233_mulx_u64(&x200, &x201, x2, (arg2[1])); - fiat_p318233_mulx_u64(&x202, &x203, x2, (arg2[0])); - fiat_p318233_addcarryx_u64(&x204, &x205, 0x0, x203, x200); - fiat_p318233_addcarryx_u64(&x206, &x207, x205, x201, x198); - fiat_p318233_addcarryx_u64(&x208, &x209, x207, x199, x196); - fiat_p318233_addcarryx_u64(&x210, &x211, x209, x197, x194); - fiat_p318233_addcarryx_u64(&x212, &x213, x211, x195, x192); - fiat_p318233_addcarryx_u64(&x214, &x215, x213, x193, x190); - fiat_p318233_addcarryx_u64(&x216, &x217, x215, x191, x188); - x218 = (x217 + x189); - fiat_p318233_addcarryx_u64(&x219, &x220, 0x0, x171, x202); - fiat_p318233_addcarryx_u64(&x221, &x222, x220, x173, x204); - fiat_p318233_addcarryx_u64(&x223, &x224, x222, x175, x206); - fiat_p318233_addcarryx_u64(&x225, &x226, x224, x177, x208); - fiat_p318233_addcarryx_u64(&x227, &x228, x226, x179, x210); - fiat_p318233_addcarryx_u64(&x229, &x230, x228, x181, x212); - fiat_p318233_addcarryx_u64(&x231, &x232, x230, x183, x214); - fiat_p318233_addcarryx_u64(&x233, &x234, x232, x185, x216); - fiat_p318233_addcarryx_u64(&x235, &x236, x234, x187, x218); - fiat_p318233_mulx_u64(&x237, &x238, x219, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x239, &x240, x219, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x241, &x242, x219, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x243, &x244, x219, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x245, &x246, x219, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x247, &x248, x219, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x249, &x250, x219, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x251, &x252, x219, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x253, &x254, 0x0, x252, x249); - fiat_p318233_addcarryx_u64(&x255, &x256, x254, x250, x247); - fiat_p318233_addcarryx_u64(&x257, &x258, x256, x248, x245); - fiat_p318233_addcarryx_u64(&x259, &x260, x258, x246, x243); - fiat_p318233_addcarryx_u64(&x261, &x262, x260, x244, x241); - fiat_p318233_addcarryx_u64(&x263, &x264, x262, x242, x239); - fiat_p318233_addcarryx_u64(&x265, &x266, x264, x240, x237); - x267 = (x266 + x238); - fiat_p318233_addcarryx_u64(&x268, &x269, 0x0, x219, x251); - fiat_p318233_addcarryx_u64(&x270, &x271, x269, x221, x253); - fiat_p318233_addcarryx_u64(&x272, &x273, x271, x223, x255); - fiat_p318233_addcarryx_u64(&x274, &x275, x273, x225, x257); - fiat_p318233_addcarryx_u64(&x276, &x277, x275, x227, x259); - fiat_p318233_addcarryx_u64(&x278, &x279, x277, x229, x261); - fiat_p318233_addcarryx_u64(&x280, &x281, x279, x231, x263); - fiat_p318233_addcarryx_u64(&x282, &x283, x281, x233, x265); - fiat_p318233_addcarryx_u64(&x284, &x285, x283, x235, x267); - x286 = ((uint64_t)x285 + x236); - fiat_p318233_mulx_u64(&x287, &x288, x3, (arg2[7])); - fiat_p318233_mulx_u64(&x289, &x290, x3, (arg2[6])); - fiat_p318233_mulx_u64(&x291, &x292, x3, (arg2[5])); - fiat_p318233_mulx_u64(&x293, &x294, x3, (arg2[4])); - fiat_p318233_mulx_u64(&x295, &x296, x3, (arg2[3])); - fiat_p318233_mulx_u64(&x297, &x298, x3, (arg2[2])); - fiat_p318233_mulx_u64(&x299, &x300, x3, (arg2[1])); - fiat_p318233_mulx_u64(&x301, &x302, x3, (arg2[0])); - fiat_p318233_addcarryx_u64(&x303, &x304, 0x0, x302, x299); - fiat_p318233_addcarryx_u64(&x305, &x306, x304, x300, x297); - fiat_p318233_addcarryx_u64(&x307, &x308, x306, x298, x295); - fiat_p318233_addcarryx_u64(&x309, &x310, x308, x296, x293); - fiat_p318233_addcarryx_u64(&x311, &x312, x310, x294, x291); - fiat_p318233_addcarryx_u64(&x313, &x314, x312, x292, x289); - fiat_p318233_addcarryx_u64(&x315, &x316, x314, x290, x287); - x317 = (x316 + x288); - fiat_p318233_addcarryx_u64(&x318, &x319, 0x0, x270, x301); - fiat_p318233_addcarryx_u64(&x320, &x321, x319, x272, x303); - fiat_p318233_addcarryx_u64(&x322, &x323, x321, x274, x305); - fiat_p318233_addcarryx_u64(&x324, &x325, x323, x276, x307); - fiat_p318233_addcarryx_u64(&x326, &x327, x325, x278, x309); - fiat_p318233_addcarryx_u64(&x328, &x329, x327, x280, x311); - fiat_p318233_addcarryx_u64(&x330, &x331, x329, x282, x313); - fiat_p318233_addcarryx_u64(&x332, &x333, x331, x284, x315); - fiat_p318233_addcarryx_u64(&x334, &x335, x333, x286, x317); - fiat_p318233_mulx_u64(&x336, &x337, x318, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x338, &x339, x318, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x340, &x341, x318, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x342, &x343, x318, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x344, &x345, x318, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x346, &x347, x318, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x348, &x349, x318, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x350, &x351, x318, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x352, &x353, 0x0, x351, x348); - fiat_p318233_addcarryx_u64(&x354, &x355, x353, x349, x346); - fiat_p318233_addcarryx_u64(&x356, &x357, x355, x347, x344); - fiat_p318233_addcarryx_u64(&x358, &x359, x357, x345, x342); - fiat_p318233_addcarryx_u64(&x360, &x361, x359, x343, x340); - fiat_p318233_addcarryx_u64(&x362, &x363, x361, x341, x338); - fiat_p318233_addcarryx_u64(&x364, &x365, x363, x339, x336); - x366 = (x365 + x337); - fiat_p318233_addcarryx_u64(&x367, &x368, 0x0, x318, x350); - fiat_p318233_addcarryx_u64(&x369, &x370, x368, x320, x352); - fiat_p318233_addcarryx_u64(&x371, &x372, x370, x322, x354); - fiat_p318233_addcarryx_u64(&x373, &x374, x372, x324, x356); - fiat_p318233_addcarryx_u64(&x375, &x376, x374, x326, x358); - fiat_p318233_addcarryx_u64(&x377, &x378, x376, x328, x360); - fiat_p318233_addcarryx_u64(&x379, &x380, x378, x330, x362); - fiat_p318233_addcarryx_u64(&x381, &x382, x380, x332, x364); - fiat_p318233_addcarryx_u64(&x383, &x384, x382, x334, x366); - x385 = ((uint64_t)x384 + x335); - fiat_p318233_mulx_u64(&x386, &x387, x4, (arg2[7])); - fiat_p318233_mulx_u64(&x388, &x389, x4, (arg2[6])); - fiat_p318233_mulx_u64(&x390, &x391, x4, (arg2[5])); - fiat_p318233_mulx_u64(&x392, &x393, x4, (arg2[4])); - fiat_p318233_mulx_u64(&x394, &x395, x4, (arg2[3])); - fiat_p318233_mulx_u64(&x396, &x397, x4, (arg2[2])); - fiat_p318233_mulx_u64(&x398, &x399, x4, (arg2[1])); - fiat_p318233_mulx_u64(&x400, &x401, x4, (arg2[0])); - fiat_p318233_addcarryx_u64(&x402, &x403, 0x0, x401, x398); - fiat_p318233_addcarryx_u64(&x404, &x405, x403, x399, x396); - fiat_p318233_addcarryx_u64(&x406, &x407, x405, x397, x394); - fiat_p318233_addcarryx_u64(&x408, &x409, x407, x395, x392); - fiat_p318233_addcarryx_u64(&x410, &x411, x409, x393, x390); - fiat_p318233_addcarryx_u64(&x412, &x413, x411, x391, x388); - fiat_p318233_addcarryx_u64(&x414, &x415, x413, x389, x386); - x416 = (x415 + x387); - fiat_p318233_addcarryx_u64(&x417, &x418, 0x0, x369, x400); - fiat_p318233_addcarryx_u64(&x419, &x420, x418, x371, x402); - fiat_p318233_addcarryx_u64(&x421, &x422, x420, x373, x404); - fiat_p318233_addcarryx_u64(&x423, &x424, x422, x375, x406); - fiat_p318233_addcarryx_u64(&x425, &x426, x424, x377, x408); - fiat_p318233_addcarryx_u64(&x427, &x428, x426, x379, x410); - fiat_p318233_addcarryx_u64(&x429, &x430, x428, x381, x412); - fiat_p318233_addcarryx_u64(&x431, &x432, x430, x383, x414); - fiat_p318233_addcarryx_u64(&x433, &x434, x432, x385, x416); - fiat_p318233_mulx_u64(&x435, &x436, x417, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x437, &x438, x417, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x439, &x440, x417, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x441, &x442, x417, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x443, &x444, x417, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x445, &x446, x417, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x447, &x448, x417, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x449, &x450, x417, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x451, &x452, 0x0, x450, x447); - fiat_p318233_addcarryx_u64(&x453, &x454, x452, x448, x445); - fiat_p318233_addcarryx_u64(&x455, &x456, x454, x446, x443); - fiat_p318233_addcarryx_u64(&x457, &x458, x456, x444, x441); - fiat_p318233_addcarryx_u64(&x459, &x460, x458, x442, x439); - fiat_p318233_addcarryx_u64(&x461, &x462, x460, x440, x437); - fiat_p318233_addcarryx_u64(&x463, &x464, x462, x438, x435); - x465 = (x464 + x436); - fiat_p318233_addcarryx_u64(&x466, &x467, 0x0, x417, x449); - fiat_p318233_addcarryx_u64(&x468, &x469, x467, x419, x451); - fiat_p318233_addcarryx_u64(&x470, &x471, x469, x421, x453); - fiat_p318233_addcarryx_u64(&x472, &x473, x471, x423, x455); - fiat_p318233_addcarryx_u64(&x474, &x475, x473, x425, x457); - fiat_p318233_addcarryx_u64(&x476, &x477, x475, x427, x459); - fiat_p318233_addcarryx_u64(&x478, &x479, x477, x429, x461); - fiat_p318233_addcarryx_u64(&x480, &x481, x479, x431, x463); - fiat_p318233_addcarryx_u64(&x482, &x483, x481, x433, x465); - x484 = ((uint64_t)x483 + x434); - fiat_p318233_mulx_u64(&x485, &x486, x5, (arg2[7])); - fiat_p318233_mulx_u64(&x487, &x488, x5, (arg2[6])); - fiat_p318233_mulx_u64(&x489, &x490, x5, (arg2[5])); - fiat_p318233_mulx_u64(&x491, &x492, x5, (arg2[4])); - fiat_p318233_mulx_u64(&x493, &x494, x5, (arg2[3])); - fiat_p318233_mulx_u64(&x495, &x496, x5, (arg2[2])); - fiat_p318233_mulx_u64(&x497, &x498, x5, (arg2[1])); - fiat_p318233_mulx_u64(&x499, &x500, x5, (arg2[0])); - fiat_p318233_addcarryx_u64(&x501, &x502, 0x0, x500, x497); - fiat_p318233_addcarryx_u64(&x503, &x504, x502, x498, x495); - fiat_p318233_addcarryx_u64(&x505, &x506, x504, x496, x493); - fiat_p318233_addcarryx_u64(&x507, &x508, x506, x494, x491); - fiat_p318233_addcarryx_u64(&x509, &x510, x508, x492, x489); - fiat_p318233_addcarryx_u64(&x511, &x512, x510, x490, x487); - fiat_p318233_addcarryx_u64(&x513, &x514, x512, x488, x485); - x515 = (x514 + x486); - fiat_p318233_addcarryx_u64(&x516, &x517, 0x0, x468, x499); - fiat_p318233_addcarryx_u64(&x518, &x519, x517, x470, x501); - fiat_p318233_addcarryx_u64(&x520, &x521, x519, x472, x503); - fiat_p318233_addcarryx_u64(&x522, &x523, x521, x474, x505); - fiat_p318233_addcarryx_u64(&x524, &x525, x523, x476, x507); - fiat_p318233_addcarryx_u64(&x526, &x527, x525, x478, x509); - fiat_p318233_addcarryx_u64(&x528, &x529, x527, x480, x511); - fiat_p318233_addcarryx_u64(&x530, &x531, x529, x482, x513); - fiat_p318233_addcarryx_u64(&x532, &x533, x531, x484, x515); - fiat_p318233_mulx_u64(&x534, &x535, x516, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x536, &x537, x516, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x538, &x539, x516, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x540, &x541, x516, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x542, &x543, x516, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x544, &x545, x516, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x546, &x547, x516, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x548, &x549, x516, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x550, &x551, 0x0, x549, x546); - fiat_p318233_addcarryx_u64(&x552, &x553, x551, x547, x544); - fiat_p318233_addcarryx_u64(&x554, &x555, x553, x545, x542); - fiat_p318233_addcarryx_u64(&x556, &x557, x555, x543, x540); - fiat_p318233_addcarryx_u64(&x558, &x559, x557, x541, x538); - fiat_p318233_addcarryx_u64(&x560, &x561, x559, x539, x536); - fiat_p318233_addcarryx_u64(&x562, &x563, x561, x537, x534); - x564 = (x563 + x535); - fiat_p318233_addcarryx_u64(&x565, &x566, 0x0, x516, x548); - fiat_p318233_addcarryx_u64(&x567, &x568, x566, x518, x550); - fiat_p318233_addcarryx_u64(&x569, &x570, x568, x520, x552); - fiat_p318233_addcarryx_u64(&x571, &x572, x570, x522, x554); - fiat_p318233_addcarryx_u64(&x573, &x574, x572, x524, x556); - fiat_p318233_addcarryx_u64(&x575, &x576, x574, x526, x558); - fiat_p318233_addcarryx_u64(&x577, &x578, x576, x528, x560); - fiat_p318233_addcarryx_u64(&x579, &x580, x578, x530, x562); - fiat_p318233_addcarryx_u64(&x581, &x582, x580, x532, x564); - x583 = ((uint64_t)x582 + x533); - fiat_p318233_mulx_u64(&x584, &x585, x6, (arg2[7])); - fiat_p318233_mulx_u64(&x586, &x587, x6, (arg2[6])); - fiat_p318233_mulx_u64(&x588, &x589, x6, (arg2[5])); - fiat_p318233_mulx_u64(&x590, &x591, x6, (arg2[4])); - fiat_p318233_mulx_u64(&x592, &x593, x6, (arg2[3])); - fiat_p318233_mulx_u64(&x594, &x595, x6, (arg2[2])); - fiat_p318233_mulx_u64(&x596, &x597, x6, (arg2[1])); - fiat_p318233_mulx_u64(&x598, &x599, x6, (arg2[0])); - fiat_p318233_addcarryx_u64(&x600, &x601, 0x0, x599, x596); - fiat_p318233_addcarryx_u64(&x602, &x603, x601, x597, x594); - fiat_p318233_addcarryx_u64(&x604, &x605, x603, x595, x592); - fiat_p318233_addcarryx_u64(&x606, &x607, x605, x593, x590); - fiat_p318233_addcarryx_u64(&x608, &x609, x607, x591, x588); - fiat_p318233_addcarryx_u64(&x610, &x611, x609, x589, x586); - fiat_p318233_addcarryx_u64(&x612, &x613, x611, x587, x584); - x614 = (x613 + x585); - fiat_p318233_addcarryx_u64(&x615, &x616, 0x0, x567, x598); - fiat_p318233_addcarryx_u64(&x617, &x618, x616, x569, x600); - fiat_p318233_addcarryx_u64(&x619, &x620, x618, x571, x602); - fiat_p318233_addcarryx_u64(&x621, &x622, x620, x573, x604); - fiat_p318233_addcarryx_u64(&x623, &x624, x622, x575, x606); - fiat_p318233_addcarryx_u64(&x625, &x626, x624, x577, x608); - fiat_p318233_addcarryx_u64(&x627, &x628, x626, x579, x610); - fiat_p318233_addcarryx_u64(&x629, &x630, x628, x581, x612); - fiat_p318233_addcarryx_u64(&x631, &x632, x630, x583, x614); - fiat_p318233_mulx_u64(&x633, &x634, x615, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x635, &x636, x615, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x637, &x638, x615, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x639, &x640, x615, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x641, &x642, x615, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x643, &x644, x615, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x645, &x646, x615, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x647, &x648, x615, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x649, &x650, 0x0, x648, x645); - fiat_p318233_addcarryx_u64(&x651, &x652, x650, x646, x643); - fiat_p318233_addcarryx_u64(&x653, &x654, x652, x644, x641); - fiat_p318233_addcarryx_u64(&x655, &x656, x654, x642, x639); - fiat_p318233_addcarryx_u64(&x657, &x658, x656, x640, x637); - fiat_p318233_addcarryx_u64(&x659, &x660, x658, x638, x635); - fiat_p318233_addcarryx_u64(&x661, &x662, x660, x636, x633); - x663 = (x662 + x634); - fiat_p318233_addcarryx_u64(&x664, &x665, 0x0, x615, x647); - fiat_p318233_addcarryx_u64(&x666, &x667, x665, x617, x649); - fiat_p318233_addcarryx_u64(&x668, &x669, x667, x619, x651); - fiat_p318233_addcarryx_u64(&x670, &x671, x669, x621, x653); - fiat_p318233_addcarryx_u64(&x672, &x673, x671, x623, x655); - fiat_p318233_addcarryx_u64(&x674, &x675, x673, x625, x657); - fiat_p318233_addcarryx_u64(&x676, &x677, x675, x627, x659); - fiat_p318233_addcarryx_u64(&x678, &x679, x677, x629, x661); - fiat_p318233_addcarryx_u64(&x680, &x681, x679, x631, x663); - x682 = ((uint64_t)x681 + x632); - fiat_p318233_mulx_u64(&x683, &x684, x7, (arg2[7])); - fiat_p318233_mulx_u64(&x685, &x686, x7, (arg2[6])); - fiat_p318233_mulx_u64(&x687, &x688, x7, (arg2[5])); - fiat_p318233_mulx_u64(&x689, &x690, x7, (arg2[4])); - fiat_p318233_mulx_u64(&x691, &x692, x7, (arg2[3])); - fiat_p318233_mulx_u64(&x693, &x694, x7, (arg2[2])); - fiat_p318233_mulx_u64(&x695, &x696, x7, (arg2[1])); - fiat_p318233_mulx_u64(&x697, &x698, x7, (arg2[0])); - fiat_p318233_addcarryx_u64(&x699, &x700, 0x0, x698, x695); - fiat_p318233_addcarryx_u64(&x701, &x702, x700, x696, x693); - fiat_p318233_addcarryx_u64(&x703, &x704, x702, x694, x691); - fiat_p318233_addcarryx_u64(&x705, &x706, x704, x692, x689); - fiat_p318233_addcarryx_u64(&x707, &x708, x706, x690, x687); - fiat_p318233_addcarryx_u64(&x709, &x710, x708, x688, x685); - fiat_p318233_addcarryx_u64(&x711, &x712, x710, x686, x683); - x713 = (x712 + x684); - fiat_p318233_addcarryx_u64(&x714, &x715, 0x0, x666, x697); - fiat_p318233_addcarryx_u64(&x716, &x717, x715, x668, x699); - fiat_p318233_addcarryx_u64(&x718, &x719, x717, x670, x701); - fiat_p318233_addcarryx_u64(&x720, &x721, x719, x672, x703); - fiat_p318233_addcarryx_u64(&x722, &x723, x721, x674, x705); - fiat_p318233_addcarryx_u64(&x724, &x725, x723, x676, x707); - fiat_p318233_addcarryx_u64(&x726, &x727, x725, x678, x709); - fiat_p318233_addcarryx_u64(&x728, &x729, x727, x680, x711); - fiat_p318233_addcarryx_u64(&x730, &x731, x729, x682, x713); - fiat_p318233_mulx_u64(&x732, &x733, x714, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x734, &x735, x714, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x736, &x737, x714, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x738, &x739, x714, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x740, &x741, x714, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x742, &x743, x714, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x744, &x745, x714, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x746, &x747, x714, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x748, &x749, 0x0, x747, x744); - fiat_p318233_addcarryx_u64(&x750, &x751, x749, x745, x742); - fiat_p318233_addcarryx_u64(&x752, &x753, x751, x743, x740); - fiat_p318233_addcarryx_u64(&x754, &x755, x753, x741, x738); - fiat_p318233_addcarryx_u64(&x756, &x757, x755, x739, x736); - fiat_p318233_addcarryx_u64(&x758, &x759, x757, x737, x734); - fiat_p318233_addcarryx_u64(&x760, &x761, x759, x735, x732); - x762 = (x761 + x733); - fiat_p318233_addcarryx_u64(&x763, &x764, 0x0, x714, x746); - fiat_p318233_addcarryx_u64(&x765, &x766, x764, x716, x748); - fiat_p318233_addcarryx_u64(&x767, &x768, x766, x718, x750); - fiat_p318233_addcarryx_u64(&x769, &x770, x768, x720, x752); - fiat_p318233_addcarryx_u64(&x771, &x772, x770, x722, x754); - fiat_p318233_addcarryx_u64(&x773, &x774, x772, x724, x756); - fiat_p318233_addcarryx_u64(&x775, &x776, x774, x726, x758); - fiat_p318233_addcarryx_u64(&x777, &x778, x776, x728, x760); - fiat_p318233_addcarryx_u64(&x779, &x780, x778, x730, x762); - x781 = ((uint64_t)x780 + x731); - fiat_p318233_subborrowx_u64(&x782, &x783, 0x0, x765, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x784, &x785, x783, x767, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x786, &x787, x785, x769, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_subborrowx_u64(&x788, &x789, x787, x771, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_subborrowx_u64(&x790, &x791, x789, x773, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_subborrowx_u64(&x792, &x793, x791, x775, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_subborrowx_u64(&x794, &x795, x793, x777, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_subborrowx_u64(&x796, &x797, x795, x779, UINT64_C(0x255946a8869bc6)); - fiat_p318233_subborrowx_u64(&x798, &x799, x797, x781, 0x0); - fiat_p318233_cmovznz_u64(&x800, x799, x782, x765); - fiat_p318233_cmovznz_u64(&x801, x799, x784, x767); - fiat_p318233_cmovznz_u64(&x802, x799, x786, x769); - fiat_p318233_cmovznz_u64(&x803, x799, x788, x771); - fiat_p318233_cmovznz_u64(&x804, x799, x790, x773); - fiat_p318233_cmovznz_u64(&x805, x799, x792, x775); - fiat_p318233_cmovznz_u64(&x806, x799, x794, x777); - fiat_p318233_cmovznz_u64(&x807, x799, x796, x779); - out1[0] = x800; - out1[1] = x801; - out1[2] = x802; - out1[3] = x803; - out1[4] = x804; - out1[5] = x805; - out1[6] = x806; - out1[7] = x807; -} - -/* - * The function fiat_p318233_square squares a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_square(fiat_p318233_montgomery_domain_field_element out1, const fiat_p318233_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - fiat_p318233_uint1 x26; - uint64_t x27; - fiat_p318233_uint1 x28; - uint64_t x29; - fiat_p318233_uint1 x30; - uint64_t x31; - fiat_p318233_uint1 x32; - uint64_t x33; - fiat_p318233_uint1 x34; - uint64_t x35; - fiat_p318233_uint1 x36; - uint64_t x37; - fiat_p318233_uint1 x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint64_t x55; - uint64_t x56; - fiat_p318233_uint1 x57; - uint64_t x58; - fiat_p318233_uint1 x59; - uint64_t x60; - fiat_p318233_uint1 x61; - uint64_t x62; - fiat_p318233_uint1 x63; - uint64_t x64; - fiat_p318233_uint1 x65; - uint64_t x66; - fiat_p318233_uint1 x67; - uint64_t x68; - fiat_p318233_uint1 x69; - uint64_t x70; - uint64_t x71; - fiat_p318233_uint1 x72; - uint64_t x73; - fiat_p318233_uint1 x74; - uint64_t x75; - fiat_p318233_uint1 x76; - uint64_t x77; - fiat_p318233_uint1 x78; - uint64_t x79; - fiat_p318233_uint1 x80; - uint64_t x81; - fiat_p318233_uint1 x82; - uint64_t x83; - fiat_p318233_uint1 x84; - uint64_t x85; - fiat_p318233_uint1 x86; - uint64_t x87; - fiat_p318233_uint1 x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - uint64_t x105; - fiat_p318233_uint1 x106; - uint64_t x107; - fiat_p318233_uint1 x108; - uint64_t x109; - fiat_p318233_uint1 x110; - uint64_t x111; - fiat_p318233_uint1 x112; - uint64_t x113; - fiat_p318233_uint1 x114; - uint64_t x115; - fiat_p318233_uint1 x116; - uint64_t x117; - fiat_p318233_uint1 x118; - uint64_t x119; - uint64_t x120; - fiat_p318233_uint1 x121; - uint64_t x122; - fiat_p318233_uint1 x123; - uint64_t x124; - fiat_p318233_uint1 x125; - uint64_t x126; - fiat_p318233_uint1 x127; - uint64_t x128; - fiat_p318233_uint1 x129; - uint64_t x130; - fiat_p318233_uint1 x131; - uint64_t x132; - fiat_p318233_uint1 x133; - uint64_t x134; - fiat_p318233_uint1 x135; - uint64_t x136; - fiat_p318233_uint1 x137; - uint64_t x138; - uint64_t x139; - uint64_t x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - uint64_t x144; - uint64_t x145; - uint64_t x146; - uint64_t x147; - uint64_t x148; - uint64_t x149; - uint64_t x150; - uint64_t x151; - uint64_t x152; - uint64_t x153; - uint64_t x154; - fiat_p318233_uint1 x155; - uint64_t x156; - fiat_p318233_uint1 x157; - uint64_t x158; - fiat_p318233_uint1 x159; - uint64_t x160; - fiat_p318233_uint1 x161; - uint64_t x162; - fiat_p318233_uint1 x163; - uint64_t x164; - fiat_p318233_uint1 x165; - uint64_t x166; - fiat_p318233_uint1 x167; - uint64_t x168; - uint64_t x169; - fiat_p318233_uint1 x170; - uint64_t x171; - fiat_p318233_uint1 x172; - uint64_t x173; - fiat_p318233_uint1 x174; - uint64_t x175; - fiat_p318233_uint1 x176; - uint64_t x177; - fiat_p318233_uint1 x178; - uint64_t x179; - fiat_p318233_uint1 x180; - uint64_t x181; - fiat_p318233_uint1 x182; - uint64_t x183; - fiat_p318233_uint1 x184; - uint64_t x185; - fiat_p318233_uint1 x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - uint64_t x191; - uint64_t x192; - uint64_t x193; - uint64_t x194; - uint64_t x195; - uint64_t x196; - uint64_t x197; - uint64_t x198; - uint64_t x199; - uint64_t x200; - uint64_t x201; - uint64_t x202; - uint64_t x203; - uint64_t x204; - fiat_p318233_uint1 x205; - uint64_t x206; - fiat_p318233_uint1 x207; - uint64_t x208; - fiat_p318233_uint1 x209; - uint64_t x210; - fiat_p318233_uint1 x211; - uint64_t x212; - fiat_p318233_uint1 x213; - uint64_t x214; - fiat_p318233_uint1 x215; - uint64_t x216; - fiat_p318233_uint1 x217; - uint64_t x218; - uint64_t x219; - fiat_p318233_uint1 x220; - uint64_t x221; - fiat_p318233_uint1 x222; - uint64_t x223; - fiat_p318233_uint1 x224; - uint64_t x225; - fiat_p318233_uint1 x226; - uint64_t x227; - fiat_p318233_uint1 x228; - uint64_t x229; - fiat_p318233_uint1 x230; - uint64_t x231; - fiat_p318233_uint1 x232; - uint64_t x233; - fiat_p318233_uint1 x234; - uint64_t x235; - fiat_p318233_uint1 x236; - uint64_t x237; - uint64_t x238; - uint64_t x239; - uint64_t x240; - uint64_t x241; - uint64_t x242; - uint64_t x243; - uint64_t x244; - uint64_t x245; - uint64_t x246; - uint64_t x247; - uint64_t x248; - uint64_t x249; - uint64_t x250; - uint64_t x251; - uint64_t x252; - uint64_t x253; - fiat_p318233_uint1 x254; - uint64_t x255; - fiat_p318233_uint1 x256; - uint64_t x257; - fiat_p318233_uint1 x258; - uint64_t x259; - fiat_p318233_uint1 x260; - uint64_t x261; - fiat_p318233_uint1 x262; - uint64_t x263; - fiat_p318233_uint1 x264; - uint64_t x265; - fiat_p318233_uint1 x266; - uint64_t x267; - uint64_t x268; - fiat_p318233_uint1 x269; - uint64_t x270; - fiat_p318233_uint1 x271; - uint64_t x272; - fiat_p318233_uint1 x273; - uint64_t x274; - fiat_p318233_uint1 x275; - uint64_t x276; - fiat_p318233_uint1 x277; - uint64_t x278; - fiat_p318233_uint1 x279; - uint64_t x280; - fiat_p318233_uint1 x281; - uint64_t x282; - fiat_p318233_uint1 x283; - uint64_t x284; - fiat_p318233_uint1 x285; - uint64_t x286; - uint64_t x287; - uint64_t x288; - uint64_t x289; - uint64_t x290; - uint64_t x291; - uint64_t x292; - uint64_t x293; - uint64_t x294; - uint64_t x295; - uint64_t x296; - uint64_t x297; - uint64_t x298; - uint64_t x299; - uint64_t x300; - uint64_t x301; - uint64_t x302; - uint64_t x303; - fiat_p318233_uint1 x304; - uint64_t x305; - fiat_p318233_uint1 x306; - uint64_t x307; - fiat_p318233_uint1 x308; - uint64_t x309; - fiat_p318233_uint1 x310; - uint64_t x311; - fiat_p318233_uint1 x312; - uint64_t x313; - fiat_p318233_uint1 x314; - uint64_t x315; - fiat_p318233_uint1 x316; - uint64_t x317; - uint64_t x318; - fiat_p318233_uint1 x319; - uint64_t x320; - fiat_p318233_uint1 x321; - uint64_t x322; - fiat_p318233_uint1 x323; - uint64_t x324; - fiat_p318233_uint1 x325; - uint64_t x326; - fiat_p318233_uint1 x327; - uint64_t x328; - fiat_p318233_uint1 x329; - uint64_t x330; - fiat_p318233_uint1 x331; - uint64_t x332; - fiat_p318233_uint1 x333; - uint64_t x334; - fiat_p318233_uint1 x335; - uint64_t x336; - uint64_t x337; - uint64_t x338; - uint64_t x339; - uint64_t x340; - uint64_t x341; - uint64_t x342; - uint64_t x343; - uint64_t x344; - uint64_t x345; - uint64_t x346; - uint64_t x347; - uint64_t x348; - uint64_t x349; - uint64_t x350; - uint64_t x351; - uint64_t x352; - fiat_p318233_uint1 x353; - uint64_t x354; - fiat_p318233_uint1 x355; - uint64_t x356; - fiat_p318233_uint1 x357; - uint64_t x358; - fiat_p318233_uint1 x359; - uint64_t x360; - fiat_p318233_uint1 x361; - uint64_t x362; - fiat_p318233_uint1 x363; - uint64_t x364; - fiat_p318233_uint1 x365; - uint64_t x366; - uint64_t x367; - fiat_p318233_uint1 x368; - uint64_t x369; - fiat_p318233_uint1 x370; - uint64_t x371; - fiat_p318233_uint1 x372; - uint64_t x373; - fiat_p318233_uint1 x374; - uint64_t x375; - fiat_p318233_uint1 x376; - uint64_t x377; - fiat_p318233_uint1 x378; - uint64_t x379; - fiat_p318233_uint1 x380; - uint64_t x381; - fiat_p318233_uint1 x382; - uint64_t x383; - fiat_p318233_uint1 x384; - uint64_t x385; - uint64_t x386; - uint64_t x387; - uint64_t x388; - uint64_t x389; - uint64_t x390; - uint64_t x391; - uint64_t x392; - uint64_t x393; - uint64_t x394; - uint64_t x395; - uint64_t x396; - uint64_t x397; - uint64_t x398; - uint64_t x399; - uint64_t x400; - uint64_t x401; - uint64_t x402; - fiat_p318233_uint1 x403; - uint64_t x404; - fiat_p318233_uint1 x405; - uint64_t x406; - fiat_p318233_uint1 x407; - uint64_t x408; - fiat_p318233_uint1 x409; - uint64_t x410; - fiat_p318233_uint1 x411; - uint64_t x412; - fiat_p318233_uint1 x413; - uint64_t x414; - fiat_p318233_uint1 x415; - uint64_t x416; - uint64_t x417; - fiat_p318233_uint1 x418; - uint64_t x419; - fiat_p318233_uint1 x420; - uint64_t x421; - fiat_p318233_uint1 x422; - uint64_t x423; - fiat_p318233_uint1 x424; - uint64_t x425; - fiat_p318233_uint1 x426; - uint64_t x427; - fiat_p318233_uint1 x428; - uint64_t x429; - fiat_p318233_uint1 x430; - uint64_t x431; - fiat_p318233_uint1 x432; - uint64_t x433; - fiat_p318233_uint1 x434; - uint64_t x435; - uint64_t x436; - uint64_t x437; - uint64_t x438; - uint64_t x439; - uint64_t x440; - uint64_t x441; - uint64_t x442; - uint64_t x443; - uint64_t x444; - uint64_t x445; - uint64_t x446; - uint64_t x447; - uint64_t x448; - uint64_t x449; - uint64_t x450; - uint64_t x451; - fiat_p318233_uint1 x452; - uint64_t x453; - fiat_p318233_uint1 x454; - uint64_t x455; - fiat_p318233_uint1 x456; - uint64_t x457; - fiat_p318233_uint1 x458; - uint64_t x459; - fiat_p318233_uint1 x460; - uint64_t x461; - fiat_p318233_uint1 x462; - uint64_t x463; - fiat_p318233_uint1 x464; - uint64_t x465; - uint64_t x466; - fiat_p318233_uint1 x467; - uint64_t x468; - fiat_p318233_uint1 x469; - uint64_t x470; - fiat_p318233_uint1 x471; - uint64_t x472; - fiat_p318233_uint1 x473; - uint64_t x474; - fiat_p318233_uint1 x475; - uint64_t x476; - fiat_p318233_uint1 x477; - uint64_t x478; - fiat_p318233_uint1 x479; - uint64_t x480; - fiat_p318233_uint1 x481; - uint64_t x482; - fiat_p318233_uint1 x483; - uint64_t x484; - uint64_t x485; - uint64_t x486; - uint64_t x487; - uint64_t x488; - uint64_t x489; - uint64_t x490; - uint64_t x491; - uint64_t x492; - uint64_t x493; - uint64_t x494; - uint64_t x495; - uint64_t x496; - uint64_t x497; - uint64_t x498; - uint64_t x499; - uint64_t x500; - uint64_t x501; - fiat_p318233_uint1 x502; - uint64_t x503; - fiat_p318233_uint1 x504; - uint64_t x505; - fiat_p318233_uint1 x506; - uint64_t x507; - fiat_p318233_uint1 x508; - uint64_t x509; - fiat_p318233_uint1 x510; - uint64_t x511; - fiat_p318233_uint1 x512; - uint64_t x513; - fiat_p318233_uint1 x514; - uint64_t x515; - uint64_t x516; - fiat_p318233_uint1 x517; - uint64_t x518; - fiat_p318233_uint1 x519; - uint64_t x520; - fiat_p318233_uint1 x521; - uint64_t x522; - fiat_p318233_uint1 x523; - uint64_t x524; - fiat_p318233_uint1 x525; - uint64_t x526; - fiat_p318233_uint1 x527; - uint64_t x528; - fiat_p318233_uint1 x529; - uint64_t x530; - fiat_p318233_uint1 x531; - uint64_t x532; - fiat_p318233_uint1 x533; - uint64_t x534; - uint64_t x535; - uint64_t x536; - uint64_t x537; - uint64_t x538; - uint64_t x539; - uint64_t x540; - uint64_t x541; - uint64_t x542; - uint64_t x543; - uint64_t x544; - uint64_t x545; - uint64_t x546; - uint64_t x547; - uint64_t x548; - uint64_t x549; - uint64_t x550; - fiat_p318233_uint1 x551; - uint64_t x552; - fiat_p318233_uint1 x553; - uint64_t x554; - fiat_p318233_uint1 x555; - uint64_t x556; - fiat_p318233_uint1 x557; - uint64_t x558; - fiat_p318233_uint1 x559; - uint64_t x560; - fiat_p318233_uint1 x561; - uint64_t x562; - fiat_p318233_uint1 x563; - uint64_t x564; - uint64_t x565; - fiat_p318233_uint1 x566; - uint64_t x567; - fiat_p318233_uint1 x568; - uint64_t x569; - fiat_p318233_uint1 x570; - uint64_t x571; - fiat_p318233_uint1 x572; - uint64_t x573; - fiat_p318233_uint1 x574; - uint64_t x575; - fiat_p318233_uint1 x576; - uint64_t x577; - fiat_p318233_uint1 x578; - uint64_t x579; - fiat_p318233_uint1 x580; - uint64_t x581; - fiat_p318233_uint1 x582; - uint64_t x583; - uint64_t x584; - uint64_t x585; - uint64_t x586; - uint64_t x587; - uint64_t x588; - uint64_t x589; - uint64_t x590; - uint64_t x591; - uint64_t x592; - uint64_t x593; - uint64_t x594; - uint64_t x595; - uint64_t x596; - uint64_t x597; - uint64_t x598; - uint64_t x599; - uint64_t x600; - fiat_p318233_uint1 x601; - uint64_t x602; - fiat_p318233_uint1 x603; - uint64_t x604; - fiat_p318233_uint1 x605; - uint64_t x606; - fiat_p318233_uint1 x607; - uint64_t x608; - fiat_p318233_uint1 x609; - uint64_t x610; - fiat_p318233_uint1 x611; - uint64_t x612; - fiat_p318233_uint1 x613; - uint64_t x614; - uint64_t x615; - fiat_p318233_uint1 x616; - uint64_t x617; - fiat_p318233_uint1 x618; - uint64_t x619; - fiat_p318233_uint1 x620; - uint64_t x621; - fiat_p318233_uint1 x622; - uint64_t x623; - fiat_p318233_uint1 x624; - uint64_t x625; - fiat_p318233_uint1 x626; - uint64_t x627; - fiat_p318233_uint1 x628; - uint64_t x629; - fiat_p318233_uint1 x630; - uint64_t x631; - fiat_p318233_uint1 x632; - uint64_t x633; - uint64_t x634; - uint64_t x635; - uint64_t x636; - uint64_t x637; - uint64_t x638; - uint64_t x639; - uint64_t x640; - uint64_t x641; - uint64_t x642; - uint64_t x643; - uint64_t x644; - uint64_t x645; - uint64_t x646; - uint64_t x647; - uint64_t x648; - uint64_t x649; - fiat_p318233_uint1 x650; - uint64_t x651; - fiat_p318233_uint1 x652; - uint64_t x653; - fiat_p318233_uint1 x654; - uint64_t x655; - fiat_p318233_uint1 x656; - uint64_t x657; - fiat_p318233_uint1 x658; - uint64_t x659; - fiat_p318233_uint1 x660; - uint64_t x661; - fiat_p318233_uint1 x662; - uint64_t x663; - uint64_t x664; - fiat_p318233_uint1 x665; - uint64_t x666; - fiat_p318233_uint1 x667; - uint64_t x668; - fiat_p318233_uint1 x669; - uint64_t x670; - fiat_p318233_uint1 x671; - uint64_t x672; - fiat_p318233_uint1 x673; - uint64_t x674; - fiat_p318233_uint1 x675; - uint64_t x676; - fiat_p318233_uint1 x677; - uint64_t x678; - fiat_p318233_uint1 x679; - uint64_t x680; - fiat_p318233_uint1 x681; - uint64_t x682; - uint64_t x683; - uint64_t x684; - uint64_t x685; - uint64_t x686; - uint64_t x687; - uint64_t x688; - uint64_t x689; - uint64_t x690; - uint64_t x691; - uint64_t x692; - uint64_t x693; - uint64_t x694; - uint64_t x695; - uint64_t x696; - uint64_t x697; - uint64_t x698; - uint64_t x699; - fiat_p318233_uint1 x700; - uint64_t x701; - fiat_p318233_uint1 x702; - uint64_t x703; - fiat_p318233_uint1 x704; - uint64_t x705; - fiat_p318233_uint1 x706; - uint64_t x707; - fiat_p318233_uint1 x708; - uint64_t x709; - fiat_p318233_uint1 x710; - uint64_t x711; - fiat_p318233_uint1 x712; - uint64_t x713; - uint64_t x714; - fiat_p318233_uint1 x715; - uint64_t x716; - fiat_p318233_uint1 x717; - uint64_t x718; - fiat_p318233_uint1 x719; - uint64_t x720; - fiat_p318233_uint1 x721; - uint64_t x722; - fiat_p318233_uint1 x723; - uint64_t x724; - fiat_p318233_uint1 x725; - uint64_t x726; - fiat_p318233_uint1 x727; - uint64_t x728; - fiat_p318233_uint1 x729; - uint64_t x730; - fiat_p318233_uint1 x731; - uint64_t x732; - uint64_t x733; - uint64_t x734; - uint64_t x735; - uint64_t x736; - uint64_t x737; - uint64_t x738; - uint64_t x739; - uint64_t x740; - uint64_t x741; - uint64_t x742; - uint64_t x743; - uint64_t x744; - uint64_t x745; - uint64_t x746; - uint64_t x747; - uint64_t x748; - fiat_p318233_uint1 x749; - uint64_t x750; - fiat_p318233_uint1 x751; - uint64_t x752; - fiat_p318233_uint1 x753; - uint64_t x754; - fiat_p318233_uint1 x755; - uint64_t x756; - fiat_p318233_uint1 x757; - uint64_t x758; - fiat_p318233_uint1 x759; - uint64_t x760; - fiat_p318233_uint1 x761; - uint64_t x762; - uint64_t x763; - fiat_p318233_uint1 x764; - uint64_t x765; - fiat_p318233_uint1 x766; - uint64_t x767; - fiat_p318233_uint1 x768; - uint64_t x769; - fiat_p318233_uint1 x770; - uint64_t x771; - fiat_p318233_uint1 x772; - uint64_t x773; - fiat_p318233_uint1 x774; - uint64_t x775; - fiat_p318233_uint1 x776; - uint64_t x777; - fiat_p318233_uint1 x778; - uint64_t x779; - fiat_p318233_uint1 x780; - uint64_t x781; - uint64_t x782; - fiat_p318233_uint1 x783; - uint64_t x784; - fiat_p318233_uint1 x785; - uint64_t x786; - fiat_p318233_uint1 x787; - uint64_t x788; - fiat_p318233_uint1 x789; - uint64_t x790; - fiat_p318233_uint1 x791; - uint64_t x792; - fiat_p318233_uint1 x793; - uint64_t x794; - fiat_p318233_uint1 x795; - uint64_t x796; - fiat_p318233_uint1 x797; - uint64_t x798; - fiat_p318233_uint1 x799; - uint64_t x800; - uint64_t x801; - uint64_t x802; - uint64_t x803; - uint64_t x804; - uint64_t x805; - uint64_t x806; - uint64_t x807; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[4]); - x5 = (arg1[5]); - x6 = (arg1[6]); - x7 = (arg1[7]); - x8 = (arg1[0]); - fiat_p318233_mulx_u64(&x9, &x10, x8, (arg1[7])); - fiat_p318233_mulx_u64(&x11, &x12, x8, (arg1[6])); - fiat_p318233_mulx_u64(&x13, &x14, x8, (arg1[5])); - fiat_p318233_mulx_u64(&x15, &x16, x8, (arg1[4])); - fiat_p318233_mulx_u64(&x17, &x18, x8, (arg1[3])); - fiat_p318233_mulx_u64(&x19, &x20, x8, (arg1[2])); - fiat_p318233_mulx_u64(&x21, &x22, x8, (arg1[1])); - fiat_p318233_mulx_u64(&x23, &x24, x8, (arg1[0])); - fiat_p318233_addcarryx_u64(&x25, &x26, 0x0, x24, x21); - fiat_p318233_addcarryx_u64(&x27, &x28, x26, x22, x19); - fiat_p318233_addcarryx_u64(&x29, &x30, x28, x20, x17); - fiat_p318233_addcarryx_u64(&x31, &x32, x30, x18, x15); - fiat_p318233_addcarryx_u64(&x33, &x34, x32, x16, x13); - fiat_p318233_addcarryx_u64(&x35, &x36, x34, x14, x11); - fiat_p318233_addcarryx_u64(&x37, &x38, x36, x12, x9); - x39 = (x38 + x10); - fiat_p318233_mulx_u64(&x40, &x41, x23, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x42, &x43, x23, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x44, &x45, x23, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x46, &x47, x23, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x48, &x49, x23, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x50, &x51, x23, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x52, &x53, x23, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x54, &x55, x23, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x56, &x57, 0x0, x55, x52); - fiat_p318233_addcarryx_u64(&x58, &x59, x57, x53, x50); - fiat_p318233_addcarryx_u64(&x60, &x61, x59, x51, x48); - fiat_p318233_addcarryx_u64(&x62, &x63, x61, x49, x46); - fiat_p318233_addcarryx_u64(&x64, &x65, x63, x47, x44); - fiat_p318233_addcarryx_u64(&x66, &x67, x65, x45, x42); - fiat_p318233_addcarryx_u64(&x68, &x69, x67, x43, x40); - x70 = (x69 + x41); - fiat_p318233_addcarryx_u64(&x71, &x72, 0x0, x23, x54); - fiat_p318233_addcarryx_u64(&x73, &x74, x72, x25, x56); - fiat_p318233_addcarryx_u64(&x75, &x76, x74, x27, x58); - fiat_p318233_addcarryx_u64(&x77, &x78, x76, x29, x60); - fiat_p318233_addcarryx_u64(&x79, &x80, x78, x31, x62); - fiat_p318233_addcarryx_u64(&x81, &x82, x80, x33, x64); - fiat_p318233_addcarryx_u64(&x83, &x84, x82, x35, x66); - fiat_p318233_addcarryx_u64(&x85, &x86, x84, x37, x68); - fiat_p318233_addcarryx_u64(&x87, &x88, x86, x39, x70); - fiat_p318233_mulx_u64(&x89, &x90, x1, (arg1[7])); - fiat_p318233_mulx_u64(&x91, &x92, x1, (arg1[6])); - fiat_p318233_mulx_u64(&x93, &x94, x1, (arg1[5])); - fiat_p318233_mulx_u64(&x95, &x96, x1, (arg1[4])); - fiat_p318233_mulx_u64(&x97, &x98, x1, (arg1[3])); - fiat_p318233_mulx_u64(&x99, &x100, x1, (arg1[2])); - fiat_p318233_mulx_u64(&x101, &x102, x1, (arg1[1])); - fiat_p318233_mulx_u64(&x103, &x104, x1, (arg1[0])); - fiat_p318233_addcarryx_u64(&x105, &x106, 0x0, x104, x101); - fiat_p318233_addcarryx_u64(&x107, &x108, x106, x102, x99); - fiat_p318233_addcarryx_u64(&x109, &x110, x108, x100, x97); - fiat_p318233_addcarryx_u64(&x111, &x112, x110, x98, x95); - fiat_p318233_addcarryx_u64(&x113, &x114, x112, x96, x93); - fiat_p318233_addcarryx_u64(&x115, &x116, x114, x94, x91); - fiat_p318233_addcarryx_u64(&x117, &x118, x116, x92, x89); - x119 = (x118 + x90); - fiat_p318233_addcarryx_u64(&x120, &x121, 0x0, x73, x103); - fiat_p318233_addcarryx_u64(&x122, &x123, x121, x75, x105); - fiat_p318233_addcarryx_u64(&x124, &x125, x123, x77, x107); - fiat_p318233_addcarryx_u64(&x126, &x127, x125, x79, x109); - fiat_p318233_addcarryx_u64(&x128, &x129, x127, x81, x111); - fiat_p318233_addcarryx_u64(&x130, &x131, x129, x83, x113); - fiat_p318233_addcarryx_u64(&x132, &x133, x131, x85, x115); - fiat_p318233_addcarryx_u64(&x134, &x135, x133, x87, x117); - fiat_p318233_addcarryx_u64(&x136, &x137, x135, x88, x119); - fiat_p318233_mulx_u64(&x138, &x139, x120, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x140, &x141, x120, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x142, &x143, x120, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x144, &x145, x120, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x146, &x147, x120, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x148, &x149, x120, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x150, &x151, x120, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x152, &x153, x120, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x154, &x155, 0x0, x153, x150); - fiat_p318233_addcarryx_u64(&x156, &x157, x155, x151, x148); - fiat_p318233_addcarryx_u64(&x158, &x159, x157, x149, x146); - fiat_p318233_addcarryx_u64(&x160, &x161, x159, x147, x144); - fiat_p318233_addcarryx_u64(&x162, &x163, x161, x145, x142); - fiat_p318233_addcarryx_u64(&x164, &x165, x163, x143, x140); - fiat_p318233_addcarryx_u64(&x166, &x167, x165, x141, x138); - x168 = (x167 + x139); - fiat_p318233_addcarryx_u64(&x169, &x170, 0x0, x120, x152); - fiat_p318233_addcarryx_u64(&x171, &x172, x170, x122, x154); - fiat_p318233_addcarryx_u64(&x173, &x174, x172, x124, x156); - fiat_p318233_addcarryx_u64(&x175, &x176, x174, x126, x158); - fiat_p318233_addcarryx_u64(&x177, &x178, x176, x128, x160); - fiat_p318233_addcarryx_u64(&x179, &x180, x178, x130, x162); - fiat_p318233_addcarryx_u64(&x181, &x182, x180, x132, x164); - fiat_p318233_addcarryx_u64(&x183, &x184, x182, x134, x166); - fiat_p318233_addcarryx_u64(&x185, &x186, x184, x136, x168); - x187 = ((uint64_t)x186 + x137); - fiat_p318233_mulx_u64(&x188, &x189, x2, (arg1[7])); - fiat_p318233_mulx_u64(&x190, &x191, x2, (arg1[6])); - fiat_p318233_mulx_u64(&x192, &x193, x2, (arg1[5])); - fiat_p318233_mulx_u64(&x194, &x195, x2, (arg1[4])); - fiat_p318233_mulx_u64(&x196, &x197, x2, (arg1[3])); - fiat_p318233_mulx_u64(&x198, &x199, x2, (arg1[2])); - fiat_p318233_mulx_u64(&x200, &x201, x2, (arg1[1])); - fiat_p318233_mulx_u64(&x202, &x203, x2, (arg1[0])); - fiat_p318233_addcarryx_u64(&x204, &x205, 0x0, x203, x200); - fiat_p318233_addcarryx_u64(&x206, &x207, x205, x201, x198); - fiat_p318233_addcarryx_u64(&x208, &x209, x207, x199, x196); - fiat_p318233_addcarryx_u64(&x210, &x211, x209, x197, x194); - fiat_p318233_addcarryx_u64(&x212, &x213, x211, x195, x192); - fiat_p318233_addcarryx_u64(&x214, &x215, x213, x193, x190); - fiat_p318233_addcarryx_u64(&x216, &x217, x215, x191, x188); - x218 = (x217 + x189); - fiat_p318233_addcarryx_u64(&x219, &x220, 0x0, x171, x202); - fiat_p318233_addcarryx_u64(&x221, &x222, x220, x173, x204); - fiat_p318233_addcarryx_u64(&x223, &x224, x222, x175, x206); - fiat_p318233_addcarryx_u64(&x225, &x226, x224, x177, x208); - fiat_p318233_addcarryx_u64(&x227, &x228, x226, x179, x210); - fiat_p318233_addcarryx_u64(&x229, &x230, x228, x181, x212); - fiat_p318233_addcarryx_u64(&x231, &x232, x230, x183, x214); - fiat_p318233_addcarryx_u64(&x233, &x234, x232, x185, x216); - fiat_p318233_addcarryx_u64(&x235, &x236, x234, x187, x218); - fiat_p318233_mulx_u64(&x237, &x238, x219, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x239, &x240, x219, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x241, &x242, x219, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x243, &x244, x219, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x245, &x246, x219, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x247, &x248, x219, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x249, &x250, x219, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x251, &x252, x219, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x253, &x254, 0x0, x252, x249); - fiat_p318233_addcarryx_u64(&x255, &x256, x254, x250, x247); - fiat_p318233_addcarryx_u64(&x257, &x258, x256, x248, x245); - fiat_p318233_addcarryx_u64(&x259, &x260, x258, x246, x243); - fiat_p318233_addcarryx_u64(&x261, &x262, x260, x244, x241); - fiat_p318233_addcarryx_u64(&x263, &x264, x262, x242, x239); - fiat_p318233_addcarryx_u64(&x265, &x266, x264, x240, x237); - x267 = (x266 + x238); - fiat_p318233_addcarryx_u64(&x268, &x269, 0x0, x219, x251); - fiat_p318233_addcarryx_u64(&x270, &x271, x269, x221, x253); - fiat_p318233_addcarryx_u64(&x272, &x273, x271, x223, x255); - fiat_p318233_addcarryx_u64(&x274, &x275, x273, x225, x257); - fiat_p318233_addcarryx_u64(&x276, &x277, x275, x227, x259); - fiat_p318233_addcarryx_u64(&x278, &x279, x277, x229, x261); - fiat_p318233_addcarryx_u64(&x280, &x281, x279, x231, x263); - fiat_p318233_addcarryx_u64(&x282, &x283, x281, x233, x265); - fiat_p318233_addcarryx_u64(&x284, &x285, x283, x235, x267); - x286 = ((uint64_t)x285 + x236); - fiat_p318233_mulx_u64(&x287, &x288, x3, (arg1[7])); - fiat_p318233_mulx_u64(&x289, &x290, x3, (arg1[6])); - fiat_p318233_mulx_u64(&x291, &x292, x3, (arg1[5])); - fiat_p318233_mulx_u64(&x293, &x294, x3, (arg1[4])); - fiat_p318233_mulx_u64(&x295, &x296, x3, (arg1[3])); - fiat_p318233_mulx_u64(&x297, &x298, x3, (arg1[2])); - fiat_p318233_mulx_u64(&x299, &x300, x3, (arg1[1])); - fiat_p318233_mulx_u64(&x301, &x302, x3, (arg1[0])); - fiat_p318233_addcarryx_u64(&x303, &x304, 0x0, x302, x299); - fiat_p318233_addcarryx_u64(&x305, &x306, x304, x300, x297); - fiat_p318233_addcarryx_u64(&x307, &x308, x306, x298, x295); - fiat_p318233_addcarryx_u64(&x309, &x310, x308, x296, x293); - fiat_p318233_addcarryx_u64(&x311, &x312, x310, x294, x291); - fiat_p318233_addcarryx_u64(&x313, &x314, x312, x292, x289); - fiat_p318233_addcarryx_u64(&x315, &x316, x314, x290, x287); - x317 = (x316 + x288); - fiat_p318233_addcarryx_u64(&x318, &x319, 0x0, x270, x301); - fiat_p318233_addcarryx_u64(&x320, &x321, x319, x272, x303); - fiat_p318233_addcarryx_u64(&x322, &x323, x321, x274, x305); - fiat_p318233_addcarryx_u64(&x324, &x325, x323, x276, x307); - fiat_p318233_addcarryx_u64(&x326, &x327, x325, x278, x309); - fiat_p318233_addcarryx_u64(&x328, &x329, x327, x280, x311); - fiat_p318233_addcarryx_u64(&x330, &x331, x329, x282, x313); - fiat_p318233_addcarryx_u64(&x332, &x333, x331, x284, x315); - fiat_p318233_addcarryx_u64(&x334, &x335, x333, x286, x317); - fiat_p318233_mulx_u64(&x336, &x337, x318, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x338, &x339, x318, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x340, &x341, x318, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x342, &x343, x318, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x344, &x345, x318, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x346, &x347, x318, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x348, &x349, x318, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x350, &x351, x318, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x352, &x353, 0x0, x351, x348); - fiat_p318233_addcarryx_u64(&x354, &x355, x353, x349, x346); - fiat_p318233_addcarryx_u64(&x356, &x357, x355, x347, x344); - fiat_p318233_addcarryx_u64(&x358, &x359, x357, x345, x342); - fiat_p318233_addcarryx_u64(&x360, &x361, x359, x343, x340); - fiat_p318233_addcarryx_u64(&x362, &x363, x361, x341, x338); - fiat_p318233_addcarryx_u64(&x364, &x365, x363, x339, x336); - x366 = (x365 + x337); - fiat_p318233_addcarryx_u64(&x367, &x368, 0x0, x318, x350); - fiat_p318233_addcarryx_u64(&x369, &x370, x368, x320, x352); - fiat_p318233_addcarryx_u64(&x371, &x372, x370, x322, x354); - fiat_p318233_addcarryx_u64(&x373, &x374, x372, x324, x356); - fiat_p318233_addcarryx_u64(&x375, &x376, x374, x326, x358); - fiat_p318233_addcarryx_u64(&x377, &x378, x376, x328, x360); - fiat_p318233_addcarryx_u64(&x379, &x380, x378, x330, x362); - fiat_p318233_addcarryx_u64(&x381, &x382, x380, x332, x364); - fiat_p318233_addcarryx_u64(&x383, &x384, x382, x334, x366); - x385 = ((uint64_t)x384 + x335); - fiat_p318233_mulx_u64(&x386, &x387, x4, (arg1[7])); - fiat_p318233_mulx_u64(&x388, &x389, x4, (arg1[6])); - fiat_p318233_mulx_u64(&x390, &x391, x4, (arg1[5])); - fiat_p318233_mulx_u64(&x392, &x393, x4, (arg1[4])); - fiat_p318233_mulx_u64(&x394, &x395, x4, (arg1[3])); - fiat_p318233_mulx_u64(&x396, &x397, x4, (arg1[2])); - fiat_p318233_mulx_u64(&x398, &x399, x4, (arg1[1])); - fiat_p318233_mulx_u64(&x400, &x401, x4, (arg1[0])); - fiat_p318233_addcarryx_u64(&x402, &x403, 0x0, x401, x398); - fiat_p318233_addcarryx_u64(&x404, &x405, x403, x399, x396); - fiat_p318233_addcarryx_u64(&x406, &x407, x405, x397, x394); - fiat_p318233_addcarryx_u64(&x408, &x409, x407, x395, x392); - fiat_p318233_addcarryx_u64(&x410, &x411, x409, x393, x390); - fiat_p318233_addcarryx_u64(&x412, &x413, x411, x391, x388); - fiat_p318233_addcarryx_u64(&x414, &x415, x413, x389, x386); - x416 = (x415 + x387); - fiat_p318233_addcarryx_u64(&x417, &x418, 0x0, x369, x400); - fiat_p318233_addcarryx_u64(&x419, &x420, x418, x371, x402); - fiat_p318233_addcarryx_u64(&x421, &x422, x420, x373, x404); - fiat_p318233_addcarryx_u64(&x423, &x424, x422, x375, x406); - fiat_p318233_addcarryx_u64(&x425, &x426, x424, x377, x408); - fiat_p318233_addcarryx_u64(&x427, &x428, x426, x379, x410); - fiat_p318233_addcarryx_u64(&x429, &x430, x428, x381, x412); - fiat_p318233_addcarryx_u64(&x431, &x432, x430, x383, x414); - fiat_p318233_addcarryx_u64(&x433, &x434, x432, x385, x416); - fiat_p318233_mulx_u64(&x435, &x436, x417, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x437, &x438, x417, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x439, &x440, x417, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x441, &x442, x417, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x443, &x444, x417, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x445, &x446, x417, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x447, &x448, x417, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x449, &x450, x417, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x451, &x452, 0x0, x450, x447); - fiat_p318233_addcarryx_u64(&x453, &x454, x452, x448, x445); - fiat_p318233_addcarryx_u64(&x455, &x456, x454, x446, x443); - fiat_p318233_addcarryx_u64(&x457, &x458, x456, x444, x441); - fiat_p318233_addcarryx_u64(&x459, &x460, x458, x442, x439); - fiat_p318233_addcarryx_u64(&x461, &x462, x460, x440, x437); - fiat_p318233_addcarryx_u64(&x463, &x464, x462, x438, x435); - x465 = (x464 + x436); - fiat_p318233_addcarryx_u64(&x466, &x467, 0x0, x417, x449); - fiat_p318233_addcarryx_u64(&x468, &x469, x467, x419, x451); - fiat_p318233_addcarryx_u64(&x470, &x471, x469, x421, x453); - fiat_p318233_addcarryx_u64(&x472, &x473, x471, x423, x455); - fiat_p318233_addcarryx_u64(&x474, &x475, x473, x425, x457); - fiat_p318233_addcarryx_u64(&x476, &x477, x475, x427, x459); - fiat_p318233_addcarryx_u64(&x478, &x479, x477, x429, x461); - fiat_p318233_addcarryx_u64(&x480, &x481, x479, x431, x463); - fiat_p318233_addcarryx_u64(&x482, &x483, x481, x433, x465); - x484 = ((uint64_t)x483 + x434); - fiat_p318233_mulx_u64(&x485, &x486, x5, (arg1[7])); - fiat_p318233_mulx_u64(&x487, &x488, x5, (arg1[6])); - fiat_p318233_mulx_u64(&x489, &x490, x5, (arg1[5])); - fiat_p318233_mulx_u64(&x491, &x492, x5, (arg1[4])); - fiat_p318233_mulx_u64(&x493, &x494, x5, (arg1[3])); - fiat_p318233_mulx_u64(&x495, &x496, x5, (arg1[2])); - fiat_p318233_mulx_u64(&x497, &x498, x5, (arg1[1])); - fiat_p318233_mulx_u64(&x499, &x500, x5, (arg1[0])); - fiat_p318233_addcarryx_u64(&x501, &x502, 0x0, x500, x497); - fiat_p318233_addcarryx_u64(&x503, &x504, x502, x498, x495); - fiat_p318233_addcarryx_u64(&x505, &x506, x504, x496, x493); - fiat_p318233_addcarryx_u64(&x507, &x508, x506, x494, x491); - fiat_p318233_addcarryx_u64(&x509, &x510, x508, x492, x489); - fiat_p318233_addcarryx_u64(&x511, &x512, x510, x490, x487); - fiat_p318233_addcarryx_u64(&x513, &x514, x512, x488, x485); - x515 = (x514 + x486); - fiat_p318233_addcarryx_u64(&x516, &x517, 0x0, x468, x499); - fiat_p318233_addcarryx_u64(&x518, &x519, x517, x470, x501); - fiat_p318233_addcarryx_u64(&x520, &x521, x519, x472, x503); - fiat_p318233_addcarryx_u64(&x522, &x523, x521, x474, x505); - fiat_p318233_addcarryx_u64(&x524, &x525, x523, x476, x507); - fiat_p318233_addcarryx_u64(&x526, &x527, x525, x478, x509); - fiat_p318233_addcarryx_u64(&x528, &x529, x527, x480, x511); - fiat_p318233_addcarryx_u64(&x530, &x531, x529, x482, x513); - fiat_p318233_addcarryx_u64(&x532, &x533, x531, x484, x515); - fiat_p318233_mulx_u64(&x534, &x535, x516, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x536, &x537, x516, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x538, &x539, x516, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x540, &x541, x516, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x542, &x543, x516, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x544, &x545, x516, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x546, &x547, x516, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x548, &x549, x516, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x550, &x551, 0x0, x549, x546); - fiat_p318233_addcarryx_u64(&x552, &x553, x551, x547, x544); - fiat_p318233_addcarryx_u64(&x554, &x555, x553, x545, x542); - fiat_p318233_addcarryx_u64(&x556, &x557, x555, x543, x540); - fiat_p318233_addcarryx_u64(&x558, &x559, x557, x541, x538); - fiat_p318233_addcarryx_u64(&x560, &x561, x559, x539, x536); - fiat_p318233_addcarryx_u64(&x562, &x563, x561, x537, x534); - x564 = (x563 + x535); - fiat_p318233_addcarryx_u64(&x565, &x566, 0x0, x516, x548); - fiat_p318233_addcarryx_u64(&x567, &x568, x566, x518, x550); - fiat_p318233_addcarryx_u64(&x569, &x570, x568, x520, x552); - fiat_p318233_addcarryx_u64(&x571, &x572, x570, x522, x554); - fiat_p318233_addcarryx_u64(&x573, &x574, x572, x524, x556); - fiat_p318233_addcarryx_u64(&x575, &x576, x574, x526, x558); - fiat_p318233_addcarryx_u64(&x577, &x578, x576, x528, x560); - fiat_p318233_addcarryx_u64(&x579, &x580, x578, x530, x562); - fiat_p318233_addcarryx_u64(&x581, &x582, x580, x532, x564); - x583 = ((uint64_t)x582 + x533); - fiat_p318233_mulx_u64(&x584, &x585, x6, (arg1[7])); - fiat_p318233_mulx_u64(&x586, &x587, x6, (arg1[6])); - fiat_p318233_mulx_u64(&x588, &x589, x6, (arg1[5])); - fiat_p318233_mulx_u64(&x590, &x591, x6, (arg1[4])); - fiat_p318233_mulx_u64(&x592, &x593, x6, (arg1[3])); - fiat_p318233_mulx_u64(&x594, &x595, x6, (arg1[2])); - fiat_p318233_mulx_u64(&x596, &x597, x6, (arg1[1])); - fiat_p318233_mulx_u64(&x598, &x599, x6, (arg1[0])); - fiat_p318233_addcarryx_u64(&x600, &x601, 0x0, x599, x596); - fiat_p318233_addcarryx_u64(&x602, &x603, x601, x597, x594); - fiat_p318233_addcarryx_u64(&x604, &x605, x603, x595, x592); - fiat_p318233_addcarryx_u64(&x606, &x607, x605, x593, x590); - fiat_p318233_addcarryx_u64(&x608, &x609, x607, x591, x588); - fiat_p318233_addcarryx_u64(&x610, &x611, x609, x589, x586); - fiat_p318233_addcarryx_u64(&x612, &x613, x611, x587, x584); - x614 = (x613 + x585); - fiat_p318233_addcarryx_u64(&x615, &x616, 0x0, x567, x598); - fiat_p318233_addcarryx_u64(&x617, &x618, x616, x569, x600); - fiat_p318233_addcarryx_u64(&x619, &x620, x618, x571, x602); - fiat_p318233_addcarryx_u64(&x621, &x622, x620, x573, x604); - fiat_p318233_addcarryx_u64(&x623, &x624, x622, x575, x606); - fiat_p318233_addcarryx_u64(&x625, &x626, x624, x577, x608); - fiat_p318233_addcarryx_u64(&x627, &x628, x626, x579, x610); - fiat_p318233_addcarryx_u64(&x629, &x630, x628, x581, x612); - fiat_p318233_addcarryx_u64(&x631, &x632, x630, x583, x614); - fiat_p318233_mulx_u64(&x633, &x634, x615, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x635, &x636, x615, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x637, &x638, x615, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x639, &x640, x615, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x641, &x642, x615, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x643, &x644, x615, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x645, &x646, x615, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x647, &x648, x615, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x649, &x650, 0x0, x648, x645); - fiat_p318233_addcarryx_u64(&x651, &x652, x650, x646, x643); - fiat_p318233_addcarryx_u64(&x653, &x654, x652, x644, x641); - fiat_p318233_addcarryx_u64(&x655, &x656, x654, x642, x639); - fiat_p318233_addcarryx_u64(&x657, &x658, x656, x640, x637); - fiat_p318233_addcarryx_u64(&x659, &x660, x658, x638, x635); - fiat_p318233_addcarryx_u64(&x661, &x662, x660, x636, x633); - x663 = (x662 + x634); - fiat_p318233_addcarryx_u64(&x664, &x665, 0x0, x615, x647); - fiat_p318233_addcarryx_u64(&x666, &x667, x665, x617, x649); - fiat_p318233_addcarryx_u64(&x668, &x669, x667, x619, x651); - fiat_p318233_addcarryx_u64(&x670, &x671, x669, x621, x653); - fiat_p318233_addcarryx_u64(&x672, &x673, x671, x623, x655); - fiat_p318233_addcarryx_u64(&x674, &x675, x673, x625, x657); - fiat_p318233_addcarryx_u64(&x676, &x677, x675, x627, x659); - fiat_p318233_addcarryx_u64(&x678, &x679, x677, x629, x661); - fiat_p318233_addcarryx_u64(&x680, &x681, x679, x631, x663); - x682 = ((uint64_t)x681 + x632); - fiat_p318233_mulx_u64(&x683, &x684, x7, (arg1[7])); - fiat_p318233_mulx_u64(&x685, &x686, x7, (arg1[6])); - fiat_p318233_mulx_u64(&x687, &x688, x7, (arg1[5])); - fiat_p318233_mulx_u64(&x689, &x690, x7, (arg1[4])); - fiat_p318233_mulx_u64(&x691, &x692, x7, (arg1[3])); - fiat_p318233_mulx_u64(&x693, &x694, x7, (arg1[2])); - fiat_p318233_mulx_u64(&x695, &x696, x7, (arg1[1])); - fiat_p318233_mulx_u64(&x697, &x698, x7, (arg1[0])); - fiat_p318233_addcarryx_u64(&x699, &x700, 0x0, x698, x695); - fiat_p318233_addcarryx_u64(&x701, &x702, x700, x696, x693); - fiat_p318233_addcarryx_u64(&x703, &x704, x702, x694, x691); - fiat_p318233_addcarryx_u64(&x705, &x706, x704, x692, x689); - fiat_p318233_addcarryx_u64(&x707, &x708, x706, x690, x687); - fiat_p318233_addcarryx_u64(&x709, &x710, x708, x688, x685); - fiat_p318233_addcarryx_u64(&x711, &x712, x710, x686, x683); - x713 = (x712 + x684); - fiat_p318233_addcarryx_u64(&x714, &x715, 0x0, x666, x697); - fiat_p318233_addcarryx_u64(&x716, &x717, x715, x668, x699); - fiat_p318233_addcarryx_u64(&x718, &x719, x717, x670, x701); - fiat_p318233_addcarryx_u64(&x720, &x721, x719, x672, x703); - fiat_p318233_addcarryx_u64(&x722, &x723, x721, x674, x705); - fiat_p318233_addcarryx_u64(&x724, &x725, x723, x676, x707); - fiat_p318233_addcarryx_u64(&x726, &x727, x725, x678, x709); - fiat_p318233_addcarryx_u64(&x728, &x729, x727, x680, x711); - fiat_p318233_addcarryx_u64(&x730, &x731, x729, x682, x713); - fiat_p318233_mulx_u64(&x732, &x733, x714, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x734, &x735, x714, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x736, &x737, x714, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x738, &x739, x714, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x740, &x741, x714, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x742, &x743, x714, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x744, &x745, x714, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x746, &x747, x714, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x748, &x749, 0x0, x747, x744); - fiat_p318233_addcarryx_u64(&x750, &x751, x749, x745, x742); - fiat_p318233_addcarryx_u64(&x752, &x753, x751, x743, x740); - fiat_p318233_addcarryx_u64(&x754, &x755, x753, x741, x738); - fiat_p318233_addcarryx_u64(&x756, &x757, x755, x739, x736); - fiat_p318233_addcarryx_u64(&x758, &x759, x757, x737, x734); - fiat_p318233_addcarryx_u64(&x760, &x761, x759, x735, x732); - x762 = (x761 + x733); - fiat_p318233_addcarryx_u64(&x763, &x764, 0x0, x714, x746); - fiat_p318233_addcarryx_u64(&x765, &x766, x764, x716, x748); - fiat_p318233_addcarryx_u64(&x767, &x768, x766, x718, x750); - fiat_p318233_addcarryx_u64(&x769, &x770, x768, x720, x752); - fiat_p318233_addcarryx_u64(&x771, &x772, x770, x722, x754); - fiat_p318233_addcarryx_u64(&x773, &x774, x772, x724, x756); - fiat_p318233_addcarryx_u64(&x775, &x776, x774, x726, x758); - fiat_p318233_addcarryx_u64(&x777, &x778, x776, x728, x760); - fiat_p318233_addcarryx_u64(&x779, &x780, x778, x730, x762); - x781 = ((uint64_t)x780 + x731); - fiat_p318233_subborrowx_u64(&x782, &x783, 0x0, x765, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x784, &x785, x783, x767, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x786, &x787, x785, x769, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_subborrowx_u64(&x788, &x789, x787, x771, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_subborrowx_u64(&x790, &x791, x789, x773, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_subborrowx_u64(&x792, &x793, x791, x775, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_subborrowx_u64(&x794, &x795, x793, x777, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_subborrowx_u64(&x796, &x797, x795, x779, UINT64_C(0x255946a8869bc6)); - fiat_p318233_subborrowx_u64(&x798, &x799, x797, x781, 0x0); - fiat_p318233_cmovznz_u64(&x800, x799, x782, x765); - fiat_p318233_cmovznz_u64(&x801, x799, x784, x767); - fiat_p318233_cmovznz_u64(&x802, x799, x786, x769); - fiat_p318233_cmovznz_u64(&x803, x799, x788, x771); - fiat_p318233_cmovznz_u64(&x804, x799, x790, x773); - fiat_p318233_cmovznz_u64(&x805, x799, x792, x775); - fiat_p318233_cmovznz_u64(&x806, x799, x794, x777); - fiat_p318233_cmovznz_u64(&x807, x799, x796, x779); - out1[0] = x800; - out1[1] = x801; - out1[2] = x802; - out1[3] = x803; - out1[4] = x804; - out1[5] = x805; - out1[6] = x806; - out1[7] = x807; -} - -/* - * The function fiat_p318233_add adds two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_add(fiat_p318233_montgomery_domain_field_element out1, const fiat_p318233_montgomery_domain_field_element arg1, const fiat_p318233_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p318233_uint1 x2; - uint64_t x3; - fiat_p318233_uint1 x4; - uint64_t x5; - fiat_p318233_uint1 x6; - uint64_t x7; - fiat_p318233_uint1 x8; - uint64_t x9; - fiat_p318233_uint1 x10; - uint64_t x11; - fiat_p318233_uint1 x12; - uint64_t x13; - fiat_p318233_uint1 x14; - uint64_t x15; - fiat_p318233_uint1 x16; - uint64_t x17; - fiat_p318233_uint1 x18; - uint64_t x19; - fiat_p318233_uint1 x20; - uint64_t x21; - fiat_p318233_uint1 x22; - uint64_t x23; - fiat_p318233_uint1 x24; - uint64_t x25; - fiat_p318233_uint1 x26; - uint64_t x27; - fiat_p318233_uint1 x28; - uint64_t x29; - fiat_p318233_uint1 x30; - uint64_t x31; - fiat_p318233_uint1 x32; - uint64_t x33; - fiat_p318233_uint1 x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - fiat_p318233_addcarryx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p318233_addcarryx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p318233_addcarryx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p318233_addcarryx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p318233_addcarryx_u64(&x9, &x10, x8, (arg1[4]), (arg2[4])); - fiat_p318233_addcarryx_u64(&x11, &x12, x10, (arg1[5]), (arg2[5])); - fiat_p318233_addcarryx_u64(&x13, &x14, x12, (arg1[6]), (arg2[6])); - fiat_p318233_addcarryx_u64(&x15, &x16, x14, (arg1[7]), (arg2[7])); - fiat_p318233_subborrowx_u64(&x17, &x18, 0x0, x1, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x19, &x20, x18, x3, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x21, &x22, x20, x5, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_subborrowx_u64(&x23, &x24, x22, x7, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_subborrowx_u64(&x25, &x26, x24, x9, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_subborrowx_u64(&x27, &x28, x26, x11, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_subborrowx_u64(&x29, &x30, x28, x13, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_subborrowx_u64(&x31, &x32, x30, x15, UINT64_C(0x255946a8869bc6)); - fiat_p318233_subborrowx_u64(&x33, &x34, x32, x16, 0x0); - fiat_p318233_cmovznz_u64(&x35, x34, x17, x1); - fiat_p318233_cmovznz_u64(&x36, x34, x19, x3); - fiat_p318233_cmovznz_u64(&x37, x34, x21, x5); - fiat_p318233_cmovznz_u64(&x38, x34, x23, x7); - fiat_p318233_cmovznz_u64(&x39, x34, x25, x9); - fiat_p318233_cmovznz_u64(&x40, x34, x27, x11); - fiat_p318233_cmovznz_u64(&x41, x34, x29, x13); - fiat_p318233_cmovznz_u64(&x42, x34, x31, x15); - out1[0] = x35; - out1[1] = x36; - out1[2] = x37; - out1[3] = x38; - out1[4] = x39; - out1[5] = x40; - out1[6] = x41; - out1[7] = x42; -} - -/* - * The function fiat_p318233_sub subtracts two field elements in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * 0 ≤ eval arg2 < m - * Postconditions: - * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_sub(fiat_p318233_montgomery_domain_field_element out1, const fiat_p318233_montgomery_domain_field_element arg1, const fiat_p318233_montgomery_domain_field_element arg2) { - uint64_t x1; - fiat_p318233_uint1 x2; - uint64_t x3; - fiat_p318233_uint1 x4; - uint64_t x5; - fiat_p318233_uint1 x6; - uint64_t x7; - fiat_p318233_uint1 x8; - uint64_t x9; - fiat_p318233_uint1 x10; - uint64_t x11; - fiat_p318233_uint1 x12; - uint64_t x13; - fiat_p318233_uint1 x14; - uint64_t x15; - fiat_p318233_uint1 x16; - uint64_t x17; - uint64_t x18; - fiat_p318233_uint1 x19; - uint64_t x20; - fiat_p318233_uint1 x21; - uint64_t x22; - fiat_p318233_uint1 x23; - uint64_t x24; - fiat_p318233_uint1 x25; - uint64_t x26; - fiat_p318233_uint1 x27; - uint64_t x28; - fiat_p318233_uint1 x29; - uint64_t x30; - fiat_p318233_uint1 x31; - uint64_t x32; - fiat_p318233_uint1 x33; - fiat_p318233_subborrowx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); - fiat_p318233_subborrowx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); - fiat_p318233_subborrowx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); - fiat_p318233_subborrowx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); - fiat_p318233_subborrowx_u64(&x9, &x10, x8, (arg1[4]), (arg2[4])); - fiat_p318233_subborrowx_u64(&x11, &x12, x10, (arg1[5]), (arg2[5])); - fiat_p318233_subborrowx_u64(&x13, &x14, x12, (arg1[6]), (arg2[6])); - fiat_p318233_subborrowx_u64(&x15, &x16, x14, (arg1[7]), (arg2[7])); - fiat_p318233_cmovznz_u64(&x17, x16, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x18, &x19, 0x0, x1, x17); - fiat_p318233_addcarryx_u64(&x20, &x21, x19, x3, x17); - fiat_p318233_addcarryx_u64(&x22, &x23, x21, x5, (x17 & UINT64_C(0x994c68ada6e1ffff))); - fiat_p318233_addcarryx_u64(&x24, &x25, x23, x7, (x17 & UINT64_C(0xfaf0a29a781974ce))); - fiat_p318233_addcarryx_u64(&x26, &x27, x25, x9, (x17 & UINT64_C(0xfe3ac5904a0dea65))); - fiat_p318233_addcarryx_u64(&x28, &x29, x27, x11, (x17 & UINT64_C(0x2bdbe6326507d01))); - fiat_p318233_addcarryx_u64(&x30, &x31, x29, x13, (x17 & UINT64_C(0x8c15b0036936e792))); - fiat_p318233_addcarryx_u64(&x32, &x33, x31, x15, (x17 & UINT64_C(0x255946a8869bc6))); - out1[0] = x18; - out1[1] = x20; - out1[2] = x22; - out1[3] = x24; - out1[4] = x26; - out1[5] = x28; - out1[6] = x30; - out1[7] = x32; -} - -/* - * The function fiat_p318233_opp negates a field element in the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = -eval (from_montgomery arg1) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_opp(fiat_p318233_montgomery_domain_field_element out1, const fiat_p318233_montgomery_domain_field_element arg1) { - uint64_t x1; - fiat_p318233_uint1 x2; - uint64_t x3; - fiat_p318233_uint1 x4; - uint64_t x5; - fiat_p318233_uint1 x6; - uint64_t x7; - fiat_p318233_uint1 x8; - uint64_t x9; - fiat_p318233_uint1 x10; - uint64_t x11; - fiat_p318233_uint1 x12; - uint64_t x13; - fiat_p318233_uint1 x14; - uint64_t x15; - fiat_p318233_uint1 x16; - uint64_t x17; - uint64_t x18; - fiat_p318233_uint1 x19; - uint64_t x20; - fiat_p318233_uint1 x21; - uint64_t x22; - fiat_p318233_uint1 x23; - uint64_t x24; - fiat_p318233_uint1 x25; - uint64_t x26; - fiat_p318233_uint1 x27; - uint64_t x28; - fiat_p318233_uint1 x29; - uint64_t x30; - fiat_p318233_uint1 x31; - uint64_t x32; - fiat_p318233_uint1 x33; - fiat_p318233_subborrowx_u64(&x1, &x2, 0x0, 0x0, (arg1[0])); - fiat_p318233_subborrowx_u64(&x3, &x4, x2, 0x0, (arg1[1])); - fiat_p318233_subborrowx_u64(&x5, &x6, x4, 0x0, (arg1[2])); - fiat_p318233_subborrowx_u64(&x7, &x8, x6, 0x0, (arg1[3])); - fiat_p318233_subborrowx_u64(&x9, &x10, x8, 0x0, (arg1[4])); - fiat_p318233_subborrowx_u64(&x11, &x12, x10, 0x0, (arg1[5])); - fiat_p318233_subborrowx_u64(&x13, &x14, x12, 0x0, (arg1[6])); - fiat_p318233_subborrowx_u64(&x15, &x16, x14, 0x0, (arg1[7])); - fiat_p318233_cmovznz_u64(&x17, x16, 0x0, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x18, &x19, 0x0, x1, x17); - fiat_p318233_addcarryx_u64(&x20, &x21, x19, x3, x17); - fiat_p318233_addcarryx_u64(&x22, &x23, x21, x5, (x17 & UINT64_C(0x994c68ada6e1ffff))); - fiat_p318233_addcarryx_u64(&x24, &x25, x23, x7, (x17 & UINT64_C(0xfaf0a29a781974ce))); - fiat_p318233_addcarryx_u64(&x26, &x27, x25, x9, (x17 & UINT64_C(0xfe3ac5904a0dea65))); - fiat_p318233_addcarryx_u64(&x28, &x29, x27, x11, (x17 & UINT64_C(0x2bdbe6326507d01))); - fiat_p318233_addcarryx_u64(&x30, &x31, x29, x13, (x17 & UINT64_C(0x8c15b0036936e792))); - fiat_p318233_addcarryx_u64(&x32, &x33, x31, x15, (x17 & UINT64_C(0x255946a8869bc6))); - out1[0] = x18; - out1[1] = x20; - out1[2] = x22; - out1[3] = x24; - out1[4] = x26; - out1[5] = x28; - out1[6] = x30; - out1[7] = x32; -} - -/* - * The function fiat_p318233_from_montgomery translates a field element out of the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^8) mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_from_montgomery(fiat_p318233_non_montgomery_domain_field_element out1, const fiat_p318233_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - fiat_p318233_uint1 x19; - uint64_t x20; - fiat_p318233_uint1 x21; - uint64_t x22; - fiat_p318233_uint1 x23; - uint64_t x24; - fiat_p318233_uint1 x25; - uint64_t x26; - fiat_p318233_uint1 x27; - uint64_t x28; - fiat_p318233_uint1 x29; - uint64_t x30; - fiat_p318233_uint1 x31; - uint64_t x32; - fiat_p318233_uint1 x33; - uint64_t x34; - fiat_p318233_uint1 x35; - uint64_t x36; - fiat_p318233_uint1 x37; - uint64_t x38; - fiat_p318233_uint1 x39; - uint64_t x40; - fiat_p318233_uint1 x41; - uint64_t x42; - fiat_p318233_uint1 x43; - uint64_t x44; - fiat_p318233_uint1 x45; - uint64_t x46; - fiat_p318233_uint1 x47; - uint64_t x48; - fiat_p318233_uint1 x49; - uint64_t x50; - fiat_p318233_uint1 x51; - uint64_t x52; - fiat_p318233_uint1 x53; - uint64_t x54; - fiat_p318233_uint1 x55; - uint64_t x56; - fiat_p318233_uint1 x57; - uint64_t x58; - fiat_p318233_uint1 x59; - uint64_t x60; - fiat_p318233_uint1 x61; - uint64_t x62; - uint64_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - fiat_p318233_uint1 x79; - uint64_t x80; - fiat_p318233_uint1 x81; - uint64_t x82; - fiat_p318233_uint1 x83; - uint64_t x84; - fiat_p318233_uint1 x85; - uint64_t x86; - fiat_p318233_uint1 x87; - uint64_t x88; - fiat_p318233_uint1 x89; - uint64_t x90; - fiat_p318233_uint1 x91; - uint64_t x92; - fiat_p318233_uint1 x93; - uint64_t x94; - fiat_p318233_uint1 x95; - uint64_t x96; - fiat_p318233_uint1 x97; - uint64_t x98; - fiat_p318233_uint1 x99; - uint64_t x100; - fiat_p318233_uint1 x101; - uint64_t x102; - fiat_p318233_uint1 x103; - uint64_t x104; - fiat_p318233_uint1 x105; - uint64_t x106; - fiat_p318233_uint1 x107; - uint64_t x108; - fiat_p318233_uint1 x109; - uint64_t x110; - fiat_p318233_uint1 x111; - uint64_t x112; - fiat_p318233_uint1 x113; - uint64_t x114; - fiat_p318233_uint1 x115; - uint64_t x116; - fiat_p318233_uint1 x117; - uint64_t x118; - fiat_p318233_uint1 x119; - uint64_t x120; - fiat_p318233_uint1 x121; - uint64_t x122; - uint64_t x123; - uint64_t x124; - uint64_t x125; - uint64_t x126; - uint64_t x127; - uint64_t x128; - uint64_t x129; - uint64_t x130; - uint64_t x131; - uint64_t x132; - uint64_t x133; - uint64_t x134; - uint64_t x135; - uint64_t x136; - uint64_t x137; - uint64_t x138; - fiat_p318233_uint1 x139; - uint64_t x140; - fiat_p318233_uint1 x141; - uint64_t x142; - fiat_p318233_uint1 x143; - uint64_t x144; - fiat_p318233_uint1 x145; - uint64_t x146; - fiat_p318233_uint1 x147; - uint64_t x148; - fiat_p318233_uint1 x149; - uint64_t x150; - fiat_p318233_uint1 x151; - uint64_t x152; - fiat_p318233_uint1 x153; - uint64_t x154; - fiat_p318233_uint1 x155; - uint64_t x156; - fiat_p318233_uint1 x157; - uint64_t x158; - fiat_p318233_uint1 x159; - uint64_t x160; - fiat_p318233_uint1 x161; - uint64_t x162; - fiat_p318233_uint1 x163; - uint64_t x164; - fiat_p318233_uint1 x165; - uint64_t x166; - fiat_p318233_uint1 x167; - uint64_t x168; - fiat_p318233_uint1 x169; - uint64_t x170; - fiat_p318233_uint1 x171; - uint64_t x172; - fiat_p318233_uint1 x173; - uint64_t x174; - fiat_p318233_uint1 x175; - uint64_t x176; - fiat_p318233_uint1 x177; - uint64_t x178; - fiat_p318233_uint1 x179; - uint64_t x180; - fiat_p318233_uint1 x181; - uint64_t x182; - uint64_t x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - uint64_t x191; - uint64_t x192; - uint64_t x193; - uint64_t x194; - uint64_t x195; - uint64_t x196; - uint64_t x197; - uint64_t x198; - fiat_p318233_uint1 x199; - uint64_t x200; - fiat_p318233_uint1 x201; - uint64_t x202; - fiat_p318233_uint1 x203; - uint64_t x204; - fiat_p318233_uint1 x205; - uint64_t x206; - fiat_p318233_uint1 x207; - uint64_t x208; - fiat_p318233_uint1 x209; - uint64_t x210; - fiat_p318233_uint1 x211; - uint64_t x212; - fiat_p318233_uint1 x213; - uint64_t x214; - fiat_p318233_uint1 x215; - uint64_t x216; - fiat_p318233_uint1 x217; - uint64_t x218; - fiat_p318233_uint1 x219; - uint64_t x220; - fiat_p318233_uint1 x221; - uint64_t x222; - fiat_p318233_uint1 x223; - uint64_t x224; - fiat_p318233_uint1 x225; - uint64_t x226; - fiat_p318233_uint1 x227; - uint64_t x228; - fiat_p318233_uint1 x229; - uint64_t x230; - fiat_p318233_uint1 x231; - uint64_t x232; - fiat_p318233_uint1 x233; - uint64_t x234; - fiat_p318233_uint1 x235; - uint64_t x236; - fiat_p318233_uint1 x237; - uint64_t x238; - fiat_p318233_uint1 x239; - uint64_t x240; - fiat_p318233_uint1 x241; - uint64_t x242; - uint64_t x243; - uint64_t x244; - uint64_t x245; - uint64_t x246; - uint64_t x247; - uint64_t x248; - uint64_t x249; - uint64_t x250; - uint64_t x251; - uint64_t x252; - uint64_t x253; - uint64_t x254; - uint64_t x255; - uint64_t x256; - uint64_t x257; - uint64_t x258; - fiat_p318233_uint1 x259; - uint64_t x260; - fiat_p318233_uint1 x261; - uint64_t x262; - fiat_p318233_uint1 x263; - uint64_t x264; - fiat_p318233_uint1 x265; - uint64_t x266; - fiat_p318233_uint1 x267; - uint64_t x268; - fiat_p318233_uint1 x269; - uint64_t x270; - fiat_p318233_uint1 x271; - uint64_t x272; - fiat_p318233_uint1 x273; - uint64_t x274; - fiat_p318233_uint1 x275; - uint64_t x276; - fiat_p318233_uint1 x277; - uint64_t x278; - fiat_p318233_uint1 x279; - uint64_t x280; - fiat_p318233_uint1 x281; - uint64_t x282; - fiat_p318233_uint1 x283; - uint64_t x284; - fiat_p318233_uint1 x285; - uint64_t x286; - fiat_p318233_uint1 x287; - uint64_t x288; - fiat_p318233_uint1 x289; - uint64_t x290; - fiat_p318233_uint1 x291; - uint64_t x292; - fiat_p318233_uint1 x293; - uint64_t x294; - fiat_p318233_uint1 x295; - uint64_t x296; - fiat_p318233_uint1 x297; - uint64_t x298; - fiat_p318233_uint1 x299; - uint64_t x300; - fiat_p318233_uint1 x301; - uint64_t x302; - uint64_t x303; - uint64_t x304; - uint64_t x305; - uint64_t x306; - uint64_t x307; - uint64_t x308; - uint64_t x309; - uint64_t x310; - uint64_t x311; - uint64_t x312; - uint64_t x313; - uint64_t x314; - uint64_t x315; - uint64_t x316; - uint64_t x317; - uint64_t x318; - fiat_p318233_uint1 x319; - uint64_t x320; - fiat_p318233_uint1 x321; - uint64_t x322; - fiat_p318233_uint1 x323; - uint64_t x324; - fiat_p318233_uint1 x325; - uint64_t x326; - fiat_p318233_uint1 x327; - uint64_t x328; - fiat_p318233_uint1 x329; - uint64_t x330; - fiat_p318233_uint1 x331; - uint64_t x332; - fiat_p318233_uint1 x333; - uint64_t x334; - fiat_p318233_uint1 x335; - uint64_t x336; - fiat_p318233_uint1 x337; - uint64_t x338; - fiat_p318233_uint1 x339; - uint64_t x340; - fiat_p318233_uint1 x341; - uint64_t x342; - fiat_p318233_uint1 x343; - uint64_t x344; - fiat_p318233_uint1 x345; - uint64_t x346; - fiat_p318233_uint1 x347; - uint64_t x348; - fiat_p318233_uint1 x349; - uint64_t x350; - fiat_p318233_uint1 x351; - uint64_t x352; - fiat_p318233_uint1 x353; - uint64_t x354; - fiat_p318233_uint1 x355; - uint64_t x356; - fiat_p318233_uint1 x357; - uint64_t x358; - fiat_p318233_uint1 x359; - uint64_t x360; - fiat_p318233_uint1 x361; - uint64_t x362; - uint64_t x363; - uint64_t x364; - uint64_t x365; - uint64_t x366; - uint64_t x367; - uint64_t x368; - uint64_t x369; - uint64_t x370; - uint64_t x371; - uint64_t x372; - uint64_t x373; - uint64_t x374; - uint64_t x375; - uint64_t x376; - uint64_t x377; - uint64_t x378; - fiat_p318233_uint1 x379; - uint64_t x380; - fiat_p318233_uint1 x381; - uint64_t x382; - fiat_p318233_uint1 x383; - uint64_t x384; - fiat_p318233_uint1 x385; - uint64_t x386; - fiat_p318233_uint1 x387; - uint64_t x388; - fiat_p318233_uint1 x389; - uint64_t x390; - fiat_p318233_uint1 x391; - uint64_t x392; - fiat_p318233_uint1 x393; - uint64_t x394; - fiat_p318233_uint1 x395; - uint64_t x396; - fiat_p318233_uint1 x397; - uint64_t x398; - fiat_p318233_uint1 x399; - uint64_t x400; - fiat_p318233_uint1 x401; - uint64_t x402; - fiat_p318233_uint1 x403; - uint64_t x404; - fiat_p318233_uint1 x405; - uint64_t x406; - fiat_p318233_uint1 x407; - uint64_t x408; - fiat_p318233_uint1 x409; - uint64_t x410; - fiat_p318233_uint1 x411; - uint64_t x412; - fiat_p318233_uint1 x413; - uint64_t x414; - fiat_p318233_uint1 x415; - uint64_t x416; - fiat_p318233_uint1 x417; - uint64_t x418; - fiat_p318233_uint1 x419; - uint64_t x420; - fiat_p318233_uint1 x421; - uint64_t x422; - uint64_t x423; - uint64_t x424; - uint64_t x425; - uint64_t x426; - uint64_t x427; - uint64_t x428; - uint64_t x429; - uint64_t x430; - uint64_t x431; - uint64_t x432; - uint64_t x433; - uint64_t x434; - uint64_t x435; - uint64_t x436; - uint64_t x437; - uint64_t x438; - fiat_p318233_uint1 x439; - uint64_t x440; - fiat_p318233_uint1 x441; - uint64_t x442; - fiat_p318233_uint1 x443; - uint64_t x444; - fiat_p318233_uint1 x445; - uint64_t x446; - fiat_p318233_uint1 x447; - uint64_t x448; - fiat_p318233_uint1 x449; - uint64_t x450; - fiat_p318233_uint1 x451; - uint64_t x452; - fiat_p318233_uint1 x453; - uint64_t x454; - fiat_p318233_uint1 x455; - uint64_t x456; - fiat_p318233_uint1 x457; - uint64_t x458; - fiat_p318233_uint1 x459; - uint64_t x460; - fiat_p318233_uint1 x461; - uint64_t x462; - fiat_p318233_uint1 x463; - uint64_t x464; - fiat_p318233_uint1 x465; - uint64_t x466; - fiat_p318233_uint1 x467; - uint64_t x468; - uint64_t x469; - fiat_p318233_uint1 x470; - uint64_t x471; - fiat_p318233_uint1 x472; - uint64_t x473; - fiat_p318233_uint1 x474; - uint64_t x475; - fiat_p318233_uint1 x476; - uint64_t x477; - fiat_p318233_uint1 x478; - uint64_t x479; - fiat_p318233_uint1 x480; - uint64_t x481; - fiat_p318233_uint1 x482; - uint64_t x483; - fiat_p318233_uint1 x484; - uint64_t x485; - fiat_p318233_uint1 x486; - uint64_t x487; - uint64_t x488; - uint64_t x489; - uint64_t x490; - uint64_t x491; - uint64_t x492; - uint64_t x493; - uint64_t x494; - x1 = (arg1[0]); - fiat_p318233_mulx_u64(&x2, &x3, x1, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x4, &x5, x1, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x6, &x7, x1, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x8, &x9, x1, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x10, &x11, x1, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x12, &x13, x1, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x14, &x15, x1, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x16, &x17, x1, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x18, &x19, 0x0, x17, x14); - fiat_p318233_addcarryx_u64(&x20, &x21, x19, x15, x12); - fiat_p318233_addcarryx_u64(&x22, &x23, x21, x13, x10); - fiat_p318233_addcarryx_u64(&x24, &x25, x23, x11, x8); - fiat_p318233_addcarryx_u64(&x26, &x27, x25, x9, x6); - fiat_p318233_addcarryx_u64(&x28, &x29, x27, x7, x4); - fiat_p318233_addcarryx_u64(&x30, &x31, x29, x5, x2); - fiat_p318233_addcarryx_u64(&x32, &x33, 0x0, x1, x16); - fiat_p318233_addcarryx_u64(&x34, &x35, x33, 0x0, x18); - fiat_p318233_addcarryx_u64(&x36, &x37, x35, 0x0, x20); - fiat_p318233_addcarryx_u64(&x38, &x39, x37, 0x0, x22); - fiat_p318233_addcarryx_u64(&x40, &x41, x39, 0x0, x24); - fiat_p318233_addcarryx_u64(&x42, &x43, x41, 0x0, x26); - fiat_p318233_addcarryx_u64(&x44, &x45, x43, 0x0, x28); - fiat_p318233_addcarryx_u64(&x46, &x47, x45, 0x0, x30); - fiat_p318233_addcarryx_u64(&x48, &x49, 0x0, x34, (arg1[1])); - fiat_p318233_addcarryx_u64(&x50, &x51, x49, x36, 0x0); - fiat_p318233_addcarryx_u64(&x52, &x53, x51, x38, 0x0); - fiat_p318233_addcarryx_u64(&x54, &x55, x53, x40, 0x0); - fiat_p318233_addcarryx_u64(&x56, &x57, x55, x42, 0x0); - fiat_p318233_addcarryx_u64(&x58, &x59, x57, x44, 0x0); - fiat_p318233_addcarryx_u64(&x60, &x61, x59, x46, 0x0); - fiat_p318233_mulx_u64(&x62, &x63, x48, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x64, &x65, x48, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x66, &x67, x48, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x68, &x69, x48, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x70, &x71, x48, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x72, &x73, x48, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x74, &x75, x48, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x76, &x77, x48, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x78, &x79, 0x0, x77, x74); - fiat_p318233_addcarryx_u64(&x80, &x81, x79, x75, x72); - fiat_p318233_addcarryx_u64(&x82, &x83, x81, x73, x70); - fiat_p318233_addcarryx_u64(&x84, &x85, x83, x71, x68); - fiat_p318233_addcarryx_u64(&x86, &x87, x85, x69, x66); - fiat_p318233_addcarryx_u64(&x88, &x89, x87, x67, x64); - fiat_p318233_addcarryx_u64(&x90, &x91, x89, x65, x62); - fiat_p318233_addcarryx_u64(&x92, &x93, 0x0, x48, x76); - fiat_p318233_addcarryx_u64(&x94, &x95, x93, x50, x78); - fiat_p318233_addcarryx_u64(&x96, &x97, x95, x52, x80); - fiat_p318233_addcarryx_u64(&x98, &x99, x97, x54, x82); - fiat_p318233_addcarryx_u64(&x100, &x101, x99, x56, x84); - fiat_p318233_addcarryx_u64(&x102, &x103, x101, x58, x86); - fiat_p318233_addcarryx_u64(&x104, &x105, x103, x60, x88); - fiat_p318233_addcarryx_u64(&x106, &x107, x105, (x61 + (x47 + (x31 + x3))), x90); - fiat_p318233_addcarryx_u64(&x108, &x109, 0x0, x94, (arg1[2])); - fiat_p318233_addcarryx_u64(&x110, &x111, x109, x96, 0x0); - fiat_p318233_addcarryx_u64(&x112, &x113, x111, x98, 0x0); - fiat_p318233_addcarryx_u64(&x114, &x115, x113, x100, 0x0); - fiat_p318233_addcarryx_u64(&x116, &x117, x115, x102, 0x0); - fiat_p318233_addcarryx_u64(&x118, &x119, x117, x104, 0x0); - fiat_p318233_addcarryx_u64(&x120, &x121, x119, x106, 0x0); - fiat_p318233_mulx_u64(&x122, &x123, x108, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x124, &x125, x108, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x126, &x127, x108, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x128, &x129, x108, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x130, &x131, x108, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x132, &x133, x108, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x134, &x135, x108, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x136, &x137, x108, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x138, &x139, 0x0, x137, x134); - fiat_p318233_addcarryx_u64(&x140, &x141, x139, x135, x132); - fiat_p318233_addcarryx_u64(&x142, &x143, x141, x133, x130); - fiat_p318233_addcarryx_u64(&x144, &x145, x143, x131, x128); - fiat_p318233_addcarryx_u64(&x146, &x147, x145, x129, x126); - fiat_p318233_addcarryx_u64(&x148, &x149, x147, x127, x124); - fiat_p318233_addcarryx_u64(&x150, &x151, x149, x125, x122); - fiat_p318233_addcarryx_u64(&x152, &x153, 0x0, x108, x136); - fiat_p318233_addcarryx_u64(&x154, &x155, x153, x110, x138); - fiat_p318233_addcarryx_u64(&x156, &x157, x155, x112, x140); - fiat_p318233_addcarryx_u64(&x158, &x159, x157, x114, x142); - fiat_p318233_addcarryx_u64(&x160, &x161, x159, x116, x144); - fiat_p318233_addcarryx_u64(&x162, &x163, x161, x118, x146); - fiat_p318233_addcarryx_u64(&x164, &x165, x163, x120, x148); - fiat_p318233_addcarryx_u64(&x166, &x167, x165, (x121 + (x107 + (x91 + x63))), x150); - fiat_p318233_addcarryx_u64(&x168, &x169, 0x0, x154, (arg1[3])); - fiat_p318233_addcarryx_u64(&x170, &x171, x169, x156, 0x0); - fiat_p318233_addcarryx_u64(&x172, &x173, x171, x158, 0x0); - fiat_p318233_addcarryx_u64(&x174, &x175, x173, x160, 0x0); - fiat_p318233_addcarryx_u64(&x176, &x177, x175, x162, 0x0); - fiat_p318233_addcarryx_u64(&x178, &x179, x177, x164, 0x0); - fiat_p318233_addcarryx_u64(&x180, &x181, x179, x166, 0x0); - fiat_p318233_mulx_u64(&x182, &x183, x168, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x184, &x185, x168, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x186, &x187, x168, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x188, &x189, x168, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x190, &x191, x168, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x192, &x193, x168, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x194, &x195, x168, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x196, &x197, x168, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x198, &x199, 0x0, x197, x194); - fiat_p318233_addcarryx_u64(&x200, &x201, x199, x195, x192); - fiat_p318233_addcarryx_u64(&x202, &x203, x201, x193, x190); - fiat_p318233_addcarryx_u64(&x204, &x205, x203, x191, x188); - fiat_p318233_addcarryx_u64(&x206, &x207, x205, x189, x186); - fiat_p318233_addcarryx_u64(&x208, &x209, x207, x187, x184); - fiat_p318233_addcarryx_u64(&x210, &x211, x209, x185, x182); - fiat_p318233_addcarryx_u64(&x212, &x213, 0x0, x168, x196); - fiat_p318233_addcarryx_u64(&x214, &x215, x213, x170, x198); - fiat_p318233_addcarryx_u64(&x216, &x217, x215, x172, x200); - fiat_p318233_addcarryx_u64(&x218, &x219, x217, x174, x202); - fiat_p318233_addcarryx_u64(&x220, &x221, x219, x176, x204); - fiat_p318233_addcarryx_u64(&x222, &x223, x221, x178, x206); - fiat_p318233_addcarryx_u64(&x224, &x225, x223, x180, x208); - fiat_p318233_addcarryx_u64(&x226, &x227, x225, (x181 + (x167 + (x151 + x123))), x210); - fiat_p318233_addcarryx_u64(&x228, &x229, 0x0, x214, (arg1[4])); - fiat_p318233_addcarryx_u64(&x230, &x231, x229, x216, 0x0); - fiat_p318233_addcarryx_u64(&x232, &x233, x231, x218, 0x0); - fiat_p318233_addcarryx_u64(&x234, &x235, x233, x220, 0x0); - fiat_p318233_addcarryx_u64(&x236, &x237, x235, x222, 0x0); - fiat_p318233_addcarryx_u64(&x238, &x239, x237, x224, 0x0); - fiat_p318233_addcarryx_u64(&x240, &x241, x239, x226, 0x0); - fiat_p318233_mulx_u64(&x242, &x243, x228, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x244, &x245, x228, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x246, &x247, x228, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x248, &x249, x228, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x250, &x251, x228, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x252, &x253, x228, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x254, &x255, x228, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x256, &x257, x228, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x258, &x259, 0x0, x257, x254); - fiat_p318233_addcarryx_u64(&x260, &x261, x259, x255, x252); - fiat_p318233_addcarryx_u64(&x262, &x263, x261, x253, x250); - fiat_p318233_addcarryx_u64(&x264, &x265, x263, x251, x248); - fiat_p318233_addcarryx_u64(&x266, &x267, x265, x249, x246); - fiat_p318233_addcarryx_u64(&x268, &x269, x267, x247, x244); - fiat_p318233_addcarryx_u64(&x270, &x271, x269, x245, x242); - fiat_p318233_addcarryx_u64(&x272, &x273, 0x0, x228, x256); - fiat_p318233_addcarryx_u64(&x274, &x275, x273, x230, x258); - fiat_p318233_addcarryx_u64(&x276, &x277, x275, x232, x260); - fiat_p318233_addcarryx_u64(&x278, &x279, x277, x234, x262); - fiat_p318233_addcarryx_u64(&x280, &x281, x279, x236, x264); - fiat_p318233_addcarryx_u64(&x282, &x283, x281, x238, x266); - fiat_p318233_addcarryx_u64(&x284, &x285, x283, x240, x268); - fiat_p318233_addcarryx_u64(&x286, &x287, x285, (x241 + (x227 + (x211 + x183))), x270); - fiat_p318233_addcarryx_u64(&x288, &x289, 0x0, x274, (arg1[5])); - fiat_p318233_addcarryx_u64(&x290, &x291, x289, x276, 0x0); - fiat_p318233_addcarryx_u64(&x292, &x293, x291, x278, 0x0); - fiat_p318233_addcarryx_u64(&x294, &x295, x293, x280, 0x0); - fiat_p318233_addcarryx_u64(&x296, &x297, x295, x282, 0x0); - fiat_p318233_addcarryx_u64(&x298, &x299, x297, x284, 0x0); - fiat_p318233_addcarryx_u64(&x300, &x301, x299, x286, 0x0); - fiat_p318233_mulx_u64(&x302, &x303, x288, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x304, &x305, x288, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x306, &x307, x288, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x308, &x309, x288, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x310, &x311, x288, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x312, &x313, x288, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x314, &x315, x288, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x316, &x317, x288, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x318, &x319, 0x0, x317, x314); - fiat_p318233_addcarryx_u64(&x320, &x321, x319, x315, x312); - fiat_p318233_addcarryx_u64(&x322, &x323, x321, x313, x310); - fiat_p318233_addcarryx_u64(&x324, &x325, x323, x311, x308); - fiat_p318233_addcarryx_u64(&x326, &x327, x325, x309, x306); - fiat_p318233_addcarryx_u64(&x328, &x329, x327, x307, x304); - fiat_p318233_addcarryx_u64(&x330, &x331, x329, x305, x302); - fiat_p318233_addcarryx_u64(&x332, &x333, 0x0, x288, x316); - fiat_p318233_addcarryx_u64(&x334, &x335, x333, x290, x318); - fiat_p318233_addcarryx_u64(&x336, &x337, x335, x292, x320); - fiat_p318233_addcarryx_u64(&x338, &x339, x337, x294, x322); - fiat_p318233_addcarryx_u64(&x340, &x341, x339, x296, x324); - fiat_p318233_addcarryx_u64(&x342, &x343, x341, x298, x326); - fiat_p318233_addcarryx_u64(&x344, &x345, x343, x300, x328); - fiat_p318233_addcarryx_u64(&x346, &x347, x345, (x301 + (x287 + (x271 + x243))), x330); - fiat_p318233_addcarryx_u64(&x348, &x349, 0x0, x334, (arg1[6])); - fiat_p318233_addcarryx_u64(&x350, &x351, x349, x336, 0x0); - fiat_p318233_addcarryx_u64(&x352, &x353, x351, x338, 0x0); - fiat_p318233_addcarryx_u64(&x354, &x355, x353, x340, 0x0); - fiat_p318233_addcarryx_u64(&x356, &x357, x355, x342, 0x0); - fiat_p318233_addcarryx_u64(&x358, &x359, x357, x344, 0x0); - fiat_p318233_addcarryx_u64(&x360, &x361, x359, x346, 0x0); - fiat_p318233_mulx_u64(&x362, &x363, x348, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x364, &x365, x348, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x366, &x367, x348, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x368, &x369, x348, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x370, &x371, x348, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x372, &x373, x348, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x374, &x375, x348, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x376, &x377, x348, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x378, &x379, 0x0, x377, x374); - fiat_p318233_addcarryx_u64(&x380, &x381, x379, x375, x372); - fiat_p318233_addcarryx_u64(&x382, &x383, x381, x373, x370); - fiat_p318233_addcarryx_u64(&x384, &x385, x383, x371, x368); - fiat_p318233_addcarryx_u64(&x386, &x387, x385, x369, x366); - fiat_p318233_addcarryx_u64(&x388, &x389, x387, x367, x364); - fiat_p318233_addcarryx_u64(&x390, &x391, x389, x365, x362); - fiat_p318233_addcarryx_u64(&x392, &x393, 0x0, x348, x376); - fiat_p318233_addcarryx_u64(&x394, &x395, x393, x350, x378); - fiat_p318233_addcarryx_u64(&x396, &x397, x395, x352, x380); - fiat_p318233_addcarryx_u64(&x398, &x399, x397, x354, x382); - fiat_p318233_addcarryx_u64(&x400, &x401, x399, x356, x384); - fiat_p318233_addcarryx_u64(&x402, &x403, x401, x358, x386); - fiat_p318233_addcarryx_u64(&x404, &x405, x403, x360, x388); - fiat_p318233_addcarryx_u64(&x406, &x407, x405, (x361 + (x347 + (x331 + x303))), x390); - fiat_p318233_addcarryx_u64(&x408, &x409, 0x0, x394, (arg1[7])); - fiat_p318233_addcarryx_u64(&x410, &x411, x409, x396, 0x0); - fiat_p318233_addcarryx_u64(&x412, &x413, x411, x398, 0x0); - fiat_p318233_addcarryx_u64(&x414, &x415, x413, x400, 0x0); - fiat_p318233_addcarryx_u64(&x416, &x417, x415, x402, 0x0); - fiat_p318233_addcarryx_u64(&x418, &x419, x417, x404, 0x0); - fiat_p318233_addcarryx_u64(&x420, &x421, x419, x406, 0x0); - fiat_p318233_mulx_u64(&x422, &x423, x408, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x424, &x425, x408, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x426, &x427, x408, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x428, &x429, x408, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x430, &x431, x408, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x432, &x433, x408, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x434, &x435, x408, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x436, &x437, x408, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x438, &x439, 0x0, x437, x434); - fiat_p318233_addcarryx_u64(&x440, &x441, x439, x435, x432); - fiat_p318233_addcarryx_u64(&x442, &x443, x441, x433, x430); - fiat_p318233_addcarryx_u64(&x444, &x445, x443, x431, x428); - fiat_p318233_addcarryx_u64(&x446, &x447, x445, x429, x426); - fiat_p318233_addcarryx_u64(&x448, &x449, x447, x427, x424); - fiat_p318233_addcarryx_u64(&x450, &x451, x449, x425, x422); - fiat_p318233_addcarryx_u64(&x452, &x453, 0x0, x408, x436); - fiat_p318233_addcarryx_u64(&x454, &x455, x453, x410, x438); - fiat_p318233_addcarryx_u64(&x456, &x457, x455, x412, x440); - fiat_p318233_addcarryx_u64(&x458, &x459, x457, x414, x442); - fiat_p318233_addcarryx_u64(&x460, &x461, x459, x416, x444); - fiat_p318233_addcarryx_u64(&x462, &x463, x461, x418, x446); - fiat_p318233_addcarryx_u64(&x464, &x465, x463, x420, x448); - fiat_p318233_addcarryx_u64(&x466, &x467, x465, (x421 + (x407 + (x391 + x363))), x450); - x468 = (x467 + (x451 + x423)); - fiat_p318233_subborrowx_u64(&x469, &x470, 0x0, x454, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x471, &x472, x470, x456, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x473, &x474, x472, x458, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_subborrowx_u64(&x475, &x476, x474, x460, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_subborrowx_u64(&x477, &x478, x476, x462, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_subborrowx_u64(&x479, &x480, x478, x464, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_subborrowx_u64(&x481, &x482, x480, x466, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_subborrowx_u64(&x483, &x484, x482, x468, UINT64_C(0x255946a8869bc6)); - fiat_p318233_subborrowx_u64(&x485, &x486, x484, 0x0, 0x0); - fiat_p318233_cmovznz_u64(&x487, x486, x469, x454); - fiat_p318233_cmovznz_u64(&x488, x486, x471, x456); - fiat_p318233_cmovznz_u64(&x489, x486, x473, x458); - fiat_p318233_cmovznz_u64(&x490, x486, x475, x460); - fiat_p318233_cmovznz_u64(&x491, x486, x477, x462); - fiat_p318233_cmovznz_u64(&x492, x486, x479, x464); - fiat_p318233_cmovznz_u64(&x493, x486, x481, x466); - fiat_p318233_cmovznz_u64(&x494, x486, x483, x468); - out1[0] = x487; - out1[1] = x488; - out1[2] = x489; - out1[3] = x490; - out1[4] = x491; - out1[5] = x492; - out1[6] = x493; - out1[7] = x494; -} - -/* - * The function fiat_p318233_to_montgomery translates a field element into the Montgomery domain. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * eval (from_montgomery out1) mod m = eval arg1 mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_to_montgomery(fiat_p318233_montgomery_domain_field_element out1, const fiat_p318233_non_montgomery_domain_field_element arg1) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint64_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint64_t x23; - uint64_t x24; - uint64_t x25; - fiat_p318233_uint1 x26; - uint64_t x27; - fiat_p318233_uint1 x28; - uint64_t x29; - fiat_p318233_uint1 x30; - uint64_t x31; - fiat_p318233_uint1 x32; - uint64_t x33; - fiat_p318233_uint1 x34; - uint64_t x35; - fiat_p318233_uint1 x36; - uint64_t x37; - fiat_p318233_uint1 x38; - uint64_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint64_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint64_t x55; - fiat_p318233_uint1 x56; - uint64_t x57; - fiat_p318233_uint1 x58; - uint64_t x59; - fiat_p318233_uint1 x60; - uint64_t x61; - fiat_p318233_uint1 x62; - uint64_t x63; - fiat_p318233_uint1 x64; - uint64_t x65; - fiat_p318233_uint1 x66; - uint64_t x67; - fiat_p318233_uint1 x68; - uint64_t x69; - fiat_p318233_uint1 x70; - uint64_t x71; - fiat_p318233_uint1 x72; - uint64_t x73; - fiat_p318233_uint1 x74; - uint64_t x75; - fiat_p318233_uint1 x76; - uint64_t x77; - fiat_p318233_uint1 x78; - uint64_t x79; - fiat_p318233_uint1 x80; - uint64_t x81; - fiat_p318233_uint1 x82; - uint64_t x83; - fiat_p318233_uint1 x84; - uint64_t x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - fiat_p318233_uint1 x102; - uint64_t x103; - fiat_p318233_uint1 x104; - uint64_t x105; - fiat_p318233_uint1 x106; - uint64_t x107; - fiat_p318233_uint1 x108; - uint64_t x109; - fiat_p318233_uint1 x110; - uint64_t x111; - fiat_p318233_uint1 x112; - uint64_t x113; - fiat_p318233_uint1 x114; - uint64_t x115; - fiat_p318233_uint1 x116; - uint64_t x117; - fiat_p318233_uint1 x118; - uint64_t x119; - fiat_p318233_uint1 x120; - uint64_t x121; - fiat_p318233_uint1 x122; - uint64_t x123; - fiat_p318233_uint1 x124; - uint64_t x125; - fiat_p318233_uint1 x126; - uint64_t x127; - fiat_p318233_uint1 x128; - uint64_t x129; - fiat_p318233_uint1 x130; - uint64_t x131; - uint64_t x132; - uint64_t x133; - uint64_t x134; - uint64_t x135; - uint64_t x136; - uint64_t x137; - uint64_t x138; - uint64_t x139; - uint64_t x140; - uint64_t x141; - uint64_t x142; - uint64_t x143; - uint64_t x144; - uint64_t x145; - uint64_t x146; - uint64_t x147; - fiat_p318233_uint1 x148; - uint64_t x149; - fiat_p318233_uint1 x150; - uint64_t x151; - fiat_p318233_uint1 x152; - uint64_t x153; - fiat_p318233_uint1 x154; - uint64_t x155; - fiat_p318233_uint1 x156; - uint64_t x157; - fiat_p318233_uint1 x158; - uint64_t x159; - fiat_p318233_uint1 x160; - uint64_t x161; - fiat_p318233_uint1 x162; - uint64_t x163; - fiat_p318233_uint1 x164; - uint64_t x165; - fiat_p318233_uint1 x166; - uint64_t x167; - fiat_p318233_uint1 x168; - uint64_t x169; - fiat_p318233_uint1 x170; - uint64_t x171; - fiat_p318233_uint1 x172; - uint64_t x173; - fiat_p318233_uint1 x174; - uint64_t x175; - fiat_p318233_uint1 x176; - uint64_t x177; - uint64_t x178; - uint64_t x179; - uint64_t x180; - uint64_t x181; - uint64_t x182; - uint64_t x183; - uint64_t x184; - uint64_t x185; - uint64_t x186; - uint64_t x187; - uint64_t x188; - uint64_t x189; - uint64_t x190; - uint64_t x191; - uint64_t x192; - uint64_t x193; - fiat_p318233_uint1 x194; - uint64_t x195; - fiat_p318233_uint1 x196; - uint64_t x197; - fiat_p318233_uint1 x198; - uint64_t x199; - fiat_p318233_uint1 x200; - uint64_t x201; - fiat_p318233_uint1 x202; - uint64_t x203; - fiat_p318233_uint1 x204; - uint64_t x205; - fiat_p318233_uint1 x206; - uint64_t x207; - fiat_p318233_uint1 x208; - uint64_t x209; - fiat_p318233_uint1 x210; - uint64_t x211; - fiat_p318233_uint1 x212; - uint64_t x213; - fiat_p318233_uint1 x214; - uint64_t x215; - fiat_p318233_uint1 x216; - uint64_t x217; - fiat_p318233_uint1 x218; - uint64_t x219; - fiat_p318233_uint1 x220; - uint64_t x221; - fiat_p318233_uint1 x222; - uint64_t x223; - uint64_t x224; - uint64_t x225; - uint64_t x226; - uint64_t x227; - uint64_t x228; - uint64_t x229; - uint64_t x230; - uint64_t x231; - uint64_t x232; - uint64_t x233; - uint64_t x234; - uint64_t x235; - uint64_t x236; - uint64_t x237; - uint64_t x238; - uint64_t x239; - fiat_p318233_uint1 x240; - uint64_t x241; - fiat_p318233_uint1 x242; - uint64_t x243; - fiat_p318233_uint1 x244; - uint64_t x245; - fiat_p318233_uint1 x246; - uint64_t x247; - fiat_p318233_uint1 x248; - uint64_t x249; - fiat_p318233_uint1 x250; - uint64_t x251; - fiat_p318233_uint1 x252; - uint64_t x253; - fiat_p318233_uint1 x254; - uint64_t x255; - fiat_p318233_uint1 x256; - uint64_t x257; - fiat_p318233_uint1 x258; - uint64_t x259; - fiat_p318233_uint1 x260; - uint64_t x261; - fiat_p318233_uint1 x262; - uint64_t x263; - fiat_p318233_uint1 x264; - uint64_t x265; - fiat_p318233_uint1 x266; - uint64_t x267; - fiat_p318233_uint1 x268; - uint64_t x269; - uint64_t x270; - uint64_t x271; - uint64_t x272; - uint64_t x273; - uint64_t x274; - uint64_t x275; - uint64_t x276; - uint64_t x277; - uint64_t x278; - uint64_t x279; - uint64_t x280; - uint64_t x281; - uint64_t x282; - uint64_t x283; - uint64_t x284; - uint64_t x285; - fiat_p318233_uint1 x286; - uint64_t x287; - fiat_p318233_uint1 x288; - uint64_t x289; - fiat_p318233_uint1 x290; - uint64_t x291; - fiat_p318233_uint1 x292; - uint64_t x293; - fiat_p318233_uint1 x294; - uint64_t x295; - fiat_p318233_uint1 x296; - uint64_t x297; - fiat_p318233_uint1 x298; - uint64_t x299; - fiat_p318233_uint1 x300; - uint64_t x301; - fiat_p318233_uint1 x302; - uint64_t x303; - fiat_p318233_uint1 x304; - uint64_t x305; - fiat_p318233_uint1 x306; - uint64_t x307; - fiat_p318233_uint1 x308; - uint64_t x309; - fiat_p318233_uint1 x310; - uint64_t x311; - fiat_p318233_uint1 x312; - uint64_t x313; - fiat_p318233_uint1 x314; - uint64_t x315; - uint64_t x316; - uint64_t x317; - uint64_t x318; - uint64_t x319; - uint64_t x320; - uint64_t x321; - uint64_t x322; - uint64_t x323; - uint64_t x324; - uint64_t x325; - uint64_t x326; - uint64_t x327; - uint64_t x328; - uint64_t x329; - uint64_t x330; - uint64_t x331; - fiat_p318233_uint1 x332; - uint64_t x333; - fiat_p318233_uint1 x334; - uint64_t x335; - fiat_p318233_uint1 x336; - uint64_t x337; - fiat_p318233_uint1 x338; - uint64_t x339; - fiat_p318233_uint1 x340; - uint64_t x341; - fiat_p318233_uint1 x342; - uint64_t x343; - fiat_p318233_uint1 x344; - uint64_t x345; - fiat_p318233_uint1 x346; - uint64_t x347; - fiat_p318233_uint1 x348; - uint64_t x349; - fiat_p318233_uint1 x350; - uint64_t x351; - fiat_p318233_uint1 x352; - uint64_t x353; - fiat_p318233_uint1 x354; - uint64_t x355; - fiat_p318233_uint1 x356; - uint64_t x357; - fiat_p318233_uint1 x358; - uint64_t x359; - fiat_p318233_uint1 x360; - uint64_t x361; - uint64_t x362; - uint64_t x363; - uint64_t x364; - uint64_t x365; - uint64_t x366; - uint64_t x367; - uint64_t x368; - uint64_t x369; - uint64_t x370; - uint64_t x371; - uint64_t x372; - uint64_t x373; - uint64_t x374; - uint64_t x375; - uint64_t x376; - uint64_t x377; - fiat_p318233_uint1 x378; - uint64_t x379; - fiat_p318233_uint1 x380; - uint64_t x381; - fiat_p318233_uint1 x382; - uint64_t x383; - fiat_p318233_uint1 x384; - uint64_t x385; - fiat_p318233_uint1 x386; - uint64_t x387; - fiat_p318233_uint1 x388; - uint64_t x389; - fiat_p318233_uint1 x390; - uint64_t x391; - fiat_p318233_uint1 x392; - uint64_t x393; - fiat_p318233_uint1 x394; - uint64_t x395; - fiat_p318233_uint1 x396; - uint64_t x397; - fiat_p318233_uint1 x398; - uint64_t x399; - fiat_p318233_uint1 x400; - uint64_t x401; - fiat_p318233_uint1 x402; - uint64_t x403; - fiat_p318233_uint1 x404; - uint64_t x405; - fiat_p318233_uint1 x406; - uint64_t x407; - uint64_t x408; - uint64_t x409; - uint64_t x410; - uint64_t x411; - uint64_t x412; - uint64_t x413; - uint64_t x414; - uint64_t x415; - uint64_t x416; - uint64_t x417; - uint64_t x418; - uint64_t x419; - uint64_t x420; - uint64_t x421; - uint64_t x422; - uint64_t x423; - fiat_p318233_uint1 x424; - uint64_t x425; - fiat_p318233_uint1 x426; - uint64_t x427; - fiat_p318233_uint1 x428; - uint64_t x429; - fiat_p318233_uint1 x430; - uint64_t x431; - fiat_p318233_uint1 x432; - uint64_t x433; - fiat_p318233_uint1 x434; - uint64_t x435; - fiat_p318233_uint1 x436; - uint64_t x437; - fiat_p318233_uint1 x438; - uint64_t x439; - fiat_p318233_uint1 x440; - uint64_t x441; - fiat_p318233_uint1 x442; - uint64_t x443; - fiat_p318233_uint1 x444; - uint64_t x445; - fiat_p318233_uint1 x446; - uint64_t x447; - fiat_p318233_uint1 x448; - uint64_t x449; - fiat_p318233_uint1 x450; - uint64_t x451; - fiat_p318233_uint1 x452; - uint64_t x453; - uint64_t x454; - uint64_t x455; - uint64_t x456; - uint64_t x457; - uint64_t x458; - uint64_t x459; - uint64_t x460; - uint64_t x461; - uint64_t x462; - uint64_t x463; - uint64_t x464; - uint64_t x465; - uint64_t x466; - uint64_t x467; - uint64_t x468; - uint64_t x469; - fiat_p318233_uint1 x470; - uint64_t x471; - fiat_p318233_uint1 x472; - uint64_t x473; - fiat_p318233_uint1 x474; - uint64_t x475; - fiat_p318233_uint1 x476; - uint64_t x477; - fiat_p318233_uint1 x478; - uint64_t x479; - fiat_p318233_uint1 x480; - uint64_t x481; - fiat_p318233_uint1 x482; - uint64_t x483; - fiat_p318233_uint1 x484; - uint64_t x485; - fiat_p318233_uint1 x486; - uint64_t x487; - fiat_p318233_uint1 x488; - uint64_t x489; - fiat_p318233_uint1 x490; - uint64_t x491; - fiat_p318233_uint1 x492; - uint64_t x493; - fiat_p318233_uint1 x494; - uint64_t x495; - fiat_p318233_uint1 x496; - uint64_t x497; - fiat_p318233_uint1 x498; - uint64_t x499; - uint64_t x500; - uint64_t x501; - uint64_t x502; - uint64_t x503; - uint64_t x504; - uint64_t x505; - uint64_t x506; - uint64_t x507; - uint64_t x508; - uint64_t x509; - uint64_t x510; - uint64_t x511; - uint64_t x512; - uint64_t x513; - uint64_t x514; - uint64_t x515; - fiat_p318233_uint1 x516; - uint64_t x517; - fiat_p318233_uint1 x518; - uint64_t x519; - fiat_p318233_uint1 x520; - uint64_t x521; - fiat_p318233_uint1 x522; - uint64_t x523; - fiat_p318233_uint1 x524; - uint64_t x525; - fiat_p318233_uint1 x526; - uint64_t x527; - fiat_p318233_uint1 x528; - uint64_t x529; - fiat_p318233_uint1 x530; - uint64_t x531; - fiat_p318233_uint1 x532; - uint64_t x533; - fiat_p318233_uint1 x534; - uint64_t x535; - fiat_p318233_uint1 x536; - uint64_t x537; - fiat_p318233_uint1 x538; - uint64_t x539; - fiat_p318233_uint1 x540; - uint64_t x541; - fiat_p318233_uint1 x542; - uint64_t x543; - fiat_p318233_uint1 x544; - uint64_t x545; - uint64_t x546; - uint64_t x547; - uint64_t x548; - uint64_t x549; - uint64_t x550; - uint64_t x551; - uint64_t x552; - uint64_t x553; - uint64_t x554; - uint64_t x555; - uint64_t x556; - uint64_t x557; - uint64_t x558; - uint64_t x559; - uint64_t x560; - uint64_t x561; - fiat_p318233_uint1 x562; - uint64_t x563; - fiat_p318233_uint1 x564; - uint64_t x565; - fiat_p318233_uint1 x566; - uint64_t x567; - fiat_p318233_uint1 x568; - uint64_t x569; - fiat_p318233_uint1 x570; - uint64_t x571; - fiat_p318233_uint1 x572; - uint64_t x573; - fiat_p318233_uint1 x574; - uint64_t x575; - fiat_p318233_uint1 x576; - uint64_t x577; - fiat_p318233_uint1 x578; - uint64_t x579; - fiat_p318233_uint1 x580; - uint64_t x581; - fiat_p318233_uint1 x582; - uint64_t x583; - fiat_p318233_uint1 x584; - uint64_t x585; - fiat_p318233_uint1 x586; - uint64_t x587; - fiat_p318233_uint1 x588; - uint64_t x589; - fiat_p318233_uint1 x590; - uint64_t x591; - uint64_t x592; - uint64_t x593; - uint64_t x594; - uint64_t x595; - uint64_t x596; - uint64_t x597; - uint64_t x598; - uint64_t x599; - uint64_t x600; - uint64_t x601; - uint64_t x602; - uint64_t x603; - uint64_t x604; - uint64_t x605; - uint64_t x606; - uint64_t x607; - fiat_p318233_uint1 x608; - uint64_t x609; - fiat_p318233_uint1 x610; - uint64_t x611; - fiat_p318233_uint1 x612; - uint64_t x613; - fiat_p318233_uint1 x614; - uint64_t x615; - fiat_p318233_uint1 x616; - uint64_t x617; - fiat_p318233_uint1 x618; - uint64_t x619; - fiat_p318233_uint1 x620; - uint64_t x621; - fiat_p318233_uint1 x622; - uint64_t x623; - fiat_p318233_uint1 x624; - uint64_t x625; - fiat_p318233_uint1 x626; - uint64_t x627; - fiat_p318233_uint1 x628; - uint64_t x629; - fiat_p318233_uint1 x630; - uint64_t x631; - fiat_p318233_uint1 x632; - uint64_t x633; - fiat_p318233_uint1 x634; - uint64_t x635; - fiat_p318233_uint1 x636; - uint64_t x637; - uint64_t x638; - uint64_t x639; - uint64_t x640; - uint64_t x641; - uint64_t x642; - uint64_t x643; - uint64_t x644; - uint64_t x645; - uint64_t x646; - uint64_t x647; - uint64_t x648; - uint64_t x649; - uint64_t x650; - uint64_t x651; - uint64_t x652; - uint64_t x653; - fiat_p318233_uint1 x654; - uint64_t x655; - fiat_p318233_uint1 x656; - uint64_t x657; - fiat_p318233_uint1 x658; - uint64_t x659; - fiat_p318233_uint1 x660; - uint64_t x661; - fiat_p318233_uint1 x662; - uint64_t x663; - fiat_p318233_uint1 x664; - uint64_t x665; - fiat_p318233_uint1 x666; - uint64_t x667; - fiat_p318233_uint1 x668; - uint64_t x669; - fiat_p318233_uint1 x670; - uint64_t x671; - fiat_p318233_uint1 x672; - uint64_t x673; - fiat_p318233_uint1 x674; - uint64_t x675; - fiat_p318233_uint1 x676; - uint64_t x677; - fiat_p318233_uint1 x678; - uint64_t x679; - fiat_p318233_uint1 x680; - uint64_t x681; - fiat_p318233_uint1 x682; - uint64_t x683; - uint64_t x684; - uint64_t x685; - uint64_t x686; - uint64_t x687; - uint64_t x688; - uint64_t x689; - uint64_t x690; - uint64_t x691; - uint64_t x692; - uint64_t x693; - uint64_t x694; - uint64_t x695; - uint64_t x696; - uint64_t x697; - uint64_t x698; - uint64_t x699; - fiat_p318233_uint1 x700; - uint64_t x701; - fiat_p318233_uint1 x702; - uint64_t x703; - fiat_p318233_uint1 x704; - uint64_t x705; - fiat_p318233_uint1 x706; - uint64_t x707; - fiat_p318233_uint1 x708; - uint64_t x709; - fiat_p318233_uint1 x710; - uint64_t x711; - fiat_p318233_uint1 x712; - uint64_t x713; - fiat_p318233_uint1 x714; - uint64_t x715; - fiat_p318233_uint1 x716; - uint64_t x717; - fiat_p318233_uint1 x718; - uint64_t x719; - fiat_p318233_uint1 x720; - uint64_t x721; - fiat_p318233_uint1 x722; - uint64_t x723; - fiat_p318233_uint1 x724; - uint64_t x725; - fiat_p318233_uint1 x726; - uint64_t x727; - fiat_p318233_uint1 x728; - uint64_t x729; - uint64_t x730; - fiat_p318233_uint1 x731; - uint64_t x732; - fiat_p318233_uint1 x733; - uint64_t x734; - fiat_p318233_uint1 x735; - uint64_t x736; - fiat_p318233_uint1 x737; - uint64_t x738; - fiat_p318233_uint1 x739; - uint64_t x740; - fiat_p318233_uint1 x741; - uint64_t x742; - fiat_p318233_uint1 x743; - uint64_t x744; - fiat_p318233_uint1 x745; - uint64_t x746; - fiat_p318233_uint1 x747; - uint64_t x748; - uint64_t x749; - uint64_t x750; - uint64_t x751; - uint64_t x752; - uint64_t x753; - uint64_t x754; - uint64_t x755; - x1 = (arg1[1]); - x2 = (arg1[2]); - x3 = (arg1[3]); - x4 = (arg1[4]); - x5 = (arg1[5]); - x6 = (arg1[6]); - x7 = (arg1[7]); - x8 = (arg1[0]); - fiat_p318233_mulx_u64(&x9, &x10, x8, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x11, &x12, x8, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x13, &x14, x8, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x15, &x16, x8, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x17, &x18, x8, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x19, &x20, x8, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x21, &x22, x8, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x23, &x24, x8, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x25, &x26, 0x0, x24, x21); - fiat_p318233_addcarryx_u64(&x27, &x28, x26, x22, x19); - fiat_p318233_addcarryx_u64(&x29, &x30, x28, x20, x17); - fiat_p318233_addcarryx_u64(&x31, &x32, x30, x18, x15); - fiat_p318233_addcarryx_u64(&x33, &x34, x32, x16, x13); - fiat_p318233_addcarryx_u64(&x35, &x36, x34, x14, x11); - fiat_p318233_addcarryx_u64(&x37, &x38, x36, x12, x9); - fiat_p318233_mulx_u64(&x39, &x40, x23, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x41, &x42, x23, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x43, &x44, x23, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x45, &x46, x23, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x47, &x48, x23, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x49, &x50, x23, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x51, &x52, x23, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x53, &x54, x23, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x55, &x56, 0x0, x54, x51); - fiat_p318233_addcarryx_u64(&x57, &x58, x56, x52, x49); - fiat_p318233_addcarryx_u64(&x59, &x60, x58, x50, x47); - fiat_p318233_addcarryx_u64(&x61, &x62, x60, x48, x45); - fiat_p318233_addcarryx_u64(&x63, &x64, x62, x46, x43); - fiat_p318233_addcarryx_u64(&x65, &x66, x64, x44, x41); - fiat_p318233_addcarryx_u64(&x67, &x68, x66, x42, x39); - fiat_p318233_addcarryx_u64(&x69, &x70, 0x0, x23, x53); - fiat_p318233_addcarryx_u64(&x71, &x72, x70, x25, x55); - fiat_p318233_addcarryx_u64(&x73, &x74, x72, x27, x57); - fiat_p318233_addcarryx_u64(&x75, &x76, x74, x29, x59); - fiat_p318233_addcarryx_u64(&x77, &x78, x76, x31, x61); - fiat_p318233_addcarryx_u64(&x79, &x80, x78, x33, x63); - fiat_p318233_addcarryx_u64(&x81, &x82, x80, x35, x65); - fiat_p318233_addcarryx_u64(&x83, &x84, x82, x37, x67); - fiat_p318233_mulx_u64(&x85, &x86, x1, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x87, &x88, x1, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x89, &x90, x1, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x91, &x92, x1, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x93, &x94, x1, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x95, &x96, x1, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x97, &x98, x1, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x99, &x100, x1, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x101, &x102, 0x0, x100, x97); - fiat_p318233_addcarryx_u64(&x103, &x104, x102, x98, x95); - fiat_p318233_addcarryx_u64(&x105, &x106, x104, x96, x93); - fiat_p318233_addcarryx_u64(&x107, &x108, x106, x94, x91); - fiat_p318233_addcarryx_u64(&x109, &x110, x108, x92, x89); - fiat_p318233_addcarryx_u64(&x111, &x112, x110, x90, x87); - fiat_p318233_addcarryx_u64(&x113, &x114, x112, x88, x85); - fiat_p318233_addcarryx_u64(&x115, &x116, 0x0, x71, x99); - fiat_p318233_addcarryx_u64(&x117, &x118, x116, x73, x101); - fiat_p318233_addcarryx_u64(&x119, &x120, x118, x75, x103); - fiat_p318233_addcarryx_u64(&x121, &x122, x120, x77, x105); - fiat_p318233_addcarryx_u64(&x123, &x124, x122, x79, x107); - fiat_p318233_addcarryx_u64(&x125, &x126, x124, x81, x109); - fiat_p318233_addcarryx_u64(&x127, &x128, x126, x83, x111); - fiat_p318233_addcarryx_u64(&x129, &x130, x128, ((x84 + (x38 + x10)) + (x68 + x40)), x113); - fiat_p318233_mulx_u64(&x131, &x132, x115, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x133, &x134, x115, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x135, &x136, x115, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x137, &x138, x115, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x139, &x140, x115, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x141, &x142, x115, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x143, &x144, x115, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x145, &x146, x115, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x147, &x148, 0x0, x146, x143); - fiat_p318233_addcarryx_u64(&x149, &x150, x148, x144, x141); - fiat_p318233_addcarryx_u64(&x151, &x152, x150, x142, x139); - fiat_p318233_addcarryx_u64(&x153, &x154, x152, x140, x137); - fiat_p318233_addcarryx_u64(&x155, &x156, x154, x138, x135); - fiat_p318233_addcarryx_u64(&x157, &x158, x156, x136, x133); - fiat_p318233_addcarryx_u64(&x159, &x160, x158, x134, x131); - fiat_p318233_addcarryx_u64(&x161, &x162, 0x0, x115, x145); - fiat_p318233_addcarryx_u64(&x163, &x164, x162, x117, x147); - fiat_p318233_addcarryx_u64(&x165, &x166, x164, x119, x149); - fiat_p318233_addcarryx_u64(&x167, &x168, x166, x121, x151); - fiat_p318233_addcarryx_u64(&x169, &x170, x168, x123, x153); - fiat_p318233_addcarryx_u64(&x171, &x172, x170, x125, x155); - fiat_p318233_addcarryx_u64(&x173, &x174, x172, x127, x157); - fiat_p318233_addcarryx_u64(&x175, &x176, x174, x129, x159); - fiat_p318233_mulx_u64(&x177, &x178, x2, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x179, &x180, x2, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x181, &x182, x2, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x183, &x184, x2, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x185, &x186, x2, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x187, &x188, x2, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x189, &x190, x2, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x191, &x192, x2, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x193, &x194, 0x0, x192, x189); - fiat_p318233_addcarryx_u64(&x195, &x196, x194, x190, x187); - fiat_p318233_addcarryx_u64(&x197, &x198, x196, x188, x185); - fiat_p318233_addcarryx_u64(&x199, &x200, x198, x186, x183); - fiat_p318233_addcarryx_u64(&x201, &x202, x200, x184, x181); - fiat_p318233_addcarryx_u64(&x203, &x204, x202, x182, x179); - fiat_p318233_addcarryx_u64(&x205, &x206, x204, x180, x177); - fiat_p318233_addcarryx_u64(&x207, &x208, 0x0, x163, x191); - fiat_p318233_addcarryx_u64(&x209, &x210, x208, x165, x193); - fiat_p318233_addcarryx_u64(&x211, &x212, x210, x167, x195); - fiat_p318233_addcarryx_u64(&x213, &x214, x212, x169, x197); - fiat_p318233_addcarryx_u64(&x215, &x216, x214, x171, x199); - fiat_p318233_addcarryx_u64(&x217, &x218, x216, x173, x201); - fiat_p318233_addcarryx_u64(&x219, &x220, x218, x175, x203); - fiat_p318233_addcarryx_u64(&x221, &x222, x220, ((x176 + (x130 + (x114 + x86))) + (x160 + x132)), x205); - fiat_p318233_mulx_u64(&x223, &x224, x207, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x225, &x226, x207, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x227, &x228, x207, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x229, &x230, x207, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x231, &x232, x207, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x233, &x234, x207, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x235, &x236, x207, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x237, &x238, x207, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x239, &x240, 0x0, x238, x235); - fiat_p318233_addcarryx_u64(&x241, &x242, x240, x236, x233); - fiat_p318233_addcarryx_u64(&x243, &x244, x242, x234, x231); - fiat_p318233_addcarryx_u64(&x245, &x246, x244, x232, x229); - fiat_p318233_addcarryx_u64(&x247, &x248, x246, x230, x227); - fiat_p318233_addcarryx_u64(&x249, &x250, x248, x228, x225); - fiat_p318233_addcarryx_u64(&x251, &x252, x250, x226, x223); - fiat_p318233_addcarryx_u64(&x253, &x254, 0x0, x207, x237); - fiat_p318233_addcarryx_u64(&x255, &x256, x254, x209, x239); - fiat_p318233_addcarryx_u64(&x257, &x258, x256, x211, x241); - fiat_p318233_addcarryx_u64(&x259, &x260, x258, x213, x243); - fiat_p318233_addcarryx_u64(&x261, &x262, x260, x215, x245); - fiat_p318233_addcarryx_u64(&x263, &x264, x262, x217, x247); - fiat_p318233_addcarryx_u64(&x265, &x266, x264, x219, x249); - fiat_p318233_addcarryx_u64(&x267, &x268, x266, x221, x251); - fiat_p318233_mulx_u64(&x269, &x270, x3, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x271, &x272, x3, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x273, &x274, x3, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x275, &x276, x3, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x277, &x278, x3, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x279, &x280, x3, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x281, &x282, x3, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x283, &x284, x3, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x285, &x286, 0x0, x284, x281); - fiat_p318233_addcarryx_u64(&x287, &x288, x286, x282, x279); - fiat_p318233_addcarryx_u64(&x289, &x290, x288, x280, x277); - fiat_p318233_addcarryx_u64(&x291, &x292, x290, x278, x275); - fiat_p318233_addcarryx_u64(&x293, &x294, x292, x276, x273); - fiat_p318233_addcarryx_u64(&x295, &x296, x294, x274, x271); - fiat_p318233_addcarryx_u64(&x297, &x298, x296, x272, x269); - fiat_p318233_addcarryx_u64(&x299, &x300, 0x0, x255, x283); - fiat_p318233_addcarryx_u64(&x301, &x302, x300, x257, x285); - fiat_p318233_addcarryx_u64(&x303, &x304, x302, x259, x287); - fiat_p318233_addcarryx_u64(&x305, &x306, x304, x261, x289); - fiat_p318233_addcarryx_u64(&x307, &x308, x306, x263, x291); - fiat_p318233_addcarryx_u64(&x309, &x310, x308, x265, x293); - fiat_p318233_addcarryx_u64(&x311, &x312, x310, x267, x295); - fiat_p318233_addcarryx_u64(&x313, &x314, x312, ((x268 + (x222 + (x206 + x178))) + (x252 + x224)), x297); - fiat_p318233_mulx_u64(&x315, &x316, x299, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x317, &x318, x299, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x319, &x320, x299, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x321, &x322, x299, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x323, &x324, x299, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x325, &x326, x299, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x327, &x328, x299, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x329, &x330, x299, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x331, &x332, 0x0, x330, x327); - fiat_p318233_addcarryx_u64(&x333, &x334, x332, x328, x325); - fiat_p318233_addcarryx_u64(&x335, &x336, x334, x326, x323); - fiat_p318233_addcarryx_u64(&x337, &x338, x336, x324, x321); - fiat_p318233_addcarryx_u64(&x339, &x340, x338, x322, x319); - fiat_p318233_addcarryx_u64(&x341, &x342, x340, x320, x317); - fiat_p318233_addcarryx_u64(&x343, &x344, x342, x318, x315); - fiat_p318233_addcarryx_u64(&x345, &x346, 0x0, x299, x329); - fiat_p318233_addcarryx_u64(&x347, &x348, x346, x301, x331); - fiat_p318233_addcarryx_u64(&x349, &x350, x348, x303, x333); - fiat_p318233_addcarryx_u64(&x351, &x352, x350, x305, x335); - fiat_p318233_addcarryx_u64(&x353, &x354, x352, x307, x337); - fiat_p318233_addcarryx_u64(&x355, &x356, x354, x309, x339); - fiat_p318233_addcarryx_u64(&x357, &x358, x356, x311, x341); - fiat_p318233_addcarryx_u64(&x359, &x360, x358, x313, x343); - fiat_p318233_mulx_u64(&x361, &x362, x4, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x363, &x364, x4, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x365, &x366, x4, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x367, &x368, x4, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x369, &x370, x4, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x371, &x372, x4, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x373, &x374, x4, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x375, &x376, x4, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x377, &x378, 0x0, x376, x373); - fiat_p318233_addcarryx_u64(&x379, &x380, x378, x374, x371); - fiat_p318233_addcarryx_u64(&x381, &x382, x380, x372, x369); - fiat_p318233_addcarryx_u64(&x383, &x384, x382, x370, x367); - fiat_p318233_addcarryx_u64(&x385, &x386, x384, x368, x365); - fiat_p318233_addcarryx_u64(&x387, &x388, x386, x366, x363); - fiat_p318233_addcarryx_u64(&x389, &x390, x388, x364, x361); - fiat_p318233_addcarryx_u64(&x391, &x392, 0x0, x347, x375); - fiat_p318233_addcarryx_u64(&x393, &x394, x392, x349, x377); - fiat_p318233_addcarryx_u64(&x395, &x396, x394, x351, x379); - fiat_p318233_addcarryx_u64(&x397, &x398, x396, x353, x381); - fiat_p318233_addcarryx_u64(&x399, &x400, x398, x355, x383); - fiat_p318233_addcarryx_u64(&x401, &x402, x400, x357, x385); - fiat_p318233_addcarryx_u64(&x403, &x404, x402, x359, x387); - fiat_p318233_addcarryx_u64(&x405, &x406, x404, ((x360 + (x314 + (x298 + x270))) + (x344 + x316)), x389); - fiat_p318233_mulx_u64(&x407, &x408, x391, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x409, &x410, x391, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x411, &x412, x391, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x413, &x414, x391, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x415, &x416, x391, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x417, &x418, x391, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x419, &x420, x391, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x421, &x422, x391, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x423, &x424, 0x0, x422, x419); - fiat_p318233_addcarryx_u64(&x425, &x426, x424, x420, x417); - fiat_p318233_addcarryx_u64(&x427, &x428, x426, x418, x415); - fiat_p318233_addcarryx_u64(&x429, &x430, x428, x416, x413); - fiat_p318233_addcarryx_u64(&x431, &x432, x430, x414, x411); - fiat_p318233_addcarryx_u64(&x433, &x434, x432, x412, x409); - fiat_p318233_addcarryx_u64(&x435, &x436, x434, x410, x407); - fiat_p318233_addcarryx_u64(&x437, &x438, 0x0, x391, x421); - fiat_p318233_addcarryx_u64(&x439, &x440, x438, x393, x423); - fiat_p318233_addcarryx_u64(&x441, &x442, x440, x395, x425); - fiat_p318233_addcarryx_u64(&x443, &x444, x442, x397, x427); - fiat_p318233_addcarryx_u64(&x445, &x446, x444, x399, x429); - fiat_p318233_addcarryx_u64(&x447, &x448, x446, x401, x431); - fiat_p318233_addcarryx_u64(&x449, &x450, x448, x403, x433); - fiat_p318233_addcarryx_u64(&x451, &x452, x450, x405, x435); - fiat_p318233_mulx_u64(&x453, &x454, x5, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x455, &x456, x5, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x457, &x458, x5, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x459, &x460, x5, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x461, &x462, x5, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x463, &x464, x5, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x465, &x466, x5, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x467, &x468, x5, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x469, &x470, 0x0, x468, x465); - fiat_p318233_addcarryx_u64(&x471, &x472, x470, x466, x463); - fiat_p318233_addcarryx_u64(&x473, &x474, x472, x464, x461); - fiat_p318233_addcarryx_u64(&x475, &x476, x474, x462, x459); - fiat_p318233_addcarryx_u64(&x477, &x478, x476, x460, x457); - fiat_p318233_addcarryx_u64(&x479, &x480, x478, x458, x455); - fiat_p318233_addcarryx_u64(&x481, &x482, x480, x456, x453); - fiat_p318233_addcarryx_u64(&x483, &x484, 0x0, x439, x467); - fiat_p318233_addcarryx_u64(&x485, &x486, x484, x441, x469); - fiat_p318233_addcarryx_u64(&x487, &x488, x486, x443, x471); - fiat_p318233_addcarryx_u64(&x489, &x490, x488, x445, x473); - fiat_p318233_addcarryx_u64(&x491, &x492, x490, x447, x475); - fiat_p318233_addcarryx_u64(&x493, &x494, x492, x449, x477); - fiat_p318233_addcarryx_u64(&x495, &x496, x494, x451, x479); - fiat_p318233_addcarryx_u64(&x497, &x498, x496, ((x452 + (x406 + (x390 + x362))) + (x436 + x408)), x481); - fiat_p318233_mulx_u64(&x499, &x500, x483, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x501, &x502, x483, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x503, &x504, x483, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x505, &x506, x483, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x507, &x508, x483, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x509, &x510, x483, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x511, &x512, x483, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x513, &x514, x483, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x515, &x516, 0x0, x514, x511); - fiat_p318233_addcarryx_u64(&x517, &x518, x516, x512, x509); - fiat_p318233_addcarryx_u64(&x519, &x520, x518, x510, x507); - fiat_p318233_addcarryx_u64(&x521, &x522, x520, x508, x505); - fiat_p318233_addcarryx_u64(&x523, &x524, x522, x506, x503); - fiat_p318233_addcarryx_u64(&x525, &x526, x524, x504, x501); - fiat_p318233_addcarryx_u64(&x527, &x528, x526, x502, x499); - fiat_p318233_addcarryx_u64(&x529, &x530, 0x0, x483, x513); - fiat_p318233_addcarryx_u64(&x531, &x532, x530, x485, x515); - fiat_p318233_addcarryx_u64(&x533, &x534, x532, x487, x517); - fiat_p318233_addcarryx_u64(&x535, &x536, x534, x489, x519); - fiat_p318233_addcarryx_u64(&x537, &x538, x536, x491, x521); - fiat_p318233_addcarryx_u64(&x539, &x540, x538, x493, x523); - fiat_p318233_addcarryx_u64(&x541, &x542, x540, x495, x525); - fiat_p318233_addcarryx_u64(&x543, &x544, x542, x497, x527); - fiat_p318233_mulx_u64(&x545, &x546, x6, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x547, &x548, x6, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x549, &x550, x6, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x551, &x552, x6, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x553, &x554, x6, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x555, &x556, x6, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x557, &x558, x6, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x559, &x560, x6, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x561, &x562, 0x0, x560, x557); - fiat_p318233_addcarryx_u64(&x563, &x564, x562, x558, x555); - fiat_p318233_addcarryx_u64(&x565, &x566, x564, x556, x553); - fiat_p318233_addcarryx_u64(&x567, &x568, x566, x554, x551); - fiat_p318233_addcarryx_u64(&x569, &x570, x568, x552, x549); - fiat_p318233_addcarryx_u64(&x571, &x572, x570, x550, x547); - fiat_p318233_addcarryx_u64(&x573, &x574, x572, x548, x545); - fiat_p318233_addcarryx_u64(&x575, &x576, 0x0, x531, x559); - fiat_p318233_addcarryx_u64(&x577, &x578, x576, x533, x561); - fiat_p318233_addcarryx_u64(&x579, &x580, x578, x535, x563); - fiat_p318233_addcarryx_u64(&x581, &x582, x580, x537, x565); - fiat_p318233_addcarryx_u64(&x583, &x584, x582, x539, x567); - fiat_p318233_addcarryx_u64(&x585, &x586, x584, x541, x569); - fiat_p318233_addcarryx_u64(&x587, &x588, x586, x543, x571); - fiat_p318233_addcarryx_u64(&x589, &x590, x588, ((x544 + (x498 + (x482 + x454))) + (x528 + x500)), x573); - fiat_p318233_mulx_u64(&x591, &x592, x575, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x593, &x594, x575, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x595, &x596, x575, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x597, &x598, x575, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x599, &x600, x575, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x601, &x602, x575, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x603, &x604, x575, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x605, &x606, x575, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x607, &x608, 0x0, x606, x603); - fiat_p318233_addcarryx_u64(&x609, &x610, x608, x604, x601); - fiat_p318233_addcarryx_u64(&x611, &x612, x610, x602, x599); - fiat_p318233_addcarryx_u64(&x613, &x614, x612, x600, x597); - fiat_p318233_addcarryx_u64(&x615, &x616, x614, x598, x595); - fiat_p318233_addcarryx_u64(&x617, &x618, x616, x596, x593); - fiat_p318233_addcarryx_u64(&x619, &x620, x618, x594, x591); - fiat_p318233_addcarryx_u64(&x621, &x622, 0x0, x575, x605); - fiat_p318233_addcarryx_u64(&x623, &x624, x622, x577, x607); - fiat_p318233_addcarryx_u64(&x625, &x626, x624, x579, x609); - fiat_p318233_addcarryx_u64(&x627, &x628, x626, x581, x611); - fiat_p318233_addcarryx_u64(&x629, &x630, x628, x583, x613); - fiat_p318233_addcarryx_u64(&x631, &x632, x630, x585, x615); - fiat_p318233_addcarryx_u64(&x633, &x634, x632, x587, x617); - fiat_p318233_addcarryx_u64(&x635, &x636, x634, x589, x619); - fiat_p318233_mulx_u64(&x637, &x638, x7, UINT64_C(0x1691676b8674b8)); - fiat_p318233_mulx_u64(&x639, &x640, x7, UINT64_C(0x2780b5f2daf1003c)); - fiat_p318233_mulx_u64(&x641, &x642, x7, UINT64_C(0x2cc2ea622f9e57c8)); - fiat_p318233_mulx_u64(&x643, &x644, x7, UINT64_C(0x87994b8955d8b8d4)); - fiat_p318233_mulx_u64(&x645, &x646, x7, UINT64_C(0x1adb99ddacaa06ec)); - fiat_p318233_mulx_u64(&x647, &x648, x7, UINT64_C(0x545ac09f2f1b55c8)); - fiat_p318233_mulx_u64(&x649, &x650, x7, UINT64_C(0xcb993b5943e89ea5)); - fiat_p318233_mulx_u64(&x651, &x652, x7, UINT64_C(0x46e4e8a0c7549cbd)); - fiat_p318233_addcarryx_u64(&x653, &x654, 0x0, x652, x649); - fiat_p318233_addcarryx_u64(&x655, &x656, x654, x650, x647); - fiat_p318233_addcarryx_u64(&x657, &x658, x656, x648, x645); - fiat_p318233_addcarryx_u64(&x659, &x660, x658, x646, x643); - fiat_p318233_addcarryx_u64(&x661, &x662, x660, x644, x641); - fiat_p318233_addcarryx_u64(&x663, &x664, x662, x642, x639); - fiat_p318233_addcarryx_u64(&x665, &x666, x664, x640, x637); - fiat_p318233_addcarryx_u64(&x667, &x668, 0x0, x623, x651); - fiat_p318233_addcarryx_u64(&x669, &x670, x668, x625, x653); - fiat_p318233_addcarryx_u64(&x671, &x672, x670, x627, x655); - fiat_p318233_addcarryx_u64(&x673, &x674, x672, x629, x657); - fiat_p318233_addcarryx_u64(&x675, &x676, x674, x631, x659); - fiat_p318233_addcarryx_u64(&x677, &x678, x676, x633, x661); - fiat_p318233_addcarryx_u64(&x679, &x680, x678, x635, x663); - fiat_p318233_addcarryx_u64(&x681, &x682, x680, ((x636 + (x590 + (x574 + x546))) + (x620 + x592)), x665); - fiat_p318233_mulx_u64(&x683, &x684, x667, UINT64_C(0x255946a8869bc6)); - fiat_p318233_mulx_u64(&x685, &x686, x667, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_mulx_u64(&x687, &x688, x667, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_mulx_u64(&x689, &x690, x667, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_mulx_u64(&x691, &x692, x667, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_mulx_u64(&x693, &x694, x667, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_mulx_u64(&x695, &x696, x667, UINT64_C(0xffffffffffffffff)); - fiat_p318233_mulx_u64(&x697, &x698, x667, UINT64_C(0xffffffffffffffff)); - fiat_p318233_addcarryx_u64(&x699, &x700, 0x0, x698, x695); - fiat_p318233_addcarryx_u64(&x701, &x702, x700, x696, x693); - fiat_p318233_addcarryx_u64(&x703, &x704, x702, x694, x691); - fiat_p318233_addcarryx_u64(&x705, &x706, x704, x692, x689); - fiat_p318233_addcarryx_u64(&x707, &x708, x706, x690, x687); - fiat_p318233_addcarryx_u64(&x709, &x710, x708, x688, x685); - fiat_p318233_addcarryx_u64(&x711, &x712, x710, x686, x683); - fiat_p318233_addcarryx_u64(&x713, &x714, 0x0, x667, x697); - fiat_p318233_addcarryx_u64(&x715, &x716, x714, x669, x699); - fiat_p318233_addcarryx_u64(&x717, &x718, x716, x671, x701); - fiat_p318233_addcarryx_u64(&x719, &x720, x718, x673, x703); - fiat_p318233_addcarryx_u64(&x721, &x722, x720, x675, x705); - fiat_p318233_addcarryx_u64(&x723, &x724, x722, x677, x707); - fiat_p318233_addcarryx_u64(&x725, &x726, x724, x679, x709); - fiat_p318233_addcarryx_u64(&x727, &x728, x726, x681, x711); - x729 = ((x728 + (x682 + (x666 + x638))) + (x712 + x684)); - fiat_p318233_subborrowx_u64(&x730, &x731, 0x0, x715, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x732, &x733, x731, x717, UINT64_C(0xffffffffffffffff)); - fiat_p318233_subborrowx_u64(&x734, &x735, x733, x719, UINT64_C(0x994c68ada6e1ffff)); - fiat_p318233_subborrowx_u64(&x736, &x737, x735, x721, UINT64_C(0xfaf0a29a781974ce)); - fiat_p318233_subborrowx_u64(&x738, &x739, x737, x723, UINT64_C(0xfe3ac5904a0dea65)); - fiat_p318233_subborrowx_u64(&x740, &x741, x739, x725, UINT64_C(0x2bdbe6326507d01)); - fiat_p318233_subborrowx_u64(&x742, &x743, x741, x727, UINT64_C(0x8c15b0036936e792)); - fiat_p318233_subborrowx_u64(&x744, &x745, x743, x729, UINT64_C(0x255946a8869bc6)); - fiat_p318233_subborrowx_u64(&x746, &x747, x745, 0x0, 0x0); - fiat_p318233_cmovznz_u64(&x748, x747, x730, x715); - fiat_p318233_cmovznz_u64(&x749, x747, x732, x717); - fiat_p318233_cmovznz_u64(&x750, x747, x734, x719); - fiat_p318233_cmovznz_u64(&x751, x747, x736, x721); - fiat_p318233_cmovznz_u64(&x752, x747, x738, x723); - fiat_p318233_cmovznz_u64(&x753, x747, x740, x725); - fiat_p318233_cmovznz_u64(&x754, x747, x742, x727); - fiat_p318233_cmovznz_u64(&x755, x747, x744, x729); - out1[0] = x748; - out1[1] = x749; - out1[2] = x750; - out1[3] = x751; - out1[4] = x752; - out1[5] = x753; - out1[6] = x754; - out1[7] = x755; -} - -/* - * The function fiat_p318233_nonzero outputs a single non-zero word if the input is non-zero and zero otherwise. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * out1 = 0 ↔ eval (from_montgomery arg1) mod m = 0 - * - * Input Bounds: - * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -void fiat_p318233_nonzero(uint64_t* out1, const uint64_t arg1[8]) { - uint64_t x1; - x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | ((arg1[3]) | ((arg1[4]) | ((arg1[5]) | ((arg1[6]) | (arg1[7])))))))); - *out1 = x1; -} - -/* - * The function fiat_p318233_selectznz is a multi-limb conditional select. - * - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -void fiat_p318233_selectznz(uint64_t out1[8], fiat_p318233_uint1 arg1, const uint64_t arg2[8], const uint64_t arg3[8]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - fiat_p318233_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0])); - fiat_p318233_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1])); - fiat_p318233_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2])); - fiat_p318233_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3])); - fiat_p318233_cmovznz_u64(&x5, arg1, (arg2[4]), (arg3[4])); - fiat_p318233_cmovznz_u64(&x6, arg1, (arg2[5]), (arg3[5])); - fiat_p318233_cmovznz_u64(&x7, arg1, (arg2[6]), (arg3[6])); - fiat_p318233_cmovznz_u64(&x8, arg1, (arg2[7]), (arg3[7])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; - out1[5] = x6; - out1[6] = x7; - out1[7] = x8; -} - -/* - * The function fiat_p318233_to_bytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order. - * - * Preconditions: - * 0 ≤ eval arg1 < m - * Postconditions: - * out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..62] - * - * Input Bounds: - * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x3fffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x3f]] - */ -void fiat_p318233_to_bytes(uint8_t out1[63], const uint64_t arg1[8]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint64_t x7; - uint64_t x8; - uint8_t x9; - uint64_t x10; - uint8_t x11; - uint64_t x12; - uint8_t x13; - uint64_t x14; - uint8_t x15; - uint64_t x16; - uint8_t x17; - uint64_t x18; - uint8_t x19; - uint64_t x20; - uint8_t x21; - uint8_t x22; - uint8_t x23; - uint64_t x24; - uint8_t x25; - uint64_t x26; - uint8_t x27; - uint64_t x28; - uint8_t x29; - uint64_t x30; - uint8_t x31; - uint64_t x32; - uint8_t x33; - uint64_t x34; - uint8_t x35; - uint8_t x36; - uint8_t x37; - uint64_t x38; - uint8_t x39; - uint64_t x40; - uint8_t x41; - uint64_t x42; - uint8_t x43; - uint64_t x44; - uint8_t x45; - uint64_t x46; - uint8_t x47; - uint64_t x48; - uint8_t x49; - uint8_t x50; - uint8_t x51; - uint64_t x52; - uint8_t x53; - uint64_t x54; - uint8_t x55; - uint64_t x56; - uint8_t x57; - uint64_t x58; - uint8_t x59; - uint64_t x60; - uint8_t x61; - uint64_t x62; - uint8_t x63; - uint8_t x64; - uint8_t x65; - uint64_t x66; - uint8_t x67; - uint64_t x68; - uint8_t x69; - uint64_t x70; - uint8_t x71; - uint64_t x72; - uint8_t x73; - uint64_t x74; - uint8_t x75; - uint64_t x76; - uint8_t x77; - uint8_t x78; - uint8_t x79; - uint64_t x80; - uint8_t x81; - uint64_t x82; - uint8_t x83; - uint64_t x84; - uint8_t x85; - uint64_t x86; - uint8_t x87; - uint64_t x88; - uint8_t x89; - uint64_t x90; - uint8_t x91; - uint8_t x92; - uint8_t x93; - uint64_t x94; - uint8_t x95; - uint64_t x96; - uint8_t x97; - uint64_t x98; - uint8_t x99; - uint64_t x100; - uint8_t x101; - uint64_t x102; - uint8_t x103; - uint64_t x104; - uint8_t x105; - uint8_t x106; - uint8_t x107; - uint64_t x108; - uint8_t x109; - uint64_t x110; - uint8_t x111; - uint64_t x112; - uint8_t x113; - uint64_t x114; - uint8_t x115; - uint64_t x116; - uint8_t x117; - uint8_t x118; - x1 = (arg1[7]); - x2 = (arg1[6]); - x3 = (arg1[5]); - x4 = (arg1[4]); - x5 = (arg1[3]); - x6 = (arg1[2]); - x7 = (arg1[1]); - x8 = (arg1[0]); - x9 = (uint8_t)(x8 & UINT8_C(0xff)); - x10 = (x8 >> 8); - x11 = (uint8_t)(x10 & UINT8_C(0xff)); - x12 = (x10 >> 8); - x13 = (uint8_t)(x12 & UINT8_C(0xff)); - x14 = (x12 >> 8); - x15 = (uint8_t)(x14 & UINT8_C(0xff)); - x16 = (x14 >> 8); - x17 = (uint8_t)(x16 & UINT8_C(0xff)); - x18 = (x16 >> 8); - x19 = (uint8_t)(x18 & UINT8_C(0xff)); - x20 = (x18 >> 8); - x21 = (uint8_t)(x20 & UINT8_C(0xff)); - x22 = (uint8_t)(x20 >> 8); - x23 = (uint8_t)(x7 & UINT8_C(0xff)); - x24 = (x7 >> 8); - x25 = (uint8_t)(x24 & UINT8_C(0xff)); - x26 = (x24 >> 8); - x27 = (uint8_t)(x26 & UINT8_C(0xff)); - x28 = (x26 >> 8); - x29 = (uint8_t)(x28 & UINT8_C(0xff)); - x30 = (x28 >> 8); - x31 = (uint8_t)(x30 & UINT8_C(0xff)); - x32 = (x30 >> 8); - x33 = (uint8_t)(x32 & UINT8_C(0xff)); - x34 = (x32 >> 8); - x35 = (uint8_t)(x34 & UINT8_C(0xff)); - x36 = (uint8_t)(x34 >> 8); - x37 = (uint8_t)(x6 & UINT8_C(0xff)); - x38 = (x6 >> 8); - x39 = (uint8_t)(x38 & UINT8_C(0xff)); - x40 = (x38 >> 8); - x41 = (uint8_t)(x40 & UINT8_C(0xff)); - x42 = (x40 >> 8); - x43 = (uint8_t)(x42 & UINT8_C(0xff)); - x44 = (x42 >> 8); - x45 = (uint8_t)(x44 & UINT8_C(0xff)); - x46 = (x44 >> 8); - x47 = (uint8_t)(x46 & UINT8_C(0xff)); - x48 = (x46 >> 8); - x49 = (uint8_t)(x48 & UINT8_C(0xff)); - x50 = (uint8_t)(x48 >> 8); - x51 = (uint8_t)(x5 & UINT8_C(0xff)); - x52 = (x5 >> 8); - x53 = (uint8_t)(x52 & UINT8_C(0xff)); - x54 = (x52 >> 8); - x55 = (uint8_t)(x54 & UINT8_C(0xff)); - x56 = (x54 >> 8); - x57 = (uint8_t)(x56 & UINT8_C(0xff)); - x58 = (x56 >> 8); - x59 = (uint8_t)(x58 & UINT8_C(0xff)); - x60 = (x58 >> 8); - x61 = (uint8_t)(x60 & UINT8_C(0xff)); - x62 = (x60 >> 8); - x63 = (uint8_t)(x62 & UINT8_C(0xff)); - x64 = (uint8_t)(x62 >> 8); - x65 = (uint8_t)(x4 & UINT8_C(0xff)); - x66 = (x4 >> 8); - x67 = (uint8_t)(x66 & UINT8_C(0xff)); - x68 = (x66 >> 8); - x69 = (uint8_t)(x68 & UINT8_C(0xff)); - x70 = (x68 >> 8); - x71 = (uint8_t)(x70 & UINT8_C(0xff)); - x72 = (x70 >> 8); - x73 = (uint8_t)(x72 & UINT8_C(0xff)); - x74 = (x72 >> 8); - x75 = (uint8_t)(x74 & UINT8_C(0xff)); - x76 = (x74 >> 8); - x77 = (uint8_t)(x76 & UINT8_C(0xff)); - x78 = (uint8_t)(x76 >> 8); - x79 = (uint8_t)(x3 & UINT8_C(0xff)); - x80 = (x3 >> 8); - x81 = (uint8_t)(x80 & UINT8_C(0xff)); - x82 = (x80 >> 8); - x83 = (uint8_t)(x82 & UINT8_C(0xff)); - x84 = (x82 >> 8); - x85 = (uint8_t)(x84 & UINT8_C(0xff)); - x86 = (x84 >> 8); - x87 = (uint8_t)(x86 & UINT8_C(0xff)); - x88 = (x86 >> 8); - x89 = (uint8_t)(x88 & UINT8_C(0xff)); - x90 = (x88 >> 8); - x91 = (uint8_t)(x90 & UINT8_C(0xff)); - x92 = (uint8_t)(x90 >> 8); - x93 = (uint8_t)(x2 & UINT8_C(0xff)); - x94 = (x2 >> 8); - x95 = (uint8_t)(x94 & UINT8_C(0xff)); - x96 = (x94 >> 8); - x97 = (uint8_t)(x96 & UINT8_C(0xff)); - x98 = (x96 >> 8); - x99 = (uint8_t)(x98 & UINT8_C(0xff)); - x100 = (x98 >> 8); - x101 = (uint8_t)(x100 & UINT8_C(0xff)); - x102 = (x100 >> 8); - x103 = (uint8_t)(x102 & UINT8_C(0xff)); - x104 = (x102 >> 8); - x105 = (uint8_t)(x104 & UINT8_C(0xff)); - x106 = (uint8_t)(x104 >> 8); - x107 = (uint8_t)(x1 & UINT8_C(0xff)); - x108 = (x1 >> 8); - x109 = (uint8_t)(x108 & UINT8_C(0xff)); - x110 = (x108 >> 8); - x111 = (uint8_t)(x110 & UINT8_C(0xff)); - x112 = (x110 >> 8); - x113 = (uint8_t)(x112 & UINT8_C(0xff)); - x114 = (x112 >> 8); - x115 = (uint8_t)(x114 & UINT8_C(0xff)); - x116 = (x114 >> 8); - x117 = (uint8_t)(x116 & UINT8_C(0xff)); - x118 = (uint8_t)(x116 >> 8); - out1[0] = x9; - out1[1] = x11; - out1[2] = x13; - out1[3] = x15; - out1[4] = x17; - out1[5] = x19; - out1[6] = x21; - out1[7] = x22; - out1[8] = x23; - out1[9] = x25; - out1[10] = x27; - out1[11] = x29; - out1[12] = x31; - out1[13] = x33; - out1[14] = x35; - out1[15] = x36; - out1[16] = x37; - out1[17] = x39; - out1[18] = x41; - out1[19] = x43; - out1[20] = x45; - out1[21] = x47; - out1[22] = x49; - out1[23] = x50; - out1[24] = x51; - out1[25] = x53; - out1[26] = x55; - out1[27] = x57; - out1[28] = x59; - out1[29] = x61; - out1[30] = x63; - out1[31] = x64; - out1[32] = x65; - out1[33] = x67; - out1[34] = x69; - out1[35] = x71; - out1[36] = x73; - out1[37] = x75; - out1[38] = x77; - out1[39] = x78; - out1[40] = x79; - out1[41] = x81; - out1[42] = x83; - out1[43] = x85; - out1[44] = x87; - out1[45] = x89; - out1[46] = x91; - out1[47] = x92; - out1[48] = x93; - out1[49] = x95; - out1[50] = x97; - out1[51] = x99; - out1[52] = x101; - out1[53] = x103; - out1[54] = x105; - out1[55] = x106; - out1[56] = x107; - out1[57] = x109; - out1[58] = x111; - out1[59] = x113; - out1[60] = x115; - out1[61] = x117; - out1[62] = x118; -} - -/* - * The function fiat_p318233_from_bytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order. - * - * Preconditions: - * 0 ≤ bytes_eval arg1 < m - * Postconditions: - * eval out1 mod m = bytes_eval arg1 mod m - * 0 ≤ eval out1 < m - * - * Input Bounds: - * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x3f]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0x3fffffffffffff]] - */ -void fiat_p318233_from_bytes(uint64_t out1[8], const uint8_t arg1[63]) { - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t x6; - uint8_t x7; - uint64_t x8; - uint64_t x9; - uint64_t x10; - uint64_t x11; - uint64_t x12; - uint64_t x13; - uint64_t x14; - uint8_t x15; - uint64_t x16; - uint64_t x17; - uint64_t x18; - uint64_t x19; - uint64_t x20; - uint64_t x21; - uint64_t x22; - uint8_t x23; - uint64_t x24; - uint64_t x25; - uint64_t x26; - uint64_t x27; - uint64_t x28; - uint64_t x29; - uint64_t x30; - uint8_t x31; - uint64_t x32; - uint64_t x33; - uint64_t x34; - uint64_t x35; - uint64_t x36; - uint64_t x37; - uint64_t x38; - uint8_t x39; - uint64_t x40; - uint64_t x41; - uint64_t x42; - uint64_t x43; - uint64_t x44; - uint64_t x45; - uint64_t x46; - uint8_t x47; - uint64_t x48; - uint64_t x49; - uint64_t x50; - uint64_t x51; - uint64_t x52; - uint64_t x53; - uint64_t x54; - uint8_t x55; - uint64_t x56; - uint64_t x57; - uint64_t x58; - uint64_t x59; - uint64_t x60; - uint64_t x61; - uint64_t x62; - uint8_t x63; - uint64_t x64; - uint64_t x65; - uint64_t x66; - uint64_t x67; - uint64_t x68; - uint64_t x69; - uint64_t x70; - uint64_t x71; - uint64_t x72; - uint64_t x73; - uint64_t x74; - uint64_t x75; - uint64_t x76; - uint64_t x77; - uint64_t x78; - uint64_t x79; - uint64_t x80; - uint64_t x81; - uint64_t x82; - uint64_t x83; - uint64_t x84; - uint64_t x85; - uint64_t x86; - uint64_t x87; - uint64_t x88; - uint64_t x89; - uint64_t x90; - uint64_t x91; - uint64_t x92; - uint64_t x93; - uint64_t x94; - uint64_t x95; - uint64_t x96; - uint64_t x97; - uint64_t x98; - uint64_t x99; - uint64_t x100; - uint64_t x101; - uint64_t x102; - uint64_t x103; - uint64_t x104; - uint64_t x105; - uint64_t x106; - uint64_t x107; - uint64_t x108; - uint64_t x109; - uint64_t x110; - uint64_t x111; - uint64_t x112; - uint64_t x113; - uint64_t x114; - uint64_t x115; - uint64_t x116; - uint64_t x117; - uint64_t x118; - x1 = ((uint64_t)(arg1[62]) << 48); - x2 = ((uint64_t)(arg1[61]) << 40); - x3 = ((uint64_t)(arg1[60]) << 32); - x4 = ((uint64_t)(arg1[59]) << 24); - x5 = ((uint64_t)(arg1[58]) << 16); - x6 = ((uint64_t)(arg1[57]) << 8); - x7 = (arg1[56]); - x8 = ((uint64_t)(arg1[55]) << 56); - x9 = ((uint64_t)(arg1[54]) << 48); - x10 = ((uint64_t)(arg1[53]) << 40); - x11 = ((uint64_t)(arg1[52]) << 32); - x12 = ((uint64_t)(arg1[51]) << 24); - x13 = ((uint64_t)(arg1[50]) << 16); - x14 = ((uint64_t)(arg1[49]) << 8); - x15 = (arg1[48]); - x16 = ((uint64_t)(arg1[47]) << 56); - x17 = ((uint64_t)(arg1[46]) << 48); - x18 = ((uint64_t)(arg1[45]) << 40); - x19 = ((uint64_t)(arg1[44]) << 32); - x20 = ((uint64_t)(arg1[43]) << 24); - x21 = ((uint64_t)(arg1[42]) << 16); - x22 = ((uint64_t)(arg1[41]) << 8); - x23 = (arg1[40]); - x24 = ((uint64_t)(arg1[39]) << 56); - x25 = ((uint64_t)(arg1[38]) << 48); - x26 = ((uint64_t)(arg1[37]) << 40); - x27 = ((uint64_t)(arg1[36]) << 32); - x28 = ((uint64_t)(arg1[35]) << 24); - x29 = ((uint64_t)(arg1[34]) << 16); - x30 = ((uint64_t)(arg1[33]) << 8); - x31 = (arg1[32]); - x32 = ((uint64_t)(arg1[31]) << 56); - x33 = ((uint64_t)(arg1[30]) << 48); - x34 = ((uint64_t)(arg1[29]) << 40); - x35 = ((uint64_t)(arg1[28]) << 32); - x36 = ((uint64_t)(arg1[27]) << 24); - x37 = ((uint64_t)(arg1[26]) << 16); - x38 = ((uint64_t)(arg1[25]) << 8); - x39 = (arg1[24]); - x40 = ((uint64_t)(arg1[23]) << 56); - x41 = ((uint64_t)(arg1[22]) << 48); - x42 = ((uint64_t)(arg1[21]) << 40); - x43 = ((uint64_t)(arg1[20]) << 32); - x44 = ((uint64_t)(arg1[19]) << 24); - x45 = ((uint64_t)(arg1[18]) << 16); - x46 = ((uint64_t)(arg1[17]) << 8); - x47 = (arg1[16]); - x48 = ((uint64_t)(arg1[15]) << 56); - x49 = ((uint64_t)(arg1[14]) << 48); - x50 = ((uint64_t)(arg1[13]) << 40); - x51 = ((uint64_t)(arg1[12]) << 32); - x52 = ((uint64_t)(arg1[11]) << 24); - x53 = ((uint64_t)(arg1[10]) << 16); - x54 = ((uint64_t)(arg1[9]) << 8); - x55 = (arg1[8]); - x56 = ((uint64_t)(arg1[7]) << 56); - x57 = ((uint64_t)(arg1[6]) << 48); - x58 = ((uint64_t)(arg1[5]) << 40); - x59 = ((uint64_t)(arg1[4]) << 32); - x60 = ((uint64_t)(arg1[3]) << 24); - x61 = ((uint64_t)(arg1[2]) << 16); - x62 = ((uint64_t)(arg1[1]) << 8); - x63 = (arg1[0]); - x64 = (x62 + (uint64_t)x63); - x65 = (x61 + x64); - x66 = (x60 + x65); - x67 = (x59 + x66); - x68 = (x58 + x67); - x69 = (x57 + x68); - x70 = (x56 + x69); - x71 = (x54 + (uint64_t)x55); - x72 = (x53 + x71); - x73 = (x52 + x72); - x74 = (x51 + x73); - x75 = (x50 + x74); - x76 = (x49 + x75); - x77 = (x48 + x76); - x78 = (x46 + (uint64_t)x47); - x79 = (x45 + x78); - x80 = (x44 + x79); - x81 = (x43 + x80); - x82 = (x42 + x81); - x83 = (x41 + x82); - x84 = (x40 + x83); - x85 = (x38 + (uint64_t)x39); - x86 = (x37 + x85); - x87 = (x36 + x86); - x88 = (x35 + x87); - x89 = (x34 + x88); - x90 = (x33 + x89); - x91 = (x32 + x90); - x92 = (x30 + (uint64_t)x31); - x93 = (x29 + x92); - x94 = (x28 + x93); - x95 = (x27 + x94); - x96 = (x26 + x95); - x97 = (x25 + x96); - x98 = (x24 + x97); - x99 = (x22 + (uint64_t)x23); - x100 = (x21 + x99); - x101 = (x20 + x100); - x102 = (x19 + x101); - x103 = (x18 + x102); - x104 = (x17 + x103); - x105 = (x16 + x104); - x106 = (x14 + (uint64_t)x15); - x107 = (x13 + x106); - x108 = (x12 + x107); - x109 = (x11 + x108); - x110 = (x10 + x109); - x111 = (x9 + x110); - x112 = (x8 + x111); - x113 = (x6 + (uint64_t)x7); - x114 = (x5 + x113); - x115 = (x4 + x114); - x116 = (x3 + x115); - x117 = (x2 + x116); - x118 = (x1 + x117); - out1[0] = x70; - out1[1] = x77; - out1[2] = x84; - out1[3] = x91; - out1[4] = x98; - out1[5] = x105; - out1[6] = x112; - out1[7] = x118; -} - -/* - * The function fiat_p318233_set_one returns the field element one in the Montgomery domain. - * - * Postconditions: - * eval (from_montgomery out1) mod m = 1 mod m - * 0 ≤ eval out1 < m - * - */ -void fiat_p318233_set_one(fiat_p318233_montgomery_domain_field_element out1) { - out1[0] = UINT16_C(0x6da); - out1[1] = 0x0; - out1[2] = UINT64_C(0xaa7aca36978c0000); - out1[3] = UINT64_C(0xab45e9a52195b079); - out1[4] = UINT64_C(0x215261649ca80146); - out1[5] = UINT64_C(0x37f58cab7c878058); - out1[6] = UINT64_C(0x336808a11dd16199); - out1[7] = UINT64_C(0x1a51e155b8b1a4); -} - -void fp_add(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p318233_add(out, a, b); -} - -void fp_sub(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p318233_sub(out, a, b); -} - -void fp_sqr(uint64_t* out, const uint64_t* a) { - fiat_p318233_square(out, a); -} - -void fp_mul(uint64_t* out, const uint64_t* a, const uint64_t* b) { - fiat_p318233_mul(out, a, b); -} - -void fp_tomont(uint64_t* out, const uint64_t* a) { - fiat_p318233_to_montgomery(out, a); -} - -void fp_frommont(uint64_t* out, const uint64_t* a) { - fiat_p318233_from_montgomery(out, a); -} - -void fp_mont_setone(uint64_t* out) { - fiat_p318233_set_one(out); -} \ No newline at end of file diff --git a/src/gf/ref/lvl5/include/fp.h b/src/gf/ref/lvl5/include/fp.h deleted file mode 100644 index 7fb11af..0000000 --- a/src/gf/ref/lvl5/include/fp.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef FP_H -#define FP_H - -//////////////////////////////////////////////// NOTE: this is placed here for now -#include -#include -#include -#include -#include -#include -#include - -typedef digit_t fp_t[NWORDS_FIELD]; // Datatype for representing field elements - -void fp_set(digit_t* x, const digit_t val); -bool fp_is_equal(const digit_t* a, const digit_t* b); -bool fp_is_zero(const digit_t* a); -void fp_copy(digit_t* out, const digit_t* a); -digit_t mp_shiftr(digit_t* x, const unsigned int shift, const unsigned int nwords); -void mp_shiftl(digit_t* x, const unsigned int shift, const unsigned int nwords); -void fp_add(digit_t* out, const digit_t* a, const digit_t* b); -void fp_sub(digit_t* out, const digit_t* a, const digit_t* b); -void fp_neg(digit_t* out, const digit_t* a); -void fp_sqr(digit_t* out, const digit_t* a); -void fp_mul(digit_t* out, const digit_t* a, const digit_t* b); -void MUL(digit_t* out, const digit_t a, const digit_t b); -void fp_inv(digit_t* x); -bool fp_is_square(const digit_t* a); -void fp_sqrt(digit_t* a); -void fp_tomont(digit_t* out, const digit_t* a); -void fp_frommont(digit_t* out, const digit_t* a); -void fp_mont_setone(digit_t* out); - -/********************** Constant-time unsigned comparisons ***********************/ - -// The following functions return 1 (TRUE) if condition is true, 0 (FALSE) otherwise - -static inline unsigned int is_digit_nonzero_ct(digit_t x) -{ // Is x != 0? - return (unsigned int)((x | (0 - x)) >> (RADIX - 1)); -} - -static inline unsigned int is_digit_zero_ct(digit_t x) -{ // Is x = 0? - return (unsigned int)(1 ^ is_digit_nonzero_ct(x)); -} - -static inline unsigned int is_digit_lessthan_ct(digit_t x, digit_t y) -{ // Is x < y? - return (unsigned int)((x ^ ((x ^ y) | ((x - y) ^ y))) >> (RADIX - 1)); -} - -/********************** Platform-independent macros for digit-size operations **********************/ - -// Digit addition with carry -#define ADDC(sumOut, carryOut, addend1, addend2, carryIn) \ - { digit_t tempReg = (addend1) + (digit_t)(carryIn); \ - (sumOut) = (addend2) + tempReg; \ - (carryOut) = (is_digit_lessthan_ct(tempReg, (digit_t)(carryIn)) | is_digit_lessthan_ct((sumOut), tempReg)); } - -// Digit subtraction with borrow -#define SUBC(differenceOut, borrowOut, minuend, subtrahend, borrowIn) \ - { digit_t tempReg = (minuend) - (subtrahend); \ - unsigned int borrowReg = (is_digit_lessthan_ct((minuend), (subtrahend)) | ((borrowIn) & is_digit_zero_ct(tempReg))); \ - (differenceOut) = tempReg - (digit_t)(borrowIn); \ - (borrowOut) = borrowReg; } - -// Shift right with flexible datatype -#define SHIFTR(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((lowIn) >> (shift)) ^ ((highIn) << (DigitSize - (shift))); - -// Digit shift left -#define SHIFTL(highIn, lowIn, shift, shiftOut, DigitSize) \ - (shiftOut) = ((highIn) << (shift)) ^ ((lowIn) >> (RADIX - (shift))); - -#endif \ No newline at end of file diff --git a/src/gf/ref/lvl5/include/fp2.h b/src/gf/ref/lvl5/include/fp2.h deleted file mode 100644 index 8015de0..0000000 --- a/src/gf/ref/lvl5/include/fp2.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef FP2_H -#define FP2_H - -#include "fp.h" - -// Structure for representing elements in GF(p^2) -typedef struct fp2_t { - fp_t re, im; -} fp2_t; - -void fp2_set(fp2_t* x, const digit_t val); -bool fp2_is_zero(const fp2_t* a); -bool fp2_is_equal(const fp2_t* a, const fp2_t* b); -void fp2_copy(fp2_t* x, const fp2_t* y); -fp2_t fp2_non_residue(); -void fp2_add(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sub(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_neg(fp2_t* x, const fp2_t* y); -void fp2_mul(fp2_t* x, const fp2_t* y, const fp2_t* z); -void fp2_sqr(fp2_t* x, const fp2_t* y); -void fp2_inv(fp2_t* x); -bool fp2_is_square(const fp2_t* x); -void fp2_frob(fp2_t* x, const fp2_t* y); -void fp2_sqrt(fp2_t* x); -void fp2_tomont(fp2_t* x, const fp2_t* y); -void fp2_frommont(fp2_t* x, const fp2_t* y); -int fp2_cmp(fp2_t* x, fp2_t* y); - -#endif diff --git a/src/gf/ref/lvl5/test/CMakeLists.txt b/src/gf/ref/lvl5/test/CMakeLists.txt index 2f769a7..316e0a8 100644 --- a/src/gf/ref/lvl5/test/CMakeLists.txt +++ b/src/gf/ref/lvl5/test/CMakeLists.txt @@ -1,9 +1 @@ -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp test_fp.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp sqisign_test_gf_${SVARIANT_LOWER}_fp test ${SQISIGN_TEST_REPS}) - -add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp2 test_fp2.c test_extras.c) -target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}}) -target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp2 PRIVATE ../include ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC}) -add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp2 sqisign_test_gf_${SVARIANT_LOWER}_fp2 test ${SQISIGN_TEST_REPS}) \ No newline at end of file +include(../../lvlx_test.cmake) diff --git a/src/gf/ref/lvl5/test/test_extras.c b/src/gf/ref/lvl5/test/test_extras.c deleted file mode 100644 index d0689c6..0000000 --- a/src/gf/ref/lvl5/test/test_extras.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "test_extras.h" -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; -extern const digit_t R2[NWORDS_FIELD]; - -#if 0 -int64_t cpucycles(void) -{ // Access system counter for benchmarking - unsigned int hi, lo; - - asm volatile ("rdtsc\n\t" : "=a" (lo), "=d"(hi)); - return ((int64_t)lo) | (((int64_t)hi) << 32); -} -#endif - - -int compare_words(digit_t* a, digit_t* b, unsigned int nwords) -{ // Comparing "nword" elements, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) - { - if (a[i] > b[i]) return 1; - else if (a[i] < b[i]) return -1; - } - - return 0; -} - - -static void sub_test(digit_t* out, digit_t* a, digit_t* b, unsigned int nwords) -{ // Subtraction without borrow, out = a-b where a>b - // SECURITY NOTE: this function does not have constant-time execution. It is for TESTING ONLY. - unsigned int i; - digit_t res, carry, borrow = 0; - - for (i = 0; i < nwords; i++) - { - res = a[i] - b[i]; - carry = (a[i] < b[i]); - out[i] = res - borrow; - borrow = carry || (res < borrow); - } -} - - -void fprandom_test(digit_t* a) -{ // Generating a pseudo-random field element in [0, p-1] - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - unsigned int i, diff = 256-254, nwords = NWORDS_FIELD; - unsigned char* string = NULL; - - string = (unsigned char*)a; - for (i = 0; i < sizeof(digit_t)*nwords; i++) { - *(string + i) = (unsigned char)rand(); // Obtain 256-bit number - } - a[nwords-1] &= (((digit_t)(-1) << diff) >> diff); - - while (compare_words((digit_t*)p, a, nwords) < 1) { // Force it to [0, modulus-1] - sub_test(a, a, (digit_t*)p, nwords); - } -} - - -void fp2random_test(fp2_t* a) -{ // Generating a pseudo-random element in GF(p^2) - // SECURITY NOTE: distribution is not fully uniform. TO BE USED FOR TESTING ONLY. - - fprandom_test(a->re); - fprandom_test(a->im); -} \ No newline at end of file diff --git a/src/gf/ref/lvl5/test/test_extras.h b/src/gf/ref/lvl5/test/test_extras.h deleted file mode 100644 index 3de524d..0000000 --- a/src/gf/ref/lvl5/test/test_extras.h +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef TEST_EXTRAS_H -#define TEST_EXTRAS_H - -#include -#include -#include "../include/fp.h" -#include "../include/fp2.h" - -#define PASSED 0 -#define FAILED 1 - -// Access system counter for benchmarking -//int64_t cpucycles(void); - -// Comparing "nword" elements, a=b? : (1) a!=b, (0) a=b -int compare_words(digit_t* a, digit_t* b, unsigned int nwords); - -// Generating a pseudo-random field element in [0, p-1] -void fprandom_test(digit_t* a); - -// Generating a pseudo-random element in GF(p^2) -void fp2random_test(fp2_t* a); - -#endif \ No newline at end of file diff --git a/src/gf/ref/lvl5/test/test_fp.c b/src/gf/ref/lvl5/test/test_fp.c deleted file mode 100644 index 71c1b9f..0000000 --- a/src/gf/ref/lvl5/test/test_fp.c +++ /dev/null @@ -1,296 +0,0 @@ -#include "test_extras.h" -#include -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp_test() -{ // Tests for the field arithmetic - bool OK = true; - int n, passed; - fp_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing field arithmetic over GF(p): \n\n"); - - // Field addition - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/ref/lvl5/test/test_fp2.c b/src/gf/ref/lvl5/test/test_fp2.c deleted file mode 100644 index 48b08c7..0000000 --- a/src/gf/ref/lvl5/test/test_fp2.c +++ /dev/null @@ -1,307 +0,0 @@ -#include "test_extras.h" -#include -#include -#include - -// Global constants -extern const digit_t p[NWORDS_FIELD]; - -// Benchmark and test parameters -static int BENCH_LOOPS = 100000; // Number of iterations per bench -static int TEST_LOOPS = 100000; // Number of iterations per test - - -bool fp2_test() -{ // Tests for the GF(p^2) arithmetic - bool OK = true; - int n, passed; - fp2_t a, b, c, d, e, f, ma, mb, mc, md, me, mf; - - printf("\n--------------------------------------------------------------------------------------------------------\n\n"); - printf("Testing arithmetic over GF(p^2): \n\n"); - - // Addition in GF(p^2) - passed = 1; - for (n=0; n\n"); - exit(1); - } - if (!strcmp(argv[1], "test")) { - TEST_LOOPS = atoi(argv[2]); - return !fp2_test(); - } else if (!strcmp(argv[1], "bench")) { - BENCH_LOOPS = atoi(argv[2]); - return !fp2_run(); - } else { - exit(1); - } -} \ No newline at end of file diff --git a/src/gf/ref/lvlx.cmake b/src/gf/ref/lvlx.cmake new file mode 100644 index 0000000..d27441b --- /dev/null +++ b/src/gf/ref/lvlx.cmake @@ -0,0 +1,13 @@ +set(SOURCE_FILES_GF_${SVARIANT_UPPER}_REF + ${SOURCE_FILES_GF_SPECIFIC} + ${LVLX_DIR}/fp.c + ${LVLX_DIR}/fp2.c +) + +add_library(${LIB_GF_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_GF_${SVARIANT_UPPER}_REF}) +target_include_directories(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_GF} ${INC_MP} ${INC_PUBLIC}) +target_compile_options(${LIB_GF_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_link_libraries(${LIB_GF_${SVARIANT_UPPER}} ${LIB_MP}) +target_compile_definitions(${LIB_GF_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + +add_subdirectory(test) diff --git a/src/gf/ref/lvlx/fp.c b/src/gf/ref/lvlx/fp.c new file mode 100644 index 0000000..48e2937 --- /dev/null +++ b/src/gf/ref/lvlx/fp.c @@ -0,0 +1,15 @@ +#include + +/* + * If ctl == 0x00000000, then *d is set to a0 + * If ctl == 0xFFFFFFFF, then *d is set to a1 + * ctl MUST be either 0x00000000 or 0xFFFFFFFF. + */ +void +fp_select(fp_t *d, const fp_t *a0, const fp_t *a1, uint32_t ctl) +{ + digit_t cw = (int32_t)ctl; + for (unsigned int i = 0; i < NWORDS_FIELD; i++) { + (*d)[i] = (*a0)[i] ^ (cw & ((*a0)[i] ^ (*a1)[i])); + } +} diff --git a/src/gf/ref/lvlx/fp2.c b/src/gf/ref/lvlx/fp2.c new file mode 100644 index 0000000..a258952 --- /dev/null +++ b/src/gf/ref/lvlx/fp2.c @@ -0,0 +1,328 @@ +#include +#include +#include + +/* Arithmetic modulo X^2 + 1 */ + +void +fp2_set_small(fp2_t *x, const digit_t val) +{ + fp_set_small(&(x->re), val); + fp_set_zero(&(x->im)); +} + +void +fp2_mul_small(fp2_t *x, const fp2_t *y, uint32_t n) +{ + fp_mul_small(&x->re, &y->re, n); + fp_mul_small(&x->im, &y->im, n); +} + +void +fp2_set_one(fp2_t *x) +{ + fp_set_one(&(x->re)); + fp_set_zero(&(x->im)); +} + +void +fp2_set_zero(fp2_t *x) +{ + fp_set_zero(&(x->re)); + fp_set_zero(&(x->im)); +} + +// Is a GF(p^2) element zero? +// Returns 0xFF...FF (true) if a=0, 0 (false) otherwise +uint32_t +fp2_is_zero(const fp2_t *a) +{ + return fp_is_zero(&(a->re)) & fp_is_zero(&(a->im)); +} + +// Compare two GF(p^2) elements in constant time +// Returns 0xFF...FF (true) if a=b, 0 (false) otherwise +uint32_t +fp2_is_equal(const fp2_t *a, const fp2_t *b) +{ + return fp_is_equal(&(a->re), &(b->re)) & fp_is_equal(&(a->im), &(b->im)); +} + +// Is a GF(p^2) element one? +// Returns 0xFF...FF (true) if a=1, 0 (false) otherwise +uint32_t +fp2_is_one(const fp2_t *a) +{ + return fp_is_equal(&(a->re), &ONE) & fp_is_zero(&(a->im)); +} + +void +fp2_copy(fp2_t *x, const fp2_t *y) +{ + fp_copy(&(x->re), &(y->re)); + fp_copy(&(x->im), &(y->im)); +} + +void +fp2_add(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_add(&(x->re), &(y->re), &(z->re)); + fp_add(&(x->im), &(y->im), &(z->im)); +} + +void +fp2_add_one(fp2_t *x, const fp2_t *y) +{ + fp_add(&x->re, &y->re, &ONE); + fp_copy(&x->im, &y->im); +} + +void +fp2_sub(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_sub(&(x->re), &(y->re), &(z->re)); + fp_sub(&(x->im), &(y->im), &(z->im)); +} + +void +fp2_neg(fp2_t *x, const fp2_t *y) +{ + fp_neg(&(x->re), &(y->re)); + fp_neg(&(x->im), &(y->im)); +} + +void +fp2_mul(fp2_t *x, const fp2_t *y, const fp2_t *z) +{ + fp_t t0, t1; + + fp_add(&t0, &(y->re), &(y->im)); + fp_add(&t1, &(z->re), &(z->im)); + fp_mul(&t0, &t0, &t1); + fp_mul(&t1, &(y->im), &(z->im)); + fp_mul(&(x->re), &(y->re), &(z->re)); + fp_sub(&(x->im), &t0, &t1); + fp_sub(&(x->im), &(x->im), &(x->re)); + fp_sub(&(x->re), &(x->re), &t1); +} + +void +fp2_sqr(fp2_t *x, const fp2_t *y) +{ + fp_t sum, diff; + + fp_add(&sum, &(y->re), &(y->im)); + fp_sub(&diff, &(y->re), &(y->im)); + fp_mul(&(x->im), &(y->re), &(y->im)); + fp_add(&(x->im), &(x->im), &(x->im)); + fp_mul(&(x->re), &sum, &diff); +} + +void +fp2_inv(fp2_t *x) +{ + fp_t t0, t1; + + fp_sqr(&t0, &(x->re)); + fp_sqr(&t1, &(x->im)); + fp_add(&t0, &t0, &t1); + fp_inv(&t0); + fp_mul(&(x->re), &(x->re), &t0); + fp_mul(&(x->im), &(x->im), &t0); + fp_neg(&(x->im), &(x->im)); +} + +uint32_t +fp2_is_square(const fp2_t *x) +{ + fp_t t0, t1; + + fp_sqr(&t0, &(x->re)); + fp_sqr(&t1, &(x->im)); + fp_add(&t0, &t0, &t1); + + return fp_is_square(&t0); +} + +void +fp2_sqrt(fp2_t *a) +{ + fp_t x0, x1, t0, t1; + + /* From "Optimized One-Dimensional SQIsign Verification on Intel and + * Cortex-M4" by Aardal et al: https://eprint.iacr.org/2024/1563 */ + + // x0 = \delta = sqrt(a0^2 + a1^2). + fp_sqr(&x0, &(a->re)); + fp_sqr(&x1, &(a->im)); + fp_add(&x0, &x0, &x1); + fp_sqrt(&x0); + // If a1 = 0, there is a risk of \delta = -a0, which makes x0 = 0 below. + // In that case, we restore the value \delta = a0. + fp_select(&x0, &x0, &(a->re), fp_is_zero(&(a->im))); + // x0 = \delta + a0, t0 = 2 * x0. + fp_add(&x0, &x0, &(a->re)); + fp_add(&t0, &x0, &x0); + + // x1 = t0^(p-3)/4 + fp_exp3div4(&x1, &t0); + + // x0 = x0 * x1, x1 = x1 * a1, t1 = (2x0)^2. + fp_mul(&x0, &x0, &x1); + fp_mul(&x1, &x1, &(a->im)); + fp_add(&t1, &x0, &x0); + fp_sqr(&t1, &t1); + // If t1 = t0, return x0 + x1*i, otherwise x1 - x0*i. + fp_sub(&t0, &t0, &t1); + uint32_t f = fp_is_zero(&t0); + fp_neg(&t1, &x0); + fp_copy(&t0, &x1); + fp_select(&t0, &t0, &x0, f); + fp_select(&t1, &t1, &x1, f); + + // Check if t0 is zero + uint32_t t0_is_zero = fp_is_zero(&t0); + + // Check whether t0, t1 are odd + // Note: we encode to ensure canonical representation + uint8_t tmp_bytes[FP_ENCODED_BYTES]; + fp_encode(tmp_bytes, &t0); + uint32_t t0_is_odd = -((uint32_t)tmp_bytes[0] & 1); + fp_encode(tmp_bytes, &t1); + uint32_t t1_is_odd = -((uint32_t)tmp_bytes[0] & 1); + + // We negate the output if: + // t0 is odd, or + // t0 is zero and t1 is odd + uint32_t negate_output = t0_is_odd | (t0_is_zero & t1_is_odd); + fp_neg(&x0, &t0); + fp_select(&(a->re), &t0, &x0, negate_output); + fp_neg(&x0, &t1); + fp_select(&(a->im), &t1, &x0, negate_output); +} + +uint32_t +fp2_sqrt_verify(fp2_t *a) +{ + fp2_t t0, t1; + + fp2_copy(&t0, a); + fp2_sqrt(a); + fp2_sqr(&t1, a); + + return (fp2_is_equal(&t0, &t1)); +} + +void +fp2_half(fp2_t *x, const fp2_t *y) +{ + fp_half(&(x->re), &(y->re)); + fp_half(&(x->im), &(y->im)); +} + +void +fp2_batched_inv(fp2_t *x, int len) +{ + fp2_t t1[len], t2[len]; + fp2_t inverse; + + // x = x0,...,xn + // t1 = x0, x0*x1, ... ,x0 * x1 * ... * xn + fp2_copy(&t1[0], &x[0]); + for (int i = 1; i < len; i++) { + fp2_mul(&t1[i], &t1[i - 1], &x[i]); + } + + // inverse = 1/ (x0 * x1 * ... * xn) + fp2_copy(&inverse, &t1[len - 1]); + fp2_inv(&inverse); + + fp2_copy(&t2[0], &inverse); + // t2 = 1/ (x0 * x1 * ... * xn), 1/ (x0 * x1 * ... * x(n-1)) , ... , 1/xO + for (int i = 1; i < len; i++) { + fp2_mul(&t2[i], &t2[i - 1], &x[len - i]); + } + + fp2_copy(&x[0], &t2[len - 1]); + + for (int i = 1; i < len; i++) { + fp2_mul(&x[i], &t1[i - 1], &t2[len - i - 1]); + } +} + +// exponentiation using square and multiply +// Warning!! Not constant time! +void +fp2_pow_vartime(fp2_t *out, const fp2_t *x, const digit_t *exp, const int size) +{ + fp2_t acc; + digit_t bit; + + fp2_copy(&acc, x); + fp2_set_one(out); + + // Iterate over each word of exp + for (int j = 0; j < size; j++) { + // Iterate over each bit of the word + for (int i = 0; i < RADIX; i++) { + bit = (exp[j] >> i) & 1; + if (bit == 1) { + fp2_mul(out, out, &acc); + } + fp2_sqr(&acc, &acc); + } + } +} + +void +fp2_print(const char *name, const fp2_t *a) +{ + printf("%s0x", name); + + uint8_t buf[FP_ENCODED_BYTES]; + fp_encode(&buf, &a->re); // Encoding ensures canonical rep + for (int i = 0; i < FP_ENCODED_BYTES; i++) { + printf("%02x", buf[FP_ENCODED_BYTES - i - 1]); + } + + printf(" + i*0x"); + + fp_encode(&buf, &a->im); + for (int i = 0; i < FP_ENCODED_BYTES; i++) { + printf("%02x", buf[FP_ENCODED_BYTES - i - 1]); + } + printf("\n"); +} + +void +fp2_encode(void *dst, const fp2_t *a) +{ + uint8_t *buf = dst; + fp_encode(buf, &(a->re)); + fp_encode(buf + FP_ENCODED_BYTES, &(a->im)); +} + +uint32_t +fp2_decode(fp2_t *d, const void *src) +{ + const uint8_t *buf = src; + uint32_t re, im; + + re = fp_decode(&(d->re), buf); + im = fp_decode(&(d->im), buf + FP_ENCODED_BYTES); + return re & im; +} + +void +fp2_select(fp2_t *d, const fp2_t *a0, const fp2_t *a1, uint32_t ctl) +{ + fp_select(&(d->re), &(a0->re), &(a1->re), ctl); + fp_select(&(d->im), &(a0->im), &(a1->im), ctl); +} + +void +fp2_cswap(fp2_t *a, fp2_t *b, uint32_t ctl) +{ + fp_cswap(&(a->re), &(b->re), ctl); + fp_cswap(&(a->im), &(b->im), ctl); +} diff --git a/src/gf/ref/lvlx_test.cmake b/src/gf/ref/lvlx_test.cmake new file mode 100644 index 0000000..c27d24b --- /dev/null +++ b/src/gf/ref/lvlx_test.cmake @@ -0,0 +1,23 @@ +add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_fp.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}} ${LIB_MP} sqisign_common_test) +target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp PRIVATE ${INC_GF} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +add_executable(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_fp2.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_test_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}} ${LIB_MP} sqisign_common_test) +target_include_directories(sqisign_test_gf_${SVARIANT_LOWER}_fp2 PRIVATE ${INC_GF} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp sqisign_test_gf_${SVARIANT_LOWER}_fp test) +add_test(sqisign_test_gf_${SVARIANT_LOWER}_fp2 sqisign_test_gf_${SVARIANT_LOWER}_fp2 test) + +add_executable(sqisign_bench_gf_${SVARIANT_LOWER}_fp ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/bench_fp.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_bench_gf_${SVARIANT_LOWER}_fp ${LIB_GF_${SVARIANT_UPPER}} ${LIB_MP} sqisign_common_sys) +target_include_directories(sqisign_bench_gf_${SVARIANT_LOWER}_fp PRIVATE ${INC_GF} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +add_executable(sqisign_bench_gf_${SVARIANT_LOWER}_fp2 ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/bench_fp2.c ${${CCSD_NAME_UPPER}_GENERIC_DIR}/test/test_utils.c) +target_link_libraries(sqisign_bench_gf_${SVARIANT_LOWER}_fp2 ${LIB_GF_${SVARIANT_UPPER}} ${LIB_MP} sqisign_common_sys) +target_include_directories(sqisign_bench_gf_${SVARIANT_LOWER}_fp2 PRIVATE ${INC_GF} ${INC_COMMON} ${PROJECT_SOURCE_DIR}/src/precomp/ref/${SVARIANT_LOWER}/include ${INC_PUBLIC}) + +set(BM_BINS ${BM_BINS} + sqisign_bench_gf_${SVARIANT_LOWER}_fp sqisign_bench_gf_${SVARIANT_LOWER}_fp2 + CACHE INTERNAL "List of benchmark executables") + diff --git a/src/intbig/CMakeLists.txt b/src/hd/CMakeLists.txt similarity index 100% rename from src/intbig/CMakeLists.txt rename to src/hd/CMakeLists.txt diff --git a/src/hd/ref/CMakeLists.txt b/src/hd/ref/CMakeLists.txt new file mode 100644 index 0000000..d0ba315 --- /dev/null +++ b/src/hd/ref/CMakeLists.txt @@ -0,0 +1,3 @@ +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) + +include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/hd/ref/include/hd.h b/src/hd/ref/include/hd.h new file mode 100644 index 0000000..2b16e23 --- /dev/null +++ b/src/hd/ref/include/hd.h @@ -0,0 +1,435 @@ +/** @file + * + * @authors Antonin Leroux + * + * @brief The HD-isogenies algorithm required by the signature + * + */ + +#ifndef HD_H +#define HD_H + +#include +#include +#include + +/** @defgroup hd_module Abelian surfaces and their isogenies + * @{ + */ + +#define HD_extra_torsion 2 + +/** @defgroup hd_struct Data structures for dimension 2 + * @{ + */ + +/** @brief Type for couple point with XZ coordinates + * @typedef theta_couple_point_t + * + * @struct theta_couple_point + * + * Structure for the couple point on an elliptic product + * using XZ coordinates + */ +typedef struct theta_couple_point +{ + ec_point_t P1; + ec_point_t P2; +} theta_couple_point_t; + +/** @brief Type for three couple points T1, T2, T1-T2 with XZ coordinates + * @typedef theta_kernel_couple_points_t + * + * @struct theta_kernel_couple_points + * + * Structure for a triple of theta couple points T1, T2 and T1 - T2 + */ +typedef struct theta_kernel_couple_points +{ + theta_couple_point_t T1; + theta_couple_point_t T2; + theta_couple_point_t T1m2; +} theta_kernel_couple_points_t; + +/** @brief Type for couple point with XYZ coordinates + * @typedef theta_couple_jac_point_t + * + * @struct theta_couple_jac_point + * + * Structure for the couple point on an elliptic product + * using XYZ coordinates + */ +typedef struct theta_couple_jac_point +{ + jac_point_t P1; + jac_point_t P2; +} theta_couple_jac_point_t; + +/** @brief Type for couple curve * + * @typedef theta_couple_curve_t + * + * @struct theta_couple_curve + * + * the theta_couple_curve structure + */ +typedef struct theta_couple_curve +{ + ec_curve_t E1; + ec_curve_t E2; +} theta_couple_curve_t; + +/** @brief Type for a product E1 x E2 with corresponding bases + * @typedef theta_couple_curve_with_basis_t + * + * @struct theta_couple_curve_with_basis + * + * tType for a product E1 x E2 with corresponding bases Ei[2^n] + */ +typedef struct theta_couple_curve_with_basis +{ + ec_curve_t E1; + ec_curve_t E2; + ec_basis_t B1; + ec_basis_t B2; +} theta_couple_curve_with_basis_t; + +/** @brief Type for theta point * + * @typedef theta_point_t + * + * @struct theta_point + * + * the theta_point structure used + */ +typedef struct theta_point +{ + fp2_t x; + fp2_t y; + fp2_t z; + fp2_t t; +} theta_point_t; + +/** @brief Type for theta point with repeating components + * @typedef theta_point_compact_t + * + * @struct theta_point_compact + * + * the theta_point structure used for points with repeated components + */ +typedef struct theta_point_compact +{ + fp2_t x; + fp2_t y; +} theta_point_compact_t; + +/** @brief Type for theta structure * + * @typedef theta_structure_t + * + * @struct theta_structure + * + * the theta_structure structure used + */ +typedef struct theta_structure +{ + theta_point_t null_point; + bool precomputation; + + // Eight precomputed values used for doubling and + // (2,2)-isogenies. + fp2_t XYZ0; + fp2_t YZT0; + fp2_t XZT0; + fp2_t XYT0; + + fp2_t xyz0; + fp2_t yzt0; + fp2_t xzt0; + fp2_t xyt0; +} theta_structure_t; + +/** @brief A 2x2 matrix used for action by translation + * @typedef translation_matrix_t + * + * @struct translation_matrix + * + * Structure to hold 4 fp2_t elements representing a 2x2 matrix used when computing + * a compatible theta structure during gluing. + */ +typedef struct translation_matrix +{ + fp2_t g00; + fp2_t g01; + fp2_t g10; + fp2_t g11; +} translation_matrix_t; + +/** @brief A 4x4 matrix used for basis changes + * @typedef basis_change_matrix_t + * + * @struct basis_change_matrix + * + * Structure to hold 16 elements representing a 4x4 matrix used for changing + * the basis of a theta point. + */ +typedef struct basis_change_matrix +{ + fp2_t m[4][4]; +} basis_change_matrix_t; + +/** @brief Type for gluing (2,2) theta isogeny * + * @typedef theta_gluing_t + * + * @struct theta_gluing + * + * the theta_gluing structure + */ +typedef struct theta_gluing +{ + + theta_couple_curve_t domain; + theta_couple_jac_point_t xyK1_8; + theta_point_compact_t imageK1_8; + basis_change_matrix_t M; + theta_point_t precomputation; + theta_point_t codomain; + +} theta_gluing_t; + +/** @brief Type for standard (2,2) theta isogeny * + * @typedef theta_isogeny_t + * + * @struct theta_isogeny + * + * the theta_isogeny structure + */ +typedef struct theta_isogeny +{ + theta_point_t T1_8; + theta_point_t T2_8; + bool hadamard_bool_1; + bool hadamard_bool_2; + theta_structure_t domain; + theta_point_t precomputation; + theta_structure_t codomain; +} theta_isogeny_t; + +/** @brief Type for splitting isomorphism * + * @typedef theta_splitting_t + * + * @struct theta_splitting + * + * the theta_splitting structure + */ +typedef struct theta_splitting +{ + basis_change_matrix_t M; + theta_structure_t B; + +} theta_splitting_t; + +// end of hd_struct +/** + * @} + */ + +/** @defgroup hd_functions Functions for dimension 2 + * @{ + */ + +/** + * @brief Compute the double of the theta couple point in on the elliptic product E12 + * + * @param out Output: the theta_couple_point + * @param in the theta couple point in the elliptic product + * @param E1E2 an elliptic product + * in = (P1,P2) + * out = [2] (P1,P2) + * + */ +void double_couple_point(theta_couple_point_t *out, const theta_couple_point_t *in, const theta_couple_curve_t *E1E2); + +/** + * @brief Compute the iterated double of the theta couple point in on the elliptic product E12 + * + * @param out Output: the theta_couple_point + * @param n : the number of iteration + * @param E1E2 an elliptic product + * @param in the theta couple point in the elliptic product + * in = (P1,P2) + * out = [2^n] (P1,P2) + * + */ +void double_couple_point_iter(theta_couple_point_t *out, + unsigned n, + const theta_couple_point_t *in, + const theta_couple_curve_t *E1E2); + +/** + * @brief Compute the addition of two points in (X : Y : Z) coordinates on the elliptic product E12 + * + * @param out Output: the theta_couple_jac_point + * @param T1 the theta couple jac point in the elliptic product + * @param T2 the theta couple jac point in the elliptic product + * @param E1E2 an elliptic product + * in = (P1, P2), (Q1, Q2) + * out = (P1 + Q1, P2 + Q2) + * + **/ +void add_couple_jac_points(theta_couple_jac_point_t *out, + const theta_couple_jac_point_t *T1, + const theta_couple_jac_point_t *T2, + const theta_couple_curve_t *E1E2); + +/** + * @brief Compute the double of the theta couple point in on the elliptic product E12 + * + * @param out Output: the theta_couple_point + * @param in the theta couple point in the elliptic product + * @param E1E2 an elliptic product + * in = (P1,P2) + * out = [2] (P1,P2) + * + */ +void double_couple_jac_point(theta_couple_jac_point_t *out, + const theta_couple_jac_point_t *in, + const theta_couple_curve_t *E1E2); + +/** + * @brief Compute the iterated double of the theta couple jac point in on the elliptic product E12 + * + * @param out Output: the theta_couple_jac_point + * @param n : the number of iteration + * @param in the theta couple jac point in the elliptic product + * @param E1E2 an elliptic product + * in = (P1,P2) + * out = [2^n] (P1,P2) + * + */ +void double_couple_jac_point_iter(theta_couple_jac_point_t *out, + unsigned n, + const theta_couple_jac_point_t *in, + const theta_couple_curve_t *E1E2); + +/** + * @brief A forgetful function which returns (X : Z) points given a pair of (X : Y : Z) points + * + * @param P Output: the theta_couple_point + * @param xyP : the theta_couple_jac_point + **/ +void couple_jac_to_xz(theta_couple_point_t *P, const theta_couple_jac_point_t *xyP); + +/** + * @brief Compute a (2,2) isogeny chain in dimension 2 between elliptic + * products in the theta_model and evaluate at a list of points of the form + * (P1,0) or (0,P2). Returns 0 if the codomain fails to split (or there is + * an error during the computation) and 1 otherwise. + * + * @param n : the length of the isogeny chain + * @param E12 an elliptic curve product + * @param ker T1, T2 and T1-T2. couple points on E12[2^(n+2)] + * @param extra_torsion boolean indicating if we give the points in E12[2^n] or + * E12[2^(n+HD_extra_torsion)] + * @param E34 Output: the codomain curve + * @param P12 Input/Output: pointer to points to be pushed through the isogeny (in-place) + * @param numP: length of the list of points given in P12 (can be zero) + * @returns 1 on success 0 on failure + * + */ +int theta_chain_compute_and_eval(unsigned n, + /*const*/ theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP); + +/** + * @brief Compute a (2,2) isogeny chain in dimension 2 between elliptic + * products in the theta_model and evaluate at a list of points of the form + * (P1,0) or (0,P2). Returns 0 if the codomain fails to split (or there is + * an error during the computation) and 1 otherwise. + * Compared to theta_chain_compute_and_eval, it does extra isotropy + * checks on the kernel. + * + * @param n : the length of the isogeny chain + * @param E12 an elliptic curve product + * @param ker T1, T2 and T1-T2. couple points on E12[2^(n+2)] + * @param extra_torsion boolean indicating if we give the points in E12[2^n] or + * E12[2^(n+HD_extra_torsion)] + * @param E34 Output: the codomain curve + * @param P12 Input/Output: pointer to points to be pushed through the isogeny (in-place) + * @param numP: length of the list of points given in P12 (can be zero) + * @returns 1 on success 0 on failure + * + */ +int theta_chain_compute_and_eval_verify(unsigned n, + /*const*/ theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP); + +/** + * @brief Compute a (2,2) isogeny chain in dimension 2 between elliptic + * products in the theta_model and evaluate at a list of points of the form + * (P1,0) or (0,P2). Returns 0 if the codomain fails to split (or there is + * an error during the computation) and 1 otherwise. + * Compared to theta_chain_compute_and_eval, it selects a random Montgomery + * model of the codomain. + * + * @param n : the length of the isogeny chain + * @param E12 an elliptic curve product + * @param ker T1, T2 and T1-T2. couple points on E12[2^(n+2)] + * @param extra_torsion boolean indicating if we give the points in E12[2^n] or + * E12[2^(n+HD_extra_torsion)] + * @param E34 Output: the codomain curve + * @param P12 Input/Output: pointer to points to be pushed through the isogeny (in-place) + * @param numP: length of the list of points given in P12 (can be zero) + * @returns 1 on success, 0 on failure + * + */ +int theta_chain_compute_and_eval_randomized(unsigned n, + /*const*/ theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP); + +/** + * @brief Given a bases B1 on E1 and B2 on E2 copies this to create a kernel + * on E1 x E2 as couple points T1, T2 and T1 - T2 + * + * @param ker Output: a kernel for dim_two_isogenies (T1, T2, T1-T2) + * @param B1 Input basis on E1 + * @param B2 Input basis on E2 + **/ +void copy_bases_to_kernel(theta_kernel_couple_points_t *ker, const ec_basis_t *B1, const ec_basis_t *B2); + +/** + * @brief Given a couple of points (P1, P2) on a couple of curves (E1, E2) + * this function tests if both points are of order exactly 2^t + * + * @param T: couple point (P1, P2) + * @param E: a couple of curves (E1, E2) + * @param t: an integer + * @returns 0xFFFFFFFF on success, 0 on failure + */ +static int +test_couple_point_order_twof(const theta_couple_point_t *T, const theta_couple_curve_t *E, int t) +{ + int check_P1 = test_point_order_twof(&T->P1, &E->E1, t); + int check_P2 = test_point_order_twof(&T->P2, &E->E2, t); + + return check_P1 & check_P2; +} + +// end of hd_functions +/** + * @} + */ +// end of hd_module +/** + * @} + */ +#endif diff --git a/src/hd/ref/lvl1/CMakeLists.txt b/src/hd/ref/lvl1/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/hd/ref/lvl1/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/hd/ref/lvl3/CMakeLists.txt b/src/hd/ref/lvl3/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/hd/ref/lvl3/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/hd/ref/lvl5/CMakeLists.txt b/src/hd/ref/lvl5/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/hd/ref/lvl5/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/hd/ref/lvlx.cmake b/src/hd/ref/lvlx.cmake new file mode 100644 index 0000000..4ef8704 --- /dev/null +++ b/src/hd/ref/lvlx.cmake @@ -0,0 +1,11 @@ +set(SOURCE_FILES_HD_GENERIC_REF + ${LVLX_DIR}/hd.c + ${LVLX_DIR}/theta_structure.c + ${LVLX_DIR}/theta_isogenies.c +) + +add_library(${LIB_HD_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_HD_GENERIC_REF}) +target_link_libraries(${LIB_HD_${SVARIANT_UPPER}} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}}) +target_include_directories(${LIB_HD_${SVARIANT_UPPER}} PRIVATE ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_PUBLIC} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_HD}) +target_compile_options(${LIB_HD_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_compile_definitions(${LIB_HD_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) diff --git a/src/hd/ref/lvlx/hd.c b/src/hd/ref/lvlx/hd.c new file mode 100644 index 0000000..0424108 --- /dev/null +++ b/src/hd/ref/lvlx/hd.c @@ -0,0 +1,93 @@ +#include +#include + +void +double_couple_point(theta_couple_point_t *out, const theta_couple_point_t *in, const theta_couple_curve_t *E1E2) +{ + ec_dbl(&out->P1, &in->P1, &E1E2->E1); + ec_dbl(&out->P2, &in->P2, &E1E2->E2); +} + +void +double_couple_point_iter(theta_couple_point_t *out, + unsigned n, + const theta_couple_point_t *in, + const theta_couple_curve_t *E1E2) +{ + if (n == 0) { + memmove(out, in, sizeof(theta_couple_point_t)); + } else { + double_couple_point(out, in, E1E2); + for (unsigned i = 0; i < n - 1; i++) { + double_couple_point(out, out, E1E2); + } + } +} + +void +add_couple_jac_points(theta_couple_jac_point_t *out, + const theta_couple_jac_point_t *T1, + const theta_couple_jac_point_t *T2, + const theta_couple_curve_t *E1E2) +{ + ADD(&out->P1, &T1->P1, &T2->P1, &E1E2->E1); + ADD(&out->P2, &T1->P2, &T2->P2, &E1E2->E2); +} + +void +double_couple_jac_point(theta_couple_jac_point_t *out, + const theta_couple_jac_point_t *in, + const theta_couple_curve_t *E1E2) +{ + DBL(&out->P1, &in->P1, &E1E2->E1); + DBL(&out->P2, &in->P2, &E1E2->E2); +} + +void +double_couple_jac_point_iter(theta_couple_jac_point_t *out, + unsigned n, + const theta_couple_jac_point_t *in, + const theta_couple_curve_t *E1E2) +{ + if (n == 0) { + *out = *in; + } else if (n == 1) { + double_couple_jac_point(out, in, E1E2); + } else { + fp2_t a1, a2, t1, t2; + + jac_to_ws(&out->P1, &t1, &a1, &in->P1, &E1E2->E1); + jac_to_ws(&out->P2, &t2, &a2, &in->P2, &E1E2->E2); + + DBLW(&out->P1, &t1, &out->P1, &t1); + DBLW(&out->P2, &t2, &out->P2, &t2); + for (unsigned i = 0; i < n - 1; i++) { + DBLW(&out->P1, &t1, &out->P1, &t1); + DBLW(&out->P2, &t2, &out->P2, &t2); + } + + jac_from_ws(&out->P1, &out->P1, &a1, &E1E2->E1); + jac_from_ws(&out->P2, &out->P2, &a2, &E1E2->E2); + } +} + +void +couple_jac_to_xz(theta_couple_point_t *P, const theta_couple_jac_point_t *xyP) +{ + jac_to_xz(&P->P1, &xyP->P1); + jac_to_xz(&P->P2, &xyP->P2); +} + +void +copy_bases_to_kernel(theta_kernel_couple_points_t *ker, const ec_basis_t *B1, const ec_basis_t *B2) +{ + // Copy the basis on E1 to (P, _) on T1, T2 and T1 - T2 + copy_point(&ker->T1.P1, &B1->P); + copy_point(&ker->T2.P1, &B1->Q); + copy_point(&ker->T1m2.P1, &B1->PmQ); + + // Copy the basis on E2 to (_, P) on T1, T2 and T1 - T2 + copy_point(&ker->T1.P2, &B2->P); + copy_point(&ker->T2.P2, &B2->Q); + copy_point(&ker->T1m2.P2, &B2->PmQ); +} diff --git a/src/hd/ref/lvlx/theta_isogenies.c b/src/hd/ref/lvlx/theta_isogenies.c new file mode 100644 index 0000000..478a9ab --- /dev/null +++ b/src/hd/ref/lvlx/theta_isogenies.c @@ -0,0 +1,1283 @@ +#include "theta_isogenies.h" +#include +#include +#include +#include +#include + +// Select a base change matrix in constant time, with M1 a regular +// base change matrix and M2 a precomputed base change matrix +// If option = 0 then M <- M1, else if option = 0xFF...FF then M <- M2 +static inline void +select_base_change_matrix(basis_change_matrix_t *M, + const basis_change_matrix_t *M1, + const precomp_basis_change_matrix_t *M2, + const uint32_t option) +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + fp2_select(&M->m[i][j], &M1->m[i][j], &FP2_CONSTANTS[M2->m[i][j]], option); +} + +// Set a regular base change matrix from a precomputed one +static inline void +set_base_change_matrix_from_precomp(basis_change_matrix_t *res, const precomp_basis_change_matrix_t *M) +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + res->m[i][j] = FP2_CONSTANTS[M->m[i][j]]; +} + +static inline void +choose_index_theta_point(fp2_t *res, int ind, const theta_point_t *T) +{ + const fp2_t *src = NULL; + switch (ind % 4) { + case 0: + src = &T->x; + break; + case 1: + src = &T->y; + break; + case 2: + src = &T->z; + break; + case 3: + src = &T->t; + break; + default: + assert(0); + } + fp2_copy(res, src); +} + +// same as apply_isomorphism method but more efficient when the t component of P is zero. +static void +apply_isomorphism_general(theta_point_t *res, + const basis_change_matrix_t *M, + const theta_point_t *P, + const bool Pt_not_zero) +{ + fp2_t x1; + theta_point_t temp; + + fp2_mul(&temp.x, &P->x, &M->m[0][0]); + fp2_mul(&x1, &P->y, &M->m[0][1]); + fp2_add(&temp.x, &temp.x, &x1); + fp2_mul(&x1, &P->z, &M->m[0][2]); + fp2_add(&temp.x, &temp.x, &x1); + + fp2_mul(&temp.y, &P->x, &M->m[1][0]); + fp2_mul(&x1, &P->y, &M->m[1][1]); + fp2_add(&temp.y, &temp.y, &x1); + fp2_mul(&x1, &P->z, &M->m[1][2]); + fp2_add(&temp.y, &temp.y, &x1); + + fp2_mul(&temp.z, &P->x, &M->m[2][0]); + fp2_mul(&x1, &P->y, &M->m[2][1]); + fp2_add(&temp.z, &temp.z, &x1); + fp2_mul(&x1, &P->z, &M->m[2][2]); + fp2_add(&temp.z, &temp.z, &x1); + + fp2_mul(&temp.t, &P->x, &M->m[3][0]); + fp2_mul(&x1, &P->y, &M->m[3][1]); + fp2_add(&temp.t, &temp.t, &x1); + fp2_mul(&x1, &P->z, &M->m[3][2]); + fp2_add(&temp.t, &temp.t, &x1); + + if (Pt_not_zero) { + fp2_mul(&x1, &P->t, &M->m[0][3]); + fp2_add(&temp.x, &temp.x, &x1); + + fp2_mul(&x1, &P->t, &M->m[1][3]); + fp2_add(&temp.y, &temp.y, &x1); + + fp2_mul(&x1, &P->t, &M->m[2][3]); + fp2_add(&temp.z, &temp.z, &x1); + + fp2_mul(&x1, &P->t, &M->m[3][3]); + fp2_add(&temp.t, &temp.t, &x1); + } + + fp2_copy(&res->x, &temp.x); + fp2_copy(&res->y, &temp.y); + fp2_copy(&res->z, &temp.z); + fp2_copy(&res->t, &temp.t); +} + +static void +apply_isomorphism(theta_point_t *res, const basis_change_matrix_t *M, const theta_point_t *P) +{ + apply_isomorphism_general(res, M, P, true); +} + +// set res = M1 * M2 with matrix multiplication +static void +base_change_matrix_multiplication(basis_change_matrix_t *res, + const basis_change_matrix_t *M1, + const basis_change_matrix_t *M2) +{ + basis_change_matrix_t tmp; + fp2_t sum, m_ik, m_kj; + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + fp2_set_zero(&sum); + for (int k = 0; k < 4; k++) { + m_ik = M1->m[i][k]; + m_kj = M2->m[k][j]; + fp2_mul(&m_ik, &m_ik, &m_kj); + fp2_add(&sum, &sum, &m_ik); + } + tmp.m[i][j] = sum; + } + } + *res = tmp; +} + +// compute the theta_point corresponding to the couple of point T on an elliptic product +static void +base_change(theta_point_t *out, const theta_gluing_t *phi, const theta_couple_point_t *T) +{ + theta_point_t null_point; + + // null_point = (a : b : c : d) + // a = P1.x P2.x, b = P1.x P2.z, c = P1.z P2.x, d = P1.z P2.z + fp2_mul(&null_point.x, &T->P1.x, &T->P2.x); + fp2_mul(&null_point.y, &T->P1.x, &T->P2.z); + fp2_mul(&null_point.z, &T->P2.x, &T->P1.z); + fp2_mul(&null_point.t, &T->P1.z, &T->P2.z); + + // Apply the basis change + apply_isomorphism(out, &phi->M, &null_point); +} + +static void +action_by_translation_z_and_det(fp2_t *z_inv, fp2_t *det_inv, const ec_point_t *P4, const ec_point_t *P2) +{ + // Store the Z-coordinate to invert + fp2_copy(z_inv, &P4->z); + + // Then collect detij = xij wij - uij zij + fp2_t tmp; + fp2_mul(det_inv, &P4->x, &P2->z); + fp2_mul(&tmp, &P4->z, &P2->x); + fp2_sub(det_inv, det_inv, &tmp); +} + +static void +action_by_translation_compute_matrix(translation_matrix_t *G, + const ec_point_t *P4, + const ec_point_t *P2, + const fp2_t *z_inv, + const fp2_t *det_inv) +{ + fp2_t tmp; + + // Gi.g10 = uij xij /detij - xij/zij + fp2_mul(&tmp, &P4->x, z_inv); + fp2_mul(&G->g10, &P4->x, &P2->x); + fp2_mul(&G->g10, &G->g10, det_inv); + fp2_sub(&G->g10, &G->g10, &tmp); + + // Gi.g11 = uij zij * detij + fp2_mul(&G->g11, &P2->x, det_inv); + fp2_mul(&G->g11, &G->g11, &P4->z); + + // Gi.g00 = -Gi.g11 + fp2_neg(&G->g00, &G->g11); + + // Gi.g01 = - wij zij detij + fp2_mul(&G->g01, &P2->z, det_inv); + fp2_mul(&G->g01, &G->g01, &P4->z); + fp2_neg(&G->g01, &G->g01); +} + +// Returns 1 if the basis is as expected and 0 otherwise +// We only expect this to fail for malformed signatures, so +// do not require this to run in constant time. +static int +verify_two_torsion(const theta_couple_point_t *K1_2, const theta_couple_point_t *K2_2, const theta_couple_curve_t *E12) +{ + // First check if any point in K1_2 or K2_2 is zero, if they are then the points did not have + // order 8 when we started gluing + if (ec_is_zero(&K1_2->P1) | ec_is_zero(&K1_2->P2) | ec_is_zero(&K2_2->P1) | ec_is_zero(&K2_2->P2)) { + return 0; + } + + // Now ensure that P1, Q1 and P2, Q2 are independent. For points of order two this means + // that they're not the same + if (ec_is_equal(&K1_2->P1, &K2_2->P1) | ec_is_equal(&K1_2->P2, &K2_2->P2)) { + return 0; + } + + // Finally, double points to ensure all points have order exactly 0 + theta_couple_point_t O1, O2; + double_couple_point(&O1, K1_2, E12); + double_couple_point(&O2, K2_2, E12); + // If this check fails then the points had order 2*f for some f, and the kernel is malformed. + if (!(ec_is_zero(&O1.P1) & ec_is_zero(&O1.P2) & ec_is_zero(&O2.P1) & ec_is_zero(&O2.P2))) { + return 0; + } + + return 1; +} + +// Computes the action by translation for four points +// (P1, P2) and (Q1, Q2) on E1 x E2 simultaneously to +// save on inversions. +// Returns 0 if any of Pi or Qi does not have order 2 +// and 1 otherwise +static int +action_by_translation(translation_matrix_t *Gi, + const theta_couple_point_t *K1_4, + const theta_couple_point_t *K2_4, + const theta_couple_curve_t *E12) +{ + // Compute points of order 2 from Ki_4 + theta_couple_point_t K1_2, K2_2; + double_couple_point(&K1_2, K1_4, E12); + double_couple_point(&K2_2, K2_4, E12); + + if (!verify_two_torsion(&K1_2, &K2_2, E12)) { + return 0; + } + + // We need to invert four Z coordinates and + // four determinants which we do with batched + // inversion + fp2_t inverses[8]; + action_by_translation_z_and_det(&inverses[0], &inverses[4], &K1_4->P1, &K1_2.P1); + action_by_translation_z_and_det(&inverses[1], &inverses[5], &K1_4->P2, &K1_2.P2); + action_by_translation_z_and_det(&inverses[2], &inverses[6], &K2_4->P1, &K2_2.P1); + action_by_translation_z_and_det(&inverses[3], &inverses[7], &K2_4->P2, &K2_2.P2); + + fp2_batched_inv(inverses, 8); + if (fp2_is_zero(&inverses[0])) + return 0; // something was wrong with our input (which somehow was not caught by + // verify_two_torsion) + + action_by_translation_compute_matrix(&Gi[0], &K1_4->P1, &K1_2.P1, &inverses[0], &inverses[4]); + action_by_translation_compute_matrix(&Gi[1], &K1_4->P2, &K1_2.P2, &inverses[1], &inverses[5]); + action_by_translation_compute_matrix(&Gi[2], &K2_4->P1, &K2_2.P1, &inverses[2], &inverses[6]); + action_by_translation_compute_matrix(&Gi[3], &K2_4->P2, &K2_2.P2, &inverses[3], &inverses[7]); + + return 1; +} + +// Given the appropriate four torsion, computes the +// change of basis to compute the correct theta null +// point. +// Returns 0 if the order of K1_4 or K2_4 is not 4 +static int +gluing_change_of_basis(basis_change_matrix_t *M, + const theta_couple_point_t *K1_4, + const theta_couple_point_t *K2_4, + const theta_couple_curve_t *E12) +{ + // Compute the four 2x2 matrices for the action by translation + // on the four points: + translation_matrix_t Gi[4]; + if (!action_by_translation(Gi, K1_4, K2_4, E12)) + return 0; + + // Computation of the 4x4 matrix from Mij + // t001, t101 (resp t002, t102) first column of M11 * M21 (resp M12 * M22) + fp2_t t001, t101, t002, t102, tmp; + + fp2_mul(&t001, &Gi[0].g00, &Gi[2].g00); + fp2_mul(&tmp, &Gi[0].g01, &Gi[2].g10); + fp2_add(&t001, &t001, &tmp); + + fp2_mul(&t101, &Gi[0].g10, &Gi[2].g00); + fp2_mul(&tmp, &Gi[0].g11, &Gi[2].g10); + fp2_add(&t101, &t101, &tmp); + + fp2_mul(&t002, &Gi[1].g00, &Gi[3].g00); + fp2_mul(&tmp, &Gi[1].g01, &Gi[3].g10); + fp2_add(&t002, &t002, &tmp); + + fp2_mul(&t102, &Gi[1].g10, &Gi[3].g00); + fp2_mul(&tmp, &Gi[1].g11, &Gi[3].g10); + fp2_add(&t102, &t102, &tmp); + + // trace for the first row + fp2_set_one(&M->m[0][0]); + fp2_mul(&tmp, &t001, &t002); + fp2_add(&M->m[0][0], &M->m[0][0], &tmp); + fp2_mul(&tmp, &Gi[2].g00, &Gi[3].g00); + fp2_add(&M->m[0][0], &M->m[0][0], &tmp); + fp2_mul(&tmp, &Gi[0].g00, &Gi[1].g00); + fp2_add(&M->m[0][0], &M->m[0][0], &tmp); + + fp2_mul(&M->m[0][1], &t001, &t102); + fp2_mul(&tmp, &Gi[2].g00, &Gi[3].g10); + fp2_add(&M->m[0][1], &M->m[0][1], &tmp); + fp2_mul(&tmp, &Gi[0].g00, &Gi[1].g10); + fp2_add(&M->m[0][1], &M->m[0][1], &tmp); + + fp2_mul(&M->m[0][2], &t101, &t002); + fp2_mul(&tmp, &Gi[2].g10, &Gi[3].g00); + fp2_add(&M->m[0][2], &M->m[0][2], &tmp); + fp2_mul(&tmp, &Gi[0].g10, &Gi[1].g00); + fp2_add(&M->m[0][2], &M->m[0][2], &tmp); + + fp2_mul(&M->m[0][3], &t101, &t102); + fp2_mul(&tmp, &Gi[2].g10, &Gi[3].g10); + fp2_add(&M->m[0][3], &M->m[0][3], &tmp); + fp2_mul(&tmp, &Gi[0].g10, &Gi[1].g10); + fp2_add(&M->m[0][3], &M->m[0][3], &tmp); + + // Compute the action of (0,out.K2_4.P2) for the second row + fp2_mul(&tmp, &Gi[3].g01, &M->m[0][1]); + fp2_mul(&M->m[1][0], &Gi[3].g00, &M->m[0][0]); + fp2_add(&M->m[1][0], &M->m[1][0], &tmp); + + fp2_mul(&tmp, &Gi[3].g11, &M->m[0][1]); + fp2_mul(&M->m[1][1], &Gi[3].g10, &M->m[0][0]); + fp2_add(&M->m[1][1], &M->m[1][1], &tmp); + + fp2_mul(&tmp, &Gi[3].g01, &M->m[0][3]); + fp2_mul(&M->m[1][2], &Gi[3].g00, &M->m[0][2]); + fp2_add(&M->m[1][2], &M->m[1][2], &tmp); + + fp2_mul(&tmp, &Gi[3].g11, &M->m[0][3]); + fp2_mul(&M->m[1][3], &Gi[3].g10, &M->m[0][2]); + fp2_add(&M->m[1][3], &M->m[1][3], &tmp); + + // compute the action of (K1_4.P1,0) for the third row + fp2_mul(&tmp, &Gi[0].g01, &M->m[0][2]); + fp2_mul(&M->m[2][0], &Gi[0].g00, &M->m[0][0]); + fp2_add(&M->m[2][0], &M->m[2][0], &tmp); + + fp2_mul(&tmp, &Gi[0].g01, &M->m[0][3]); + fp2_mul(&M->m[2][1], &Gi[0].g00, &M->m[0][1]); + fp2_add(&M->m[2][1], &M->m[2][1], &tmp); + + fp2_mul(&tmp, &Gi[0].g11, &M->m[0][2]); + fp2_mul(&M->m[2][2], &Gi[0].g10, &M->m[0][0]); + fp2_add(&M->m[2][2], &M->m[2][2], &tmp); + + fp2_mul(&tmp, &Gi[0].g11, &M->m[0][3]); + fp2_mul(&M->m[2][3], &Gi[0].g10, &M->m[0][1]); + fp2_add(&M->m[2][3], &M->m[2][3], &tmp); + + // compute the action of (K1_4.P1,K2_4.P2) for the final row + fp2_mul(&tmp, &Gi[0].g01, &M->m[1][2]); + fp2_mul(&M->m[3][0], &Gi[0].g00, &M->m[1][0]); + fp2_add(&M->m[3][0], &M->m[3][0], &tmp); + + fp2_mul(&tmp, &Gi[0].g01, &M->m[1][3]); + fp2_mul(&M->m[3][1], &Gi[0].g00, &M->m[1][1]); + fp2_add(&M->m[3][1], &M->m[3][1], &tmp); + + fp2_mul(&tmp, &Gi[0].g11, &M->m[1][2]); + fp2_mul(&M->m[3][2], &Gi[0].g10, &M->m[1][0]); + fp2_add(&M->m[3][2], &M->m[3][2], &tmp); + + fp2_mul(&tmp, &Gi[0].g11, &M->m[1][3]); + fp2_mul(&M->m[3][3], &Gi[0].g10, &M->m[1][1]); + fp2_add(&M->m[3][3], &M->m[3][3], &tmp); + + return 1; +} + +/** + * @brief Compute the gluing isogeny from an elliptic product + * + * @param out Output: the theta_gluing + * @param K1_8 a couple point + * @param E12 an elliptic curve product + * @param K2_8 a point in E2[8] + * + * out : E1xE2 -> A of kernel [4](K1_8,K2_8) + * if the kernel supplied has the incorrect order, or gluing seems malformed, + * returns 0, otherwise returns 1. + */ +static int +gluing_compute(theta_gluing_t *out, + const theta_couple_curve_t *E12, + const theta_couple_jac_point_t *xyK1_8, + const theta_couple_jac_point_t *xyK2_8, + bool verify) +{ + // Ensure that we have been given the eight torsion +#ifndef NDEBUG + { + int check = test_jac_order_twof(&xyK1_8->P1, &E12->E1, 3); + if (!check) + debug_print("xyK1_8->P1 does not have order 8"); + check = test_jac_order_twof(&xyK2_8->P1, &E12->E1, 3); + if (!check) + debug_print("xyK2_8->P1 does not have order 8"); + check = test_jac_order_twof(&xyK1_8->P2, &E12->E2, 3); + if (!check) + debug_print("xyK2_8->P1 does not have order 8"); + check = test_jac_order_twof(&xyK2_8->P2, &E12->E2, 3); + if (!check) + debug_print("xyK2_8->P2 does not have order 8"); + } +#endif + + out->xyK1_8 = *xyK1_8; + out->domain = *E12; + + // Given points in E[8] x E[8] we need the four torsion below + theta_couple_jac_point_t xyK1_4, xyK2_4; + + double_couple_jac_point(&xyK1_4, xyK1_8, E12); + double_couple_jac_point(&xyK2_4, xyK2_8, E12); + + // Convert from (X:Y:Z) coordinates to (X:Z) + theta_couple_point_t K1_8, K2_8; + theta_couple_point_t K1_4, K2_4; + + couple_jac_to_xz(&K1_8, xyK1_8); + couple_jac_to_xz(&K2_8, xyK2_8); + couple_jac_to_xz(&K1_4, &xyK1_4); + couple_jac_to_xz(&K2_4, &xyK2_4); + + // Set the basis change matrix, if we have not been given a valid K[8] for this computation + // gluing_change_of_basis will detect this and return 0 + if (!gluing_change_of_basis(&out->M, &K1_4, &K2_4, E12)) { + debug_print("gluing failed as kernel does not have correct order"); + return 0; + } + + // apply the base change to the kernel + theta_point_t TT1, TT2; + + base_change(&TT1, out, &K1_8); + base_change(&TT2, out, &K2_8); + + // compute the codomain + to_squared_theta(&TT1, &TT1); + to_squared_theta(&TT2, &TT2); + + // If the kernel is well formed then TT1.t and TT2.t are zero + // if they are not, we exit early as the signature we are validating + // is probably malformed + if (!(fp2_is_zero(&TT1.t) & fp2_is_zero(&TT2.t))) { + debug_print("gluing failed TT1.t or TT2.t is not zero"); + return 0; + } + // Test our projective factors are non zero + if (fp2_is_zero(&TT1.x) | fp2_is_zero(&TT2.x) | fp2_is_zero(&TT1.y) | fp2_is_zero(&TT2.z) | fp2_is_zero(&TT1.z)) + return 0; // invalid input + + // Projective factor: Ax + fp2_mul(&out->codomain.x, &TT1.x, &TT2.x); + fp2_mul(&out->codomain.y, &TT1.y, &TT2.x); + fp2_mul(&out->codomain.z, &TT1.x, &TT2.z); + fp2_set_zero(&out->codomain.t); + // Projective factor: ABCxz + fp2_mul(&out->precomputation.x, &TT1.y, &TT2.z); + fp2_copy(&out->precomputation.y, &out->codomain.z); + fp2_copy(&out->precomputation.z, &out->codomain.y); + fp2_set_zero(&out->precomputation.t); + + // Compute the two components of phi(K1_8) = (x:x:y:y). + fp2_mul(&out->imageK1_8.x, &TT1.x, &out->precomputation.x); + fp2_mul(&out->imageK1_8.y, &TT1.z, &out->precomputation.z); + + // If K1_8 and K2_8 are our 8-torsion points, this ensures that the + // 4-torsion points [2]K1_8 and [2]K2_8 are isotropic. + if (verify) { + fp2_t t1, t2; + fp2_mul(&t1, &TT1.y, &out->precomputation.y); + if (!fp2_is_equal(&out->imageK1_8.x, &t1)) + return 0; + fp2_mul(&t1, &TT2.x, &out->precomputation.x); + fp2_mul(&t2, &TT2.z, &out->precomputation.z); + if (!fp2_is_equal(&t2, &t1)) + return 0; + } + + // compute the final codomain + hadamard(&out->codomain, &out->codomain); + return 1; +} + +// sub routine of the gluing eval +static void +gluing_eval_point(theta_point_t *image, const theta_couple_jac_point_t *P, const theta_gluing_t *phi) +{ + theta_point_t T1, T2; + add_components_t add_comp1, add_comp2; + + // Compute the cross addition components of P1+Q1 and P2+Q2 + jac_to_xz_add_components(&add_comp1, &P->P1, &phi->xyK1_8.P1, &phi->domain.E1); + jac_to_xz_add_components(&add_comp2, &P->P2, &phi->xyK1_8.P2, &phi->domain.E2); + + // Compute T1 and T2 derived from the cross addition components. + fp2_mul(&T1.x, &add_comp1.u, &add_comp2.u); // T1x = u1u2 + fp2_mul(&T2.t, &add_comp1.v, &add_comp2.v); // T2t = v1v2 + fp2_add(&T1.x, &T1.x, &T2.t); // T1x = u1u2 + v1v2 + fp2_mul(&T1.y, &add_comp1.u, &add_comp2.w); // T1y = u1w2 + fp2_mul(&T1.z, &add_comp1.w, &add_comp2.u); // T1z = w1u2 + fp2_mul(&T1.t, &add_comp1.w, &add_comp2.w); // T1t = w1w2 + fp2_add(&T2.x, &add_comp1.u, &add_comp1.v); // T2x = (u1+v1) + fp2_add(&T2.y, &add_comp2.u, &add_comp2.v); // T2y = (u2+v2) + fp2_mul(&T2.x, &T2.x, &T2.y); // T2x = (u1+v1)(u2+v2) + fp2_sub(&T2.x, &T2.x, &T1.x); // T1x = v1u2 + u1v2 + fp2_mul(&T2.y, &add_comp1.v, &add_comp2.w); // T2y = v1w2 + fp2_mul(&T2.z, &add_comp1.w, &add_comp2.v); // T2z = w1v2 + fp2_set_zero(&T2.t); // T2t = 0 + + // Apply the basis change and compute their respective square + // theta(P+Q) = M.T1 - M.T2 and theta(P-Q) = M.T1 + M.T2 + apply_isomorphism_general(&T1, &phi->M, &T1, true); + apply_isomorphism_general(&T2, &phi->M, &T2, false); + pointwise_square(&T1, &T1); + pointwise_square(&T2, &T2); + + // the difference between the two is therefore theta(P+Q)theta(P-Q) + // whose hadamard transform is then the product of the dual + // theta_points of phi(P) and phi(Q). + fp2_sub(&T1.x, &T1.x, &T2.x); + fp2_sub(&T1.y, &T1.y, &T2.y); + fp2_sub(&T1.z, &T1.z, &T2.z); + fp2_sub(&T1.t, &T1.t, &T2.t); + hadamard(&T1, &T1); + + // Compute (x, y, z, t) + // As imageK1_8 = (x:x:y:y), its inverse is (y:y:x:x). + fp2_mul(&image->x, &T1.x, &phi->imageK1_8.y); + fp2_mul(&image->y, &T1.y, &phi->imageK1_8.y); + fp2_mul(&image->z, &T1.z, &phi->imageK1_8.x); + fp2_mul(&image->t, &T1.t, &phi->imageK1_8.x); + + hadamard(image, image); +} + +// Same as gluing_eval_point but in the very special case where we already know that the point will +// have a zero coordinate at the place where the zero coordinate of the dual_theta_nullpoint would +// have made the computation difficult +static int +gluing_eval_point_special_case(theta_point_t *image, const theta_couple_point_t *P, const theta_gluing_t *phi) +{ + theta_point_t T; + + // Apply the basis change + base_change(&T, phi, P); + + // Apply the to_squared_theta transform + to_squared_theta(&T, &T); + + // This coordinate should always be 0 in a gluing because D=0. + // If this is not the case, something went very wrong, so reject + if (!fp2_is_zero(&T.t)) + return 0; + + // Compute (x, y, z, t) + fp2_mul(&image->x, &T.x, &phi->precomputation.x); + fp2_mul(&image->y, &T.y, &phi->precomputation.y); + fp2_mul(&image->z, &T.z, &phi->precomputation.z); + fp2_set_zero(&image->t); + + hadamard(image, image); + return 1; +} + +/** + * @brief Evaluate a gluing isogeny from an elliptic product on a basis + * + * @param image1 Output: the theta_point of the image of the first couple of points + * @param image2 Output : the theta point of the image of the second couple of points + * @param xyT1: A pair of points (X : Y : Z) on E1E2 to glue using phi + * @param xyT2: A pair of points (X : Y : Z) on E1E2 to glue using phi + * @param phi : a gluing isogeny E1 x E2 -> A + * + **/ +static void +gluing_eval_basis(theta_point_t *image1, + theta_point_t *image2, + const theta_couple_jac_point_t *xyT1, + const theta_couple_jac_point_t *xyT2, + const theta_gluing_t *phi) +{ + gluing_eval_point(image1, xyT1, phi); + gluing_eval_point(image2, xyT2, phi); +} + +/** + * @brief Compute a (2,2) isogeny in dimension 2 in the theta_model + * + * @param out Output: the theta_isogeny + * @param A a theta null point for the domain + * @param T1_8 a point in A[8] + * @param T2_8 a point in A[8] + * @param hadamard_bool_1 a boolean used for the last two steps of the chain + * @param hadamard_bool_2 a boolean used for the last two steps of the chain + * + * out : A -> B of kernel [4](T1_8,T2_8) + * hadamard_bool_1 controls if the domain is in standard or dual coordinates + * hadamard_bool_2 controls if the codomain is in standard or dual coordinates + * verify: add extra sanity check to ensure our 8-torsion points are coherent with the isogeny + * + */ +static int +theta_isogeny_compute(theta_isogeny_t *out, + const theta_structure_t *A, + const theta_point_t *T1_8, + const theta_point_t *T2_8, + bool hadamard_bool_1, + bool hadamard_bool_2, + bool verify) +{ + out->hadamard_bool_1 = hadamard_bool_1; + out->hadamard_bool_2 = hadamard_bool_2; + out->domain = *A; + out->T1_8 = *T1_8; + out->T2_8 = *T2_8; + out->codomain.precomputation = false; + + theta_point_t TT1, TT2; + + if (hadamard_bool_1) { + hadamard(&TT1, T1_8); + to_squared_theta(&TT1, &TT1); + hadamard(&TT2, T2_8); + to_squared_theta(&TT2, &TT2); + } else { + to_squared_theta(&TT1, T1_8); + to_squared_theta(&TT2, T2_8); + } + + fp2_t t1, t2; + + // Test that our projective factor ABCDxzw is non zero, where + // TT1=(Ax, Bx, Cy, Dy), TT2=(Az, Bw, Cz, Dw) + // But ABCDxzw=0 can only happen if we had an unexpected splitting in + // the isogeny chain. + // In either case reject + // (this is not strictly necessary, we could just return (0:0:0:0)) + if (fp2_is_zero(&TT2.x) | fp2_is_zero(&TT2.y) | fp2_is_zero(&TT2.z) | fp2_is_zero(&TT2.t) | fp2_is_zero(&TT1.x) | + fp2_is_zero(&TT1.y)) + return 0; + + fp2_mul(&t1, &TT1.x, &TT2.y); + fp2_mul(&t2, &TT1.y, &TT2.x); + fp2_mul(&out->codomain.null_point.x, &TT2.x, &t1); + fp2_mul(&out->codomain.null_point.y, &TT2.y, &t2); + fp2_mul(&out->codomain.null_point.z, &TT2.z, &t1); + fp2_mul(&out->codomain.null_point.t, &TT2.t, &t2); + fp2_t t3; + fp2_mul(&t3, &TT2.z, &TT2.t); + fp2_mul(&out->precomputation.x, &t3, &TT1.y); + fp2_mul(&out->precomputation.y, &t3, &TT1.x); + fp2_copy(&out->precomputation.z, &out->codomain.null_point.t); + fp2_copy(&out->precomputation.t, &out->codomain.null_point.z); + + // If T1_8 and T2_8 are our 8-torsion points, this ensures that the + // 4-torsion points 2T1_8 and 2T2_8 are isotropic. + if (verify) { + fp2_mul(&t1, &TT1.x, &out->precomputation.x); + fp2_mul(&t2, &TT1.y, &out->precomputation.y); + if (!fp2_is_equal(&t1, &t2)) + return 0; + fp2_mul(&t1, &TT1.z, &out->precomputation.z); + fp2_mul(&t2, &TT1.t, &out->precomputation.t); + if (!fp2_is_equal(&t1, &t2)) + return 0; + fp2_mul(&t1, &TT2.x, &out->precomputation.x); + fp2_mul(&t2, &TT2.z, &out->precomputation.z); + if (!fp2_is_equal(&t1, &t2)) + return 0; + fp2_mul(&t1, &TT2.y, &out->precomputation.y); + fp2_mul(&t2, &TT2.t, &out->precomputation.t); + if (!fp2_is_equal(&t1, &t2)) + return 0; + } + + if (hadamard_bool_2) { + hadamard(&out->codomain.null_point, &out->codomain.null_point); + } + return 1; +} + +/** + * @brief Compute a (2,2) isogeny when only the 4 torsion above the kernel is known and not the 8 + * torsion + * + * @param out Output: the theta_isogeny + * @param A a theta null point for the domain + * @param T1_4 a point in A[4] + * @param T2_4 a point in A[4] + * @param hadamard_bool_1 a boolean + * @param hadamard_bool_2 a boolean + * + * out : A -> B of kernel [2](T1_4,T2_4) + * hadamard_bool_1 controls if the domain is in standard or dual coordinates + * hadamard_bool_2 controls if the codomain is in standard or dual coordinates + * + */ +static void +theta_isogeny_compute_4(theta_isogeny_t *out, + const theta_structure_t *A, + const theta_point_t *T1_4, + const theta_point_t *T2_4, + bool hadamard_bool_1, + bool hadamard_bool_2) +{ + out->hadamard_bool_1 = hadamard_bool_1; + out->hadamard_bool_2 = hadamard_bool_2; + out->domain = *A; + out->T1_8 = *T1_4; + out->T2_8 = *T2_4; + out->codomain.precomputation = false; + + theta_point_t TT1, TT2; + // we will compute: + // TT1 = (xAB, _ , xCD, _) + // TT2 = (AA,BB,CC,DD) + + // fp2_t xA_inv,zA_inv,tB_inv; + + if (hadamard_bool_1) { + hadamard(&TT1, T1_4); + to_squared_theta(&TT1, &TT1); + + hadamard(&TT2, &A->null_point); + to_squared_theta(&TT2, &TT2); + } else { + to_squared_theta(&TT1, T1_4); + to_squared_theta(&TT2, &A->null_point); + } + + fp2_t sqaabb, sqaacc; + fp2_mul(&sqaabb, &TT2.x, &TT2.y); + fp2_mul(&sqaacc, &TT2.x, &TT2.z); + // No need to check the square roots, only used for signing. + // sqaabb = sqrt(AA*BB) + fp2_sqrt(&sqaabb); + // sqaacc = sqrt(AA*CC) + fp2_sqrt(&sqaacc); + + // we compute out->codomain.null_point = (xAB * sqaacc * AA, xAB *sqaabb *sqaacc, xCD*sqaabb * + // AA) out->precomputation = (xAB * BB * CC *DD , sqaabb * CC * DD * xAB , sqaacc * BB* DD * xAB + // , xCD * sqaabb *sqaacc * BB) + + fp2_mul(&out->codomain.null_point.y, &sqaabb, &sqaacc); + fp2_mul(&out->precomputation.t, &out->codomain.null_point.y, &TT1.z); + fp2_mul(&out->codomain.null_point.y, &out->codomain.null_point.y, + &TT1.x); // done for out->codomain.null_point.y + + fp2_mul(&out->codomain.null_point.t, &TT1.z, &sqaabb); + fp2_mul(&out->codomain.null_point.t, &out->codomain.null_point.t, + &TT2.x); // done for out->codomain.null_point.t + + fp2_mul(&out->codomain.null_point.x, &TT1.x, &TT2.x); + fp2_mul(&out->codomain.null_point.z, &out->codomain.null_point.x, + &TT2.z); // done for out->codomain.null_point.z + fp2_mul(&out->codomain.null_point.x, &out->codomain.null_point.x, + &sqaacc); // done for out->codomain.null_point.x + + fp2_mul(&out->precomputation.x, &TT1.x, &TT2.t); + fp2_mul(&out->precomputation.z, &out->precomputation.x, &TT2.y); + fp2_mul(&out->precomputation.x, &out->precomputation.x, &TT2.z); + fp2_mul(&out->precomputation.y, &out->precomputation.x, &sqaabb); // done for out->precomputation.y + fp2_mul(&out->precomputation.x, &out->precomputation.x, &TT2.y); // done for out->precomputation.x + fp2_mul(&out->precomputation.z, &out->precomputation.z, &sqaacc); // done for out->precomputation.z + fp2_mul(&out->precomputation.t, &out->precomputation.t, &TT2.y); // done for out->precomputation.t + + if (hadamard_bool_2) { + hadamard(&out->codomain.null_point, &out->codomain.null_point); + } +} + +/** + * @brief Compute a (2,2) isogeny when only the kernel is known and not the 8 or 4 torsion above + * + * @param out Output: the theta_isogeny + * @param A a theta null point for the domain + * @param T1_2 a point in A[2] + * @param T2_2 a point in A[2] + * @param hadamard_bool_1 a boolean + * @param boo2 a boolean + * + * out : A -> B of kernel (T1_2,T2_2) + * hadamard_bool_1 controls if the domain is in standard or dual coordinates + * hadamard_bool_2 controls if the codomain is in standard or dual coordinates + * + */ +static void +theta_isogeny_compute_2(theta_isogeny_t *out, + const theta_structure_t *A, + const theta_point_t *T1_2, + const theta_point_t *T2_2, + bool hadamard_bool_1, + bool hadamard_bool_2) +{ + out->hadamard_bool_1 = hadamard_bool_1; + out->hadamard_bool_2 = hadamard_bool_2; + out->domain = *A; + out->T1_8 = *T1_2; + out->T2_8 = *T2_2; + out->codomain.precomputation = false; + + theta_point_t TT2; + // we will compute: + // TT2 = (AA,BB,CC,DD) + + if (hadamard_bool_1) { + hadamard(&TT2, &A->null_point); + to_squared_theta(&TT2, &TT2); + } else { + to_squared_theta(&TT2, &A->null_point); + } + + // we compute out->codomain.null_point = (AA,sqaabb, sqaacc, sqaadd) + // out->precomputation = ( BB * CC *DD , sqaabb * CC * DD , sqaacc * BB* DD , sqaadd * BB * CC) + fp2_copy(&out->codomain.null_point.x, &TT2.x); + fp2_mul(&out->codomain.null_point.y, &TT2.x, &TT2.y); + fp2_mul(&out->codomain.null_point.z, &TT2.x, &TT2.z); + fp2_mul(&out->codomain.null_point.t, &TT2.x, &TT2.t); + // No need to check the square roots, only used for signing. + fp2_sqrt(&out->codomain.null_point.y); + fp2_sqrt(&out->codomain.null_point.z); + fp2_sqrt(&out->codomain.null_point.t); + + fp2_mul(&out->precomputation.x, &TT2.z, &TT2.t); + fp2_mul(&out->precomputation.y, + &out->precomputation.x, + &out->codomain.null_point.y); // done for out->precomputation.y + fp2_mul(&out->precomputation.x, &out->precomputation.x, &TT2.y); // done for out->precomputation.x + fp2_mul(&out->precomputation.z, &TT2.t, &out->codomain.null_point.z); + fp2_mul(&out->precomputation.z, &out->precomputation.z, &TT2.y); // done for out->precomputation.z + fp2_mul(&out->precomputation.t, &TT2.z, &out->codomain.null_point.t); + fp2_mul(&out->precomputation.t, &out->precomputation.t, &TT2.y); // done for out->precomputation.t + + if (hadamard_bool_2) { + hadamard(&out->codomain.null_point, &out->codomain.null_point); + } +} + +static void +theta_isogeny_eval(theta_point_t *out, const theta_isogeny_t *phi, const theta_point_t *P) +{ + if (phi->hadamard_bool_1) { + hadamard(out, P); + to_squared_theta(out, out); + } else { + to_squared_theta(out, P); + } + fp2_mul(&out->x, &out->x, &phi->precomputation.x); + fp2_mul(&out->y, &out->y, &phi->precomputation.y); + fp2_mul(&out->z, &out->z, &phi->precomputation.z); + fp2_mul(&out->t, &out->t, &phi->precomputation.t); + + if (phi->hadamard_bool_2) { + hadamard(out, out); + } +} + +#if defined(ENABLE_SIGN) +// Sample a random secret index in [0, 5] to select one of the 6 normalisation +// matrices for the normalisation of the output of the (2,2)-chain during +// splitting +static unsigned char +sample_random_index(void) +{ + // To avoid bias in reduction we should only consider integers smaller + // than 2^32 which are a multiple of 6, so we only reduce bytes with a + // value in [0, 4294967292-1]. + // We have 4294967292/2^32 = ~99.9999999% chance that the first try is "good". + unsigned char seed_arr[4]; + uint32_t seed; + + do { + randombytes(seed_arr, 4); + seed = (seed_arr[0] | (seed_arr[1] << 8) | (seed_arr[2] << 16) | (seed_arr[3] << 24)); + } while (seed >= 4294967292U); + + uint32_t secret_index = seed - (((uint64_t)seed * 2863311531U) >> 34) * 6; + assert(secret_index == seed % 6); // ensure the constant time trick above works + return (unsigned char)secret_index; +} +#endif + +static bool +splitting_compute(theta_splitting_t *out, const theta_structure_t *A, int zero_index, bool randomize) + +{ + // init + uint32_t ctl; + uint32_t count = 0; + fp2_t U_cst, t1, t2; + + memset(&out->M, 0, sizeof(basis_change_matrix_t)); + + // enumerate through all indices + for (int i = 0; i < 10; i++) { + fp2_set_zero(&U_cst); + for (int t = 0; t < 4; t++) { + // Iterate through the null point + choose_index_theta_point(&t2, t, &A->null_point); + choose_index_theta_point(&t1, t ^ EVEN_INDEX[i][1], &A->null_point); + + // Compute t1 * t2 + fp2_mul(&t1, &t1, &t2); + // If CHI_EVAL(i,t) is +1 we want ctl to be 0 and + // If CHI_EVAL(i,t) is -1 we want ctl to be 0xFF..FF + ctl = (uint32_t)(CHI_EVAL[EVEN_INDEX[i][0]][t] >> 1); + assert(ctl == 0 || ctl == 0xffffffff); + + fp2_neg(&t2, &t1); + fp2_select(&t1, &t1, &t2, ctl); + + // Then we compute U_cst ± (t1 * t2) + fp2_add(&U_cst, &U_cst, &t1); + } + + // If U_cst is 0 then update the splitting matrix + ctl = fp2_is_zero(&U_cst); + count -= ctl; + select_base_change_matrix(&out->M, &out->M, &SPLITTING_TRANSFORMS[i], ctl); + if (zero_index != -1 && i == zero_index && + !ctl) { // extra checks if we know exactly where the 0 index should be + return 0; + } + } + +#if defined(ENABLE_SIGN) + // Pick a random normalization matrix + if (randomize) { + unsigned char secret_index = sample_random_index(); + basis_change_matrix_t Mrandom; + + set_base_change_matrix_from_precomp(&Mrandom, &NORMALIZATION_TRANSFORMS[0]); + + // Use a constant time selection to pick the index we want + for (unsigned char i = 1; i < 6; i++) { + // When i == secret_index, mask == 0 and 0xFF..FF otherwise + int32_t mask = i - secret_index; + mask = (mask | -mask) >> 31; + select_base_change_matrix(&Mrandom, &Mrandom, &NORMALIZATION_TRANSFORMS[i], ~mask); + } + base_change_matrix_multiplication(&out->M, &Mrandom, &out->M); + } +#else + assert(!randomize); +#endif + + // apply the isomorphism to ensure the null point is compatible with splitting + apply_isomorphism(&out->B.null_point, &out->M, &A->null_point); + + // splitting was successful only if exactly one zero was identified + return count == 1; +} + +static int +theta_product_structure_to_elliptic_product(theta_couple_curve_t *E12, theta_structure_t *A) +{ + fp2_t xx, yy; + + // This should be true from our computations in splitting_compute + // but still check this for sanity + if (!is_product_theta_point(&A->null_point)) + return 0; + + ec_curve_init(&(E12->E1)); + ec_curve_init(&(E12->E2)); + + // A valid elliptic theta null point has no zero coordinate + if (fp2_is_zero(&A->null_point.x) | fp2_is_zero(&A->null_point.y) | fp2_is_zero(&A->null_point.z)) + return 0; + + // xx = x², yy = y² + fp2_sqr(&xx, &A->null_point.x); + fp2_sqr(&yy, &A->null_point.y); + // xx = x^4, yy = y^4 + fp2_sqr(&xx, &xx); + fp2_sqr(&yy, &yy); + + // A2 = -2(x^4+y^4)/(x^4-y^4) + fp2_add(&E12->E2.A, &xx, &yy); + fp2_sub(&E12->E2.C, &xx, &yy); + fp2_add(&E12->E2.A, &E12->E2.A, &E12->E2.A); + fp2_neg(&E12->E2.A, &E12->E2.A); + + // same with x,z + fp2_sqr(&xx, &A->null_point.x); + fp2_sqr(&yy, &A->null_point.z); + fp2_sqr(&xx, &xx); + fp2_sqr(&yy, &yy); + + // A1 = -2(x^4+z^4)/(x^4-z^4) + fp2_add(&E12->E1.A, &xx, &yy); + fp2_sub(&E12->E1.C, &xx, &yy); + fp2_add(&E12->E1.A, &E12->E1.A, &E12->E1.A); + fp2_neg(&E12->E1.A, &E12->E1.A); + + if (fp2_is_zero(&E12->E1.C) | fp2_is_zero(&E12->E2.C)) + return 0; + + return 1; +} + +static int +theta_point_to_montgomery_point(theta_couple_point_t *P12, const theta_point_t *P, const theta_structure_t *A) +{ + fp2_t temp; + const fp2_t *x, *z; + + if (!is_product_theta_point(P)) + return 0; + + x = &P->x; + z = &P->y; + if (fp2_is_zero(x) & fp2_is_zero(z)) { + x = &P->z; + z = &P->t; + } + if (fp2_is_zero(x) & fp2_is_zero(z)) { + return 0; // at this point P=(0:0:0:0) so is invalid + } + // P2.X = A.null_point.y * P.x + A.null_point.x * P.y + // P2.Z = - A.null_point.y * P.x + A.null_point.x * P.y + fp2_mul(&P12->P2.x, &A->null_point.y, x); + fp2_mul(&temp, &A->null_point.x, z); + fp2_sub(&P12->P2.z, &temp, &P12->P2.x); + fp2_add(&P12->P2.x, &P12->P2.x, &temp); + + x = &P->x; + z = &P->z; + if (fp2_is_zero(x) & fp2_is_zero(z)) { + x = &P->y; + z = &P->t; + } + // P1.X = A.null_point.z * P.x + A.null_point.x * P.z + // P1.Z = -A.null_point.z * P.x + A.null_point.x * P.z + fp2_mul(&P12->P1.x, &A->null_point.z, x); + fp2_mul(&temp, &A->null_point.x, z); + fp2_sub(&P12->P1.z, &temp, &P12->P1.x); + fp2_add(&P12->P1.x, &P12->P1.x, &temp); + return 1; +} + +static int +_theta_chain_compute_impl(unsigned n, + theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP, + bool verify, + bool randomize) +{ + theta_structure_t theta; + + // lift the basis + theta_couple_jac_point_t xyT1, xyT2; + + ec_basis_t bas1 = { .P = ker->T1.P1, .Q = ker->T2.P1, .PmQ = ker->T1m2.P1 }; + ec_basis_t bas2 = { .P = ker->T1.P2, .Q = ker->T2.P2, .PmQ = ker->T1m2.P2 }; + if (!lift_basis(&xyT1.P1, &xyT2.P1, &bas1, &E12->E1)) + return 0; + if (!lift_basis(&xyT1.P2, &xyT2.P2, &bas2, &E12->E2)) + return 0; + + const unsigned extra = HD_extra_torsion * extra_torsion; + +#ifndef NDEBUG + assert(extra == 0 || extra == 2); // only cases implemented + if (!test_point_order_twof(&bas2.P, &E12->E2, n + extra)) + debug_print("bas2.P does not have correct order"); + + if (!test_jac_order_twof(&xyT2.P2, &E12->E2, n + extra)) + debug_print("xyT2.P2 does not have correct order"); +#endif + + theta_point_t pts[numP ? numP : 1]; + + int space = 1; + for (unsigned i = 1; i < n; i *= 2) + ++space; + + uint16_t todo[space]; + todo[0] = n - 2 + extra; + + int current = 0; + + // kernel points for the gluing isogeny + theta_couple_jac_point_t jacQ1[space], jacQ2[space]; + jacQ1[0] = xyT1; + jacQ2[0] = xyT2; + while (todo[current] != 1) { + assert(todo[current] >= 2); + ++current; + assert(current < space); + // the gluing isogeny is quite a bit more expensive than the others, + // so we adjust the usual splitting rule here a little bit: towards + // the end of the doubling chain it will be cheaper to recompute the + // doublings after evaluation than to push the intermediate points. + const unsigned num_dbls = todo[current - 1] >= 16 ? todo[current - 1] / 2 : todo[current - 1] - 1; + assert(num_dbls && num_dbls < todo[current - 1]); + double_couple_jac_point_iter(&jacQ1[current], num_dbls, &jacQ1[current - 1], E12); + double_couple_jac_point_iter(&jacQ2[current], num_dbls, &jacQ2[current - 1], E12); + todo[current] = todo[current - 1] - num_dbls; + } + + // kernel points for the remaining isogeny steps + theta_point_t thetaQ1[space], thetaQ2[space]; + + // the gluing step + theta_gluing_t first_step; + { + assert(todo[current] == 1); + + // compute the gluing isogeny + if (!gluing_compute(&first_step, E12, &jacQ1[current], &jacQ2[current], verify)) + return 0; + + // evaluate + for (unsigned j = 0; j < numP; ++j) { + assert(ec_is_zero(&P12[j].P1) || ec_is_zero(&P12[j].P2)); + if (!gluing_eval_point_special_case(&pts[j], &P12[j], &first_step)) + return 0; + } + + // push kernel points through gluing isogeny + for (int j = 0; j < current; ++j) { + gluing_eval_basis(&thetaQ1[j], &thetaQ2[j], &jacQ1[j], &jacQ2[j], &first_step); + --todo[j]; + } + + --current; + } + + // set-up the theta_structure for the first codomain + theta.null_point = first_step.codomain; + theta.precomputation = 0; + theta_precomputation(&theta); + + theta_isogeny_t step; + + // and now we do the remaining steps + for (unsigned i = 1; current >= 0 && todo[current]; ++i) { + assert(current < space); + while (todo[current] != 1) { + assert(todo[current] >= 2); + ++current; + assert(current < space); + const unsigned num_dbls = todo[current - 1] / 2; + assert(num_dbls && num_dbls < todo[current - 1]); + double_iter(&thetaQ1[current], &theta, &thetaQ1[current - 1], num_dbls); + double_iter(&thetaQ2[current], &theta, &thetaQ2[current - 1], num_dbls); + todo[current] = todo[current - 1] - num_dbls; + } + + // computing the next step + int ret; + if (i == n - 2) // penultimate step + ret = theta_isogeny_compute(&step, &theta, &thetaQ1[current], &thetaQ2[current], 0, 0, verify); + else if (i == n - 1) // ultimate step + ret = theta_isogeny_compute(&step, &theta, &thetaQ1[current], &thetaQ2[current], 1, 0, false); + else + ret = theta_isogeny_compute(&step, &theta, &thetaQ1[current], &thetaQ2[current], 0, 1, verify); + if (!ret) + return 0; + + for (unsigned j = 0; j < numP; ++j) + theta_isogeny_eval(&pts[j], &step, &pts[j]); + + // updating the codomain + theta = step.codomain; + + // pushing the kernel + assert(todo[current] == 1); + for (int j = 0; j < current; ++j) { + theta_isogeny_eval(&thetaQ1[j], &step, &thetaQ1[j]); + theta_isogeny_eval(&thetaQ2[j], &step, &thetaQ2[j]); + assert(todo[j]); + --todo[j]; + } + + --current; + } + + assert(current == -1); + + if (!extra_torsion) { + if (n >= 3) { + // in the last step we've skipped pushing the kernel since current was == 0, let's do it now + theta_isogeny_eval(&thetaQ1[0], &step, &thetaQ1[0]); + theta_isogeny_eval(&thetaQ2[0], &step, &thetaQ2[0]); + } + + // penultimate step + theta_isogeny_compute_4(&step, &theta, &thetaQ1[0], &thetaQ2[0], 0, 0); + for (unsigned j = 0; j < numP; ++j) + theta_isogeny_eval(&pts[j], &step, &pts[j]); + theta = step.codomain; + theta_isogeny_eval(&thetaQ1[0], &step, &thetaQ1[0]); + theta_isogeny_eval(&thetaQ2[0], &step, &thetaQ2[0]); + + // ultimate step + theta_isogeny_compute_2(&step, &theta, &thetaQ1[0], &thetaQ2[0], 1, 0); + for (unsigned j = 0; j < numP; ++j) + theta_isogeny_eval(&pts[j], &step, &pts[j]); + theta = step.codomain; + } + + // final splitting step + theta_splitting_t last_step; + + bool is_split = splitting_compute(&last_step, &theta, extra_torsion ? 8 : -1, randomize); + + if (!is_split) { + debug_print("kernel did not generate an isogeny between elliptic products"); + return 0; + } + + if (!theta_product_structure_to_elliptic_product(E34, &last_step.B)) + return 0; + + // evaluate + for (size_t j = 0; j < numP; ++j) { + apply_isomorphism(&pts[j], &last_step.M, &pts[j]); + if (!theta_point_to_montgomery_point(&P12[j], &pts[j], &last_step.B)) + return 0; + } + + return 1; +} + +int +theta_chain_compute_and_eval(unsigned n, + /*const*/ theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP) +{ + return _theta_chain_compute_impl(n, E12, ker, extra_torsion, E34, P12, numP, false, false); +} + +// Like theta_chain_compute_and_eval, adding extra verification checks; +// used in the signature verification +int +theta_chain_compute_and_eval_verify(unsigned n, + /*const*/ theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP) +{ + return _theta_chain_compute_impl(n, E12, ker, extra_torsion, E34, P12, numP, true, false); +} + +int +theta_chain_compute_and_eval_randomized(unsigned n, + /*const*/ theta_couple_curve_t *E12, + const theta_kernel_couple_points_t *ker, + bool extra_torsion, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP) +{ + return _theta_chain_compute_impl(n, E12, ker, extra_torsion, E34, P12, numP, false, true); +} diff --git a/src/hd/ref/lvlx/theta_isogenies.h b/src/hd/ref/lvlx/theta_isogenies.h new file mode 100644 index 0000000..d151811 --- /dev/null +++ b/src/hd/ref/lvlx/theta_isogenies.h @@ -0,0 +1,18 @@ +/** @file + * + * @authors Antonin Leroux + * + * @brief the theta isogeny header + */ + +#ifndef THETA_ISOGENY_H +#define THETA_ISOGENY_H + +#include +#include +#include +#include "theta_structure.h" +#include +#include + +#endif diff --git a/src/hd/ref/lvlx/theta_structure.c b/src/hd/ref/lvlx/theta_structure.c new file mode 100644 index 0000000..ce97ac6 --- /dev/null +++ b/src/hd/ref/lvlx/theta_structure.c @@ -0,0 +1,78 @@ +#include "theta_structure.h" +#include + +void +theta_precomputation(theta_structure_t *A) +{ + + if (A->precomputation) { + return; + } + + theta_point_t A_dual; + to_squared_theta(&A_dual, &A->null_point); + + fp2_t t1, t2; + fp2_mul(&t1, &A_dual.x, &A_dual.y); + fp2_mul(&t2, &A_dual.z, &A_dual.t); + fp2_mul(&A->XYZ0, &t1, &A_dual.z); + fp2_mul(&A->XYT0, &t1, &A_dual.t); + fp2_mul(&A->YZT0, &t2, &A_dual.y); + fp2_mul(&A->XZT0, &t2, &A_dual.x); + + fp2_mul(&t1, &A->null_point.x, &A->null_point.y); + fp2_mul(&t2, &A->null_point.z, &A->null_point.t); + fp2_mul(&A->xyz0, &t1, &A->null_point.z); + fp2_mul(&A->xyt0, &t1, &A->null_point.t); + fp2_mul(&A->yzt0, &t2, &A->null_point.y); + fp2_mul(&A->xzt0, &t2, &A->null_point.x); + + A->precomputation = true; +} + +void +double_point(theta_point_t *out, theta_structure_t *A, const theta_point_t *in) +{ + to_squared_theta(out, in); + fp2_sqr(&out->x, &out->x); + fp2_sqr(&out->y, &out->y); + fp2_sqr(&out->z, &out->z); + fp2_sqr(&out->t, &out->t); + + if (!A->precomputation) { + theta_precomputation(A); + } + fp2_mul(&out->x, &out->x, &A->YZT0); + fp2_mul(&out->y, &out->y, &A->XZT0); + fp2_mul(&out->z, &out->z, &A->XYT0); + fp2_mul(&out->t, &out->t, &A->XYZ0); + + hadamard(out, out); + + fp2_mul(&out->x, &out->x, &A->yzt0); + fp2_mul(&out->y, &out->y, &A->xzt0); + fp2_mul(&out->z, &out->z, &A->xyt0); + fp2_mul(&out->t, &out->t, &A->xyz0); +} + +void +double_iter(theta_point_t *out, theta_structure_t *A, const theta_point_t *in, int exp) +{ + if (exp == 0) { + *out = *in; + } else { + double_point(out, A, in); + for (int i = 1; i < exp; i++) { + double_point(out, A, out); + } + } +} + +uint32_t +is_product_theta_point(const theta_point_t *P) +{ + fp2_t t1, t2; + fp2_mul(&t1, &P->x, &P->t); + fp2_mul(&t2, &P->y, &P->z); + return fp2_is_equal(&t1, &t2); +} diff --git a/src/hd/ref/lvlx/theta_structure.h b/src/hd/ref/lvlx/theta_structure.h new file mode 100644 index 0000000..fc630b7 --- /dev/null +++ b/src/hd/ref/lvlx/theta_structure.h @@ -0,0 +1,135 @@ +/** @file + * + * @authors Antonin Leroux + * + * @brief the theta structure header + */ + +#ifndef THETA_STRUCTURE_H +#define THETA_STRUCTURE_H + +#include +#include +#include + +/** @internal + * @ingroup hd_module + * @defgroup hd_theta Functions for theta structures + * @{ + */ + +/** + * @brief Perform the hadamard transform on a theta point + * + * @param out Output: the theta_point + * @param in a theta point* + * in = (x,y,z,t) + * out = (x+y+z+t, x-y+z-t, x+y-z-t, x-y-z+t) + * + */ +static inline void +hadamard(theta_point_t *out, const theta_point_t *in) +{ + fp2_t t1, t2, t3, t4; + + // t1 = x + y + fp2_add(&t1, &in->x, &in->y); + // t2 = x - y + fp2_sub(&t2, &in->x, &in->y); + // t3 = z + t + fp2_add(&t3, &in->z, &in->t); + // t4 = z - t + fp2_sub(&t4, &in->z, &in->t); + + fp2_add(&out->x, &t1, &t3); + fp2_add(&out->y, &t2, &t4); + fp2_sub(&out->z, &t1, &t3); + fp2_sub(&out->t, &t2, &t4); +} + +/** + * @brief Square the coordinates of a theta point + * @param out Output: the theta_point + * @param in a theta point* + * in = (x,y,z,t) + * out = (x^2, y^2, z^2, t^2) + * + */ +static inline void +pointwise_square(theta_point_t *out, const theta_point_t *in) +{ + fp2_sqr(&out->x, &in->x); + fp2_sqr(&out->y, &in->y); + fp2_sqr(&out->z, &in->z); + fp2_sqr(&out->t, &in->t); +} + +/** + * @brief Square the coordinates and then perform the hadamard transform + * + * @param out Output: the theta_point + * @param in a theta point* + * in = (x,y,z,t) + * out = (x^2+y^2+z^2+t^2, x^2-y^2+z^2-t^2, x^2+y^2-z^2-t^2, x^2-y^2-z^2+t^2) + * + */ +static inline void +to_squared_theta(theta_point_t *out, const theta_point_t *in) +{ + pointwise_square(out, in); + hadamard(out, out); +} + +/** + * @brief Perform the theta structure precomputation + * + * @param A Output: the theta_structure + * + * if A.null_point = (x,y,z,t) + * if (xx,yy,zz,tt) = to_squared_theta(A.null_point) + * Computes y0,z0,t0,Y0,Z0,T0 = x/y,x/z,x/t,XX/YY,XX/ZZ,XX/TT + * + */ +void theta_precomputation(theta_structure_t *A); + +/** + * @brief Compute the double of the theta point in on the theta struc A + * + * @param out Output: the theta_point + * @param A a theta structure + * @param in a theta point in the theta structure A + * in = (x,y,z,t) + * out = [2] (x,y,z,t) + * /!\ assumes that no coordinates is zero and that the precomputation of A has been done + * + */ +void double_point(theta_point_t *out, theta_structure_t *A, const theta_point_t *in); + +/** + * @brief Compute the iterated double of the theta point in on the theta struc A + * + * @param out Output: the theta_point + * @param A a theta structure + * @param in a theta point in the theta structure A + * @param exp the exponent + * in = (x,y,z,t) + * out = [2^2] (x,y,z,t) + * /!\ assumes that no coordinates is zero and that the precomputation of A has been done + * + */ +void double_iter(theta_point_t *out, theta_structure_t *A, const theta_point_t *in, int exp); + +/* + * @brief Check if a theta point is a product theta point + * + * @param P a theta point + * @return 0xFFFFFFFF if true, zero otherwise + */ +uint32_t is_product_theta_point(const theta_point_t *P); + +// end hd_theta +/** + * @} + */ + +#endif diff --git a/src/id2iso/ref/CMakeLists.txt b/src/id2iso/ref/CMakeLists.txt index 1f66b59..d0ba315 100644 --- a/src/id2iso/ref/CMakeLists.txt +++ b/src/id2iso/ref/CMakeLists.txt @@ -1,3 +1,3 @@ -set(ID2ISOX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/id2isox) +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/id2iso/ref/id2isox/id2iso.c b/src/id2iso/ref/id2isox/id2iso.c deleted file mode 100644 index 5b60322..0000000 --- a/src/id2iso/ref/id2isox/id2iso.c +++ /dev/null @@ -1,1096 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -static __inline__ uint64_t rdtsc(void) -{ - return (uint64_t) cpucycles(); -} - -static int test_point_order_twof(ec_point_t *P, ec_curve_t *E) { - ec_point_t test = *P; - assert(!fp2_is_zero(&test.z)); - for (int i = 0;i=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -static void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} - -static void point_print(char *name, ec_point_t P){ - fp2_t a; - if(fp2_is_zero(&P.z)){ - printf("%s = INF\n", name); - } - else{ - fp2_copy(&a, &P.z); - fp2_inv(&a); - fp2_mul(&a, &a, &P.x); - fp2_print(name, a); - } -} -//XXX - -void id2iso_long_two_isog_init(id2iso_long_two_isog_t *isog, const size_t length) -{ - isog->length = length; - isog->chain = malloc(length * sizeof(*isog->chain)); -} - -void id2iso_long_two_isog_finalize(id2iso_long_two_isog_t *isog) -{ - free(isog->chain); -} - -void id2iso_compressed_long_two_isog_init(id2iso_compressed_long_two_isog_t *zip, const size_t length) -{ - zip->length = length; - zip->zip_chain = malloc(length * sizeof(*zip->zip_chain)); - for (size_t i = 0; i < length; ++i) - ibz_init(&zip->zip_chain[i]); -} - -void id2iso_compressed_long_two_isog_finalize(id2iso_compressed_long_two_isog_t *zip) -{ - for (size_t i = 0; i < zip->length; ++i) - ibz_finalize(&zip->zip_chain[i]); - free(zip->zip_chain); -} - -/** - * @brief evaluation of an endomorphism beta of norm dividing T² on the 2^f torsion - * - * @param action_matrix Output : the matrix of the action - * @param ideal_beta_L : a left O0-ideal for the left part of the endomorphism - * @param ideal_beta_R : a left 00-ideal for the right part of the endomorphism - * @param trace : the trace of the endomorphism mod 2^f - * @param Bpoo : the quaternion algebra - * @param domain : the starting curve - * @param basis_minus : odd torsion basis - * @param basis_plus : odd torsion basis - * @param two_basis : a basis of the 2^f torsion - * @param ibz_two_f : the value of 2^f - * @returns a bit indicating if the computation succeeded - * the matrix given in output correspond to the action of the endomorphism beta on the 2^f torsion - * the trace is used to lift the sign ambiguity - */ -void endomorphism_evaluation(ibz_mat_2x2_t *action_matrix, const quat_left_ideal_t *ideal_beta_L, const quat_left_ideal_t *ideal_beta_R, const ibz_t *trace, const quat_alg_t *Bpoo, const ec_curve_t *domain, const ec_basis_t *basis_minus, const ec_basis_t *basis_plus, const ec_basis_t *two_basis,const ibz_t *ibz_two_f) { - - // var dec - ec_isog_odd_t isog_beta_L,isog_beta_R; - ec_basis_t basis_R;ec_point_t basis_L[2]; - ec_curve_t codomain_L,codomain_R; - ec_isom_t isom; - digit_t x1[NWORDS_ORDER] = {0},x2[NWORDS_ORDER] = {0},x3[NWORDS_ORDER] = {0},x4[NWORDS_ORDER] = {0}; - ibz_t i1,i2,i3,i4,trace_temp; - ibz_init(&i1);ibz_init(&i2);ibz_init(&i3);ibz_init(&i4);ibz_init(&trace_temp); - - // translate the ideals ideal_beta_R[ind] and ideal_beta_L[ind] to isogenies - id2iso_ideal_to_isogeny_odd(&isog_beta_L,domain,basis_plus,basis_minus,ideal_beta_L); - id2iso_ideal_to_isogeny_odd(&isog_beta_R,domain,basis_plus,basis_minus,ideal_beta_R); - - // init of points and basis - basis_R = *two_basis; - basis_L[0] = two_basis->P; - basis_L[1] = two_basis->Q; - - codomain_R = *domain; - codomain_L = *domain; - assert(test_point_order_twof(&basis_R.Q,&codomain_R)); - assert(test_point_order_twof(&basis_R.PmQ,&codomain_R)); - assert(test_point_order_twof(&basis_R.P,&codomain_R)); - assert(test_point_order_twof(&basis_L[0],&codomain_L)); - - // evaluation of the 2^f basis - // evaluating the right isogeny on the full basis - ec_eval_odd_basis(&codomain_R,&isog_beta_R,&basis_R,1); - - // evaluation the left isogeny on the incomplete basis - ec_eval_odd(&codomain_L,&isog_beta_L,basis_L,2); - - // checking that the points still have the correct order - assert(test_point_order_twof(&basis_L[0],&codomain_L)); - - // for debug, we check that the two codomains are isomorphic - #ifndef NDEBUG - fp2_t j_R,j_L; - ec_j_inv(&j_R, &codomain_R); - ec_j_inv(&j_L, &codomain_L); - assert(fp2_is_equal(&j_R,&j_L)); - #endif - - // computing the isomorphism - ec_isomorphism(&isom, &codomain_L, &codomain_R); - - // applying the isomorphism - ec_iso_eval(&basis_L[0],&isom); - ec_iso_eval(&basis_L[1],&isom); - - assert(test_point_order_twof(&basis_L[1],&codomain_R)); - assert(test_point_order_twof(&basis_R.P,&codomain_R)); - assert(test_point_order_twof(&basis_R.Q,&codomain_R)); - assert(test_point_order_twof(&basis_R.PmQ,&codomain_R)); - assert(ec_is_on_curve(&codomain_R,&basis_R.P)); - assert(ec_is_on_curve(&codomain_R,&basis_R.Q)); - assert(ec_is_on_curve(&codomain_R,&basis_R.PmQ)); - assert(ec_is_on_curve(&codomain_R,&basis_L[0])); - - // DLP step - // we do the DLP and get the result up to sign - // first DLP - assert(test_point_order_twof(&basis_L[0],&codomain_R)); - ec_dlog_2(x1,x2,&basis_R,&basis_L[0],&codomain_R); - - // copying the digits - ibz_copy_digit_array(&i2,x2); - ibz_copy_digit_array(&i1,x1); - - // second DLP - ec_dlog_2(x3,x4,&basis_R,&basis_L[1],&codomain_R); - - //copyting the digits - ibz_copy_digit_array(&i3,x3); - ibz_copy_digit_array(&i4,x4); - - #ifndef NDEBUG - ec_point_t test; - ec_biscalar_mul(&test,&codomain_R,x1,x2,&basis_R); - assert(ec_is_equal(&test,&basis_L[0])); - ec_biscalar_mul(&test,&codomain_R,x3,x4,&basis_R); - assert(ec_is_equal(&test,&basis_L[1])); - #endif - - - ibz_copy_digit_array(&i1,x1); - ibz_copy_digit_array(&i2,x2); - ibz_copy_digit_array(&i3,x3); - ibz_copy_digit_array(&i4,x4); - - // multiplication by the norm of ideal_beta_R - ibz_mul(&i1,&i1,&ideal_beta_R->norm); - ibz_mul(&i2,&i2,&ideal_beta_R->norm); - ibz_mul(&i3,&i3,&ideal_beta_R->norm); - ibz_mul(&i4,&i4,&ideal_beta_R->norm); - - // computation mod 2^f - ibz_mod(&i1,&i1,ibz_two_f); - ibz_mod(&i2,&i2,ibz_two_f); - ibz_mod(&i3,&i3,ibz_two_f); - ibz_mod(&i4,&i4,ibz_two_f); - - // compute the trace - ibz_add(&trace_temp,&i1,&i4); - ibz_mod(&trace_temp,&trace_temp,ibz_two_f); - - if (ibz_cmp(&trace_temp,trace)!=0){ - ibz_neg(&i1,&i1); - ibz_neg(&i2,&i2); - ibz_mod(&i1,&i1,ibz_two_f); - ibz_mod(&i2,&i2,ibz_two_f); - ibz_add(&trace_temp,&i1,&i4); - ibz_mod(&trace_temp,&trace_temp,ibz_two_f); - if (ibz_cmp(&trace_temp,trace)!=0) { - ibz_neg(&i4,&i4); - ibz_neg(&i3,&i3); - ibz_mod(&i4,&i4,ibz_two_f); - ibz_mod(&i3,&i3,ibz_two_f); - ibz_add(&trace_temp,&i1,&i4); - ibz_mod(&trace_temp,&trace_temp,ibz_two_f); - if (ibz_cmp(trace,&trace_temp)!=0) { - ibz_neg(&i1,&i1); - ibz_neg(&i2,&i2); - ibz_mod(&i1,&i1,ibz_two_f); - ibz_mod(&i2,&i2,ibz_two_f); - ibz_add(&trace_temp,&i1,&i4); - ibz_mod(&trace_temp,&trace_temp,ibz_two_f); - } - } - } - // for debug checking final equality - assert(0==ibz_cmp(&trace_temp,trace)); - - // we have the correct values, now we can copy the output - ibz_copy(&(*action_matrix)[0][0],&i1); - ibz_copy(&(*action_matrix)[0][1],&i2); - ibz_copy(&(*action_matrix)[1][0],&i3); - ibz_copy(&(*action_matrix)[1][1],&i4); - - - // var finalize - ibz_finalize(&i1);ibz_finalize(&i2);ibz_finalize(&i3);ibz_finalize(&i4); - ibz_finalize(&trace_temp); - -} - - -/** - * @brief Translating an ideal of norm a big power of 2 into the corresponding isogeny - * - * @param isog_zip Output : compression of the output isogeny - * @param basis_minus : odd torsion basis (in the end, this will be the basis pushed through the output isogeny) - * @param basis_plus : odd torsion basis (in the end, this will be the basis pushed through the output isogeny) - * @param domain : the starting curve (in the end, this will be the codomain of the output isogeny) - * @param kernel_dual : the dual of the kernel of the last step of isog_start_two (in the end this will be the kernel of the dual of the last step of the output isogeny) - * @param gen_input : quaternion element, element of a maximal order O, generator of the O-ideal to be translated - * @param length : the length of the chain to be translated - * @param lideal_start_small : a small ideal equivalent to lideal_start_two of right order equal to O - * @param lideal_start_two : O0-ideal of norm a power of 2 equivalent to lideal_start_small, corresponding to an isogeny isog_start_two - * @param gen_two element of O0, generator of lideal_start_two - * @param Bpoo : the quaternion algebra - * @returns a bit indicating if the computation succeeded - * /!\ the composition of isog_start_two and isog might be backtracking - * lideal_start_two = O0 < gen_two , 2^*> - * lideal_start_small = O0 < conj(gen_two), * > - * lideal_start_small = lideal_lideal_start_two * conj(gen_two) / 2^* - * The ideal to be translated is equal to O < gen_input, 2^e> where O = OR(lideal_start_small) - * - * assumes that the ideal given in input has exactly norm 2^e where e = length * f (where f = TORSION_PLUS_EVEN_POWER) - * when used for compressing an isogeny, we assume that the curve given in input is normalized!! - */ -int id2iso_ideal_to_isogeny_two_long_power_of_2(id2iso_compressed_long_two_isog_t *isog_zip, ec_curve_t *domain, ec_basis_t *basis_minus, ec_basis_t *basis_plus, ec_point_t *kernel_dual, const quat_alg_elem_t *gen_input, const int length, const quat_left_ideal_t *lideal_start_small, const quat_left_ideal_t *lideal_start_two, const quat_alg_elem_t *gen_two, const quat_alg_t *Bpoo) { - - // var dec - int found; - quat_alg_elem_t beta; - quat_alg_elem_t gen,gen_constraint; - ibz_t n_beta,n; - quat_left_ideal_t lideal_small; - quat_left_ideal_t ideal_beta_L[length],ideal_beta_R[length]; - ibq_t ibq_trace; - ibz_t beta_trace[length]; - ibz_vec_2_t linear_comb[length]; - quat_alg_elem_t gen_input_temp,quat_temp; - quat_alg_elem_t gen_two_temp; - quat_left_ideal_t lideal_equiv;quat_left_ideal_init(&lideal_equiv); quat_order_t right_order;quat_order_init(&right_order); // TODECIDE we might avoid this by solving solve linear combination without using the right order - quat_alg_coord_t coeffs; - - int const f = TORSION_PLUS_EVEN_POWER; - ibz_t ibz_two_f,temp,remainder; - ec_basis_t temp_odd_basis[2]; - ec_curve_t temp_domain; ec_point_t temp_kernel_dual; ec_basis_t temp_two_basis; - ec_isog_even_t isog; - ec_point_t pushed_points[7]; - ibz_mat_2x2_t action_matrix; - digit_t digit_a[NWORDS_ORDER] = {0}; digit_t digit_b[NWORDS_ORDER] = {0}; - ibz_t ibz_a,ibz_b; - - // var init - found = 0; - quat_alg_elem_init(&beta); - quat_alg_elem_init(&gen);quat_alg_elem_init(&gen_constraint); - quat_alg_elem_init(&gen_input_temp);quat_alg_elem_init(&quat_temp); - quat_alg_elem_init(&gen_two_temp); - ibz_init(&n_beta); ibz_init(&n); - ibz_init(&temp); ibz_init(&ibz_two_f); - ibz_init(&remainder); - ibq_init(&ibq_trace); - ibz_init(&ibz_a);ibz_init(&ibz_b); - ibz_mat_2x2_init(&action_matrix); - quat_left_ideal_init(&lideal_small); - quat_alg_coord_init(&coeffs); - for (int ind=0; ind when ind is bigger than 0). conj(gen) is contained in lideal_small. - // At ind = 0, we have lideal_equiv = lideal_small - // - gen_input_temp is an element of the right order of lideal_equiv generating the ideal of norm 2^f corresponding to the (ind+1)-th isogeny to be translated. - // - gen_two_temp is an element of the right order of lideal_equiv such that the principal ideal O0 < gen_two_temp > = lideal_two * conj(lideal_equiv) where lideal_two corresponds to the isogeny of degree 2^* connecting E0 to the domain of the (ind+1)-th isogeny to be translated - - // At the beginning of iteration ind: - // - lideal_small is set to be lideal_equiv times an ideal of norm 2^f corresponding to the (ind+1)-th isogeny to be translated - // During iteration ind, all the other values will be updated - - // The main goal of iteration ind is to find an endomorphism beta contained inside the right order of lideal_equiv of step ind+1 (which is isomorphic to the endomorphism ring of the codomain of the (ind+1)-th isogeny to be translated) - // this endomorphism beta will be used to compute the two ideals ideal_beta_L[ind],ideal_beta_R[ind] and the trace trace_beta[ind] which are required to actually compute the (ind+1)-th isogeny to be translated. - // Two coefficients linear_comb[ind] will also be necessary, it is also computed in the loop below. - - // gen_constraint = conjugate( gen_two ) - quat_alg_conj(&gen_constraint,gen_two); - - // gen = norm(lideal_start_small) - quat_alg_scalar(&gen,&lideal_start_small->norm,&ibz_const_one); - - // n = norm(lideal_small) T - ibz_copy(&n,&lideal_start_small->norm); - - // gen_input_temp = gen_input - quat_alg_elem_copy(&gen_input_temp,gen_input); - - - // lideal_small = lideal_start_small - quat_left_ideal_copy(&lideal_small,lideal_start_small); - - // gen_two_temp = gen_two - quat_alg_elem_copy(&gen_two_temp,gen_two); - - // for debug we check that all values are contained in the correct orders and lattices - assert(quat_lattice_contains(&coeffs,&STANDARD_EXTREMAL_ORDER.order,&gen_two_temp,Bpoo)); - assert(quat_lattice_contains(&coeffs,&lideal_start_two->lattice,&gen_two_temp,Bpoo)); - assert(!quat_lattice_contains(&coeffs,&lideal_start_small->lattice,&gen_two_temp,Bpoo)); - quat_alg_conj(&quat_temp,&gen_two_temp); - assert(quat_lattice_contains(&coeffs,&lideal_start_small->lattice,&quat_temp,Bpoo)); - - // timing - setlocale(LC_NUMERIC, ""); - uint64_t t0, t1; - - // we will loop through and try to find an endomorphism beta for each - for (int ind=0; ind 0) { - // we update the various ideals and quaternion elements - - // if we set lideal_equiv = ideal_small * gen / norm(lideal_small) = O0 < gen, n(gen)/n(lideal_small) > - // we have set (at the end of the previous iteration) gen_input_temp = conj ( gen ) / norm(gen ) * gen_input_temp * gen - // and lideal_small = lideal_equiv * O_R(lideal_equiv) < gen_input_temp , 2^f > = O0 < make_primitive (gen * gen_input_temp) , n(gen) * 2^f /n (lideal_small) > - - // update lideal_small - // quat_temp = gen * gen_input_temp - quat_alg_mul(&quat_temp,&gen,&gen_input_temp, Bpoo); - quat_alg_normalize(&quat_temp); - - assert(quat_lattice_contains(&coeffs,&STANDARD_EXTREMAL_ORDER.order,&quat_temp,Bpoo)); - assert(quat_alg_is_primitive(&gen_input_temp,&right_order,Bpoo)); - assert(quat_lattice_contains(&coeffs,&lideal_equiv.lattice,&quat_temp,Bpoo)); - - // temp = n * 2^f - ibz_mul(&temp,&n,&ibz_two_f); - quat_lideal_make_primitive_then_create(&lideal_small,&quat_temp,&temp,&STANDARD_EXTREMAL_ORDER.order,Bpoo); - - } - // copying n in temp - ibz_copy(&temp,&n); - - // trying to solve the norm equation algorithm - found = klpt_eichler_special_norm(&beta,&n_beta,&gen,&n,&lideal_small,&gen_constraint, Bpoo); - if (!found) { - break; - } - - // the solution has been found, we proceed to the remaining computations - // this includes computation of an updated values of gen_two_temp and gen_input_temp, - // of the ideals ideal_beta_L[ind] and ideal_beta_R[ind], - // of the trace of beta as beta_trace[ind], and of the linear_combination linear_comb[ind] - - #ifndef NDEBUG - quat_alg_conj(&quat_temp,&gen); - quat_lattice_contains(&coeffs,&lideal_small.lattice,&quat_temp,Bpoo); - #endif - - - - // computation of lideal_equiv as lideal_small* gen / norm(lideal_small) - quat_alg_elem_copy(&quat_temp,&gen); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal_small.norm); - int lideal_mul_ok = quat_lideal_mul(&lideal_equiv,&lideal_small,&quat_temp,Bpoo,0); - assert(lideal_mul_ok); - - - // computing the right order of lideal_equiv - quat_lideal_right_order(&right_order,&lideal_equiv,Bpoo); - assert(quat_lattice_contains(&coeffs,&right_order,&beta,Bpoo)); - - if (ind > 0) { - // we can adjust the scalar of gen_input_temp, because it was adjusted for gen_constraint during the execution of eichler norm fixed - ibz_copy(&gen_input_temp.denom,&gen_constraint.denom); - } - - - // update gen_input_temp = conj ( gen ) / norm(gen ) * gen_input_temp * gen - quat_alg_normalize(&gen); - quat_alg_conj(&quat_temp,&gen); - assert(quat_lattice_contains(&coeffs,&lideal_small.lattice,&quat_temp,Bpoo)); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&n); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal_small.norm); - quat_alg_mul(&gen_input_temp,&quat_temp,&gen_input_temp,Bpoo); - quat_alg_mul(&gen_input_temp,&gen_input_temp,&gen,Bpoo); - quat_alg_normalize(&gen_input_temp); - - // update gen_constraint - if (ind > 0) { - // gen_constraint is simply the conjugate of gen_input_temp - quat_alg_conj(&gen_constraint,&gen_input_temp); - - } - else { - // gen_constraint = conj (gen) /norm(gen) * gen_constraint * gen - quat_alg_mul(&gen_constraint,&quat_temp,&gen_constraint,Bpoo); - quat_alg_mul(&gen_constraint,&gen_constraint,&gen,Bpoo); - quat_alg_normalize(&gen_constraint); - } - // for debug we check that our updated element are contained in the correct orders - assert(quat_lattice_contains(&coeffs,&right_order,&gen_constraint,Bpoo)); - assert(quat_lattice_contains(&coeffs,&right_order,&gen_input_temp,Bpoo)); - // assert(quat_alg_is_primitive(&gen_input_temp,&right_order,Bpoo)); - assert(quat_lattice_contains(&coeffs,&right_order,&beta,Bpoo)); - assert(quat_alg_is_primitive(&beta,&right_order,Bpoo)); - - // for debug we check that gen_two_temp is indeed contained inside order.order - assert(quat_lattice_contains(&coeffs,&STANDARD_EXTREMAL_ORDER.order,&gen_two_temp,Bpoo)); - - // update gen_two_temp = conj( gen ) * gen_two_temp / (lideal_equiv) - quat_alg_conj(&quat_temp,&gen); - quat_alg_mul(&gen_two_temp,&quat_temp,&gen_two_temp,Bpoo); - ibz_mul(&gen_two_temp.denom,&gen_two_temp.denom,&temp); - quat_alg_normalize(&gen_two_temp); - assert(quat_lattice_contains(&coeffs,&STANDARD_EXTREMAL_ORDER.order,&gen_two_temp,Bpoo)); - - // computation of the two ideals - // ideal_beta_L = O0 < beta * gen_two_temp, N>, ideal_beta_R = O0 < conj(beta) * gen_two_temp, N'> with N N' = n_beta - - // quat_temp = beta * gen_two_temp - quat_alg_mul(&quat_temp,&beta,&gen_two_temp,&QUATALG_PINFTY); - - // computation of the norm of this first ideal - ibz_gcd(&temp,&n_beta,&TORSION_ODD); - // creation of ideal_beta_L - quat_lideal_make_primitive_then_create(&ideal_beta_L[ind],&quat_temp,&temp,&STANDARD_EXTREMAL_ORDER.order,Bpoo); - assert(0==ibz_cmp(&temp,&ideal_beta_L[ind].norm)); - - // computation of the generator of ideal_beta_R - // as conj(beta) * gen_two_temp - quat_alg_conj(&quat_temp,&beta); - quat_alg_mul(&quat_temp,&quat_temp,&gen_two_temp, Bpoo); - quat_alg_normalize(&quat_temp); - - // computation of the norm of ideal_beta_R - ibz_div(&temp,&remainder,&n_beta,&ideal_beta_L[ind].norm); - - // creation of ideal_beta_R - quat_lideal_make_primitive_then_create(&ideal_beta_R[ind],&quat_temp,&temp,&STANDARD_EXTREMAL_ORDER.order,Bpoo); - assert(0==ibz_cmp(&temp,&ideal_beta_R[ind].norm)); - - #ifndef NDEBUG - ibz_mul(&temp,&ideal_beta_R[ind].norm,&ideal_beta_L[ind].norm); - assert(0==ibz_cmp(&temp,&n_beta)); - #endif - - // computation of the trace of beta - quat_alg_trace(&ibq_trace,&beta); - if (!ibq_to_ibz(&beta_trace[ind],&ibq_trace)) { - assert(0); - } - else { - // adjusting the trace mod 2^f - ibz_mod(&beta_trace[ind],&beta_trace[ind],&ibz_two_f); - } - - // removing scalar factors if needed - // TODUPDATE : it is only needed if trace is even so we may check that to avoid doing that operation every time - quat_alg_make_primitive(&coeffs,&temp,&gen_input_temp,&right_order,Bpoo); - ibz_mul(&gen_input_temp.denom,&gen_input_temp.denom,&temp); - quat_alg_normalize(&gen_input_temp); - - // computation of the linear_combination such that linear_comb[ind][0] + beta * linear_comb[ind][1] sends the kernel of the dual of the 2^f isogeny of step ind-1 to the kernel of the 2^f isogeny of step ind - found = klpt_find_linear_comb(&linear_comb[ind],&beta,&right_order,&ibz_two_f,f,&gen_constraint,&gen_input_temp,Bpoo); - if (!found) { - break; - // TODEBUG - } - - int lideal_generator_ok; - lideal_generator_ok = quat_lideal_generator_coprime(&gen,&lideal_equiv,&ibz_const_two,Bpoo,0); - assert(lideal_generator_ok); - quat_alg_normalize(&gen); - - // ensure that we still have the correct value of gen_constraint - quat_alg_conj(&gen_constraint,&gen_input_temp); - - - } - // the quaternion computation has succeeded, we can proceed to perform all elliptic curve and isogeny operations - if (found) { - // init all ec values needed for this computation - - // domain - temp_domain = *domain; - - // kernel dual - temp_kernel_dual = *kernel_dual; - - // odd torsion points - temp_odd_basis[0] = *basis_minus; - temp_odd_basis[1] = *basis_plus; - - for (int ind =0;ind 0) { - assert(0!=ibz_get(&linear_comb[ind][1])%2); - ibz_invmod(&linear_comb[ind][1],&linear_comb[ind][1],&ibz_two_f); - ibz_mul(&linear_comb[ind][0],&linear_comb[ind][0],&linear_comb[ind][1]); - ibz_mod(&linear_comb[ind][0],&linear_comb[ind][0],&ibz_two_f); - ibz_copy(&linear_comb[ind][1],&ibz_const_one); - ibz_copy(&isog_zip->zip_chain[ind],&linear_comb[ind][0]); - } - - // computation of the kernel - // changing the ibzs to digits - ibz_to_digit_array(digit_a,&linear_comb[ind][0]); - ibz_to_digit_array(digit_b,&linear_comb[ind][1]); - - isog.kernel = temp_two_basis.P; - - ec_biscalar_mul(&isog.kernel,&temp_domain,digit_a,digit_b,&temp_two_basis); - assert(test_point_order_twof(&isog.kernel,&temp_domain)); - - // setting the isogeny - isog.curve = temp_domain; - isog.length = f; - - // compression for the first step - // the first step is different for the compression - if (ind == 0) { - // first we compute a new deterministic basis of the curve - ec_curve_to_basis_2(&temp_two_basis,&temp_domain); - - // then we perform a dlp to express isog.kernel in this basis - ec_dlog_2(digit_a,digit_b,&temp_two_basis,&isog.kernel,&temp_domain); - - // translate the digit_t as ibz_t - ibz_copy_digit_array(&ibz_a,digit_a); - ibz_copy_digit_array(&ibz_b,digit_b); - // testing the sign - - - #ifndef NDEBUG - ec_point_t test; - ec_biscalar_mul(&test,&temp_domain,digit_a,digit_b,&temp_two_basis); - assert(ec_is_equal(&test,&isog.kernel)); - #endif - - // then we encode the isogeny as a scalar and a bit - // set the bit_first_step as 0 when we can get a generator as temp_two_basis.P + s temp_two_basis.Q - // if not, then this means we can write as Q + s P - isog_zip->bit_first_step = ibz_get(&ibz_a)%2!=0; - if (isog_zip->bit_first_step) { - // compute the scalar s as ibz_b / ibz_a mod 2^f - if(!ibz_invmod(&ibz_a,&ibz_a,&ibz_two_f)) { - assert(0); - } - ibz_mul(&ibz_b,&ibz_b,&ibz_a); - ibz_mod(&ibz_b,&ibz_b,&ibz_two_f); - ibz_copy(&isog_zip->zip_chain[ind],&ibz_b); - // and we can set the kernel dual to be temp_two_basis.Q - temp_kernel_dual = temp_two_basis.Q; - - ibz_to_digit_array(digit_b,&ibz_b); - ibz_copy_digit_array(&ibz_b,digit_b); - // ec_ladder3pt(&isog.kernel,digit_b,&temp_two_basis.P,&temp_two_basis.Q,&temp_two_basis.PmQ,&temp_domain); - } - else { - // compute the scalar s as ibz_a / ibz_b mod 2^f - if (!ibz_invmod(&ibz_b,&ibz_b,&ibz_two_f)) { - assert(0); - } - ibz_mul(&ibz_a,&ibz_b,&ibz_a); - ibz_mod(&ibz_a,&ibz_a,&ibz_two_f); - ibz_copy(&isog_zip->zip_chain[ind],&ibz_a); - // and we can set the kernel dual to be temp_two_basis.P - temp_kernel_dual = temp_two_basis.P; - - ibz_to_digit_array(digit_a,&ibz_a); - ibz_copy_digit_array(&ibz_a,digit_a); - // ec_ladder3pt(&isog.kernel,digit_a,&temp_two_basis.Q,&temp_two_basis.P,&temp_two_basis.PmQ,&temp_domain); - } - - } - - assert(test_point_order_twof(&temp_kernel_dual,&temp_domain)); - // evaluating the isogeny - // TODECIDE : we may use a non-zero eval for this one - pushed_points[0] = temp_odd_basis[0].P; - pushed_points[1] = temp_odd_basis[0].Q; - pushed_points[2] = temp_odd_basis[0].PmQ; - pushed_points[3] = temp_odd_basis[1].P; - pushed_points[4] = temp_odd_basis[1].Q; - pushed_points[5] = temp_odd_basis[1].PmQ; - pushed_points[6] = temp_kernel_dual; - ec_eval_even(&temp_domain,&isog,pushed_points,7); - temp_odd_basis[0].P = pushed_points[0]; - temp_odd_basis[0].Q = pushed_points[1]; - temp_odd_basis[0].PmQ = pushed_points[2]; - temp_odd_basis[1].P = pushed_points[3]; - temp_odd_basis[1].Q = pushed_points[4]; - temp_odd_basis[1].PmQ = pushed_points[5]; - temp_kernel_dual = pushed_points[6]; - assert(test_point_order_twof(&temp_kernel_dual,&temp_domain)); - - } - - *domain = temp_domain; - *kernel_dual = temp_kernel_dual; - *basis_minus = temp_odd_basis[0]; - *basis_plus = temp_odd_basis[1]; - - - } - - // var finalize - quat_alg_elem_finalize(&beta); - quat_alg_elem_finalize(&gen);quat_alg_elem_finalize(&gen_constraint); - quat_alg_elem_finalize(&gen_input_temp);quat_alg_elem_finalize(&quat_temp); - quat_alg_elem_finalize(&gen_two_temp); - ibz_finalize(&n_beta); ibz_finalize(&n); - ibz_finalize(&temp); ibz_finalize(&ibz_two_f); - ibz_finalize(&remainder); - ibz_finalize(&ibz_a);ibz_finalize(&ibz_b); - ibq_finalize(&ibq_trace); - ibz_mat_2x2_finalize(&action_matrix); - quat_left_ideal_finalize(&lideal_small); - quat_alg_coord_finalize(&coeffs); - quat_left_ideal_finalize(&lideal_equiv); quat_order_finalize(&right_order); - for (int ind=0; indcoord[2]); - ibz_copy(&(*vec)[3], &el->coord[3]); - ibz_sub(&(*vec)[0], &el->coord[0], &el->coord[3]); - ibz_sub(&(*vec)[1], &el->coord[1], &el->coord[2]); - if (ibz_is_one(&el->denom)) { - ibz_add(&(*vec)[2], &(*vec)[2], &(*vec)[2]); - ibz_add(&(*vec)[3], &(*vec)[3], &(*vec)[3]); - } else { - assert(!ibz_cmp(&el->denom, &ibz_const_two)); - ibz_div_2exp(&(*vec)[0], &(*vec)[0], 1); - ibz_div_2exp(&(*vec)[1], &(*vec)[1], 1); - } -} - -void id2iso_ideal_to_kernel_dlogs_even(ibz_vec_2_t *vec, const quat_left_ideal_t *lideal) -{ - ibz_t tmp; - ibz_init(&tmp); - - ibz_mat_2x2_t mat; - ibz_mat_2x2_init(&mat); - - // construct the matrix of the dual of alpha on the 2^f-torsion - { - quat_alg_elem_t alpha; - quat_alg_elem_init(&alpha); - - int lideal_generator_ok; - lideal_generator_ok = quat_lideal_generator(&alpha, lideal, &QUATALG_PINFTY,0); - assert(lideal_generator_ok); - quat_alg_conj(&alpha, &alpha); - - ibz_vec_4_t coeffs; - ibz_vec_4_init(&coeffs); - from_1ijk_to_O0basis(&coeffs, &alpha); - - for (unsigned i = 0; i < 2; ++i) { - ibz_add(&mat[i][i], &mat[i][i], &coeffs[0]); - for (unsigned j = 0; j < 2; ++j) { - ibz_mul(&tmp, &ACTION_GEN2[i][j], &coeffs[1]); - ibz_add(&mat[i][j], &mat[i][j], &tmp); - ibz_mul(&tmp, &ACTION_GEN3[i][j], &coeffs[2]); - ibz_add(&mat[i][j], &mat[i][j], &tmp); - ibz_mul(&tmp, &ACTION_GEN4[i][j], &coeffs[3]); - ibz_add(&mat[i][j], &mat[i][j], &tmp); - } - } - - ibz_vec_4_finalize(&coeffs); - quat_alg_elem_finalize(&alpha); - } - - // find the kernel of alpha modulo the norm of the ideal - { - ibz_t const *const norm = &lideal->norm; - - ibz_mod(&(*vec)[0], &mat[0][0], norm); - ibz_mod(&(*vec)[1], &mat[1][0], norm); - ibz_gcd(&tmp, &(*vec)[0], &(*vec)[1]); - if (!(ibz_get(&tmp) & 1)) { - ibz_mod(&(*vec)[0], &mat[0][1], norm); - ibz_mod(&(*vec)[1], &mat[1][1], norm); - } -#ifndef NDEBUG - ibz_gcd(&tmp, &(*vec)[0], norm); - ibz_gcd(&tmp, &(*vec)[1], &tmp); - assert(!ibz_cmp(&tmp, &ibz_const_one)); -#endif - } - - ibz_mat_2x2_finalize(&mat); - ibz_finalize(&tmp); -} - - - -void id2iso_ideal_to_isogeny_even(ec_isog_even_t *isog, const quat_left_ideal_t *lideal_input) -{ - // compute length - isog->length = 0; - ibz_t norm; - ibz_init(&norm); - ibz_copy(&norm, &lideal_input->norm); - while (!ibz_is_one(&norm)) { - assert(!ibz_is_zero(&norm) && !(ibz_get(&norm) & 1)); - ibz_div_2exp(&norm, &norm, 1); - ++isog->length; - } - ibz_finalize(&norm); - assert(isog->length <= TORSION_PLUS_EVEN_POWER); - - digit_t scalars[2][NWORDS_FIELD]; - { - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - id2iso_ideal_to_kernel_dlogs_even(&vec, lideal_input); - - // multiply out unnecessary cofactor from 2^f-torsion basis - for (size_t i = isog->length; i < TORSION_PLUS_EVEN_POWER; ++i) { - ibz_add(&vec[0], &vec[0], &vec[0]); - ibz_add(&vec[1], &vec[1], &vec[1]); - } - - ibz_to_digit_array(scalars[0], &vec[0]); - ibz_to_digit_array(scalars[1], &vec[1]); - - ibz_vec_2_finalize(&vec); - } - - isog->curve = CURVE_E0; - ec_biscalar_mul(&isog->kernel, &isog->curve, scalars[0], scalars[1], &BASIS_EVEN); - -} - - - -void id2iso_ideal_to_kernel_dlogs_odd(ibz_vec_2_t *vec, ec_degree_odd_t *deg, const quat_left_ideal_t *lideal) -{ - ibz_t tmp; - ibz_init(&tmp); - - ibz_mat_2x2_t mat; - ibz_mat_2x2_init(&mat); - - // construct the matrix of the dual of alpha on the T-torsion - { - quat_alg_elem_t alpha; - quat_alg_elem_init(&alpha); - - int lideal_generator_ok; - lideal_generator_ok = quat_lideal_generator(&alpha, lideal, &QUATALG_PINFTY,0); - assert(lideal_generator_ok); - assert(ibz_divides(&ibz_const_two, &alpha.denom)); // denominator is invertible mod T, ignore - - for (unsigned i = 0; i < 2; ++i) { - ibz_add(&mat[i][i], &mat[i][i], &alpha.coord[0]); - for (unsigned j = 0; j < 2; ++j) { - ibz_mul(&tmp, &ACTION_I[i][j], &alpha.coord[1]); - ibz_sub(&mat[i][j], &mat[i][j], &tmp); - ibz_mul(&tmp, &ACTION_J[i][j], &alpha.coord[2]); - ibz_sub(&mat[i][j], &mat[i][j], &tmp); - ibz_mul(&tmp, &ACTION_K[i][j], &alpha.coord[3]); - ibz_sub(&mat[i][j], &mat[i][j], &tmp); -// ibz_mod(&mat[i][j], &mat[i][j], &TORSION_ODD); - } - } - - quat_alg_elem_finalize(&alpha); - } - - // determine prime powers in the norm of the ideal - size_t numpp = 0; - #define NUMPP (sizeof(TORSION_ODD_PRIMEPOWERS) / sizeof(*TORSION_ODD_PRIMEPOWERS)) - ibz_t pps[NUMPP]; - ibz_vec_2_t vs[NUMPP]; - { - ibz_t const *const norm = &lideal->norm; - - for (size_t i = 0; i < NUMPP; ++i) { - ibz_gcd(&tmp, norm, &TORSION_ODD_PRIMEPOWERS[i]); - (*deg)[i] = 0; - if (!ibz_is_one(&tmp)) { - ibz_init(&pps[numpp]); - ibz_copy(&pps[numpp], &tmp); - ibz_vec_2_init(&vs[numpp]); - ++numpp; - - // compute valuation - ibz_t l, r; - ibz_init(&l); - ibz_init(&r); - ibz_set(&l, TORSION_ODD_PRIMES[i]); - do { - ++(*deg)[i]; - ibz_div(&tmp, &r, &tmp, &l); - assert(!ibz_is_zero(&tmp) && ibz_is_zero(&r)); - } while (!ibz_is_one(&tmp)); - ibz_finalize(&r); - ibz_finalize(&l); - } - } - } - #undef NUMPP - - // find the kernel of alpha modulo each prime power - { - for (size_t i = 0; i < numpp; ++i) { - ibz_mod(&vs[i][0], &mat[0][0], &pps[i]); - ibz_mod(&vs[i][1], &mat[1][0], &pps[i]); - ibz_gcd(&tmp, &vs[i][0], &pps[i]); - ibz_gcd(&tmp, &vs[i][1], &tmp); - if (ibz_cmp(&tmp, &ibz_const_one)) { - ibz_mod(&vs[i][0], &mat[0][1], &pps[i]); - ibz_mod(&vs[i][1], &mat[1][1], &pps[i]); - } -#ifndef NDEBUG - ibz_gcd(&tmp, &vs[i][0], &pps[i]); - ibz_gcd(&tmp, &vs[i][1], &tmp); - assert(!ibz_cmp(&tmp, &ibz_const_one)); -#endif - } - } - - // now CRT them together - { - //TODO use a product tree instead - ibz_t mod; - ibz_init(&mod); - ibz_set(&mod, 1); - ibz_set(&(*vec)[0], 0); - ibz_set(&(*vec)[1], 0); - for (size_t i = 0; i < numpp; ++i) { - //TODO use vector CRT - ibz_crt(&(*vec)[0], &(*vec)[0], &vs[i][0], &mod, &pps[i]); - ibz_crt(&(*vec)[1], &(*vec)[1], &vs[i][1], &mod, &pps[i]); - //TODO optionally return lcm from CRT and use it - ibz_mul(&mod, &mod, &pps[i]); - ibz_finalize(&pps[i]); - } - ibz_finalize(&mod); - } - - for (size_t i = 0; i < numpp; ++i) - ibz_vec_2_finalize(&vs[i]); - - ibz_mat_2x2_finalize(&mat); - - ibz_finalize(&tmp); -} - - - - -/** - * @brief Translating an ideal of odd norm dividing p²-1 into the corresponding isogeny - * - * @param isog Output : the output isogeny - * @param basis_minus : a basis of ec points - * @param basis_plus : a basis of ec points - * @param domain : an elliptic curve - * @param lideal_input : O0-ideal corresponding to the ideal to be translated - * - * compute the isogeny starting from domain corresponding to ideal_input - * the coefficients extracted from the ideal are to be applied to basis_minus and basis_plus to compute the kernel of the isogeny. - * - */ - -void id2iso_ideal_to_isogeny_odd(ec_isog_odd_t *isog, const ec_curve_t *domain, const ec_basis_t *basis_plus,const ec_basis_t *basis_minus, const quat_left_ideal_t *lideal_input) -{ - digit_t scalars_plus[2][NWORDS_FIELD], scalars_minus[2][NWORDS_FIELD]; - { - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - id2iso_ideal_to_kernel_dlogs_odd(&vec, &isog->degree, lideal_input); - - ibz_t tmp; - ibz_init(&tmp); - - // multiply out unnecessary cofactor from T-torsion basis - assert(sizeof(isog->degree)/sizeof(*isog->degree) - == sizeof(TORSION_ODD_PRIMEPOWERS)/sizeof(*TORSION_ODD_PRIMEPOWERS)); - for (size_t i = 0; i < sizeof(isog->degree)/sizeof(*isog->degree); ++i) { - assert(isog->degree[i] <= TORSION_ODD_POWERS[i]); - if (isog->degree[i] == TORSION_ODD_POWERS[i]) - continue; - ibz_set(&tmp, TORSION_ODD_PRIMES[i]); - ibz_pow(&tmp, &tmp, TORSION_ODD_POWERS[i] - isog->degree[i]); - ibz_mul(&vec[0], &vec[0], &tmp); - ibz_mul(&vec[1], &vec[1], &tmp); - } - - ibz_mod(&tmp, &vec[0], &TORSION_ODD_PLUS); - ibz_to_digit_array(scalars_plus[0], &tmp); - ibz_mod(&tmp, &vec[1], &TORSION_ODD_PLUS); - ibz_to_digit_array(scalars_plus[1], &tmp); - ibz_mod(&tmp, &vec[0], &TORSION_ODD_MINUS); - ibz_to_digit_array(scalars_minus[0], &tmp); - ibz_mod(&tmp, &vec[1], &TORSION_ODD_MINUS); - ibz_to_digit_array(scalars_minus[1], &tmp); - - ibz_finalize(&tmp); - - ibz_vec_2_finalize(&vec); - } - - isog->curve = *domain; - ec_biscalar_mul(&isog->ker_plus, domain, scalars_plus[0], scalars_plus[1], basis_plus); - ec_biscalar_mul(&isog->ker_minus, domain, scalars_minus[0], scalars_minus[1], basis_minus); -} - - -void id2iso_kernel_dlogs_to_ideal(quat_left_ideal_t *lideal, const ibz_vec_2_t *vec2, const ibz_vec_2_t *vec3) -{ - ibz_vec_2_t ker; - ibz_vec_2_init(&ker); - ibz_crt(&ker[0], &(*vec2)[0], &(*vec3)[0], &TORSION_PLUS_2POWER, &TORSION_PLUS_3POWER); - ibz_crt(&ker[1], &(*vec2)[1], &(*vec3)[1], &TORSION_PLUS_2POWER, &TORSION_PLUS_3POWER); - - // algorithm: apply endomorphisms 1 and j+(1+k)/2 to the kernel point, - // the result should form a basis of the respective torsion subgroup. - // then apply i to the kernel point and decompose over said basis. - // hence we have an equation a*P + b*[j+(1+k)/2]P == [i]P, which will - // easily reveal an endomorphism that kills P. - - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - { - ibz_mat_2x2_t mat; - ibz_mat_2x2_init(&mat); - - ibz_copy(&mat[0][0], &ker[0]); - ibz_copy(&mat[1][0], &ker[1]); - - ibz_mat_2x2_eval(&vec, &ACTION_J, &ker); - ibz_copy(&mat[0][1], &vec[0]); - ibz_copy(&mat[1][1], &vec[1]); - ibz_mat_2x2_eval(&vec, &ACTION_GEN4, &ker); - ibz_add(&mat[0][1], &mat[0][1], &vec[0]); - ibz_add(&mat[1][1], &mat[1][1], &vec[1]); - ibz_mod(&mat[0][1], &mat[0][1], &TORSION_PLUS_23POWER); - ibz_mod(&mat[1][1], &mat[1][1], &TORSION_PLUS_23POWER); - - ibz_mat_2x2_t inv; - ibz_mat_2x2_init(&inv); - { - int inv_ok = ibz_2x2_inv_mod(&inv, &mat, &TORSION_PLUS_23POWER); - assert(inv_ok); - } - ibz_mat_2x2_finalize(&mat); - - ibz_mat_2x2_eval(&vec, &ACTION_I, &ker); - ibz_mat_2x2_eval(&vec, &inv, &vec); - - ibz_mat_2x2_finalize(&inv); - } - - ibz_vec_2_finalize(&ker); - - // final result: a - i + b*(j+(1+k)/2) - quat_alg_elem_t gen; - quat_alg_elem_init(&gen); - ibz_set(&gen.denom, 2); - ibz_add(&gen.coord[0], &vec[0], &vec[0]); - ibz_set(&gen.coord[1], -2); - ibz_add(&gen.coord[2], &vec[1], &vec[1]); - ibz_copy(&gen.coord[3], &vec[1]); - ibz_add(&gen.coord[0], &gen.coord[0], &vec[1]); - ibz_vec_2_finalize(&vec); - - quat_lideal_create_from_primitive(lideal, &gen, &TORSION_PLUS_23POWER, &MAXORD_O0, &QUATALG_PINFTY); - - assert(0 == ibz_cmp(&lideal->norm, &TORSION_PLUS_23POWER)); - - quat_alg_elem_finalize(&gen); -} - - diff --git a/src/id2iso/ref/id2isox/test/id2iso.c b/src/id2iso/ref/id2isox/test/id2iso.c deleted file mode 100644 index 15956f8..0000000 --- a/src/id2iso/ref/id2isox/test/id2iso.c +++ /dev/null @@ -1,254 +0,0 @@ -#include - -#include "id2iso_tests.h" - -//XXX FIXME stolen from src/ec/opt/generic/test/isog-test.c -static void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -static void point_print(char *name, ec_point_t P){ - fp2_t a; - if(fp2_is_zero(&P.z)){ - printf("%s = INF\n", name); - } - else{ - fp2_copy(&a, &P.z); - fp2_inv(&a); - fp2_mul(&a, &a, &P.x); - fp2_print(name, a); - } -} -//XXX - -int id2iso_test_long_id2iso() { - // var dec - int found =1; - ibz_t temp,remainder,n; - ibq_t ibq_norm; - quat_alg_elem_t gen,gen_two,gen_check,quat_temp,gen_key; - - quat_left_ideal_t lideal_small,lideal_check,lideal_two; - quat_left_ideal_t lideal_two_one,lideal_small_one; - quat_order_t right_order; - id2iso_compressed_long_two_isog_t zip; - ec_isog_even_t isog_two_one; - quat_alg_coord_t coeffs; - ibz_mat_4x4_t reduced,gram; - - ec_basis_t basis_plus,basis_minus; - ec_basis_t odd_basis[2]; - ec_curve_t curve = {0}; - ec_point_t kernel_dual = {0}; - ec_basis_t even_basis = {0}; - - // var init - ibq_init(&ibq_norm); - ibz_init(&temp);ibz_init(&remainder);ibz_init(&n); - quat_alg_elem_init(&gen); - quat_alg_elem_init(&gen_two); - quat_alg_elem_init(&gen_key); - quat_alg_elem_init(&gen_check); - quat_alg_elem_init(&quat_temp); - quat_left_ideal_init(&lideal_small); - quat_left_ideal_init(&lideal_check); - quat_left_ideal_init(&lideal_two); - quat_left_ideal_init(&lideal_two_one); - quat_left_ideal_init(&lideal_small_one); - quat_order_init(&right_order); - quat_alg_coord_init(&coeffs); - ibz_mat_4x4_init(&reduced);ibz_mat_4x4_init(&gram); - // computation of lideal_small - generate_random_prime(&n,1,KLPT_secret_key_prime_size); - ibz_mul(&temp,&n,&TORSION_ODD); - found = found && represent_integer(&gen_check,&temp,&QUATALG_PINFTY); - assert(found); - quat_lideal_create_from_primitive(&lideal_small,&gen_check,&n,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - quat_alg_conj(&gen_check,&gen_check); - quat_lideal_create_from_primitive(&lideal_check,&gen_check,&TORSION_ODD,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - assert(quat_lideal_isom(&quat_temp,&lideal_small,&lideal_check,&QUATALG_PINFTY)); - - // application of keygen_klpt to compute a generator of lideal_two - found = found && klpt_keygen_klpt(&gen,&lideal_small,&QUATALG_PINFTY); - quat_alg_conj(&gen,&gen); - quat_alg_elem_copy(&gen_key,&gen); - - - - // TODEBUG check that this is indeed an integer - int length = KLPT_keygen_length/TORSION_PLUS_EVEN_POWER; - assert(KLPT_keygen_length==TORSION_PLUS_EVEN_POWER*length); - - // computation of the norm of lideal_two - quat_alg_norm(&ibq_norm,&gen,&QUATALG_PINFTY); - ibq_to_ibz(&temp,&ibq_norm); - ibz_div(&temp,&remainder,&temp,&lideal_small.norm); - assert(0==ibz_cmp(&remainder,&ibz_const_zero)); - ibz_pow(&remainder,&ibz_const_two,KLPT_keygen_length); - assert(0==ibz_cmp(&remainder,&temp)); - - // computation of lideal_two - quat_lideal_create_from_primitive(&lideal_two,&gen,&temp,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - - // we compute a better generator - int find_gen = 0; - while (!find_gen) { - ibz_rand_interval_minm_m(&coeffs[0],100); - ibz_rand_interval_minm_m(&coeffs[1],100); - ibz_rand_interval_minm_m(&coeffs[2],100); - ibz_rand_interval_minm_m(&coeffs[3],100); - ibz_mat_4x4_eval(&gen.coord,&lideal_two.lattice.basis,&coeffs); - ibz_copy(&gen.denom,&lideal_two.lattice.denom); - - quat_alg_trace(&ibq_norm,&gen); - ibq_to_ibz(&temp,&ibq_norm); - find_gen = (0!=ibz_get(&temp)%2); - } - - assert(quat_lideal_isom(&quat_temp,&lideal_two,&lideal_small,&QUATALG_PINFTY)); - assert(quat_lideal_isom(&quat_temp,&lideal_two,&lideal_check,&QUATALG_PINFTY)); - // computing the ideal of the first step - - ibz_pow(&remainder,&ibz_const_two,TORSION_PLUS_EVEN_POWER); - quat_lideal_create_from_primitive(&lideal_two_one,&gen,&remainder,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - - - // computing the right_order - quat_lideal_right_order(&right_order,&lideal_two_one,&QUATALG_PINFTY); - - - assert(quat_lattice_contains(&coeffs,&right_order,&gen,&QUATALG_PINFTY)); - - // computing an ideal equivalent to lideal_two_one - quat_lideal_reduce_basis(&reduced,&gram,&lideal_two_one,&QUATALG_PINFTY); - found = found && klpt_lideal_equiv(&gen_two,&temp,&reduced,&gram,&lideal_two_one.norm,&lideal_two_one.lattice.denom,&QUATALG_PINFTY); - quat_lideal_create_from_primitive(&lideal_small_one,&gen_two,&temp,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - quat_alg_conj(&gen_two,&gen_two); - assert(quat_lattice_contains(&coeffs,&lideal_two_one.lattice,&gen_two,&QUATALG_PINFTY)); - assert(quat_lideal_isom(&quat_temp,&lideal_two_one,&lideal_small_one,&QUATALG_PINFTY)); - - quat_left_ideal_t ideal_test; - quat_left_ideal_init(&ideal_test); - quat_lideal_create_from_primitive(&ideal_test,&gen_two,&lideal_two_one.norm,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - assert(quat_lideal_equals(&ideal_test,&lideal_two_one,&QUATALG_PINFTY)); - - // casting gen into the right order of lideal_small_one - quat_alg_elem_copy(&quat_temp,&gen_two); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal_two_one.norm); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal_small_one.norm); - quat_alg_mul(&gen,&quat_temp,&gen,&QUATALG_PINFTY); - quat_alg_conj(&quat_temp,&gen_two); - quat_alg_mul(&gen,&gen,&quat_temp,&QUATALG_PINFTY); - - #ifndef NDEBUG - quat_lideal_right_order(&right_order,&lideal_small_one,&QUATALG_PINFTY); - assert(quat_lattice_contains(&coeffs,&right_order,&gen,&QUATALG_PINFTY)); - int lideal_generator_ok1= quat_lideal_generator_coprime(&quat_temp,&lideal_small_one,&ibz_const_two,&QUATALG_PINFTY,0); - assert(lideal_generator_ok1); - quat_alg_mul(&quat_temp,&quat_temp,&gen,&QUATALG_PINFTY); - ibz_pow(&temp,&ibz_const_two,TORSION_PLUS_EVEN_POWER*(length -1) ); - ibz_mul(&temp,&temp,&lideal_small_one.norm); - quat_lideal_create_from_primitive(&ideal_test,&quat_temp,&temp,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - assert(quat_lideal_isom(&quat_temp,&ideal_test,&lideal_check,&QUATALG_PINFTY)); - assert(quat_lideal_isom(&quat_temp,&ideal_test,&lideal_small,&QUATALG_PINFTY)); - if (!quat_lideal_isom(&quat_temp,&ideal_test,&lideal_check,&QUATALG_PINFTY)) { - printf("the final check will fail ! \n"); - } - #endif - - // copying the precomputed basis - basis_plus = BASIS_ODD_PLUS; - basis_minus = BASIS_ODD_MINUS; - odd_basis[0] = basis_minus; - odd_basis[1] = basis_plus; - - // copying the starting curve - curve = CURVE_E0; - - // Computing the first isogeny - id2iso_ideal_to_isogeny_even(&isog_two_one,&lideal_two_one); - - // computation of the deterministic second point as the kernel dual - ec_complete_basis_2(&even_basis,&curve,&isog_two_one.kernel); - kernel_dual = even_basis.Q; - - // evaluation through the first isogeny - ec_eval_even_basis(&curve,&isog_two_one,odd_basis,2); - - basis_minus = odd_basis[0]; basis_plus=odd_basis[1]; - ec_curve_t E; - ec_eval_even(&E,&isog_two_one,&kernel_dual,1); - - - id2iso_compressed_long_two_isog_init(&zip, length); - - found = found && id2iso_ideal_to_isogeny_two_long_power_of_2(&zip,&curve,&basis_minus,&basis_plus,&kernel_dual,&gen,length-1,&lideal_small_one,&lideal_two_one,&gen_two,&QUATALG_PINFTY); - - - if ( found ) { - ec_isog_odd_t isog_check; - id2iso_ideal_to_isogeny_odd(&isog_check,&CURVE_E0,&BASIS_ODD_PLUS,&BASIS_ODD_MINUS,&lideal_check); - ec_curve_t new_curve=CURVE_E0; - ec_eval_odd(&new_curve,&isog_check,&even_basis.P,1); - - // checking equality of j_inv - fp2_t j1,j2; - ec_j_inv(&j1,&new_curve); - ec_j_inv(&j2,&curve); - found = found && fp2_is_equal(&j1,&j2); - if (!fp2_is_equal(&j1,&j2)) { - printf(" the final check failed \n"); - } - } - else { - printf("the long translation failed \n"); - } - - - - // var finalize - quat_alg_elem_finalize(&gen_key); - quat_alg_elem_finalize(&gen_check); - quat_alg_elem_finalize(&quat_temp); - ibq_finalize(&ibq_norm); - ibz_finalize(&temp);ibz_finalize(&remainder);ibz_finalize(&n); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&gen_two); - quat_left_ideal_finalize(&lideal_small); - quat_left_ideal_finalize(&lideal_check); - quat_left_ideal_finalize(&lideal_two); - quat_left_ideal_finalize(&lideal_two_one); - quat_left_ideal_finalize(&lideal_small_one); - quat_left_ideal_finalize(&ideal_test); - quat_order_finalize(&right_order); - quat_alg_coord_finalize(&coeffs); - ibz_mat_4x4_finalize(&reduced);ibz_mat_4x4_finalize(&gram); - id2iso_compressed_long_two_isog_finalize(&zip); - - return found; -} - -int id2iso_test_id2iso() { - int res = 1; - printf("\n \nRunning id2iso tests for long id2iso \n \n"); - - - for (int i =0; i<3;i++) { - res = res && id2iso_test_long_id2iso(); - } - - if (!res) { - printf("ID2ISO unit test long id2iso failed\n"); - } - - return res; -} diff --git a/src/id2iso/ref/id2isox/test/id2ker_even.c b/src/id2iso/ref/id2isox/test/id2ker_even.c deleted file mode 100644 index 66d3ce1..0000000 --- a/src/id2iso/ref/id2isox/test/id2ker_even.c +++ /dev/null @@ -1,190 +0,0 @@ -#include "id2iso_tests.h" - -// TODO deduplicate with id2ker_odd.c - - -static void random_scalar(ibz_t *k) -{ - ibz_pow(k, &ibz_const_two, 123); - ibz_rand_interval(k, &ibz_const_zero, k); -} - - -// defined in src/klpt/ref/generic/tools.c -int represent_integer(quat_alg_elem_t *gamma, ibz_t *n_gamma, const quat_alg_t *Bpoo); - -// I will have norm dividing 2^f, whereas J will have norm dividing T -static void random_pair_of_equivalent_ideals(quat_left_ideal_t *I, quat_left_ideal_t *J) -{ - ibz_t normIJ; - ibz_init(&normIJ); - ibz_pow(&normIJ, &ibz_const_two, TORSION_PLUS_EVEN_POWER - (rand() % 5)); // arbitrarily divide out some powers of 2 - ibz_mul(&normIJ, &normIJ, &TORSION_ODD); - -// arbitrarily divide out one of the prime powers -{ -ibz_t rem; -ibz_init(&rem); -ibz_div(&normIJ, &rem, &normIJ, &TORSION_ODD_PRIMEPOWERS[rand() % sizeof(TORSION_ODD_PRIMEPOWERS)/sizeof(*TORSION_ODD_PRIMEPOWERS)]); -assert(ibz_is_zero(&rem)); -ibz_finalize(&rem); -} - - quat_alg_elem_t genI; - quat_alg_elem_init(&genI); - - { - int r = represent_integer(&genI, &normIJ, &QUATALG_PINFTY); - assert(r); - } - -// quat_alg_elem_print(&genI); - - quat_alg_elem_t genJ; - quat_alg_elem_init(&genJ); - quat_alg_conj(&genJ, &genI); - - ibz_t normI, normJ; - ibz_init(&normI); - ibz_init(&normJ); - ibz_gcd(&normJ, &normIJ, &TORSION_ODD); - { - ibz_t rem; - ibz_init(&rem); - ibz_div(&normI, &rem, &normIJ, &normJ); - assert(ibz_is_zero(&rem)); - ibz_finalize(&rem); - } - - quat_lideal_create_from_primitive(I, &genI, &normI, &MAXORD_O0, &QUATALG_PINFTY); - quat_lideal_create_from_primitive(J, &genJ, &normJ, &MAXORD_O0, &QUATALG_PINFTY); - - ibz_finalize(&normJ); - ibz_finalize(&normI); - quat_alg_elem_finalize(&genJ); - quat_alg_elem_finalize(&genI); - ibz_finalize(&normIJ); -} - - -int _id2iso_test_id2kerdlogs_even() -{ - int res = 1; - - quat_left_ideal_t ideal, ignored; - quat_left_ideal_init(&ideal); - { - quat_left_ideal_init(&ignored); - random_pair_of_equivalent_ideals(&ideal, &ignored); - quat_left_ideal_finalize(&ignored); - } -// quat_left_ideal_print(&ideal); - - ibz_vec_2_t vec1, vec2; - ibz_vec_2_init(&vec1); - ibz_vec_2_init(&vec2); - - // call it twice and make sure we get equivalent results - void id2iso_ideal_to_kernel_dlogs_even(ibz_vec_2_t *vec, const quat_left_ideal_t *lideal); - id2iso_ideal_to_kernel_dlogs_even(&vec1, &ideal); - id2iso_ideal_to_kernel_dlogs_even(&vec2, &ideal); - -// ibz_printf("vec1 = (%Zd, %Zd)\n", &vec1[0], &vec1[1]); -// ibz_printf("vec2 = (%Zd, %Zd)\n", &vec2[0], &vec2[1]); - - ibz_t lhs, rhs; - ibz_init(&lhs); - ibz_init(&rhs); - ibz_mul(&lhs, &vec1[0], &vec2[1]); - ibz_mul(&rhs, &vec2[0], &vec1[1]); - ibz_mod(&lhs, &lhs, &ideal.norm); - ibz_mod(&rhs, &rhs, &ideal.norm); -// ibz_printf("lhs = %Zd\n", &lhs); -// ibz_printf("rhs = %Zd\n", &rhs); - res &= !ibz_cmp(&lhs, &rhs); - ibz_finalize(&lhs); - ibz_finalize(&rhs); - - quat_left_ideal_finalize(&ideal); - - ibz_vec_2_finalize(&vec1); - ibz_vec_2_finalize(&vec2); - - return res; -} - -#include - -int _id2iso_test_id2ker_even() -{ - int res = 1; - - ec_isog_even_t isog1; - ec_isog_odd_t isog2; - do { - quat_left_ideal_t ideal1, ideal2; - quat_left_ideal_init(&ideal1); - quat_left_ideal_init(&ideal2); - - random_pair_of_equivalent_ideals(&ideal1, &ideal2); - -// quat_left_ideal_print(&ideal1); -// quat_left_ideal_print(&ideal2); - - id2iso_ideal_to_isogeny_even(&isog1, &ideal1); - id2iso_ideal_to_isogeny_odd(&isog2, &CURVE_E0, &BASIS_ODD_PLUS, &BASIS_ODD_MINUS, &ideal2); - - // check orders - { - if (!ibz_is_one(&ideal1.norm) && fp2_is_zero(&isog1.kernel.z)) { - printf("norm of ideal1 is >1 but kernel is trivial; something is wrong!\n"); - res &= 0; - } - if (!ibz_is_one(&ideal2.norm) && fp2_is_zero(&isog2.ker_plus.z) && fp2_is_zero(&isog2.ker_minus.z)) { - printf("norm of ideal2 is >1 but kernel is trivial; something is wrong!\n"); - res &= 0; - } - } - - quat_left_ideal_finalize(&ideal1); - quat_left_ideal_finalize(&ideal2); - // TODO: if 2^e-isogenies supported abritrary length this could be much faster - } while (isog1.length != TORSION_PLUS_EVEN_POWER); -// printf("2-isogeny length: %lu\n", (unsigned long) isog1.length); - - { - ec_curve_t curve1, curve2; - ec_eval_even(&curve1, &isog1, NULL, 0); - ec_eval_odd(&curve2, &isog2, NULL, 0); - - if (fp2_is_zero(&curve1.C) || fp2_is_zero(&curve2.C)) { - printf("broken curve constant after isogeny; something is wrong!\n"); - res &= 0; - } - - fp2_t j1, j2; - ec_j_inv(&j1, &curve1); - ec_j_inv(&j2, &curve2); - - res &= fp2_is_equal(&j1, &j2); - } - - return res; -} - - -int id2iso_test_id2ker_even() { - int res = 1; - printf("\n \nRunning id2iso tests for ideal_to_kernel_even() \n \n"); - - for (int i = 0; i < 5; i++) { - res &= _id2iso_test_id2kerdlogs_even(); - res &= _id2iso_test_id2ker_even(); - } - - if (!res) { - printf("ID2ISO unit test ideal_to_kernel_even() failed\n"); - } - - return res; -} diff --git a/src/id2iso/ref/id2isox/test/id2ker_odd.c b/src/id2iso/ref/id2isox/test/id2ker_odd.c deleted file mode 100644 index c4411f6..0000000 --- a/src/id2iso/ref/id2isox/test/id2ker_odd.c +++ /dev/null @@ -1,189 +0,0 @@ -#include "id2iso_tests.h" - -// TODO deduplicate with id2ker_odd.c - - -static void random_scalar(ibz_t *k) -{ - ibz_pow(k, &ibz_const_two, 123); - ibz_rand_interval(k, &ibz_const_zero, k); -} - - -// defined in src/klpt/ref/generic/tools.c -int represent_integer(quat_alg_elem_t *gamma, ibz_t *n_gamma, const quat_alg_t *Bpoo); - -// both ideals will have norm dividing T -static void random_pair_of_equivalent_ideals(quat_left_ideal_t *I, quat_left_ideal_t *J) -{ - ibz_t normIJ; - ibz_init(&normIJ); - ibz_mul(&normIJ, &TORSION_ODD, &TORSION_ODD); - -// arbitrarily divide out one of the prime powers -{ -ibz_t rem; -ibz_init(&rem); -ibz_div(&normIJ, &rem, &normIJ, &TORSION_ODD_PRIMEPOWERS[rand() % sizeof(TORSION_ODD_PRIMEPOWERS)/sizeof(*TORSION_ODD_PRIMEPOWERS)]); -assert(ibz_is_zero(&rem)); -ibz_finalize(&rem); -} - - quat_alg_elem_t genI; - quat_alg_elem_init(&genI); - - { - int r = represent_integer(&genI, &normIJ, &QUATALG_PINFTY); - assert(r); - } - -// quat_alg_elem_print(&genI); - - quat_alg_elem_t genJ; - quat_alg_elem_init(&genJ); - quat_alg_conj(&genJ, &genI); - - ibz_t normI, normJ; - ibz_init(&normI); - ibz_init(&normJ); - ibz_gcd(&normI, &normIJ, &TORSION_ODD); - { - ibz_t rem; - ibz_init(&rem); - ibz_div(&normJ, &rem, &normIJ, &normI); - assert(ibz_is_zero(&rem)); - ibz_finalize(&rem); - } - - quat_lideal_create_from_primitive(I, &genI, &normI, &MAXORD_O0, &QUATALG_PINFTY); - quat_lideal_create_from_primitive(J, &genJ, &normJ, &MAXORD_O0, &QUATALG_PINFTY); - - ibz_finalize(&normJ); - ibz_finalize(&normI); - quat_alg_elem_finalize(&genJ); - quat_alg_elem_finalize(&genI); - ibz_finalize(&normIJ); -} - - -int _id2iso_test_id2kerdlogs_odd() -{ - int res = 1; - - quat_left_ideal_t ideal, ignored; - quat_left_ideal_init(&ideal); - { - quat_left_ideal_init(&ignored); - random_pair_of_equivalent_ideals(&ignored, &ideal); - quat_left_ideal_finalize(&ignored); - } -// quat_left_ideal_print(&ideal); - - ibz_vec_2_t vec1, vec2; - ibz_vec_2_init(&vec1); - ibz_vec_2_init(&vec2); - - // call it twice and make sure we get equivalent results - void id2iso_ideal_to_kernel_dlogs_odd(ibz_vec_2_t *vec, ec_degree_odd_t *deg, const quat_left_ideal_t *lideal); - ec_degree_odd_t deg1, deg2; - id2iso_ideal_to_kernel_dlogs_odd(&vec1, °1, &ideal); - id2iso_ideal_to_kernel_dlogs_odd(&vec2, °2, &ideal); - -// ibz_printf("vec1 = (%Zd, %Zd)\n", &vec1[0], &vec1[1]); -// ibz_printf("vec2 = (%Zd, %Zd)\n", &vec2[0], &vec2[1]); -// printf("deg1 = "); for (size_t i = 0; i < sizeof(deg1)/sizeof(*deg1); ++i) printf(",%d"+(!i), (int) deg1[i]); printf("\n"); -// printf("deg2 = "); for (size_t i = 0; i < sizeof(deg2)/sizeof(*deg2); ++i) printf(",%d"+(!i), (int) deg2[i]); printf("\n"); - - ibz_t lhs, rhs; - ibz_init(&lhs); - ibz_init(&rhs); - ibz_mul(&lhs, &vec1[0], &vec2[1]); - ibz_mul(&rhs, &vec2[0], &vec1[1]); - ibz_mod(&lhs, &lhs, &ideal.norm); - ibz_mod(&rhs, &rhs, &ideal.norm); -// ibz_printf("lhs = %Zd\n", &lhs); -// ibz_printf("rhs = %Zd\n", &rhs); - res &= !ibz_cmp(&lhs, &rhs); - ibz_finalize(&lhs); - ibz_finalize(&rhs); - - quat_left_ideal_finalize(&ideal); - - ibz_vec_2_finalize(&vec1); - ibz_vec_2_finalize(&vec2); - - return res; -} - -#include - -int _id2iso_test_id2ker_odd() -{ - int res = 1; - - ec_isog_odd_t isog1, isog2; - { - quat_left_ideal_t ideal1, ideal2; - quat_left_ideal_init(&ideal1); - quat_left_ideal_init(&ideal2); - - random_pair_of_equivalent_ideals(&ideal1, &ideal2); - -// quat_left_ideal_print(&ideal1); -// quat_left_ideal_print(&ideal2); - - id2iso_ideal_to_isogeny_odd(&isog1, &CURVE_E0, &BASIS_ODD_PLUS, &BASIS_ODD_MINUS, &ideal1); - id2iso_ideal_to_isogeny_odd(&isog2, &CURVE_E0, &BASIS_ODD_PLUS, &BASIS_ODD_MINUS, &ideal2); - - // check orders - { - if (!ibz_is_one(&ideal1.norm) && fp2_is_zero(&isog1.ker_plus.z) && fp2_is_zero(&isog1.ker_minus.z)) { - printf("norm of ideal1 is >1 but kernel is trivial; something is wrong!\n"); - res &= 0; - } - if (!ibz_is_one(&ideal2.norm) && fp2_is_zero(&isog2.ker_plus.z) && fp2_is_zero(&isog2.ker_minus.z)) { - printf("norm of ideal2 is >1 but kernel is trivial; something is wrong!\n"); - res &= 0; - } - } - - quat_left_ideal_finalize(&ideal1); - quat_left_ideal_finalize(&ideal2); - } - - { - ec_curve_t curve1, curve2; - ec_eval_odd(&curve1, &isog1, NULL, 0); - ec_eval_odd(&curve2, &isog2, NULL, 0); - - if (fp2_is_zero(&curve1.C) || fp2_is_zero(&curve2.C)) { - printf("broken curve constant after isogeny; something is wrong!\n"); - res &= 0; - } - - fp2_t j1, j2; - ec_j_inv(&j1, &curve1); - ec_j_inv(&j2, &curve2); - - res &= fp2_is_equal(&j1, &j2); - } - - return res; -} - - -int id2iso_test_id2ker_odd() { - int res = 1; - printf("\n \nRunning id2iso tests for ideal_to_kernel_odd() \n \n"); - - for (int i = 0; i < 5; i++) { - res &= _id2iso_test_id2kerdlogs_odd(); - res &= _id2iso_test_id2ker_odd(); - } - - if (!res) { - printf("ID2ISO unit test ideal_to_kernel_odd() failed\n"); - } - - return res; -} diff --git a/src/id2iso/ref/id2isox/test/ker2id.c b/src/id2iso/ref/id2isox/test/ker2id.c deleted file mode 100644 index 5f5f21f..0000000 --- a/src/id2iso/ref/id2isox/test/ker2id.c +++ /dev/null @@ -1,65 +0,0 @@ -#include "id2iso_tests.h" - -static void random_scalar(ibz_t *k) -{ - ibz_pow(k, &ibz_const_two, 123); - ibz_rand_interval(k, &ibz_const_zero, k); -} - -int _id2iso_test_ker2id() { - int res = 1; - - ibz_vec_2_t vec2, vec3; - ibz_vec_2_init(&vec2); - ibz_vec_2_init(&vec3); - - { - ibz_t gcd; - ibz_init(&gcd); - do { - random_scalar(&vec2[0]); - random_scalar(&vec2[1]); - ibz_gcd(&gcd, &vec2[0], &vec2[1]); - } while (ibz_divides(&gcd, &ibz_const_two)); - ibz_t three; - ibz_init(&three); - ibz_set(&three, 3); - do { - random_scalar(&vec3[0]); - random_scalar(&vec3[1]); - ibz_gcd(&gcd, &vec3[0], &vec3[1]); - } while (ibz_divides(&gcd, &three)); - ibz_finalize(&three); - ibz_finalize(&gcd); - } -// ibz_printf("vec2 = (%Zd,%Zd)\n", &vec2[0], &vec2[1]); -// ibz_printf("vec3 = (%Zd,%Zd)\n", &vec3[0], &vec3[1]); - - quat_left_ideal_t I; - quat_left_ideal_init(&I); - id2iso_kernel_dlogs_to_ideal(&I, &vec2, &vec3); -// quat_left_ideal_print(&I); - quat_left_ideal_finalize(&I); - ibz_vec_2_finalize(&vec2); - ibz_vec_2_finalize(&vec3); - - //TODO FIXME this really only tests that the function doesn't crash - - return res; -} - - -int id2iso_test_ker2id() { - int res = 1; - printf("\n \nRunning id2iso tests for kernel_dlogs_to_ideal() \n \n"); - - for (int i = 0; i < 10; i++) { - res &= _id2iso_test_ker2id(); - } - - if (!res) { - printf("ID2ISO unit test kernel_dlogs_to_ideal() failed\n"); - } - - return res; -} diff --git a/src/id2iso/ref/id2isox/test/test_id2iso.c b/src/id2iso/ref/id2isox/test/test_id2iso.c deleted file mode 100644 index 511f2f9..0000000 --- a/src/id2iso/ref/id2isox/test/test_id2iso.c +++ /dev/null @@ -1,24 +0,0 @@ - -#include "id2iso_tests.h" - -// run all tests in module -int main(){ - int res = 1; - - randombytes_init((unsigned char *) "some", (unsigned char *) "string", 128); - - printf("Running id2iso module unit tests\n"); - - res = res & id2iso_test_ker2id(); - res = res & id2iso_test_id2ker_even(); - res = res & id2iso_test_id2ker_odd(); - res = res & id2iso_test_id2iso(); - - if(!res){ - printf("\nSome tests failed!\n"); - } - else { - printf("All tests passed!\n"); - } - return(!res); -} diff --git a/src/id2iso/ref/include/id2iso.h b/src/id2iso/ref/include/id2iso.h index 83b7249..1b4eaae 100644 --- a/src/id2iso/ref/include/id2iso.h +++ b/src/id2iso/ref/include/id2iso.h @@ -1,139 +1,280 @@ /** @file - * + * * @authors Antonin Leroux - * - * @brief The id2iso algorithms + * + * @brief The id2iso algorithms */ #ifndef ID2ISO_H #define ID2ISO_H -#include -#include -#include +#include #include +#include +#include +#include +#include +#include +#include /** @defgroup id2iso_id2iso Ideal to isogeny conversion * @{ -*/ - -/** @defgroup id2iso_iso_types Types for isogenies needed for the id2iso - * @{ -*/ - -/** @brief Type for long chain of two isogenies - * - * @typedef id2iso_long_two_isog - * - * Represented as a vector ec_isog_even_t -*/ -typedef struct id2iso_long_two_isog { - unsigned short length; ///< the number of smaller two isogeny chains - ec_isog_even_t *chain; ///< the chain of two isogeny -} id2iso_long_two_isog_t; - -/** @brief Type for compressed long chain of two isogenies - * - * @typedef id2iso_compressed_long_two_isog - * - * Represented as a vector of intbig -*/ -typedef struct id2iso_compressed_long_two_isog { - unsigned short length; ///< the number of smaller two isogeny chains - ibz_t *zip_chain; ///< the chain of two isogeny, compressed - unsigned char bit_first_step ; ///< the bit for the first step -} id2iso_compressed_long_two_isog_t; - -/** @} -*/ + */ +static const quat_represent_integer_params_t QUAT_represent_integer_params = { + .algebra = &QUATALG_PINFTY, /// The level-specific quaternion algebra + .order = &(EXTREMAL_ORDERS[0]), // The special extremal order O0 + .primality_test_iterations = QUAT_primality_num_iter // precompted bound on the iteration number in primality tests +}; /*************************** Functions *****************************/ - -/** @defgroup id2iso Constructors and Destructors - * @{ -*/ -void id2iso_long_two_isog_init(id2iso_long_two_isog_t *isog, const size_t length); -void id2iso_long_two_isog_finalize(id2iso_long_two_isog_t *isog); - -void id2iso_compressed_long_two_isog_init(id2iso_compressed_long_two_isog_t *zip, const size_t length); -void id2iso_compressed_long_two_isog_finalize(id2iso_compressed_long_two_isog_t *zip); - -/** @} -*/ - /** @defgroup id2iso_others Other functions needed for id2iso * @{ -*/ - -/** - * @brief Translating an ideal of norm a big power of 2 into the corresponding isogeny - * - * @param isog_zip Output : compression of the output isogeny - * @param basis_minus : odd torsion basis (in the end, this will be the basis pushed through the output isogeny) - * @param basis_plus : odd torsion basis (in the end, this will be the basis pushed through the output isogeny) - * @param domain : the starting curve (in the end, this will be the codomain of the output isogeny) - * @param kernel_dual : the dual of the kernel of the last step of isog_start_two (in the end this will be the kernel of the dual of the last step of the output isogeny) - * @param gen_input : quaternion element, element of a maximal order O, generator of the O-ideal to be translated - * @param length : the length of the chain to be translated - * @param lideal_start_small : a small ideal equivalent to lideal_start_two of right order equal to O - * @param lideal_start_two : O0-ideal of norm a power of 2 equivalent to lideal_start_small, corresponding to an isogeny isog_start_two - * @param gen_two element of O0, generator of lideal_start_two - * @param Bpoo : the quaternion algebra - * @returns a bit indicating if the computation succeeded - * /!\ the composition of isog_start_two and isog might be backtracking - * lideal_start_two = O0 < gen_two , 2^*> - * lideal_start_small = O0 < conj(gen_two), * > - * lideal_start_small = lideal_lideal_start_two * conj(gen_two) / 2^* - * The ideal to be translated is equal to O < gen_input, 2^e> where O = OR(lideal_start_small) - * - * assumes that the ideal given in input has exactly norm 2^e where e = length * f (where f = TORSION_PLUS_EVEN_POWER) - * when used for compressing an isogeny, we assume that the curve given in input is normalized - */ -int id2iso_ideal_to_isogeny_two_long_power_of_2(id2iso_compressed_long_two_isog_t *isog_zip, ec_curve_t *domain, ec_basis_t *basis_minus, ec_basis_t *basis_plus, ec_point_t *kernel_dual, const quat_alg_elem_t *gen_input, const int length, const quat_left_ideal_t *lideal_start_small, const quat_left_ideal_t *lideal_start_two, const quat_alg_elem_t *gen_two, const quat_alg_t *Bpoo); - -/** - * @brief Translating an ideal of odd norm dividing p²-1 into the corresponding isogeny - * - * @param isog Output : the output isogeny - * @param basis_minus : a basis of ec points - * @param basis_plus : a basis of ec points - * @param domain : an elliptic curve - * @param lideal_input : O0-ideal corresponding to the ideal to be translated - * - * compute the isogeny starting from domain corresponding to ideal_input - * the coefficients extracted from the ideal are to be applied to basis_minus and basis_plus to compute the kernel of the isogeny. - * */ -void id2iso_ideal_to_isogeny_odd(ec_isog_odd_t *isog, const ec_curve_t *domain, const ec_basis_t *basis_plus,const ec_basis_t *basis_minus, const quat_left_ideal_t *lideal_input); - /** - * @brief Translating an ideal of norm a power of two dividing p²-1 into the corresponding isogeny + * @brief Scalar multiplication [x]P + [y]Q where x and y are stored inside an + * ibz_vec_2_t [x, y] and P, Q in E[2^f] + * + * @param res Output: the point R = [x]P + [y]Q + * @param scalar_vec: a vector of ibz type elements (x, y) + * @param f: an integer such that P, Q are in E[2^f] + * @param PQ: an x-only basis x(P), x(Q) and x(P-Q) + * @param curve: the curve E the points P, Q, R are defined on * - * @param isog Output : the output isogeny - * @param lideal_input : O0-ideal corresponding to the ideal to be translated - * */ - -void id2iso_ideal_to_isogeny_even(ec_isog_even_t *isog, const quat_left_ideal_t *lideal_input); - +void ec_biscalar_mul_ibz_vec(ec_point_t *res, + const ibz_vec_2_t *scalar_vec, + const int f, + const ec_basis_t *PQ, + const ec_curve_t *curve); /** - * @brief Translating a kernel on the curve E0, represented as two vectors with respect to the precomputed 2^f- and 3^e-torsion bases, into the corresponding O0-ideal + * @brief Translating an ideal of norm 2^f dividing p²-1 into the corresponding + * kernel coefficients + * + * @param ker_dlog Output : two coefficients indicating the decomposition of the + * kernel over the canonical basis of E0[2^f] + * @param lideal_input : O0-ideal corresponding to the ideal to be translated of + * norm 2^f + * + */ +void id2iso_ideal_to_kernel_dlogs_even(ibz_vec_2_t *ker_dlog, const quat_left_ideal_t *lideal_input); + +/** + * @brief Applies some 2x2 matrix on a basis of E[2^TORSION_EVEN_POWER] + * + * @param P the basis + * @param E the curve + * @param mat the matrix + * @param f TORSION_EVEN_POWER + * @returns 1 if success, 0 if error + * + * helper function, works in place + * + */ +int matrix_application_even_basis(ec_basis_t *P, const ec_curve_t *E, ibz_mat_2x2_t *mat, int f); + +/** + * @brief Applies some endomorphism of an alternate curve to E[f] + * + * @param P the basis + * @param index_alternate_curve index of the alternate order in the list of precomputed extremal + * orders + * @param E the curve (E is not required to be the alternate curve in question since in the end we + * only apply a matrix) + * @param theta the endomorphism + * @param f TORSION_EVEN_POWER + * + * helper function, works in place + * + */ +void endomorphism_application_even_basis(ec_basis_t *P, + const int index_alternate_curve, + const ec_curve_t *E, + const quat_alg_elem_t *theta, + int f); + +/** + * @brief Translating a kernel on the curve E0, represented as a vector with + * respect to the precomputed 2^f-torsion basis, into the corresponding O0-ideal * * @param lideal Output : the output O0-ideal - * @param vec2 : length-2 vector giving the 2-power part of the kernel with respect to the precomputed TORSION_PLUS_2POWER basis - * @param vec3 : length-2 vector giving the 3-power part of the kernel with respect to the precomputed TORSION_PLUS_3POWER basis + * @param f : exponent definining the norm of the ideal to compute + * @param vec2 : length-2 vector giving the 2-power part of the kernel with + * respect to the precomputed 2^f basis * */ -void id2iso_kernel_dlogs_to_ideal(quat_left_ideal_t *lideal, const ibz_vec_2_t *vec2, const ibz_vec_2_t *vec3); +void id2iso_kernel_dlogs_to_ideal_even(quat_left_ideal_t *lideal, const ibz_vec_2_t *vec2, int f); + +/** + * @brief Change of basis matrix for full basis B2 + * Finds mat such that: + * (mat*v).B2 = v.B1 + * where "." is the dot product, defined as (v1,v2).(P,Q) = v1*P + v2*Q + * + * @param mat the computed change of basis matrix + * @param B1 the source basis for E[2^f] + * @param B2 the target basis for E[2^e] + * @param E the elliptic curve + * @param f 2^f is the order of the points of the input basis + * + * mat encodes the coordinates of the points of B1 in the basis B2 + */ +void change_of_basis_matrix_tate(ibz_mat_2x2_t *mat, const ec_basis_t *B1, const ec_basis_t *B2, ec_curve_t *E, int f); + +/** + * @brief Change of basis matrix for full basis B2 + * Finds mat such that: + * (mat*v).B1 = [2^e-f]*v.B2 + * where "." is the dot product, defined as (v1,v2).(P,Q) = v1*P + v2*Q + * + * @param mat the computed change of basis matrix + * @param B1 the source basis for E[2^e] + * @param B2 the target basis for E[2^f] + * @param E the elliptic curve + * @param f 2^f is the order of the points of the input basis + * + * mat encodes the coordinates of the points of B1 in the basis B2, by + * applying change_of_basis_matrix_tate and inverting the outcome + */ +void change_of_basis_matrix_tate_invert(ibz_mat_2x2_t *mat, + const ec_basis_t *B1, + const ec_basis_t *B2, + ec_curve_t *E, + int f); /** @} */ + +/** @defgroup id2iso_arbitrary Arbitrary isogeny evaluation + * @{ + */ +/** + * @brief Function to find elements u, v, d1, d2, beta1, beta2 for the ideal to isogeny + * + * @param u Output: integer + * @param v Output: integer + * @param beta1 Output: quaternion element + * @param beta2 Output: quaternion element + * @param d1 Output: integer + * @param d2 Output: integer + * @param index_alternate_order_1 Output: small integer (index of an alternate order) + * @param index_alternate_order_2 Output: small integer (index of an alternate order) + * @param target : integer, target norm + * @param lideal : O0-ideal defining the search space + * @param Bpoo : quaternion algebra + * @param num_alternate_order number of alternate order we consider + * @returns 1 if the computation succeeds, 0 otherwise + * + * Let us write ti = index_alternate_order_i, + * we look for u,v,beta1,beta2,d1,d2,t1,t2 + * such that u d1 + v d2 = target + * and where di = norm(betai)/norm(Ii), where the ideal Ii is equal to overbar{Ji} * lideal and + * betai is in Ii where Ji is a connecting ideal between the maximal order O0 and O_ti t1,t2 must be + * contained between 0 and num_alternate_order This corresponds to the function SuitableIdeals in + * the spec + */ +int find_uv(ibz_t *u, + ibz_t *v, + quat_alg_elem_t *beta1, + quat_alg_elem_t *beta2, + ibz_t *d1, + ibz_t *d2, + int *index_alternate_order_1, + int *index_alternate_order_2, + const ibz_t *target, + const quat_left_ideal_t *lideal, + const quat_alg_t *Bpoo, + int num_alternate_order); + +/** + * @brief Computes an arbitrary isogeny of fixed degree starting from E0 + * and evaluates it a list of points of the form (P1,0) or (0,P2). + * + * @param lideal Output : an ideal of norm u + * @param u : integer + * @param small : bit indicating if we the value of u is "small" meaning that we + expect it to be + * around sqrt{p}, in that case we use a length slightly above + * @param E34 Output: the codomain curve + * @param P12 Input/Output: pointer to points to be pushed through the isogeny + (in-place) + * @param numP: length of the list of points given in P12 (can be zero) + * @param index_alternate_order : index of the special extremal order to be used (in the list of + these orders) + * @returns the length of the chain if the computation succeeded, zero upon + failure + * + * F is an isogeny encoding an isogeny [adjust]*phi : E0 -> Eu of degree u + * note that the codomain of F can be either Eu x Eu' or Eu' x Eu for some curve + Eu' + */ +int fixed_degree_isogeny_and_eval(quat_left_ideal_t *lideal, + const ibz_t *u, + bool small, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP, + const int index_alternate_order); + +/** + * @brief Translating an ideal into a representation of the corresponding + * isogeny + * + * @param beta1 Output: quaternion element + * @param beta2 Output: quaternion element + * @param u Output: integer + * @param v Output: integer + * @param d1 Output: integer + * @param d2 Output: integer + * @param codomain the codomain of the isogeny corresponding to lideal + * @param basis Output : evaluation of the canonical basis of E0 through the + * ideal corresponding to lideal + * @param lideal : O0 - ideal in input + * @param Bpoo : the quaternion algebra + * @returns 1 if the computation succeeded, 0 otherwise + * + * Compute the codomain and image on the basis of E0 of the isogeny + * E0 -> codomain corresponding to lideal + * + * There is some integer e >= 0 such that + * 2^e * u, 2^e * v,beta1, beta2, d1, d2 are the output of find_uv + * on input target = 2^TORSION_PLUS_EVEN_POWER and lideal + * + * codomain and basis are computed with the help of a dimension 2 isogeny + * of degree 2^TORSION_PLUS_EVEN_POWER - e using a Kani diagram + * + */ +int dim2id2iso_ideal_to_isogeny_clapotis(quat_alg_elem_t *beta1, + quat_alg_elem_t *beta2, + ibz_t *u, + ibz_t *v, + ibz_t *d1, + ibz_t *d2, + ec_curve_t *codomain, + ec_basis_t *basis, + const quat_left_ideal_t *lideal, + const quat_alg_t *Bpoo); + +/** + * @brief Translating an ideal into a representation of the corresponding + * isogeny + * + * @param basis Output : evaluation of the canonical basis of E0 through the + * ideal corresponding to lideal + * @param lideal : ideal in input + * @param codomain + * @returns 1 if the computation succeeds, 0 otherwise + * + * This is a wrapper around the ideal to isogeny clapotis function + */ +int dim2id2iso_arbitrary_isogeny_evaluation(ec_basis_t *basis, ec_curve_t *codomain, const quat_left_ideal_t *lideal); + /** @} */ - +/** @} + */ #endif diff --git a/src/id2iso/ref/lvl1/CMakeLists.txt b/src/id2iso/ref/lvl1/CMakeLists.txt index 17c5e1b..c7637fa 100644 --- a/src/id2iso/ref/lvl1/CMakeLists.txt +++ b/src/id2iso/ref/lvl1/CMakeLists.txt @@ -1,10 +1 @@ - -set(SOURCE_FILES_ID2ISO_GENERIC_REF - ${ID2ISOX_DIR}/id2iso.c -) - -add_library(${LIB_ID2ISO_${SVARIANT_UPPER}} ${SOURCE_FILES_ID2ISO_GENERIC_REF}) -target_include_directories(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_ID2ISO} ${INC_COMMON} ${INC_GF_${SVARIANT_UPPER}}) -target_compile_options(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/id2iso/ref/lvl1/test/CMakeLists.txt b/src/id2iso/ref/lvl1/test/CMakeLists.txt index d5c520f..316e0a8 100644 --- a/src/id2iso/ref/lvl1/test/CMakeLists.txt +++ b/src/id2iso/ref/lvl1/test/CMakeLists.txt @@ -1,12 +1 @@ -set(SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS - ${ID2ISOX_DIR}/test/ker2id.c - ${ID2ISOX_DIR}/test/id2ker_even.c - ${ID2ISOX_DIR}/test/id2ker_odd.c - ${ID2ISOX_DIR}/test/id2iso.c - ${ID2ISOX_DIR}/test/test_id2iso.c -) -add_executable(sqisign_test_id2iso_${SVARIANT_LOWER} ${SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_id2iso_${SVARIANT_LOWER} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_id2iso_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_INTBIG} ${INC_EC} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_ID2ISO} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ./include/ ) - -add_test(sqisign_test_id2iso_${SVARIANT_LOWER} sqisign_test_id2iso_${SVARIANT_LOWER}) +include(../../lvlx_test.cmake) diff --git a/src/id2iso/ref/lvl3/CMakeLists.txt b/src/id2iso/ref/lvl3/CMakeLists.txt index 17c5e1b..c7637fa 100644 --- a/src/id2iso/ref/lvl3/CMakeLists.txt +++ b/src/id2iso/ref/lvl3/CMakeLists.txt @@ -1,10 +1 @@ - -set(SOURCE_FILES_ID2ISO_GENERIC_REF - ${ID2ISOX_DIR}/id2iso.c -) - -add_library(${LIB_ID2ISO_${SVARIANT_UPPER}} ${SOURCE_FILES_ID2ISO_GENERIC_REF}) -target_include_directories(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_ID2ISO} ${INC_COMMON} ${INC_GF_${SVARIANT_UPPER}}) -target_compile_options(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/id2iso/ref/lvl3/test/CMakeLists.txt b/src/id2iso/ref/lvl3/test/CMakeLists.txt index d5c520f..316e0a8 100644 --- a/src/id2iso/ref/lvl3/test/CMakeLists.txt +++ b/src/id2iso/ref/lvl3/test/CMakeLists.txt @@ -1,12 +1 @@ -set(SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS - ${ID2ISOX_DIR}/test/ker2id.c - ${ID2ISOX_DIR}/test/id2ker_even.c - ${ID2ISOX_DIR}/test/id2ker_odd.c - ${ID2ISOX_DIR}/test/id2iso.c - ${ID2ISOX_DIR}/test/test_id2iso.c -) -add_executable(sqisign_test_id2iso_${SVARIANT_LOWER} ${SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_id2iso_${SVARIANT_LOWER} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_id2iso_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_INTBIG} ${INC_EC} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_ID2ISO} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ./include/ ) - -add_test(sqisign_test_id2iso_${SVARIANT_LOWER} sqisign_test_id2iso_${SVARIANT_LOWER}) +include(../../lvlx_test.cmake) diff --git a/src/id2iso/ref/lvl5/CMakeLists.txt b/src/id2iso/ref/lvl5/CMakeLists.txt index 17c5e1b..c7637fa 100644 --- a/src/id2iso/ref/lvl5/CMakeLists.txt +++ b/src/id2iso/ref/lvl5/CMakeLists.txt @@ -1,10 +1 @@ - -set(SOURCE_FILES_ID2ISO_GENERIC_REF - ${ID2ISOX_DIR}/id2iso.c -) - -add_library(${LIB_ID2ISO_${SVARIANT_UPPER}} ${SOURCE_FILES_ID2ISO_GENERIC_REF}) -target_include_directories(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_ID2ISO} ${INC_COMMON} ${INC_GF_${SVARIANT_UPPER}}) -target_compile_options(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) +include(../lvlx.cmake) diff --git a/src/id2iso/ref/lvl5/test/CMakeLists.txt b/src/id2iso/ref/lvl5/test/CMakeLists.txt index d5c520f..316e0a8 100644 --- a/src/id2iso/ref/lvl5/test/CMakeLists.txt +++ b/src/id2iso/ref/lvl5/test/CMakeLists.txt @@ -1,12 +1 @@ -set(SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS - ${ID2ISOX_DIR}/test/ker2id.c - ${ID2ISOX_DIR}/test/id2ker_even.c - ${ID2ISOX_DIR}/test/id2ker_odd.c - ${ID2ISOX_DIR}/test/id2iso.c - ${ID2ISOX_DIR}/test/test_id2iso.c -) -add_executable(sqisign_test_id2iso_${SVARIANT_LOWER} ${SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_id2iso_${SVARIANT_LOWER} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_id2iso_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_INTBIG} ${INC_EC} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_ID2ISO} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ./include/ ) - -add_test(sqisign_test_id2iso_${SVARIANT_LOWER} sqisign_test_id2iso_${SVARIANT_LOWER}) +include(../../lvlx_test.cmake) diff --git a/src/id2iso/ref/lvlx.cmake b/src/id2iso/ref/lvlx.cmake new file mode 100644 index 0000000..9b8c0f9 --- /dev/null +++ b/src/id2iso/ref/lvlx.cmake @@ -0,0 +1,12 @@ +set(SOURCE_FILES_ID2ISO_GENERIC_REF + ${LVLX_DIR}/id2iso.c + ${LVLX_DIR}/dim2id2iso.c +) + +add_library(${LIB_ID2ISO_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_ID2ISO_GENERIC_REF}) +target_link_libraries(${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_MP} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${LIB_HD_${SVARIANT_UPPER}}) +target_include_directories(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE ${INC_PUBLIC} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_MP} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_HD} ${INC_ID2ISO} ${INC_COMMON}) +target_compile_options(${LIB_ID2ISO_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_compile_definitions(${LIB_ID2ISO_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + +add_subdirectory(test) diff --git a/src/id2iso/ref/lvlx/dim2id2iso.c b/src/id2iso/ref/lvlx/dim2id2iso.c new file mode 100644 index 0000000..171473d --- /dev/null +++ b/src/id2iso/ref/lvlx/dim2id2iso.c @@ -0,0 +1,1172 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int +_fixed_degree_isogeny_impl(quat_left_ideal_t *lideal, + const ibz_t *u, + bool small, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP, + const int index_alternate_order) +{ + + // var declaration + int ret; + ibz_t two_pow, tmp; + quat_alg_elem_t theta; + + ec_curve_t E0; + copy_curve(&E0, &CURVES_WITH_ENDOMORPHISMS[index_alternate_order].curve); + ec_curve_normalize_A24(&E0); + + unsigned length; + + int u_bitsize = ibz_bitsize(u); + + // deciding the power of 2 of the dim2 isogeny we use for this + // the smaller the faster, but if it set too low there is a risk that + // RepresentInteger will fail + if (!small) { + // in that case, we just set it to be the biggest value possible + length = TORSION_EVEN_POWER - HD_extra_torsion; + } else { + length = ibz_bitsize(&QUATALG_PINFTY.p) + QUAT_repres_bound_input - u_bitsize; + assert(u_bitsize < (int)length); + assert(length < TORSION_EVEN_POWER - HD_extra_torsion); + } + assert(length); + + // var init + ibz_init(&two_pow); + ibz_init(&tmp); + quat_alg_elem_init(&theta); + + ibz_pow(&two_pow, &ibz_const_two, length); + ibz_copy(&tmp, u); + assert(ibz_cmp(&two_pow, &tmp) > 0); + assert(!ibz_is_even(&tmp)); + + // computing the endomorphism theta of norm u * (2^(length) - u) + ibz_sub(&tmp, &two_pow, &tmp); + ibz_mul(&tmp, &tmp, u); + assert(!ibz_is_even(&tmp)); + + // setting-up the quat_represent_integer_params + quat_represent_integer_params_t ri_params; + ri_params.primality_test_iterations = QUAT_represent_integer_params.primality_test_iterations; + + quat_p_extremal_maximal_order_t order_hnf; + quat_alg_elem_init(&order_hnf.z); + quat_alg_elem_copy(&order_hnf.z, &EXTREMAL_ORDERS[index_alternate_order].z); + quat_alg_elem_init(&order_hnf.t); + quat_alg_elem_copy(&order_hnf.t, &EXTREMAL_ORDERS[index_alternate_order].t); + quat_lattice_init(&order_hnf.order); + ibz_copy(&order_hnf.order.denom, &EXTREMAL_ORDERS[index_alternate_order].order.denom); + ibz_mat_4x4_copy(&order_hnf.order.basis, &EXTREMAL_ORDERS[index_alternate_order].order.basis); + order_hnf.q = EXTREMAL_ORDERS[index_alternate_order].q; + ri_params.order = &order_hnf; + ri_params.algebra = &QUATALG_PINFTY; + +#ifndef NDEBUG + assert(quat_lattice_contains(NULL, &ri_params.order->order, &ri_params.order->z)); + assert(quat_lattice_contains(NULL, &ri_params.order->order, &ri_params.order->t)); +#endif + + ret = quat_represent_integer(&theta, &tmp, 1, &ri_params); + + assert(!ibz_is_even(&tmp)); + + if (!ret) { + printf("represent integer failed for the alternate order number %d and for " + "a target of " + "size %d for a u of size %d with length = " + "%u \n", + index_alternate_order, + ibz_bitsize(&tmp), + ibz_bitsize(u), + length); + goto cleanup; + } + quat_lideal_create(lideal, &theta, u, &order_hnf.order, &QUATALG_PINFTY); + + quat_alg_elem_finalize(&order_hnf.z); + quat_alg_elem_finalize(&order_hnf.t); + quat_lattice_finalize(&order_hnf.order); + +#ifndef NDEBUG + ibz_t test_norm, test_denom; + ibz_init(&test_denom); + ibz_init(&test_norm); + quat_alg_norm(&test_norm, &test_denom, &theta, &QUATALG_PINFTY); + assert(ibz_is_one(&test_denom)); + assert(ibz_cmp(&test_norm, &tmp) == 0); + assert(!ibz_is_even(&tmp)); + assert(quat_lattice_contains(NULL, &EXTREMAL_ORDERS[index_alternate_order].order, &theta)); + ibz_finalize(&test_norm); + ibz_finalize(&test_denom); +#endif + + ec_basis_t B0_two; + // copying the basis + copy_basis(&B0_two, &CURVES_WITH_ENDOMORPHISMS[index_alternate_order].basis_even); + assert(test_basis_order_twof(&B0_two, &E0, TORSION_EVEN_POWER)); + ec_dbl_iter_basis(&B0_two, TORSION_EVEN_POWER - length - HD_extra_torsion, &B0_two, &E0); + + assert(test_basis_order_twof(&B0_two, &E0, length + HD_extra_torsion)); + + // now we set-up the kernel + theta_couple_point_t T1; + theta_couple_point_t T2, T1m2; + + copy_point(&T1.P1, &B0_two.P); + copy_point(&T2.P1, &B0_two.Q); + copy_point(&T1m2.P1, &B0_two.PmQ); + + // multiplication of theta by (u)^-1 mod 2^(length+2) + ibz_mul(&two_pow, &two_pow, &ibz_const_two); + ibz_mul(&two_pow, &two_pow, &ibz_const_two); + ibz_copy(&tmp, u); + ibz_invmod(&tmp, &tmp, &two_pow); + assert(!ibz_is_even(&tmp)); + + ibz_mul(&theta.coord[0], &theta.coord[0], &tmp); + ibz_mul(&theta.coord[1], &theta.coord[1], &tmp); + ibz_mul(&theta.coord[2], &theta.coord[2], &tmp); + ibz_mul(&theta.coord[3], &theta.coord[3], &tmp); + + // applying theta to the basis + ec_basis_t B0_two_theta; + copy_basis(&B0_two_theta, &B0_two); + endomorphism_application_even_basis(&B0_two_theta, index_alternate_order, &E0, &theta, length + HD_extra_torsion); + + // Ensure the basis we're using has the expected order + assert(test_basis_order_twof(&B0_two_theta, &E0, length + HD_extra_torsion)); + + // Set-up the domain E0 x E0 + theta_couple_curve_t E00; + E00.E1 = E0; + E00.E2 = E0; + + // Set-up the kernel from the bases + theta_kernel_couple_points_t dim_two_ker; + copy_bases_to_kernel(&dim_two_ker, &B0_two, &B0_two_theta); + + ret = theta_chain_compute_and_eval(length, &E00, &dim_two_ker, true, E34, P12, numP); + if (!ret) + goto cleanup; + + assert(length); + ret = (int)length; + +cleanup: + // var finalize + ibz_finalize(&two_pow); + ibz_finalize(&tmp); + quat_alg_elem_finalize(&theta); + + return ret; +} + +int +fixed_degree_isogeny_and_eval(quat_left_ideal_t *lideal, + const ibz_t *u, + bool small, + theta_couple_curve_t *E34, + theta_couple_point_t *P12, + size_t numP, + const int index_alternate_order) +{ + return _fixed_degree_isogeny_impl(lideal, u, small, E34, P12, numP, index_alternate_order); +} + +// takes the output of LLL and apply some small treatment on the basis +// reordering vectors and switching some signs if needed to make it in a nicer +// shape +static void +post_LLL_basis_treatment(ibz_mat_4x4_t *gram, ibz_mat_4x4_t *reduced, const ibz_t *norm, bool is_special_order) +{ + // if the left order is the special one, then we apply some additional post + // treatment + if (is_special_order) { + // reordering the basis if needed + if (ibz_cmp(&(*gram)[0][0], &(*gram)[2][2]) == 0) { + for (int i = 0; i < 4; i++) { + ibz_swap(&(*reduced)[i][1], &(*reduced)[i][2]); + } + ibz_swap(&(*gram)[0][2], &(*gram)[0][1]); + ibz_swap(&(*gram)[2][0], &(*gram)[1][0]); + ibz_swap(&(*gram)[3][2], &(*gram)[3][1]); + ibz_swap(&(*gram)[2][3], &(*gram)[1][3]); + ibz_swap(&(*gram)[2][2], &(*gram)[1][1]); + } else if (ibz_cmp(&(*gram)[0][0], &(*gram)[3][3]) == 0) { + for (int i = 0; i < 4; i++) { + ibz_swap(&(*reduced)[i][1], &(*reduced)[i][3]); + } + ibz_swap(&(*gram)[0][3], &(*gram)[0][1]); + ibz_swap(&(*gram)[3][0], &(*gram)[1][0]); + ibz_swap(&(*gram)[2][3], &(*gram)[2][1]); + ibz_swap(&(*gram)[3][2], &(*gram)[1][2]); + ibz_swap(&(*gram)[3][3], &(*gram)[1][1]); + } else if (ibz_cmp(&(*gram)[1][1], &(*gram)[3][3]) == 0) { + // in this case it seems that we need to swap the second and third + // element, and then recompute entirely the second element from the first + // first we swap the second and third element + for (int i = 0; i < 4; i++) { + ibz_swap(&(*reduced)[i][1], &(*reduced)[i][2]); + } + ibz_swap(&(*gram)[0][2], &(*gram)[0][1]); + ibz_swap(&(*gram)[2][0], &(*gram)[1][0]); + ibz_swap(&(*gram)[3][2], &(*gram)[3][1]); + ibz_swap(&(*gram)[2][3], &(*gram)[1][3]); + ibz_swap(&(*gram)[2][2], &(*gram)[1][1]); + } + + // adjusting the sign if needed + if (ibz_cmp(&(*reduced)[0][0], &(*reduced)[1][1]) != 0) { + for (int i = 0; i < 4; i++) { + ibz_neg(&(*reduced)[i][1], &(*reduced)[i][1]); + ibz_neg(&(*gram)[i][1], &(*gram)[i][1]); + ibz_neg(&(*gram)[1][i], &(*gram)[1][i]); + } + } + if (ibz_cmp(&(*reduced)[0][2], &(*reduced)[1][3]) != 0) { + for (int i = 0; i < 4; i++) { + ibz_neg(&(*reduced)[i][3], &(*reduced)[i][3]); + ibz_neg(&(*gram)[i][3], &(*gram)[i][3]); + ibz_neg(&(*gram)[3][i], &(*gram)[3][i]); + } + // assert(ibz_cmp(&(*reduced)[0][2],&(*reduced)[1][3])==0); + } + } +} + +// enumerate all vectors in an hypercube of norm m for the infinity norm +// with respect to a basis whose gram matrix is given by gram +// Returns an int `count`, the number of vectors found with the desired +// properties +static int +enumerate_hypercube(ibz_vec_4_t *vecs, ibz_t *norms, int m, const ibz_mat_4x4_t *gram, const ibz_t *adjusted_norm) +{ + + ibz_t remain, norm; + ibz_vec_4_t point; + + ibz_init(&remain); + ibz_init(&norm); + ibz_vec_4_init(&point); + + assert(m > 0); + + int count = 0; + int dim = 2 * m + 1; + int dim2 = dim * dim; + int dim3 = dim2 * dim; + + // if the basis is of the form alpha, i*alpha, beta, i*beta + // we can remove some values due to symmetry of the basis that + bool need_remove_symmetry = + (ibz_cmp(&(*gram)[0][0], &(*gram)[1][1]) == 0 && ibz_cmp(&(*gram)[3][3], &(*gram)[2][2]) == 0); + + int check1, check2, check3; + + // Enumerate over points in a hypercube with coordinates (x, y, z, w) + for (int x = -m; x <= 0; x++) { // We only check non-positive x-values + for (int y = -m; y < m + 1; y++) { + // Once x = 0 we only consider non-positive y values + if (x == 0 && y > 0) { + break; + } + for (int z = -m; z < m + 1; z++) { + // If x and y are both zero, we only consider non-positive z values + if (x == 0 && y == 0 && z > 0) { + break; + } + for (int w = -m; w < m + 1; w++) { + // If x, y, z are all zero, we only consider negative w values + if (x == 0 && y == 0 && z == 0 && w >= 0) { + break; + } + + // Now for each candidate (x, y, z, w) we need to check a number of + // conditions We have already filtered for symmetry with several break + // statements, but there are more checks. + + // 1. We do not allow all (x, y, z, w) to be multiples of 2 + // 2. We do not allow all (x, y, z, w) to be multiples of 3 + // 3. We do not want elements of the same norm, so we quotient out the + // action + // of a group of order four generated by i for a basis expected to + // be of the form: [gamma, i gamma, beta, i beta ]. + + // Ensure that not all values are even + if (!((x | y | z | w) & 1)) { + continue; + } + // Ensure that not all values are multiples of three + if (x % 3 == 0 && y % 3 == 0 && z % 3 == 0 && w % 3 == 0) { + continue; + } + + check1 = (m + w) + dim * (m + z) + dim2 * (m + y) + dim3 * (m + x); + check2 = (m - z) + dim * (m + w) + dim2 * (m - x) + dim3 * (m + y); + check3 = (m + z) + dim * (m - w) + dim2 * (m + x) + dim3 * (m - y); + + // either the basis does not have symmetry and we are good, + // or there is a special symmetry that we can exploit + // and we ensure that we don't record the same norm in the list + if (!need_remove_symmetry || (check1 <= check2 && check1 <= check3)) { + // Set the point as a vector (x, y, z, w) + ibz_set(&point[0], x); + ibz_set(&point[1], y); + ibz_set(&point[2], z); + ibz_set(&point[3], w); + + // Evaluate this through the gram matrix and divide out by the + // adjusted_norm + quat_qf_eval(&norm, gram, &point); + ibz_div(&norm, &remain, &norm, adjusted_norm); + assert(ibz_is_zero(&remain)); + + if (ibz_mod_ui(&norm, 2) == 1) { + ibz_set(&vecs[count][0], x); + ibz_set(&vecs[count][1], y); + ibz_set(&vecs[count][2], z); + ibz_set(&vecs[count][3], w); + ibz_copy(&norms[count], &norm); + count++; + } + } + } + } + } + } + + ibz_finalize(&remain); + ibz_finalize(&norm); + ibz_vec_4_finalize(&point); + + return count - 1; +} + +// enumerate through the two list given in input to find to integer d1,d2 such +// that there exists u,v with u d1 + v d2 = target the bool is diagonal +// indicates if the two lists are the same +static int +find_uv_from_lists(ibz_t *au, + ibz_t *bu, + ibz_t *av, + ibz_t *bv, + ibz_t *u, + ibz_t *v, + int *index_sol1, + int *index_sol2, + const ibz_t *target, + const ibz_t *small_norms1, + const ibz_t *small_norms2, + const ibz_t *quotients, + const int index1, + const int index2, + const int is_diagonal, + const int number_sum_square) +{ + + ibz_t n, remain, adjusted_norm; + ibz_init(&n); + ibz_init(&remain); + ibz_init(&adjusted_norm); + + int found = 0; + int cmp; + ibz_copy(&n, target); + + // enumerating through the list + for (int i1 = 0; i1 < index1; i1++) { + ibz_mod(&adjusted_norm, &n, &small_norms1[i1]); + int starting_index2; + if (is_diagonal) { + starting_index2 = i1; + } else { + starting_index2 = 0; + } + for (int i2 = starting_index2; i2 < index2; i2++) { + // u = target / d1 mod d2 + if (!ibz_invmod(&remain, &small_norms2[i2], &small_norms1[i1])) { + continue; + } + ibz_mul(v, &remain, &adjusted_norm); + ibz_mod(v, v, &small_norms1[i1]); + cmp = ibz_cmp(v, "ients[i2]); + while (!found && cmp < 0) { + if (number_sum_square > 0) { + found = ibz_cornacchia_prime(av, bv, &ibz_const_one, v); + } else if (number_sum_square == 0) { + found = 1; + } + if (found) { + ibz_mul(&remain, v, &small_norms2[i2]); + ibz_copy(au, &n); + ibz_sub(u, au, &remain); + assert(ibz_cmp(u, &ibz_const_zero) > 0); + ibz_div(u, &remain, u, &small_norms1[i1]); + assert(ibz_is_zero(&remain)); + // we want to remove weird cases where u,v have big power of two + found = found && (ibz_get(u) != 0 && ibz_get(v) != 0); + if (number_sum_square == 2) { + found = ibz_cornacchia_prime(au, bu, &ibz_const_one, u); + } + } + if (!found) { + ibz_add(v, v, &small_norms1[i1]); + cmp = ibz_cmp(v, "ients[i2]); + } + } + + if (found) { + // copying the indices + *index_sol1 = i1; + *index_sol2 = i2; + break; + } + } + if (found) { + break; + } + } + + ibz_finalize(&n); + ibz_finalize(&remain); + ibz_finalize(&adjusted_norm); + + return found; +} + +struct vec_and_norm +{ + ibz_vec_4_t vec; + ibz_t norm; + int idx; +}; + +static int +compare_vec_by_norm(const void *_first, const void *_second) +{ + const struct vec_and_norm *first = _first, *second = _second; + int res = ibz_cmp(&first->norm, &second->norm); + if (res != 0) + return res; + else + return first->idx - second->idx; +} + +// use several special curves +// we assume that the first one is always j=1728 +int +find_uv(ibz_t *u, + ibz_t *v, + quat_alg_elem_t *beta1, + quat_alg_elem_t *beta2, + ibz_t *d1, + ibz_t *d2, + int *index_alternate_order_1, + int *index_alternate_order_2, + const ibz_t *target, + const quat_left_ideal_t *lideal, + const quat_alg_t *Bpoo, + int num_alternate_order) + +{ + + // variable declaration & init + ibz_vec_4_t vec; + ibz_t n; + ibz_t au, bu, av, bv; + ibz_t norm_d; + ibz_t remain; + ibz_init(&au); + ibz_init(&bu); + ibz_init(&av); + ibz_init(&bv); + ibz_init(&norm_d); + ibz_init(&n); + ibz_vec_4_init(&vec); + ibz_init(&remain); + + ibz_copy(&n, target); + + ibz_t adjusted_norm[num_alternate_order + 1]; + ibz_mat_4x4_t gram[num_alternate_order + 1], reduced[num_alternate_order + 1]; + quat_left_ideal_t ideal[num_alternate_order + 1]; + + for (int i = 0; i < num_alternate_order + 1; i++) { + ibz_init(&adjusted_norm[i]); + ibz_mat_4x4_init(&gram[i]); + ibz_mat_4x4_init(&reduced[i]); + quat_left_ideal_init(&ideal[i]); + } + + // first we reduce the ideal given in input + quat_lideal_copy(&ideal[0], lideal); + quat_lideal_reduce_basis(&reduced[0], &gram[0], &ideal[0], Bpoo); + + ibz_mat_4x4_copy(&ideal[0].lattice.basis, &reduced[0]); + ibz_set(&adjusted_norm[0], 1); + ibz_mul(&adjusted_norm[0], &adjusted_norm[0], &ideal[0].lattice.denom); + ibz_mul(&adjusted_norm[0], &adjusted_norm[0], &ideal[0].lattice.denom); + post_LLL_basis_treatment(&gram[0], &reduced[0], &ideal[0].norm, true); + + // for efficient lattice reduction, we replace ideal[0] by the equivalent + // ideal of smallest norm + quat_left_ideal_t reduced_id; + quat_left_ideal_init(&reduced_id); + quat_lideal_copy(&reduced_id, &ideal[0]); + quat_alg_elem_t delta; + // delta will be the element of smallest norm + quat_alg_elem_init(&delta); + ibz_set(&delta.coord[0], 1); + ibz_set(&delta.coord[1], 0); + ibz_set(&delta.coord[2], 0); + ibz_set(&delta.coord[3], 0); + ibz_copy(&delta.denom, &reduced_id.lattice.denom); + ibz_mat_4x4_eval(&delta.coord, &reduced[0], &delta.coord); + assert(quat_lattice_contains(NULL, &reduced_id.lattice, &delta)); + + // reduced_id = ideal[0] * \overline{delta}/n(ideal[0]) + quat_alg_conj(&delta, &delta); + ibz_mul(&delta.denom, &delta.denom, &ideal[0].norm); + quat_lattice_alg_elem_mul(&reduced_id.lattice, &reduced_id.lattice, &delta, Bpoo); + ibz_copy(&reduced_id.norm, &gram[0][0][0]); + ibz_div(&reduced_id.norm, &remain, &reduced_id.norm, &adjusted_norm[0]); + assert(ibz_cmp(&remain, &ibz_const_zero) == 0); + + // and conj_ideal is the conjugate of reduced_id + // init the right order; + quat_lattice_t right_order; + quat_lattice_init(&right_order); + // computing the conjugate + quat_left_ideal_t conj_ideal; + quat_left_ideal_init(&conj_ideal); + quat_lideal_conjugate_without_hnf(&conj_ideal, &right_order, &reduced_id, Bpoo); + + // computing all the other connecting ideals and reducing them + for (int i = 1; i < num_alternate_order + 1; i++) { + quat_lideal_lideal_mul_reduced(&ideal[i], &gram[i], &conj_ideal, &ALTERNATE_CONNECTING_IDEALS[i - 1], Bpoo); + ibz_mat_4x4_copy(&reduced[i], &ideal[i].lattice.basis); + ibz_set(&adjusted_norm[i], 1); + ibz_mul(&adjusted_norm[i], &adjusted_norm[i], &ideal[i].lattice.denom); + ibz_mul(&adjusted_norm[i], &adjusted_norm[i], &ideal[i].lattice.denom); + post_LLL_basis_treatment(&gram[i], &reduced[i], &ideal[i].norm, false); + } + + // enumerating small vectors + + // global parameters for the enumeration + int m = FINDUV_box_size; + int m4 = FINDUV_cube_size; + + ibz_vec_4_t small_vecs[num_alternate_order + 1][m4]; + ibz_t small_norms[num_alternate_order + 1][m4]; + ibz_vec_4_t alternate_small_vecs[num_alternate_order + 1][m4]; + ibz_t alternate_small_norms[num_alternate_order + 1][m4]; + ibz_t quotients[num_alternate_order + 1][m4]; + int indices[num_alternate_order + 1]; + + for (int j = 0; j < num_alternate_order + 1; j++) { + for (int i = 0; i < m4; i++) { + ibz_init(&small_norms[j][i]); + ibz_vec_4_init(&small_vecs[j][i]); + ibz_init(&alternate_small_norms[j][i]); + ibz_init("ients[j][i]); + ibz_vec_4_init(&alternate_small_vecs[j][i]); + } + // enumeration in the hypercube of norm m + indices[j] = enumerate_hypercube(small_vecs[j], small_norms[j], m, &gram[j], &adjusted_norm[j]); + + // sorting the list + { + struct vec_and_norm small_vecs_and_norms[indices[j]]; + for (int i = 0; i < indices[j]; ++i) { + memcpy(&small_vecs_and_norms[i].vec, &small_vecs[j][i], sizeof(ibz_vec_4_t)); + memcpy(&small_vecs_and_norms[i].norm, &small_norms[j][i], sizeof(ibz_t)); + small_vecs_and_norms[i].idx = i; + } + qsort(small_vecs_and_norms, indices[j], sizeof(*small_vecs_and_norms), compare_vec_by_norm); + for (int i = 0; i < indices[j]; ++i) { + memcpy(&small_vecs[j][i], &small_vecs_and_norms[i].vec, sizeof(ibz_vec_4_t)); + memcpy(&small_norms[j][i], &small_vecs_and_norms[i].norm, sizeof(ibz_t)); + } +#ifndef NDEBUG + for (int i = 1; i < indices[j]; ++i) + assert(ibz_cmp(&small_norms[j][i - 1], &small_norms[j][i]) <= 0); +#endif + } + + for (int i = 0; i < indices[j]; i++) { + ibz_div("ients[j][i], &remain, &n, &small_norms[j][i]); + } + } + + int found = 0; + int i1; + int i2; + for (int j1 = 0; j1 < num_alternate_order + 1; j1++) { + for (int j2 = j1; j2 < num_alternate_order + 1; j2++) { + // in this case, there are some small adjustements to make + int is_diago = (j1 == j2); + found = find_uv_from_lists(&au, + &bu, + &av, + &bv, + u, + v, + &i1, + &i2, + target, + small_norms[j1], + small_norms[j2], + quotients[j2], + indices[j1], + indices[j2], + is_diago, + 0); + // } + + if (found) { + // recording the solutions that we found + ibz_copy(&beta1->denom, &ideal[j1].lattice.denom); + ibz_copy(&beta2->denom, &ideal[j2].lattice.denom); + ibz_copy(d1, &small_norms[j1][i1]); + ibz_copy(d2, &small_norms[j2][i2]); + ibz_mat_4x4_eval(&beta1->coord, &reduced[j1], &small_vecs[j1][i1]); + ibz_mat_4x4_eval(&beta2->coord, &reduced[j2], &small_vecs[j2][i2]); + assert(quat_lattice_contains(NULL, &ideal[j1].lattice, beta1)); + assert(quat_lattice_contains(NULL, &ideal[j2].lattice, beta2)); + if (j1 != 0 || j2 != 0) { + ibz_div(&delta.denom, &remain, &delta.denom, &lideal->norm); + assert(ibz_cmp(&remain, &ibz_const_zero) == 0); + ibz_mul(&delta.denom, &delta.denom, &conj_ideal.norm); + } + if (j1 != 0) { + // we send back beta1 to the original ideal + quat_alg_mul(beta1, &delta, beta1, Bpoo); + quat_alg_normalize(beta1); + } + if (j2 != 0) { + // we send back beta2 to the original ideal + quat_alg_mul(beta2, &delta, beta2, Bpoo); + quat_alg_normalize(beta2); + } + + // if the selected element belong to an alternate order, we conjugate it + if (j1 != 0) { + quat_alg_conj(beta1, beta1); + } + if (j2 != 0) { + quat_alg_conj(beta2, beta2); + } + +#ifndef NDEBUG + quat_alg_norm(&remain, &norm_d, beta1, &QUATALG_PINFTY); + assert(ibz_is_one(&norm_d)); + ibz_mul(&n, d1, &ideal->norm); + if (j1 > 0) { + ibz_mul(&n, &n, &ALTERNATE_CONNECTING_IDEALS[j1 - 1].norm); + } + assert(ibz_cmp(&n, &remain) == 0); + quat_alg_norm(&remain, &norm_d, beta2, &QUATALG_PINFTY); + assert(ibz_is_one(&norm_d)); + ibz_mul(&n, d2, &ideal->norm); + if (j2 > 0) { + ibz_mul(&n, &n, &ALTERNATE_CONNECTING_IDEALS[j2 - 1].norm); + } + assert(ibz_cmp(&n, &remain) == 0); + assert(quat_lattice_contains(NULL, &ideal->lattice, beta1)); + assert(quat_lattice_contains(NULL, &ideal->lattice, beta2)); + + quat_left_ideal_t ideal_test; + quat_lattice_t ro; + quat_left_ideal_init(&ideal_test); + quat_lattice_init(&ro); + if (j1 > 0) { + quat_lideal_copy(&ideal_test, &ALTERNATE_CONNECTING_IDEALS[j1 - 1]); + quat_lideal_conjugate_without_hnf(&ideal_test, &ro, &ideal_test, Bpoo); + quat_lideal_lideal_mul_reduced(&ideal_test, &gram[0], &ideal_test, ideal, Bpoo); + assert(quat_lattice_contains(NULL, &ideal_test.lattice, beta1)); + } + if (j2 > 0) { + quat_lideal_copy(&ideal_test, &ALTERNATE_CONNECTING_IDEALS[j2 - 1]); + quat_lideal_conjugate_without_hnf(&ideal_test, &ro, &ideal_test, Bpoo); + quat_lideal_lideal_mul_reduced(&ideal_test, &gram[0], &ideal_test, ideal, Bpoo); + assert(quat_lattice_contains(NULL, &ideal_test.lattice, beta2)); + } + + quat_lattice_finalize(&ro); + quat_left_ideal_finalize(&ideal_test); +#endif + + *index_alternate_order_1 = j1; + *index_alternate_order_2 = j2; + break; + } + } + if (found) { + break; + } + } + + for (int j = 0; j < num_alternate_order + 1; j++) { + for (int i = 0; i < m4; i++) { + ibz_finalize(&small_norms[j][i]); + ibz_vec_4_finalize(&small_vecs[j][i]); + ibz_finalize(&alternate_small_norms[j][i]); + ibz_finalize("ients[j][i]); + ibz_vec_4_finalize(&alternate_small_vecs[j][i]); + } + } + + // var finalize + for (int i = 0; i < num_alternate_order + 1; i++) { + ibz_mat_4x4_finalize(&gram[i]); + ibz_mat_4x4_finalize(&reduced[i]); + quat_left_ideal_finalize(&ideal[i]); + ibz_finalize(&adjusted_norm[i]); + } + + ibz_finalize(&n); + ibz_vec_4_finalize(&vec); + ibz_finalize(&au); + ibz_finalize(&bu); + ibz_finalize(&av); + ibz_finalize(&bv); + ibz_finalize(&remain); + ibz_finalize(&norm_d); + quat_lattice_finalize(&right_order); + quat_left_ideal_finalize(&conj_ideal); + quat_left_ideal_finalize(&reduced_id); + quat_alg_elem_finalize(&delta); + + return found; +} + +int +dim2id2iso_ideal_to_isogeny_clapotis(quat_alg_elem_t *beta1, + quat_alg_elem_t *beta2, + ibz_t *u, + ibz_t *v, + ibz_t *d1, + ibz_t *d2, + ec_curve_t *codomain, + ec_basis_t *basis, + const quat_left_ideal_t *lideal, + const quat_alg_t *Bpoo) +{ + ibz_t target, tmp, two_pow; + ; + quat_alg_elem_t theta; + + ibz_t norm_d; + ibz_init(&norm_d); + ibz_t test1, test2; + ibz_init(&test1); + ibz_init(&test2); + + ibz_init(&target); + ibz_init(&tmp); + ibz_init(&two_pow); + int exp = TORSION_EVEN_POWER; + quat_alg_elem_init(&theta); + + // first, we find u,v,d1,d2,beta1,beta2 + // such that u*d1 + v*d2 = 2^TORSION_EVEN_POWER and there are ideals of + // norm d1,d2 equivalent to ideal beta1 and beta2 are elements of norm nd1, + // nd2 where n=n(lideal) + int ret; + int index_order1 = 0, index_order2 = 0; +#ifndef NDEBUG + unsigned int Fu_length, Fv_length; +#endif + ret = find_uv(u, + v, + beta1, + beta2, + d1, + d2, + &index_order1, + &index_order2, + &TORSION_PLUS_2POWER, + lideal, + Bpoo, + NUM_ALTERNATE_EXTREMAL_ORDERS); + if (!ret) { + goto cleanup; + } + + assert(ibz_is_odd(d1) && ibz_is_odd(d2)); + // compute the valuation of the GCD of u,v + ibz_gcd(&tmp, u, v); + assert(ibz_cmp(&tmp, &ibz_const_zero) != 0); + int exp_gcd = ibz_two_adic(&tmp); + exp = TORSION_EVEN_POWER - exp_gcd; + // removing the power of 2 from u and v + ibz_div(u, &test1, u, &tmp); + assert(ibz_cmp(&test1, &ibz_const_zero) == 0); + ibz_div(v, &test1, v, &tmp); + assert(ibz_cmp(&test1, &ibz_const_zero) == 0); + +#ifndef NDEBUG + // checking that ud1+vd2 = 2^exp + ibz_t pow_check, tmp_check; + ibz_init(&pow_check); + ibz_init(&tmp_check); + ibz_pow(&pow_check, &ibz_const_two, exp); + ibz_mul(&tmp_check, d1, u); + ibz_sub(&pow_check, &pow_check, &tmp_check); + ibz_mul(&tmp_check, v, d2); + ibz_sub(&pow_check, &pow_check, &tmp_check); + assert(ibz_cmp(&pow_check, &ibz_const_zero) == 0); + ibz_finalize(&tmp_check); + ibz_finalize(&pow_check); +#endif + + // now we compute the dimension 2 isogeny + // F : Eu x Ev -> E x E' + // where we have phi_u : Eu -> E_index_order1 and phi_v : Ev -> E_index_order2 + // if we have phi1 : E_index_order_1 -> E of degree d1 + // and phi2 : E_index_order_2 -> E of degree d2 + // we can define theta = phi2 o hat{phi1} + // and the kernel of F is given by + // ( [ud1](P), phiv o theta o hat{phiu} (P)),( [ud1](Q), phiv o theta o + // hat{phiu} (Q)) where P,Q is a basis of E0[2e] + + // now we set-up the kernel + // ec_curve_t E0 = CURVE_E0; + ec_curve_t E1; + copy_curve(&E1, &CURVES_WITH_ENDOMORPHISMS[index_order1].curve); + ec_curve_t E2; + copy_curve(&E2, &CURVES_WITH_ENDOMORPHISMS[index_order2].curve); + ec_basis_t bas1, bas2; + theta_couple_curve_t E01; + theta_kernel_couple_points_t ker; + + ec_basis_t bas_u; + copy_basis(&bas1, &CURVES_WITH_ENDOMORPHISMS[index_order1].basis_even); + copy_basis(&bas2, &CURVES_WITH_ENDOMORPHISMS[index_order2].basis_even); + + // we start by computing theta = beta2 \hat{beta1}/n + ibz_set(&theta.denom, 1); + quat_alg_conj(&theta, beta1); + quat_alg_mul(&theta, beta2, &theta, &QUATALG_PINFTY); + ibz_mul(&theta.denom, &theta.denom, &lideal->norm); + + // now we perform the actual computation + quat_left_ideal_t idealu, idealv; + quat_left_ideal_init(&idealu); + quat_left_ideal_init(&idealv); + theta_couple_curve_t Fu_codomain, Fv_codomain; + theta_couple_point_t pushed_points[3]; + theta_couple_point_t *const V1 = pushed_points + 0, *const V2 = pushed_points + 1, *const V1m2 = pushed_points + 2; + theta_couple_point_t P, Q, PmQ; + + copy_point(&P.P1, &bas1.P); + copy_point(&PmQ.P1, &bas1.PmQ); + copy_point(&Q.P1, &bas1.Q); + // Set points to zero + ec_point_init(&P.P2); + ec_point_init(&Q.P2); + ec_point_init(&PmQ.P2); + + pushed_points[0] = P; + pushed_points[1] = Q; + pushed_points[2] = PmQ; + // we perform the computation of phiu with a fixed degree isogeny + ret = fixed_degree_isogeny_and_eval( + &idealu, u, true, &Fu_codomain, pushed_points, sizeof(pushed_points) / sizeof(*pushed_points), index_order1); + + if (!ret) { + goto cleanup; + } + assert(test_point_order_twof(&V1->P1, &Fu_codomain.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&V1->P2, &Fu_codomain.E2, TORSION_EVEN_POWER)); + +#ifndef NDEBUG + Fu_length = (unsigned int)ret; + // presumably the correct curve is the first one, we check this + fp2_t w0a, w1a, w2a; + ec_curve_t E1_tmp, Fu_codomain_E1_tmp, Fu_codomain_E2_tmp; + copy_curve(&E1_tmp, &E1); + copy_curve(&Fu_codomain_E1_tmp, &Fu_codomain.E1); + copy_curve(&Fu_codomain_E2_tmp, &Fu_codomain.E2); + weil(&w0a, TORSION_EVEN_POWER, &bas1.P, &bas1.Q, &bas1.PmQ, &E1_tmp); + weil(&w1a, TORSION_EVEN_POWER, &V1->P1, &V2->P1, &V1m2->P1, &Fu_codomain_E1_tmp); + weil(&w2a, TORSION_EVEN_POWER, &V1->P2, &V2->P2, &V1m2->P2, &Fu_codomain_E2_tmp); + ibz_pow(&two_pow, &ibz_const_two, Fu_length); + ibz_sub(&two_pow, &two_pow, u); + + // now we are checking that the weil pairings are equal to the correct value + digit_t digit_u[NWORDS_ORDER] = { 0 }; + ibz_to_digit_array(digit_u, u); + fp2_t test_powa; + fp2_pow_vartime(&test_powa, &w0a, digit_u, NWORDS_ORDER); + + assert(fp2_is_equal(&test_powa, &w1a)); + ibz_to_digit_array(digit_u, &two_pow); + fp2_pow_vartime(&test_powa, &w0a, digit_u, NWORDS_ORDER); + assert(fp2_is_equal(&test_powa, &w2a)); +#endif + + // copying the basis images + copy_point(&bas_u.P, &V1->P1); + copy_point(&bas_u.Q, &V2->P1); + copy_point(&bas_u.PmQ, &V1m2->P1); + + // copying the points to the first part of the kernel + copy_point(&ker.T1.P1, &bas_u.P); + copy_point(&ker.T2.P1, &bas_u.Q); + copy_point(&ker.T1m2.P1, &bas_u.PmQ); + copy_curve(&E01.E1, &Fu_codomain.E1); + + copy_point(&P.P1, &bas2.P); + copy_point(&PmQ.P1, &bas2.PmQ); + copy_point(&Q.P1, &bas2.Q); + pushed_points[0] = P; + pushed_points[1] = Q; + pushed_points[2] = PmQ; + + // computation of phiv + ret = fixed_degree_isogeny_and_eval( + &idealv, v, true, &Fv_codomain, pushed_points, sizeof(pushed_points) / sizeof(*pushed_points), index_order2); + if (!ret) { + goto cleanup; + } + + assert(test_point_order_twof(&V1->P1, &Fv_codomain.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&V1->P2, &Fv_codomain.E2, TORSION_EVEN_POWER)); + +#ifndef NDEBUG + Fv_length = (unsigned int)ret; + ec_curve_t E2_tmp, Fv_codomain_E1_tmp, Fv_codomain_E2_tmp; + copy_curve(&E2_tmp, &E2); + copy_curve(&Fv_codomain_E1_tmp, &Fv_codomain.E1); + copy_curve(&Fv_codomain_E2_tmp, &Fv_codomain.E2); + // presumably the correct curve is the first one, we check this + weil(&w0a, TORSION_EVEN_POWER, &bas2.P, &bas2.Q, &bas2.PmQ, &E2_tmp); + weil(&w1a, TORSION_EVEN_POWER, &V1->P1, &V2->P1, &V1m2->P1, &Fv_codomain_E1_tmp); + weil(&w2a, TORSION_EVEN_POWER, &V1->P2, &V2->P2, &V1m2->P2, &Fv_codomain_E2_tmp); + if (Fv_length == 0) { + ibz_set(&tmp, 1); + ibz_set(&two_pow, 1); + } else { + ibz_pow(&two_pow, &ibz_const_two, Fv_length); + ibz_sub(&two_pow, &two_pow, v); + } + + // now we are checking that one of the two is equal to the correct value + ibz_to_digit_array(digit_u, v); + fp2_pow_vartime(&test_powa, &w0a, digit_u, NWORDS_ORDER); + assert(fp2_is_equal(&test_powa, &w1a)); + ibz_to_digit_array(digit_u, &two_pow); + fp2_pow_vartime(&test_powa, &w0a, digit_u, NWORDS_ORDER); + assert(fp2_is_equal(&test_powa, &w2a)); + +#endif + + copy_point(&bas2.P, &V1->P1); + copy_point(&bas2.Q, &V2->P1); + copy_point(&bas2.PmQ, &V1m2->P1); + + // multiplying theta by 1 / (d1 * n(connecting_ideal2)) + ibz_pow(&two_pow, &ibz_const_two, TORSION_EVEN_POWER); + ibz_copy(&tmp, d1); + if (index_order2 > 0) { + ibz_mul(&tmp, &tmp, &ALTERNATE_CONNECTING_IDEALS[index_order2 - 1].norm); + } + ibz_invmod(&tmp, &tmp, &two_pow); + + ibz_mul(&theta.coord[0], &theta.coord[0], &tmp); + ibz_mul(&theta.coord[1], &theta.coord[1], &tmp); + ibz_mul(&theta.coord[2], &theta.coord[2], &tmp); + ibz_mul(&theta.coord[3], &theta.coord[3], &tmp); + + // applying theta + endomorphism_application_even_basis(&bas2, 0, &Fv_codomain.E1, &theta, TORSION_EVEN_POWER); + + assert(test_basis_order_twof(&bas2, &Fv_codomain.E1, TORSION_EVEN_POWER)); + + // copying points to the second part of the kernel + copy_point(&ker.T1.P2, &bas2.P); + copy_point(&ker.T2.P2, &bas2.Q); + copy_point(&ker.T1m2.P2, &bas2.PmQ); + copy_curve(&E01.E2, &Fv_codomain.E1); + + // copying the points to the first part of the kernel + quat_left_ideal_finalize(&idealu); + quat_left_ideal_finalize(&idealv); + + double_couple_point_iter(&ker.T1, TORSION_EVEN_POWER - exp, &ker.T1, &E01); + double_couple_point_iter(&ker.T2, TORSION_EVEN_POWER - exp, &ker.T2, &E01); + double_couple_point_iter(&ker.T1m2, TORSION_EVEN_POWER - exp, &ker.T1m2, &E01); + + assert(test_point_order_twof(&ker.T1.P1, &E01.E1, exp)); + assert(test_point_order_twof(&ker.T1m2.P2, &E01.E2, exp)); + + assert(ibz_is_odd(u)); + + // now we evaluate the basis points through the isogeny + assert(test_basis_order_twof(&bas_u, &E01.E1, TORSION_EVEN_POWER)); + + // evaluating the basis through the isogeny of degree u*d1 + copy_point(&pushed_points[0].P1, &bas_u.P); + copy_point(&pushed_points[2].P1, &bas_u.PmQ); + copy_point(&pushed_points[1].P1, &bas_u.Q); + // Set points to zero + ec_point_init(&pushed_points[0].P2); + ec_point_init(&pushed_points[1].P2); + ec_point_init(&pushed_points[2].P2); + + theta_couple_curve_t theta_codomain; + + ret = theta_chain_compute_and_eval_randomized( + exp, &E01, &ker, false, &theta_codomain, pushed_points, sizeof(pushed_points) / sizeof(*pushed_points)); + if (!ret) { + goto cleanup; + } + + theta_couple_point_t T1, T2, T1m2; + T1 = pushed_points[0]; + T2 = pushed_points[1]; + T1m2 = pushed_points[2]; + + assert(test_point_order_twof(&T1.P2, &theta_codomain.E2, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&T1.P1, &theta_codomain.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&T1m2.P2, &theta_codomain.E2, TORSION_EVEN_POWER)); + + copy_point(&basis->P, &T1.P1); + copy_point(&basis->Q, &T2.P1); + copy_point(&basis->PmQ, &T1m2.P1); + copy_curve(codomain, &theta_codomain.E1); + + // using weil pairing to verify that we selected the correct curve + fp2_t w0, w1; + // ec_curve_t E0 = CURVE_E0; + // ec_basis_t bas0 = BASIS_EVEN; + weil(&w0, TORSION_EVEN_POWER, &bas1.P, &bas1.Q, &bas1.PmQ, &E1); + weil(&w1, TORSION_EVEN_POWER, &basis->P, &basis->Q, &basis->PmQ, codomain); + + digit_t digit_d[NWORDS_ORDER] = { 0 }; + ibz_mul(&tmp, d1, u); + ibz_mul(&tmp, &tmp, u); + ibz_mod(&tmp, &tmp, &TORSION_PLUS_2POWER); + ibz_to_digit_array(digit_d, &tmp); + fp2_t test_pow; + fp2_pow_vartime(&test_pow, &w0, digit_d, NWORDS_ORDER); + + // then we have selected the wrong one + if (!fp2_is_equal(&w1, &test_pow)) { + copy_point(&basis->P, &T1.P2); + copy_point(&basis->Q, &T2.P2); + copy_point(&basis->PmQ, &T1m2.P2); + copy_curve(codomain, &theta_codomain.E2); + +// verifying that the other one is the good one +#ifndef NDEBUG + ec_curve_t codomain_tmp; + copy_curve(&codomain_tmp, codomain); + weil(&w1, TORSION_EVEN_POWER, &basis->P, &basis->Q, &basis->PmQ, &codomain_tmp); + fp2_pow_vartime(&test_pow, &w0, digit_d, NWORDS_ORDER); + assert(fp2_is_equal(&test_pow, &w1)); +#endif + } + + // now we apply M / (u * d1) where M is the matrix corresponding to the + // endomorphism beta1 = phi o dual(phi1) we multiply beta1 by the inverse of + // (u*d1) mod 2^TORSION_EVEN_POWER + ibz_mul(&tmp, u, d1); + if (index_order1 != 0) { + ibz_mul(&tmp, &tmp, &CONNECTING_IDEALS[index_order1].norm); + } + ibz_invmod(&tmp, &tmp, &TORSION_PLUS_2POWER); + ibz_mul(&beta1->coord[0], &beta1->coord[0], &tmp); + ibz_mul(&beta1->coord[1], &beta1->coord[1], &tmp); + ibz_mul(&beta1->coord[2], &beta1->coord[2], &tmp); + ibz_mul(&beta1->coord[3], &beta1->coord[3], &tmp); + + endomorphism_application_even_basis(basis, 0, codomain, beta1, TORSION_EVEN_POWER); + +#ifndef NDEBUG + { + ec_curve_t E0 = CURVE_E0; + ec_curve_t codomain_tmp; + ec_basis_t bas0 = CURVES_WITH_ENDOMORPHISMS[0].basis_even; + copy_curve(&codomain_tmp, codomain); + copy_curve(&E1_tmp, &E1); + copy_curve(&E2_tmp, &E2); + weil(&w0a, TORSION_EVEN_POWER, &bas0.P, &bas0.Q, &bas0.PmQ, &E0); + weil(&w1a, TORSION_EVEN_POWER, &basis->P, &basis->Q, &basis->PmQ, &codomain_tmp); + digit_t tmp_d[2 * NWORDS_ORDER] = { 0 }; + if (index_order1 != 0) { + copy_basis(&bas1, &CURVES_WITH_ENDOMORPHISMS[index_order1].basis_even); + weil(&w0, TORSION_EVEN_POWER, &bas1.P, &bas1.Q, &bas1.PmQ, &E1_tmp); + ibz_to_digit_array(tmp_d, &CONNECTING_IDEALS[index_order1].norm); + fp2_pow_vartime(&test_pow, &w0a, tmp_d, 2 * NWORDS_ORDER); + assert(fp2_is_equal(&test_pow, &w0)); + } + if (index_order2 != 0) { + copy_basis(&bas2, &CURVES_WITH_ENDOMORPHISMS[index_order2].basis_even); + weil(&w0, TORSION_EVEN_POWER, &bas2.P, &bas2.Q, &bas2.PmQ, &E2_tmp); + ibz_to_digit_array(tmp_d, &CONNECTING_IDEALS[index_order2].norm); + fp2_pow_vartime(&test_pow, &w0a, tmp_d, 2 * NWORDS_ORDER); + assert(fp2_is_equal(&test_pow, &w0)); + } + ibz_to_digit_array(tmp_d, &lideal->norm); + fp2_pow_vartime(&test_pow, &w0a, tmp_d, 2 * NWORDS_ORDER); + assert(fp2_is_equal(&test_pow, &w1a)); + } +#endif + +cleanup: + ibz_finalize(&norm_d); + ibz_finalize(&test1); + ibz_finalize(&test2); + ibz_finalize(&target); + ibz_finalize(&tmp); + ibz_finalize(&two_pow); + quat_alg_elem_finalize(&theta); + return ret; +} + +int +dim2id2iso_arbitrary_isogeny_evaluation(ec_basis_t *basis, ec_curve_t *codomain, const quat_left_ideal_t *lideal) +{ + int ret; + + quat_alg_elem_t beta1, beta2; + ibz_t u, v, d1, d2; + + quat_alg_elem_init(&beta1); + quat_alg_elem_init(&beta2); + + ibz_init(&u); + ibz_init(&v); + ibz_init(&d1); + ibz_init(&d2); + + ret = dim2id2iso_ideal_to_isogeny_clapotis( + &beta1, &beta2, &u, &v, &d1, &d2, codomain, basis, lideal, &QUATALG_PINFTY); + + quat_alg_elem_finalize(&beta1); + quat_alg_elem_finalize(&beta2); + + ibz_finalize(&u); + ibz_finalize(&v); + ibz_finalize(&d1); + ibz_finalize(&d2); + + return ret; +} diff --git a/src/id2iso/ref/lvlx/id2iso.c b/src/id2iso/ref/lvlx/id2iso.c new file mode 100644 index 0000000..0743974 --- /dev/null +++ b/src/id2iso/ref/lvlx/id2iso.c @@ -0,0 +1,338 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Scalar multiplication [x]P + [y]Q where x and y are stored +// inside an ibz_vec_2_t [x, y] and P, Q \in E[2^f] +void +ec_biscalar_mul_ibz_vec(ec_point_t *res, + const ibz_vec_2_t *scalar_vec, + const int f, + const ec_basis_t *PQ, + const ec_curve_t *curve) +{ + digit_t scalars[2][NWORDS_ORDER]; + ibz_to_digit_array(scalars[0], &(*scalar_vec)[0]); + ibz_to_digit_array(scalars[1], &(*scalar_vec)[1]); + ec_biscalar_mul(res, scalars[0], scalars[1], f, PQ, curve); +} + +// Given an ideal, computes the scalars s0, s1 which determine the kernel generator +// of the equivalent isogeny +void +id2iso_ideal_to_kernel_dlogs_even(ibz_vec_2_t *vec, const quat_left_ideal_t *lideal) +{ + ibz_t tmp; + ibz_init(&tmp); + + ibz_mat_2x2_t mat; + ibz_mat_2x2_init(&mat); + + // construct the matrix of the dual of alpha on the 2^f-torsion + { + quat_alg_elem_t alpha; + quat_alg_elem_init(&alpha); + + int lideal_generator_ok UNUSED = quat_lideal_generator(&alpha, lideal, &QUATALG_PINFTY); + assert(lideal_generator_ok); + quat_alg_conj(&alpha, &alpha); + + ibz_vec_4_t coeffs; + ibz_vec_4_init(&coeffs); + quat_change_to_O0_basis(&coeffs, &alpha); + + for (unsigned i = 0; i < 2; ++i) { + ibz_add(&mat[i][i], &mat[i][i], &coeffs[0]); + for (unsigned j = 0; j < 2; ++j) { + ibz_mul(&tmp, &ACTION_GEN2[i][j], &coeffs[1]); + ibz_add(&mat[i][j], &mat[i][j], &tmp); + ibz_mul(&tmp, &ACTION_GEN3[i][j], &coeffs[2]); + ibz_add(&mat[i][j], &mat[i][j], &tmp); + ibz_mul(&tmp, &ACTION_GEN4[i][j], &coeffs[3]); + ibz_add(&mat[i][j], &mat[i][j], &tmp); + } + } + + ibz_vec_4_finalize(&coeffs); + quat_alg_elem_finalize(&alpha); + } + + // find the kernel of alpha modulo the norm of the ideal + { + const ibz_t *const norm = &lideal->norm; + + ibz_mod(&(*vec)[0], &mat[0][0], norm); + ibz_mod(&(*vec)[1], &mat[1][0], norm); + ibz_gcd(&tmp, &(*vec)[0], &(*vec)[1]); + if (ibz_is_even(&tmp)) { + ibz_mod(&(*vec)[0], &mat[0][1], norm); + ibz_mod(&(*vec)[1], &mat[1][1], norm); + } +#ifndef NDEBUG + ibz_gcd(&tmp, &(*vec)[0], norm); + ibz_gcd(&tmp, &(*vec)[1], &tmp); + assert(!ibz_cmp(&tmp, &ibz_const_one)); +#endif + } + + ibz_mat_2x2_finalize(&mat); + ibz_finalize(&tmp); +} + +// helper function to apply a matrix to a basis of E[2^f] +// works in place +int +matrix_application_even_basis(ec_basis_t *bas, const ec_curve_t *E, ibz_mat_2x2_t *mat, int f) +{ + digit_t scalars[2][NWORDS_ORDER] = { 0 }; + int ret; + + ibz_t tmp, pow_two; + ibz_init(&tmp); + ibz_init(&pow_two); + ibz_pow(&pow_two, &ibz_const_two, f); + + ec_basis_t tmp_bas; + copy_basis(&tmp_bas, bas); + + // reduction mod 2f + ibz_mod(&(*mat)[0][0], &(*mat)[0][0], &pow_two); + ibz_mod(&(*mat)[0][1], &(*mat)[0][1], &pow_two); + ibz_mod(&(*mat)[1][0], &(*mat)[1][0], &pow_two); + ibz_mod(&(*mat)[1][1], &(*mat)[1][1], &pow_two); + + // For a matrix [[a, c], [b, d]] we compute: + // + // first basis element R = [a]P + [b]Q + ibz_to_digit_array(scalars[0], &(*mat)[0][0]); + ibz_to_digit_array(scalars[1], &(*mat)[1][0]); + ec_biscalar_mul(&bas->P, scalars[0], scalars[1], f, &tmp_bas, E); + + // second basis element S = [c]P + [d]Q + ibz_to_digit_array(scalars[0], &(*mat)[0][1]); + ibz_to_digit_array(scalars[1], &(*mat)[1][1]); + ec_biscalar_mul(&bas->Q, scalars[0], scalars[1], f, &tmp_bas, E); + + // Their difference R - S = [a - c]P + [b - d]Q + ibz_sub(&tmp, &(*mat)[0][0], &(*mat)[0][1]); + ibz_mod(&tmp, &tmp, &pow_two); + ibz_to_digit_array(scalars[0], &tmp); + ibz_sub(&tmp, &(*mat)[1][0], &(*mat)[1][1]); + ibz_mod(&tmp, &tmp, &pow_two); + ibz_to_digit_array(scalars[1], &tmp); + ret = ec_biscalar_mul(&bas->PmQ, scalars[0], scalars[1], f, &tmp_bas, E); + + ibz_finalize(&tmp); + ibz_finalize(&pow_two); + + return ret; +} + +// helper function to apply some endomorphism of E0 on the precomputed basis of E[2^f] +// works in place +void +endomorphism_application_even_basis(ec_basis_t *bas, + const int index_alternate_curve, + const ec_curve_t *E, + const quat_alg_elem_t *theta, + int f) +{ + ibz_t tmp; + ibz_init(&tmp); + ibz_vec_4_t coeffs; + ibz_vec_4_init(&coeffs); + ibz_mat_2x2_t mat; + ibz_mat_2x2_init(&mat); + + ibz_t content; + ibz_init(&content); + + // decomposing theta on the basis + quat_alg_make_primitive(&coeffs, &content, theta, &EXTREMAL_ORDERS[index_alternate_curve].order); + assert(ibz_is_odd(&content)); + + ibz_set(&mat[0][0], 0); + ibz_set(&mat[0][1], 0); + ibz_set(&mat[1][0], 0); + ibz_set(&mat[1][1], 0); + + // computing the matrix + + for (unsigned i = 0; i < 2; ++i) { + ibz_add(&mat[i][i], &mat[i][i], &coeffs[0]); + for (unsigned j = 0; j < 2; ++j) { + ibz_mul(&tmp, &CURVES_WITH_ENDOMORPHISMS[index_alternate_curve].action_gen2[i][j], &coeffs[1]); + ibz_add(&mat[i][j], &mat[i][j], &tmp); + ibz_mul(&tmp, &CURVES_WITH_ENDOMORPHISMS[index_alternate_curve].action_gen3[i][j], &coeffs[2]); + ibz_add(&mat[i][j], &mat[i][j], &tmp); + ibz_mul(&tmp, &CURVES_WITH_ENDOMORPHISMS[index_alternate_curve].action_gen4[i][j], &coeffs[3]); + ibz_add(&mat[i][j], &mat[i][j], &tmp); + ibz_mul(&mat[i][j], &mat[i][j], &content); + } + } + + // and now we apply it + matrix_application_even_basis(bas, E, &mat, f); + + ibz_vec_4_finalize(&coeffs); + ibz_mat_2x2_finalize(&mat); + ibz_finalize(&content); + + ibz_finalize(&tmp); +} + +// compute the ideal whose kernel is generated by vec2[0]*BO[0] + vec2[1]*B0[1] where B0 is the +// canonical basis of E0 +void +id2iso_kernel_dlogs_to_ideal_even(quat_left_ideal_t *lideal, const ibz_vec_2_t *vec2, int f) +{ + + // algorithm: apply endomorphisms 1 and j+(1+k)/2 to the kernel point, + // the result should form a basis of the respective torsion subgroup. + // then apply i to the kernel point and decompose over said basis. + // hence we have an equation a*P + b*[j+(1+k)/2]P == [i]P, which will + // easily reveal an endomorphism that kills P. + + ibz_t two_pow; + ibz_init(&two_pow); + + ibz_vec_2_t vec; + ibz_vec_2_init(&vec); + + if (f == TORSION_EVEN_POWER) { + ibz_copy(&two_pow, &TORSION_PLUS_2POWER); + } else { + ibz_pow(&two_pow, &ibz_const_two, f); + } + + { + ibz_mat_2x2_t mat; + ibz_mat_2x2_init(&mat); + + ibz_copy(&mat[0][0], &(*vec2)[0]); + ibz_copy(&mat[1][0], &(*vec2)[1]); + + ibz_mat_2x2_eval(&vec, &ACTION_J, vec2); + ibz_copy(&mat[0][1], &vec[0]); + ibz_copy(&mat[1][1], &vec[1]); + + ibz_mat_2x2_eval(&vec, &ACTION_GEN4, vec2); + ibz_add(&mat[0][1], &mat[0][1], &vec[0]); + ibz_add(&mat[1][1], &mat[1][1], &vec[1]); + + ibz_mod(&mat[0][1], &mat[0][1], &two_pow); + ibz_mod(&mat[1][1], &mat[1][1], &two_pow); + + ibz_mat_2x2_t inv; + ibz_mat_2x2_init(&inv); + { + int inv_ok UNUSED = ibz_mat_2x2_inv_mod(&inv, &mat, &two_pow); + assert(inv_ok); + } + ibz_mat_2x2_finalize(&mat); + + ibz_mat_2x2_eval(&vec, &ACTION_I, vec2); + ibz_mat_2x2_eval(&vec, &inv, &vec); + + ibz_mat_2x2_finalize(&inv); + } + + // final result: a - i + b*(j+(1+k)/2) + quat_alg_elem_t gen; + quat_alg_elem_init(&gen); + ibz_set(&gen.denom, 2); + ibz_add(&gen.coord[0], &vec[0], &vec[0]); + ibz_set(&gen.coord[1], -2); + ibz_add(&gen.coord[2], &vec[1], &vec[1]); + ibz_copy(&gen.coord[3], &vec[1]); + ibz_add(&gen.coord[0], &gen.coord[0], &vec[1]); + ibz_vec_2_finalize(&vec); + + quat_lideal_create(lideal, &gen, &two_pow, &MAXORD_O0, &QUATALG_PINFTY); + + assert(0 == ibz_cmp(&lideal->norm, &two_pow)); + + quat_alg_elem_finalize(&gen); + ibz_finalize(&two_pow); +} + +// finds mat such that: +// (mat*v).B2 = v.B1 +// where "." is the dot product, defined as (v1,v2).(P,Q) = v1*P + v2*Q +// mat encodes the coordinates of the points of B1 in the basis B2 +// specifically requires B1 or B2 to be "full" w.r.t to the 2^n torsion, so that we use tate +// full = 0 assumes B2 is "full" so the easier case. +// if we want to switch the role of B2 and B1, we invert the matrix, e.g. set full = 1 +static void +_change_of_basis_matrix_tate(ibz_mat_2x2_t *mat, + const ec_basis_t *B1, + const ec_basis_t *B2, + ec_curve_t *E, + int f, + bool invert) +{ + digit_t x1[NWORDS_ORDER] = { 0 }, x2[NWORDS_ORDER] = { 0 }, x3[NWORDS_ORDER] = { 0 }, x4[NWORDS_ORDER] = { 0 }; + +#ifndef NDEBUG + int e_full = TORSION_EVEN_POWER; + int e_diff = e_full - f; +#endif + + // Ensure the input basis has points of order 2^f + if (invert) { + assert(test_basis_order_twof(B1, E, e_full)); + ec_dlog_2_tate(x1, x2, x3, x4, B1, B2, E, f); + mp_invert_matrix(x1, x2, x3, x4, f, NWORDS_ORDER); + } else { + assert(test_basis_order_twof(B2, E, e_full)); + ec_dlog_2_tate(x1, x2, x3, x4, B2, B1, E, f); + } + +#ifndef NDEBUG + { + if (invert) { + ec_point_t test, test2; + ec_biscalar_mul(&test, x1, x2, f, B2, E); + ec_dbl_iter(&test2, e_diff, &B1->P, E); + assert(ec_is_equal(&test, &test2)); + + ec_biscalar_mul(&test, x3, x4, f, B2, E); + ec_dbl_iter(&test2, e_diff, &B1->Q, E); + assert(ec_is_equal(&test, &test2)); + } else { + ec_point_t test; + ec_biscalar_mul(&test, x1, x2, f, B2, E); + ec_dbl_iter(&test, e_diff, &test, E); + assert(ec_is_equal(&test, &(B1->P))); + + ec_biscalar_mul(&test, x3, x4, f, B2, E); + ec_dbl_iter(&test, e_diff, &test, E); + assert(ec_is_equal(&test, &(B1->Q))); + } + } +#endif + + // Copy the results into the matrix + ibz_copy_digit_array(&((*mat)[0][0]), x1); + ibz_copy_digit_array(&((*mat)[1][0]), x2); + ibz_copy_digit_array(&((*mat)[0][1]), x3); + ibz_copy_digit_array(&((*mat)[1][1]), x4); +} + +void +change_of_basis_matrix_tate(ibz_mat_2x2_t *mat, const ec_basis_t *B1, const ec_basis_t *B2, ec_curve_t *E, int f) +{ + _change_of_basis_matrix_tate(mat, B1, B2, E, f, false); +} + +void +change_of_basis_matrix_tate_invert(ibz_mat_2x2_t *mat, const ec_basis_t *B1, const ec_basis_t *B2, ec_curve_t *E, int f) +{ + _change_of_basis_matrix_tate(mat, B1, B2, E, f, true); +} diff --git a/src/id2iso/ref/lvlx/test/dim2id2iso_tests.h b/src/id2iso/ref/lvlx/test/dim2id2iso_tests.h new file mode 100644 index 0000000..e9292e6 --- /dev/null +++ b/src/id2iso/ref/lvlx/test/dim2id2iso_tests.h @@ -0,0 +1,30 @@ +#ifndef DIM2ID2ISO_TESTS_H +#define DIM2ID2ISO_TESTS_H + +#include +#include +#include +#include +#include +#include +#include +#include + +/** @internal + * @ingroup id2iso_id2iso + * @defgroup dim2id2iso_tests dim2id2iso module test functions + * @{ + */ + +int dim2id2iso_test_fixed_degree_isogeny(void); + +int dim2id2iso_test_find_uv(void); + +int dim2id2iso_test_find_uv(void); + +int dim2id2iso_test_dimid2iso(void); + +/** @} + */ + +#endif diff --git a/src/id2iso/ref/id2isox/test/id2iso_tests.h b/src/id2iso/ref/lvlx/test/id2iso_tests.h similarity index 68% rename from src/id2iso/ref/id2isox/test/id2iso_tests.h rename to src/id2iso/ref/lvlx/test/id2iso_tests.h index 9b76b6f..af469a0 100644 --- a/src/id2iso/ref/id2isox/test/id2iso_tests.h +++ b/src/id2iso/ref/lvlx/test/id2iso_tests.h @@ -1,15 +1,15 @@ #ifndef ID2ISO_TESTS_H #define ID2ISO_TESTS_H -#include #include -#include #include #include +#include #include #include #include #include +#include /** @internal * @ingroup id2iso_id2iso @@ -17,16 +17,11 @@ * @{ */ -int id2iso_test_ker2id(); +int id2iso_test_ker2id(void); -int id2iso_test_id2ker_even(); - -int id2iso_test_id2ker_odd(); - -int id2iso_test_id2iso(); +int id2iso_test_id2iso(void); /** @} */ - #endif diff --git a/src/id2iso/ref/lvlx/test/ker2id.c b/src/id2iso/ref/lvlx/test/ker2id.c new file mode 100644 index 0000000..be46378 --- /dev/null +++ b/src/id2iso/ref/lvlx/test/ker2id.c @@ -0,0 +1,54 @@ +#include "id2iso_tests.h" + +static void +random_scalar(ibz_t *k) +{ + ibz_pow(k, &ibz_const_two, 123); + ibz_rand_interval(k, &ibz_const_zero, k); +} + +int +_id2iso_test_ker2id(void) +{ + int res = 1; + + ibz_vec_2_t vec2; + ibz_vec_2_init(&vec2); + + { + ibz_t gcd; + ibz_init(&gcd); + do { + random_scalar(&vec2[0]); + random_scalar(&vec2[1]); + ibz_gcd(&gcd, &vec2[0], &vec2[1]); + } while (ibz_divides(&gcd, &ibz_const_two)); + ibz_finalize(&gcd); + } + + quat_left_ideal_t I; + quat_left_ideal_init(&I); + id2iso_kernel_dlogs_to_ideal_even(&I, &vec2, TORSION_EVEN_POWER); + // quat_left_ideal_print(&I); + quat_left_ideal_finalize(&I); + ibz_vec_2_finalize(&vec2); + + return res; +} + +int +id2iso_test_ker2id(void) +{ + int res = 1; + printf("\n \nRunning id2iso tests for kernel_dlogs_to_ideal \n \n"); + + for (int i = 0; i < 10; i++) { + res &= _id2iso_test_ker2id(); + } + + if (!res) { + printf("ID2ISO unit test kernel_dlogs_to_ideal() failed\n"); + } + + return res; +} diff --git a/src/id2iso/ref/lvlx/test/represent_integer_benchmarks.c b/src/id2iso/ref/lvlx/test/represent_integer_benchmarks.c new file mode 100644 index 0000000..5651098 --- /dev/null +++ b/src/id2iso/ref/lvlx/test/represent_integer_benchmarks.c @@ -0,0 +1,272 @@ +#include +#include +#include +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +// return 0 if ok, anything else if error +// sample array of odd numbers +int +id2iso_represent_integer_benchmarks_input_generation(ibz_t *n_gammas, int bitsize, int iterations) +{ + int randret = 1; + ibz_t max; + ibz_init(&max); + ibz_pow(&max, &ibz_const_two, bitsize - 1); + for (int i = 0; i < iterations; i++) { + randret = randret && ibz_rand_interval(&(n_gammas[i]), &ibz_const_one, &max); + ibz_mul(&(n_gammas[i]), &ibz_const_two, &(n_gammas[i])); + ibz_add(&(n_gammas[i]), &ibz_const_one, &(n_gammas[i])); + } + ibz_finalize(&max); + return (!randret); +} + +// 0 if ok, 1 otherwise +int +id2iso_represent_integer_benchmarks_test(const quat_alg_elem_t *gamma, + const ibz_t *n_gamma, + int non_diag, + const quat_represent_integer_params_t *params) +{ + ibz_vec_4_t coord; + ibz_t norm_d, norm_n; + ibz_init(&norm_d); + ibz_init(&norm_n); + ibz_vec_4_init(&coord); + int res = 0; + quat_alg_norm(&norm_n, &norm_d, gamma, &QUATALG_PINFTY); + res = res || !ibz_is_one(&norm_d); + res = res || !(ibz_cmp(&norm_n, n_gamma) == 0); + res = res || !quat_lattice_contains(NULL, &((*params).order->order), gamma); + if (non_diag) { + if ((*params).order->q == 1) { + ibz_mul(&norm_n, &ibz_const_two, &ibz_const_two); + ibz_add(&norm_d, &((*gamma).coord[0]), &((*gamma).coord[3])); + ibz_mod(&norm_d, &norm_d, &norm_n); + res = res || (0 != ibz_cmp(&ibz_const_two, &norm_d)); + ibz_sub(&norm_d, &((*gamma).coord[1]), &((*gamma).coord[2])); + ibz_mod(&norm_d, &norm_d, &norm_n); + res = res || (0 != ibz_cmp(&ibz_const_two, &norm_d)); + } else { + quat_lattice_contains(&coord, &((*params).order->order), gamma); + ibz_gcd(&norm_d, &(coord[1]), &(coord[2])); + ibz_gcd(&norm_d, &norm_d, &(coord[3])); + res = res || ibz_is_even(&norm_d); + } + } + ibz_finalize(&norm_d); + ibz_finalize(&norm_n); + ibz_vec_4_finalize(&coord); + return (res); +} + +int +id2iso_represent_integer_benchmarks(int bitsize, int iterations, int non_diag, int test, int orders) +{ + int res = 0; + int randret = 0; + uint64_t start, end, sum; + ibz_t *n_gammas; + ibz_t aux; + quat_alg_elem_t *gammas; + n_gammas = malloc(iterations * sizeof(ibz_t)); + gammas = malloc(iterations * sizeof(quat_alg_elem_t)); + for (int i = 0; i < iterations; i++) { + ibz_init(&(n_gammas[i])); + quat_alg_elem_init(&(gammas[i])); + } + ibz_init(&aux); + + quat_represent_integer_params_t ri_params; + quat_p_extremal_maximal_order_t order_hnf; + quat_alg_elem_init(&order_hnf.z); + quat_alg_elem_init(&order_hnf.t); + quat_lattice_init(&order_hnf.order); + + printf("Running represent_integer benchmarks for " STRINGIFY(SQISIGN_VARIANT) " with %d iterations, %d orders, " + "non_diag set to %d, inputs of bitsize %d and the %d-bit prime\n", + iterations, + orders, + non_diag, + bitsize, + ibz_bitsize(&(QUATALG_PINFTY.p))); + if (test) { + printf("Tests are run on the outputs\n"); + } + for (int index_alternate_order = 0; index_alternate_order < orders; index_alternate_order++) { + + ri_params.primality_test_iterations = QUAT_represent_integer_params.primality_test_iterations; + + quat_alg_elem_copy(&order_hnf.z, &EXTREMAL_ORDERS[index_alternate_order].z); + quat_alg_elem_copy(&order_hnf.t, &EXTREMAL_ORDERS[index_alternate_order].t); + ibz_copy(&order_hnf.order.denom, &EXTREMAL_ORDERS[index_alternate_order].order.denom); + ibz_mat_4x4_copy(&order_hnf.order.basis, &EXTREMAL_ORDERS[index_alternate_order].order.basis); + order_hnf.q = EXTREMAL_ORDERS[index_alternate_order].q; + ri_params.order = &order_hnf; + ri_params.algebra = &QUATALG_PINFTY; + + // adjust bitsize + ibz_set(&aux, ri_params.order->q); + int bitsize_adjustment = ibz_bitsize(&aux); + +#ifndef NDEBUG + assert(quat_lattice_contains(NULL, &ri_params.order->order, &ri_params.order->z)); + assert(quat_lattice_contains(NULL, &ri_params.order->order, &ri_params.order->t)); +#endif + + randret = randret || id2iso_represent_integer_benchmarks_input_generation( + n_gammas, bitsize + bitsize_adjustment, iterations); + + if (randret) + goto fin; + + sum = 0; + for (int iter = 0; iter < iterations; iter++) { + start = cpucycles(); + res = res | !quat_represent_integer(&(gammas[iter]), &(n_gammas[iter]), non_diag, &ri_params); + end = cpucycles(); + sum = sum + end - start; + } + + printf("For order with q=%d: %" PRIu64 " cycles on average per iteration (adjusted bitsize %d)\n", + (ri_params.order->q), + sum / iterations, + bitsize + bitsize_adjustment); + if (test) { + for (int iter = 0; iter < iterations; iter++) { + res = res || id2iso_represent_integer_benchmarks_test( + &(gammas[iter]), &(n_gammas[iter]), non_diag, &ri_params); + } + } + } + +fin:; + if (randret) { + printf("Randomness failure in id2iso_represent_integer_benchmarks\n"); + } + if (res) { + printf("Tests in id2iso_represent_integer_benchmarks failed\n"); + } + + quat_alg_elem_finalize(&order_hnf.z); + quat_alg_elem_finalize(&order_hnf.t); + quat_lattice_finalize(&order_hnf.order); + ibz_finalize(&aux); + for (int i = 0; i < iterations; i++) { + ibz_finalize(&(n_gammas[i])); + quat_alg_elem_finalize(&(gammas[i])); + } + free(n_gammas); + free(gammas); + + return (res | 2 * randret); +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12]; + int iterations = 10 * SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + int max_orders = NUM_ALTERNATE_EXTREMAL_ORDERS + 1; + int orders = max_orders; + int tests = 0; + int non_diag = 1; + int bitsize = ibz_bitsize(&(QUATALG_PINFTY.p)) + 25; + int invalid = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!tests && strcmp(argv[i], "--tests") == 0) { + tests = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (non_diag && (strcmp(argv[i], "--disable-non-diag") == 0)) { + non_diag = 0; + continue; + } + + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + + if (sscanf(argv[i], "--bitsize=%d", &bitsize) == 1) { + continue; + } + + if (sscanf(argv[i], "--orders=%d", &orders) == 1) { + continue; + } + } + + invalid = invalid || (argc > 6); + invalid = invalid || ((non_diag != 1) && (non_diag != 0)) || (iterations < 0); + invalid = invalid || (bitsize < ibz_bitsize(&(QUATALG_PINFTY.p)) + 20); + invalid = invalid || (orders > max_orders); + invalid = invalid || (orders < 0); + + if (help || invalid) { + if (invalid) { + printf("Invalid input\n"); + } + printf("Usage: %s [--bitsize=] [--orders=] [--iterations=] " + "[--tests] [--disable-non-diag] [--seed=]\n", + argv[0]); + printf("Where is least 20 higher than the bitsize of the prime used in the " + "algebra(which depends on the level); if no present, uses the default %d; it will be " + "adjusted for larger maximal orders by this program\n", + bitsize); + printf("Where is the number of maximal orders on which benchmarks are run. It " + "must be lower than %d;" + "if not present, uses the default: %d)\n", + max_orders, + orders); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + printf("Additional verifications are run on each output if --tests is passed\n"); + printf("If --disable-non-diag is passed, the non_diag flag in the calls is set to 0, otherwise it " + "defaults to 1. If non_diag=1, benchmarks are only run for one order where q=1.\n"); + printf("Output has last bit set if tests failed, second-to-last if randomness failed\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + return id2iso_represent_integer_benchmarks(bitsize, iterations, non_diag, tests, orders); +} diff --git a/src/id2iso/ref/lvlx/test/test_dim2id2iso.c b/src/id2iso/ref/lvlx/test/test_dim2id2iso.c new file mode 100644 index 0000000..110d3b3 --- /dev/null +++ b/src/id2iso/ref/lvlx/test/test_dim2id2iso.c @@ -0,0 +1,343 @@ +#include +#include "id2iso_tests.h" +#include +#include + +static int +ec_is_on_curve(ec_point_t *P, ec_curve_t *E) +{ + fp2_t y_sq, X, tmp; + + fp2_copy(&X, &P->z); + fp2_inv(&X); + fp2_mul(&X, &X, &P->x); + fp2_mul(&y_sq, &X, &X); + fp2_mul(&y_sq, &y_sq, &X); // X^3 + fp2_copy(&tmp, &E->C); + fp2_inv(&tmp); + fp2_mul(&tmp, &tmp, &E->A); + fp2_mul(&tmp, &tmp, &X); + fp2_mul(&tmp, &tmp, &X); + fp2_add(&y_sq, &y_sq, &tmp); // X^3 + A X^2 + fp2_add(&y_sq, &y_sq, &X); // X^3 + A X^2 + X + + if (fp2_is_square(&y_sq)) { + return 1; + } else { + return 0; + } +} + +int +dim2id2iso_test_fixed_degree_isogeny(void) +{ + int ret; + ibz_t u, two_pow; + ibz_t tmp; + quat_left_ideal_t lideal; + ibz_init(&u); + ibz_init(&tmp); + ibz_init(&two_pow); + quat_left_ideal_init(&lideal); + + for (int i = 0; i <= NUM_ALTERNATE_EXTREMAL_ORDERS; i++) { + if (EXTREMAL_ORDERS[i].q % 4 == 1) { + // u is a random prime + ibz_generate_random_prime(&u, 1, 110, QUAT_represent_integer_params.primality_test_iterations); + + // now we check that we get a correct codomain in the end + // by evaluating some point and checking the pairing + theta_couple_curve_t E00; + ec_curve_t E0; + copy_curve(&E0, &CURVES_WITH_ENDOMORPHISMS[i].curve); + ec_curve_normalize_A24(&E0); + copy_curve(&E00.E1, &E0); + copy_curve(&E00.E2, &E0); + ec_basis_t bas = CURVES_WITH_ENDOMORPHISMS[i].basis_even; + + assert(test_point_order_twof(&bas.P, &E00.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&bas.Q, &E00.E2, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&bas.PmQ, &E00.E1, TORSION_EVEN_POWER)); + assert(ec_is_on_curve(&bas.P, &E00.E1)); + + // creating points for translation + theta_couple_point_t T1, T2, T3; + copy_point(&T1.P1, &bas.P); + copy_point(&T2.P1, &bas.Q); + copy_point(&T3.P1, &bas.PmQ); + ec_point_init(&T1.P2); + ec_point_init(&T2.P2); + ec_point_init(&T3.P2); + + assert(ec_is_on_curve(&T2.P1, &E00.E1)); + assert(ec_is_on_curve(&T1.P1, &E00.E1)); + assert(ec_is_on_curve(&T3.P1, &E00.E1)); + assert(ec_is_zero(&T1.P2)); + assert(ec_is_zero(&T2.P2)); + assert(ec_is_zero(&T3.P2)); + + theta_couple_curve_t codomain; + theta_couple_point_t pushed_points[3]; + theta_couple_point_t *const Tev1 = pushed_points + 0, *const Tev2 = pushed_points + 1, + *const Tev3 = pushed_points + 2; + pushed_points[0] = T1; + pushed_points[1] = T2; + pushed_points[2] = T3; + + // Compute the isogeny and evaluation + ret = fixed_degree_isogeny_and_eval( + &lideal, &u, 0, &codomain, pushed_points, sizeof(pushed_points) / sizeof(*pushed_points), i); + assert(ret); + unsigned int length = (unsigned int)ret; + + assert(ec_is_on_curve(&Tev1->P2, &codomain.E2)); + assert(ec_is_on_curve(&Tev2->P1, &codomain.E1)); + assert(ec_is_on_curve(&Tev1->P1, &codomain.E1)); + assert(ec_is_on_curve(&Tev3->P1, &codomain.E1)); + assert(ec_is_on_curve(&Tev2->P2, &codomain.E2)); + assert(ec_is_on_curve(&Tev3->P2, &codomain.E2)); + + assert(test_point_order_twof(&Tev1->P1, &codomain.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&Tev1->P2, &codomain.E2, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&Tev2->P1, &codomain.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&Tev2->P2, &codomain.E2, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&Tev3->P1, &codomain.E1, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&Tev3->P2, &codomain.E2, TORSION_EVEN_POWER)); + fp2_t w0, w1, w2; + + weil(&w0, TORSION_EVEN_POWER, &bas.P, &bas.Q, &bas.PmQ, &E0); + weil(&w1, TORSION_EVEN_POWER, &Tev1->P1, &Tev2->P1, &Tev3->P1, &codomain.E1); + weil(&w2, TORSION_EVEN_POWER, &Tev1->P2, &Tev2->P2, &Tev3->P2, &codomain.E2); + ibz_pow(&two_pow, &ibz_const_two, length); + ibz_sub(&two_pow, &two_pow, &u); + // now we are checking that one of the two is equal to the correct value + digit_t digit_u[NWORDS_ORDER] = { 0 }; + ibz_to_digit_array(digit_u, &u); + fp2_t test_pow; + fp2_pow_vartime(&test_pow, &w0, digit_u, NWORDS_ORDER); + + // The way we set up the 2d isogeny we should always get the first curve + assert(fp2_is_equal(&test_pow, &w1)); + ibz_to_digit_array(digit_u, &two_pow); + fp2_pow_vartime(&test_pow, &w0, digit_u, NWORDS_ORDER); + assert(fp2_is_equal(&test_pow, &w2)); + } + } + + ibz_finalize(&tmp); + ibz_finalize(&u); + ibz_finalize(&two_pow); + quat_left_ideal_finalize(&lideal); + + return 1; +} + +int +dim2id2iso_test_find_uv(void) +{ + // var dec + int found = 1; + ibz_t temp, remainder, n1, n2; + ibz_t norm_d; + quat_alg_elem_t gen; + + quat_left_ideal_t lideal_small; + quat_lattice_t right_order; + ibz_mat_4x4_t reduced, gram; + ibz_vec_4_t coeffs; + quat_alg_elem_t beta1, beta2; + ibz_t u, v, d1, d2, target; + // var init + ibz_init(&target); + ibz_init(&norm_d); + ibz_init(&temp); + ibz_init(&remainder); + ibz_init(&n1); + ibz_init(&n2); + quat_alg_elem_init(&gen); + quat_left_ideal_init(&lideal_small); + quat_lattice_init(&right_order); + ibz_mat_4x4_init(&reduced); + ibz_mat_4x4_init(&gram); + ibz_vec_4_init(&coeffs); + + quat_alg_elem_init(&beta1); + quat_alg_elem_init(&beta2); + + ibz_init(&u); + ibz_init(&v); + ibz_init(&d1); + ibz_init(&d2); + + // computation of lideal_small + ibz_generate_random_prime( + &n1, 1, ibz_bitsize(&QUATALG_PINFTY.p), QUAT_represent_integer_params.primality_test_iterations); + ibz_generate_random_prime( + &n2, 1, ibz_bitsize(&QUATALG_PINFTY.p), QUAT_represent_integer_params.primality_test_iterations); + ibz_mul(&temp, &n1, &n2); + found = found && quat_represent_integer(&gen, &temp, 0, &QUAT_represent_integer_params); + assert(found); + quat_lideal_create(&lideal_small, &gen, &n1, &STANDARD_EXTREMAL_ORDER.order, &QUATALG_PINFTY); + + int exp = TORSION_EVEN_POWER; + ibz_pow(&target, &ibz_const_two, exp); + + found = 0; + int num_rerun = 0; + int max_num_rerun = 2; + int index_alternate_order_1; + int index_alternate_order_2; + while (!found && num_rerun < max_num_rerun) { + found = find_uv(&u, + &v, + &beta1, + &beta2, + &d1, + &d2, + &index_alternate_order_1, + &index_alternate_order_2, + &target, + &lideal_small, + &QUATALG_PINFTY, + NUM_ALTERNATE_EXTREMAL_ORDERS); + if (num_rerun > 0) { + printf("alternate rerun ! \n"); + } + num_rerun++; + } + // TOC_clock(t,"alternate find_uv"); + // printf("\n\n"); + // assert(found); + + if (!found) { + printf("alternate failed \n"); + } + + ibz_finalize(&norm_d); + ibz_finalize(&temp); + ibz_finalize(&remainder); + ibz_finalize(&n1); + ibz_finalize(&n2); + quat_alg_elem_finalize(&gen); + quat_left_ideal_finalize(&lideal_small); + quat_lattice_finalize(&right_order); + ibz_mat_4x4_finalize(&reduced); + ibz_mat_4x4_finalize(&gram); + ibz_finalize(&u); + ibz_finalize(&v); + ibz_finalize(&d1); + ibz_finalize(&d2); + ibz_vec_4_finalize(&coeffs); + ibz_finalize(&target); + + quat_alg_elem_finalize(&beta1); + quat_alg_elem_finalize(&beta2); + + return found; +} + +int +dim2id2iso_test_dimid2iso(void) +{ + + // var dec + int found = 1; + ibz_t temp, remainder, n1, n2; + quat_alg_elem_t gen; + + quat_left_ideal_t lideal_small; + quat_lattice_t right_order; + ibz_mat_4x4_t reduced, gram; + quat_alg_elem_t beta1, beta2; + ibz_t u, v, d1, d2; + + // var init + ibz_init(&temp); + ibz_init(&remainder); + ibz_init(&n1); + ibz_init(&n2); + quat_alg_elem_init(&gen); + quat_left_ideal_init(&lideal_small); + quat_lattice_init(&right_order); + ibz_mat_4x4_init(&reduced); + ibz_mat_4x4_init(&gram); + + quat_alg_elem_init(&beta1); + quat_alg_elem_init(&beta2); + + ibz_init(&u); + ibz_init(&v); + ibz_init(&d1); + ibz_init(&d2); + + // we start by checking that the precomputation is correct, while checking at the same time our + // algorithm + for (int i = 0; i < NUM_ALTERNATE_EXTREMAL_ORDERS; i++) { + ec_basis_t bas_check; + ec_curve_t codom_check; + quat_left_ideal_t id; + quat_left_ideal_init(&id); + quat_lideal_copy(&id, &ALTERNATE_CONNECTING_IDEALS[i]); + found = found && dim2id2iso_arbitrary_isogeny_evaluation(&bas_check, &codom_check, &id); + ec_isom_t isom; + ec_isomorphism(&isom, &codom_check, &ALTERNATE_STARTING_CURVES[i].curve); + ec_iso_eval(&bas_check.P, &isom); + ec_iso_eval(&bas_check.Q, &isom); + ec_iso_eval(&bas_check.PmQ, &isom); + assert(test_point_order_twof(&bas_check.P, &ALTERNATE_STARTING_CURVES[i].curve, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&bas_check.Q, &ALTERNATE_STARTING_CURVES[i].curve, TORSION_EVEN_POWER)); + assert(test_point_order_twof(&bas_check.PmQ, &ALTERNATE_STARTING_CURVES[i].curve, TORSION_EVEN_POWER)); + assert(ec_is_equal(&bas_check.P, &ALTERNATE_STARTING_CURVES[i].basis_even.P)); + assert(ec_is_equal(&bas_check.Q, &ALTERNATE_STARTING_CURVES[i].basis_even.Q)); + assert(ec_is_equal(&bas_check.PmQ, &ALTERNATE_STARTING_CURVES[i].basis_even.PmQ)); + quat_left_ideal_finalize(&id); + } + + // computation of lideal_small + ibz_generate_random_prime( + &n1, 1, ibz_bitsize(&QUATALG_PINFTY.p), QUAT_represent_integer_params.primality_test_iterations); + ibz_generate_random_prime( + &n2, 1, ibz_bitsize(&QUATALG_PINFTY.p), QUAT_represent_integer_params.primality_test_iterations); + ibz_mul(&temp, &n1, &n2); + found = found && quat_represent_integer(&gen, &temp, 0, &QUAT_represent_integer_params); + assert(found); + quat_lideal_create(&lideal_small, &gen, &n1, &STANDARD_EXTREMAL_ORDER.order, &QUATALG_PINFTY); + ec_basis_t bas_end; + ec_curve_t codom; + ec_curve_init(&codom); + + found = dim2id2iso_ideal_to_isogeny_clapotis( + &beta1, &beta2, &u, &v, &d1, &d2, &codom, &bas_end, &lideal_small, &QUATALG_PINFTY); + + for (int i = 0; i < 10; i++) { + ibz_generate_random_prime( + &n1, 1, ibz_bitsize(&QUATALG_PINFTY.p), QUAT_represent_integer_params.primality_test_iterations); + ibz_generate_random_prime( + &n2, 1, ibz_bitsize(&QUATALG_PINFTY.p), QUAT_represent_integer_params.primality_test_iterations); + ibz_mul(&temp, &n1, &n2); + found = found && quat_represent_integer(&gen, &temp, 0, &QUAT_represent_integer_params); + assert(found); + quat_lideal_create(&lideal_small, &gen, &n1, &STANDARD_EXTREMAL_ORDER.order, &QUATALG_PINFTY); + found = dim2id2iso_ideal_to_isogeny_clapotis( + &beta1, &beta2, &u, &v, &d1, &d2, &codom, &bas_end, &lideal_small, &QUATALG_PINFTY); + } + + ibz_finalize(&temp); + ibz_finalize(&remainder); + ibz_finalize(&n1); + ibz_finalize(&n2); + quat_alg_elem_finalize(&gen); + quat_left_ideal_finalize(&lideal_small); + quat_lattice_finalize(&right_order); + ibz_mat_4x4_finalize(&reduced); + ibz_mat_4x4_finalize(&gram); + ibz_finalize(&u); + ibz_finalize(&v); + ibz_finalize(&d1); + ibz_finalize(&d2); + + quat_alg_elem_finalize(&beta1); + quat_alg_elem_finalize(&beta2); + + return found; +} diff --git a/src/id2iso/ref/lvlx/test/test_id2iso.c b/src/id2iso/ref/lvlx/test/test_id2iso.c new file mode 100644 index 0000000..756467a --- /dev/null +++ b/src/id2iso/ref/lvlx/test/test_id2iso.c @@ -0,0 +1,78 @@ +#include +#include +#include + +#include "id2iso_tests.h" +#include "dim2id2iso_tests.h" +#include +#include +#include + +// run all tests in module +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int help = 0; + int seed_set = 0; + int res = 1; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + } + + if (help) { + printf("Usage: %s [--seed=]\n", argv[0]); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + printf("Running id2iso module unit tests\n"); + + res = res & id2iso_test_ker2id(); + + printf("\nRunning dim2id2iso module unit tests\n"); + + printf("\nRunning find uv tests \n"); + int number_test_find_uv = 5; + for (int i = 0; i < number_test_find_uv; i++) { + res = res & dim2id2iso_test_find_uv(); + } + + printf("\nRunning fixed degree tests\n"); + + res = res & dim2id2iso_test_fixed_degree_isogeny(); + + printf("\nRunning id2iso_clapotis tests\n"); + res = res & dim2id2iso_test_dimid2iso(); + + if (!res) { + printf("\nSome tests failed!\n"); + } else { + printf("\nAll tests passed!\n"); + } + return (!res); +} diff --git a/src/id2iso/ref/lvlx_test.cmake b/src/id2iso/ref/lvlx_test.cmake new file mode 100644 index 0000000..661e0c1 --- /dev/null +++ b/src/id2iso/ref/lvlx_test.cmake @@ -0,0 +1,18 @@ +set(SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS + ${LVLX_DIR}/test/ker2id.c + ${LVLX_DIR}/test/test_id2iso.c + ${LVLX_DIR}/test/test_dim2id2iso.c +) +add_executable(sqisign_test_id2iso_${SVARIANT_LOWER} ${SOURCE_FILES_ID2ISO_GENERIC_REF_TESTS}) +target_link_libraries(sqisign_test_id2iso_${SVARIANT_LOWER} ${LIB_ID2ISO_${SVARIANT_UPPER}} sqisign_common_test) +target_include_directories(sqisign_test_id2iso_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_EC} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_HD} ${INC_ID2ISO} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ./include/ ) + +add_test(sqisign_test_id2iso_${SVARIANT_LOWER} sqisign_test_id2iso_${SVARIANT_LOWER}) + +set(SOURCE_FILES_ID2ISO_RI_BENCH + ${LVLX_DIR}/test/represent_integer_benchmarks.c +) +add_executable(sqisign_id2iso_benchmark_represent_integer_${SVARIANT_LOWER} ${SOURCE_FILES_ID2ISO_RI_BENCH}) +target_link_libraries(sqisign_id2iso_benchmark_represent_integer_${SVARIANT_LOWER} ${LIB_ID2ISO_${SVARIANT_UPPER}} sqisign_common_test) +target_include_directories(sqisign_id2iso_benchmark_represent_integer_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_EC} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_HD} ${INC_ID2ISO} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_COMMON} ./include/ ) +set(BM_BINS ${BM_BINS} sqisign_id2iso_benchmark_represent_integer_${SVARIANT_LOWER} CACHE INTERNAL "List of benchmark executables") diff --git a/src/intbig/ref/generic/CMakeLists.txt b/src/intbig/ref/generic/CMakeLists.txt deleted file mode 100644 index b99098d..0000000 --- a/src/intbig/ref/generic/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -set(SOURCE_FILES_INTBIG_GENERIC_REF - intbig.c -) - -add_library(${LIB_INTBIG} ${SOURCE_FILES_INTBIG_GENERIC_REF}) -target_include_directories(${LIB_INTBIG} PRIVATE common ${INC_PUBLIC} ${INC_COMMON} include gmp) -target_compile_options(${LIB_INTBIG} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/intbig/ref/generic/include/intbig.h b/src/intbig/ref/generic/include/intbig.h deleted file mode 100644 index 0dbd3ab..0000000 --- a/src/intbig/ref/generic/include/intbig.h +++ /dev/null @@ -1,545 +0,0 @@ -/** @file - * - * @authors Luca De Feo, Sina Schaeffler - * - * @brief Declarations for big integers in the reference implementation -*/ - -#ifndef INTBIG_H -#define INTBIG_H - -#include -#include -#include - -/** @defgroup ibz_all Signed big integers - * @{ -*/ - -/** @defgroup ibz_t Precise number types - * @{ -*/ - -/** @brief Type for signed long integers - * - * @typedef ibz_t - * - * For integers of arbitrary size, used by intbig module, using gmp -*/ -typedef mpz_t ibz_t ; - -/** @brief Type for fractions of integers - * - * @typedef ibq_t - * - * For fractions of integers of arbitrary size, used by intbig module, using gmp -*/ -typedef mpq_t ibq_t ; - - -/** @brief Type for vector of 2 big integers - * - * @typedef ibz_vec_2_t -*/ -typedef ibz_t ibz_vec_2_t[2]; - -/** @} -*/ - - -/********************************************************************/ - -/** @defgroup ibz_c Constants - * @{ -*/ - -/** - * Constant zero -*/ -extern const ibz_t ibz_const_zero; - -/** - * Constant one -*/ -extern const ibz_t ibz_const_one; - -/** - * Constant two -*/ -extern const ibz_t ibz_const_two; - -/** - * Constant three -*/ -extern const ibz_t ibz_const_three; - -/** @} -*/ - -/* constructors/destructors (possibly no-ops) */ - -/** @defgroup ibz_c Constructors and Destructors - * @{ -*/ - -void ibz_init(ibz_t *x); -void ibq_init(ibq_t *x); -void ibz_vec_2_init(ibz_vec_2_t *vec); - - -void ibz_finalize(ibz_t *x); -void ibq_finalize(ibq_t *x); -void ibz_vec_2_finalize(ibz_vec_2_t *vec); - -/** @brief overwrites memory before freeing it -*/ -void ibz_secure_finalize(ibz_t *x); - -/** @brief overwrites memory before freeing it -*/ -void ibq_secure_finalize(ibq_t *x); - -/** @brief overwrites memory before freeing it -*/ -void ibz_vec_2_secure_finalize(ibz_vec_2_t *vec); - -/** @} -*/ - -/** @defgroup ibz_za Basic integer arithmetic - * @{ -*/ - -/** @brief sum=a+b -*/ -void ibz_add(ibz_t *sum, const ibz_t *a, const ibz_t *b); - -/** @brief diff=a-b -*/ -void ibz_sub(ibz_t *diff, const ibz_t *a, const ibz_t *b); - -/** @brief prod=a*b -*/ -void ibz_mul(ibz_t *prod, const ibz_t *a, const ibz_t *b); - -/** @brief prod=a*2^exp -*/ -void ibz_mul_2exp(ibz_t *prod, const ibz_t *a, uint64_t exp); - -/** @brief neg=-a -*/ -void ibz_neg(ibz_t *neg, const ibz_t* a); - -/** @brief abs=|a| -*/ -void ibz_abs(ibz_t *abs, const ibz_t* a); - -/** @brief Euclidean division of a by b - * - * Computes quotient, remainder so that remainder+quotient*b = a where 0<=|remainder|<|b| - * The quotient is rounded towards zero. -*/ -void ibz_div(ibz_t *quotient, ibz_t *remainder, const ibz_t *a, const ibz_t *b); - -/** @brief Euclidean division of a by b - * - * Computes quotient, remainder so that remainder+quotient*b = a where 0<=|remainder|<|b| - * The quotient is rounded towards minus infinity. - */ -void ibz_div_floor(ibz_t *q, ibz_t *r, const ibz_t *n, const ibz_t *d); - -/** @brief Euclidean division of a by 2^exp - * - * Computes a right shift of abs(a) by exp bits, then sets sign(quotient) to sign(a). - * - * Division and rounding is as in ibz_div. -*/ -void ibz_div_2exp(ibz_t *quotient, const ibz_t *a, uint64_t exp); - -/** @brief r = a mod b - * - * Assumes valid inputs - * The sign of the divisor is ignored, the result is always non-negative -*/ -void ibz_mod(ibz_t *r, const ibz_t *a, const ibz_t *b); - -/** @brief Test if a = 0 mod b -*/ -int ibz_divides(const ibz_t *a, const ibz_t *b); - -/** @brief pow=x^e - * - * Assumes valid inputs, The case 0^0 yields 1. -*/ -void ibz_pow(ibz_t *pow, const ibz_t *x, int64_t e); - -/** @brief pow=(x^e) mod m - * - * Assumes valid inputs -*/ -void ibz_pow_mod(ibz_t *pow, const ibz_t *x, const ibz_t *e, const ibz_t *m); - -/** @brief Compare a and b - * - * @returns a positive value if a > b, zero if a = b, and a negative value if a < b -*/ -int ibz_cmp(const ibz_t *a, const ibz_t *b); - -/** @brief Test if x is 0 - * - * @returns 1 if x=0, 0 otherwise -*/ -int ibz_is_zero(const ibz_t *x); - -/** @brief Test if x is 1 - * - * @returns 1 if x=1, 0 otherwise -*/ -int ibz_is_one(const ibz_t *x); - -/** @brief Test if x is even - * - * @returns 1 if x is even, 0 otherwise -*/ -int ibz_is_even(const ibz_t *x); - -/** @brief set i to value x -*/ -void ibz_set(ibz_t *i, int64_t x); - -/** @brief set i to integer ontained in string when read as number in base - * - * Base should be 10 or 16, and the number should be written without ponctuation or whitespaces - * - * Case for base 16 does not matter - * - * @returns 1 if the string could be converted to an integer, 0 otherwise - */ -int ibz_set_from_str(ibz_t *i, const char *str, int base); - -/** @brief Copy value into target -*/ -void ibz_copy(ibz_t *target, const ibz_t *value); - -/** @brief Exchange values of a and b - */ -void ibz_swap(ibz_t *a, ibz_t *b); - -/** @brief Copy dig array to target, given digits and the length of the dig array - * - * @param target Target ibz_t element - * @param dig array of digits - * @param dig_len length of the digits array -*/ -void ibz_copy_digits(ibz_t *target, const digit_t *dig, int dig_len); -#define ibz_copy_digit_array(I, T) do { ibz_copy_digits((I), (T), sizeof(T)/sizeof(*(T))); } while (0) - -/** @brief Copy an ibz_t to target digit_t array. - * Restrictions: ibz >= 0 and target must hold sufficient elements to hold ibz - * - * @param target Target digit_t array - * @param ibz ibz source ibz_t element -*/ -void ibz_to_digits(digit_t *target, const ibz_t *ibz); -#define ibz_to_digit_array(T, I) do { memset((T), 0, sizeof(T)); ibz_to_digits((T), (I)); } while (0) - -/** @brief get int64_t equal to the lowest bits of i -*/ -int64_t ibz_get(const ibz_t *i); - -//void ibz_printf(const char* format, ...); -#define ibz_printf gmp_printf - -/** @brief generate random value in [a, b] - * assumed that a >= 0 and b >= 0 and a < b - * @returns 1 on success, 0 on failiure -*/ -int ibz_rand_interval(ibz_t *rand, const ibz_t *a, const ibz_t *b); - -/** @brief generate random value in [a, b] - * assumed that a >= 0, b >= 0 and a < b - * @returns 1 on success, 0 on failiure -*/ -int ibz_rand_interval_i(ibz_t *rand, int64_t a, int64_t b); - -/** @brief generate random value in [-m, m] - * assumed that m > 0 and bitlength of m < 64 bit - * @returns 1 on success, 0 on failiure -*/ -int ibz_rand_interval_minm_m(ibz_t *rand, int64_t m); - - -/** @brief Bitsize of a. - * - * @returns Bitsize of a. - * -*/ -int ibz_bitsize(const ibz_t *a); - - -/* etc....*/ - -/** @} -*/ - -/** @defgroup ibz_qa Basic fraction arithmetic - * @{ -*/ - -/** @brief sum=a+b -*/ -void ibq_add(ibq_t *sum, const ibq_t *a, const ibq_t *b); - -/** @brief diff=a-b -*/ -void ibq_sub(ibq_t *diff, const ibq_t *a, const ibq_t *b); - -/** @brief neg=-x - */ -void ibq_neg(ibq_t *neg, const ibq_t *x); - -/** @brief abs=|x| - */ -void ibq_abs(ibq_t *abs, const ibq_t *x); - -/** @brief prod=a*b -*/ -void ibq_mul(ibq_t* prod, const ibq_t *a, const ibq_t *b); - -/** @brief inv=1/x - * - * @returns 0 if x is 0, 1 if inverse exists and was computed -*/ -int ibq_inv(ibq_t *inv, const ibq_t *x); - -/** @brief quot = a/b - * @param quot Output a/b - * @param a - * @param b must not be 0 -*/ -void ibq_div(ibq_t *quot, const ibq_t *a, const ibq_t *b); - -/** @brief Compare a and b - * - * @returns a positive value if a > b, zero if a = b, and a negative value if a < b -*/ -int ibq_cmp(const ibq_t *a, const ibq_t *b); - -/** @brief Test if x is 0 - * - * @returns 1 if x=0, 0 otherwise -*/ -int ibq_is_zero(const ibq_t *x); - -/** @brief Test if x is 1 - * - * @returns 1 if x=1, 0 otherwise -*/ -int ibq_is_one(const ibq_t *x); - -/** @brief Set q to a/b if b not 0 - * - * @returns 1 if b not 0 and q is set, 0 otherwise -*/ -int ibq_set(ibq_t *q, const ibz_t *a, const ibz_t *b); - -/** @brief Set x to 0 - * - * Assumes x is initialized -*/ -void ibq_set_zero(ibq_t *x); - -/** @brief Set x to 1 - * - * Assumes x is initialized -*/ -void ibq_set_one(ibq_t *x); - -/** @brief Copy value into target -*/ -void ibq_copy(ibq_t *target, const ibq_t *value); - -/** @brief Exchange values of a and b - */ -void ibq_swap(ibq_t *a, ibq_t *b); - -/** @brief Denominator of x -*/ -void ibq_denom(ibz_t *d, const ibq_t *x); - -/** @brief Numerator of x -*/ -void ibq_num(ibz_t *n, const ibq_t *x); - -/** @brief Checks if q is an integer - * - * @returns 1 if yes, 0 if not -*/ -int ibq_is_ibz(const ibq_t *q); - -/** - * @brief Converts a fraction q to an integer y, if q is an integer. - * - * @returns 1 if z is an integer, 0 if not -*/ -int ibq_to_ibz(ibz_t *z, const ibq_t *q); - -/** @} -*/ - -/** @defgroup ibz_n Number theory functions - * @{ -*/ - - -/** - * @brief Probabilistic primality test - * - * @param n The number to test - * @param reps Number of Miller-Rabin repetitions. The more, the slower and the less likely are false positives - * @return 1 if probably prime, 0 if certainly not prime, 2 if certainly prime - * - * Using GMP's implementation: - * - * From GMP's documentation: "This function performs some trial divisions, a Baillie-PSW probable prime test, then reps-24 Miller-Rabin probabilistic primality tests." - */ -int ibz_probab_prime(const ibz_t *n, int reps); - -/** - * @brief Greatest common divisor - * - * @param gcd Output: Set to the gcd of a and b - * @param a - * @param b - */ -void ibz_gcd(ibz_t *gcd, const ibz_t *a, const ibz_t *b); - -/** - * @brief GCD and Bézout coefficients u, v such that ua + bv = gcd - * - * @param gcd Output: Set to the gcd of a and b - * @param u Output: integer such that ua+bv=gcd - * @param v Output: Integer such that ua+bv=gcd - * @param a - * @param b - */ -void ibz_xgcd(ibz_t *gcd, ibz_t *u, ibz_t *v, const ibz_t *a, const ibz_t *b); - -/** - * @brief GCD, Bézout coefficients u, v such that ua + bv = gcd, and annihilators s, t such that sa + bt = 0 - * - * @param gcd Output: Set to the gcd of a and b - * @param s Output: integer such that sa+bt=0 - * @param t Output: Integer such that sa+bt=0 - * @param u Output: integer such that ua+bv=gcd - * @param v Output: Integer such that ua+bv=gcd - * @param a - * @param b - */ -void ibz_xgcd_ann(ibz_t *gcd, ibz_t *s, ibz_t *t, ibz_t *u, ibz_t *v, const ibz_t *a, const ibz_t *b); - - -/** - * @brief Modular inverse - * - * @param inv Output: Set to the integer in [0,mod[ such that a*inv = 1 mod (mod) if it exists - * @param a - * @param mod - * @returns 1 if inverse exists and was computed, 0 otherwise - */ -int ibz_invmod(ibz_t *inv, const ibz_t *a, const ibz_t *mod); - -/** - * @brief Chinese remainders - * - * @param crt Output: Set so that crt = a mod (mod_a), crt = b mod (mod_b) - * @param a - * @param b - * @param mod_a - * @param mod_b - */ -void ibz_crt(ibz_t *crt, const ibz_t *a, const ibz_t *b, const ibz_t *mod_a, const ibz_t *mod_b); - -/** - * @brief Kronecker symbol of a mod b - * - * @returns Kronecker symbol of a mod b - * @param a - * @param b - * - * Uses GMP's implementation - */ -int ibz_kronecker(const ibz_t *a, const ibz_t *b); - -/** - * @brief Jacobi symbol of a mod odd - * - * @returns jacobi symbol of a mod odd - * @param a - * @param odd assumed odd - * - * Uses GMP's implementation - * - * If output is -1, a is a not a square mod odd - */ -int ibz_jacobi(const ibz_t *a, const ibz_t *odd); - -/** - * @brief Legendre symbol of a mod p - * - * @returns Legendre symbol of a mod p - * @param a - * @param p assumed prime - * - * Uses GMP's implementation - * - * If output is 1, a is a square mod p, if -1, not. If 0, it is divisible by p - */ -int ibz_legendre(const ibz_t *a, const ibz_t *p); - - - -/** - * @brief Integer square root of a perfect square - * - * @returns 1 if an integer square root of a exists and was computed, 0 otherwise - * @param sqrt Output: Set to a integer square root of a if any exist - * @param a number of which an integer square root is searched - */ -int ibz_sqrt(ibz_t *sqrt, const ibz_t *a); - -/** - * @brief Floor of Integer square root - * - * @param sqrt Output: Set to the floor of an integer square root - * @param a number of which a floor of an integer square root is searched - */ -void ibz_sqrt_floor(ibz_t *sqrt, const ibz_t *a); - -/** - * @brief Square root modulo a prime - * - * @returns 1 if square root of a mod p exists and was computed, 0 otherwise - * @param sqrt Output: Set to a square root of a mod p if any exist - * @param a number of which a square root mod p is searched - * @param p assumed prime - */ -int ibz_sqrt_mod_p(ibz_t *sqrt, const ibz_t *a, const ibz_t *p); - -/** - * @brief Square root modulo a the double of a given prime - * - * @returns 1 if square root of a mod (2p) exists and was computed, 0 otherwise - * @param sqrt Output: Set to a square root of a mod (2p) if any exist - * @param a number of which a square root mod (2p) is searched - * @param p assumed prime - */ -int ibz_sqrt_mod_2p(ibz_t *sqrt, const ibz_t *a, const ibz_t *p); - -/** @} -*/ - -// end of ibz_all -/** @} -*/ -#endif diff --git a/src/intbig/ref/generic/intbig.c b/src/intbig/ref/generic/intbig.c deleted file mode 100644 index 0a8bedc..0000000 --- a/src/intbig/ref/generic/intbig.c +++ /dev/null @@ -1,1114 +0,0 @@ -#include -#include -#include -#include -#include - -//#define DEBUG_VERBOSE - -#ifdef DEBUG_VERBOSE -#define DEBUG_STR_PRINTF(x) printf("%s\n", (x)); -#define DEBUG_STR_FUN_INT_MP(op, arg1, arg2) \ - gmp_printf("%s,%lx,%Zx\n", (op), (arg1), (arg2)); -#define DEBUG_STR_FUN_3(op, arg1, arg2, arg3) \ - gmp_printf("%s,%Zx,%Zx,%Zx\n", (op), (arg1), (arg2), (arg3)); -#define DEBUG_STR_FUN_INT_MP2(op, arg1, arg2, arg3) \ - if ((arg1) >= 0) \ - gmp_printf("%s,%lx,%Zx,%Zx\n", (op), (arg1), (arg2), (arg3)); \ - else \ - gmp_printf("%s,-%lx,%Zx,%Zx\n", (op), (-arg1), (arg2), (arg3)); -#define DEBUG_STR_FUN_INT_MP_INT(op, arg1, arg2, arg3) \ - gmp_printf("%s,%lx,%Zx,%lx\n", (op), (arg1), (arg2), (arg3)); -#define DEBUG_STR_FUN_4(op, arg1, arg2, arg3, arg4) \ - gmp_printf("%s,%Zx,%Zx,%Zx,%Zx\n", (op), (arg1), (arg2), (arg3), (arg4)); -#else -#define DEBUG_STR_PRINTF(x) -#define DEBUG_STR_FUN_INT_MP(op, arg1, arg2) -#define DEBUG_STR_FUN_3(op, arg1, arg2, arg3) -#define DEBUG_STR_FUN_INT_MP2(op, arg1, arg2, arg3) -#define DEBUG_STR_FUN_INT_MP_INT(op, arg1, arg2, arg3) -#define DEBUG_STR_FUN_4(op, arg1, arg2, arg3, arg4) -#endif - -/** @defgroup ibz_t Constants - * @{ - */ - -const __mpz_struct ibz_const_zero[1] = { - { - ._mp_alloc = 0, - ._mp_size = 0, - ._mp_d = (mp_limb_t[]){0}, - } -}; - -const __mpz_struct ibz_const_one[1] = { - { - ._mp_alloc = 0, - ._mp_size = 1, - ._mp_d = (mp_limb_t[]){1}, - } -}; - -const __mpz_struct ibz_const_two[1] = { - { - ._mp_alloc = 0, - ._mp_size = 1, - ._mp_d = (mp_limb_t[]){2}, - } -}; - -const __mpz_struct ibz_const_three[1] = { - { - ._mp_alloc = 0, - ._mp_size = 1, - ._mp_d = (mp_limb_t[]){3}, - } -}; - -/* constructors/destructors (possibly no-ops) */ - -/** @defgroup ibz_t Constructors and Destructors - * @{ - */ - -void ibz_init(ibz_t *x) -{ - mpz_init(*x); -} - -void ibq_init(ibq_t *x) -{ - mpq_init(*x); -} - -void ibz_vec_2_init(ibz_vec_2_t *vec) -{ - ibz_init(&((*vec)[0])); - ibz_init(&((*vec)[1])); -} - -void ibz_finalize(ibz_t *x) -{ - mpz_clear(*x); -} - -void ibz_secure_finalize(ibz_t *x) -{ - typedef void (*setui_t)(mpz_t, unsigned long int); - static volatile setui_t setui_fun = mpz_set_ui; - setui_fun(*x, 0); - mpz_clear(*x); -} - -void ibq_finalize(ibq_t *x) -{ - mpq_clear(*x); -} - -void ibq_secure_finalize(ibq_t *x) -{ - typedef void (*setui_t)(mpq_t, unsigned long int, unsigned long int); - static volatile setui_t setui_fun = mpq_set_ui; - setui_fun(*x, 0, 0); - mpq_clear(*x); -} - -void ibz_vec_2_finalize(ibz_vec_2_t *vec) -{ - ibz_finalize(&((*vec)[0])); - ibz_finalize(&((*vec)[1])); -} - -void ibz_vec_2_secure_finalize(ibz_vec_2_t *vec) -{ - ibz_secure_finalize(&((*vec)[0])); - ibz_secure_finalize(&((*vec)[1])); -} - -/** @} - */ - -/** @defgroup ibz_za Basic integer arithmetic - * @{ - */ - -/** @brief sum=a+b - */ -void ibz_add(ibz_t *sum, const ibz_t *a, const ibz_t *b) -{ -#ifdef DEBUG_VERBOSE - ibz_t a_cp, b_cp; - ibz_init(&a_cp); - ibz_init(&b_cp); - ibz_copy(&a_cp, a); - ibz_copy(&b_cp, b); -#endif - mpz_add(*sum, *a, *b); -#ifdef DEBUG_VERBOSE - DEBUG_STR_FUN_3("ibz_add", *sum, a_cp, b_cp); - ibz_finalize(&a_cp); - ibz_finalize(&b_cp); -#endif -} - -/** @brief diff=a-b - */ -void ibz_sub(ibz_t *diff, const ibz_t *a, const ibz_t *b) -{ -#ifdef DEBUG_VERBOSE - ibz_t a_cp, b_cp; - ibz_init(&a_cp); - ibz_init(&b_cp); - ibz_copy(&a_cp, a); - ibz_copy(&b_cp, b); -#endif - mpz_sub(*diff, *a, *b); - -#ifdef DEBUG_VERBOSE - DEBUG_STR_FUN_3("ibz_sub", *diff, a_cp, b_cp); - ibz_finalize(&a_cp); - ibz_finalize(&b_cp); -#endif -} - -/** @brief prod=a*b - */ -void ibz_mul(ibz_t *prod, const ibz_t *a, const ibz_t *b) -{ -#ifdef DEBUG_VERBOSE - ibz_t a_cp, b_cp; - ibz_init(&a_cp); - ibz_init(&b_cp); - ibz_copy(&a_cp, a); - ibz_copy(&b_cp, b); -#endif - mpz_mul(*prod, *a, *b); -#ifdef DEBUG_VERBOSE - DEBUG_STR_FUN_3("ibz_mul", *prod, a_cp, b_cp); - ibz_finalize(&a_cp); - ibz_finalize(&b_cp); -#endif - -} - -/** @brief prod=a*2^exp -*/ -void ibz_mul_2exp(ibz_t *prod, const ibz_t *a, uint64_t exp) { -#ifdef DEBUG_VERBOSE - ibz_t a_cp; - ibz_init(&a_cp); - ibz_copy(&a_cp, a); -#endif - mpz_mul_2exp(*prod, *a, exp); -#ifdef DEBUG_VERBOSE - gmp_printf("ibz_mul_2exp,%Zx,%Zx,%lx\n", *prod, a_cp, exp); - ibz_finalize(&a_cp); -#endif -} - -/** @brief neg=-a -*/ -void ibz_neg(ibz_t *neg, const ibz_t* a) { - mpz_neg(*neg, *a); -} - -/** @brief abs=|a| -*/ -void ibz_abs(ibz_t *abs, const ibz_t* a) { - mpz_abs(*abs, *a); -} - -/** @brief Euclidean division of a by b - * - * Computes quotient, remainder so that remainder+quotient*b = a where 0<=|remainder|<|b| - * The quotient is rounded towards zero. - */ -void ibz_div(ibz_t *quotient, ibz_t *remainder, const ibz_t *a, const ibz_t *b) -{ -#ifdef DEBUG_VERBOSE - ibz_t a_cp, b_cp; - ibz_init(&a_cp); - ibz_init(&b_cp); - ibz_copy(&a_cp, a); - ibz_copy(&b_cp, b); -#endif - mpz_tdiv_qr(*quotient, *remainder, *a, *b); -#ifdef DEBUG_VERBOSE - DEBUG_STR_FUN_4("ibz_div", *quotient, *remainder, a_cp, b_cp); - ibz_finalize(&a_cp); - ibz_finalize(&b_cp); -#endif -} - -/** @brief Euclidean division of a by b - * - * Computes quotient, remainder so that remainder+quotient*b = a where 0<=|remainder|<|b| - * The quotient is rounded towards minus infinity. - */ -void ibz_div_floor(ibz_t *q, ibz_t *r, const ibz_t *n, const ibz_t *d){ - mpz_fdiv_qr(*q,*r,*n,*d); -} - -/** @brief Euclidean division of a by 2^exp - * - * Computes a right shift of abs(a) by exp bits, then sets sign(quotient) to sign(a) -*/ -void ibz_div_2exp(ibz_t *quotient, const ibz_t *a, uint64_t exp) { -#ifdef DEBUG_VERBOSE - ibz_t a_cp; - ibz_init(&a_cp); - ibz_copy(&a_cp, a); -#endif - mpz_tdiv_q_2exp(*quotient, *a, exp); -#ifdef DEBUG_VERBOSE - gmp_printf("ibz_div_2exp,%Zx,%Zx,%lx\n", *quotient, a_cp, exp); - ibz_finalize(&a_cp); -#endif -} - -/** @brief r = a mod b - * - * Assumes valid inputs - * The sign of the divisor is ignored, the result is always non-negative - */ -void ibz_mod(ibz_t *r, const ibz_t *a, const ibz_t *b) -{ - mpz_mod(*r, *a, *b); -} - -/** @brief Test if a = 0 mod b -*/ -int ibz_divides(const ibz_t *a, const ibz_t *b) -{ - return mpz_divisible_p(*a, *b); -} - -/** @brief pow=x^e - * - * Assumes valid inputs - */ -void ibz_pow(ibz_t *pow, const ibz_t *x, int64_t e) -{ - mpz_pow_ui(*pow, *x, (unsigned long int)e); -} - -/** @brief pow=(x^e) mod m - */ -void ibz_pow_mod(ibz_t *pow, const ibz_t *x, const ibz_t *e, const ibz_t *m) -{ - mpz_powm(*pow, *x, *e, *m); - DEBUG_STR_FUN_4("ibz_pow_mod", *pow, *x, *e, *m); -} - -/** @brief Compare a and b - * - * @returns a positive value if a > b, zero if a = b, and a negative value if a < b - */ -int ibz_cmp(const ibz_t *a, const ibz_t *b) -{ - int ret = mpz_cmp(*a, *b); - DEBUG_STR_FUN_INT_MP2("ibz_cmp", ret, *a, *b); - return ret; -} - -/** @brief Test if x is 0 - * - * @returns 1 if x=0, 0 otherwise - */ -int ibz_is_zero(const ibz_t *x) -{ - int ret = !mpz_cmp_ui(*x, 0); - DEBUG_STR_FUN_INT_MP("ibz_is_zero", ret, *x); - return ret; -} - -/** @brief Test if x is 1 - * - * @returns 1 if x=1, 0 otherwise - */ -int ibz_is_one(const ibz_t *x) -{ - int ret = !mpz_cmp_ui(*x, 1); - DEBUG_STR_FUN_INT_MP("ibz_is_one", ret, *x); - return ret; -} - -/** @brief Test if x is even - * - * @returns 1 if x is even, 0 otherwise -*/ -int ibz_is_even(const ibz_t *x) { - int ret = !mpz_tstbit(*x, 0); - DEBUG_STR_FUN_INT_MP("ibz_is_even", ret, *x); - return ret; -} - -/** @brief set i to value x - */ -void ibz_set(ibz_t *i, int64_t x) -{ - mpz_set_si(*i, (signed long int)x); -} - -/** @brief set i to integer ontained in string when read as number in base - * - * Base should be 10 or 16, and the number should be written without ponctuation or whitespaces - * - * Case for base 16 does not matter - * - * @returns 1 if the string could be converted to an integer, 0 otherwise - */ -int ibz_set_from_str(ibz_t *i, const char *str, int base) -{ - return(1 + mpz_set_str (*i, str,base)); -} - -/** @brief Copy value into target - */ -void ibz_copy(ibz_t *target, const ibz_t *value) -{ - mpz_set(*target, *value); -} - -/** @brief Exchange values of a and b - */ -void ibz_swap(ibz_t *a, ibz_t *b){ - mpz_swap(*a,*b); -} - -/** @brief get long equal to the lowest bits of i - */ -int64_t ibz_get(const ibz_t *i) -{ - return (int64_t)mpz_get_si(*i); -} - -/** @brief generate random value in [a, b] with rejection sampling - * @returns 0 if random generation failed, 1 if it succeeded - */ -int ibz_rand_interval(ibz_t *rand, const ibz_t *a, const ibz_t *b) -{ - // TODO: do it with a hash stream? - int randret; - int ret = 1; - mpz_t tmp; - mpz_t bmina; - mpz_init(bmina); - mpz_sub(bmina, *b, *a); - - size_t len_bits = mpz_sizeinbase(bmina, 2); - size_t len_bytes = (len_bits + 7) / 8; - size_t sizeof_limb = sizeof(mp_limb_t); - size_t sizeof_limb_bits = sizeof_limb*8; - size_t len_limbs = (len_bytes + sizeof_limb - 1) / sizeof_limb; - - mp_limb_t mask = ((mp_limb_t) -1) >> (sizeof_limb_bits - (len_bits % sizeof_limb_bits)); - mp_limb_t r[len_limbs]; - - do { - randret = randombytes((unsigned char *)r, len_bytes); - if (randret != 0) { - ret = 0; - goto err; - } -#ifdef TARGET_BIG_ENDIAN - for (int i = 0; i < len_limbs; ++i) - r[i] = BSWAP_DIGIT(r[i]); -#endif - r[len_limbs - 1] &= mask; - mpz_roinit_n(tmp, r, len_limbs); - if (mpz_cmp(tmp, bmina) <= 0) break; - } while (1); - - mpz_add(*rand, tmp, *a); -err: - mpz_clear(bmina); - return ret; -} - -int ibz_rand_interval_i(ibz_t *rand, int64_t a, int64_t b) { - int ret = 1; - mpz_t a_big, b_big; - mpz_init_set_si(a_big, a); - mpz_init_set_si(b_big, b); - ret = ibz_rand_interval(rand, &a_big, &b_big); - mpz_clear(a_big); - mpz_clear(b_big); - return ret; -} - -int ibz_rand_interval_minm_m(ibz_t *rand, int64_t m) { - int ret = 1; - ret = ibz_rand_interval_i(rand, 0, 2*m); - if (ret != 1) goto err; - mpz_sub_ui(*rand, *rand, (unsigned long int) m); -err: - return ret; -} - - -/** @brief Bitsize of a. - * - * @returns Bitsize of a. - * - */ -int ibz_bitsize(const ibz_t *a) -{ - return (int)mpz_sizeinbase(*a, 2); -} - -/* etc....*/ - -/** @} - */ - -/** @defgroup ibz_qa Basic fraction arithmetic - * @{ - */ - -/** @brief sum=a+b - */ -void ibq_add(ibq_t *sum, const ibq_t *a, const ibq_t *b) -{ - mpq_add(*sum, *a, *b); -} - -/** @brief diff=a-b - */ -void ibq_sub(ibq_t *diff, const ibq_t *a, const ibq_t *b) -{ - mpq_sub(*diff, *a, *b); -} - -/** @brief neg=-x - */ -void ibq_neg(ibq_t *neg, const ibq_t *x){ - mpq_neg(*neg,*x); -} - -/** @brief abs=|x| - */ -void ibq_abs(ibq_t *abs, const ibq_t *x){ - mpq_abs(*abs,*x); -} - -/** @brief prod=a*b - */ -void ibq_mul(ibq_t *prod, const ibq_t *a, const ibq_t *b) -{ - mpq_mul(*prod, *a, *b); -} - -/** @brief inv=1/x - * - * @returns 0 if x is 0, 1 if inverse exists and was computed - */ -int ibq_inv(ibq_t *inv, const ibq_t *x) -{ - if (mpq_cmp_ui(*x, 0, 1)) - { - mpq_inv(*inv, *x); - return 1; - } - else - { - return 0; - } -} - -/** @brief quot = a/b - * @param quot Output a/b - * @param a - * @param b must not be 0 -*/ -void ibq_div(ibq_t *quot, const ibq_t *a, const ibq_t *b){ - mpq_div(*quot,*a,*b); -} - -/** @brief Compare a and b - * - * @returns a positive value if a > b, zero if a = b, and a negative value if a < b - */ -int ibq_cmp(const ibq_t *a, const ibq_t *b) -{ - return mpq_cmp(*a, *b); -} - -/** @brief Test if x is 0 - * - * @returns 1 if x=0, 0 otherwise - */ -int ibq_is_zero(const ibq_t *x) -{ - return !mpq_cmp_ui(*x, 0, 1); -} - -/** @brief Test if x is 1 - * - * @returns 1 if x=1, 0 otherwise - */ -int ibq_is_one(const ibq_t *x) -{ - return !mpq_cmp_ui(*x, 1, 1); -} - -/** @brief Set q to a/b if b not 0 - * - * @returns 1 if b not 0 and q is set, 0 otherwise - */ -int ibq_set(ibq_t *q, const ibz_t *a, const ibz_t *b) -{ - if (mpz_cmp_si(*b, 0)) - { - mpq_set_num(*q, *a); - mpq_set_den(*q, *b); - mpq_canonicalize(*q); - return 1; - } - else - { - return 0; - } -} - -/** @brief Copy value into target - */ -void ibq_copy(ibq_t *target, const ibq_t *value) -{ - mpq_set(*target, *value); -} - -/** @brief Exchange values of a and b - */ -void ibq_swap(ibq_t *a, ibq_t *b){ - mpq_swap(*a,*b); -} - -/** @brief Copy dig array to target, given digits and the length of the dig array - * - * @param target Target ibz_t element - * @param dig array of digits - * @param dig_len length of the digits array -*/ -void ibz_copy_digits(ibz_t *target, const digit_t *dig, int dig_len) { - mpz_t tmp, tmp2; - assert(sizeof(mp_limb_t) <= sizeof(digit_t)); - if (sizeof(mp_limb_t) == sizeof(digit_t)) { - mpz_roinit_n(tmp, (const mp_limb_t *) dig, dig_len); - mpz_set(*target, tmp); - } else { - // type size mismatch, we populate the mpz_t with gmp's public interface taking 'unsigned long int' - mpz_init(tmp); - mpz_init(tmp2); - int sizeof_uli = sizeof(unsigned long int); - int sizeof_digit_t = sizeof(digit_t); - int uli_for_digs = (sizeof_digit_t + sizeof_uli - 1) / sizeof_uli; - mpz_set_ui(tmp, 0); - for (int i = 0; i < dig_len; ++i) { - digit_t d = dig[i]; - for (int j = 0; j < uli_for_digs; ++j) { - mpz_set_ui(tmp2, (unsigned long int) d); - mpz_mul_2exp(tmp2, tmp2, j*sizeof_uli*8 + i*sizeof_digit_t*8); - mpz_add(tmp, tmp, tmp2); - d >>= (sizeof_uli*8); - } - } - mpz_set(*target, tmp); - mpz_clear(tmp); - mpz_clear(tmp2); - } -} - -/** @brief Copy an ibz_t to target digit_t array. - * Restrictions: ibz >= 0 and target must hold sufficient elements to hold ibz - * - * @param target Target digit_t array - * @param ibz ibz source ibz_t element -*/ -void ibz_to_digits(digit_t *target, const ibz_t *ibz) { - assert(sizeof(mp_limb_t) <= sizeof(digit_t)); - size_t ibz_limbs = mpz_size(*ibz); - if (ibz_limbs == 0) { - target[0] = 0; - } else { - if (sizeof(mp_limb_t) == sizeof(digit_t)) { - const mp_limb_t *limbs = mpz_limbs_read(*ibz); - for (int i = 0; i < ibz_limbs; ++i) { - target[i] = limbs[i]; - } - } else { - mpz_t tmp; - mpz_init_set(tmp, *ibz); - int sizeof_digit_t = sizeof(digit_t); - int sizeof_limb = sizeof(mp_limb_t); - int digit_len = (ibz_limbs*sizeof_limb + sizeof_digit_t - 1) / sizeof_digit_t; - for (int i = 0; i < digit_len; ++i) { - target[i] = 0; - for (int j = 0; j < (sizeof_digit_t + sizeof_limb - 1) / sizeof_limb; ++j) { - target[i] |= ((digit_t) mpz_getlimbn(tmp, j)) << (j*8*sizeof_limb); - } - mpz_div_2exp(tmp, tmp, sizeof_digit_t*8); - } - mpz_clear(tmp); - } - } -} - -/** @brief Denominator of x - */ -void ibq_denom(ibz_t *d, const ibq_t *x) -{ - mpq_get_den(*d, *x); -} - -/** @brief Numerator of x - */ -void ibq_num(ibz_t *n, const ibq_t *x) -{ - mpq_get_num(*n, *x); -} - -/** @brief Checks if x is an integer - * - * @returns 1 if yes, 0 if not - */ -int ibq_is_ibz(const ibq_t *q) -{ - mpz_t num, den; - int ret; - mpz_init(num); - mpz_init(den); - - mpq_get_num(num, *q); - mpq_get_den(den, *q); - - ret = (mpz_divisible_p(num, den) == 0 ? 0 : 1); - - mpz_clear(num); - mpz_clear(den); - return ret; -} - -/** - * @brief Converts a fraction q to an integer y, if q is an integer. - * - * @returns 1 if z is an integer, 0 if not - */ -int ibq_to_ibz(ibz_t *z, const ibq_t *q) -{ - mpz_t num, den; - int ret; - mpz_init(num); - mpz_init(den); - - mpq_get_num(num, *q); - mpq_get_den(den, *q); - - ret = (mpz_divisible_p(num, den) == 0 ? 0 : 1); - - if (!ret) - goto err; - - mpz_divexact(*z, num, den); - -err: - mpz_clear(num); - mpz_clear(den); - return ret; -} - -/** @} - */ - -/** @defgroup ibz_n Number theory functions - * @{ - */ - -/** - * @brief Probabilistic primality test - * - * @param n The number to test - * @param reps Number of Miller-Rabin repetitions. The more, the slower and the less likely are false positives - * @return 1 if probably prime, 0 if certainly not prime, 2 if certainly prime - * - * Using GMP's implementation: - * - * From GMP's documentation: "This function performs some trial divisions, a Baillie-PSW probable prime test, then reps-24 Miller-Rabin probabilistic primality tests." - */ -int ibz_probab_prime(const ibz_t *n, int reps) -{ - int ret = mpz_probab_prime_p(*n, reps); - DEBUG_STR_FUN_INT_MP_INT("ibz_probab_prime", ret, *n, reps); - return ret; -} - -/** - * @brief Greatest common divisor - * - * @param gcd Output: Set to the gcd of a and b - * @param a - * @param b - */ -void ibz_gcd(ibz_t *gcd, const ibz_t *a, const ibz_t *b) -{ - mpz_gcd(*gcd, *a, *b); -} - -/** - * @brief GCD and Bézout coefficients u, v such that ua + bv = gcd - * - * @param gcd Output: Set to the gcd of a and b - * @param u Output: integer such that ua+bv=gcd - * @param v Output: Integer such that ua+bv=gcd - * @param a - * @param b - */ -void ibz_xgcd(ibz_t *gcd, ibz_t *u, ibz_t *v, const ibz_t *a, const ibz_t *b) -{ - mpz_gcdext(*gcd, *u, *v, *a, *b); -} - -/** - * @brief GCD, Bézout coefficients u, v such that ua + bv = gcd, and annihilators s, t such that sa + bt = 0 - * - * @param gcd Output: Set to the gcd of a and b - * @param s Output: integer such that sa+bt=0 - * @param t Output: Integer such that sa+bt=0 - * @param u Output: integer such that ua+bv=gcd - * @param v Output: Integer such that ua+bv=gcd - * @param a - * @param b - */ -void ibz_xgcd_ann(ibz_t *gcd, ibz_t *s, ibz_t *t, ibz_t *u, ibz_t *v, const ibz_t *a, const ibz_t *b) { - ibz_t thrash; - ibz_init(&thrash); - ibz_xgcd(gcd, u, v, a, b); - ibz_div(s, &thrash, b, gcd); - ibz_neg(t, a); - ibz_div(t, &thrash, t, gcd); - ibz_finalize(&thrash); -} - - -/** - * @brief Modular inverse - * - * @param inv Output: Set to the integer in [0,mod[ such that a*inv = 1 mod (mod) if it exists - * @param a - * @param mod - * @returns 1 if inverse exists and was computed, 0 otherwise - */ -int ibz_invmod(ibz_t *inv, const ibz_t *a, const ibz_t *mod) -{ - return (mpz_invert(*inv, *a, *mod) ? 1 : 0); -} - -/** - * @brief Calculates CRT with a system of two congruences, using Extended Euclidean. - * - * @param crt Output: Set so that crt = a mod (mod_a), crt = b mod (mod_b) - * @param a - * @param b - * @param mod_a - * @param mod_b - */ -void ibz_crt(ibz_t *crt, const ibz_t *a, const ibz_t *b, const ibz_t *mod_a, const ibz_t *mod_b) -{ - mpz_t tmp, u, v; - mpz_init(tmp); - mpz_init(u); - mpz_init(v); - mpz_gcdext(tmp, u, v, *mod_a, *mod_b); - - mpz_mul(tmp, *a, v); - mpz_mul(tmp, tmp, *mod_b); - - mpz_mul(u, *b, u); - mpz_mul(u, u, *mod_a); - - mpz_add(tmp, tmp, u); - - mpz_mul(v, *mod_a, *mod_b); - - mpz_mod(*crt, tmp, v); - - mpz_clear(tmp); - mpz_clear(u); - mpz_clear(v); -} - -/** - * @brief Kronecker symbol of a mod b - * - * @returns Kronecker symbol of a mod b - * @param a - * @param b - * - * Uses GMP's implementation - */ -int ibz_kronecker(const ibz_t *a, const ibz_t *b) -{ - return mpz_kronecker(*a, *b); -} - -/** - * @brief Jacobi symbol of a mod odd - * - * @returns jacobi symbol of a mod odd - * @param a - * @param odd assumed odd - * - * Uses GMP's implementation - * - * If output is -1, a is a not a square mod odd - */ -int ibz_jacobi(const ibz_t *a, const ibz_t *odd) -{ - return mpz_jacobi(*a, *odd); -} - -/** - * @brief Legendre symbol of a mod p - * - * @returns Legendre symbol of a mod p - * @param a - * @param p assumed prime - * - * Uses GMP's implementation - * - * If output is 1, a is a square mod p, if -1, not. If 0, it is divisible by p - */ -int ibz_legendre(const ibz_t *a, const ibz_t *p) -{ - return mpz_legendre(*a, *p); -} - -/** - * @brief Integer square root of a perfect square - * - * @returns 1 if an integer square root of a exists and was computed, 0 otherwise - * @param sqrt Output: Set to a integer square root of a if any exist - * @param a number of which an integer square root is searched - */ -int ibz_sqrt(ibz_t *sqrt, const ibz_t *a) -{ - if (mpz_perfect_square_p(*a)) - { - mpz_sqrt(*sqrt, *a); - return 1; - } - else - { - return 0; - } -} - -/** - * @brief Floor of Integer square root - * - * @param sqrt Output: Set to the floor of an integer square root - * @param a number of which a floor of an integer square root is searched - */ -void ibz_sqrt_floor(ibz_t *sqrt, const ibz_t *a) -{ - mpz_sqrt(*sqrt, *a); -} - -/** - * @brief Square root modulo a prime - * - * We handle two special cases separately: - * - p mod 4 == 3 - * - p mod 8 == 5 - * - * Otherwise (if p mod 8 == 1), we apply the Shanks-Tonelli algorithm - * to find the square root. - * - * @returns 1 if square root of a mod p exists and was computed, 0 otherwise - * @param sqrt Output: Set to a square root of a mod p if any exist - * @param a number of which a square root mod p is searched - * @param p assumed prime - */ -int ibz_sqrt_mod_p(ibz_t *sqrt, const ibz_t *a, const ibz_t *p) -{ - // TODO: handle special cases, a = 0? - -#ifndef NDEBUG - assert(ibz_probab_prime(p, 100)); -#endif - -#ifdef DEBUG_VERBOSE - ibz_t a_cp, p_cp; - ibz_init(&a_cp); - ibz_init(&p_cp); - ibz_copy(&a_cp, a); - ibz_copy(&p_cp, p); -#endif - - mpz_t amod, tmp, exp, a4, a2, n, q, z, qnr, x, y, b, pm1; - mpz_init(amod); - mpz_init(tmp); - mpz_init(exp); - mpz_init(a4); - mpz_init(a2); - mpz_init(n); - mpz_init(q); - mpz_init(z); - mpz_init(qnr); - mpz_init(x); - mpz_init(y); - mpz_init(b); - mpz_init(pm1); - - int ret = 1; - - mpz_mod(amod, *a, *p); - if (mpz_cmp_ui(amod, 0) < 0) - { - mpz_add(amod, *p, amod); - } - - if (mpz_jacobi(amod, *p) != 1) - { - ret = 0; - goto end; - } - - mpz_sub_ui(pm1, *p, 1); - - if (mpz_mod_ui(tmp, *p, 4) == 3) - { - // p % 4 == 3 - mpz_add_ui(tmp, *p, 1); - mpz_fdiv_q_2exp(tmp, tmp, 2); - mpz_powm(*sqrt, amod, tmp, *p); - } - else if (mpz_mod_ui(tmp, *p, 8) == 5) - { - // p % 8 == 5 - mpz_sub_ui(tmp, *p, 1); - mpz_fdiv_q_2exp(tmp, tmp, 2); - mpz_powm(tmp, amod, tmp, *p); // a^{(p-1)/4} mod p - if (!mpz_cmp_ui(tmp, 1)) - { - mpz_add_ui(tmp, *p, 3); - mpz_fdiv_q_2exp(tmp, tmp, 3); - mpz_powm(*sqrt, amod, tmp, *p); // a^{(p+3)/8} mod p - } - else - { - mpz_sub_ui(tmp, *p, 5); - mpz_fdiv_q_2exp(tmp, tmp, 3); // (p - 5) / 8 - mpz_mul_2exp(a4, amod, 2); // 4*a - mpz_powm(tmp, a4, tmp, *p); - - mpz_mul_2exp(a2, amod, 1); - mpz_mul(tmp, a2, tmp); - mpz_mod(*sqrt, tmp, *p); - } - } - else - { - // p % 8 == 1 -> Shanks-Tonelli - int e = 0; - mpz_sub_ui(q, *p, 1); - while (mpz_tstbit(q, e) == 0) - e++; - mpz_fdiv_q_2exp(q, q, e); - - // 1. find generator - non-quadratic residue - mpz_set_ui(n, 2); - while (mpz_legendre(qnr, *p) != -1) - mpz_add_ui(qnr, qnr, 1); - mpz_powm(z, qnr, q, *p); - - // 2. Initialize - mpz_set(y, z); - int r = e; - mpz_powm(y, amod, q, *p); // y = a^q mod p - - mpz_add_ui(tmp, q, 1); // tmp = (q + 1) / 2 - mpz_fdiv_q_2exp(tmp, tmp, 1); - - mpz_powm(x, amod, tmp, *p); // x = a^(q + 1)/2 mod p - - mpz_set_ui(exp, 1); - mpz_mul_2exp(exp, exp, e - 2); - - for (int i = 0; i < e; ++i) - { - mpz_powm(b, y, exp, *p); - - if (!mpz_cmp(b, pm1)) - { - mpz_mul(x, x, z); - mpz_mod(x, x, *p); - - mpz_mul(y, y, z); - mpz_mul(y, y, z); - mpz_mod(y, y, *p); - } - - mpz_powm_ui(z, z, 2, *p); - mpz_fdiv_q_2exp(exp, exp, 1); - } - - mpz_set(*sqrt, x); - } - -#ifdef DEBUG_VERBOSE - DEBUG_STR_FUN_3("ibz_sqrt_mod_p", *sqrt, a_cp, p_cp); - ibz_finalize(&a_cp); - ibz_finalize(&p_cp); -#endif - -end: - mpz_clear(amod); - mpz_clear(tmp); - mpz_clear(exp); - mpz_clear(a4); - mpz_clear(a2); - mpz_clear(n); - mpz_clear(q); - mpz_clear(z); - mpz_clear(qnr); - mpz_clear(x); - mpz_clear(y); - mpz_clear(b); - mpz_clear(pm1); - - return ret; -} - -/** - * @brief Square root modulo a the double of a given prime - * - * If sqrt(a) mod p is odd -> outputs sqrt(a) (mod 2p) - * Otherwise -> outputs sqrt(x) + p (mod 2p) - * - * @returns 1 if square root of a mod (2p) exists and was computed, 0 otherwise - * @param sqrt Output: Set to a square root of a mod (2p) if any exist - * @param a number of which a square root mod (2p) is searched - * @param p assumed prime - */ -int ibz_sqrt_mod_2p(ibz_t *sqrt, const ibz_t *a, const ibz_t *p) -{ - int ret = 1; - mpz_t sqrt_modp; - mpz_init(sqrt_modp); - - ret = ibz_sqrt_mod_p(&sqrt_modp, a, p); - if (ret == 0) - goto err; - - if (mpz_tstbit(*a, 0) != mpz_tstbit(sqrt_modp, 0)) - mpz_add(*sqrt, sqrt_modp, *p); - else - mpz_set(*sqrt, sqrt_modp); - - DEBUG_STR_FUN_3("ibz_sqrt_mod_2p", *sqrt, *a, *p); -err: - mpz_clear(sqrt_modp); - return ret; -} diff --git a/src/intbig/ref/generic/test/CMakeLists.txt b/src/intbig/ref/generic/test/CMakeLists.txt deleted file mode 100644 index 8103001..0000000 --- a/src/intbig/ref/generic/test/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -add_executable(sqisign_test_intbig test_intbig.c) -target_link_libraries(sqisign_test_intbig ${LIB_INTBIG} ${GMP} sqisign_common_sys) -target_include_directories(sqisign_test_intbig PRIVATE ../include ${INC_PUBLIC} ${INC_COMMON}) - -# MSAN and GMP lead to false positives, see -# https://gmplib.org/list-archives/gmp-bugs/2019-March/004529.html -if(NOT CMAKE_BUILD_TYPE STREQUAL "MSAN") - add_test(sqisign_test_intbig sqisign_test_intbig ${SQISIGN_TEST_REPS} 256) -endif() \ No newline at end of file diff --git a/src/intbig/ref/generic/test/test_intbig.c b/src/intbig/ref/generic/test/test_intbig.c deleted file mode 100644 index 06f639c..0000000 --- a/src/intbig/ref/generic/test/test_intbig.c +++ /dev/null @@ -1,551 +0,0 @@ -#include -#include -#include -#include -#include - -static int test_ibq_consts() { - int ret = 0; - ibq_t t; - ibz_t tmp1, tmp2, tmp3; - ibz_init(&tmp1); - ibz_init(&tmp2); - ibz_init(&tmp3); - ibq_init(&t); - - ibz_set(&tmp1, 123); - ibz_set(&tmp2, -123); - if (!ibq_set(&t, &tmp1, &tmp2)) { - ret = -1; - goto err; - } - - if (ibq_is_one(&t)) { - ret = -1; - goto err; - } - - if (!ibq_is_ibz(&t)) { - ret = -1; - goto err; - } - - if (!ibq_to_ibz(&tmp3, &t)) { - ret = -1; - goto err; - } - - if (ibz_is_one(&tmp3)) { - ret = -1; - goto err; - } - - ibz_set(&tmp2, 123); - if (!ibq_set(&t, &tmp1, &tmp2)) { - ret = -1; - goto err; - } - - if (!ibq_is_one(&t)) { - ret = -1; - goto err; - } - - if (!ibq_is_ibz(&t)) { - ret = -1; - goto err; - } - - if (!ibq_to_ibz(&tmp3, &t)) { - ret = -1; - goto err; - } - - if (!ibz_is_one(&tmp3)) { - ret = -1; - goto err; - } - - ibz_set(&tmp1, 0); - ibq_set(&t, &tmp1, &tmp2); - - if (!ibq_is_zero(&t)) { - ret = -1; - goto err; - } - - if (!ibq_is_ibz(&t)) { - ret = -1; - goto err; - } - - if (!ibq_to_ibz(&tmp3, &t)) { - ret = -1; - goto err; - } - - if (!ibz_is_zero(&tmp3)) { - ret = -1; - goto err; - } - -err: - ibq_finalize(&t); - ibz_finalize(&tmp1); - ibz_finalize(&tmp2); - ibz_finalize(&tmp3); - return ret; -} - -/** - * Tests ibz_sqrt_mod_p and ibz_sqrt_mod_2p - * Allows to provide the number of repetitions and the bit-size of the primes. -*/ -static int test_ibz_sqrt_mod_p_2p(int reps, int prime_n) { - gmp_randstate_t state; - gmp_randinit_mt(state); - gmp_randseed_ui(state, 1); // set static seed - - int ret = 0; - - // Initialize GMP variables - mpz_t prime, a, prime_minus_a, asq, sqrt, tmp; - mpz_t prime_p4m3, prime_p5m8, prime_p1m8; - mpz_t prime_p4m3_x2, prime_p5m8_x2, prime_p1m8_x2; - mpz_init(prime); - mpz_init(prime_p4m3); - mpz_init(prime_p5m8); - mpz_init(prime_p1m8); - mpz_init(prime_p4m3_x2); - mpz_init(prime_p5m8_x2); - mpz_init(prime_p1m8_x2); - mpz_init(a); - mpz_init(prime_minus_a); - mpz_init(asq); - mpz_init(sqrt); - mpz_init(tmp); - - // Generate random prime number - int n = prime_n; // Number of bits - - for (int r = 0; r < reps; ++r) { - mpz_urandomb(prime, state, n); - - int p4m3 = 0, p5m8 = 0, p1m8 = 0; - - while (p4m3 == 0 || p5m8 == 0 || p1m8 == 0) { - mpz_nextprime(prime, prime); - - if (mpz_mod_ui(tmp, prime, 4) == 3) { - mpz_set(prime_p4m3, prime); - p4m3 = 1; - } else if (mpz_mod_ui(tmp, prime, 8) == 5) { - mpz_set(prime_p5m8, prime); - p5m8 = 1; - } else if (mpz_mod_ui(tmp, prime, 8) == 1) { - mpz_set(prime_p1m8, prime); - p1m8 = 1; - } else { - printf("Should not happen..\n"); - ret = -1; - goto err; - } - } - - mpz_t *primes[] = { &prime_p4m3, &prime_p5m8, &prime_p1m8 }; - mpz_t *primes_x2[] = { &prime_p4m3_x2, &prime_p5m8_x2, &prime_p1m8_x2 }; - for (int i = 0; i < 3; ++i) // 2p - mpz_mul_2exp(*primes_x2[i], *primes[i], 1); - - // Test sqrt mod p - for (int i = 0; i < 3; ++i) { - mpz_urandomm(a, state, *primes[i]); - mpz_sub(prime_minus_a, *primes[i], a); - mpz_powm_ui(asq, a, 2, *primes[i]); - - int no_sqrt = !ibz_sqrt_mod_p(&sqrt, &asq, primes[i]); - mpz_powm_ui(tmp, sqrt, 2, *primes[i]); - - if (no_sqrt || (mpz_cmp(sqrt, a) && mpz_cmp(sqrt, prime_minus_a))) { - printf("Test sqrt_mod_p failed\n"); - gmp_printf("%Zx\n%Zx\n", sqrt, a); - ret = -1; - goto err; - } - } - - // Test sqrt mod 2p - for (int i = 0; i < 3; ++i) { - mpz_urandomm(a, state, *primes_x2[i]); - - mpz_sub(prime_minus_a, *primes_x2[i], a); - mpz_powm_ui(asq, a, 2, *primes_x2[i]); - - int no_sqrt = !ibz_sqrt_mod_2p(&sqrt, &asq, primes[i]); - mpz_powm_ui(tmp, sqrt, 2, *primes_x2[i]); - - if (no_sqrt || (mpz_cmp(sqrt, a) && mpz_cmp(sqrt, prime_minus_a))) { - printf("Test sqrt_mod_2p failed\n"); - gmp_printf("prime = %Zx\nprime_x2 = %Zx\nsqrt = %Zx\na = %Zx\na^2=%Zx\np - a = %Zx\n", *primes[i], *primes_x2[i], sqrt, a, asq, prime_minus_a); - ret = -1; - goto err; - } - } - } - -err: - gmp_randclear(state); - mpz_clear(prime); - mpz_clear(prime_p4m3); - mpz_clear(prime_p5m8); - mpz_clear(prime_p1m8); - mpz_clear(prime_p4m3_x2); - mpz_clear(prime_p5m8_x2); - mpz_clear(prime_p1m8_x2); - mpz_clear(a); - mpz_clear(prime_minus_a); - mpz_clear(asq); - mpz_clear(sqrt); - mpz_clear(tmp); - return ret; - -} - -/** - * Tests CRT -*/ -static int test_ibz_crt(int reps, int prime_n) { - gmp_randstate_t state; - gmp_randinit_mt(state); - gmp_randseed_ui(state, 1); // set static seed - - int ret = 0; - - // Initialize GMP variables - mpz_t prime1, prime2, prime1xprime2, crt, a, b, tst; - mpz_init(prime1); - mpz_init(prime2); - mpz_init(prime1xprime2); - mpz_init(crt); - mpz_init(a); - mpz_init(b); - mpz_init(tst); - - // Generate random prime number - int n = prime_n; // Number of bits - - for (int r = 0; r < reps; ++r) { - mpz_urandomb(prime1, state, n); - mpz_nextprime(prime1, prime1); - mpz_urandomm(a, state, prime1); - mpz_urandomb(prime2, state, n); - mpz_nextprime(prime2, prime2); - mpz_urandomm(b, state, prime2); - mpz_mul(prime1xprime2, prime1, prime2); - - ibz_crt(&crt, &a, &b, &prime1, &prime2); - mpz_mod(tst, crt, prime1); - if (mpz_cmp(tst, a)) { - ret = -1; - goto err; - } - mpz_mod(tst, crt, prime2); - if (mpz_cmp(tst, b)) { - ret = -1; - goto err; - } - mpz_mod(tst, crt, prime1xprime2); - if (mpz_cmp(tst, crt)) { - ret = -1; - goto err; - } - } - -err: - gmp_randclear(state); - mpz_clear(prime1); - mpz_clear(prime2); - mpz_clear(prime1xprime2); - mpz_clear(crt); - mpz_clear(a); - mpz_clear(b); - mpz_clear(tst); - return ret; -} - -static int test_ibz_constants() { - int ret = 0; - const ibz_t* zero = &ibz_const_zero; - const ibz_t* one = &ibz_const_one; - const ibz_t* two = &ibz_const_two; - - mpz_t tmp; - mpz_init(tmp); - mpz_add(tmp, *zero, *one); - mpz_add(tmp, tmp, *two); - - ret = (!mpz_cmp_ui(tmp, 3) ? 0 : -1); - - mpz_clear(tmp); - return ret; -} - -static int test_ibz_rand_interval(int reps) { - int ret = 0; - mpz_t low, high, rand; - mpz_init(low); - mpz_init(high); - mpz_init(rand); - mpz_set_str(low, "ffa", 16); - mpz_set_str(high, "eeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", 16); - - for (int i = 0; i < reps; ++i) { - ret = ibz_rand_interval(&rand, &low, &high); - if (ret != 1) { - ret = -1; - goto err; - } else { - ret = 0; - } - - if (mpz_cmp(rand, low) < 0 || mpz_cmp(rand, high) > 0) { - ret = -1; - gmp_printf("rand: %Zx\n", rand); - goto err; - } - } -err: - mpz_clear(low); - mpz_clear(high); - mpz_clear(rand); - return ret; -} - -static int test_ibz_rand_interval_i(int reps) { - int ret = 0; - int64_t low, high; - mpz_t rand; - mpz_init(rand); - - for (int i = 0; i < reps; ++i) { - randombytes((unsigned char *)&low, sizeof(int64_t)); - randombytes((unsigned char *)&high, sizeof(int64_t)); - if (low < 0) low = -low; - if (high < 0) high = -high; - if (low > high) { - int64_t tmp = low; - low = high; - high = tmp; - } - - ret = ibz_rand_interval_i(&rand, low, high); - if (ret != 1) { - ret = -1; - goto err; - } else { - ret = 0; - } - - if (mpz_cmp_si(rand, low) < 0 || mpz_cmp_si(rand, high) > 0) { - ret = -1; - gmp_printf("rand: %Zx\n", rand); - goto err; - } - - } - -err: - mpz_clear(rand); - return ret; -} - -static int test_ibz_rand_interval_minm_m(int reps) { - int ret = 0; - int64_t m; - mpz_t rand; - mpz_init(rand); - - for (int i = 0; i < reps; ++i) { - randombytes((unsigned char *)&m, sizeof(int64_t)); - if (m < 0) m = -m; - m >>= 1; // less than 64 bit - - if (m < 0) { - ret = -1; - goto err; - } - - ret = ibz_rand_interval_minm_m(&rand, m); - if (ret != 1) { - ret = -1; - goto err; - } else { - ret = 0; - } - - if (mpz_cmp_si(rand, -m) < 0 || mpz_cmp_si(rand, m) > 0) { - ret = -1; - gmp_printf("rand: %Zx\n", rand); - goto err; - } - } - -err: - mpz_clear(rand); - return ret; -} - -static int test_ibz_copy_digits() { - int ret = 0; - digit_t d1[] = { 0x12345678 }; - digit_t d2[] = { 2, 1 }; - - // TODO: test for other than 64 bit - const char d1str[] = "12345678"; - const char d2str[] = "10000000000000002"; - - char d1_intbig_str[80] = {0}; - char d2_intbig_str[80] = {0}; - - mpz_t d1_intbig, d2_intbig; - mpz_init(d1_intbig); - mpz_init(d2_intbig); - - ibz_copy_digits(&d1_intbig, d1, 1); - ibz_copy_digits(&d2_intbig, d2, 2); - - gmp_sprintf(d1_intbig_str, "%Zx", d1_intbig); - gmp_sprintf(d2_intbig_str, "%Zx", d2_intbig); - - if (memcmp(d1str, d1_intbig_str, 8)) { - ret = -1; - goto err; - } - if (memcmp(d2str, d2_intbig_str, 17)) { - ret = -1; - goto err; - } -err: - mpz_clear(d1_intbig); - mpz_clear(d2_intbig); - return ret; -} - -static int test_ibz_to_digits() { - int ret = 0; - mpz_t d1_intbig, d2_intbig, zero_intbig; - mpz_t d1_intbig_rec, d2_intbig_rec, zero_intbig_rec, cof, cof2; - const char d1str[] = "12345678"; - const char d2str[] = "10000000000000002"; - - mpz_init_set_str(d1_intbig, d1str, 16); - mpz_init_set_str(d2_intbig, d2str, 16); - mpz_init(zero_intbig); - - mpz_init(d1_intbig_rec); - mpz_init(d2_intbig_rec); - mpz_init(zero_intbig_rec); - mpz_init(cof); - mpz_init(cof2); - - size_t d1_digits = (mpz_sizeinbase(d1_intbig, 2) + sizeof(digit_t)*8 - 1) / (sizeof(digit_t)*8); - size_t d2_digits = (mpz_sizeinbase(d2_intbig, 2) + sizeof(digit_t)*8 - 1) / (sizeof(digit_t)*8); - - digit_t d1[d1_digits]; - digit_t d2[d2_digits]; - digit_t zero[1]; - - ibz_to_digits(d1, &d1_intbig); - ibz_to_digits(d2, &d2_intbig); - ibz_to_digits(zero, &zero_intbig); - - // A lazy test, but we know that this conversion should be correct from the previous test - - ibz_copy_digits(&d1_intbig_rec, d1, d1_digits); - ibz_copy_digits(&d2_intbig_rec, d2, d2_digits); - ibz_copy_digits(&zero_intbig_rec, zero, 1); - - if (mpz_cmp(d1_intbig, d1_intbig_rec) || mpz_cmp(zero_intbig, zero_intbig_rec)) { - ret = -1; - goto err; - } - - - digit_t p_cofactor_for_3g[5] = { 0x0000000000000000,0x74f9dace0d9ec800,0x63a25b437f655001,0x0000000000000019, 0 }; - digit_t p_cofactor_for_3g_rec[5] = { 0 }; - ibz_copy_digits(&cof, p_cofactor_for_3g, 5); - ibz_printf("cof: %Zx\n", cof); - ibz_to_digits(p_cofactor_for_3g_rec, &cof); - ibz_copy_digits(&cof2, p_cofactor_for_3g_rec, 5); - ibz_printf("cof2: %Zx\n", cof2); - - if (ibz_cmp(&cof, &cof2)) { - ret = -1; - goto err; - } - - digit_t da[2] = {0,0}; - - mpz_t strval, strval_check; - mpz_init(strval_check); - mpz_init_set_str(strval, "1617406613339667622221321", 10); - ibz_to_digits(da,&strval); - ibz_copy_digits(&strval_check, da, 2); - ibz_printf("strval: %Zd\nstrval_check: %Zd\n", strval, strval_check); - if (ibz_cmp(&strval, &strval_check)) { - ret = -1; - goto err; - } - -err: - mpz_clear(d1_intbig); - mpz_clear(d2_intbig); - mpz_clear(zero_intbig); - mpz_clear(d1_intbig_rec); - mpz_clear(d2_intbig_rec); - mpz_clear(zero_intbig_rec); - mpz_clear(cof); - mpz_clear(cof2); - mpz_clear(strval); - mpz_clear(strval_check); - return ret; -} - -int main(int argc, char *argv[]) { - int ret = 0; - if (argc < 3) { - printf("Please enter an integer argument for the number of repetitions, and one for the prime size in bits.\n"); - exit(1); - } - int reps = atoi(argv[1]); - int prime_n = atoi(argv[2]); - - ret = test_ibq_consts(); - if (ret) goto err; - - ret = test_ibz_sqrt_mod_p_2p(reps, prime_n); - if (ret) goto err; - - ret = test_ibz_crt(reps, prime_n); - if (ret) goto err; - - ret = test_ibz_constants(); - if (ret) goto err; - - ret = test_ibz_rand_interval(reps); - if (ret) goto err; - - ret = test_ibz_rand_interval_i(reps); - if (ret) goto err; - - ret = test_ibz_rand_interval_minm_m(reps); - if (ret) goto err; - - ret = test_ibz_copy_digits(); - if (ret) goto err; - - ret = test_ibz_to_digits(); - if (ret) goto err; -err: - return ret; -} diff --git a/src/klpt/ref/CMakeLists.txt b/src/klpt/ref/CMakeLists.txt deleted file mode 100644 index 1ab0814..0000000 --- a/src/klpt/ref/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -set(KLPTX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/klptx) - -include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/klpt/ref/include/klpt.h b/src/klpt/ref/include/klpt.h deleted file mode 100644 index 54a2c01..0000000 --- a/src/klpt/ref/include/klpt.h +++ /dev/null @@ -1,218 +0,0 @@ -/** @file - * - * @authors Antonin Leroux - * - * @brief The norm equation algorithms - */ - -#ifndef KLPT_H -#define KLPT_H - -#include -#include -#include -#include -#include -#include - - -/*************************** Functions *****************************/ - -/** @defgroup klpt_klpt Functions and types for KLPT - * @{ -*/ - -/** @defgroup klpt_extremals Init for extremal orders - * @{ -*/ -static inline int generate_random_prime(ibz_t *p , int is3mod4 ,int bitsize) { - int found = 0; - ibz_t two_pow,two_powp; - - ibz_init(&two_pow);ibz_init(&two_powp); - ibz_pow(&two_pow,&ibz_const_two,bitsize); - ibz_pow(&two_powp,&ibz_const_two,bitsize+1); - - int cnt = 0; - while (!found && cnt < KLPT_random_prime_attempts*bitsize) { - cnt ++ ; - ibz_rand_interval(p,&two_pow,&two_powp); - - found = ibz_probab_prime(p,30) && (!is3mod4 || (ibz_get(p)%4 == 3)) ; - } - ibz_finalize(&two_pow);ibz_finalize(&two_powp); - return found; - -} - - -void quat_alg_elem_copy(quat_alg_elem_t *copy,const quat_alg_elem_t *copied); -void quat_left_ideal_copy(quat_left_ideal_t *copy,const quat_left_ideal_t *copied); - - -/** - * @brief Representing an integer by the quadratic norm form of a maximal extremal order - * - * @param gamma Output: a quaternion element - * @param n_gamma Output : target norm of gamma (it is also an input, the final value will be a divisor of the initial value) - * @param Bpoo the quaternion algebra - * - * This algorithm finds a primitive quaternion element gamma of n_gamma inside the standard maximal extremal order - * Failure is possible - */ -int represent_integer(quat_alg_elem_t *gamma, ibz_t *n_gamma, const quat_alg_t *Bpoo); - -/** @} -*/ - -/** @defgroup klpt_equiv Finding equivalent left ideals - * @{ -*/ - -/** - * @brief Keygen random ideal - * @param ideal : Output : random ideal - * @param order : maximal extremal order - * @param Bpoo the quaternion algebra - * computes a keygen ideal - */ -int klpt_keygen_random_ideal(quat_left_ideal_t *ideal, const quat_p_extremal_maximal_order_t *order, const quat_alg_t *Bpoo); - -/** - * @brief Equivalent left ideal eichler randomized - * - * @param gen Output: generator of equiv - * @param n level of the eichler order - * @param lideal quaternion ideal - * @param Bpoo the quaternion algebra - * finds an ideal randomized in the class of eichler orders of level n - * assumes that n is prime - */ -void klpt_lideal_equiv_random_eichler(quat_alg_elem_t *gen, const ibz_t *n, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo); - -/** - * @brief Equivalent left ideal - * - * @param gen Output: generator of equiv - * @param n Output : norm of the equivalent ideal - * @param reduced the reduced basis for the ideal in input - * @param gram the gram matrix of the reduced basis - * @param lideal_norm the norm of the ideal represented by reduced basis - * @param denom integer, the denominator of the ideal - * @param Bpoo the quaternion algebra - * @return a bit indicating if the computation succeeded - * Assumes that the basis is reduced - * there is an equivalent ideal of norm n such that equiv_lideal = lideal * gen/Norm(lideal) - * this search is randomized and may fail - */ -int klpt_lideal_equiv(quat_alg_elem_t *gen, ibz_t *n, const ibz_mat_4x4_t *reduced, const ibz_mat_4x4_t *gram, const ibz_t *lideal_norm, const ibz_t *denom, const quat_alg_t *Bpoo); - - -/** @} -*/ - - -/** @defgroup klpt_klpt_general Finding equivalent left ideals of power of 2 norm - * @{ -*/ -/** - * @brief Equivalent left ideal of power of two norm - * - * @param gen Output: generator of equiv - * @param lideal left O0 ideal - * @param lideal_start left O0 ideal - * @param delta quaternion algebra element - * @param Bpoo the quaternion algebra - * - * Let J = lideal_start - * if K = intersect(lideal ,J) and I = conjugate (J) * K - * equiv_lideal is equivalent to the ideal I and we have the equality - * equiv_lideal = I * gen/Norm(lideal) of norm n = 2^KLPT_signing_length - * where conjugate(gen) lideal - * moreover we need that gen * delta is contained in the eichler order ZZ + J - * Assumes that the ideals lideal and lideal_start has a "good" norm (ie that one needs not to apply lideal_equiv) - * returns a bit indicating if the computation has succeeded - */ -int klpt_signing_klpt(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_left_ideal_t *lideal_start, const quat_alg_elem_t *delta, const quat_alg_t *Bpoo); - -/** - * @brief Equivalent left O0-ideal of power of two norm - * - * @param gen Output: generator of equiv - * @param lideal left O0 ideal - * @param Bpoo the quaternion algebra - * - * - * equiv_lideal is equivalent to the ideal lideal and we have the equality - * equiv_lideal = lideal * gen/Norm(lideal) of norm n = 2^KLPT_keygen_length - * where conjugate(gen) is in lideal - * Assumes that the ideals lideal has a "good" norm (ie that one needs not to apply lideal_equiv) - * returns a bit indicating if the computation has succeeded - */ -int klpt_keygen_klpt(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo); - - -/** @} -*/ - - -/** - * @brief Finding an endomorphism of smooth norm inside an eichler order - * - * @param beta Output: the endomorphism - * @param n_beta Output: the norm of beta - * @param gen Output: the generator of equivalent ideal - * @param n Output: the norm of the equivalent ideal - * @param lideal left O0 ideal - * @param gen_constraint generator of a left OR(lideal)-ideal, is contained inside OR(lideal) may be modified during the computation (division by some scalar) - * @param Bpoo the quaternion algebra - * - * Let I = lideal and K = O_R(I) < gen_constraint,2> - * Find beta of norm n_beta in OR(J) \ O (by design the norm of beta is odd) - * where J = I * gen /Norm(I) of norm n, a prime number - * and O is the embedding of ZZ + K inside OR(J) (induced by the isomorphism from OR(I) to OR(J)) - * returns a bit indicating if the computation succeeded - * in most cases beta will be contained in the order ZZ + J, but in some extreme cases (where we use another special extremal order) it might not be true. This does not change anything for the applications of eichler_special_norm. - */ -int klpt_eichler_special_norm(quat_alg_elem_t *beta, ibz_t *n_beta, quat_alg_elem_t *gen, ibz_t *n, quat_left_ideal_t *lideal, quat_alg_elem_t *gen_constraint, const quat_alg_t *Bpoo); - - -/** @} -*/ - -/** @} -*/ - - - -/** @ingroup klpt_klpt - * @defgroup klpt_tools Various tools for KLPT and norm equations - * @{ -*/ - -/** - * @brief Finding the good linear combination - * - * @param C Output: the linear combination - * @param beta the endomorphism - * @param order the order - * @param n the norm - * @param exp the exponent - * @param gen_start element of order, generate a left O-ideal of norm n = 2^exp - * @param gen_end element of order, generate a left O-ideal of norm n = 2^exp - * @param Bpoo quaternion algebra - * - * lideal_start = order - * lideal_end = order - * This algorithm finds two integers C[1], C[2] such that the pushforward of the ideal lideal_start by the endomorphism C[1] + C[2] beta is equal to lideal_end - * beta is an endomorphism of order - * Returns a bit indicating if the computation succeeded - */ -int klpt_find_linear_comb(ibz_vec_2_t *C,const quat_alg_elem_t *beta, const quat_order_t *order, const ibz_t *n, const unsigned short exp, const quat_alg_elem_t *gen_start, const quat_alg_elem_t *gen_end,const quat_alg_t *Bpoo); - - -/** @} -*/ - - -#endif diff --git a/src/klpt/ref/klptx/eichler.c b/src/klpt/ref/klptx/eichler.c deleted file mode 100644 index 0c741c6..0000000 --- a/src/klpt/ref/klptx/eichler.c +++ /dev/null @@ -1,735 +0,0 @@ -#include -#include "tools.h" - -/** @file - * - * @authors Antonin Leroux - * - * @brief the eichler norm equation implementation - */ - - -/** - * @brief Deciding if a given vector is suitable for the eichler norm algorithm - * - * @param mu Output: a quaternion algebra element - * @param C the vector to be tested - * @param params parameters - * - */ -int condition_eichler( quat_alg_elem_t *mu, const ibz_vec_2_t *C, const void* params) { - - // we start by casting myparams to the correct type - eichler_norm_param_t *eichler_norm_param = (eichler_norm_param_t*)params; - // var dec - int found = 0; - quat_alg_elem_t quat_temp; - quat_alg_coord_t coeffs; - ibz_t norm,rhs; - ibz_t temp; - ibq_t ibq_norm; - ibz_t a,b; - ibz_t ibz_q; - quat_left_ideal_t id1,id2; - - // var init - quat_alg_elem_init(&quat_temp); - quat_alg_coord_init(&coeffs); - ibz_init(&norm);ibz_init(&rhs); - ibz_init(&temp); - ibq_init(&ibq_norm); - ibz_init(&a);ibz_init(&b); - ibz_init(&ibz_q); - quat_left_ideal_init(&id1); - quat_left_ideal_init(&id2); - - ibz_set(&ibz_q,eichler_norm_param->order.q); - - // mu = j* ( C[0] + i * C[1]) - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&(*C)[0]); - ibz_copy(&coeffs[3],&(*C)[1]); - - - order_elem_create(mu,&eichler_norm_param->order,&coeffs,&eichler_norm_param->Bpoo); - - // for debug check that mu is in the correct order - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->right_order,mu,&eichler_norm_param->Bpoo)); - - // norm = n(mu) - quat_alg_norm(&ibq_norm,mu,&eichler_norm_param->Bpoo); - if (!ibq_to_ibz(&norm,&ibq_norm)) { - assert(0); - } - - #ifndef NDEBUG - ibz_mul(&rhs,&(*C)[0],&(*C)[0]); - ibz_set(&temp,eichler_norm_param->order.q); - ibz_mul(&temp,&temp,&(*C)[1]); - ibz_mul(&temp,&temp,&(*C)[1]); - ibz_add(&temp,&temp,&rhs); - ibz_mul(&temp,&temp,&eichler_norm_param->Bpoo.p); - assert(0==ibz_cmp(&temp,&norm)); - #endif - - // rhs = (target_norm - norm) / n² - ibz_sub(&rhs,&eichler_norm_param->target_norm,&norm); - ibz_mul(&temp,&eichler_norm_param->n,&eichler_norm_param->n); - ibz_div(&rhs,&temp,&rhs,&temp); - - - - // for debug check that the remainder is zero - assert(ibz_cmp(&temp,&ibz_const_zero)==0); - - // covers the case where we adjusted the norm of the target by 4, to help obtaining a primitive element - // will always happen when eichler_nom_param.order.q = 1 mod 4 - if (ibz_get(&eichler_norm_param->target_norm)%2==0) { - - // when eichler_nom_param.order.q = 3 mod 4, we make some adjustements to help obtaining a primitive element and - // make possible the resolution of the binary quadratic equation below - // in this first case we will find an element of the form 4 * M for some prime M - if (eichler_norm_param->order.q%8 == 3 && ibz_get(&rhs)%4 == 0) { - ibz_set(&temp,4); - ibz_div(&norm,&temp,&rhs,&temp); - assert(0==ibz_cmp(&temp,&ibz_const_zero)); - } - // in this first case we will find an element of the form 8 * M for some prime M - else if ((eichler_norm_param->order.q%8 == 7 && ibz_get(&rhs)%8 == 0)) { - ibz_set(&temp,8); - ibz_div(&norm,&temp,&rhs,&temp); - assert(0==ibz_cmp(&temp,&ibz_const_zero)); - } - else { - ibz_copy(&norm,&rhs); - } - assert(ibz_cmp(&norm,&ibz_const_zero)>=0); - - // TODUPDATE we can probably filter out some cases depending on the reduosiy - if ((eichler_norm_param->order.q == 1 && ibz_cornacchia_extended(&a, &b,&norm, SMALL_PRIMES_1MOD4 , sizeof(SMALL_PRIMES_1MOD4)/sizeof(*SMALL_PRIMES_1MOD4), KLPT_primality_num_iter, &PROD_SMALL_PRIMES_3MOD4)) - || (eichler_norm_param->order.q%4 == 1 && ibz_probab_prime(&norm,KLPT_primality_num_iter) && ibz_cornacchia_prime(&a,&b, &ibz_q, &norm)) - || (eichler_norm_param->order.q%8 == 3 && ibz_get(&rhs)%4 == 0 && ibz_probab_prime(&norm,KLPT_primality_num_iter) && ibz_cornacchia_special_prime(&a,&b,&ibz_q,&norm,2)) - || (eichler_norm_param->order.q%8 == 7 && ibz_get(&rhs)%8 ==0 && ibz_probab_prime(&norm,KLPT_primality_num_iter) && ibz_cornacchia_special_prime(&a,&b,&ibz_q,&norm,3)) - - ){ - - ibz_copy(&coeffs[2],&ibz_const_zero); - ibz_copy(&coeffs[3],&ibz_const_zero); - ibz_copy(&coeffs[0],&a); - ibz_copy(&coeffs[1],&b); - ibz_mul(&coeffs[0],&coeffs[0],&eichler_norm_param->n); - ibz_mul(&coeffs[1],&coeffs[1],&eichler_norm_param->n); - - // computing the final value of mu - // quat_temp = n * (a + i*b) - order_elem_create(&quat_temp,&eichler_norm_param->order,&coeffs,&eichler_norm_param->Bpoo); - - // mu = mu + quat_temp - quat_alg_add(mu,mu,&quat_temp); - - - #ifndef NDEBUG - // for debug we check check that the norm is indeed the target norm - quat_alg_norm(&ibq_norm,mu,&eichler_norm_param->Bpoo); - ibq_to_ibz(&norm,&ibq_norm); - assert(ibz_cmp(&norm,&eichler_norm_param->target_norm)==0); - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->order.order,mu,&eichler_norm_param->Bpoo)); - #endif - - // mu = mu / 2 and checking that the result in still in the order - ibz_mul(&mu->denom,&mu->denom,&ibz_const_two); - found = quat_lattice_contains(&coeffs,&eichler_norm_param->order.order,mu,&eichler_norm_param->Bpoo); - - } - } - - // this second case is only possible when q = 3 mod 4 - // here, we have not adjusted the target_norm, so it is odd - else { - // same as before, we differentiate several cases to enable the computation and boost the probability of finding a primitive element - // in particular, we will try to find a,b of the right norm such that a+ib/2 is in the maximal extremal order - if (eichler_norm_param->order.q%8 == 3 && ibz_get(&rhs)%2 != 0) { - ibz_copy(&norm,&rhs); - } - else if ((eichler_norm_param->order.q%8 == 3 && ibz_get(&rhs)%4 == 0)) { - ibz_set(&temp,4); - ibz_div(&norm,&temp,&rhs,&temp); - assert(0==ibz_cmp(&temp,&ibz_const_zero)); - } - else if ((eichler_norm_param->order.q%8 == 7 && ibz_get(&rhs)%4 == 2)) { - ibz_set(&temp,2); - ibz_div(&norm,&temp,&rhs,&temp); - assert(0==ibz_cmp(&temp,&ibz_const_zero)); - } - - // TODUPDATE we can probably filter out some cases depending on the reduosiy - if ((eichler_norm_param->order.q%8 == 3 && (ibz_get(&rhs)%2 != 0) && ibz_probab_prime(&norm,KLPT_primality_num_iter) && ibz_cornacchia_special_prime(&a,&b,&ibz_q,&norm,2)) - || (eichler_norm_param->order.q%8 == 3 && ibz_get(&rhs)%4 ==0 && ibz_probab_prime(&norm,KLPT_primality_num_iter) && ibz_cornacchia_special_prime(&a,&b,&ibz_q,&norm,4)) - || (eichler_norm_param->order.q%8 == 7 && ibz_get(&rhs)%4 ==2 && ibz_probab_prime(&norm,KLPT_primality_num_iter) && ibz_cornacchia_special_prime(&a,&b,&ibz_q,&norm,3)) - - ) { - ibz_copy(&coeffs[2],&ibz_const_zero); - ibz_copy(&coeffs[3],&ibz_const_zero); - ibz_copy(&coeffs[0],&a); - ibz_copy(&coeffs[1],&b); - ibz_mul(&coeffs[0],&coeffs[0],&eichler_norm_param->n); - ibz_mul(&coeffs[1],&coeffs[1],&eichler_norm_param->n); - - // computing the final value of mu - // quat_temp = n * (a + i*b) / 2 - order_elem_create(&quat_temp,&eichler_norm_param->order,&coeffs,&eichler_norm_param->Bpoo); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&ibz_const_two); - - - // debug testing that quat_temp is in the correct order - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->order.order,&quat_temp,&eichler_norm_param->Bpoo)); - - // mu = mu + quat_temp - quat_alg_add(mu,mu,&quat_temp); - - // debug testing that mu is in the correct order - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->order.order,mu,&eichler_norm_param->Bpoo)); - - #ifndef NDEBUG - // debug testing the norm - quat_alg_norm(&ibq_norm,mu,&eichler_norm_param->Bpoo); - ibq_to_ibz(&norm,&ibq_norm); - assert(ibz_cmp(&norm,&eichler_norm_param->target_norm)==0); - #endif - - found = 1; - - } - - } - if (found) { - - // for debug we check that the element is primitive and contained in the correct order - assert(quat_alg_is_primitive(mu,&eichler_norm_param->order.order,&eichler_norm_param->Bpoo)); - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->right_order,mu,&eichler_norm_param->Bpoo)); - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->order.order,mu,&eichler_norm_param->Bpoo)); - assert(quat_lattice_contains(&coeffs,&eichler_norm_param->right_order,&eichler_norm_param->gen_constraint,&eichler_norm_param->Bpoo)); - assert(quat_alg_is_primitive(&eichler_norm_param->gen_constraint,&eichler_norm_param->right_order,&eichler_norm_param->Bpoo)); - - // mu is in the extremal order, we only to verify the final condition - // computing the first ideal to compare id1 = order < gen_constraint , 2 > - quat_lideal_make_primitive_then_create(&id1,&eichler_norm_param->gen_constraint,&ibz_const_two,&eichler_norm_param->right_order,&eichler_norm_param->Bpoo); - - // computing the generator of the second ideal quat_temp = gen_constraint * conjugate( mu ) - quat_alg_conj(&quat_temp,mu); - quat_alg_mul(&quat_temp,&eichler_norm_param->gen_constraint,&quat_temp,&eichler_norm_param->Bpoo); - quat_alg_normalize(&quat_temp); - - // computing id2 = order < quat_temp ,2> - quat_lideal_make_primitive_then_create(&id2,&quat_temp,&ibz_const_two,&eichler_norm_param->right_order,&eichler_norm_param->Bpoo); - - // testing equality - found = !quat_lideal_equals(&id1,&id2,&eichler_norm_param->Bpoo); - - } - - - - // var finalize - quat_alg_elem_finalize(&quat_temp); - quat_alg_coord_finalize(&coeffs); - ibz_finalize(&norm);ibz_finalize(&rhs); - ibz_finalize(&temp); - ibq_finalize(&ibq_norm); - ibz_finalize(&a);ibz_finalize(&b); - ibz_finalize(&ibz_q); - quat_left_ideal_finalize(&id1); - quat_left_ideal_finalize(&id2); - - return found; -} - - -/** - * @brief Finding an endomorphism of smooth norm inside a fixed eichler order - * - * @param beta Output: the linear combination - * @param n_beta Output: the norm of bet and O = OR(J) and ideal_constraint = O < gen_constraint,2> - * Find beta of norm defined n_quat_C in OR(J) \ (ZZ + ideal_constraint) (by design the norm of beta is odd) - * gen_constraint is assumed to be primitive! - * assumes n is prime - * returns a bit indicating if the computation succeeded - */ -int eichler_special_norm_fixed(quat_alg_elem_t *beta,ibz_t *n_beta, const quat_p_extremal_maximal_order_t *order, const quat_alg_elem_t *gen, const ibz_t *n, quat_alg_elem_t *gen_constraint, const quat_alg_t *Bpoo) { - - // var dec - int cnt; - ibz_t nj; // norm of j - ibq_t temp_ibq; - ibz_t temp,lambda; - ibz_t n_quat_C; - int size_list; - quat_left_ideal_t lideal; - quat_alg_coord_t coeffs; - quat_alg_elem_t quat_1,quat_C,scal,quat_temp,mu; - ibz_vec_2_t C; // the linear combination - int is_divisible = 0; - int is_n_quat_C_square; - int log_margin; - int found; - int abort = 0; - eichler_norm_param_t param; - - // var init - found = 1; - cnt = 0; - ibz_init(&nj); - ibz_init(&n_quat_C); - ibz_t n_mu_list[KLPT_eichler_number_mu_norm]; - - ibz_init(&temp); - ibz_init(&lambda); - ibq_init(&temp_ibq); - quat_left_ideal_init(&lideal); - quat_alg_elem_init(&quat_1); - quat_alg_elem_init(&quat_C); - quat_alg_elem_init(&scal); - quat_alg_elem_init(&quat_temp); - quat_alg_elem_init(&mu); - quat_alg_coord_init(&coeffs); - ibz_vec_2_init(&C); - for (int ind=0;indp); - ibz_init(¶m.n); - ibz_init(¶m.target_norm); - quat_alg_elem_init(¶m.gen_constraint); - param.order = *order; - quat_order_init(¶m.right_order); - - //the quaternion element 1 - quat_alg_scalar(&quat_1,&ibz_const_one,&ibz_const_one); - - // computation the ideal lideal - quat_lideal_make_primitive_then_create(&lideal,gen,n,&order->order,Bpoo); - - // computation of the right order of lideal - quat_lideal_right_order(¶m.right_order,&lideal,Bpoo); - - - // removing the potential scalar factors of gen_constraint - // TODUPDATE optimize this to avoid doing it when unnecessary (using the trace ?) - quat_alg_make_primitive(&coeffs,&temp,gen_constraint,¶m.right_order,Bpoo); - ibz_mul(&gen_constraint->denom,&gen_constraint->denom,&temp); - quat_alg_normalize(gen_constraint); - - // copying to eichler norm param - quat_alg_elem_copy(¶m.gen_constraint,gen_constraint); - - // for debug, we check that gen_constraint is in the correct right order - assert(quat_lattice_contains(&coeffs,¶m.right_order,gen_constraint,Bpoo)); - assert(quat_alg_is_primitive(gen_constraint,¶m.right_order,Bpoo)); - - // computation of the linear combination - found = found && solve_combi_eichler(&C,order,&quat_1,&quat_1,&lideal,Bpoo,is_divisible); - assert(found); - - // compute quat_C = j * (C[0] + i * C[1]) - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&C[0]); - ibz_copy(&coeffs[3],&C[1]); - order_elem_create(&quat_C,order,&coeffs,Bpoo); - assert(quat_lattice_contains(&coeffs,¶m.right_order,&quat_C,Bpoo)); - - // computation of the norm of beta - quat_alg_norm(&temp_ibq,&quat_C,Bpoo); - if (!ibq_to_ibz(&n_quat_C,&temp_ibq)) { - assert(0); - } - - - ibz_mul(&lambda,&C[0],&C[0]); - ibz_set(&temp,order->q); - ibz_mul(&temp,&temp,&C[1]); - ibz_mul(&temp,&temp,&C[1]); - ibz_add(&temp,&temp,&lambda); - ibz_mul(&temp,&temp,&Bpoo->p); - assert(0==ibz_cmp(&temp,&n_quat_C)); - - // computation of the legendre symbol - is_n_quat_C_square = ibz_legendre(&n_quat_C,n); - - //computation of the log_margin = log (p) + 3 log(n) + KLPT_strong_approx_log_margin - log_margin = ibz_bitsize(&Bpoo->p) + 3* ibz_bitsize(n) + KLPT_eichler_strong_approx_log_margin; - - // computation of a list of possible values for n_mu - size_list = norm_list_computation(n_mu_list,KLPT_eichler_number_mu_norm,log_margin,n,is_n_quat_C_square); - - // if no suitable norm has been found we can abort directly - if (!size_list) { - abort = 1; - } - - if(!abort){ - found = 0; - - // strong_approximation loop - while (!found && cnt < size_list) { - - // computation of the value of lambda - ibz_invmod(&temp,&n_quat_C,n); - ibz_mul(&temp,&temp,&n_mu_list[cnt]); - ibz_mod(&temp,&temp,n); - found=ibz_sqrt_mod_p(&lambda,&temp,n); - assert(found); - - // if q = 1 mod 4 multiply lambda by 2 and the final norm by 4 - if (order->q%4 == 1) { - // if (1) { - ibz_mul(&temp,&n_mu_list[cnt],&ibz_const_two); - ibz_mul(&temp,&temp,&ibz_const_two); - ibz_mul(&lambda,&lambda,&ibz_const_two); - } - else { - ibz_copy(&temp,&n_mu_list[cnt]); - } - // preparation of the strong approx computation - // setting param - ibz_copy(¶m.target_norm,&temp); - ibz_copy(¶m.n,n); - - - // actual strong_approximation - found = strong_approximation(&mu,&temp,order,&C,&n_quat_C,&lambda,n,KLPT_eichler_number_strong_approx,condition_eichler,¶m,Bpoo); - if (!found && order->q%4==3) { - // if q =3 mod 4, we try again by multiplying the norm by 4 - ibz_mul(&temp,&n_mu_list[cnt],&ibz_const_two); - ibz_mul(&temp,&temp,&ibz_const_two); - ibz_mul(&lambda,&lambda,&ibz_const_two); - ibz_copy(¶m.target_norm,&temp); - found = strong_approximation(&mu,&temp,order,&C,&n_quat_C,&lambda,n,KLPT_eichler_number_strong_approx,condition_eichler,¶m,Bpoo); - - } - - if (found) { - // computing the final beta = mu - ibz_copy(&beta->coord[0],&mu.coord[0]); - ibz_copy(&beta->coord[1],&mu.coord[1]); - ibz_copy(&beta->coord[2],&mu.coord[2]); - ibz_copy(&beta->coord[3],&mu.coord[3]); - ibz_copy(&beta->denom,&mu.denom); - ibz_copy(n_beta,&n_mu_list[cnt]); - } - else { - // incrementing the counter - cnt++; - } - } - } else { - found = 0; - } - - // var finalize - ibz_finalize(&nj); - ibz_finalize(&n_quat_C); - quat_left_ideal_finalize(&lideal); - quat_alg_elem_finalize(&quat_1); - quat_alg_elem_finalize(&quat_C); - quat_alg_elem_finalize(&scal); - quat_alg_elem_finalize(&quat_temp); - ibz_finalize(&temp); - ibz_finalize(&lambda); - ibq_finalize(&temp_ibq); - quat_alg_elem_finalize(&mu); - quat_alg_coord_finalize(&coeffs); - ibz_vec_2_finalize(&C); - for (int ind=0;ind - * Find beta of norm n_beta in OR(J) \ O (by design the norm of beta is odd) - * where J = I * gen /Norm(I) of norm n, a prime number - * and O is the embedding of ZZ + K inside OR(J) (induced by the isomorphism from OR(I) to OR(J)) - * returns a bit indicating if the computation succeeded - * in most cases beta will be contained in the order ZZ + J, but in some extreme cases (where we use another special extremal order) it might not be true. This does not change anything for the applications of eichler_special_norm. - */ -int klpt_eichler_special_norm(quat_alg_elem_t *beta, ibz_t *n_beta, quat_alg_elem_t *gen, ibz_t *n, quat_left_ideal_t *lideal, quat_alg_elem_t *gen_constraint, const quat_alg_t *Bpoo) { - - // var declaration - int bitsize; - ibz_t mod2; - int found,found_equiv; - int cnt; - quat_alg_elem_t gen_lideal; - ibz_t n_lideal; - quat_left_ideal_t connecting_lideal; - quat_order_t right_order; - quat_alg_elem_t new_gen_constraint,quat_temp; - const quat_p_extremal_maximal_order_t *alternate_order = NULL; - ibz_mat_4x4_t reduced,gram; - quat_alg_coord_t coeffs; - - // var init - found = 0; found_equiv = 0; - cnt = 0; - ibz_init(&mod2); - ibz_init(&n_lideal); - quat_alg_elem_init(&gen_lideal); - quat_alg_elem_init(&new_gen_constraint); - quat_alg_elem_init(&quat_temp); - quat_left_ideal_init(&connecting_lideal); - quat_order_init(&right_order); - ibz_mat_4x4_init(&reduced); - ibz_mat_4x4_init(&gram); - quat_alg_coord_init(&coeffs); - - // we start by deciding if we can use J = I - // for that we try to see if the value of n(I) is small and odd - bitsize = ibz_bitsize(&lideal->norm); - if (ibz_get(&lideal->norm)%2 == 1 && bitsize < KLPT_eichler_smallnorm_bitsize ) { - // in that case, we should have enough room to find an output with J = I - // compute the generator and copy the norm - int lideal_generator_ok = quat_lideal_generator(gen,lideal,Bpoo,0); - assert(lideal_generator_ok); - ibz_copy(n,&lideal->norm); - found = eichler_special_norm_fixed(beta,n_beta,&STANDARD_EXTREMAL_ORDER,gen,n,gen_constraint,Bpoo); - - // we adjust the value of gen to match the requirement J = I * gen /Norm(I) of norm n with J = I - quat_alg_scalar(gen,n,&ibz_const_one); - found_equiv = 1; - - // if it failed we used alternate orders - if (!found ) { - - cnt = 0; - // we compute the right order of lideal - quat_lideal_right_order(&right_order,lideal,Bpoo); - - while ( !found && cnt < KLPT_eichler_num_equiv_ideal*NUM_ALTERNATE_EXTREMAL_ORDERS ) { - - if (cnt%KLPT_eichler_num_equiv_ideal == 0) { - // we initialize the alternate order and the other values - int index = cnt/KLPT_eichler_num_equiv_ideal; - - alternate_order = &ALTERNATE_EXTREMAL_ORDERS[index]; - - // fist we need to compute connecting_lideal = connecting_ideal ( right_order, alternate_order ) - quat_connecting_ideal(&connecting_lideal,&ALTERNATE_EXTREMAL_ORDERS[index].order,&right_order,Bpoo); - - // we reduce the basis and compute its gram matrix - // basis reduction step - quat_lideal_reduce_basis(&reduced,&gram,&connecting_lideal,Bpoo); - - } - cnt++; - - // we compute an equivalent ideal - found = klpt_lideal_equiv(&gen_lideal,&n_lideal,&reduced,&gram,&connecting_lideal.norm,&connecting_lideal.lattice.denom,Bpoo); - if (!found) { - continue; - } - - // filtering if the bitsize of n is too big - if (ibz_bitsize(&CHARACTERISTIC)+ 3*ibz_bitsize(&n_lideal) > 2*ibz_bitsize(&TORSION_ODD)) { - found = 0; - continue; - - } - // we adapt the value of gen_constraint to be contained inside the right order of equiv_lideal - // new_gen_constraint = ( conj(gen_lideal) / n(gen_lideal) ) * new_gen_constraint * gen_lideal - quat_alg_conj(&quat_temp,&gen_lideal); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&n_lideal); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&connecting_lideal.norm); - quat_alg_mul(&new_gen_constraint,&quat_temp,gen_constraint,Bpoo); - quat_alg_mul(&new_gen_constraint,&new_gen_constraint,&gen_lideal,Bpoo); - - // we try to solve the eichler norm equation - found = eichler_special_norm_fixed(beta,n_beta,alternate_order,&gen_lideal,&n_lideal,&new_gen_constraint,Bpoo); - - assert(!found || quat_lattice_contains(&coeffs,&alternate_order->order,beta,Bpoo)); - - } - - - if (found ) { - // we apply the isomorphism to embed beta into the correct order - - // first, we send beta to right_order - // beta = gen_lideal * beta * conj (gen_lideal) / n( gen_lideal ) - quat_alg_mul(beta,beta,&quat_temp,Bpoo); - quat_alg_mul(beta,&gen_lideal,beta,Bpoo); - assert(quat_lattice_contains(&coeffs,&right_order,beta,Bpoo)); - - // second, we send beta to the right order of the equivalent ideal generated by gen - // beta = conj ( gen ) / n ( gen ) * beta * gen - quat_alg_conj(&quat_temp,gen); - ibz_mul(&quat_temp.denom,&quat_temp.denom,n); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal->norm); - quat_alg_mul(beta,&quat_temp,beta,Bpoo); - quat_alg_mul(beta,beta,gen,Bpoo); - - } - } - } - else { - // in all other cases we try to run the eichler order norm equation for the standard extremal order first - // before trying alternates order - - // we compute a reduced basis and its gram matrix - quat_lideal_reduce_basis(&reduced,&gram,lideal,Bpoo); - - // we will try different ideals equivalent to lideal - while ( !found && cnt < KLPT_eichler_num_equiv_ideal ) { - - cnt++; - // we start by computing an equivalent ideal. - // equiv_lideal = lideal * gen/Norm(lideal) - // gen is contained in equiv_lideal and conj(lideal) - - found_equiv = klpt_lideal_equiv(gen,n,&reduced,&gram,&lideal->norm,&lideal->lattice.denom,Bpoo); - if (!found_equiv) { - found = 0; - continue; - } - - // filtering if the bitsize of n is too big - if (ibz_bitsize(&CHARACTERISTIC)+ 3*ibz_bitsize(n) > 2*ibz_bitsize(&TORSION_ODD)) { - found = 0; - continue; - } - - // we adapt the value of gen_constraint to be contained inside the right order of equiv_lideal - // new_gen_constraint = ( conj(gen) / n(gen) ) * gen_constraint * gen - quat_alg_conj(&new_gen_constraint,gen); - ibz_mul(&new_gen_constraint.denom,&new_gen_constraint.denom,n); - ibz_mul(&new_gen_constraint.denom,&new_gen_constraint.denom,&lideal->norm); - quat_alg_mul(&new_gen_constraint,&new_gen_constraint,gen_constraint,Bpoo); - quat_alg_mul(&new_gen_constraint,&new_gen_constraint,gen,Bpoo); - - - // we try to solve the eichler norm equation - found = eichler_special_norm_fixed(beta,n_beta,&STANDARD_EXTREMAL_ORDER,gen,n,&new_gen_constraint,Bpoo); - - } - - // then we try the same with but with an alternate special extremal orders - // we will need to find a connecting ideal and then try the same procedure with ideals equivalent to the connecting ideal - if (!found && found_equiv) { - - cnt = 0; - // we compute the right order of lideal - quat_lideal_right_order(&right_order,lideal,Bpoo); - - while ( !found && cnt < KLPT_eichler_num_equiv_ideal*NUM_ALTERNATE_EXTREMAL_ORDERS ) { - - if (cnt%KLPT_eichler_num_equiv_ideal == 0) { - // we initialize the alternate order and the other values - int index = cnt/KLPT_eichler_num_equiv_ideal; - - alternate_order = &ALTERNATE_EXTREMAL_ORDERS[index]; - - // fist we need to compute connecting_lideal = connecting_ideal ( right_order, alternate_order ) - quat_connecting_ideal(&connecting_lideal,&ALTERNATE_EXTREMAL_ORDERS[index].order,&right_order,Bpoo); - - // we reduce the basis and compute its gram matrix - // basis reduction step - quat_lideal_reduce_basis(&reduced,&gram,&connecting_lideal,Bpoo); - - } - cnt++; - - // we compute an equivalent ideal - found = klpt_lideal_equiv(&gen_lideal,&n_lideal,&reduced,&gram,&connecting_lideal.norm,&connecting_lideal.lattice.denom,Bpoo); - if (!found) { - continue; - } - - // filtering if the bitsize of n is too big - if ( ibz_bitsize(&CHARACTERISTIC)+ 3*ibz_bitsize(&n_lideal) > 2*ibz_bitsize(&TORSION_ODD)) { - found = 0; - continue; - - } - - // we adapt the value of gen_constraint to be contained inside the right order of equiv_lideal - // new_gen_constraint = ( conj(gen_lideal) / n(gen_lideal) ) * new_gen_constraint * gen_lideal - quat_alg_conj(&quat_temp,&gen_lideal); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&n_lideal); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&connecting_lideal.norm); - quat_alg_mul(&new_gen_constraint,&quat_temp,gen_constraint,Bpoo); - quat_alg_mul(&new_gen_constraint,&new_gen_constraint,&gen_lideal,Bpoo); - - // we try to solve the eichler norm equation - found = eichler_special_norm_fixed(beta,n_beta,alternate_order,&gen_lideal,&n_lideal,&new_gen_constraint,Bpoo); - - assert(!found || quat_lattice_contains(&coeffs,&alternate_order->order,beta,Bpoo)); - - } - - - if (found ) { - // we apply the isomorphism to embed beta into the correct order - - // first, we send beta to right_order - // beta = gen_lideal * beta * conj (gen_lideal) / n( gen_lideal ) - quat_alg_mul(beta,beta,&quat_temp,Bpoo); - quat_alg_mul(beta,&gen_lideal,beta,Bpoo); - assert(quat_lattice_contains(&coeffs,&right_order,beta,Bpoo)); - - // second, we send beta to the right order of the equivalent ideal generated by gen - // beta = conj ( gen ) / n ( gen ) * beta * gen - quat_alg_conj(&quat_temp,gen); - ibz_mul(&quat_temp.denom,&quat_temp.denom,n); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal->norm); - quat_alg_mul(beta,&quat_temp,beta,Bpoo); - quat_alg_mul(beta,beta,gen,Bpoo); - - } - - } - } - - - // var finalization - ibz_finalize(&mod2); - ibz_finalize(&n_lideal); - quat_alg_elem_finalize(&gen_lideal); - quat_alg_elem_finalize(&quat_temp); - quat_alg_elem_finalize(&new_gen_constraint); - quat_left_ideal_finalize(&connecting_lideal); - quat_order_finalize(&right_order); - ibz_mat_4x4_finalize(&reduced); - ibz_mat_4x4_finalize(&gram); - quat_alg_coord_finalize(&coeffs); - return found & found_equiv; -} diff --git a/src/klpt/ref/klptx/equiv.c b/src/klpt/ref/klptx/equiv.c deleted file mode 100644 index 20fa31a..0000000 --- a/src/klpt/ref/klptx/equiv.c +++ /dev/null @@ -1,249 +0,0 @@ -#include -#include "tools.h" - - -/** - * @brief Keygen random ideal - * @param ideal : Output : random ideal - * @param order : maximal extremal order - * @param Bpoo the quaternion algebra - * computes a keygen ideal - */ -int klpt_keygen_random_ideal(quat_left_ideal_t *ideal, const quat_p_extremal_maximal_order_t *order, const quat_alg_t *Bpoo) { - - int found; - ibz_t temp; - quat_alg_elem_t gamma;quat_alg_elem_t quat_temp; - quat_alg_coord_t coeffs; - ibz_t n; - - ibz_init(&temp);ibz_init(&n); - quat_alg_elem_init(&gamma);quat_alg_elem_init(&quat_temp); - quat_alg_coord_init(&coeffs); - - // we start by sampling the random norm n - generate_random_prime(&n,1,KLPT_secret_key_prime_size); - - // we start by sampling a random element of norm n 2^log(p) - ibz_pow(&temp,&ibz_const_two,2*ibz_bitsize(&CHARACTERISTIC)); - ibz_mul(&temp,&temp,&n); - found = represent_integer(&gamma,&temp,Bpoo); - if (!found) { - return 0; - } - // then we generate a random scalar - ibz_rand_interval(&temp,&ibz_const_zero,&n); - - // if temp != 0 then we set gamma = gamma * (temp + i) - if (0!=ibz_cmp(&temp,&ibz_const_zero)) { - ibz_copy(&coeffs[0],&temp); - ibz_copy(&coeffs[1],&ibz_const_one); - ibz_copy(&coeffs[2],&ibz_const_zero); - ibz_copy(&coeffs[3],&ibz_const_zero); - order_elem_create(&quat_temp,order,&coeffs,Bpoo); - quat_alg_mul(&gamma,&gamma,&quat_temp,Bpoo); - } - - // we compute the output ideal O0 - quat_lideal_create_from_primitive(ideal,&gamma,&n,&order->order,Bpoo); - - - ibz_finalize(&temp);ibz_finalize(&n); - quat_alg_elem_finalize(&gamma);quat_alg_elem_finalize(&quat_temp); - quat_alg_coord_finalize(&coeffs); - return found; -} - -/** - * @brief Equivalent left ideal eichler randomized - * - * @param gen Output: generator of equiv - * @param n level of the eichler order - * @param lideal quaternion ideal - * @param Bpoo the quaternion algebra - * finds an ideal randomized in the class of eichler orders of level n - * assumes that n is prime - */ -void klpt_lideal_equiv_random_eichler(quat_alg_elem_t *gen, const ibz_t *n, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo) { - - - // declaration of variables - int ctr = 0; - int check = 0; - int found = 0; - ibq_t ibq_norm; - ibz_t temp;ibz_t disc; - quat_alg_coord_t coeffs; - quat_alg_elem_t beta,quat_temp,gamma; - - // var init - quat_alg_coord_init(&coeffs); - ibz_init(&temp);ibz_init(&disc); - ibq_init(&ibq_norm); - quat_alg_elem_init(&beta); - quat_alg_elem_init(&gamma); - quat_alg_elem_init(&quat_temp); - - // the loop : we are looking for our nice element - // the number of tries is bounded - while (!found && ctr < KLPT_equiv_num_iter) { - ctr++; - // we select our linear combination at random - ibz_rand_interval_minm_m(&coeffs[0],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[1],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[2],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[3],KLPT_equiv_bound_coeff); - - // computation of the quaternion element - // as beta = \sum_{0 <= i <= 3 } coeffs[i] * bas[i] - ibz_mat_4x4_eval(&beta.coord,&lideal->parent_order->basis,&coeffs); - ibz_copy(&beta.denom,&lideal->parent_order->denom); - - - // now we need to check that n is inert in the quadratic order ZZ[beta] - // computing the discriminant n(beta) - 4*trace(beta)^2 - quat_alg_norm(&ibq_norm,&beta,Bpoo); - check = ibq_to_ibz(&disc,&ibq_norm); - assert(&check); - quat_alg_trace(&ibq_norm,&beta); - check = ibq_to_ibz(&temp,&ibq_norm); - assert(&check); - ibz_mul(&temp,&temp,&temp); - ibz_mul(&temp,&temp,&ibz_const_two); - ibz_mul(&temp,&temp,&ibz_const_two); - ibz_sub(&disc,&disc,&temp); - ibz_neg(&disc,&disc); - // testing that n is inert in ZZ[beta] - ibz_mod(&temp,&disc,n); - found = (0!=ibz_cmp(&temp,&ibz_const_zero)) && (-1 == ibz_legendre(&disc,n)); - - } - // we have found the nice element beta - // now we need to find the nice element in lideal - ctr = 0; - found = 0; - while (!found && ctr < KLPT_equiv_num_iter) { - ctr++; - // we select our linear combination at random - ibz_rand_interval_minm_m(&coeffs[0],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[1],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[2],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[3],KLPT_equiv_bound_coeff); - - // computation of the quaternion element - // as beta = \sum_{0 <= i <= 3 } coeffs[i] * bas[i] - ibz_mat_4x4_eval(&gamma.coord,&lideal->lattice.basis,&coeffs); - ibz_copy(&gamma.denom,&lideal->lattice.denom); - - - // now we need to check that n is coprime with norm of gamma - quat_alg_norm(&ibq_norm,&gamma,Bpoo); - ibq_to_ibz(&disc,&ibq_norm); - - ibz_gcd(&temp,&disc,n); - // testing that the norm is coprime to 2*n - found = (0==ibz_cmp(&temp,&ibz_const_one)); - } - - // now we can sample the random linear combination - ibz_rand_interval(&temp,&ibz_const_zero,n); - - // if temp != 0 then we compute gamma as (temp + beta) * gamma - if (0!=ibz_cmp(&temp,&ibz_const_zero)) { - quat_alg_scalar(&quat_temp,&temp,&ibz_const_one); - quat_alg_add(&beta,&beta,&quat_temp); - quat_alg_mul(&gamma,&beta,&gamma,Bpoo); - } - - // copying the result to gen - quat_alg_conj(gen,&gamma); - - - // freeing the variables - quat_alg_coord_finalize(&coeffs); - ibz_finalize(&temp);ibz_finalize(&disc); - ibq_finalize(&ibq_norm); - quat_alg_elem_finalize(&beta); - quat_alg_elem_finalize(&gamma); - quat_alg_elem_finalize(&quat_temp); -} - -/** - * @brief Equivalent left ideal - * - * @param gen Output: generator of equiv - * @param n Output : norm of the equivalent ideal - * @param reduced the reduced basis for the ideal in input - * @param gram the gram matrix of the reduced basis - * @param lideal_norm the norm of the ideal represented by reduced basis - * @param denom integer, the denominator of the ideal - * @param Bpoo the quaternion algebra - * @return a bit indicating if the computation succeeded - * Assumes that the basis is reduced - * there is an equivalent ideal of norm n such that equiv_lideal = lideal * gen/Norm(lideal) - * this search is randomized and may fail - */ -int klpt_lideal_equiv(quat_alg_elem_t *gen, ibz_t *n, const ibz_mat_4x4_t *reduced, const ibz_mat_4x4_t *gram, const ibz_t *lideal_norm, const ibz_t *denom, const quat_alg_t *Bpoo) { - - - // declaration of variables - int ctr = 0; - int found = 0; - ibz_t norm_v,remainder,quotient_norm_v,adjusted_norm; - quat_alg_coord_t coeffs; - - // var init - quat_alg_coord_init(&coeffs); - ibz_init(&norm_v); - ibz_init(&remainder); - ibz_init("ient_norm_v); - ibz_init(&adjusted_norm); - - // dividing by the denom to get the real norm from the gram matrix - ibz_mul(&adjusted_norm,lideal_norm,denom); - ibz_mul(&adjusted_norm,&adjusted_norm,denom); - - // the loop : we are looking for our nice element - // the number of tries is bounded - while (!found && ctr < KLPT_equiv_num_iter) { - ctr++; - // we select our linear combination at random - ibz_rand_interval_minm_m(&coeffs[0],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[1],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[2],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[3],KLPT_equiv_bound_coeff); - - //computation of the norm of the vector sampled - quat_qf_eval(&norm_v,gram,&coeffs); - - // compute the norm of the equivalent ideal - // can be improved by removing the power of two first and the odd part only if the trial division failed (this should always be called on an ideal of norm 2^x * N for some big prime N ) - ibz_div("ient_norm_v,&remainder,&norm_v,&adjusted_norm); - - // debug : check that the remainder is zero - assert(ibz_is_zero(&remainder)); - - // pseudo-primality test - if (ibz_probab_prime("ient_norm_v,KLPT_primality_num_iter)) { - // computes the generator using a matrix multiplication - ibz_mat_4x4_eval(&gen->coord,reduced,&coeffs); - - ibz_copy(&gen->denom,denom); - - quat_alg_conj(gen,gen); - ibz_copy(n,"ient_norm_v); - found = 1; break; - } - - - } - - // freeing the variables - ibz_finalize(&norm_v); - ibz_finalize(&remainder); - ibz_finalize("ient_norm_v); - ibz_finalize(&adjusted_norm); - quat_alg_coord_finalize(&coeffs); - - return found; -} diff --git a/src/klpt/ref/klptx/klpt.c b/src/klpt/ref/klptx/klpt.c deleted file mode 100644 index 93e26ca..0000000 --- a/src/klpt/ref/klptx/klpt.c +++ /dev/null @@ -1,634 +0,0 @@ -#include -#include "tools.h" - - -/** - * @brief Deciding if a given vector is suitable for the signing klpt algorithm - * - * we test that gamma * mu is primitive in the end - * @param mu Output: a quaternion algebra element - * @param C the vector to be tested - * @param params parameters - * - */ -int condition_signing_klpt(quat_alg_elem_t *mu, const ibz_vec_2_t *C, const void* params) { - // we start by casting params to the correct type - const signing_klpt_param_t *signing_klpt_param = params; - // var dec - int found; - quat_alg_elem_t quat_temp; - quat_alg_coord_t coeffs; - ibq_t ibq_norm; - ibz_t norm,rhs; - ibz_t temp; - ibz_t a,b; - ibz_t ibz_q; - - // var init - quat_alg_elem_init(&quat_temp); - quat_alg_coord_init(&coeffs); - ibq_init(&ibq_norm); - ibz_init(&norm);ibz_init(&rhs); - ibz_init(&temp); - ibz_init(&a);ibz_init(&b); - ibz_init(&ibz_q); - found = 0; - - - // mu = j* ( C[0] + i * C[1]) - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&(*C)[0]); - ibz_copy(&coeffs[3],&(*C)[1]); - order_elem_create(mu,signing_klpt_param->order,&coeffs,&signing_klpt_param->Bpoo); - - - - // norm = n(mu) - quat_alg_norm(&ibq_norm,mu,&signing_klpt_param->Bpoo); - found = ibq_to_ibz(&norm,&ibq_norm); - if (!found) { - assert(found); - } - - // rhs = (target_norm - norm) / n² - ibz_sub(&rhs,&signing_klpt_param->target_norm,&norm); - ibz_mul(&temp,&signing_klpt_param->n,&signing_klpt_param->n); - ibz_div(&rhs,&temp,&rhs,&temp); - - // for debug, we check that the remainder is zero - assert(ibz_cmp(&temp,&ibz_const_zero)==0); - - found = found && ibz_cornacchia_extended(&a, &b,&rhs,SMALL_PRIMES_1MOD4,sizeof(SMALL_PRIMES_1MOD4)/sizeof(*SMALL_PRIMES_1MOD4), KLPT_primality_num_iter, &PROD_SMALL_PRIMES_3MOD4); - - if (found) { - // computing the final value of mu - // quat_temp = a + i*b - ibz_copy(&coeffs[2],&ibz_const_zero); - ibz_copy(&coeffs[3],&ibz_const_zero); - ibz_copy(&coeffs[0],&a); - ibz_copy(&coeffs[1],&b); - ibz_mul(&coeffs[0],&coeffs[0],&signing_klpt_param->n); - ibz_mul(&coeffs[1],&coeffs[1],&signing_klpt_param->n); - order_elem_create(&quat_temp,signing_klpt_param->order,&coeffs,&signing_klpt_param->Bpoo); - - ibz_sub(&temp,&signing_klpt_param->target_norm,&norm); - quat_alg_norm(&ibq_norm,&quat_temp,&signing_klpt_param->Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_cmp(&norm,&temp)==0); - - // mu = mu + quat_temp - quat_alg_add(mu,mu,&quat_temp); - - #ifndef NDEBUG - // for debug, we check that the norm is indeed the target norm - quat_alg_norm(&ibq_norm,mu,&signing_klpt_param->Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_cmp(&norm,&signing_klpt_param->target_norm)==0); - #endif - - // mu = mu / 2 - ibz_mul(&mu->denom,&mu->denom,&ibz_const_two); - // trying if mu is contained in signing_klpt_param-> order - // if not is is useless to continue - found = quat_lattice_contains(&coeffs,&signing_klpt_param->order->order,mu,&signing_klpt_param->Bpoo); - - - - if (found) { - // mu is in the extremal order, we only need to verify that gamma * mu is primitive - quat_alg_mul(&quat_temp,&signing_klpt_param->gamma,mu,&signing_klpt_param->Bpoo); - found = quat_alg_is_primitive(&quat_temp,&signing_klpt_param->order->order,&signing_klpt_param->Bpoo); - - // verifying that gamma*mu*delta will also be primitive in the right order of ideal_start - quat_alg_mul(&quat_temp,&quat_temp,&signing_klpt_param->delta,&signing_klpt_param->Bpoo); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&signing_klpt_param->equiv_n); - quat_alg_trace(&ibq_norm,&quat_temp); - if(!ibq_to_ibz(&norm,&ibq_norm)) { - assert(0); - } - found = found && ibz_get(&norm)%2 != 0; - } - } - - if (found) { - quat_alg_norm(&ibq_norm,mu,&signing_klpt_param->Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - ibz_mul(&norm,&norm,&ibz_const_two); - ibz_mul(&norm,&norm,&ibz_const_two); - assert(ibz_cmp(&norm,&signing_klpt_param->target_norm)==0); - } - - // var finalize - quat_alg_elem_finalize(&quat_temp); - quat_alg_coord_finalize(&coeffs); - ibq_finalize(&ibq_norm); - ibz_finalize(&norm);ibz_finalize(&rhs); - ibz_finalize(&temp); - ibz_finalize(&a);ibz_finalize(&b); - ibz_finalize(&ibz_q); - - return found; -} - - - -/** - * @brief Deciding if a given vector is suitable for the signing klpt algorithm - * - * we test that gamma * mu is primitive in the end - * @param mu Output: a quaternion algebra element - * @param C the vector to be tested - * @param params parameters - * - */ -int condition_keygen_klpt(quat_alg_elem_t *mu, const ibz_vec_2_t *C, const void* params) { - // we start by casting params to the correct type - const signing_klpt_param_t *signing_klpt_param = params; - // var dec - int found; - quat_alg_elem_t quat_temp; - quat_alg_coord_t coeffs; - ibq_t ibq_norm; - ibz_t norm,rhs; - ibz_t temp; - ibz_t a,b; - ibz_t ibz_q; - - // var init - quat_alg_elem_init(&quat_temp); - quat_alg_coord_init(&coeffs); - ibq_init(&ibq_norm); - ibz_init(&norm);ibz_init(&rhs); - ibz_init(&temp); - ibz_init(&a);ibz_init(&b); - ibz_init(&ibz_q); - found = 0; - - - // mu = j* ( C[0] + i * C[1]) - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&(*C)[0]); - ibz_copy(&coeffs[3],&(*C)[1]); - order_elem_create(mu,signing_klpt_param->order,&coeffs,&signing_klpt_param->Bpoo); - - - - // norm = n(mu) - quat_alg_norm(&ibq_norm,mu,&signing_klpt_param->Bpoo); - found = ibq_to_ibz(&norm,&ibq_norm); - if (!found) { - assert(found); - } - - // rhs = (target_norm - norm) / n² - ibz_sub(&rhs,&signing_klpt_param->target_norm,&norm); - ibz_mul(&temp,&signing_klpt_param->n,&signing_klpt_param->n); - ibz_div(&rhs,&temp,&rhs,&temp); - - // for debug, we check that the remainder is zero - assert(ibz_cmp(&temp,&ibz_const_zero)==0); - - found = found && ibz_cornacchia_extended(&a, &b,&rhs,SMALL_PRIMES_1MOD4,sizeof(SMALL_PRIMES_1MOD4)/sizeof(*SMALL_PRIMES_1MOD4), KLPT_primality_num_iter, &PROD_SMALL_PRIMES_3MOD4); - - if (found) { - - // computing the final value of mu - // quat_temp = a + i*b - ibz_copy(&coeffs[2],&ibz_const_zero); - ibz_copy(&coeffs[3],&ibz_const_zero); - ibz_copy(&coeffs[0],&a); - ibz_copy(&coeffs[1],&b); - ibz_mul(&coeffs[0],&coeffs[0],&signing_klpt_param->n); - ibz_mul(&coeffs[1],&coeffs[1],&signing_klpt_param->n); - order_elem_create(&quat_temp,signing_klpt_param->order,&coeffs,&signing_klpt_param->Bpoo); - - ibz_sub(&temp,&signing_klpt_param->target_norm,&norm); - quat_alg_norm(&ibq_norm,&quat_temp,&signing_klpt_param->Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_cmp(&norm,&temp)==0); - - // mu = mu + quat_temp - quat_alg_add(mu,mu,&quat_temp); - - // for debug, we check that the norm is indeed the target norm - #ifndef NDEBUG - quat_alg_norm(&ibq_norm,mu,&signing_klpt_param->Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_cmp(&norm,&signing_klpt_param->target_norm)==0); - #endif - - // mu = mu / 2 - ibz_mul(&mu->denom,&mu->denom,&ibz_const_two); - - // trying if mu is contained in signing_klpt_param-> order - // if not is is useless to continue - found = quat_lattice_contains(&coeffs,&signing_klpt_param->order->order,mu,&signing_klpt_param->Bpoo); - - if (found) { - // mu is in the extremal order, we only need to verify that gamma * mu is primitive - quat_alg_mul(&quat_temp,&signing_klpt_param->gamma,mu,&signing_klpt_param->Bpoo); - found = quat_alg_is_primitive(&quat_temp,&signing_klpt_param->order->order,&signing_klpt_param->Bpoo); - } - - } - - - // var finalize - quat_alg_elem_finalize(&quat_temp); - quat_alg_coord_finalize(&coeffs); - ibq_finalize(&ibq_norm); - ibz_finalize(&norm);ibz_finalize(&rhs); - ibz_finalize(&temp); - ibz_finalize(&a);ibz_finalize(&b); - ibz_finalize(&ibz_q); - return found; -} - -/** - * @brief Equivalent left ideal of power of two norm - * - * @param gen Output: generator of equiv - * @param lideal left O0 ideal - * @param lideal_start left O0 ideal - * @param delta quaternion algebra element - * @param Bpoo the quaternion algebra - * - * Let J = lideal_start - * if K = intersect(lideal ,J) and I = conjugate (J) * K - * equiv_lideal is equivalent to the ideal I and we have the equality - * equiv_lideal = I * gen/Norm(lideal) of norm n = 2^KLPT_signing_klpt_length - * where conjugate(gen) lideal - * moreover we need that gen * delta is contained in the eichler order ZZ + J - * Assumes that the ideals lideal and lideal_start has a "good" norm (ie that one needs not to apply lideal_equiv) - * returns a bit indicating if the computation has succeeded - */ -int klpt_signing_klpt(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_left_ideal_t *lideal_start, const quat_alg_elem_t *delta, const quat_alg_t *Bpoo) { - - // var dec - int found; - int cnt; - int e0,e1,center; - ibz_t n_gamma,temp_rand,n_prod,n_mu,s1,s2; - ibq_t ibq_n_quat_C,ibq_n_quat_C_start; - ibz_t lambda,n_quat_C,n_quat_C_start; - quat_alg_elem_t gamma,quat_one,mu; - quat_alg_elem_t quat_C,quat_C_start; - ibz_vec_2_t C,C_start; - quat_alg_coord_t coeffs; - signing_klpt_param_t param; - - // var init - found = 0; - cnt = 0; - ibz_init(&n_gamma); - ibz_init(&n_mu); - ibz_init(&temp_rand); - ibz_init(&n_prod); - ibz_init(&lambda); - ibz_init(&s1);ibz_init(&s2); - ibz_init(&n_quat_C);ibz_init(&n_quat_C_start); - ibq_init(&ibq_n_quat_C);ibq_init(&ibq_n_quat_C_start); - ibz_vec_2_init(&C); - ibz_vec_2_init(&C_start); - quat_alg_elem_init(&mu); - quat_alg_elem_init(&gamma); - quat_alg_elem_init(&quat_one); - quat_alg_elem_init(&quat_C); - quat_alg_elem_init(&quat_C_start); - quat_alg_coord_init(&coeffs); - ibz_init(¶m.n); - ibz_init(¶m.equiv_n); - ibz_init(¶m.target_norm); - quat_alg_init_set(¶m.Bpoo,&Bpoo->p); - param.order = &STANDARD_EXTREMAL_ORDER; - - // quaternion element for 1 - quat_alg_scalar(&quat_one,&ibz_const_one,&ibz_const_one); - - // initializing the center of the sample interval as log(p) - log( n(lideal) ) + KLPT_gamma_exponent_center_shift - center = ibz_bitsize(&Bpoo->p) - ibz_bitsize(&lideal->norm) + KLPT_gamma_exponent_center_shift ; - - // the main loop, iterate until a solution is found or the bound is reached - while (!found && cnt < KLPT_signing_num_gamma_trial) { - // incrementing the counter - cnt++; - // we start by choosing the exponent of gamma at random inside some interval (depending on the choice of parameters this interval might actually be of size 1) - // sampling the exponent - ibz_rand_interval_i(&temp_rand,center - KLPT_gamma_exponent_interval_size, center + KLPT_gamma_exponent_interval_size); - - // computation of the norm - ibz_pow(&n_gamma,&ibz_const_two,ibz_get(&temp_rand)); - ibz_mul(&n_gamma,&n_gamma,&lideal->norm); - - // computing the value of gamma - found = represent_integer(&gamma,&n_gamma,Bpoo); - - if (!found ) { - assert(found); - } - else { - // computing the norm of the remaining part - ibz_pow(&temp_rand,&ibz_const_two,KLPT_signing_klpt_length); - ibz_mul(&temp_rand,&lideal->norm,&temp_rand); - ibz_div(&n_mu,&temp_rand,&temp_rand,&n_gamma); - - // computing the first linear combination mod n(lideal) - - found = solve_combi_eichler(&C,&STANDARD_EXTREMAL_ORDER,&gamma,&quat_one,lideal,Bpoo,1); - if (!found) { - assert(found); - } - // computing the element quat_C = j* (C[0] + i C[1]); - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&C[0]); - ibz_copy(&coeffs[3],&C[1]); - order_elem_create(&quat_C,&STANDARD_EXTREMAL_ORDER,&coeffs,Bpoo); - - // computing the norm n_quat_C of quat_C - quat_alg_norm(&ibq_n_quat_C,&quat_C,Bpoo); - found = ibq_to_ibz(&n_quat_C,&ibq_n_quat_C); - if (!found) { - assert(found); - } - - // check that the quadratic reduosity condition is verified - // n_mu / n_quat_C must be square mod lideal.norm - ibz_invmod(&temp_rand,&n_quat_C,&lideal->norm); - ibz_mul(&temp_rand,&n_mu,&temp_rand); - found = ibz_sqrt_mod_p(&s1,&temp_rand,&lideal->norm); - - if (found) { - // computing the second linear combination mod n(lideal_start) - found = solve_combi_eichler(&C_start,&STANDARD_EXTREMAL_ORDER,&gamma,delta,lideal_start,Bpoo,0); - - - // computing the element quat_C = j* (C[0] + i C[1]); - ibz_copy(&coeffs[2],&C_start[0]); - ibz_copy(&coeffs[3],&C_start[1]); - order_elem_create(&quat_C_start,&STANDARD_EXTREMAL_ORDER,&coeffs,Bpoo); - - // computing the norm n_quat_C of quat_C - quat_alg_norm(&ibq_n_quat_C_start,&quat_C_start,Bpoo); - found = ibq_to_ibz(&n_quat_C_start,&ibq_n_quat_C_start); - if (!found) { - assert(found); - } - - // checking the quadratic reduosity condition - // n_mu / n_quat_C_start must be square mod lideal_start.norm - ibz_invmod(&temp_rand,&n_quat_C_start,&lideal_start->norm); - ibz_mul(&temp_rand,&n_mu,&temp_rand); - found = ibz_sqrt_mod_p(&s2,&temp_rand,&lideal_start->norm); - if (found) { - // computationn of the product - ibz_mul(&n_prod,&lideal->norm,&lideal_start->norm); - - // computation of the value of lambda - ibz_crt(&lambda,&s1,&s2,&lideal->norm,&lideal_start->norm); - - // multiply lambda by 2 and the final norm by 4 - ibz_mul(&temp_rand,&n_mu,&ibz_const_two); - ibz_mul(&n_mu,&temp_rand,&ibz_const_two); - ibz_mul(&lambda,&lambda,&ibz_const_two); - - // replace C by CRT of C and C_start - ibz_crt(&C[0],&C[0],&C_start[0],&lideal->norm,&lideal_start->norm); - ibz_crt(&C[1],&C[1],&C_start[1],&lideal->norm,&lideal_start->norm); - - // computing the element quat_C = j* (C[0] + i C[1]); - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&C[0]); - ibz_copy(&coeffs[3],&C[1]); - order_elem_create(&quat_C,&STANDARD_EXTREMAL_ORDER,&coeffs,Bpoo); - - // computing the norm n_quat_C of quat_C - quat_alg_norm(&ibq_n_quat_C,&quat_C,Bpoo); - found = ibq_to_ibz(&n_quat_C,&ibq_n_quat_C); - if (!found) { - assert(found); - } - - // preparation of the strong approx computation - // setting param - ibz_copy(¶m.target_norm,&n_mu); - ibz_copy(¶m.n,&n_prod); - ibz_copy(¶m.equiv_n,&lideal->norm); - param.gamma = gamma; - param.delta = *delta; - - // computing the strong approximation - found = strong_approximation(&mu,&n_mu,&STANDARD_EXTREMAL_ORDER,&C,&n_quat_C,&lambda,&n_prod,KLPT_signing_number_strong_approx,condition_signing_klpt,¶m,Bpoo); - - if (found) { - - - - - quat_alg_norm(&ibq_n_quat_C,&mu,Bpoo); - assert( ibq_to_ibz(&n_quat_C,&ibq_n_quat_C)); - ibz_mul(&n_quat_C,&n_quat_C,&ibz_const_two); - ibz_mul(&n_quat_C,&n_quat_C,&ibz_const_two); - assert(0==ibz_cmp(&n_quat_C,&n_mu)); - - // computation of the final output gen = gamma * mu - quat_alg_mul(gen,&gamma,&mu,Bpoo); - - } - - - } - } - } - - } - - // var finalize - ibz_finalize(&n_gamma); - ibz_finalize(&temp_rand); - ibz_finalize(&n_prod); - ibz_finalize(&lambda); - ibz_finalize(&s1);ibz_finalize(&s2); - ibz_finalize(&n_quat_C);ibz_finalize(&n_quat_C_start); - ibq_finalize(&ibq_n_quat_C);ibq_finalize(&ibq_n_quat_C_start); - ibz_vec_2_finalize(&C); - ibz_vec_2_finalize(&C_start); - quat_alg_elem_finalize(&gamma); - quat_alg_elem_finalize(&quat_one); - quat_alg_elem_finalize(&mu); - ibz_finalize(&n_mu); - quat_alg_elem_finalize(&quat_C); - quat_alg_elem_finalize(&quat_C_start); - quat_alg_coord_finalize(&coeffs); - ibz_finalize(¶m.target_norm); - ibz_finalize(¶m.equiv_n); - ibz_finalize(¶m.n); - quat_alg_finalize(¶m.Bpoo); - - return found; - - -} - - -/** - * @brief Equivalent left O0-ideal of power of two norm - * - * @param gen Output: generator of equiv - * @param lideal left O0 ideal - * @param delta quaternion algebra element - * @param Bpoo the quaternion algebra - * - * - * equiv_lideal is equivalent to the ideal lideal and we have the equality - * equiv_lideal = lideal * gen/Norm(lideal) of norm n = 2^KLPT_keygen_length - * where conjugate(gen) is in lideal - * Assumes that the ideals lideal has a "good" norm (ie that one needs not to apply lideal_equiv) - * returns a bit indicating if the computation has succeeded - */ -int klpt_keygen_klpt(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo) { - // var dec - int found; - int cnt; - int e0,e1,center; - ibz_t n_gamma,temp_rand,n_prod,n_mu; - ibq_t ibq_n_quat_C; - ibz_t lambda,n_quat_C; - quat_alg_elem_t gamma,quat_one,mu; - quat_alg_elem_t quat_C; - ibz_vec_2_t C; - quat_alg_coord_t coeffs; - signing_klpt_param_t param; - - // var init - found = 0; - cnt = 0; - ibz_init(&n_gamma); - ibz_init(&n_mu); - ibz_init(&temp_rand); - ibz_init(&n_prod); - ibz_init(&lambda); - ibz_init(&n_quat_C); - ibq_init(&ibq_n_quat_C); - ibz_vec_2_init(&C); - quat_alg_elem_init(&mu); - quat_alg_elem_init(&gamma); - quat_alg_elem_init(&quat_one); - quat_alg_elem_init(&quat_C); - quat_alg_coord_init(&coeffs); - ibz_init(¶m.n); - ibz_init(¶m.target_norm); - quat_alg_init_set(¶m.Bpoo,&Bpoo->p); - param.order = &STANDARD_EXTREMAL_ORDER; - - // quaternion element for 1 - quat_alg_scalar(&quat_one,&ibz_const_one,&ibz_const_one); - - // initializing the center of the sample interval as log(p) - log( n(lideal) ) + KLPT_gamma_exponent_center_shift - center = ibz_bitsize(&Bpoo->p) - ibz_bitsize(&lideal->norm) + KLPT_gamma_exponent_center_shift; - - - // the main loop, iterate until a solution is found or the bound is reached - while (!found && cnt < KLPT_keygen_num_gamma_trial) { - // incrementing the counter - cnt++; - // we start by choosing the exponent of gamma at random inside some interval (depending on the choice of parameters this interval might actually be of size 1) - // sampling the exponent - ibz_rand_interval_i(&temp_rand,center - KLPT_gamma_exponent_interval_size, center + KLPT_gamma_exponent_interval_size); - - // computation of the norm - ibz_pow(&n_gamma,&ibz_const_two,ibz_get(&temp_rand)); - ibz_mul(&n_gamma,&n_gamma,&lideal->norm); - - // computing the value of gamma - found = represent_integer(&gamma,&n_gamma,Bpoo); - - if (found) { - // computing the norm of the remaining part - ibz_pow(&temp_rand,&ibz_const_two,KLPT_keygen_length); - ibz_mul(&temp_rand,&lideal->norm,&temp_rand); - ibz_div(&n_mu,&temp_rand,&temp_rand,&n_gamma); - - // computing the linear combination mod n(lideal) - - found = solve_combi_eichler(&C,&STANDARD_EXTREMAL_ORDER,&gamma,&quat_one,lideal,Bpoo,1); - if (!found) { - assert(found); - } - // computing the element quat_C = j* (C[0] + i C[1]); - ibz_copy(&coeffs[0],&ibz_const_zero); - ibz_copy(&coeffs[1],&ibz_const_zero); - ibz_copy(&coeffs[2],&C[0]); - ibz_copy(&coeffs[3],&C[1]); - order_elem_create(&quat_C,&STANDARD_EXTREMAL_ORDER,&coeffs,Bpoo); - - // computing the norm n_quat_C of quat_C - quat_alg_norm(&ibq_n_quat_C,&quat_C,Bpoo); - found = ibq_to_ibz(&n_quat_C,&ibq_n_quat_C); - if (!found) { - assert(found); - } - - // check that the quadratic reduosity condition is verified - // n_mu / n_quat_C must be square mod lideal.norm - ibz_invmod(&temp_rand,&n_quat_C,&lideal->norm); - ibz_mul(&temp_rand,&n_mu,&temp_rand); - found = ibz_sqrt_mod_p(&lambda,&temp_rand,&lideal->norm); - if (found) { - - - // multiply lambda by 2 and the final norm by 4 - ibz_mul(&temp_rand,&n_mu,&ibz_const_two); - ibz_mul(&n_mu,&temp_rand,&ibz_const_two); - ibz_mul(&lambda,&lambda,&ibz_const_two); - - // preparation of the strong approx computation - // setting param - ibz_copy(¶m.target_norm,&n_mu); - ibz_copy(¶m.n,&lideal->norm); - param.gamma = gamma; - - // computing the strong approximation - found = strong_approximation(&mu,&n_mu,&STANDARD_EXTREMAL_ORDER,&C,&n_quat_C,&lambda,&lideal->norm,KLPT_signing_number_strong_approx,condition_keygen_klpt,¶m,Bpoo); - - if (found) { - - quat_alg_norm(&ibq_n_quat_C,&mu,Bpoo); - assert( ibq_to_ibz(&n_quat_C,&ibq_n_quat_C)); - ibz_mul(&n_quat_C,&n_quat_C,&ibz_const_two); - ibz_mul(&n_quat_C,&n_quat_C,&ibz_const_two); - assert(0==ibz_cmp(&n_quat_C,&n_mu)); - - // computation of the final output gen = gamma * mu - quat_alg_mul(gen,&gamma,&mu,Bpoo); - } - - } - } - } - - // var finalize - ibz_finalize(&n_gamma); - ibz_finalize(&temp_rand); - ibz_finalize(&n_prod); - ibz_finalize(&lambda); - ibz_finalize(&n_quat_C); - ibq_finalize(&ibq_n_quat_C); - ibz_vec_2_finalize(&C); - quat_alg_elem_finalize(&gamma); - quat_alg_elem_finalize(&quat_one); - quat_alg_elem_finalize(&mu); - ibz_finalize(&n_mu); - quat_alg_elem_finalize(&quat_C); - quat_alg_coord_finalize(&coeffs); - - ibz_finalize(¶m.n); - ibz_finalize(¶m.target_norm); - quat_alg_finalize(¶m.Bpoo); - - return found; - -} diff --git a/src/klpt/ref/klptx/test/eichler.c b/src/klpt/ref/klptx/test/eichler.c deleted file mode 100644 index ecec659..0000000 --- a/src/klpt/ref/klptx/test/eichler.c +++ /dev/null @@ -1,335 +0,0 @@ -#include - -#include "klpt_tests.h" -#include "../eichler.c" - -int test_special_cornacchia(int index) { - int res; - ibz_t q; - ibz_t x,y,p; - ibz_init(&q); - ibz_init(&x);ibz_init(&y);ibz_init(&p); - int qq = ALTERNATE_EXTREMAL_ORDERS[index].q; - ibz_set(&q,qq); - - int exp = 128; - res = 0; - int adjust = 0; - if (qq%8 ==7) { - adjust =3; - } - else if (qq%8==3) { - adjust =2; - } - while (!res) { - generate_random_prime(&p,0,exp); - // ibz_printf("%Zd \n",p); - if (qq%4 ==3) { - res = ibz_cornacchia_special_prime(&x,&y,&q,&p,adjust); - } - else { - res= ibz_cornacchia_prime(&x,&y,&q,&p); - } - - } - - - ibz_finalize(&q); - ibz_finalize(&x);ibz_finalize(&y);ibz_finalize(&p); - return res; -} - -int klpt_test_eichler_special_norm() { - - int status; - int res; - ibz_t p,n,n_beta; - quat_alg_t Bpoo; - quat_left_ideal_t ideal; - quat_order_t right_order; - quat_alg_elem_t gen,beta,gen_constraint; - quat_alg_coord_t coeffs; - ibq_t ibq_norm; - ibz_t norm; - - ibz_init(&norm);ibq_init(&ibq_norm); - ibz_init(&p);ibz_init(&n);ibz_init(&n_beta); - ibz_copy(&p,&CHARACTERISTIC); - quat_alg_init_set(&Bpoo,&p); - quat_alg_elem_init(&gen); - quat_alg_elem_init(&beta); - quat_alg_elem_init(&gen_constraint); - quat_left_ideal_init(&ideal); - quat_alg_coord_init(&coeffs); - quat_order_init(&right_order); - - int exp = ibz_bitsize(&CHARACTERISTIC)/4; - quat_lideal_random_2e(&ideal,&STANDARD_EXTREMAL_ORDER.order,&Bpoo,exp,'6'); - quat_lideal_right_order(&right_order,&ideal,&Bpoo); - int found = 0; - while (!found) { - ibz_rand_interval_minm_m(&coeffs[0],20); - ibz_rand_interval_minm_m(&coeffs[1],20); - ibz_rand_interval_minm_m(&coeffs[2],20); - ibz_rand_interval_minm_m(&coeffs[3],20); - ibz_mat_4x4_eval(&gen_constraint.coord,&right_order.basis,&coeffs); - ibz_copy(&gen_constraint.denom,&right_order.denom); - - quat_alg_norm(&ibq_norm,&gen_constraint,&Bpoo); - status = ibq_to_ibz(&norm,&ibq_norm); - assert(status); - found = ibz_get(&norm)%4==2 && quat_alg_is_primitive(&gen_constraint,&right_order,&Bpoo); - } - - assert(quat_lattice_contains(&coeffs,&right_order,&gen_constraint,&Bpoo)); - - res = klpt_eichler_special_norm(&beta,&n_beta,&gen,&n,&ideal,&gen_constraint,&Bpoo); - assert(res); - - ibz_finalize(&norm);ibq_finalize(&ibq_norm); - ibz_finalize(&p);ibz_finalize(&n);ibz_finalize(&n_beta); - quat_alg_finalize(&Bpoo); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&beta); - quat_alg_elem_finalize(&gen_constraint); - quat_left_ideal_finalize(&ideal); - quat_alg_coord_finalize(&coeffs); - quat_order_finalize(&right_order); - - return res; -} - -int klpt_test_eichler_special_norm_fixed_standard() { - - int res; - int rep_found; - int status; - ibz_t p,n,pow2,n_beta,temp; - quat_alg_elem_t gen,gen_constraint,beta; - quat_alg_t Bpoo; - quat_alg_coord_t coeffs; - quat_left_ideal_t ideal; - quat_order_t right_order; - ibq_t ibq_norm;ibz_t norm; - - ibq_init(&ibq_norm);ibz_init(&norm); - quat_alg_coord_init(&coeffs); - ibz_init(&p);ibz_init(&n);ibz_init(&pow2);ibz_init(&n_beta);ibz_init(&temp); - quat_alg_elem_init(&gen); - quat_alg_elem_init(&gen_constraint); - quat_alg_elem_init(&beta); - quat_left_ideal_init(&ideal); - quat_order_init(&right_order); - - - int exp = 128; - int margin = 20; - - res = generate_random_prime(&p,1,2*exp); - quat_alg_init_set(&Bpoo,&p); - res = generate_random_prime(&n,1,exp); - - ibz_pow(&pow2,&ibz_const_two,2*exp+margin); - - ibz_mul(&temp,&n,&pow2); - rep_found = represent_integer(&gen,&temp,&Bpoo); - while (!rep_found) { - rep_found = represent_integer(&gen,&temp,&Bpoo); - } - - quat_lideal_make_primitive_then_create(&ideal,&gen,&n,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - quat_lideal_right_order(&right_order,&ideal,&Bpoo); - - int found = 0; - while (!found) { - ibz_rand_interval_minm_m(&coeffs[0],20); - ibz_rand_interval_minm_m(&coeffs[1],20); - ibz_rand_interval_minm_m(&coeffs[2],20); - ibz_rand_interval_minm_m(&coeffs[3],20); - ibz_mat_4x4_eval(&gen_constraint.coord,&right_order.basis,&coeffs); - ibz_copy(&gen_constraint.denom,&right_order.denom); - - quat_alg_norm(&ibq_norm,&gen_constraint,&Bpoo); - status = ibq_to_ibz(&norm,&ibq_norm); - assert(status); - - found = ibz_get(&norm)%4==2; - } - assert(quat_lattice_contains(&coeffs,&right_order,&gen_constraint,&Bpoo)); - assert(quat_lattice_contains(&coeffs,&right_order,&gen,&Bpoo)); - - - res = res && eichler_special_norm_fixed(&beta,&n_beta,&STANDARD_EXTREMAL_ORDER,&gen,&n,&gen_constraint,&Bpoo); - - quat_alg_norm(&ibq_norm,&beta,&Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_cmp(&n_beta,&norm)==0); - - res = res && quat_lattice_contains(&coeffs,&STANDARD_EXTREMAL_ORDER.order,&beta,&Bpoo); - res = res && quat_lattice_contains(&coeffs,&right_order,&beta,&Bpoo); - - ibq_finalize(&ibq_norm); - ibz_finalize(&norm); - quat_alg_coord_finalize(&coeffs); - ibz_finalize(&p);ibz_finalize(&n);ibz_finalize(&pow2);ibz_finalize(&n_beta);ibz_finalize(&temp); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&gen_constraint); - quat_alg_elem_finalize(&beta); - quat_left_ideal_finalize(&ideal); - quat_order_finalize(&right_order); - quat_alg_finalize(&Bpoo); - - return res; -} - -int klpt_test_eichler_special_norm_fixed_alternate(int index) { - - int status; - int res; - int rep_found; - ibz_t p,n,pow2,n_beta,temp; - quat_alg_elem_t gen,gen_constraint,beta; - ibz_mat_4x4_t reduced, gram; - quat_alg_t Bpoo; - quat_alg_coord_t coeffs; - quat_left_ideal_t start,equiv; - - ibq_t ibq_norm; - ibz_t norm; - ibq_init(&ibq_norm); - ibz_init(&norm); - quat_alg_coord_init(&coeffs); - ibz_init(&p);ibz_init(&n);ibz_init(&pow2);ibz_init(&n_beta);ibz_init(&temp); - quat_alg_elem_init(&gen); - quat_alg_elem_init(&gen_constraint); - quat_alg_elem_init(&beta); - quat_left_ideal_init(&start);quat_left_ideal_init(&equiv); - ibz_mat_4x4_init(&reduced); - ibz_mat_4x4_init(&gram); - int exp = 128; - int margin = 20; - - ibz_copy(&p,&CHARACTERISTIC); - quat_alg_init_set(&Bpoo,&p); - - const quat_p_extremal_maximal_order_t *order = &ALTERNATE_EXTREMAL_ORDERS[index]; - - quat_alg_norm(&ibq_norm,&order->i,&Bpoo); - - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_get(&norm)==ALTERNATE_EXTREMAL_ORDERS[index].q); - assert(quat_lattice_contains(&coeffs,&order->order,&order->i,&Bpoo)); - assert(quat_lattice_contains(&coeffs,&order->order,&order->j,&Bpoo)); - - - quat_lideal_random_2e(&start,&order->order,&Bpoo,2*exp,'8'); - int lideal_generator_ok = quat_lideal_generator(&gen,&start,&Bpoo,0); - assert(lideal_generator_ok); - - ibz_pow(&pow2,&ibz_const_two,2*exp); - quat_lideal_create_from_primitive(&start,&gen,&pow2,&order->order,&Bpoo); - - quat_lideal_reduce_basis(&reduced,&gram,&start,&Bpoo); - - - res = klpt_lideal_equiv(&gen,&n,&reduced,&gram,&start.norm,&start.lattice.denom,&Bpoo); - assert(res); - - - quat_lideal_create_from_primitive(&equiv,&gen,&n,&order->order,&Bpoo); - assert(quat_lideal_isom(&gen_constraint,&equiv,&start,&Bpoo)); - - if (order->q %4 == 3 ) { - ibz_copy(&coeffs[0],&ibz_const_one); - ibz_copy(&coeffs[1],&ibz_const_one); - ibz_copy(&coeffs[2],&ibz_const_zero); - ibz_copy(&coeffs[3],&ibz_const_zero); - order_elem_create(&beta,order,&coeffs,&Bpoo); - ibz_mul(&beta.denom,&beta.denom,&ibz_const_two); - assert(quat_lattice_contains(&coeffs,&order->order,&beta,&Bpoo)); - } - - - int found = 0; - quat_order_t right_order; - quat_order_init(&right_order); - - quat_lideal_right_order(&right_order,&equiv,&Bpoo); - while (!found) { - ibz_rand_interval_minm_m(&coeffs[0],20); - ibz_rand_interval_minm_m(&coeffs[1],20); - ibz_rand_interval_minm_m(&coeffs[2],20); - ibz_rand_interval_minm_m(&coeffs[3],20); - ibz_mat_4x4_eval(&gen_constraint.coord,&right_order.basis,&coeffs); - ibz_copy(&gen_constraint.denom,&right_order.denom); - - quat_alg_norm(&ibq_norm,&gen_constraint,&Bpoo); - status = ibq_to_ibz(&norm,&ibq_norm); - assert(status); - found = ibz_get(&norm)%4==2; - } - assert(quat_lattice_contains(&coeffs,&right_order,&gen_constraint,&Bpoo)); - assert(quat_lattice_contains(&coeffs,&right_order,&gen,&Bpoo)); - - res = res && eichler_special_norm_fixed(&beta,&n_beta,order,&gen,&n,&gen_constraint,&Bpoo); - if (!res ) { - printf("FAIL eichler norm for q = %" PRId64 " (this is expected) \n",order->q); - - } - else { - printf("SUCCESS eichler norm for q = %" PRId64 " \n",order->q); - quat_alg_norm(&ibq_norm,&beta,&Bpoo); - assert(ibq_to_ibz(&norm,&ibq_norm)); - assert(ibz_cmp(&n_beta,&norm)==0); - - res = res && quat_lattice_contains(&coeffs,&order->order,&beta,&Bpoo); - res = res && quat_lattice_contains(&coeffs,&right_order,&beta,&Bpoo); - } - - ibq_finalize(&ibq_norm); - ibz_finalize(&norm); - quat_alg_coord_finalize(&coeffs); - ibz_finalize(&p);ibz_finalize(&n);ibz_finalize(&pow2);ibz_finalize(&n_beta);ibz_finalize(&temp); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&gen_constraint); - quat_alg_elem_finalize(&beta); - quat_left_ideal_finalize(&start); quat_left_ideal_finalize(&equiv); - quat_order_finalize(&right_order); - quat_alg_finalize(&Bpoo); - ibz_mat_4x4_finalize(&reduced); - ibz_mat_4x4_finalize(&gram); - return res; -} - -int klpt_test_eichler() { - int res = 1; - printf("Running klpt tests for eichler norm \n \n"); - - for (int i =0; i<3;i++) { - res = res & klpt_test_eichler_special_norm_fixed_standard(); - } - - if (!res) { - printf("KLPT unit test special eichler norm fixed for standard order failed\n \n"); - } - for (int i =0; i -#include -#include -#include -#include "../tools.h" -#include -#include - -/** @internal - * @ingroup klpt_klpt - * @defgroup klpt_tests KLPT module test functions - * @{ - */ - -/** @brief Test for the tools of the KLPT module, covers the following functions : - * - * int represent_integer(quat_alg_elem_t *gamma, ibz_t *n_gamma, const quat_alg_t *Bpoo); - * int solve_combi_eichler(ibz_vec_2_t *C, const quat_p_extremal_maximal_order_t *order, const quat_alg_elem_t *gamma, const quat_alg_elem_t *delta, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo, int is_divisible); - * int klpt_find_linear_comb(ibz_vec_2_t *C,const quat_alg_elem_t *beta, const quat_order_t *order, const ibz_t *n, const unsigned short exp, const quat_alg_elem_t *gen_start, const quat_alg_elem_t *gen_end,const quat_alg_t *Bpoo); - * - */ -int klpt_test_tools(); - -/** @brief Test for the equiv of the KLPT module, covers the following functions : - * - * int klpt_lideal_equiv(quat_alg_elem_t *gen, ibz_t *n, const quat_lattice_t *reduced, const ibz_mat_4x4_t *gram, const ibz_t *lideal_norm, const quat_alg_t *Bpoo) - * - */ -int klpt_test_equiv(); - -int klpt_test_klpt(); - -int klpt_test_eichler(); - -/** @} - */ - -#endif diff --git a/src/klpt/ref/klptx/test/test_klpt.c b/src/klpt/ref/klptx/test/test_klpt.c deleted file mode 100644 index 4ce193f..0000000 --- a/src/klpt/ref/klptx/test/test_klpt.c +++ /dev/null @@ -1,23 +0,0 @@ - -#include "klpt_tests.h" - -// run all tests in module -int main(){ - int res = 1; - - randombytes_init((unsigned char *) "some", (unsigned char *) "string", 128); - - printf("\nRunning klpt module unit tests\n \n"); - - res = res & klpt_test_tools(); - res = res & klpt_test_equiv(); - res = res & klpt_test_eichler(); - res = res & klpt_test_klpt(); - if(!res){ - printf("\nSome tests failed!\n"); - } - else { - printf("All tests passed!\n"); - } - return(!res); -} diff --git a/src/klpt/ref/klptx/test/tools.c b/src/klpt/ref/klptx/test/tools.c deleted file mode 100644 index 97bed41..0000000 --- a/src/klpt/ref/klptx/test/tools.c +++ /dev/null @@ -1,514 +0,0 @@ -#include "klpt_tests.h" - - -int kltp_test_keygen_random_ideal() { - - int res; - - ibz_t n; - quat_left_ideal_t ideal; - ibz_init(&n); - quat_left_ideal_init(&ideal); - - res = klpt_keygen_random_ideal(&ideal,&STANDARD_EXTREMAL_ORDER,&QUATALG_PINFTY); - - ibz_finalize(&n); - quat_left_ideal_finalize(&ideal); - - return res; -} - -int klpt_test_lideal_generator_coprime() { - int found = 1; - ibz_t p,temp; - ibz_t M; - quat_alg_t Bpoo; - quat_alg_elem_t gamma; - quat_left_ideal_t id,id2; - - quat_alg_elem_init(&gamma); - ibz_init(&M); - ibz_init(&p); - ibz_init(&temp); - quat_left_ideal_init(&id); - quat_left_ideal_init(&id2); - - - - int exp = 128; - found = generate_random_prime(&p,1,2*exp); - quat_alg_init_set(&Bpoo,&p); - - found = found && (generate_random_prime(&M,1,exp)); - ibz_pow(&temp,&ibz_const_two,2*exp); - ibz_mul(&temp,&M,&temp); - - found = found && represent_integer(&gamma,&temp,&Bpoo); - assert(found); - - quat_lideal_make_primitive_then_create(&id,&gamma,&M,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - - found = found && quat_lideal_generator_coprime(&gamma,&id,&ibz_const_two,&Bpoo,0); - assert(found); - - assert(quat_alg_is_primitive(&gamma,&STANDARD_EXTREMAL_ORDER.order,&Bpoo)); - - quat_lideal_make_primitive_then_create(&id2,&gamma,&M,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - - assert(quat_lideal_equals(&id,&id2,&Bpoo)); - - quat_alg_elem_finalize(&gamma); - ibz_finalize(&M); - ibz_finalize(&p); - ibz_finalize(&temp); - quat_left_ideal_finalize(&id); - quat_left_ideal_finalize(&id2); - quat_alg_finalize(&Bpoo); - return found; - -} - -int klpt_test_lideal_isom (int index) { - - int res =1 ; - ibz_t p,n; - quat_alg_elem_t gen; - quat_alg_t Bpoo; - quat_left_ideal_t ideal,equiv; - quat_order_t right_order; - ibz_mat_4x4_t gram,reduced; - ibz_mat_4x4_init(&gram); - ibz_mat_4x4_init(&reduced); - ibz_init(&p);ibz_init(&n); - ibz_copy(&p,&CHARACTERISTIC); - quat_alg_init_set(&Bpoo,&p); - quat_left_ideal_init(&ideal);quat_left_ideal_init(&equiv); - const quat_p_extremal_maximal_order_t *alternate_order = &ALTERNATE_EXTREMAL_ORDERS[index]; - quat_alg_elem_init(&gen); - - - for (int i=0; i<2;i++) { - quat_connecting_ideal(&ideal,&STANDARD_EXTREMAL_ORDER.order,&alternate_order->order,&Bpoo); - quat_lideal_reduce_basis(&reduced,&gram,&ideal,&Bpoo); - klpt_lideal_equiv(&gen,&n,&reduced,&gram,&ideal.norm,&ideal.lattice.denom,&Bpoo); - - quat_lideal_make_primitive_then_create(&equiv,&gen,&n,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - - assert(quat_lideal_isom(&gen,&ideal,&equiv,&Bpoo)); - - quat_lideal_random_2e(&ideal,&alternate_order->order,&Bpoo,128,'8'); - - quat_lideal_reduce_basis(&reduced,&gram,&ideal,&Bpoo); - klpt_lideal_equiv(&gen,&n,&reduced,&gram,&ideal.norm,&ideal.lattice.denom,&Bpoo); - - quat_lideal_make_primitive_then_create(&equiv,&gen,&n,&alternate_order->order,&Bpoo); - - assert(quat_lideal_isom(&gen,&ideal,&equiv,&Bpoo)); - } - - ibz_mat_4x4_finalize(&gram); - ibz_mat_4x4_finalize(&reduced); - ibz_finalize(&p);ibz_finalize(&n); - quat_alg_finalize(&Bpoo); - quat_left_ideal_finalize(&ideal);quat_left_ideal_finalize(&equiv); - quat_alg_elem_finalize(&gen); - - return res; - -} - -int klpt_test_connecting_ideal(int index) { - int res; - - ibz_t p; - quat_alg_t Bpoo; - quat_left_ideal_t ideal,connect; - quat_order_t right_order; - ibz_init(&p); - ibz_copy(&p,&CHARACTERISTIC); - quat_alg_init_set(&Bpoo,&p); - quat_left_ideal_init(&ideal);quat_left_ideal_init(&connect); - quat_order_init(&right_order); - const quat_p_extremal_maximal_order_t *alternate_order = &ALTERNATE_EXTREMAL_ORDERS[index]; - - quat_lideal_random_2e(&ideal,&STANDARD_EXTREMAL_ORDER.order,&Bpoo,256,'8'); - - quat_lideal_right_order(&right_order,&ideal,&Bpoo); - - quat_connecting_ideal(&connect,&STANDARD_EXTREMAL_ORDER.order,&alternate_order->order,&Bpoo); - quat_connecting_ideal(&connect,&right_order,&alternate_order->order,&Bpoo); - - ibz_finalize(&p); - quat_alg_finalize(&Bpoo); - quat_left_ideal_finalize(&ideal);quat_left_ideal_finalize(&connect); - quat_order_finalize(&right_order); - - res = 1; - return res; -} - -int klpt_test_find_linear_comb() { - int status; - int found = 0; - quat_alg_t Bpoo; - ibz_t p,M,temp,temp2; - quat_order_t right_order; - quat_alg_elem_t beta,gen_start,gen_end,quat_temp; - quat_left_ideal_t ideal_two_start, ideal_two; - quat_left_ideal_t random_ideal; - ibz_vec_2_t C; - ibz_t ibz_two_exp; - ibq_t ibq_norm; - ibz_t norm; - quat_alg_coord_t coeffs; - - quat_alg_coord_init(&coeffs); - quat_order_init(&right_order); - quat_left_ideal_init(&random_ideal); - ibq_init(&ibq_norm); - ibz_init(&norm); - ibz_init(&p); - ibz_init(&M); - ibz_init(&temp);ibz_init(&temp2); - ibz_init(&ibz_two_exp); - ibz_vec_2_init(&C); - quat_alg_elem_init(&beta);quat_alg_elem_init(&gen_start); - quat_alg_elem_init(&gen_end);quat_alg_elem_init(&quat_temp); - quat_left_ideal_init(&ideal_two_start); - quat_left_ideal_init(&ideal_two); - - int found_rep; - int exp = 128; - int margin = 30; - - found = generate_random_prime(&p,1,2*exp); - quat_alg_init_set(&Bpoo,&p); - - found = found && (generate_random_prime(&M,1,exp+margin)); - found = found && (generate_random_prime(&temp,1,exp+margin)); - assert(found); - ibz_mul(&temp,&M,&temp); - ibz_copy(&temp2,&temp); - - - found_rep = represent_integer(&beta,&temp2,&Bpoo); - while (!found_rep) { - found_rep = represent_integer(&beta,&temp2,&Bpoo); - - } - ibz_pow(&ibz_two_exp,&ibz_const_two,exp); - ibz_mul(&temp,&M,&ibz_two_exp); - ibz_copy(&temp2,&temp); - found_rep = represent_integer(&gen_start,&temp,&Bpoo); - while (!found_rep && quat_alg_is_primitive(&gen_start,&STANDARD_EXTREMAL_ORDER.order,&Bpoo)) { - found_rep = represent_integer(&gen_start,&temp2,&Bpoo); - } - quat_lideal_make_primitive_then_create(&ideal_two_start,&gen_start,&ibz_const_two,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - - quat_alg_conj(&gen_end,&beta); - quat_alg_mul(&gen_end,&gen_start,&gen_end,&Bpoo); - - - quat_lideal_make_primitive_then_create(&ideal_two,&gen_end,&ibz_const_two,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - quat_alg_norm(&ibq_norm,&beta,&Bpoo); - - status = ibq_to_ibz(&norm,&ibq_norm); - assert(status); - - while (!quat_lideal_equals(&ideal_two,&ideal_two_start,&Bpoo)) { - - found_rep = represent_integer(&beta,&norm,&Bpoo); - while (!found_rep) { - found_rep = represent_integer(&beta,&norm,&Bpoo); - } - - ibz_copy(&temp2,&temp); - found_rep = represent_integer(&gen_start,&temp2,&Bpoo); - while (!found_rep && quat_alg_is_primitive(&gen_start,&STANDARD_EXTREMAL_ORDER.order,&Bpoo)) { - found_rep = represent_integer(&gen_start,&temp2,&Bpoo); - } - // quat_alg_elem_print(&gen_start); - quat_lideal_make_primitive_then_create(&ideal_two_start,&gen_start,&ibz_const_two,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - - quat_alg_conj(&gen_end,&beta); - quat_alg_mul(&gen_end,&gen_start,&gen_end,&Bpoo); - - - quat_lideal_make_primitive_then_create(&ideal_two,&gen_end,&ibz_const_two,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - } - - quat_lideal_create_from_primitive(&random_ideal,&beta,&M,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - quat_lideal_right_order(&right_order,&random_ideal,&Bpoo); - - assert(quat_lattice_contains(&coeffs,&right_order,&beta,&Bpoo)); - - quat_lideal_random_2e(&ideal_two_start,&right_order,&Bpoo,exp,'8'); - - quat_lideal_random_2e(&ideal_two,&right_order,&Bpoo,exp,'8'); - assert(!quat_lideal_equals(&ideal_two_start,&ideal_two,&Bpoo)); - - found = found && quat_lideal_generator(&gen_start,&ideal_two_start,&Bpoo,0); - assert(found); - found = found && quat_lideal_generator(&gen_end,&ideal_two,&Bpoo,0); - assert(found); - assert(!quat_lattice_contains(&coeffs,&ideal_two.lattice,&gen_start,&Bpoo)); - - quat_alg_conj(&quat_temp,&beta); - quat_alg_mul(&quat_temp,&gen_start,&quat_temp,&Bpoo); - assert(!quat_lattice_contains(&coeffs,&ideal_two_start.lattice,&quat_temp,&Bpoo)); - - found = found && klpt_find_linear_comb(&C,&beta,&right_order,&ibz_two_exp,(unsigned short)exp,&gen_start,&gen_end,&Bpoo); - - - assert(found); - assert(ibz_get(&C[0])%2 !=0 || ibz_get(&C[1])%2 != 0); - - quat_left_ideal_t ideal_test; - quat_left_ideal_init(&ideal_test); - quat_alg_scalar(&quat_temp,&C[1],&ibz_const_one); - quat_alg_conj(&gen_end,&beta); - quat_alg_mul(&gen_end,&quat_temp,&gen_end,&Bpoo); - quat_alg_scalar(&quat_temp,&C[0],&ibz_const_one); - quat_alg_add(&gen_end,&gen_end,&quat_temp); - quat_alg_mul(&gen_end,&gen_start,&gen_end,&Bpoo); - assert(quat_lattice_contains(&coeffs,&ideal_two.lattice,&gen_end,&Bpoo)); - - quat_alg_finalize(&Bpoo); - quat_left_ideal_finalize(&ideal_test); - quat_alg_coord_finalize(&coeffs); - quat_order_finalize(&right_order); - quat_left_ideal_finalize(&random_ideal); - ibq_finalize(&ibq_norm); - ibz_finalize(&norm); - ibz_finalize(&p); - ibz_finalize(&M); - ibz_finalize(&temp);ibz_finalize(&temp2); - ibz_finalize(&ibz_two_exp); - ibz_vec_2_finalize(&C); - quat_alg_elem_finalize(&beta);quat_alg_elem_finalize(&gen_start); - quat_alg_elem_finalize(&gen_end);quat_alg_elem_finalize(&quat_temp); - quat_left_ideal_finalize(&ideal_two_start); - quat_left_ideal_finalize(&ideal_two); - - return found; -} - -int klpt_test_solve_combi_eichler() { - int found = 0; - quat_alg_t Bpoo; - ibz_t p,M,temp; - quat_alg_elem_t gamma1,gamma2,delta,quat_res; - ibz_vec_2_t C; - quat_left_ideal_t lideal; - quat_alg_coord_t t1,t2; - quat_order_t right_order; - quat_alg_elem_t shift_gamma,quat_one; - ibq_t ibq_norm;ibz_t norm; - - ibq_init(&ibq_norm); - ibz_init(&norm); - ibz_init(&p); - ibz_init(&M); - ibz_init(&temp); - quat_alg_elem_init(&gamma1); quat_alg_elem_init(&gamma2);quat_alg_elem_init(&delta);quat_alg_elem_init(&quat_res); - ibz_vec_2_init(&C); - quat_left_ideal_init(&lideal); - quat_alg_coord_init(&t1);quat_alg_coord_init(&t2); - quat_order_init(&right_order); - quat_alg_elem_init(&shift_gamma);quat_alg_elem_init(&quat_one); - - quat_alg_scalar(&quat_one,&ibz_const_one,&ibz_const_one); - - int exp = 128; - - int found_rep = 1; - - found = generate_random_prime(&p,1,2*exp); - quat_alg_init_set(&Bpoo,&p); - - found_rep = (generate_random_prime(&M,1,exp)); - found_rep = (generate_random_prime(&temp,1,exp+100)); - ibz_mul(&temp,&M,&temp); - found = found && represent_integer(&gamma1,&temp,&Bpoo); - ibz_pow(&temp,&ibz_const_two,exp+100); - ibz_mul(&temp,&M,&temp); - found_rep = represent_integer(&gamma2,&temp,&Bpoo); - while (!found_rep) { - found_rep = represent_integer(&gamma2,&temp,&Bpoo); - } - - ibz_pow(&temp,&ibz_const_two,3*exp); - - found_rep = represent_integer(&shift_gamma,&temp,&Bpoo); - while (!found_rep) { - represent_integer(&shift_gamma,&temp,&Bpoo); - } - found_rep = represent_integer(&delta,&temp,&Bpoo); - while (!found_rep) { - found_rep = represent_integer(&delta,&temp,&Bpoo); - } - - quat_lideal_make_primitive_then_create(&lideal,&gamma1,&M,&STANDARD_EXTREMAL_ORDER.order,&Bpoo); - - found = found && (ibz_cmp(&M,&lideal.norm)==0); - - quat_lideal_right_order(&right_order,&lideal,&Bpoo); - - found = found && solve_combi_eichler(&C,&STANDARD_EXTREMAL_ORDER,&shift_gamma,&delta,&lideal,&Bpoo,0); - if (!found) { - printf("eichler solve failed \n"); - } - ibz_copy(&t1[0],&ibz_const_zero);ibz_copy(&t1[1],&ibz_const_zero); - ibz_copy(&t1[2],&C[0]);ibz_copy(&t1[3],&C[1]); - - order_elem_create(&quat_res,&STANDARD_EXTREMAL_ORDER,&t1,&Bpoo); - quat_alg_mul(&quat_res,&shift_gamma,&quat_res,&Bpoo); - quat_alg_mul(&quat_res,&quat_res,&delta,&Bpoo); - - found = found && quat_lattice_contains(&t2,&right_order,&quat_res,&Bpoo); - if (!found) { - printf("the solution is not in the eichler order \n"); - } - found = found && !quat_lattice_contains(&t2,&lideal.lattice,&quat_res,&Bpoo); - if (!found) { - printf("the solution is in the lattice \n"); - } - - - found = found && solve_combi_eichler(&C,&STANDARD_EXTREMAL_ORDER,&gamma2,&quat_one,&lideal,&Bpoo,1); - if (!found ){ - printf("the second solve combi failed \n"); - } - - ibz_copy(&t1[2],&C[0]);ibz_copy(&t1[3],&C[1]); - - order_elem_create(&quat_res,&STANDARD_EXTREMAL_ORDER,&t1,&Bpoo); - quat_alg_mul(&quat_res,&gamma2,&quat_res,&Bpoo); - quat_alg_mul(&quat_res,&quat_res,&quat_one,&Bpoo); - - - found = found && quat_lattice_contains(&t2,&lideal.lattice,&quat_res,&Bpoo); - - ibq_finalize(&ibq_norm); - ibz_finalize(&norm); - ibz_finalize(&p); - ibz_finalize(&M); - ibz_finalize(&temp); - quat_alg_elem_finalize(&gamma1); quat_alg_elem_finalize(&gamma2);quat_alg_elem_finalize(&delta);quat_alg_elem_finalize(&quat_res); - ibz_vec_2_finalize(&C); - quat_left_ideal_finalize(&lideal); - quat_alg_coord_finalize(&t1);quat_alg_coord_finalize(&t2); - quat_order_finalize(&right_order); - quat_alg_elem_finalize(&shift_gamma);quat_alg_elem_finalize(&quat_one); - quat_alg_finalize(&Bpoo); - - - return found; -} - -int klpt_test_represent_integer() { - int found = 0; - ibz_t p,temp; - ibz_t M,M_begin; - quat_alg_t Bpoo; - quat_alg_elem_t gamma; - - quat_alg_elem_init(&gamma); - ibz_init(&M);ibz_init(&M_begin); - ibz_init(&p); - ibz_init(&temp); - - - int exp = 128; - found = generate_random_prime(&p,1,2*exp); - quat_alg_init_set(&Bpoo,&p); - - found = found && (generate_random_prime(&M,1,exp)); - ibz_pow(&temp,&ibz_const_two,exp+15); - ibz_mul(&M,&M,&temp); - ibz_copy(&M_begin,&M); - - - - found = found && represent_integer(&gamma,&M,&Bpoo); - if (!found) { - printf("repesent integer did not find anything \n"); - } - - ibq_t norm; - ibq_init(&norm); - ibz_t ibz_norm; - ibz_init(&ibz_norm); - quat_alg_norm(&norm,&gamma,&Bpoo); - - - found = found && ibq_to_ibz(&ibz_norm,&norm); - - found = found && (ibz_cmp(&ibz_norm,&M)==0); - if (! found ){ - ibz_printf("unequality of norm \n %Zd \n %Zd \n",ibz_norm,M); - } - - ibz_t remainder; - ibz_init(&remainder); - ibz_div(&temp,&remainder,&M_begin,&M); - - found = found && (ibz_cmp(&remainder,&ibz_const_zero)==0); - - quat_alg_elem_finalize(&gamma); - ibz_finalize(&M); - quat_alg_finalize(&Bpoo); - ibz_finalize(&p); - ibz_finalize(&temp); - ibz_finalize(&M_begin); - ibz_finalize(&remainder); - ibq_finalize(&norm); - ibz_finalize(&ibz_norm); - return found; -} - -int klpt_test_tools() { - - int res = 1; - res =kltp_test_keygen_random_ideal(); - assert(res); - for (int i =0; i<2;i++) { - res= res && klpt_test_lideal_generator_coprime(); - } - assert(res); - for (int i =0; i<2;i++) { - res= res && klpt_test_lideal_isom(i); - } - assert(res); - for (int i =0; i<2;i++) { - res= res && klpt_test_connecting_ideal(i); - } - assert(res); - - printf("Running klpt tests for represent integer \n \n"); - - for (int i =0; i<3;i++) { - res= res && klpt_test_represent_integer(); - } - if (!res) { - printf("KLPT unit test represent_integer failed\n"); - } - printf("Running klpt tests for solve combi eichler \n \n"); - - for (int i =0; i<3;i++) { - res= res && klpt_test_solve_combi_eichler(); - } - if (!res) { - printf("KLPT unit test solve_combi_eichler failed\n"); - } - - printf("Running klpt tests for finding linear combination \n \n"); - - for (int i =0; i<3;i++) { - res= res && klpt_test_find_linear_comb(); - } - if (!res) { - printf("KLPT unit test find_linear_comb failed\n"); - } - return res; -} diff --git a/src/klpt/ref/klptx/tools.c b/src/klpt/ref/klptx/tools.c deleted file mode 100644 index 96ca031..0000000 --- a/src/klpt/ref/klptx/tools.c +++ /dev/null @@ -1,730 +0,0 @@ -#include -#include -#include "tools.h" - - - -/** @file - * - * @authors Antonin Leroux - * - * @brief the eichler norm equation implementation - */ - - -void quat_alg_elem_copy(quat_alg_elem_t *copy,const quat_alg_elem_t *copied) { - ibz_copy(©->denom,&copied->denom); - ibz_copy(©->coord[0],&copied->coord[0]); - ibz_copy(©->coord[1],&copied->coord[1]); - ibz_copy(©->coord[2],&copied->coord[2]); - ibz_copy(©->coord[3],&copied->coord[3]); -} -void quat_left_ideal_copy(quat_left_ideal_t *copy,const quat_left_ideal_t *copied) { - copy->parent_order = copied->parent_order; - ibz_copy(©->norm,&copied->norm); - ibz_copy(©->lattice.denom,&copied->lattice.denom); - for (int i=0;i<4;i++) { - for (int j=0;j<4;j++) { - ibz_copy(©->lattice.basis[i][j],&copied->lattice.basis[i][j]); - } - } -} - - -/** - * @brief Create an element of a extremal maximal order from its coefficients - * - * @param elem Output: the quaternion element - * @param order the order - * @param coeffs the vector of 4 ibz coefficients - * @param Bpoo quaternion algebra - * - * elem = x + i*y + j*z + j*i*t - * where coeffs = [x,y,z,t] and i = order.i, j = order.j - * - */ -void order_elem_create(quat_alg_elem_t *elem, const quat_p_extremal_maximal_order_t *order, const quat_alg_coord_t *coeffs, const quat_alg_t *Bpoo) { - - // var dec - quat_alg_elem_t quat_temp; - - // var init - quat_alg_elem_init(&quat_temp); - - // elem = x - quat_alg_scalar(elem,&(*coeffs)[0],&ibz_const_one); - - // quat_temp = i*y - quat_alg_scalar(&quat_temp,&((*coeffs)[1]),&ibz_const_one); - quat_alg_mul(&quat_temp,&order->i,&quat_temp,Bpoo); - - // elem = x + i*y - quat_alg_add(elem,elem,&quat_temp); - - // quat_temp = z * j - quat_alg_scalar(&quat_temp,&(*coeffs)[2],&ibz_const_one); - quat_alg_mul(&quat_temp,&order->j,&quat_temp,Bpoo); - - // elem = x + i* + z*j - quat_alg_add(elem,elem,&quat_temp); - - // quat_temp = t * j * i - quat_alg_scalar(&quat_temp,&(*coeffs)[3],&ibz_const_one); - quat_alg_mul(&quat_temp,&order->j,&quat_temp,Bpoo); - quat_alg_mul(&quat_temp,&quat_temp,&order->i,Bpoo); - - // elem = x + i*y + j*z + j*i*t - quat_alg_add(elem,elem,&quat_temp); - - quat_alg_elem_finalize(&quat_temp); -} - -/** - * @brief Finding the good linear combination - * - * @param C Output: the linear combination - * @param beta the endomorphism - * @param order the order - * @param n the norm - * @param e the exponent - * @param gen_start element of order, generate a left O-ideal of norm n = 2^exp - * @param gen_end element of order, generate a left O-ideal of norm n = 2^exp - * @param Bpoo quaternion algebra - * - * lideal_start = order < gen_start,n> - * lideal_end = order < gen_end,n> - * This algorithm finds two integers C[1], C[2] such that the pushforward of the ideal lideal_start by the endomorphism C[1] + C[2] beta is equal to lideal_end - * beta is an endomorphism of order, it has been chosen to ensure that a solution exists - * Returns a bit indicating if the computation succeeded - */ -int klpt_find_linear_comb(ibz_vec_2_t *C,const quat_alg_elem_t *beta, const quat_order_t *order, const ibz_t *n, const unsigned short exp, const quat_alg_elem_t *gen_start, const quat_alg_elem_t *gen_end,const quat_alg_t *Bpoo) { - - // var dec - int found; - quat_left_ideal_t lideal_end; - quat_alg_elem_t temp,gamma,bas2,bas3; - quat_alg_coord_t v0,v1,v2,v3; - ibz_mat_4x4_t system; - - // var init - found = 0; - quat_alg_coord_init(&v1);quat_alg_coord_init(&v0); - quat_alg_coord_init(&v2);quat_alg_coord_init(&v3); - quat_alg_elem_init(&gamma); - quat_alg_elem_init(&temp); - quat_alg_elem_init(&bas2); - quat_alg_elem_init(&bas3); - quat_left_ideal_init(&lideal_end); - ibz_mat_4x4_init(&system); - - assert(quat_lattice_contains(&v0,order,gen_end,Bpoo)); - - //computing lideal_start from gen_start - quat_lideal_create_from_primitive(&lideal_end,gen_end,n,order,Bpoo); - - - // compute gamma = gen_start * \overline { beta } - quat_alg_conj(&temp,beta); - quat_alg_mul(&gamma,gen_start,&temp,Bpoo); - quat_alg_normalize(&gamma); - - - // computing the system to solve - // possibly solving the system over the basis of Bpoo should be enough ?? (up to rescaling to allow for integer solutions) - - // converting the basis in actual quaternion element bas2,bas3 - ibz_copy(&bas2.denom,&lideal_end.lattice.denom); - ibz_copy(&bas3.denom,&lideal_end.lattice.denom); - ibz_copy(&bas2.coord[0],&lideal_end.lattice.basis[0][2]); - ibz_copy(&bas2.coord[1],&lideal_end.lattice.basis[1][2]); - ibz_copy(&bas2.coord[2],&lideal_end.lattice.basis[2][2]); - ibz_copy(&bas2.coord[3],&lideal_end.lattice.basis[3][2]); - ibz_copy(&bas3.coord[0],&lideal_end.lattice.basis[0][3]); - ibz_copy(&bas3.coord[1],&lideal_end.lattice.basis[1][3]); - ibz_copy(&bas3.coord[2],&lideal_end.lattice.basis[2][3]); - ibz_copy(&bas3.coord[3],&lideal_end.lattice.basis[3][3]); - - - - // setting the four vectors needed for the system - found = quat_lattice_contains(&v0,order,gen_start,Bpoo); - assert(found); - found = found && quat_lattice_contains(&v1,order,&gamma,Bpoo); - assert(found); - found = found && quat_lattice_contains(&v2,order,&bas2,Bpoo); - assert(found); - found = found && quat_lattice_contains(&v3,order,&bas3,Bpoo); - assert(found); - - // creation of the actual system - ibz_copy(&system[0][0],&v0[0]); - ibz_copy(&system[0][1],&v1[0]); - ibz_copy(&system[0][2],&v2[0]); - ibz_copy(&system[0][3],&v3[0]); - ibz_copy(&system[1][0],&v0[1]); - ibz_copy(&system[1][1],&v1[1]); - ibz_copy(&system[1][2],&v2[1]); - ibz_copy(&system[1][3],&v3[1]); - ibz_copy(&system[2][0],&v0[2]); - ibz_copy(&system[2][1],&v1[2]); - ibz_copy(&system[2][2],&v2[2]); - ibz_copy(&system[2][3],&v3[2]); - ibz_copy(&system[3][0],&v0[3]); - ibz_copy(&system[3][1],&v1[3]); - ibz_copy(&system[3][2],&v2[3]); - ibz_copy(&system[3][3],&v3[3]); - // ibz_copy(&system[0][0],&gen_start->coord[0]); - // ibz_copy(&system[0][1],&gamma.coord[0]); - // ibz_copy(&system[0][2],&bas2.coord[0]); - // ibz_copy(&system[0][3],&bas3.coord[0]); - // ibz_copy(&system[1][0],&gen_start->coord[1]); - // ibz_copy(&system[1][1],&gamma.coord[1]); - // ibz_copy(&system[1][2],&bas2.coord[1]); - // ibz_copy(&system[1][3],&bas3.coord[1]); - // ibz_copy(&system[2][0],&gen_start->coord[2]); - // ibz_copy(&system[2][1],&gamma.coord[2]); - // ibz_copy(&system[2][2],&bas2.coord[2]); - // ibz_copy(&system[2][3],&bas3.coord[2]); - // ibz_copy(&system[3][0],&gen_start->coord[3]); - // ibz_copy(&system[3][1],&gamma.coord[3]); - // ibz_copy(&system[3][2],&bas2.coord[3]); - // ibz_copy(&system[3][3],&bas3.coord[3]); - - // finding the kernel of the system - found = ibz_4x4_right_ker_mod_power_of_2(&v0,&system,exp); - - // computation of the result - ibz_copy(&(*C)[0],&v0[0]); - ibz_copy(&(*C)[1],&v0[1]); - // var fin - quat_alg_coord_finalize(&v1);quat_alg_coord_finalize(&v0); - quat_alg_coord_finalize(&v2);quat_alg_coord_finalize(&v3); - quat_alg_elem_finalize(&gamma); - quat_alg_elem_finalize(&temp); - quat_alg_elem_finalize(&bas2); - quat_alg_elem_finalize(&bas3); - quat_left_ideal_finalize(&lideal_end); - ibz_mat_4x4_finalize(&system); - - return found; -} - -/** - * @brief Finding the good linear span(j,i*j) combination - * - * @param C Output: two integers modulo n - * @param order special extremal order - * @param delta quaternion element - * @param gamma quaternion element - * @param lideal generator of left order ideal - * @param Bpoo quaternion algebra - * @param is_divisible intean indicating if Norm(gamma) is divisible by n - * - * This algorithm finds two integers C[0], C[1] such that gamma * j * (C[0] + i C[1]]) * delta is in the eichler order ZZ + lideal - * if gamma have norm divisible by n(lideal) (indicated by the intean is_divisible), then the result will be contained in J - * Failure should not be possible - * Assumes n is prime ! - */ -int solve_combi_eichler(ibz_vec_2_t *C, const quat_p_extremal_maximal_order_t *order, const quat_alg_elem_t *gamma, const quat_alg_elem_t *delta, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo, int is_divisible){ - - - //var dec - int found; - quat_alg_elem_t gamma_delta, gamma_j,gamma_j_delta,gamma_ji_delta,denom1,denom2,denom3,bas2,bas3; - - //var init - found = 0; - quat_alg_elem_init(&gamma_j); - quat_alg_elem_init(&gamma_delta); - quat_alg_elem_init(&gamma_j_delta); - quat_alg_elem_init(&gamma_ji_delta); - quat_alg_elem_init(&denom1); - quat_alg_elem_init(&denom2); - quat_alg_elem_init(&denom3); - quat_alg_elem_init(&bas3); - quat_alg_elem_init(&bas2); - - // computation of the system to solve - - //computation of the algebra elements we need - // we multiply everything by gamma and delta - quat_alg_mul(&gamma_j,gamma,&order->j,Bpoo); - quat_alg_mul(&gamma_ji_delta,&gamma_j,&order->i,Bpoo); - quat_alg_mul(&gamma_j_delta,&gamma_j,delta,Bpoo); - quat_alg_mul(&gamma_ji_delta,&gamma_ji_delta,delta,Bpoo); - quat_alg_normalize(&gamma_ji_delta); - quat_alg_normalize(&gamma_j_delta); - - // we create the two elements that are interesting to us - ibz_copy(&bas2.denom,&ibz_const_one); - ibz_copy(&bas3.denom,&ibz_const_one); - ibz_copy(&bas2.coord[0],&lideal->lattice.basis[0][2]); - ibz_copy(&bas2.coord[1],&lideal->lattice.basis[1][2]); - ibz_copy(&bas2.coord[2],&lideal->lattice.basis[2][2]); - ibz_copy(&bas2.coord[3],&lideal->lattice.basis[3][2]); - ibz_copy(&bas3.coord[0],&lideal->lattice.basis[0][3]); - ibz_copy(&bas3.coord[1],&lideal->lattice.basis[1][3]); - ibz_copy(&bas3.coord[2],&lideal->lattice.basis[2][3]); - ibz_copy(&bas3.coord[3],&lideal->lattice.basis[3][3]); - - // we compute the denominators - quat_alg_scalar(&denom1,&gamma_ji_delta.denom,&ibz_const_one); - quat_alg_scalar(&denom2,&lideal->lattice.denom,&ibz_const_one); - quat_alg_scalar(&denom3,&gamma_j_delta.denom,&ibz_const_one); - - // performing the necessary multiplication by crossed denom - quat_alg_mul(&gamma_j_delta,&gamma_j_delta,&denom2,Bpoo); quat_alg_mul(&gamma_j_delta,&gamma_j_delta,&denom1,Bpoo); - quat_alg_mul(&gamma_ji_delta,&gamma_ji_delta,&denom2,Bpoo);quat_alg_mul(&gamma_ji_delta,&gamma_ji_delta,&denom3,Bpoo); - quat_alg_mul(&bas2,&bas2,&denom1,Bpoo);quat_alg_mul(&bas2,&bas2,&denom3,Bpoo); - quat_alg_mul(&bas3,&bas3,&denom1,Bpoo);quat_alg_mul(&bas3,&bas3,&denom3,Bpoo); - - if (is_divisible) { - // declaration and init of the system and kernel - ibz_mat_4x4_t system; - ibz_mat_4x4_init(&system); - quat_alg_coord_t ker; - quat_alg_coord_init(&ker); - - // we fill the system - ibz_copy(&system[0][0],&gamma_j_delta.coord[0]); - ibz_copy(&system[0][1],&gamma_ji_delta.coord[0]); - ibz_copy(&system[0][2],&bas2.coord[0]); - ibz_copy(&system[0][3],&bas3.coord[0]); - ibz_copy(&system[1][0],&gamma_j_delta.coord[1]); - ibz_copy(&system[1][1],&gamma_ji_delta.coord[1]); - ibz_copy(&system[1][2],&bas2.coord[1]); - ibz_copy(&system[1][3],&bas3.coord[1]); - ibz_copy(&system[2][0],&gamma_j_delta.coord[2]); - ibz_copy(&system[2][1],&gamma_ji_delta.coord[2]); - ibz_copy(&system[2][2],&bas2.coord[2]); - ibz_copy(&system[2][3],&bas3.coord[2]); - ibz_copy(&system[3][0],&gamma_j_delta.coord[3]); - ibz_copy(&system[3][1],&gamma_ji_delta.coord[3]); - ibz_copy(&system[3][2],&bas2.coord[3]); - ibz_copy(&system[3][3],&bas3.coord[3]); - - // ibz_mat_4x4_print(&system); - - // resolution of the system - found = ibz_4x4_right_ker_mod_prime(&ker,&system,&lideal->norm); - assert(found); - - // computation of the result - ibz_copy(&(*C)[0],&ker[0]); - ibz_copy(&(*C)[1],&ker[1]); - - // finalization of the kernel and system - ibz_mat_4x4_finalize(&system); - quat_alg_coord_finalize(&ker); - - } - else { - // somme missing operations - // gamma_delta = 1 - quat_alg_scalar(&gamma_delta,&ibz_const_one,&ibz_const_one); - - // multiply by the denom - quat_alg_mul(&gamma_delta,&gamma_delta,&denom1,Bpoo); - quat_alg_mul(&gamma_delta,&gamma_delta,&denom2,Bpoo); - quat_alg_mul(&gamma_delta,&gamma_delta,&denom3,Bpoo); - - // declaration and init of the system and - ibz_mat_4x5_t system; - ibz_mat_4x5_init(&system); - ibz_vec_5_t ker; - ibz_vec_5_init(&ker); - - // we fill the system - ibz_copy(&system[0][0],&gamma_j_delta.coord[0]); - ibz_copy(&system[0][1],&gamma_ji_delta.coord[0]); - ibz_copy(&system[0][2],&gamma_delta.coord[0]); - ibz_copy(&system[0][3],&bas2.coord[0]); - ibz_copy(&system[0][4],&bas3.coord[0]); - ibz_copy(&system[1][0],&gamma_j_delta.coord[1]); - ibz_copy(&system[1][1],&gamma_ji_delta.coord[1]); - ibz_copy(&system[1][2],&gamma_delta.coord[1]); - ibz_copy(&system[1][3],&bas2.coord[1]); - ibz_copy(&system[1][4],&bas3.coord[1]); - ibz_copy(&system[2][0],&gamma_j_delta.coord[2]); - ibz_copy(&system[2][1],&gamma_ji_delta.coord[2]); - ibz_copy(&system[2][2],&gamma_delta.coord[2]); - ibz_copy(&system[2][3],&bas2.coord[2]); - ibz_copy(&system[2][4],&bas3.coord[2]); - ibz_copy(&system[3][0],&gamma_j_delta.coord[3]); - ibz_copy(&system[3][1],&gamma_ji_delta.coord[3]); - ibz_copy(&system[3][2],&gamma_delta.coord[3]); - ibz_copy(&system[3][3],&bas2.coord[3]); - ibz_copy(&system[3][4],&bas3.coord[3]); - - // resolution of the system - found = ibz_4x5_right_ker_mod_prime(&ker,&system,&lideal->norm); - assert(found); - // computation of the result - ibz_copy(&(*C)[0],&ker[0]); - ibz_copy(&(*C)[1],&ker[1]); - - // finalization of the kernel and system - ibz_mat_4x5_finalize(&system); - ibz_vec_5_finalize(&ker); - - - } - - // var finalize - quat_alg_elem_finalize(&gamma_j); - quat_alg_elem_finalize(&gamma_delta); - quat_alg_elem_finalize(&gamma_j_delta); - quat_alg_elem_finalize(&gamma_ji_delta); - quat_alg_elem_finalize(&denom1); - quat_alg_elem_finalize(&denom2); - quat_alg_elem_finalize(&denom3); - quat_alg_elem_finalize(&bas3); - quat_alg_elem_finalize(&bas2); - return found; - -} - - -/** - * @brief Representing an integer by the quadratic norm form of a maximal extremal order - * - * @param gamma Output: a quaternion element - * @param n_gamma Outut: norm of gamma (also part of the input, it is the target norm a multiple of the final norm) - * @param Bpoo the quaternion algebra - * @return 1 if the computation succeeded - * - * This algorithm finds a primitive quaternion element gamma of n_gamma inside the standard maximal extremal order - */ -int represent_integer(quat_alg_elem_t *gamma, ibz_t *n_gamma, const quat_alg_t *Bpoo){ - - // var dec - int found; - int cnt; - ibz_t cornacchia_target; - ibz_t adjusted_n_gamma; - ibz_t bound,sq_bound,temp; - quat_alg_coord_t coeffs; // coeffs = [x,y,z,t] - quat_alg_elem_t quat_temp; - int prime_list_length;short prime_list[1]; ibz_t prod_bad_primes; // TODO adapt - prime_list[0] = 5; prime_list_length = 1; - ibz_init(&prod_bad_primes);ibz_copy(&prod_bad_primes,&ibz_const_one); - - - // var init - found = 0; - cnt = 0; - ibz_init(&bound);ibz_init(&temp);ibz_init(&sq_bound); - quat_alg_coord_init(&coeffs); - quat_alg_elem_init(&quat_temp); - ibz_init(&adjusted_n_gamma); - ibz_init(&cornacchia_target); - - //adjusting the norm of gamma (multiplied by 4 to find a solution in the full maximal order) - ibz_mul(&adjusted_n_gamma,n_gamma,&ibz_const_two); - ibz_mul(&adjusted_n_gamma,&adjusted_n_gamma,&ibz_const_two); - - // computation of the first bound = sqrt (adjust_n_gamma / p ) - ibz_div(&sq_bound,&bound,&adjusted_n_gamma,&Bpoo->p); - ibz_sqrt_floor(&bound,&sq_bound); - // entering the main loop - while (!found && cnt < KLPT_repres_num_gamma_trial) { - cnt ++; - // we start by sampling the first coordinate - ibz_rand_interval(&coeffs[2],&ibz_const_one,&bound); - // then, we sample the second coordinate - // computing the second bound in temp as sqrt( (adjust_n_gamma - coeffs[2]²)/p ) - ibz_mul(&cornacchia_target,&coeffs[2],&coeffs[2]); - ibz_sub(&temp,&sq_bound,&cornacchia_target); - ibz_sqrt_floor(&temp,&temp); - - if (ibz_cmp(&temp,&ibz_const_zero) ==0) { - continue; - } - // sampling the second value - ibz_rand_interval(&coeffs[3],&ibz_const_one,&temp); - - // compute cornacchia_target = n_gamma - p * (z² + t²) - ibz_mul(&temp,&coeffs[3],&coeffs[3]); - ibz_add(&cornacchia_target,&cornacchia_target,&temp); - ibz_mul(&cornacchia_target,&cornacchia_target,&Bpoo->p); - ibz_sub(&cornacchia_target,&adjusted_n_gamma,&cornacchia_target); - // applying cornacchia extended - - found = ibz_cornacchia_extended(&coeffs[0],&coeffs[1],&cornacchia_target,prime_list,prime_list_length, KLPT_primality_num_iter, &prod_bad_primes); - - // check that we can divide by two at least once - // we must have x = t mod 2 and y = z mod 2 - found = found && (ibz_get(&coeffs[0])%2 == ibz_get(&coeffs[3])%2) && (ibz_get(&coeffs[1])%2 == ibz_get(&coeffs[2])%2); - - } - if (found) { - // translate x,y,z,t into the quaternion element gamma - order_elem_create(gamma,&STANDARD_EXTREMAL_ORDER,&coeffs,Bpoo); - // making gamma primitive - // coeffs contains the coefficients of primitivized gamma in the basis of order - quat_alg_make_primitive(&coeffs,&temp,gamma,&STANDARD_EXTREMAL_ORDER.order,Bpoo); - - // new gamma - ibz_mat_4x4_eval(&coeffs,&STANDARD_EXTREMAL_ORDER.order.basis,&coeffs); - ibz_copy(&gamma->coord[0],&coeffs[0]); - ibz_copy(&gamma->coord[1],&coeffs[1]); - ibz_copy(&gamma->coord[2],&coeffs[2]); - ibz_copy(&gamma->coord[3],&coeffs[3]); - ibz_copy(&gamma->denom,&STANDARD_EXTREMAL_ORDER.order.denom); - - // adjust the norm of gamma by dividing by the scalar temp² - ibz_mul(&temp,&temp,&temp); - ibz_div(n_gamma,&bound,&adjusted_n_gamma,&temp); - - } - // var finalize - ibz_finalize(&bound);ibz_finalize(&temp);ibz_finalize(&sq_bound); - quat_alg_coord_finalize(&coeffs); - quat_alg_elem_finalize(&quat_temp); - ibz_finalize(&adjusted_n_gamma); - ibz_finalize(&cornacchia_target); - ibz_finalize(&prod_bad_primes); - - return found; -} - -/** - * @brief Computing the strong approximation - * - * @param mu Output: a quaternion element - * @param n_mu 4 times target norm of mu - * @param order special extremal order - * @param C coefficients to be lifted - * @param n_quat_C norm of the quaternion element corresponding to C - * @param lambda an integer used in the computation - * @param n modulo for the lift - * @param max_tries int, bound on the number of tries before we abort - * @param condition a filter function returning whether a vector should be output or not - * @param params extra parameters passed to `condition`. May be NULL. - * @param Bpoo the quaternion algebra - * - * This algorithm finds a quaternion element mu of norm equal to n_mu/4 such that - * mu = lambda* (C[0] + i * C[1])*j mod ( n * order) - * the value of lambda has been computed in a way to make this computation possible - * the value of mu is computed by the function condition (which depends on some additional params) and must satisfy a set of constraints defined by condition - * the number of trials is max_tries - * Assumes n is either a prime or a product of big prime ! this means the probability to encounter non-invertible elements is considered negligible - */ -int strong_approximation(quat_alg_elem_t *mu, const ibz_t *n_mu, const quat_p_extremal_maximal_order_t *order, const ibz_vec_2_t *C, const ibz_t *n_quat_C, const ibz_t *lambda, const ibz_t *n, int max_tries, -int (*condition)(quat_alg_elem_t*, const ibz_vec_2_t*, const void*), const void *params, const quat_alg_t *Bpoo) { - - // var dec - ibz_t ibz_q; - ibz_t p_lambda_2; - ibz_t coeff_c0,coeff_c1; - ibz_t cst_term,temp; - ibz_t bound; - ibz_mat_2x2_t lat; - ibz_vec_2_t target; - int found; - - // var init - ibz_init(&ibz_q); ibz_init(&temp);ibz_init(&bound); - ibz_init(&p_lambda_2); - ibz_init(&coeff_c0);ibz_init(&coeff_c1); - ibz_init(&cst_term); - ibz_mat_2x2_init(&lat); - ibz_vec_2_init(&target); - - // computation of various ibz - ibz_set(&ibz_q,order->q); - - // p_lambda_2 = p * lambda * 2 - ibz_mul(&p_lambda_2,lambda,&Bpoo->p); - ibz_mul(&p_lambda_2,&p_lambda_2,&ibz_const_two); - - //coeff_c0 = p_lambda_2 * C[0] - ibz_mul(&coeff_c0,&p_lambda_2,&(*C)[0]); - ibz_mod(&coeff_c0,&coeff_c0,n); - //coeff_c1 = 1/(q * p_lambda_2 * C[1]) mod n - ibz_mul(&coeff_c1,&p_lambda_2,&(*C)[1]); - ibz_mul(&coeff_c1,&coeff_c1,&ibz_q); - ibz_mod(&coeff_c1,&coeff_c1,n); - ibz_invmod(&coeff_c1,&coeff_c1,n); - - - // cst_term = (n_mu-lambda^2 * n_quat_c)/n - ibz_mul(&temp,lambda,lambda); - ibz_mul(&temp,&temp,n_quat_C); - ibz_sub(&temp,n_mu,&temp); - ibz_div(&cst_term,&temp,&temp,n); - ibz_mod(&cst_term,&cst_term,n); - - // for debug check that the remainder is zero - assert(ibz_cmp(&temp,&ibz_const_zero)==0); - - // computation of the lattice - // first_column = n * ( 1, - coeff_c0 * coeff_c1 mod n) - // we start by inverting coeff_c1 - ibz_copy(&lat[0][0],n); - ibz_copy(&lat[1][0],&coeff_c1); - ibz_neg(&lat[1][0],&lat[1][0]); - ibz_mul(&lat[1][0],&lat[1][0],&coeff_c0); - ibz_mod(&lat[1][0],&lat[1][0],n); - ibz_mul(&lat[1][0],&lat[1][0],n); - - // second_colum = ( 0, n² ) - ibz_copy(&lat[0][1],&ibz_const_zero); - ibz_copy(&lat[1][1],n); - ibz_mul(&lat[1][1],&lat[1][1],n); - - // computation of the target vector = (lambda * C[0], lambda * C[1] + n * cst_term * coeff_c1 ) - ibz_mul(&target[0],lambda,&(*C)[0]); - ibz_mul(&target[1],lambda,&(*C)[1]); - ibz_mul(&temp,&cst_term,&coeff_c1); - ibz_mod(&temp,&temp,n); - ibz_mul(&temp,&temp,n); - ibz_add(&target[1],&target[1],&temp); - - // computation of the norm log_bound - ibz_div(&bound,&temp,n_mu,&Bpoo->p); - int dist_bound = ibz_bitsize(&bound) - 1; - // to avoid that dist_bound is too big - if (dist_bound > 3*ibz_bitsize(n) + 10) { - dist_bound= 3*ibz_bitsize(n) + 10; - } - - // enumeration of small vectors until a suitable one is found - found = quat_2x2_lattice_enumerate_cvp_filter(mu,&lat,&target,order->q,dist_bound,condition,params,max_tries); - - // var finalize - ibz_finalize(&ibz_q);ibz_finalize(&temp);ibz_finalize(&bound); - ibz_finalize(&p_lambda_2); - ibz_finalize(&coeff_c0);ibz_finalize(&coeff_c1); - ibz_finalize(&cst_term); - ibz_mat_2x2_finalize(&lat); - ibz_vec_2_finalize(&target); - - return found; -} - - -/** - * @brief Computing a list of good norm - * - * @param list Output: a list of ibz - * @param list_size int, size of the list - * @param log_bound int, logarithmic bound - * @param n ibz, the modulo - * @param target_reduosity int, a legendre symbol - * @returns the number of integers above the bound that were able to set - * - * This algorithm finds a list of size list_size - * of ibz dividing TORSION_ODD^2 - * such that the log of these ibz is bigger than log_bound - * and the legendre symbol of these integers mod n is equal to target_reduosity - * assumes that TORSION_ODD is divided by a big power of 3, so we look for T² and T² divided by small powers of 3 (possibly divided by another factor to satisfy the reduosity condition). - */ -int norm_list_computation(ibz_t *list, int list_size, int log_bound, const ibz_t *n, int target_reduosity) { - - // var dec - ibz_t temp,remainder; - ibz_t elli; - int is_smaller; - int cnt = 0; - int num_found=0; - int found = 0; - int log_freedom =0; - ibz_t const *const T = &TORSION_ODD; - size_t const num_fac = sizeof(TORSION_ODD_PRIMES) / sizeof(*TORSION_ODD_PRIMES); - uint64_t const *const fac = TORSION_ODD_PRIMES; - - - // var init - ibz_init(&temp);ibz_init(&remainder); - ibz_init(&elli); - - assert(fac[0]==3); // by construction of p - - // temp = T² - ibz_mul(&temp, T, T); - - // log_freedom is the bitsize of temp - log_freedom = ibz_bitsize(&temp); - // indicates if we have a chance to find an integer bigger than the bound - is_smaller = (log_bound < log_freedom); - // elli = fac[0]; - ibz_set(&elli,fac[0]); - int small_reduosity = ibz_legendre(&elli,n); - - // in that case we look for a number that is a square - if (target_reduosity == 1 ) { - - while (is_smaller && num_found < list_size ) { - // copy the value to the output list - ibz_copy(&(list[num_found]),&temp); - num_found++; - - // we set up to compute another value - if (small_reduosity == 1) { - // we can afford to remove only fac[0] since it is a square - ibz_set(&remainder,fac[0]); - } - else { - // we need to remove fac[0]² because fac[0] is not a square - ibz_set(&remainder,fac[0]*fac[0]); - } - ibz_div(&temp,&remainder,&temp,&remainder); - log_freedom = ibz_bitsize(&temp); - is_smaller = (log_bound < log_freedom); - } - - } - else if (is_smaller) { - - // first, we look for a factor that is not a square that we can remove from T² to obtain an integer with the right reduosity - while (!found && num_found < num_fac ) { - - ibz_set(&elli,fac[num_found]); - if (ibz_legendre(&elli,n) == -1 ) { - ibz_div(&temp,&remainder,&temp,&elli); - assert(ibz_cmp(&remainder,&ibz_const_zero)==0); - log_freedom = ibz_bitsize(&temp); - is_smaller = (log_bound < log_freedom); - found = 1; - - } - num_found++; - } - if (!found) { - // no suitable factor was found, we cannot find any suitable integer - return 0; - } - // now we actually try to find integers - num_found =0; - while (is_smaller && num_found < list_size) { - // copy the good value to the output list - ibz_copy(&list[num_found],&temp); - num_found++; - - // we set up to compute another value - // we need to remove fac[0]² - if (small_reduosity == 1) { - // we can afford to remove only fac[0] since it is a square - ibz_set(&remainder,fac[0]); - } - else { - // we need to remove fac[0]² because fac[0] is not a square - ibz_set(&remainder,fac[0]*fac[0]); - } - ibz_div(&temp,&remainder,&temp,&remainder); - assert(ibz_cmp(&remainder,&ibz_const_zero)==0); - log_freedom = ibz_bitsize(&temp); - is_smaller = (log_bound < log_freedom); - } - } - - - - // var finalize - ibz_finalize(&temp);ibz_finalize(&remainder); - ibz_finalize(&elli); - - return num_found; - -} diff --git a/src/klpt/ref/klptx/tools.h b/src/klpt/ref/klptx/tools.h deleted file mode 100644 index 45b8f57..0000000 --- a/src/klpt/ref/klptx/tools.h +++ /dev/null @@ -1,168 +0,0 @@ -#include -#include -#include - -/** @file - * - * @authors Antonin Leroux - * - * @brief the klpt_tools header - */ - -#ifndef KLPT_TOOLS_H -#define KLPT_TOOLS_H - -/** @internal - * @ingroup klpt_klpt - * @defgroup klpt_internal KLPT module internal functions and types - * @{ - */ - -/** @internal - * @defgroup klpt_param_t Types for klpt parameters - * @{ -*/ - -/** @brief Type for klpt parameter * - * @typedef signing_klpt_param_t - * - * @struct signing_klpt_param - * - * the structure used in klpt for the call to strong approx -*/ -typedef struct signing_klpt_param { - - - quat_alg_elem_t gamma; - quat_alg_elem_t delta; - ibz_t target_norm; - quat_alg_t Bpoo; - const quat_p_extremal_maximal_order_t *order; - ibz_t n; - ibz_t equiv_n; - - -} signing_klpt_param_t; - - -/** @brief Type for quaternion algebras - * - * @typedef eichler_norm_param_t - * - * @struct eichler_norm_param - * - * the structure used in eichler_norm_param for the call to strong approx - */ -typedef struct eichler_norm_param { - - quat_alg_elem_t gen_constraint; - - - ibz_t target_norm; - quat_alg_t Bpoo; - quat_p_extremal_maximal_order_t order; - ibz_t n; - quat_order_t right_order; - -} eichler_norm_param_t; - - -/** - * @} -*/ - -/** @} -*/ - - -/** @internal - * @ingroup klpt_tools - * @{ -*/ - -/** - * @brief Create an element of a extremal maximal order from its coefficients - * - * @param elem Output: the quaternion element - * @param order the order - * @param coeffs the vector of 4 ibz coefficients - * @param Bpoo quaternion algebra - * - * elem = x + i*y + j*z + j*i*t - * where coeffs = [x,y,z,t] and i = order.i, j = order.j - * - */ -void order_elem_create(quat_alg_elem_t *elem, const quat_p_extremal_maximal_order_t *order, const quat_alg_coord_t *coeffs, const quat_alg_t *Bpoo); - -/** - * @brief Finding the good linear span(j,i*j) combination - * - * @param C Output: two integers modulo n - * @param order special extremal order - * @param delta quaternion element - * @param gamma quaternion element - * @param lideal left order-ideal - * @param Bpoo quaternion algebra - * @param is_divisible boolean indicating if Norm(gamma) is divisible by n - * - * This algorithm finds two integers C[0], C[1] such that gamma * j * (C[0] + i C[1]]) * delta is in the eichler order ZZ + lideal - * if gamma have norm divisible by n(lideal) (indicated by the boolean is_divisible), then the result will be contained in J - * Failure should not be possible - * Assumes n is prime ! - */ -int solve_combi_eichler(ibz_vec_2_t *C, const quat_p_extremal_maximal_order_t *order, const quat_alg_elem_t *gamma, const quat_alg_elem_t *delta, const quat_left_ideal_t *lideal, const quat_alg_t *Bpoo, int is_divisible); - - -int ibz_cornacchia_special_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p, const int exp_adjust); - - - - -/** - * @brief Computing the strong approximation - * - * @param mu Output: a quaternion element - * @param n_mu 4 times target norm of mu - * @param order special extremal order - * @param C coefficients to be lifted - * @param n_quat_C norm of the quaternion element corresponding to C - * @param lambda an integer used in the computation - * @param n modulo for the lift - * @param max_tries int, bound on the number of tries before we abort - * @param condition a filter function returning whether a vector should be output or not - * @param params extra parameters passed to `condition`. May be NULL. - * @param Bpoo the quaternion algebra - * - * This algorithm finds a quaternion element mu of norm equal to n_mu/4 such that - * mu = lambda* (C[0] + i * C[1])*j mod ( n * order) - * the value of lambda has been computed in a way to make this computation possible - * the value of mu is computed by the function condition (which depends on some additional params) and must satisfy a set of constraints defined by condition - * the number of trials is max_tries - * Assumes n is either a prime or a product of big prime ! this means the probability to encounter non-invertible elements is considered negligible - */ -int strong_approximation(quat_alg_elem_t *mu, const ibz_t *n_mu, const quat_p_extremal_maximal_order_t *order, const ibz_vec_2_t *C, const ibz_t *n_quat_C, const ibz_t *lambda, const ibz_t *n, int max_tries, -int (*condition)(quat_alg_elem_t*, const ibz_vec_2_t*, const void*), const void *params, const quat_alg_t *Bpoo); - - -/** - * @brief Computing a list of good norm - * - * @param list Output: a list of ibz - * @param list_size int, size of the list - * @param log_bound int, logarithmic bound - * @param n ibz, the modulo - * @param target_reduosity int, a legendre symbol - * @returns a bit indicating if at least one factor was found - * - * This algorithm finds a list of size list_size - * of ibz dividing T^2 - * such that the log of these ibz is smaller than log_bound and their legendre symbol - * and the legendre symbol of these ibz mod n is equal to target_reduosity - */ -int norm_list_computation(ibz_t *list, int list_size, int log_bound, const ibz_t *n, int target_reduosity); - -/** @} -*/ - - -#endif diff --git a/src/klpt/ref/lvl1/CMakeLists.txt b/src/klpt/ref/lvl1/CMakeLists.txt deleted file mode 100644 index 52530b5..0000000 --- a/src/klpt/ref/lvl1/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCE_FILES_KLPT_GENERIC_REF - ${KLPTX_DIR}/eichler.c - ${KLPTX_DIR}/equiv.c - ${KLPTX_DIR}/klpt.c - ${KLPTX_DIR}/tools.c -) - -add_library(${LIB_KLPT_${SVARIANT_UPPER}} ${SOURCE_FILES_KLPT_GENERIC_REF}) -target_include_directories(${LIB_KLPT_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ) -target_compile_options(${LIB_KLPT_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/klpt/ref/lvl1/test/CMakeLists.txt b/src/klpt/ref/lvl1/test/CMakeLists.txt deleted file mode 100644 index 017faf3..0000000 --- a/src/klpt/ref/lvl1/test/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCE_FILES_KLPT_GENERIC_REF_TESTS - ${KLPTX_DIR}/test/tools.c - ${KLPTX_DIR}/test/equiv.c - ${KLPTX_DIR}/test/klpt.c - ${KLPTX_DIR}/test/eichler.c - ${KLPTX_DIR}/test/test_klpt.c -) -add_executable(sqisign_test_klpt_${SVARIANT_UPPER} ${SOURCE_FILES_KLPT_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_klpt_${SVARIANT_UPPER} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_klpt_${SVARIANT_UPPER} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ./include/ ) - -add_test(sqisign_test_klpt_${SVARIANT_UPPER} sqisign_test_klpt_${SVARIANT_UPPER}) \ No newline at end of file diff --git a/src/klpt/ref/lvl3/CMakeLists.txt b/src/klpt/ref/lvl3/CMakeLists.txt deleted file mode 100644 index 52530b5..0000000 --- a/src/klpt/ref/lvl3/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCE_FILES_KLPT_GENERIC_REF - ${KLPTX_DIR}/eichler.c - ${KLPTX_DIR}/equiv.c - ${KLPTX_DIR}/klpt.c - ${KLPTX_DIR}/tools.c -) - -add_library(${LIB_KLPT_${SVARIANT_UPPER}} ${SOURCE_FILES_KLPT_GENERIC_REF}) -target_include_directories(${LIB_KLPT_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ) -target_compile_options(${LIB_KLPT_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/klpt/ref/lvl3/test/CMakeLists.txt b/src/klpt/ref/lvl3/test/CMakeLists.txt deleted file mode 100644 index 017faf3..0000000 --- a/src/klpt/ref/lvl3/test/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCE_FILES_KLPT_GENERIC_REF_TESTS - ${KLPTX_DIR}/test/tools.c - ${KLPTX_DIR}/test/equiv.c - ${KLPTX_DIR}/test/klpt.c - ${KLPTX_DIR}/test/eichler.c - ${KLPTX_DIR}/test/test_klpt.c -) -add_executable(sqisign_test_klpt_${SVARIANT_UPPER} ${SOURCE_FILES_KLPT_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_klpt_${SVARIANT_UPPER} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_klpt_${SVARIANT_UPPER} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ./include/ ) - -add_test(sqisign_test_klpt_${SVARIANT_UPPER} sqisign_test_klpt_${SVARIANT_UPPER}) \ No newline at end of file diff --git a/src/klpt/ref/lvl5/CMakeLists.txt b/src/klpt/ref/lvl5/CMakeLists.txt deleted file mode 100644 index 52530b5..0000000 --- a/src/klpt/ref/lvl5/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCE_FILES_KLPT_GENERIC_REF - ${KLPTX_DIR}/eichler.c - ${KLPTX_DIR}/equiv.c - ${KLPTX_DIR}/klpt.c - ${KLPTX_DIR}/tools.c -) - -add_library(${LIB_KLPT_${SVARIANT_UPPER}} ${SOURCE_FILES_KLPT_GENERIC_REF}) -target_include_directories(${LIB_KLPT_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ) -target_compile_options(${LIB_KLPT_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/klpt/ref/lvl5/test/CMakeLists.txt b/src/klpt/ref/lvl5/test/CMakeLists.txt deleted file mode 100644 index 017faf3..0000000 --- a/src/klpt/ref/lvl5/test/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(SOURCE_FILES_KLPT_GENERIC_REF_TESTS - ${KLPTX_DIR}/test/tools.c - ${KLPTX_DIR}/test/equiv.c - ${KLPTX_DIR}/test/klpt.c - ${KLPTX_DIR}/test/eichler.c - ${KLPTX_DIR}/test/test_klpt.c -) -add_executable(sqisign_test_klpt_${SVARIANT_UPPER} ${SOURCE_FILES_KLPT_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_klpt_${SVARIANT_UPPER} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_klpt_${SVARIANT_UPPER} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ./include/ ) - -add_test(sqisign_test_klpt_${SVARIANT_UPPER} sqisign_test_klpt_${SVARIANT_UPPER}) \ No newline at end of file diff --git a/src/mini-gmp/mini-gmp-extra.c b/src/mini-gmp/mini-gmp-extra.c new file mode 100644 index 0000000..396d505 --- /dev/null +++ b/src/mini-gmp/mini-gmp-extra.c @@ -0,0 +1,73 @@ +#include +#include +#if defined(MINI_GMP) +#include "mini-gmp.h" +#else +// This configuration is used only for testing +#include +#endif +#include + +// Exported for testing +int +mini_mpz_legendre(const mpz_t a, const mpz_t p) +{ + int res = 0; + mpz_t e; + mpz_init_set(e, p); + mpz_sub_ui(e, e, 1); + mpz_fdiv_q_2exp(e, e, 1); + mpz_powm(e, a, e, p); + + if (mpz_cmp_ui(e, 1) <= 0) { + res = mpz_get_si(e); + } else { + res = -1; + } + mpz_clear(e); + return res; +} + +#if defined(MINI_GMP) +int +mpz_legendre(const mpz_t a, const mpz_t p) +{ + return mini_mpz_legendre(a, p); +} +#endif + +// Exported for testing +double +mini_mpz_get_d_2exp(signed long int *exp, const mpz_t op) +{ + double ret; + int tmp_exp; + mpz_t tmp; + + // Handle the case where op is 0 + if (mpz_cmp_ui(op, 0) == 0) { + *exp = 0; + return 0.0; + } + + *exp = mpz_sizeinbase(op, 2); + + mpz_init_set(tmp, op); + + if (*exp > DBL_MAX_EXP) { + mpz_fdiv_q_2exp(tmp, tmp, *exp - DBL_MAX_EXP); + } + + ret = frexp(mpz_get_d(tmp), &tmp_exp); + mpz_clear(tmp); + + return ret; +} + +#if defined(MINI_GMP) +double +mpz_get_d_2exp(signed long int *exp, const mpz_t op) +{ + return mini_mpz_get_d_2exp(exp, op); +} +#endif diff --git a/src/mini-gmp/mini-gmp-extra.h b/src/mini-gmp/mini-gmp-extra.h new file mode 100644 index 0000000..0113cfd --- /dev/null +++ b/src/mini-gmp/mini-gmp-extra.h @@ -0,0 +1,19 @@ +#ifndef MINI_GMP_EXTRA_H +#define MINI_GMP_EXTRA_H + +#if defined MINI_GMP +#include "mini-gmp.h" + +typedef long mp_exp_t; + +int mpz_legendre(const mpz_t a, const mpz_t p); +double mpz_get_d_2exp(signed long int *exp, const mpz_t op); +#else +// This configuration is used only for testing +#include +#endif + +int mini_mpz_legendre(const mpz_t a, const mpz_t p); +double mini_mpz_get_d_2exp(signed long int *exp, const mpz_t op); + +#endif diff --git a/src/mini-gmp/mini-gmp.c b/src/mini-gmp/mini-gmp.c new file mode 100644 index 0000000..3830ab2 --- /dev/null +++ b/src/mini-gmp/mini-gmp.c @@ -0,0 +1,4671 @@ +/* Note: The code from mini-gmp is modifed from the original by + commenting out the definition of GMP_LIMB_BITS */ + +/* + mini-gmp, a minimalistic implementation of a GNU GMP subset. + + Contributed to the GNU project by Niels Möller + Additional functionalities and improvements by Marco Bodrato. + +Copyright 1991-1997, 1999-2022 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + +or + + * the GNU General Public License as published by the Free Software + Foundation; either version 2 of the License, or (at your option) any + later version. + +or both in parallel, as here. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received copies of the GNU General Public License and the +GNU Lesser General Public License along with the GNU MP Library. If not, +see https://www.gnu.org/licenses/. */ + +/* NOTE: All functions in this file which are not declared in + mini-gmp.h are internal, and are not intended to be compatible + with GMP or with future versions of mini-gmp. */ + +/* Much of the material copied from GMP files, including: gmp-impl.h, + longlong.h, mpn/generic/add_n.c, mpn/generic/addmul_1.c, + mpn/generic/lshift.c, mpn/generic/mul_1.c, + mpn/generic/mul_basecase.c, mpn/generic/rshift.c, + mpn/generic/sbpi1_div_qr.c, mpn/generic/sub_n.c, + mpn/generic/submul_1.c. */ + +#include +#include +#include +#include +#include +#include + +#include "mini-gmp.h" + +#if !defined(MINI_GMP_DONT_USE_FLOAT_H) +#include +#endif + + +/* Macros */ +/* Removed from here as it is passed as a compiler command-line definition */ +/* #define GMP_LIMB_BITS (sizeof(mp_limb_t) * CHAR_BIT) */ + +#define GMP_LIMB_MAX ((mp_limb_t) ~ (mp_limb_t) 0) +#define GMP_LIMB_HIGHBIT ((mp_limb_t) 1 << (GMP_LIMB_BITS - 1)) + +#define GMP_HLIMB_BIT ((mp_limb_t) 1 << (GMP_LIMB_BITS / 2)) +#define GMP_LLIMB_MASK (GMP_HLIMB_BIT - 1) + +#define GMP_ULONG_BITS (sizeof(unsigned long) * CHAR_BIT) +#define GMP_ULONG_HIGHBIT ((unsigned long) 1 << (GMP_ULONG_BITS - 1)) + +#define GMP_ABS(x) ((x) >= 0 ? (x) : -(x)) +#define GMP_NEG_CAST(T,x) (-((T)((x) + 1) - 1)) + +#define GMP_MIN(a, b) ((a) < (b) ? (a) : (b)) +#define GMP_MAX(a, b) ((a) > (b) ? (a) : (b)) + +#define GMP_CMP(a,b) (((a) > (b)) - ((a) < (b))) + +#if defined(DBL_MANT_DIG) && FLT_RADIX == 2 +#define GMP_DBL_MANT_BITS DBL_MANT_DIG +#else +#define GMP_DBL_MANT_BITS (53) +#endif + +/* Return non-zero if xp,xsize and yp,ysize overlap. + If xp+xsize<=yp there's no overlap, or if yp+ysize<=xp there's no + overlap. If both these are false, there's an overlap. */ +#define GMP_MPN_OVERLAP_P(xp, xsize, yp, ysize) \ + ((xp) + (xsize) > (yp) && (yp) + (ysize) > (xp)) + +#define gmp_assert_nocarry(x) do { \ + mp_limb_t __cy = (x); \ + assert (__cy == 0); \ + (void) (__cy); \ + } while (0) + +#define gmp_clz(count, x) do { \ + mp_limb_t __clz_x = (x); \ + unsigned __clz_c = 0; \ + int LOCAL_SHIFT_BITS = 8; \ + if (GMP_LIMB_BITS > LOCAL_SHIFT_BITS) \ + for (; \ + (__clz_x & ((mp_limb_t) 0xff << (GMP_LIMB_BITS - 8))) == 0; \ + __clz_c += 8) \ + { __clz_x <<= LOCAL_SHIFT_BITS; } \ + for (; (__clz_x & GMP_LIMB_HIGHBIT) == 0; __clz_c++) \ + __clz_x <<= 1; \ + (count) = __clz_c; \ + } while (0) + +#define gmp_ctz(count, x) do { \ + mp_limb_t __ctz_x = (x); \ + unsigned __ctz_c = 0; \ + gmp_clz (__ctz_c, __ctz_x & - __ctz_x); \ + (count) = GMP_LIMB_BITS - 1 - __ctz_c; \ + } while (0) + +#define gmp_add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do { \ + mp_limb_t __x; \ + __x = (al) + (bl); \ + (sh) = (ah) + (bh) + (__x < (al)); \ + (sl) = __x; \ + } while (0) + +#define gmp_sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + mp_limb_t __x; \ + __x = (al) - (bl); \ + (sh) = (ah) - (bh) - ((al) < (bl)); \ + (sl) = __x; \ + } while (0) + +#define gmp_umul_ppmm(w1, w0, u, v) \ + do { \ + int LOCAL_GMP_LIMB_BITS = GMP_LIMB_BITS; \ + if (sizeof(unsigned int) * CHAR_BIT >= 2 * GMP_LIMB_BITS) \ + { \ + unsigned int __ww = (unsigned int) (u) * (v); \ + w0 = (mp_limb_t) __ww; \ + w1 = (mp_limb_t) (__ww >> LOCAL_GMP_LIMB_BITS); \ + } \ + else if (GMP_ULONG_BITS >= 2 * GMP_LIMB_BITS) \ + { \ + unsigned long int __ww = (unsigned long int) (u) * (v); \ + w0 = (mp_limb_t) __ww; \ + w1 = (mp_limb_t) (__ww >> LOCAL_GMP_LIMB_BITS); \ + } \ + else { \ + mp_limb_t __x0, __x1, __x2, __x3; \ + unsigned __ul, __vl, __uh, __vh; \ + mp_limb_t __u = (u), __v = (v); \ + assert (sizeof (unsigned) * 2 >= sizeof (mp_limb_t)); \ + \ + __ul = __u & GMP_LLIMB_MASK; \ + __uh = __u >> (GMP_LIMB_BITS / 2); \ + __vl = __v & GMP_LLIMB_MASK; \ + __vh = __v >> (GMP_LIMB_BITS / 2); \ + \ + __x0 = (mp_limb_t) __ul * __vl; \ + __x1 = (mp_limb_t) __ul * __vh; \ + __x2 = (mp_limb_t) __uh * __vl; \ + __x3 = (mp_limb_t) __uh * __vh; \ + \ + __x1 += __x0 >> (GMP_LIMB_BITS / 2);/* this can't give carry */ \ + __x1 += __x2; /* but this indeed can */ \ + if (__x1 < __x2) /* did we get it? */ \ + __x3 += GMP_HLIMB_BIT; /* yes, add it in the proper pos. */ \ + \ + (w1) = __x3 + (__x1 >> (GMP_LIMB_BITS / 2)); \ + (w0) = (__x1 << (GMP_LIMB_BITS / 2)) + (__x0 & GMP_LLIMB_MASK); \ + } \ + } while (0) + +/* If mp_limb_t is of size smaller than int, plain u*v implies + automatic promotion to *signed* int, and then multiply may overflow + and cause undefined behavior. Explicitly cast to unsigned int for + that case. */ +#define gmp_umullo_limb(u, v) \ + ((sizeof(mp_limb_t) >= sizeof(int)) ? (u)*(v) : (unsigned int)(u) * (v)) + +#define gmp_udiv_qrnnd_preinv(q, r, nh, nl, d, di) \ + do { \ + mp_limb_t _qh, _ql, _r, _mask; \ + gmp_umul_ppmm (_qh, _ql, (nh), (di)); \ + gmp_add_ssaaaa (_qh, _ql, _qh, _ql, (nh) + 1, (nl)); \ + _r = (nl) - gmp_umullo_limb (_qh, (d)); \ + _mask = -(mp_limb_t) (_r > _ql); /* both > and >= are OK */ \ + _qh += _mask; \ + _r += _mask & (d); \ + if (_r >= (d)) \ + { \ + _r -= (d); \ + _qh++; \ + } \ + \ + (r) = _r; \ + (q) = _qh; \ + } while (0) + +#define gmp_udiv_qr_3by2(q, r1, r0, n2, n1, n0, d1, d0, dinv) \ + do { \ + mp_limb_t _q0, _t1, _t0, _mask; \ + gmp_umul_ppmm ((q), _q0, (n2), (dinv)); \ + gmp_add_ssaaaa ((q), _q0, (q), _q0, (n2), (n1)); \ + \ + /* Compute the two most significant limbs of n - q'd */ \ + (r1) = (n1) - gmp_umullo_limb ((d1), (q)); \ + gmp_sub_ddmmss ((r1), (r0), (r1), (n0), (d1), (d0)); \ + gmp_umul_ppmm (_t1, _t0, (d0), (q)); \ + gmp_sub_ddmmss ((r1), (r0), (r1), (r0), _t1, _t0); \ + (q)++; \ + \ + /* Conditionally adjust q and the remainders */ \ + _mask = - (mp_limb_t) ((r1) >= _q0); \ + (q) += _mask; \ + gmp_add_ssaaaa ((r1), (r0), (r1), (r0), _mask & (d1), _mask & (d0)); \ + if ((r1) >= (d1)) \ + { \ + if ((r1) > (d1) || (r0) >= (d0)) \ + { \ + (q)++; \ + gmp_sub_ddmmss ((r1), (r0), (r1), (r0), (d1), (d0)); \ + } \ + } \ + } while (0) + +/* Swap macros. */ +#define MP_LIMB_T_SWAP(x, y) \ + do { \ + mp_limb_t __mp_limb_t_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mp_limb_t_swap__tmp; \ + } while (0) +#define MP_SIZE_T_SWAP(x, y) \ + do { \ + mp_size_t __mp_size_t_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mp_size_t_swap__tmp; \ + } while (0) +#define MP_BITCNT_T_SWAP(x,y) \ + do { \ + mp_bitcnt_t __mp_bitcnt_t_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mp_bitcnt_t_swap__tmp; \ + } while (0) +#define MP_PTR_SWAP(x, y) \ + do { \ + mp_ptr __mp_ptr_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mp_ptr_swap__tmp; \ + } while (0) +#define MP_SRCPTR_SWAP(x, y) \ + do { \ + mp_srcptr __mp_srcptr_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mp_srcptr_swap__tmp; \ + } while (0) + +#define MPN_PTR_SWAP(xp,xs, yp,ys) \ + do { \ + MP_PTR_SWAP (xp, yp); \ + MP_SIZE_T_SWAP (xs, ys); \ + } while(0) +#define MPN_SRCPTR_SWAP(xp,xs, yp,ys) \ + do { \ + MP_SRCPTR_SWAP (xp, yp); \ + MP_SIZE_T_SWAP (xs, ys); \ + } while(0) + +#define MPZ_PTR_SWAP(x, y) \ + do { \ + mpz_ptr __mpz_ptr_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mpz_ptr_swap__tmp; \ + } while (0) +#define MPZ_SRCPTR_SWAP(x, y) \ + do { \ + mpz_srcptr __mpz_srcptr_swap__tmp = (x); \ + (x) = (y); \ + (y) = __mpz_srcptr_swap__tmp; \ + } while (0) + +const int mp_bits_per_limb = GMP_LIMB_BITS; + + +/* Memory allocation and other helper functions. */ +static void +gmp_die (const char *msg) +{ + fprintf (stderr, "%s\n", msg); + abort(); +} + +static void * +gmp_default_alloc (size_t size) +{ + void *p; + + assert (size > 0); + + p = malloc (size); + if (!p) + gmp_die("gmp_default_alloc: Virtual memory exhausted."); + + return p; +} + +static void * +gmp_default_realloc (void *old, size_t unused_old_size, size_t new_size) +{ + void * p; + + p = realloc (old, new_size); + + if (!p) + gmp_die("gmp_default_realloc: Virtual memory exhausted."); + + return p; +} + +static void +gmp_default_free (void *p, size_t unused_size) +{ + free (p); +} + +static void * (*gmp_allocate_func) (size_t) = gmp_default_alloc; +static void * (*gmp_reallocate_func) (void *, size_t, size_t) = gmp_default_realloc; +static void (*gmp_free_func) (void *, size_t) = gmp_default_free; + +void +mp_get_memory_functions (void *(**alloc_func) (size_t), + void *(**realloc_func) (void *, size_t, size_t), + void (**free_func) (void *, size_t)) +{ + if (alloc_func) + *alloc_func = gmp_allocate_func; + + if (realloc_func) + *realloc_func = gmp_reallocate_func; + + if (free_func) + *free_func = gmp_free_func; +} + +void +mp_set_memory_functions (void *(*alloc_func) (size_t), + void *(*realloc_func) (void *, size_t, size_t), + void (*free_func) (void *, size_t)) +{ + if (!alloc_func) + alloc_func = gmp_default_alloc; + if (!realloc_func) + realloc_func = gmp_default_realloc; + if (!free_func) + free_func = gmp_default_free; + + gmp_allocate_func = alloc_func; + gmp_reallocate_func = realloc_func; + gmp_free_func = free_func; +} + +#define gmp_alloc(size) ((*gmp_allocate_func)((size))) +#define gmp_free(p, size) ((*gmp_free_func) ((p), (size))) +#define gmp_realloc(ptr, old_size, size) ((*gmp_reallocate_func)(ptr, old_size, size)) + +static mp_ptr +gmp_alloc_limbs (mp_size_t size) +{ + return (mp_ptr) gmp_alloc (size * sizeof (mp_limb_t)); +} + +static mp_ptr +gmp_realloc_limbs (mp_ptr old, mp_size_t old_size, mp_size_t size) +{ + assert (size > 0); + return (mp_ptr) gmp_realloc (old, old_size * sizeof (mp_limb_t), size * sizeof (mp_limb_t)); +} + +static void +gmp_free_limbs (mp_ptr old, mp_size_t size) +{ + gmp_free (old, size * sizeof (mp_limb_t)); +} + + +/* MPN interface */ + +void +mpn_copyi (mp_ptr d, mp_srcptr s, mp_size_t n) +{ + mp_size_t i; + for (i = 0; i < n; i++) + d[i] = s[i]; +} + +void +mpn_copyd (mp_ptr d, mp_srcptr s, mp_size_t n) +{ + while (--n >= 0) + d[n] = s[n]; +} + +int +mpn_cmp (mp_srcptr ap, mp_srcptr bp, mp_size_t n) +{ + while (--n >= 0) + { + if (ap[n] != bp[n]) + return ap[n] > bp[n] ? 1 : -1; + } + return 0; +} + +static int +mpn_cmp4 (mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn) +{ + if (an != bn) + return an < bn ? -1 : 1; + else + return mpn_cmp (ap, bp, an); +} + +static mp_size_t +mpn_normalized_size (mp_srcptr xp, mp_size_t n) +{ + while (n > 0 && xp[n-1] == 0) + --n; + return n; +} + +int +mpn_zero_p(mp_srcptr rp, mp_size_t n) +{ + return mpn_normalized_size (rp, n) == 0; +} + +void +mpn_zero (mp_ptr rp, mp_size_t n) +{ + while (--n >= 0) + rp[n] = 0; +} + +mp_limb_t +mpn_add_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b) +{ + mp_size_t i; + + assert (n > 0); + i = 0; + do + { + mp_limb_t r = ap[i] + b; + /* Carry out */ + b = (r < b); + rp[i] = r; + } + while (++i < n); + + return b; +} + +mp_limb_t +mpn_add_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n) +{ + mp_size_t i; + mp_limb_t cy; + + for (i = 0, cy = 0; i < n; i++) + { + mp_limb_t a, b, r; + a = ap[i]; b = bp[i]; + r = a + cy; + cy = (r < cy); + r += b; + cy += (r < b); + rp[i] = r; + } + return cy; +} + +mp_limb_t +mpn_add (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn) +{ + mp_limb_t cy; + + assert (an >= bn); + + cy = mpn_add_n (rp, ap, bp, bn); + if (an > bn) + cy = mpn_add_1 (rp + bn, ap + bn, an - bn, cy); + return cy; +} + +mp_limb_t +mpn_sub_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b) +{ + mp_size_t i; + + assert (n > 0); + + i = 0; + do + { + mp_limb_t a = ap[i]; + /* Carry out */ + mp_limb_t cy = a < b; + rp[i] = a - b; + b = cy; + } + while (++i < n); + + return b; +} + +mp_limb_t +mpn_sub_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n) +{ + mp_size_t i; + mp_limb_t cy; + + for (i = 0, cy = 0; i < n; i++) + { + mp_limb_t a, b; + a = ap[i]; b = bp[i]; + b += cy; + cy = (b < cy); + cy += (a < b); + rp[i] = a - b; + } + return cy; +} + +mp_limb_t +mpn_sub (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn) +{ + mp_limb_t cy; + + assert (an >= bn); + + cy = mpn_sub_n (rp, ap, bp, bn); + if (an > bn) + cy = mpn_sub_1 (rp + bn, ap + bn, an - bn, cy); + return cy; +} + +mp_limb_t +mpn_mul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl) +{ + mp_limb_t ul, cl, hpl, lpl; + + assert (n >= 1); + + cl = 0; + do + { + ul = *up++; + gmp_umul_ppmm (hpl, lpl, ul, vl); + + lpl += cl; + cl = (lpl < cl) + hpl; + + *rp++ = lpl; + } + while (--n != 0); + + return cl; +} + +mp_limb_t +mpn_addmul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl) +{ + mp_limb_t ul, cl, hpl, lpl, rl; + + assert (n >= 1); + + cl = 0; + do + { + ul = *up++; + gmp_umul_ppmm (hpl, lpl, ul, vl); + + lpl += cl; + cl = (lpl < cl) + hpl; + + rl = *rp; + lpl = rl + lpl; + cl += lpl < rl; + *rp++ = lpl; + } + while (--n != 0); + + return cl; +} + +mp_limb_t +mpn_submul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl) +{ + mp_limb_t ul, cl, hpl, lpl, rl; + + assert (n >= 1); + + cl = 0; + do + { + ul = *up++; + gmp_umul_ppmm (hpl, lpl, ul, vl); + + lpl += cl; + cl = (lpl < cl) + hpl; + + rl = *rp; + lpl = rl - lpl; + cl += lpl > rl; + *rp++ = lpl; + } + while (--n != 0); + + return cl; +} + +mp_limb_t +mpn_mul (mp_ptr rp, mp_srcptr up, mp_size_t un, mp_srcptr vp, mp_size_t vn) +{ + assert (un >= vn); + assert (vn >= 1); + assert (!GMP_MPN_OVERLAP_P(rp, un + vn, up, un)); + assert (!GMP_MPN_OVERLAP_P(rp, un + vn, vp, vn)); + + /* We first multiply by the low order limb. This result can be + stored, not added, to rp. We also avoid a loop for zeroing this + way. */ + + rp[un] = mpn_mul_1 (rp, up, un, vp[0]); + + /* Now accumulate the product of up[] and the next higher limb from + vp[]. */ + + while (--vn >= 1) + { + rp += 1, vp += 1; + rp[un] = mpn_addmul_1 (rp, up, un, vp[0]); + } + return rp[un]; +} + +void +mpn_mul_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n) +{ + mpn_mul (rp, ap, n, bp, n); +} + +void +mpn_sqr (mp_ptr rp, mp_srcptr ap, mp_size_t n) +{ + mpn_mul (rp, ap, n, ap, n); +} + +mp_limb_t +mpn_lshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt) +{ + mp_limb_t high_limb, low_limb; + unsigned int tnc; + mp_limb_t retval; + + assert (n >= 1); + assert (cnt >= 1); + assert (cnt < GMP_LIMB_BITS); + + up += n; + rp += n; + + tnc = GMP_LIMB_BITS - cnt; + low_limb = *--up; + retval = low_limb >> tnc; + high_limb = (low_limb << cnt); + + while (--n != 0) + { + low_limb = *--up; + *--rp = high_limb | (low_limb >> tnc); + high_limb = (low_limb << cnt); + } + *--rp = high_limb; + + return retval; +} + +mp_limb_t +mpn_rshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt) +{ + mp_limb_t high_limb, low_limb; + unsigned int tnc; + mp_limb_t retval; + + assert (n >= 1); + assert (cnt >= 1); + assert (cnt < GMP_LIMB_BITS); + + tnc = GMP_LIMB_BITS - cnt; + high_limb = *up++; + retval = (high_limb << tnc); + low_limb = high_limb >> cnt; + + while (--n != 0) + { + high_limb = *up++; + *rp++ = low_limb | (high_limb << tnc); + low_limb = high_limb >> cnt; + } + *rp = low_limb; + + return retval; +} + +static mp_bitcnt_t +mpn_common_scan (mp_limb_t limb, mp_size_t i, mp_srcptr up, mp_size_t un, + mp_limb_t ux) +{ + unsigned cnt; + + assert (ux == 0 || ux == GMP_LIMB_MAX); + assert (0 <= i && i <= un ); + + while (limb == 0) + { + i++; + if (i == un) + return (ux == 0 ? ~(mp_bitcnt_t) 0 : un * GMP_LIMB_BITS); + limb = ux ^ up[i]; + } + gmp_ctz (cnt, limb); + return (mp_bitcnt_t) i * GMP_LIMB_BITS + cnt; +} + +mp_bitcnt_t +mpn_scan1 (mp_srcptr ptr, mp_bitcnt_t bit) +{ + mp_size_t i; + i = bit / GMP_LIMB_BITS; + + return mpn_common_scan ( ptr[i] & (GMP_LIMB_MAX << (bit % GMP_LIMB_BITS)), + i, ptr, i, 0); +} + +mp_bitcnt_t +mpn_scan0 (mp_srcptr ptr, mp_bitcnt_t bit) +{ + mp_size_t i; + i = bit / GMP_LIMB_BITS; + + return mpn_common_scan (~ptr[i] & (GMP_LIMB_MAX << (bit % GMP_LIMB_BITS)), + i, ptr, i, GMP_LIMB_MAX); +} + +void +mpn_com (mp_ptr rp, mp_srcptr up, mp_size_t n) +{ + while (--n >= 0) + *rp++ = ~ *up++; +} + +mp_limb_t +mpn_neg (mp_ptr rp, mp_srcptr up, mp_size_t n) +{ + while (*up == 0) + { + *rp = 0; + if (!--n) + return 0; + ++up; ++rp; + } + *rp = - *up; + mpn_com (++rp, ++up, --n); + return 1; +} + + +/* MPN division interface. */ + +/* The 3/2 inverse is defined as + + m = floor( (B^3-1) / (B u1 + u0)) - B +*/ +mp_limb_t +mpn_invert_3by2 (mp_limb_t u1, mp_limb_t u0) +{ + mp_limb_t r, m; + + { + mp_limb_t p, ql; + unsigned ul, uh, qh; + + assert (sizeof (unsigned) * 2 >= sizeof (mp_limb_t)); + /* For notation, let b denote the half-limb base, so that B = b^2. + Split u1 = b uh + ul. */ + ul = u1 & GMP_LLIMB_MASK; + uh = u1 >> (GMP_LIMB_BITS / 2); + + /* Approximation of the high half of quotient. Differs from the 2/1 + inverse of the half limb uh, since we have already subtracted + u0. */ + qh = (u1 ^ GMP_LIMB_MAX) / uh; + + /* Adjust to get a half-limb 3/2 inverse, i.e., we want + + qh' = floor( (b^3 - 1) / u) - b = floor ((b^3 - b u - 1) / u + = floor( (b (~u) + b-1) / u), + + and the remainder + + r = b (~u) + b-1 - qh (b uh + ul) + = b (~u - qh uh) + b-1 - qh ul + + Subtraction of qh ul may underflow, which implies adjustments. + But by normalization, 2 u >= B > qh ul, so we need to adjust by + at most 2. + */ + + r = ((~u1 - (mp_limb_t) qh * uh) << (GMP_LIMB_BITS / 2)) | GMP_LLIMB_MASK; + + p = (mp_limb_t) qh * ul; + /* Adjustment steps taken from udiv_qrnnd_c */ + if (r < p) + { + qh--; + r += u1; + if (r >= u1) /* i.e. we didn't get carry when adding to r */ + if (r < p) + { + qh--; + r += u1; + } + } + r -= p; + + /* Low half of the quotient is + + ql = floor ( (b r + b-1) / u1). + + This is a 3/2 division (on half-limbs), for which qh is a + suitable inverse. */ + + p = (r >> (GMP_LIMB_BITS / 2)) * qh + r; + /* Unlike full-limb 3/2, we can add 1 without overflow. For this to + work, it is essential that ql is a full mp_limb_t. */ + ql = (p >> (GMP_LIMB_BITS / 2)) + 1; + + /* By the 3/2 trick, we don't need the high half limb. */ + r = (r << (GMP_LIMB_BITS / 2)) + GMP_LLIMB_MASK - ql * u1; + + if (r >= (GMP_LIMB_MAX & (p << (GMP_LIMB_BITS / 2)))) + { + ql--; + r += u1; + } + m = ((mp_limb_t) qh << (GMP_LIMB_BITS / 2)) + ql; + if (r >= u1) + { + m++; + r -= u1; + } + } + + /* Now m is the 2/1 inverse of u1. If u0 > 0, adjust it to become a + 3/2 inverse. */ + if (u0 > 0) + { + mp_limb_t th, tl; + r = ~r; + r += u0; + if (r < u0) + { + m--; + if (r >= u1) + { + m--; + r -= u1; + } + r -= u1; + } + gmp_umul_ppmm (th, tl, u0, m); + r += th; + if (r < th) + { + m--; + m -= ((r > u1) | ((r == u1) & (tl > u0))); + } + } + + return m; +} + +struct gmp_div_inverse +{ + /* Normalization shift count. */ + unsigned shift; + /* Normalized divisor (d0 unused for mpn_div_qr_1) */ + mp_limb_t d1, d0; + /* Inverse, for 2/1 or 3/2. */ + mp_limb_t di; +}; + +static void +mpn_div_qr_1_invert (struct gmp_div_inverse *inv, mp_limb_t d) +{ + unsigned shift; + + assert (d > 0); + gmp_clz (shift, d); + inv->shift = shift; + inv->d1 = d << shift; + inv->di = mpn_invert_limb (inv->d1); +} + +static void +mpn_div_qr_2_invert (struct gmp_div_inverse *inv, + mp_limb_t d1, mp_limb_t d0) +{ + unsigned shift; + + assert (d1 > 0); + gmp_clz (shift, d1); + inv->shift = shift; + if (shift > 0) + { + d1 = (d1 << shift) | (d0 >> (GMP_LIMB_BITS - shift)); + d0 <<= shift; + } + inv->d1 = d1; + inv->d0 = d0; + inv->di = mpn_invert_3by2 (d1, d0); +} + +static void +mpn_div_qr_invert (struct gmp_div_inverse *inv, + mp_srcptr dp, mp_size_t dn) +{ + assert (dn > 0); + + if (dn == 1) + mpn_div_qr_1_invert (inv, dp[0]); + else if (dn == 2) + mpn_div_qr_2_invert (inv, dp[1], dp[0]); + else + { + unsigned shift; + mp_limb_t d1, d0; + + d1 = dp[dn-1]; + d0 = dp[dn-2]; + assert (d1 > 0); + gmp_clz (shift, d1); + inv->shift = shift; + if (shift > 0) + { + d1 = (d1 << shift) | (d0 >> (GMP_LIMB_BITS - shift)); + d0 = (d0 << shift) | (dp[dn-3] >> (GMP_LIMB_BITS - shift)); + } + inv->d1 = d1; + inv->d0 = d0; + inv->di = mpn_invert_3by2 (d1, d0); + } +} + +/* Not matching current public gmp interface, rather corresponding to + the sbpi1_div_* functions. */ +static mp_limb_t +mpn_div_qr_1_preinv (mp_ptr qp, mp_srcptr np, mp_size_t nn, + const struct gmp_div_inverse *inv) +{ + mp_limb_t d, di; + mp_limb_t r; + mp_ptr tp = NULL; + mp_size_t tn = 0; + + if (inv->shift > 0) + { + /* Shift, reusing qp area if possible. In-place shift if qp == np. */ + tp = qp; + if (!tp) + { + tn = nn; + tp = gmp_alloc_limbs (tn); + } + r = mpn_lshift (tp, np, nn, inv->shift); + np = tp; + } + else + r = 0; + + d = inv->d1; + di = inv->di; + while (--nn >= 0) + { + mp_limb_t q; + + gmp_udiv_qrnnd_preinv (q, r, r, np[nn], d, di); + if (qp) + qp[nn] = q; + } + if (tn) + gmp_free_limbs (tp, tn); + + return r >> inv->shift; +} + +static void +mpn_div_qr_2_preinv (mp_ptr qp, mp_ptr np, mp_size_t nn, + const struct gmp_div_inverse *inv) +{ + unsigned shift; + mp_size_t i; + mp_limb_t d1, d0, di, r1, r0; + + assert (nn >= 2); + shift = inv->shift; + d1 = inv->d1; + d0 = inv->d0; + di = inv->di; + + if (shift > 0) + r1 = mpn_lshift (np, np, nn, shift); + else + r1 = 0; + + r0 = np[nn - 1]; + + i = nn - 2; + do + { + mp_limb_t n0, q; + n0 = np[i]; + gmp_udiv_qr_3by2 (q, r1, r0, r1, r0, n0, d1, d0, di); + + if (qp) + qp[i] = q; + } + while (--i >= 0); + + if (shift > 0) + { + assert ((r0 & (GMP_LIMB_MAX >> (GMP_LIMB_BITS - shift))) == 0); + r0 = (r0 >> shift) | (r1 << (GMP_LIMB_BITS - shift)); + r1 >>= shift; + } + + np[1] = r1; + np[0] = r0; +} + +static void +mpn_div_qr_pi1 (mp_ptr qp, + mp_ptr np, mp_size_t nn, mp_limb_t n1, + mp_srcptr dp, mp_size_t dn, + mp_limb_t dinv) +{ + mp_size_t i; + + mp_limb_t d1, d0; + mp_limb_t cy, cy1; + mp_limb_t q; + + assert (dn > 2); + assert (nn >= dn); + + d1 = dp[dn - 1]; + d0 = dp[dn - 2]; + + assert ((d1 & GMP_LIMB_HIGHBIT) != 0); + /* Iteration variable is the index of the q limb. + * + * We divide + * by + */ + + i = nn - dn; + do + { + mp_limb_t n0 = np[dn-1+i]; + + if (n1 == d1 && n0 == d0) + { + q = GMP_LIMB_MAX; + mpn_submul_1 (np+i, dp, dn, q); + n1 = np[dn-1+i]; /* update n1, last loop's value will now be invalid */ + } + else + { + gmp_udiv_qr_3by2 (q, n1, n0, n1, n0, np[dn-2+i], d1, d0, dinv); + + cy = mpn_submul_1 (np + i, dp, dn-2, q); + + cy1 = n0 < cy; + n0 = n0 - cy; + cy = n1 < cy1; + n1 = n1 - cy1; + np[dn-2+i] = n0; + + if (cy != 0) + { + n1 += d1 + mpn_add_n (np + i, np + i, dp, dn - 1); + q--; + } + } + + if (qp) + qp[i] = q; + } + while (--i >= 0); + + np[dn - 1] = n1; +} + +static void +mpn_div_qr_preinv (mp_ptr qp, mp_ptr np, mp_size_t nn, + mp_srcptr dp, mp_size_t dn, + const struct gmp_div_inverse *inv) +{ + assert (dn > 0); + assert (nn >= dn); + + if (dn == 1) + np[0] = mpn_div_qr_1_preinv (qp, np, nn, inv); + else if (dn == 2) + mpn_div_qr_2_preinv (qp, np, nn, inv); + else + { + mp_limb_t nh; + unsigned shift; + + assert (inv->d1 == dp[dn-1]); + assert (inv->d0 == dp[dn-2]); + assert ((inv->d1 & GMP_LIMB_HIGHBIT) != 0); + + shift = inv->shift; + if (shift > 0) + nh = mpn_lshift (np, np, nn, shift); + else + nh = 0; + + mpn_div_qr_pi1 (qp, np, nn, nh, dp, dn, inv->di); + + if (shift > 0) + gmp_assert_nocarry (mpn_rshift (np, np, dn, shift)); + } +} + +static void +mpn_div_qr (mp_ptr qp, mp_ptr np, mp_size_t nn, mp_srcptr dp, mp_size_t dn) +{ + struct gmp_div_inverse inv; + mp_ptr tp = NULL; + + assert (dn > 0); + assert (nn >= dn); + + mpn_div_qr_invert (&inv, dp, dn); + if (dn > 2 && inv.shift > 0) + { + tp = gmp_alloc_limbs (dn); + gmp_assert_nocarry (mpn_lshift (tp, dp, dn, inv.shift)); + dp = tp; + } + mpn_div_qr_preinv (qp, np, nn, dp, dn, &inv); + if (tp) + gmp_free_limbs (tp, dn); +} + + +/* MPN base conversion. */ +static unsigned +mpn_base_power_of_two_p (unsigned b) +{ + switch (b) + { + case 2: return 1; + case 4: return 2; + case 8: return 3; + case 16: return 4; + case 32: return 5; + case 64: return 6; + case 128: return 7; + case 256: return 8; + default: return 0; + } +} + +struct mpn_base_info +{ + /* bb is the largest power of the base which fits in one limb, and + exp is the corresponding exponent. */ + unsigned exp; + mp_limb_t bb; +}; + +static void +mpn_get_base_info (struct mpn_base_info *info, mp_limb_t b) +{ + mp_limb_t m; + mp_limb_t p; + unsigned exp; + + m = GMP_LIMB_MAX / b; + for (exp = 1, p = b; p <= m; exp++) + p *= b; + + info->exp = exp; + info->bb = p; +} + +static mp_bitcnt_t +mpn_limb_size_in_base_2 (mp_limb_t u) +{ + unsigned shift; + + assert (u > 0); + gmp_clz (shift, u); + return GMP_LIMB_BITS - shift; +} + +static size_t +mpn_get_str_bits (unsigned char *sp, unsigned bits, mp_srcptr up, mp_size_t un) +{ + unsigned char mask; + size_t sn, j; + mp_size_t i; + unsigned shift; + + sn = ((un - 1) * GMP_LIMB_BITS + mpn_limb_size_in_base_2 (up[un-1]) + + bits - 1) / bits; + + mask = (1U << bits) - 1; + + for (i = 0, j = sn, shift = 0; j-- > 0;) + { + unsigned char digit = up[i] >> shift; + + shift += bits; + + if (shift >= GMP_LIMB_BITS && ++i < un) + { + shift -= GMP_LIMB_BITS; + digit |= up[i] << (bits - shift); + } + sp[j] = digit & mask; + } + return sn; +} + +/* We generate digits from the least significant end, and reverse at + the end. */ +static size_t +mpn_limb_get_str (unsigned char *sp, mp_limb_t w, + const struct gmp_div_inverse *binv) +{ + mp_size_t i; + for (i = 0; w > 0; i++) + { + mp_limb_t h, l, r; + + h = w >> (GMP_LIMB_BITS - binv->shift); + l = w << binv->shift; + + gmp_udiv_qrnnd_preinv (w, r, h, l, binv->d1, binv->di); + assert ((r & (GMP_LIMB_MAX >> (GMP_LIMB_BITS - binv->shift))) == 0); + r >>= binv->shift; + + sp[i] = r; + } + return i; +} + +static size_t +mpn_get_str_other (unsigned char *sp, + int base, const struct mpn_base_info *info, + mp_ptr up, mp_size_t un) +{ + struct gmp_div_inverse binv; + size_t sn; + size_t i; + + mpn_div_qr_1_invert (&binv, base); + + sn = 0; + + if (un > 1) + { + struct gmp_div_inverse bbinv; + mpn_div_qr_1_invert (&bbinv, info->bb); + + do + { + mp_limb_t w; + size_t done; + w = mpn_div_qr_1_preinv (up, up, un, &bbinv); + un -= (up[un-1] == 0); + done = mpn_limb_get_str (sp + sn, w, &binv); + + for (sn += done; done < info->exp; done++) + sp[sn++] = 0; + } + while (un > 1); + } + sn += mpn_limb_get_str (sp + sn, up[0], &binv); + + /* Reverse order */ + for (i = 0; 2*i + 1 < sn; i++) + { + unsigned char t = sp[i]; + sp[i] = sp[sn - i - 1]; + sp[sn - i - 1] = t; + } + + return sn; +} + +size_t +mpn_get_str (unsigned char *sp, int base, mp_ptr up, mp_size_t un) +{ + unsigned bits; + + assert (un > 0); + assert (up[un-1] > 0); + + bits = mpn_base_power_of_two_p (base); + if (bits) + return mpn_get_str_bits (sp, bits, up, un); + else + { + struct mpn_base_info info; + + mpn_get_base_info (&info, base); + return mpn_get_str_other (sp, base, &info, up, un); + } +} + +static mp_size_t +mpn_set_str_bits (mp_ptr rp, const unsigned char *sp, size_t sn, + unsigned bits) +{ + mp_size_t rn; + mp_limb_t limb; + unsigned shift; + + for (limb = 0, rn = 0, shift = 0; sn-- > 0; ) + { + limb |= (mp_limb_t) sp[sn] << shift; + shift += bits; + if (shift >= GMP_LIMB_BITS) + { + shift -= GMP_LIMB_BITS; + rp[rn++] = limb; + /* Next line is correct also if shift == 0, + bits == 8, and mp_limb_t == unsigned char. */ + limb = (unsigned int) sp[sn] >> (bits - shift); + } + } + if (limb != 0) + rp[rn++] = limb; + else + rn = mpn_normalized_size (rp, rn); + return rn; +} + +/* Result is usually normalized, except for all-zero input, in which + case a single zero limb is written at *RP, and 1 is returned. */ +static mp_size_t +mpn_set_str_other (mp_ptr rp, const unsigned char *sp, size_t sn, + mp_limb_t b, const struct mpn_base_info *info) +{ + mp_size_t rn; + mp_limb_t w; + unsigned k; + size_t j; + + assert (sn > 0); + + k = 1 + (sn - 1) % info->exp; + + j = 0; + w = sp[j++]; + while (--k != 0) + w = w * b + sp[j++]; + + rp[0] = w; + + for (rn = 1; j < sn;) + { + mp_limb_t cy; + + w = sp[j++]; + for (k = 1; k < info->exp; k++) + w = w * b + sp[j++]; + + cy = mpn_mul_1 (rp, rp, rn, info->bb); + cy += mpn_add_1 (rp, rp, rn, w); + if (cy > 0) + rp[rn++] = cy; + } + assert (j == sn); + + return rn; +} + +mp_size_t +mpn_set_str (mp_ptr rp, const unsigned char *sp, size_t sn, int base) +{ + unsigned bits; + + if (sn == 0) + return 0; + + bits = mpn_base_power_of_two_p (base); + if (bits) + return mpn_set_str_bits (rp, sp, sn, bits); + else + { + struct mpn_base_info info; + + mpn_get_base_info (&info, base); + return mpn_set_str_other (rp, sp, sn, base, &info); + } +} + + +/* MPZ interface */ +void +mpz_init (mpz_t r) +{ + static const mp_limb_t dummy_limb = GMP_LIMB_MAX & 0xc1a0; + + r->_mp_alloc = 0; + r->_mp_size = 0; + r->_mp_d = (mp_ptr) &dummy_limb; +} + +/* The utility of this function is a bit limited, since many functions + assigns the result variable using mpz_swap. */ +void +mpz_init2 (mpz_t r, mp_bitcnt_t bits) +{ + mp_size_t rn; + + bits -= (bits != 0); /* Round down, except if 0 */ + rn = 1 + bits / GMP_LIMB_BITS; + + r->_mp_alloc = rn; + r->_mp_size = 0; + r->_mp_d = gmp_alloc_limbs (rn); +} + +void +mpz_clear (mpz_t r) +{ + if (r->_mp_alloc) + gmp_free_limbs (r->_mp_d, r->_mp_alloc); +} + +static mp_ptr +mpz_realloc (mpz_t r, mp_size_t size) +{ + size = GMP_MAX (size, 1); + + if (r->_mp_alloc) + r->_mp_d = gmp_realloc_limbs (r->_mp_d, r->_mp_alloc, size); + else + r->_mp_d = gmp_alloc_limbs (size); + r->_mp_alloc = size; + + if (GMP_ABS (r->_mp_size) > size) + r->_mp_size = 0; + + return r->_mp_d; +} + +/* Realloc for an mpz_t WHAT if it has less than NEEDED limbs. */ +#define MPZ_REALLOC(z,n) ((n) > (z)->_mp_alloc \ + ? mpz_realloc(z,n) \ + : (z)->_mp_d) + +/* MPZ assignment and basic conversions. */ +void +mpz_set_si (mpz_t r, signed long int x) +{ + if (x >= 0) + mpz_set_ui (r, x); + else /* (x < 0) */ + if (GMP_LIMB_BITS < GMP_ULONG_BITS) + { + mpz_set_ui (r, GMP_NEG_CAST (unsigned long int, x)); + mpz_neg (r, r); + } + else + { + r->_mp_size = -1; + MPZ_REALLOC (r, 1)[0] = GMP_NEG_CAST (unsigned long int, x); + } +} + +void +mpz_set_ui (mpz_t r, unsigned long int x) +{ + if (x > 0) + { + r->_mp_size = 1; + MPZ_REALLOC (r, 1)[0] = x; + if (GMP_LIMB_BITS < GMP_ULONG_BITS) + { + int LOCAL_GMP_LIMB_BITS = GMP_LIMB_BITS; + while (x >>= LOCAL_GMP_LIMB_BITS) + { + ++ r->_mp_size; + MPZ_REALLOC (r, r->_mp_size)[r->_mp_size - 1] = x; + } + } + } + else + r->_mp_size = 0; +} + +void +mpz_set (mpz_t r, const mpz_t x) +{ + /* Allow the NOP r == x */ + if (r != x) + { + mp_size_t n; + mp_ptr rp; + + n = GMP_ABS (x->_mp_size); + rp = MPZ_REALLOC (r, n); + + mpn_copyi (rp, x->_mp_d, n); + r->_mp_size = x->_mp_size; + } +} + +void +mpz_init_set_si (mpz_t r, signed long int x) +{ + mpz_init (r); + mpz_set_si (r, x); +} + +void +mpz_init_set_ui (mpz_t r, unsigned long int x) +{ + mpz_init (r); + mpz_set_ui (r, x); +} + +void +mpz_init_set (mpz_t r, const mpz_t x) +{ + mpz_init (r); + mpz_set (r, x); +} + +int +mpz_fits_slong_p (const mpz_t u) +{ + return mpz_cmp_si (u, LONG_MAX) <= 0 && mpz_cmp_si (u, LONG_MIN) >= 0; +} + +static int +mpn_absfits_ulong_p (mp_srcptr up, mp_size_t un) +{ + int ulongsize = GMP_ULONG_BITS / GMP_LIMB_BITS; + mp_limb_t ulongrem = 0; + + if (GMP_ULONG_BITS % GMP_LIMB_BITS != 0) + ulongrem = (mp_limb_t) (ULONG_MAX >> GMP_LIMB_BITS * ulongsize) + 1; + + return un <= ulongsize || (up[ulongsize] < ulongrem && un == ulongsize + 1); +} + +int +mpz_fits_ulong_p (const mpz_t u) +{ + mp_size_t us = u->_mp_size; + + return us >= 0 && mpn_absfits_ulong_p (u->_mp_d, us); +} + +int +mpz_fits_sint_p (const mpz_t u) +{ + return mpz_cmp_si (u, INT_MAX) <= 0 && mpz_cmp_si (u, INT_MIN) >= 0; +} + +int +mpz_fits_uint_p (const mpz_t u) +{ + return u->_mp_size >= 0 && mpz_cmpabs_ui (u, UINT_MAX) <= 0; +} + +int +mpz_fits_sshort_p (const mpz_t u) +{ + return mpz_cmp_si (u, SHRT_MAX) <= 0 && mpz_cmp_si (u, SHRT_MIN) >= 0; +} + +int +mpz_fits_ushort_p (const mpz_t u) +{ + return u->_mp_size >= 0 && mpz_cmpabs_ui (u, USHRT_MAX) <= 0; +} + +long int +mpz_get_si (const mpz_t u) +{ + unsigned long r = mpz_get_ui (u); + unsigned long c = -LONG_MAX - LONG_MIN; + + if (u->_mp_size < 0) + /* This expression is necessary to properly handle -LONG_MIN */ + return -(long) c - (long) ((r - c) & LONG_MAX); + else + return (long) (r & LONG_MAX); +} + +unsigned long int +mpz_get_ui (const mpz_t u) +{ + if (GMP_LIMB_BITS < GMP_ULONG_BITS) + { + int LOCAL_GMP_LIMB_BITS = GMP_LIMB_BITS; + unsigned long r = 0; + mp_size_t n = GMP_ABS (u->_mp_size); + n = GMP_MIN (n, 1 + (mp_size_t) (GMP_ULONG_BITS - 1) / GMP_LIMB_BITS); + while (--n >= 0) + r = (r << LOCAL_GMP_LIMB_BITS) + u->_mp_d[n]; + return r; + } + + return u->_mp_size == 0 ? 0 : u->_mp_d[0]; +} + +size_t +mpz_size (const mpz_t u) +{ + return GMP_ABS (u->_mp_size); +} + +mp_limb_t +mpz_getlimbn (const mpz_t u, mp_size_t n) +{ + if (n >= 0 && n < GMP_ABS (u->_mp_size)) + return u->_mp_d[n]; + else + return 0; +} + +void +mpz_realloc2 (mpz_t x, mp_bitcnt_t n) +{ + mpz_realloc (x, 1 + (n - (n != 0)) / GMP_LIMB_BITS); +} + +mp_srcptr +mpz_limbs_read (mpz_srcptr x) +{ + return x->_mp_d; +} + +mp_ptr +mpz_limbs_modify (mpz_t x, mp_size_t n) +{ + assert (n > 0); + return MPZ_REALLOC (x, n); +} + +mp_ptr +mpz_limbs_write (mpz_t x, mp_size_t n) +{ + return mpz_limbs_modify (x, n); +} + +void +mpz_limbs_finish (mpz_t x, mp_size_t xs) +{ + mp_size_t xn; + xn = mpn_normalized_size (x->_mp_d, GMP_ABS (xs)); + x->_mp_size = xs < 0 ? -xn : xn; +} + +static mpz_srcptr +mpz_roinit_normal_n (mpz_t x, mp_srcptr xp, mp_size_t xs) +{ + x->_mp_alloc = 0; + x->_mp_d = (mp_ptr) xp; + x->_mp_size = xs; + return x; +} + +mpz_srcptr +mpz_roinit_n (mpz_t x, mp_srcptr xp, mp_size_t xs) +{ + mpz_roinit_normal_n (x, xp, xs); + mpz_limbs_finish (x, xs); + return x; +} + + +/* Conversions and comparison to double. */ +void +mpz_set_d (mpz_t r, double x) +{ + int sign; + mp_ptr rp; + mp_size_t rn, i; + double B; + double Bi; + mp_limb_t f; + + /* x != x is true when x is a NaN, and x == x * 0.5 is true when x is + zero or infinity. */ + if (x != x || x == x * 0.5) + { + r->_mp_size = 0; + return; + } + + sign = x < 0.0 ; + if (sign) + x = - x; + + if (x < 1.0) + { + r->_mp_size = 0; + return; + } + B = 4.0 * (double) (GMP_LIMB_HIGHBIT >> 1); + Bi = 1.0 / B; + for (rn = 1; x >= B; rn++) + x *= Bi; + + rp = MPZ_REALLOC (r, rn); + + f = (mp_limb_t) x; + x -= f; + assert (x < 1.0); + i = rn-1; + rp[i] = f; + while (--i >= 0) + { + x = B * x; + f = (mp_limb_t) x; + x -= f; + assert (x < 1.0); + rp[i] = f; + } + + r->_mp_size = sign ? - rn : rn; +} + +void +mpz_init_set_d (mpz_t r, double x) +{ + mpz_init (r); + mpz_set_d (r, x); +} + +double +mpz_get_d (const mpz_t u) +{ + int m; + mp_limb_t l; + mp_size_t un; + double x; + double B = 4.0 * (double) (GMP_LIMB_HIGHBIT >> 1); + + un = GMP_ABS (u->_mp_size); + + if (un == 0) + return 0.0; + + l = u->_mp_d[--un]; + gmp_clz (m, l); + m = m + GMP_DBL_MANT_BITS - GMP_LIMB_BITS; + if (m < 0) + l &= GMP_LIMB_MAX << -m; + + for (x = l; --un >= 0;) + { + x = B*x; + if (m > 0) { + l = u->_mp_d[un]; + m -= GMP_LIMB_BITS; + if (m < 0) + l &= GMP_LIMB_MAX << -m; + x += l; + } + } + + if (u->_mp_size < 0) + x = -x; + + return x; +} + +int +mpz_cmpabs_d (const mpz_t x, double d) +{ + mp_size_t xn; + double B, Bi; + mp_size_t i; + + xn = x->_mp_size; + d = GMP_ABS (d); + + if (xn != 0) + { + xn = GMP_ABS (xn); + + B = 4.0 * (double) (GMP_LIMB_HIGHBIT >> 1); + Bi = 1.0 / B; + + /* Scale d so it can be compared with the top limb. */ + for (i = 1; i < xn; i++) + d *= Bi; + + if (d >= B) + return -1; + + /* Compare floor(d) to top limb, subtract and cancel when equal. */ + for (i = xn; i-- > 0;) + { + mp_limb_t f, xl; + + f = (mp_limb_t) d; + xl = x->_mp_d[i]; + if (xl > f) + return 1; + else if (xl < f) + return -1; + d = B * (d - f); + } + } + return - (d > 0.0); +} + +int +mpz_cmp_d (const mpz_t x, double d) +{ + if (x->_mp_size < 0) + { + if (d >= 0.0) + return -1; + else + return -mpz_cmpabs_d (x, d); + } + else + { + if (d < 0.0) + return 1; + else + return mpz_cmpabs_d (x, d); + } +} + + +/* MPZ comparisons and the like. */ +int +mpz_sgn (const mpz_t u) +{ + return GMP_CMP (u->_mp_size, 0); +} + +int +mpz_cmp_si (const mpz_t u, long v) +{ + mp_size_t usize = u->_mp_size; + + if (v >= 0) + return mpz_cmp_ui (u, v); + else if (usize >= 0) + return 1; + else + return - mpz_cmpabs_ui (u, GMP_NEG_CAST (unsigned long int, v)); +} + +int +mpz_cmp_ui (const mpz_t u, unsigned long v) +{ + mp_size_t usize = u->_mp_size; + + if (usize < 0) + return -1; + else + return mpz_cmpabs_ui (u, v); +} + +int +mpz_cmp (const mpz_t a, const mpz_t b) +{ + mp_size_t asize = a->_mp_size; + mp_size_t bsize = b->_mp_size; + + if (asize != bsize) + return (asize < bsize) ? -1 : 1; + else if (asize >= 0) + return mpn_cmp (a->_mp_d, b->_mp_d, asize); + else + return mpn_cmp (b->_mp_d, a->_mp_d, -asize); +} + +int +mpz_cmpabs_ui (const mpz_t u, unsigned long v) +{ + mp_size_t un = GMP_ABS (u->_mp_size); + + if (! mpn_absfits_ulong_p (u->_mp_d, un)) + return 1; + else + { + unsigned long uu = mpz_get_ui (u); + return GMP_CMP(uu, v); + } +} + +int +mpz_cmpabs (const mpz_t u, const mpz_t v) +{ + return mpn_cmp4 (u->_mp_d, GMP_ABS (u->_mp_size), + v->_mp_d, GMP_ABS (v->_mp_size)); +} + +void +mpz_abs (mpz_t r, const mpz_t u) +{ + mpz_set (r, u); + r->_mp_size = GMP_ABS (r->_mp_size); +} + +void +mpz_neg (mpz_t r, const mpz_t u) +{ + mpz_set (r, u); + r->_mp_size = -r->_mp_size; +} + +void +mpz_swap (mpz_t u, mpz_t v) +{ + MP_SIZE_T_SWAP (u->_mp_alloc, v->_mp_alloc); + MPN_PTR_SWAP (u->_mp_d, u->_mp_size, v->_mp_d, v->_mp_size); +} + + +/* MPZ addition and subtraction */ + + +void +mpz_add_ui (mpz_t r, const mpz_t a, unsigned long b) +{ + mpz_t bb; + mpz_init_set_ui (bb, b); + mpz_add (r, a, bb); + mpz_clear (bb); +} + +void +mpz_sub_ui (mpz_t r, const mpz_t a, unsigned long b) +{ + mpz_ui_sub (r, b, a); + mpz_neg (r, r); +} + +void +mpz_ui_sub (mpz_t r, unsigned long a, const mpz_t b) +{ + mpz_neg (r, b); + mpz_add_ui (r, r, a); +} + +static mp_size_t +mpz_abs_add (mpz_t r, const mpz_t a, const mpz_t b) +{ + mp_size_t an = GMP_ABS (a->_mp_size); + mp_size_t bn = GMP_ABS (b->_mp_size); + mp_ptr rp; + mp_limb_t cy; + + if (an < bn) + { + MPZ_SRCPTR_SWAP (a, b); + MP_SIZE_T_SWAP (an, bn); + } + + rp = MPZ_REALLOC (r, an + 1); + cy = mpn_add (rp, a->_mp_d, an, b->_mp_d, bn); + + rp[an] = cy; + + return an + cy; +} + +static mp_size_t +mpz_abs_sub (mpz_t r, const mpz_t a, const mpz_t b) +{ + mp_size_t an = GMP_ABS (a->_mp_size); + mp_size_t bn = GMP_ABS (b->_mp_size); + int cmp; + mp_ptr rp; + + cmp = mpn_cmp4 (a->_mp_d, an, b->_mp_d, bn); + if (cmp > 0) + { + rp = MPZ_REALLOC (r, an); + gmp_assert_nocarry (mpn_sub (rp, a->_mp_d, an, b->_mp_d, bn)); + return mpn_normalized_size (rp, an); + } + else if (cmp < 0) + { + rp = MPZ_REALLOC (r, bn); + gmp_assert_nocarry (mpn_sub (rp, b->_mp_d, bn, a->_mp_d, an)); + return -mpn_normalized_size (rp, bn); + } + else + return 0; +} + +void +mpz_add (mpz_t r, const mpz_t a, const mpz_t b) +{ + mp_size_t rn; + + if ( (a->_mp_size ^ b->_mp_size) >= 0) + rn = mpz_abs_add (r, a, b); + else + rn = mpz_abs_sub (r, a, b); + + r->_mp_size = a->_mp_size >= 0 ? rn : - rn; +} + +void +mpz_sub (mpz_t r, const mpz_t a, const mpz_t b) +{ + mp_size_t rn; + + if ( (a->_mp_size ^ b->_mp_size) >= 0) + rn = mpz_abs_sub (r, a, b); + else + rn = mpz_abs_add (r, a, b); + + r->_mp_size = a->_mp_size >= 0 ? rn : - rn; +} + + +/* MPZ multiplication */ +void +mpz_mul_si (mpz_t r, const mpz_t u, long int v) +{ + if (v < 0) + { + mpz_mul_ui (r, u, GMP_NEG_CAST (unsigned long int, v)); + mpz_neg (r, r); + } + else + mpz_mul_ui (r, u, v); +} + +void +mpz_mul_ui (mpz_t r, const mpz_t u, unsigned long int v) +{ + mpz_t vv; + mpz_init_set_ui (vv, v); + mpz_mul (r, u, vv); + mpz_clear (vv); + return; +} + +void +mpz_mul (mpz_t r, const mpz_t u, const mpz_t v) +{ + int sign; + mp_size_t un, vn, rn; + mpz_t t; + mp_ptr tp; + + un = u->_mp_size; + vn = v->_mp_size; + + if (un == 0 || vn == 0) + { + r->_mp_size = 0; + return; + } + + sign = (un ^ vn) < 0; + + un = GMP_ABS (un); + vn = GMP_ABS (vn); + + mpz_init2 (t, (un + vn) * GMP_LIMB_BITS); + + tp = t->_mp_d; + if (un >= vn) + mpn_mul (tp, u->_mp_d, un, v->_mp_d, vn); + else + mpn_mul (tp, v->_mp_d, vn, u->_mp_d, un); + + rn = un + vn; + rn -= tp[rn-1] == 0; + + t->_mp_size = sign ? - rn : rn; + mpz_swap (r, t); + mpz_clear (t); +} + +void +mpz_mul_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t bits) +{ + mp_size_t un, rn; + mp_size_t limbs; + unsigned shift; + mp_ptr rp; + + un = GMP_ABS (u->_mp_size); + if (un == 0) + { + r->_mp_size = 0; + return; + } + + limbs = bits / GMP_LIMB_BITS; + shift = bits % GMP_LIMB_BITS; + + rn = un + limbs + (shift > 0); + rp = MPZ_REALLOC (r, rn); + if (shift > 0) + { + mp_limb_t cy = mpn_lshift (rp + limbs, u->_mp_d, un, shift); + rp[rn-1] = cy; + rn -= (cy == 0); + } + else + mpn_copyd (rp + limbs, u->_mp_d, un); + + mpn_zero (rp, limbs); + + r->_mp_size = (u->_mp_size < 0) ? - rn : rn; +} + +void +mpz_addmul_ui (mpz_t r, const mpz_t u, unsigned long int v) +{ + mpz_t t; + mpz_init_set_ui (t, v); + mpz_mul (t, u, t); + mpz_add (r, r, t); + mpz_clear (t); +} + +void +mpz_submul_ui (mpz_t r, const mpz_t u, unsigned long int v) +{ + mpz_t t; + mpz_init_set_ui (t, v); + mpz_mul (t, u, t); + mpz_sub (r, r, t); + mpz_clear (t); +} + +void +mpz_addmul (mpz_t r, const mpz_t u, const mpz_t v) +{ + mpz_t t; + mpz_init (t); + mpz_mul (t, u, v); + mpz_add (r, r, t); + mpz_clear (t); +} + +void +mpz_submul (mpz_t r, const mpz_t u, const mpz_t v) +{ + mpz_t t; + mpz_init (t); + mpz_mul (t, u, v); + mpz_sub (r, r, t); + mpz_clear (t); +} + + +/* MPZ division */ +enum mpz_div_round_mode { GMP_DIV_FLOOR, GMP_DIV_CEIL, GMP_DIV_TRUNC }; + +/* Allows q or r to be zero. Returns 1 iff remainder is non-zero. */ +static int +mpz_div_qr (mpz_t q, mpz_t r, + const mpz_t n, const mpz_t d, enum mpz_div_round_mode mode) +{ + mp_size_t ns, ds, nn, dn, qs; + ns = n->_mp_size; + ds = d->_mp_size; + + if (ds == 0) + gmp_die("mpz_div_qr: Divide by zero."); + + if (ns == 0) + { + if (q) + q->_mp_size = 0; + if (r) + r->_mp_size = 0; + return 0; + } + + nn = GMP_ABS (ns); + dn = GMP_ABS (ds); + + qs = ds ^ ns; + + if (nn < dn) + { + if (mode == GMP_DIV_CEIL && qs >= 0) + { + /* q = 1, r = n - d */ + if (r) + mpz_sub (r, n, d); + if (q) + mpz_set_ui (q, 1); + } + else if (mode == GMP_DIV_FLOOR && qs < 0) + { + /* q = -1, r = n + d */ + if (r) + mpz_add (r, n, d); + if (q) + mpz_set_si (q, -1); + } + else + { + /* q = 0, r = d */ + if (r) + mpz_set (r, n); + if (q) + q->_mp_size = 0; + } + return 1; + } + else + { + mp_ptr np, qp; + mp_size_t qn, rn; + mpz_t tq, tr; + + mpz_init_set (tr, n); + np = tr->_mp_d; + + qn = nn - dn + 1; + + if (q) + { + mpz_init2 (tq, qn * GMP_LIMB_BITS); + qp = tq->_mp_d; + } + else + qp = NULL; + + mpn_div_qr (qp, np, nn, d->_mp_d, dn); + + if (qp) + { + qn -= (qp[qn-1] == 0); + + tq->_mp_size = qs < 0 ? -qn : qn; + } + rn = mpn_normalized_size (np, dn); + tr->_mp_size = ns < 0 ? - rn : rn; + + if (mode == GMP_DIV_FLOOR && qs < 0 && rn != 0) + { + if (q) + mpz_sub_ui (tq, tq, 1); + if (r) + mpz_add (tr, tr, d); + } + else if (mode == GMP_DIV_CEIL && qs >= 0 && rn != 0) + { + if (q) + mpz_add_ui (tq, tq, 1); + if (r) + mpz_sub (tr, tr, d); + } + + if (q) + { + mpz_swap (tq, q); + mpz_clear (tq); + } + if (r) + mpz_swap (tr, r); + + mpz_clear (tr); + + return rn != 0; + } +} + +void +mpz_cdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (q, r, n, d, GMP_DIV_CEIL); +} + +void +mpz_fdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (q, r, n, d, GMP_DIV_FLOOR); +} + +void +mpz_tdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (q, r, n, d, GMP_DIV_TRUNC); +} + +void +mpz_cdiv_q (mpz_t q, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (q, NULL, n, d, GMP_DIV_CEIL); +} + +void +mpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (q, NULL, n, d, GMP_DIV_FLOOR); +} + +void +mpz_tdiv_q (mpz_t q, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (q, NULL, n, d, GMP_DIV_TRUNC); +} + +void +mpz_cdiv_r (mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (NULL, r, n, d, GMP_DIV_CEIL); +} + +void +mpz_fdiv_r (mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (NULL, r, n, d, GMP_DIV_FLOOR); +} + +void +mpz_tdiv_r (mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (NULL, r, n, d, GMP_DIV_TRUNC); +} + +void +mpz_mod (mpz_t r, const mpz_t n, const mpz_t d) +{ + mpz_div_qr (NULL, r, n, d, d->_mp_size >= 0 ? GMP_DIV_FLOOR : GMP_DIV_CEIL); +} + +static void +mpz_div_q_2exp (mpz_t q, const mpz_t u, mp_bitcnt_t bit_index, + enum mpz_div_round_mode mode) +{ + mp_size_t un, qn; + mp_size_t limb_cnt; + mp_ptr qp; + int adjust; + + un = u->_mp_size; + if (un == 0) + { + q->_mp_size = 0; + return; + } + limb_cnt = bit_index / GMP_LIMB_BITS; + qn = GMP_ABS (un) - limb_cnt; + bit_index %= GMP_LIMB_BITS; + + if (mode == ((un > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* un != 0 here. */ + /* Note: Below, the final indexing at limb_cnt is valid because at + that point we have qn > 0. */ + adjust = (qn <= 0 + || !mpn_zero_p (u->_mp_d, limb_cnt) + || (u->_mp_d[limb_cnt] + & (((mp_limb_t) 1 << bit_index) - 1))); + else + adjust = 0; + + if (qn <= 0) + qn = 0; + else + { + qp = MPZ_REALLOC (q, qn); + + if (bit_index != 0) + { + mpn_rshift (qp, u->_mp_d + limb_cnt, qn, bit_index); + qn -= qp[qn - 1] == 0; + } + else + { + mpn_copyi (qp, u->_mp_d + limb_cnt, qn); + } + } + + q->_mp_size = qn; + + if (adjust) + mpz_add_ui (q, q, 1); + if (un < 0) + mpz_neg (q, q); +} + +static void +mpz_div_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t bit_index, + enum mpz_div_round_mode mode) +{ + mp_size_t us, un, rn; + mp_ptr rp; + mp_limb_t mask; + + us = u->_mp_size; + if (us == 0 || bit_index == 0) + { + r->_mp_size = 0; + return; + } + rn = (bit_index + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS; + assert (rn > 0); + + rp = MPZ_REALLOC (r, rn); + un = GMP_ABS (us); + + mask = GMP_LIMB_MAX >> (rn * GMP_LIMB_BITS - bit_index); + + if (rn > un) + { + /* Quotient (with truncation) is zero, and remainder is + non-zero */ + if (mode == ((us > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* us != 0 here. */ + { + /* Have to negate and sign extend. */ + mp_size_t i; + + gmp_assert_nocarry (! mpn_neg (rp, u->_mp_d, un)); + for (i = un; i < rn - 1; i++) + rp[i] = GMP_LIMB_MAX; + + rp[rn-1] = mask; + us = -us; + } + else + { + /* Just copy */ + if (r != u) + mpn_copyi (rp, u->_mp_d, un); + + rn = un; + } + } + else + { + if (r != u) + mpn_copyi (rp, u->_mp_d, rn - 1); + + rp[rn-1] = u->_mp_d[rn-1] & mask; + + if (mode == ((us > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* us != 0 here. */ + { + /* If r != 0, compute 2^{bit_count} - r. */ + mpn_neg (rp, rp, rn); + + rp[rn-1] &= mask; + + /* us is not used for anything else, so we can modify it + here to indicate flipped sign. */ + us = -us; + } + } + rn = mpn_normalized_size (rp, rn); + r->_mp_size = us < 0 ? -rn : rn; +} + +void +mpz_cdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt) +{ + mpz_div_q_2exp (r, u, cnt, GMP_DIV_CEIL); +} + +void +mpz_fdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt) +{ + mpz_div_q_2exp (r, u, cnt, GMP_DIV_FLOOR); +} + +void +mpz_tdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt) +{ + mpz_div_q_2exp (r, u, cnt, GMP_DIV_TRUNC); +} + +void +mpz_cdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt) +{ + mpz_div_r_2exp (r, u, cnt, GMP_DIV_CEIL); +} + +void +mpz_fdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt) +{ + mpz_div_r_2exp (r, u, cnt, GMP_DIV_FLOOR); +} + +void +mpz_tdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt) +{ + mpz_div_r_2exp (r, u, cnt, GMP_DIV_TRUNC); +} + +void +mpz_divexact (mpz_t q, const mpz_t n, const mpz_t d) +{ + gmp_assert_nocarry (mpz_div_qr (q, NULL, n, d, GMP_DIV_TRUNC)); +} + +int +mpz_divisible_p (const mpz_t n, const mpz_t d) +{ + return mpz_div_qr (NULL, NULL, n, d, GMP_DIV_TRUNC) == 0; +} + +int +mpz_congruent_p (const mpz_t a, const mpz_t b, const mpz_t m) +{ + mpz_t t; + int res; + + /* a == b (mod 0) iff a == b */ + if (mpz_sgn (m) == 0) + return (mpz_cmp (a, b) == 0); + + mpz_init (t); + mpz_sub (t, a, b); + res = mpz_divisible_p (t, m); + mpz_clear (t); + + return res; +} + +static unsigned long +mpz_div_qr_ui (mpz_t q, mpz_t r, + const mpz_t n, unsigned long d, enum mpz_div_round_mode mode) +{ + unsigned long ret; + mpz_t rr, dd; + + mpz_init (rr); + mpz_init_set_ui (dd, d); + mpz_div_qr (q, rr, n, dd, mode); + mpz_clear (dd); + ret = mpz_get_ui (rr); + + if (r) + mpz_swap (r, rr); + mpz_clear (rr); + + return ret; +} + +unsigned long +mpz_cdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (q, r, n, d, GMP_DIV_CEIL); +} + +unsigned long +mpz_fdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (q, r, n, d, GMP_DIV_FLOOR); +} + +unsigned long +mpz_tdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (q, r, n, d, GMP_DIV_TRUNC); +} + +unsigned long +mpz_cdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_CEIL); +} + +unsigned long +mpz_fdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_FLOOR); +} + +unsigned long +mpz_tdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_TRUNC); +} + +unsigned long +mpz_cdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_CEIL); +} +unsigned long +mpz_fdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_FLOOR); +} +unsigned long +mpz_tdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_TRUNC); +} + +unsigned long +mpz_cdiv_ui (const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_CEIL); +} + +unsigned long +mpz_fdiv_ui (const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_FLOOR); +} + +unsigned long +mpz_tdiv_ui (const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_TRUNC); +} + +unsigned long +mpz_mod_ui (mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_FLOOR); +} + +void +mpz_divexact_ui (mpz_t q, const mpz_t n, unsigned long d) +{ + gmp_assert_nocarry (mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_TRUNC)); +} + +int +mpz_divisible_ui_p (const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_TRUNC) == 0; +} + + +/* GCD */ +static mp_limb_t +mpn_gcd_11 (mp_limb_t u, mp_limb_t v) +{ + unsigned shift; + + assert ( (u | v) > 0); + + if (u == 0) + return v; + else if (v == 0) + return u; + + gmp_ctz (shift, u | v); + + u >>= shift; + v >>= shift; + + if ( (u & 1) == 0) + MP_LIMB_T_SWAP (u, v); + + while ( (v & 1) == 0) + v >>= 1; + + while (u != v) + { + if (u > v) + { + u -= v; + do + u >>= 1; + while ( (u & 1) == 0); + } + else + { + v -= u; + do + v >>= 1; + while ( (v & 1) == 0); + } + } + return u << shift; +} + +mp_size_t +mpn_gcd (mp_ptr rp, mp_ptr up, mp_size_t un, mp_ptr vp, mp_size_t vn) +{ + assert (un >= vn); + assert (vn > 0); + assert (!GMP_MPN_OVERLAP_P (up, un, vp, vn)); + assert (vp[vn-1] > 0); + assert ((up[0] | vp[0]) & 1); + + if (un > vn) + mpn_div_qr (NULL, up, un, vp, vn); + + un = mpn_normalized_size (up, vn); + if (un == 0) + { + mpn_copyi (rp, vp, vn); + return vn; + } + + if (!(vp[0] & 1)) + MPN_PTR_SWAP (up, un, vp, vn); + + while (un > 1 || vn > 1) + { + int shift; + assert (vp[0] & 1); + + while (up[0] == 0) + { + up++; + un--; + } + gmp_ctz (shift, up[0]); + if (shift > 0) + { + gmp_assert_nocarry (mpn_rshift(up, up, un, shift)); + un -= (up[un-1] == 0); + } + + if (un < vn) + MPN_PTR_SWAP (up, un, vp, vn); + else if (un == vn) + { + int c = mpn_cmp (up, vp, un); + if (c == 0) + { + mpn_copyi (rp, up, un); + return un; + } + else if (c < 0) + MP_PTR_SWAP (up, vp); + } + + gmp_assert_nocarry (mpn_sub (up, up, un, vp, vn)); + un = mpn_normalized_size (up, un); + } + rp[0] = mpn_gcd_11 (up[0], vp[0]); + return 1; +} + +unsigned long +mpz_gcd_ui (mpz_t g, const mpz_t u, unsigned long v) +{ + mpz_t t; + mpz_init_set_ui(t, v); + mpz_gcd (t, u, t); + if (v > 0) + v = mpz_get_ui (t); + + if (g) + mpz_swap (t, g); + + mpz_clear (t); + + return v; +} + +static mp_bitcnt_t +mpz_make_odd (mpz_t r) +{ + mp_bitcnt_t shift; + + assert (r->_mp_size > 0); + /* Count trailing zeros, equivalent to mpn_scan1, because we know that there is a 1 */ + shift = mpn_scan1 (r->_mp_d, 0); + mpz_tdiv_q_2exp (r, r, shift); + + return shift; +} + +void +mpz_gcd (mpz_t g, const mpz_t u, const mpz_t v) +{ + mpz_t tu, tv; + mp_bitcnt_t uz, vz, gz; + + if (u->_mp_size == 0) + { + mpz_abs (g, v); + return; + } + if (v->_mp_size == 0) + { + mpz_abs (g, u); + return; + } + + mpz_init (tu); + mpz_init (tv); + + mpz_abs (tu, u); + uz = mpz_make_odd (tu); + mpz_abs (tv, v); + vz = mpz_make_odd (tv); + gz = GMP_MIN (uz, vz); + + if (tu->_mp_size < tv->_mp_size) + mpz_swap (tu, tv); + + tu->_mp_size = mpn_gcd (tu->_mp_d, tu->_mp_d, tu->_mp_size, tv->_mp_d, tv->_mp_size); + mpz_mul_2exp (g, tu, gz); + + mpz_clear (tu); + mpz_clear (tv); +} + +void +mpz_gcdext (mpz_t g, mpz_t s, mpz_t t, const mpz_t u, const mpz_t v) +{ + mpz_t tu, tv, s0, s1, t0, t1; + mp_bitcnt_t uz, vz, gz; + mp_bitcnt_t power; + int cmp; + + if (u->_mp_size == 0) + { + /* g = 0 u + sgn(v) v */ + signed long sign = mpz_sgn (v); + mpz_abs (g, v); + if (s) + s->_mp_size = 0; + if (t) + mpz_set_si (t, sign); + return; + } + + if (v->_mp_size == 0) + { + /* g = sgn(u) u + 0 v */ + signed long sign = mpz_sgn (u); + mpz_abs (g, u); + if (s) + mpz_set_si (s, sign); + if (t) + t->_mp_size = 0; + return; + } + + mpz_init (tu); + mpz_init (tv); + mpz_init (s0); + mpz_init (s1); + mpz_init (t0); + mpz_init (t1); + + mpz_abs (tu, u); + uz = mpz_make_odd (tu); + mpz_abs (tv, v); + vz = mpz_make_odd (tv); + gz = GMP_MIN (uz, vz); + + uz -= gz; + vz -= gz; + + /* Cofactors corresponding to odd gcd. gz handled later. */ + if (tu->_mp_size < tv->_mp_size) + { + mpz_swap (tu, tv); + MPZ_SRCPTR_SWAP (u, v); + MPZ_PTR_SWAP (s, t); + MP_BITCNT_T_SWAP (uz, vz); + } + + /* Maintain + * + * u = t0 tu + t1 tv + * v = s0 tu + s1 tv + * + * where u and v denote the inputs with common factors of two + * eliminated, and det (s0, t0; s1, t1) = 2^p. Then + * + * 2^p tu = s1 u - t1 v + * 2^p tv = -s0 u + t0 v + */ + + /* After initial division, tu = q tv + tu', we have + * + * u = 2^uz (tu' + q tv) + * v = 2^vz tv + * + * or + * + * t0 = 2^uz, t1 = 2^uz q + * s0 = 0, s1 = 2^vz + */ + + mpz_tdiv_qr (t1, tu, tu, tv); + mpz_mul_2exp (t1, t1, uz); + + mpz_setbit (s1, vz); + power = uz + vz; + + if (tu->_mp_size > 0) + { + mp_bitcnt_t shift; + shift = mpz_make_odd (tu); + mpz_setbit (t0, uz + shift); + power += shift; + + for (;;) + { + int c; + c = mpz_cmp (tu, tv); + if (c == 0) + break; + + if (c < 0) + { + /* tv = tv' + tu + * + * u = t0 tu + t1 (tv' + tu) = (t0 + t1) tu + t1 tv' + * v = s0 tu + s1 (tv' + tu) = (s0 + s1) tu + s1 tv' */ + + mpz_sub (tv, tv, tu); + mpz_add (t0, t0, t1); + mpz_add (s0, s0, s1); + + shift = mpz_make_odd (tv); + mpz_mul_2exp (t1, t1, shift); + mpz_mul_2exp (s1, s1, shift); + } + else + { + mpz_sub (tu, tu, tv); + mpz_add (t1, t0, t1); + mpz_add (s1, s0, s1); + + shift = mpz_make_odd (tu); + mpz_mul_2exp (t0, t0, shift); + mpz_mul_2exp (s0, s0, shift); + } + power += shift; + } + } + else + mpz_setbit (t0, uz); + + /* Now tv = odd part of gcd, and -s0 and t0 are corresponding + cofactors. */ + + mpz_mul_2exp (tv, tv, gz); + mpz_neg (s0, s0); + + /* 2^p g = s0 u + t0 v. Eliminate one factor of two at a time. To + adjust cofactors, we need u / g and v / g */ + + mpz_divexact (s1, v, tv); + mpz_abs (s1, s1); + mpz_divexact (t1, u, tv); + mpz_abs (t1, t1); + + while (power-- > 0) + { + /* s0 u + t0 v = (s0 - v/g) u - (t0 + u/g) v */ + if (mpz_odd_p (s0) || mpz_odd_p (t0)) + { + mpz_sub (s0, s0, s1); + mpz_add (t0, t0, t1); + } + assert (mpz_even_p (t0) && mpz_even_p (s0)); + mpz_tdiv_q_2exp (s0, s0, 1); + mpz_tdiv_q_2exp (t0, t0, 1); + } + + /* Choose small cofactors (they should generally satify + + |s| < |u| / 2g and |t| < |v| / 2g, + + with some documented exceptions). Always choose the smallest s, + if there are two choices for s with same absolute value, choose + the one with smallest corresponding t (this asymmetric condition + is needed to prefer s = 0, |t| = 1 when g = |a| = |b|). */ + mpz_add (s1, s0, s1); + mpz_sub (t1, t0, t1); + cmp = mpz_cmpabs (s0, s1); + if (cmp > 0 || (cmp == 0 && mpz_cmpabs (t0, t1) > 0)) + { + mpz_swap (s0, s1); + mpz_swap (t0, t1); + } + if (u->_mp_size < 0) + mpz_neg (s0, s0); + if (v->_mp_size < 0) + mpz_neg (t0, t0); + + mpz_swap (g, tv); + if (s) + mpz_swap (s, s0); + if (t) + mpz_swap (t, t0); + + mpz_clear (tu); + mpz_clear (tv); + mpz_clear (s0); + mpz_clear (s1); + mpz_clear (t0); + mpz_clear (t1); +} + +void +mpz_lcm (mpz_t r, const mpz_t u, const mpz_t v) +{ + mpz_t g; + + if (u->_mp_size == 0 || v->_mp_size == 0) + { + r->_mp_size = 0; + return; + } + + mpz_init (g); + + mpz_gcd (g, u, v); + mpz_divexact (g, u, g); + mpz_mul (r, g, v); + + mpz_clear (g); + mpz_abs (r, r); +} + +void +mpz_lcm_ui (mpz_t r, const mpz_t u, unsigned long v) +{ + if (v == 0 || u->_mp_size == 0) + { + r->_mp_size = 0; + return; + } + + v /= mpz_gcd_ui (NULL, u, v); + mpz_mul_ui (r, u, v); + + mpz_abs (r, r); +} + +int +mpz_invert (mpz_t r, const mpz_t u, const mpz_t m) +{ + mpz_t g, tr; + int invertible; + + if (u->_mp_size == 0 || mpz_cmpabs_ui (m, 1) <= 0) + return 0; + + mpz_init (g); + mpz_init (tr); + + mpz_gcdext (g, tr, NULL, u, m); + invertible = (mpz_cmp_ui (g, 1) == 0); + + if (invertible) + { + if (tr->_mp_size < 0) + { + if (m->_mp_size >= 0) + mpz_add (tr, tr, m); + else + mpz_sub (tr, tr, m); + } + mpz_swap (r, tr); + } + + mpz_clear (g); + mpz_clear (tr); + return invertible; +} + + +/* Higher level operations (sqrt, pow and root) */ + +void +mpz_pow_ui (mpz_t r, const mpz_t b, unsigned long e) +{ + unsigned long bit; + mpz_t tr; + mpz_init_set_ui (tr, 1); + + bit = GMP_ULONG_HIGHBIT; + do + { + mpz_mul (tr, tr, tr); + if (e & bit) + mpz_mul (tr, tr, b); + bit >>= 1; + } + while (bit > 0); + + mpz_swap (r, tr); + mpz_clear (tr); +} + +void +mpz_ui_pow_ui (mpz_t r, unsigned long blimb, unsigned long e) +{ + mpz_t b; + + mpz_init_set_ui (b, blimb); + mpz_pow_ui (r, b, e); + mpz_clear (b); +} + +void +mpz_powm (mpz_t r, const mpz_t b, const mpz_t e, const mpz_t m) +{ + mpz_t tr; + mpz_t base; + mp_size_t en, mn; + mp_srcptr mp; + struct gmp_div_inverse minv; + unsigned shift; + mp_ptr tp = NULL; + + en = GMP_ABS (e->_mp_size); + mn = GMP_ABS (m->_mp_size); + if (mn == 0) + gmp_die ("mpz_powm: Zero modulo."); + + if (en == 0) + { + mpz_set_ui (r, mpz_cmpabs_ui (m, 1)); + return; + } + + mp = m->_mp_d; + mpn_div_qr_invert (&minv, mp, mn); + shift = minv.shift; + + if (shift > 0) + { + /* To avoid shifts, we do all our reductions, except the final + one, using a *normalized* m. */ + minv.shift = 0; + + tp = gmp_alloc_limbs (mn); + gmp_assert_nocarry (mpn_lshift (tp, mp, mn, shift)); + mp = tp; + } + + mpz_init (base); + + if (e->_mp_size < 0) + { + if (!mpz_invert (base, b, m)) + gmp_die ("mpz_powm: Negative exponent and non-invertible base."); + } + else + { + mp_size_t bn; + mpz_abs (base, b); + + bn = base->_mp_size; + if (bn >= mn) + { + mpn_div_qr_preinv (NULL, base->_mp_d, base->_mp_size, mp, mn, &minv); + bn = mn; + } + + /* We have reduced the absolute value. Now take care of the + sign. Note that we get zero represented non-canonically as + m. */ + if (b->_mp_size < 0) + { + mp_ptr bp = MPZ_REALLOC (base, mn); + gmp_assert_nocarry (mpn_sub (bp, mp, mn, bp, bn)); + bn = mn; + } + base->_mp_size = mpn_normalized_size (base->_mp_d, bn); + } + mpz_init_set_ui (tr, 1); + + while (--en >= 0) + { + mp_limb_t w = e->_mp_d[en]; + mp_limb_t bit; + + bit = GMP_LIMB_HIGHBIT; + do + { + mpz_mul (tr, tr, tr); + if (w & bit) + mpz_mul (tr, tr, base); + if (tr->_mp_size > mn) + { + mpn_div_qr_preinv (NULL, tr->_mp_d, tr->_mp_size, mp, mn, &minv); + tr->_mp_size = mpn_normalized_size (tr->_mp_d, mn); + } + bit >>= 1; + } + while (bit > 0); + } + + /* Final reduction */ + if (tr->_mp_size >= mn) + { + minv.shift = shift; + mpn_div_qr_preinv (NULL, tr->_mp_d, tr->_mp_size, mp, mn, &minv); + tr->_mp_size = mpn_normalized_size (tr->_mp_d, mn); + } + if (tp) + gmp_free_limbs (tp, mn); + + mpz_swap (r, tr); + mpz_clear (tr); + mpz_clear (base); +} + +void +mpz_powm_ui (mpz_t r, const mpz_t b, unsigned long elimb, const mpz_t m) +{ + mpz_t e; + + mpz_init_set_ui (e, elimb); + mpz_powm (r, b, e, m); + mpz_clear (e); +} + +/* x=trunc(y^(1/z)), r=y-x^z */ +void +mpz_rootrem (mpz_t x, mpz_t r, const mpz_t y, unsigned long z) +{ + int sgn; + mp_bitcnt_t bc; + mpz_t t, u; + + sgn = y->_mp_size < 0; + if ((~z & sgn) != 0) + gmp_die ("mpz_rootrem: Negative argument, with even root."); + if (z == 0) + gmp_die ("mpz_rootrem: Zeroth root."); + + if (mpz_cmpabs_ui (y, 1) <= 0) { + if (x) + mpz_set (x, y); + if (r) + r->_mp_size = 0; + return; + } + + mpz_init (u); + mpz_init (t); + bc = (mpz_sizeinbase (y, 2) - 1) / z + 1; + mpz_setbit (t, bc); + + if (z == 2) /* simplify sqrt loop: z-1 == 1 */ + do { + mpz_swap (u, t); /* u = x */ + mpz_tdiv_q (t, y, u); /* t = y/x */ + mpz_add (t, t, u); /* t = y/x + x */ + mpz_tdiv_q_2exp (t, t, 1); /* x'= (y/x + x)/2 */ + } while (mpz_cmpabs (t, u) < 0); /* |x'| < |x| */ + else /* z != 2 */ { + mpz_t v; + + mpz_init (v); + if (sgn) + mpz_neg (t, t); + + do { + mpz_swap (u, t); /* u = x */ + mpz_pow_ui (t, u, z - 1); /* t = x^(z-1) */ + mpz_tdiv_q (t, y, t); /* t = y/x^(z-1) */ + mpz_mul_ui (v, u, z - 1); /* v = x*(z-1) */ + mpz_add (t, t, v); /* t = y/x^(z-1) + x*(z-1) */ + mpz_tdiv_q_ui (t, t, z); /* x'=(y/x^(z-1) + x*(z-1))/z */ + } while (mpz_cmpabs (t, u) < 0); /* |x'| < |x| */ + + mpz_clear (v); + } + + if (r) { + mpz_pow_ui (t, u, z); + mpz_sub (r, y, t); + } + if (x) + mpz_swap (x, u); + mpz_clear (u); + mpz_clear (t); +} + +int +mpz_root (mpz_t x, const mpz_t y, unsigned long z) +{ + int res; + mpz_t r; + + mpz_init (r); + mpz_rootrem (x, r, y, z); + res = r->_mp_size == 0; + mpz_clear (r); + + return res; +} + +/* Compute s = floor(sqrt(u)) and r = u - s^2. Allows r == NULL */ +void +mpz_sqrtrem (mpz_t s, mpz_t r, const mpz_t u) +{ + mpz_rootrem (s, r, u, 2); +} + +void +mpz_sqrt (mpz_t s, const mpz_t u) +{ + mpz_rootrem (s, NULL, u, 2); +} + +int +mpz_perfect_square_p (const mpz_t u) +{ + if (u->_mp_size <= 0) + return (u->_mp_size == 0); + else + return mpz_root (NULL, u, 2); +} + +int +mpn_perfect_square_p (mp_srcptr p, mp_size_t n) +{ + mpz_t t; + + assert (n > 0); + assert (p [n-1] != 0); + return mpz_root (NULL, mpz_roinit_normal_n (t, p, n), 2); +} + +mp_size_t +mpn_sqrtrem (mp_ptr sp, mp_ptr rp, mp_srcptr p, mp_size_t n) +{ + mpz_t s, r, u; + mp_size_t res; + + assert (n > 0); + assert (p [n-1] != 0); + + mpz_init (r); + mpz_init (s); + mpz_rootrem (s, r, mpz_roinit_normal_n (u, p, n), 2); + + assert (s->_mp_size == (n+1)/2); + mpn_copyd (sp, s->_mp_d, s->_mp_size); + mpz_clear (s); + res = r->_mp_size; + if (rp) + mpn_copyd (rp, r->_mp_d, res); + mpz_clear (r); + return res; +} + +/* Combinatorics */ + +void +mpz_mfac_uiui (mpz_t x, unsigned long n, unsigned long m) +{ + mpz_set_ui (x, n + (n == 0)); + if (m + 1 < 2) return; + while (n > m + 1) + mpz_mul_ui (x, x, n -= m); +} + +void +mpz_2fac_ui (mpz_t x, unsigned long n) +{ + mpz_mfac_uiui (x, n, 2); +} + +void +mpz_fac_ui (mpz_t x, unsigned long n) +{ + mpz_mfac_uiui (x, n, 1); +} + +void +mpz_bin_uiui (mpz_t r, unsigned long n, unsigned long k) +{ + mpz_t t; + + mpz_set_ui (r, k <= n); + + if (k > (n >> 1)) + k = (k <= n) ? n - k : 0; + + mpz_init (t); + mpz_fac_ui (t, k); + + for (; k > 0; --k) + mpz_mul_ui (r, r, n--); + + mpz_divexact (r, r, t); + mpz_clear (t); +} + + +/* Primality testing */ + +/* Computes Kronecker (a/b) with odd b, a!=0 and GCD(a,b) = 1 */ +/* Adapted from JACOBI_BASE_METHOD==4 in mpn/generic/jacbase.c */ +static int +gmp_jacobi_coprime (mp_limb_t a, mp_limb_t b) +{ + int c, bit = 0; + + assert (b & 1); + assert (a != 0); + /* assert (mpn_gcd_11 (a, b) == 1); */ + + /* Below, we represent a and b shifted right so that the least + significant one bit is implicit. */ + b >>= 1; + + gmp_ctz(c, a); + a >>= 1; + + for (;;) + { + a >>= c; + /* (2/b) = -1 if b = 3 or 5 mod 8 */ + bit ^= c & (b ^ (b >> 1)); + if (a < b) + { + if (a == 0) + return bit & 1 ? -1 : 1; + bit ^= a & b; + a = b - a; + b -= a; + } + else + { + a -= b; + assert (a != 0); + } + + gmp_ctz(c, a); + ++c; + } +} + +static void +gmp_lucas_step_k_2k (mpz_t V, mpz_t Qk, const mpz_t n) +{ + mpz_mod (Qk, Qk, n); + /* V_{2k} <- V_k ^ 2 - 2Q^k */ + mpz_mul (V, V, V); + mpz_submul_ui (V, Qk, 2); + mpz_tdiv_r (V, V, n); + /* Q^{2k} = (Q^k)^2 */ + mpz_mul (Qk, Qk, Qk); +} + +/* Computes V_k, Q^k (mod n) for the Lucas' sequence */ +/* with P=1, Q=Q; k = (n>>b0)|1. */ +/* Requires an odd n > 4; b0 > 0; -2*Q must not overflow a long */ +/* Returns (U_k == 0) and sets V=V_k and Qk=Q^k. */ +static int +gmp_lucas_mod (mpz_t V, mpz_t Qk, long Q, + mp_bitcnt_t b0, const mpz_t n) +{ + mp_bitcnt_t bs; + mpz_t U; + int res; + + assert (b0 > 0); + assert (Q <= - (LONG_MIN / 2)); + assert (Q >= - (LONG_MAX / 2)); + assert (mpz_cmp_ui (n, 4) > 0); + assert (mpz_odd_p (n)); + + mpz_init_set_ui (U, 1); /* U1 = 1 */ + mpz_set_ui (V, 1); /* V1 = 1 */ + mpz_set_si (Qk, Q); + + for (bs = mpz_sizeinbase (n, 2) - 1; --bs >= b0;) + { + /* U_{2k} <- U_k * V_k */ + mpz_mul (U, U, V); + /* V_{2k} <- V_k ^ 2 - 2Q^k */ + /* Q^{2k} = (Q^k)^2 */ + gmp_lucas_step_k_2k (V, Qk, n); + + /* A step k->k+1 is performed if the bit in $n$ is 1 */ + /* mpz_tstbit(n,bs) or the bit is 0 in $n$ but */ + /* should be 1 in $n+1$ (bs == b0) */ + if (b0 == bs || mpz_tstbit (n, bs)) + { + /* Q^{k+1} <- Q^k * Q */ + mpz_mul_si (Qk, Qk, Q); + /* U_{k+1} <- (U_k + V_k) / 2 */ + mpz_swap (U, V); /* Keep in V the old value of U_k */ + mpz_add (U, U, V); + /* We have to compute U/2, so we need an even value, */ + /* equivalent (mod n) */ + if (mpz_odd_p (U)) + mpz_add (U, U, n); + mpz_tdiv_q_2exp (U, U, 1); + /* V_{k+1} <-(D*U_k + V_k) / 2 = + U_{k+1} + (D-1)/2*U_k = U_{k+1} - 2Q*U_k */ + mpz_mul_si (V, V, -2*Q); + mpz_add (V, U, V); + mpz_tdiv_r (V, V, n); + } + mpz_tdiv_r (U, U, n); + } + + res = U->_mp_size == 0; + mpz_clear (U); + return res; +} + +/* Performs strong Lucas' test on x, with parameters suggested */ +/* for the BPSW test. Qk is only passed to recycle a variable. */ +/* Requires GCD (x,6) = 1.*/ +static int +gmp_stronglucas (const mpz_t x, mpz_t Qk) +{ + mp_bitcnt_t b0; + mpz_t V, n; + mp_limb_t maxD, D; /* The absolute value is stored. */ + long Q; + mp_limb_t tl; + + /* Test on the absolute value. */ + mpz_roinit_normal_n (n, x->_mp_d, GMP_ABS (x->_mp_size)); + + assert (mpz_odd_p (n)); + /* assert (mpz_gcd_ui (NULL, n, 6) == 1); */ + if (mpz_root (Qk, n, 2)) + return 0; /* A square is composite. */ + + /* Check Ds up to square root (in case, n is prime) + or avoid overflows */ + maxD = (Qk->_mp_size == 1) ? Qk->_mp_d [0] - 1 : GMP_LIMB_MAX; + + D = 3; + /* Search a D such that (D/n) = -1 in the sequence 5,-7,9,-11,.. */ + /* For those Ds we have (D/n) = (n/|D|) */ + do + { + if (D >= maxD) + return 1 + (D != GMP_LIMB_MAX); /* (1 + ! ~ D) */ + D += 2; + tl = mpz_tdiv_ui (n, D); + if (tl == 0) + return 0; + } + while (gmp_jacobi_coprime (tl, D) == 1); + + mpz_init (V); + + /* n-(D/n) = n+1 = d*2^{b0}, with d = (n>>b0) | 1 */ + b0 = mpn_common_scan (~ n->_mp_d[0], 0, n->_mp_d, n->_mp_size, GMP_LIMB_MAX); + /* b0 = mpz_scan0 (n, 0); */ + + /* D= P^2 - 4Q; P = 1; Q = (1-D)/4 */ + Q = (D & 2) ? (long) (D >> 2) + 1 : -(long) (D >> 2); + + if (! gmp_lucas_mod (V, Qk, Q, b0, n)) /* If Ud != 0 */ + while (V->_mp_size != 0 && --b0 != 0) /* while Vk != 0 */ + /* V <- V ^ 2 - 2Q^k */ + /* Q^{2k} = (Q^k)^2 */ + gmp_lucas_step_k_2k (V, Qk, n); + + mpz_clear (V); + return (b0 != 0); +} + +static int +gmp_millerrabin (const mpz_t n, const mpz_t nm1, mpz_t y, + const mpz_t q, mp_bitcnt_t k) +{ + assert (k > 0); + + /* Caller must initialize y to the base. */ + mpz_powm (y, y, q, n); + + if (mpz_cmp_ui (y, 1) == 0 || mpz_cmp (y, nm1) == 0) + return 1; + + while (--k > 0) + { + mpz_powm_ui (y, y, 2, n); + if (mpz_cmp (y, nm1) == 0) + return 1; + } + return 0; +} + +/* This product is 0xc0cfd797, and fits in 32 bits. */ +#define GMP_PRIME_PRODUCT \ + (3UL*5UL*7UL*11UL*13UL*17UL*19UL*23UL*29UL) + +/* Bit (p+1)/2 is set, for each odd prime <= 61 */ +#define GMP_PRIME_MASK 0xc96996dcUL + +int +mpz_probab_prime_p (const mpz_t n, int reps) +{ + mpz_t nm1; + mpz_t q; + mpz_t y; + mp_bitcnt_t k; + int is_prime; + int j; + + /* Note that we use the absolute value of n only, for compatibility + with the real GMP. */ + if (mpz_even_p (n)) + return (mpz_cmpabs_ui (n, 2) == 0) ? 2 : 0; + + /* Above test excludes n == 0 */ + assert (n->_mp_size != 0); + + if (mpz_cmpabs_ui (n, 64) < 0) + return (GMP_PRIME_MASK >> (n->_mp_d[0] >> 1)) & 2; + + if (mpz_gcd_ui (NULL, n, GMP_PRIME_PRODUCT) != 1) + return 0; + + /* All prime factors are >= 31. */ + if (mpz_cmpabs_ui (n, 31*31) < 0) + return 2; + + mpz_init (nm1); + mpz_init (q); + + /* Find q and k, where q is odd and n = 1 + 2**k * q. */ + mpz_abs (nm1, n); + nm1->_mp_d[0] -= 1; + /* Count trailing zeros, equivalent to mpn_scan1, because we know that there is a 1 */ + k = mpn_scan1 (nm1->_mp_d, 0); + mpz_tdiv_q_2exp (q, nm1, k); + + /* BPSW test */ + mpz_init_set_ui (y, 2); + is_prime = gmp_millerrabin (n, nm1, y, q, k) && gmp_stronglucas (n, y); + reps -= 24; /* skip the first 24 repetitions */ + + /* Use Miller-Rabin, with a deterministic sequence of bases, a[j] = + j^2 + j + 41 using Euler's polynomial. We potentially stop early, + if a[j] >= n - 1. Since n >= 31*31, this can happen only if reps > + 30 (a[30] == 971 > 31*31 == 961). */ + + for (j = 0; is_prime & (j < reps); j++) + { + mpz_set_ui (y, (unsigned long) j*j+j+41); + if (mpz_cmp (y, nm1) >= 0) + { + /* Don't try any further bases. This "early" break does not affect + the result for any reasonable reps value (<=5000 was tested) */ + assert (j >= 30); + break; + } + is_prime = gmp_millerrabin (n, nm1, y, q, k); + } + mpz_clear (nm1); + mpz_clear (q); + mpz_clear (y); + + return is_prime; +} + + +/* Logical operations and bit manipulation. */ + +/* Numbers are treated as if represented in two's complement (and + infinitely sign extended). For a negative values we get the two's + complement from -x = ~x + 1, where ~ is bitwise complement. + Negation transforms + + xxxx10...0 + + into + + yyyy10...0 + + where yyyy is the bitwise complement of xxxx. So least significant + bits, up to and including the first one bit, are unchanged, and + the more significant bits are all complemented. + + To change a bit from zero to one in a negative number, subtract the + corresponding power of two from the absolute value. This can never + underflow. To change a bit from one to zero, add the corresponding + power of two, and this might overflow. E.g., if x = -001111, the + two's complement is 110001. Clearing the least significant bit, we + get two's complement 110000, and -010000. */ + +int +mpz_tstbit (const mpz_t d, mp_bitcnt_t bit_index) +{ + mp_size_t limb_index; + unsigned shift; + mp_size_t ds; + mp_size_t dn; + mp_limb_t w; + int bit; + + ds = d->_mp_size; + dn = GMP_ABS (ds); + limb_index = bit_index / GMP_LIMB_BITS; + if (limb_index >= dn) + return ds < 0; + + shift = bit_index % GMP_LIMB_BITS; + w = d->_mp_d[limb_index]; + bit = (w >> shift) & 1; + + if (ds < 0) + { + /* d < 0. Check if any of the bits below is set: If so, our bit + must be complemented. */ + if (shift > 0 && (mp_limb_t) (w << (GMP_LIMB_BITS - shift)) > 0) + return bit ^ 1; + while (--limb_index >= 0) + if (d->_mp_d[limb_index] > 0) + return bit ^ 1; + } + return bit; +} + +static void +mpz_abs_add_bit (mpz_t d, mp_bitcnt_t bit_index) +{ + mp_size_t dn, limb_index; + mp_limb_t bit; + mp_ptr dp; + + dn = GMP_ABS (d->_mp_size); + + limb_index = bit_index / GMP_LIMB_BITS; + bit = (mp_limb_t) 1 << (bit_index % GMP_LIMB_BITS); + + if (limb_index >= dn) + { + mp_size_t i; + /* The bit should be set outside of the end of the number. + We have to increase the size of the number. */ + dp = MPZ_REALLOC (d, limb_index + 1); + + dp[limb_index] = bit; + for (i = dn; i < limb_index; i++) + dp[i] = 0; + dn = limb_index + 1; + } + else + { + mp_limb_t cy; + + dp = d->_mp_d; + + cy = mpn_add_1 (dp + limb_index, dp + limb_index, dn - limb_index, bit); + if (cy > 0) + { + dp = MPZ_REALLOC (d, dn + 1); + dp[dn++] = cy; + } + } + + d->_mp_size = (d->_mp_size < 0) ? - dn : dn; +} + +static void +mpz_abs_sub_bit (mpz_t d, mp_bitcnt_t bit_index) +{ + mp_size_t dn, limb_index; + mp_ptr dp; + mp_limb_t bit; + + dn = GMP_ABS (d->_mp_size); + dp = d->_mp_d; + + limb_index = bit_index / GMP_LIMB_BITS; + bit = (mp_limb_t) 1 << (bit_index % GMP_LIMB_BITS); + + assert (limb_index < dn); + + gmp_assert_nocarry (mpn_sub_1 (dp + limb_index, dp + limb_index, + dn - limb_index, bit)); + dn = mpn_normalized_size (dp, dn); + d->_mp_size = (d->_mp_size < 0) ? - dn : dn; +} + +void +mpz_setbit (mpz_t d, mp_bitcnt_t bit_index) +{ + if (!mpz_tstbit (d, bit_index)) + { + if (d->_mp_size >= 0) + mpz_abs_add_bit (d, bit_index); + else + mpz_abs_sub_bit (d, bit_index); + } +} + +void +mpz_clrbit (mpz_t d, mp_bitcnt_t bit_index) +{ + if (mpz_tstbit (d, bit_index)) + { + if (d->_mp_size >= 0) + mpz_abs_sub_bit (d, bit_index); + else + mpz_abs_add_bit (d, bit_index); + } +} + +void +mpz_combit (mpz_t d, mp_bitcnt_t bit_index) +{ + if (mpz_tstbit (d, bit_index) ^ (d->_mp_size < 0)) + mpz_abs_sub_bit (d, bit_index); + else + mpz_abs_add_bit (d, bit_index); +} + +void +mpz_com (mpz_t r, const mpz_t u) +{ + mpz_add_ui (r, u, 1); + mpz_neg (r, r); +} + +void +mpz_and (mpz_t r, const mpz_t u, const mpz_t v) +{ + mp_size_t un, vn, rn, i; + mp_ptr up, vp, rp; + + mp_limb_t ux, vx, rx; + mp_limb_t uc, vc, rc; + mp_limb_t ul, vl, rl; + + un = GMP_ABS (u->_mp_size); + vn = GMP_ABS (v->_mp_size); + if (un < vn) + { + MPZ_SRCPTR_SWAP (u, v); + MP_SIZE_T_SWAP (un, vn); + } + if (vn == 0) + { + r->_mp_size = 0; + return; + } + + uc = u->_mp_size < 0; + vc = v->_mp_size < 0; + rc = uc & vc; + + ux = -uc; + vx = -vc; + rx = -rc; + + /* If the smaller input is positive, higher limbs don't matter. */ + rn = vx ? un : vn; + + rp = MPZ_REALLOC (r, rn + (mp_size_t) rc); + + up = u->_mp_d; + vp = v->_mp_d; + + i = 0; + do + { + ul = (up[i] ^ ux) + uc; + uc = ul < uc; + + vl = (vp[i] ^ vx) + vc; + vc = vl < vc; + + rl = ( (ul & vl) ^ rx) + rc; + rc = rl < rc; + rp[i] = rl; + } + while (++i < vn); + assert (vc == 0); + + for (; i < rn; i++) + { + ul = (up[i] ^ ux) + uc; + uc = ul < uc; + + rl = ( (ul & vx) ^ rx) + rc; + rc = rl < rc; + rp[i] = rl; + } + if (rc) + rp[rn++] = rc; + else + rn = mpn_normalized_size (rp, rn); + + r->_mp_size = rx ? -rn : rn; +} + +void +mpz_ior (mpz_t r, const mpz_t u, const mpz_t v) +{ + mp_size_t un, vn, rn, i; + mp_ptr up, vp, rp; + + mp_limb_t ux, vx, rx; + mp_limb_t uc, vc, rc; + mp_limb_t ul, vl, rl; + + un = GMP_ABS (u->_mp_size); + vn = GMP_ABS (v->_mp_size); + if (un < vn) + { + MPZ_SRCPTR_SWAP (u, v); + MP_SIZE_T_SWAP (un, vn); + } + if (vn == 0) + { + mpz_set (r, u); + return; + } + + uc = u->_mp_size < 0; + vc = v->_mp_size < 0; + rc = uc | vc; + + ux = -uc; + vx = -vc; + rx = -rc; + + /* If the smaller input is negative, by sign extension higher limbs + don't matter. */ + rn = vx ? vn : un; + + rp = MPZ_REALLOC (r, rn + (mp_size_t) rc); + + up = u->_mp_d; + vp = v->_mp_d; + + i = 0; + do + { + ul = (up[i] ^ ux) + uc; + uc = ul < uc; + + vl = (vp[i] ^ vx) + vc; + vc = vl < vc; + + rl = ( (ul | vl) ^ rx) + rc; + rc = rl < rc; + rp[i] = rl; + } + while (++i < vn); + assert (vc == 0); + + for (; i < rn; i++) + { + ul = (up[i] ^ ux) + uc; + uc = ul < uc; + + rl = ( (ul | vx) ^ rx) + rc; + rc = rl < rc; + rp[i] = rl; + } + if (rc) + rp[rn++] = rc; + else + rn = mpn_normalized_size (rp, rn); + + r->_mp_size = rx ? -rn : rn; +} + +void +mpz_xor (mpz_t r, const mpz_t u, const mpz_t v) +{ + mp_size_t un, vn, i; + mp_ptr up, vp, rp; + + mp_limb_t ux, vx, rx; + mp_limb_t uc, vc, rc; + mp_limb_t ul, vl, rl; + + un = GMP_ABS (u->_mp_size); + vn = GMP_ABS (v->_mp_size); + if (un < vn) + { + MPZ_SRCPTR_SWAP (u, v); + MP_SIZE_T_SWAP (un, vn); + } + if (vn == 0) + { + mpz_set (r, u); + return; + } + + uc = u->_mp_size < 0; + vc = v->_mp_size < 0; + rc = uc ^ vc; + + ux = -uc; + vx = -vc; + rx = -rc; + + rp = MPZ_REALLOC (r, un + (mp_size_t) rc); + + up = u->_mp_d; + vp = v->_mp_d; + + i = 0; + do + { + ul = (up[i] ^ ux) + uc; + uc = ul < uc; + + vl = (vp[i] ^ vx) + vc; + vc = vl < vc; + + rl = (ul ^ vl ^ rx) + rc; + rc = rl < rc; + rp[i] = rl; + } + while (++i < vn); + assert (vc == 0); + + for (; i < un; i++) + { + ul = (up[i] ^ ux) + uc; + uc = ul < uc; + + rl = (ul ^ ux) + rc; + rc = rl < rc; + rp[i] = rl; + } + if (rc) + rp[un++] = rc; + else + un = mpn_normalized_size (rp, un); + + r->_mp_size = rx ? -un : un; +} + +static unsigned +gmp_popcount_limb (mp_limb_t x) +{ + unsigned c; + + /* Do 16 bits at a time, to avoid limb-sized constants. */ + int LOCAL_SHIFT_BITS = 16; + for (c = 0; x > 0;) + { + unsigned w = x - ((x >> 1) & 0x5555); + w = ((w >> 2) & 0x3333) + (w & 0x3333); + w = (w >> 4) + w; + w = ((w >> 8) & 0x000f) + (w & 0x000f); + c += w; + if (GMP_LIMB_BITS > LOCAL_SHIFT_BITS) + x >>= LOCAL_SHIFT_BITS; + else + x = 0; + } + return c; +} + +mp_bitcnt_t +mpn_popcount (mp_srcptr p, mp_size_t n) +{ + mp_size_t i; + mp_bitcnt_t c; + + for (c = 0, i = 0; i < n; i++) + c += gmp_popcount_limb (p[i]); + + return c; +} + +mp_bitcnt_t +mpz_popcount (const mpz_t u) +{ + mp_size_t un; + + un = u->_mp_size; + + if (un < 0) + return ~(mp_bitcnt_t) 0; + + return mpn_popcount (u->_mp_d, un); +} + +mp_bitcnt_t +mpz_hamdist (const mpz_t u, const mpz_t v) +{ + mp_size_t un, vn, i; + mp_limb_t uc, vc, ul, vl, comp; + mp_srcptr up, vp; + mp_bitcnt_t c; + + un = u->_mp_size; + vn = v->_mp_size; + + if ( (un ^ vn) < 0) + return ~(mp_bitcnt_t) 0; + + comp = - (uc = vc = (un < 0)); + if (uc) + { + assert (vn < 0); + un = -un; + vn = -vn; + } + + up = u->_mp_d; + vp = v->_mp_d; + + if (un < vn) + MPN_SRCPTR_SWAP (up, un, vp, vn); + + for (i = 0, c = 0; i < vn; i++) + { + ul = (up[i] ^ comp) + uc; + uc = ul < uc; + + vl = (vp[i] ^ comp) + vc; + vc = vl < vc; + + c += gmp_popcount_limb (ul ^ vl); + } + assert (vc == 0); + + for (; i < un; i++) + { + ul = (up[i] ^ comp) + uc; + uc = ul < uc; + + c += gmp_popcount_limb (ul ^ comp); + } + + return c; +} + +mp_bitcnt_t +mpz_scan1 (const mpz_t u, mp_bitcnt_t starting_bit) +{ + mp_ptr up; + mp_size_t us, un, i; + mp_limb_t limb, ux; + + us = u->_mp_size; + un = GMP_ABS (us); + i = starting_bit / GMP_LIMB_BITS; + + /* Past the end there's no 1 bits for u>=0, or an immediate 1 bit + for u<0. Notice this test picks up any u==0 too. */ + if (i >= un) + return (us >= 0 ? ~(mp_bitcnt_t) 0 : starting_bit); + + up = u->_mp_d; + ux = 0; + limb = up[i]; + + if (starting_bit != 0) + { + if (us < 0) + { + ux = mpn_zero_p (up, i); + limb = ~ limb + ux; + ux = - (mp_limb_t) (limb >= ux); + } + + /* Mask to 0 all bits before starting_bit, thus ignoring them. */ + limb &= GMP_LIMB_MAX << (starting_bit % GMP_LIMB_BITS); + } + + return mpn_common_scan (limb, i, up, un, ux); +} + +mp_bitcnt_t +mpz_scan0 (const mpz_t u, mp_bitcnt_t starting_bit) +{ + mp_ptr up; + mp_size_t us, un, i; + mp_limb_t limb, ux; + + us = u->_mp_size; + ux = - (mp_limb_t) (us >= 0); + un = GMP_ABS (us); + i = starting_bit / GMP_LIMB_BITS; + + /* When past end, there's an immediate 0 bit for u>=0, or no 0 bits for + u<0. Notice this test picks up all cases of u==0 too. */ + if (i >= un) + return (ux ? starting_bit : ~(mp_bitcnt_t) 0); + + up = u->_mp_d; + limb = up[i] ^ ux; + + if (ux == 0) + limb -= mpn_zero_p (up, i); /* limb = ~(~limb + zero_p) */ + + /* Mask all bits before starting_bit, thus ignoring them. */ + limb &= GMP_LIMB_MAX << (starting_bit % GMP_LIMB_BITS); + + return mpn_common_scan (limb, i, up, un, ux); +} + + +/* MPZ base conversion. */ + +size_t +mpz_sizeinbase (const mpz_t u, int base) +{ + mp_size_t un, tn; + mp_srcptr up; + mp_ptr tp; + mp_bitcnt_t bits; + struct gmp_div_inverse bi; + size_t ndigits; + + assert (base >= 2); + assert (base <= 62); + + un = GMP_ABS (u->_mp_size); + if (un == 0) + return 1; + + up = u->_mp_d; + + bits = (un - 1) * GMP_LIMB_BITS + mpn_limb_size_in_base_2 (up[un-1]); + switch (base) + { + case 2: + return bits; + case 4: + return (bits + 1) / 2; + case 8: + return (bits + 2) / 3; + case 16: + return (bits + 3) / 4; + case 32: + return (bits + 4) / 5; + /* FIXME: Do something more clever for the common case of base + 10. */ + } + + tp = gmp_alloc_limbs (un); + mpn_copyi (tp, up, un); + mpn_div_qr_1_invert (&bi, base); + + tn = un; + ndigits = 0; + do + { + ndigits++; + mpn_div_qr_1_preinv (tp, tp, tn, &bi); + tn -= (tp[tn-1] == 0); + } + while (tn > 0); + + gmp_free_limbs (tp, un); + return ndigits; +} + +char * +mpz_get_str (char *sp, int base, const mpz_t u) +{ + unsigned bits; + const char *digits; + mp_size_t un; + size_t i, sn, osn; + + digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + if (base > 1) + { + if (base <= 36) + digits = "0123456789abcdefghijklmnopqrstuvwxyz"; + else if (base > 62) + return NULL; + } + else if (base >= -1) + base = 10; + else + { + base = -base; + if (base > 36) + return NULL; + } + + sn = 1 + mpz_sizeinbase (u, base); + if (!sp) + { + osn = 1 + sn; + sp = (char *) gmp_alloc (osn); + } + else + osn = 0; + un = GMP_ABS (u->_mp_size); + + if (un == 0) + { + sp[0] = '0'; + sn = 1; + goto ret; + } + + i = 0; + + if (u->_mp_size < 0) + sp[i++] = '-'; + + bits = mpn_base_power_of_two_p (base); + + if (bits) + /* Not modified in this case. */ + sn = i + mpn_get_str_bits ((unsigned char *) sp + i, bits, u->_mp_d, un); + else + { + struct mpn_base_info info; + mp_ptr tp; + + mpn_get_base_info (&info, base); + tp = gmp_alloc_limbs (un); + mpn_copyi (tp, u->_mp_d, un); + + sn = i + mpn_get_str_other ((unsigned char *) sp + i, base, &info, tp, un); + gmp_free_limbs (tp, un); + } + + for (; i < sn; i++) + sp[i] = digits[(unsigned char) sp[i]]; + +ret: + sp[sn] = '\0'; + if (osn && osn != sn + 1) + sp = (char*) gmp_realloc (sp, osn, sn + 1); + return sp; +} + +int +mpz_set_str (mpz_t r, const char *sp, int base) +{ + unsigned bits, value_of_a; + mp_size_t rn, alloc; + mp_ptr rp; + size_t dn, sn; + int sign; + unsigned char *dp; + + assert (base == 0 || (base >= 2 && base <= 62)); + + while (isspace( (unsigned char) *sp)) + sp++; + + sign = (*sp == '-'); + sp += sign; + + if (base == 0) + { + if (sp[0] == '0') + { + if (sp[1] == 'x' || sp[1] == 'X') + { + base = 16; + sp += 2; + } + else if (sp[1] == 'b' || sp[1] == 'B') + { + base = 2; + sp += 2; + } + else + base = 8; + } + else + base = 10; + } + + if (!*sp) + { + r->_mp_size = 0; + return -1; + } + sn = strlen(sp); + dp = (unsigned char *) gmp_alloc (sn); + + value_of_a = (base > 36) ? 36 : 10; + for (dn = 0; *sp; sp++) + { + unsigned digit; + + if (isspace ((unsigned char) *sp)) + continue; + else if (*sp >= '0' && *sp <= '9') + digit = *sp - '0'; + else if (*sp >= 'a' && *sp <= 'z') + digit = *sp - 'a' + value_of_a; + else if (*sp >= 'A' && *sp <= 'Z') + digit = *sp - 'A' + 10; + else + digit = base; /* fail */ + + if (digit >= (unsigned) base) + { + gmp_free (dp, sn); + r->_mp_size = 0; + return -1; + } + + dp[dn++] = digit; + } + + if (!dn) + { + gmp_free (dp, sn); + r->_mp_size = 0; + return -1; + } + bits = mpn_base_power_of_two_p (base); + + if (bits > 0) + { + alloc = (dn * bits + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS; + rp = MPZ_REALLOC (r, alloc); + rn = mpn_set_str_bits (rp, dp, dn, bits); + } + else + { + struct mpn_base_info info; + mpn_get_base_info (&info, base); + alloc = (dn + info.exp - 1) / info.exp; + rp = MPZ_REALLOC (r, alloc); + rn = mpn_set_str_other (rp, dp, dn, base, &info); + /* Normalization, needed for all-zero input. */ + assert (rn > 0); + rn -= rp[rn-1] == 0; + } + assert (rn <= alloc); + gmp_free (dp, sn); + + r->_mp_size = sign ? - rn : rn; + + return 0; +} + +int +mpz_init_set_str (mpz_t r, const char *sp, int base) +{ + mpz_init (r); + return mpz_set_str (r, sp, base); +} + +size_t +mpz_out_str (FILE *stream, int base, const mpz_t x) +{ + char *str; + size_t len, n; + + str = mpz_get_str (NULL, base, x); + if (!str) + return 0; + len = strlen (str); + n = fwrite (str, 1, len, stream); + gmp_free (str, len + 1); + return n; +} + + +static int +gmp_detect_endian (void) +{ + static const int i = 2; + const unsigned char *p = (const unsigned char *) &i; + return 1 - *p; +} + +/* Import and export. Does not support nails. */ +void +mpz_import (mpz_t r, size_t count, int order, size_t size, int endian, + size_t nails, const void *src) +{ + const unsigned char *p; + ptrdiff_t word_step; + mp_ptr rp; + mp_size_t rn; + + /* The current (partial) limb. */ + mp_limb_t limb; + /* The number of bytes already copied to this limb (starting from + the low end). */ + size_t bytes; + /* The index where the limb should be stored, when completed. */ + mp_size_t i; + + if (nails != 0) + gmp_die ("mpz_import: Nails not supported."); + + assert (order == 1 || order == -1); + assert (endian >= -1 && endian <= 1); + + if (endian == 0) + endian = gmp_detect_endian (); + + p = (unsigned char *) src; + + word_step = (order != endian) ? 2 * size : 0; + + /* Process bytes from the least significant end, so point p at the + least significant word. */ + if (order == 1) + { + p += size * (count - 1); + word_step = - word_step; + } + + /* And at least significant byte of that word. */ + if (endian == 1) + p += (size - 1); + + rn = (size * count + sizeof(mp_limb_t) - 1) / sizeof(mp_limb_t); + rp = MPZ_REALLOC (r, rn); + + for (limb = 0, bytes = 0, i = 0; count > 0; count--, p += word_step) + { + size_t j; + for (j = 0; j < size; j++, p -= (ptrdiff_t) endian) + { + limb |= (mp_limb_t) *p << (bytes++ * CHAR_BIT); + if (bytes == sizeof(mp_limb_t)) + { + rp[i++] = limb; + bytes = 0; + limb = 0; + } + } + } + assert (i + (bytes > 0) == rn); + if (limb != 0) + rp[i++] = limb; + else + i = mpn_normalized_size (rp, i); + + r->_mp_size = i; +} + +void * +mpz_export (void *r, size_t *countp, int order, size_t size, int endian, + size_t nails, const mpz_t u) +{ + size_t count; + mp_size_t un; + + if (nails != 0) + gmp_die ("mpz_export: Nails not supported."); + + assert (order == 1 || order == -1); + assert (endian >= -1 && endian <= 1); + assert (size > 0 || u->_mp_size == 0); + + un = u->_mp_size; + count = 0; + if (un != 0) + { + size_t k; + unsigned char *p; + ptrdiff_t word_step; + /* The current (partial) limb. */ + mp_limb_t limb; + /* The number of bytes left to do in this limb. */ + size_t bytes; + /* The index where the limb was read. */ + mp_size_t i; + + un = GMP_ABS (un); + + /* Count bytes in top limb. */ + limb = u->_mp_d[un-1]; + assert (limb != 0); + + k = (GMP_LIMB_BITS <= CHAR_BIT); + if (!k) + { + do { + int LOCAL_CHAR_BIT = CHAR_BIT; + k++; limb >>= LOCAL_CHAR_BIT; + } while (limb != 0); + } + /* else limb = 0; */ + + count = (k + (un-1) * sizeof (mp_limb_t) + size - 1) / size; + + if (!r) + r = gmp_alloc (count * size); + + if (endian == 0) + endian = gmp_detect_endian (); + + p = (unsigned char *) r; + + word_step = (order != endian) ? 2 * size : 0; + + /* Process bytes from the least significant end, so point p at the + least significant word. */ + if (order == 1) + { + p += size * (count - 1); + word_step = - word_step; + } + + /* And at least significant byte of that word. */ + if (endian == 1) + p += (size - 1); + + for (bytes = 0, i = 0, k = 0; k < count; k++, p += word_step) + { + size_t j; + for (j = 0; j < size; ++j, p -= (ptrdiff_t) endian) + { + if (sizeof (mp_limb_t) == 1) + { + if (i < un) + *p = u->_mp_d[i++]; + else + *p = 0; + } + else + { + int LOCAL_CHAR_BIT = CHAR_BIT; + if (bytes == 0) + { + if (i < un) + limb = u->_mp_d[i++]; + bytes = sizeof (mp_limb_t); + } + *p = limb; + limb >>= LOCAL_CHAR_BIT; + bytes--; + } + } + } + assert (i == un); + assert (k == count); + } + + if (countp) + *countp = count; + + return r; +} diff --git a/src/mini-gmp/mini-gmp.h b/src/mini-gmp/mini-gmp.h new file mode 100644 index 0000000..f28cb36 --- /dev/null +++ b/src/mini-gmp/mini-gmp.h @@ -0,0 +1,311 @@ +/* mini-gmp, a minimalistic implementation of a GNU GMP subset. + +Copyright 2011-2015, 2017, 2019-2021 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + +or + + * the GNU General Public License as published by the Free Software + Foundation; either version 2 of the License, or (at your option) any + later version. + +or both in parallel, as here. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received copies of the GNU General Public License and the +GNU Lesser General Public License along with the GNU MP Library. If not, +see https://www.gnu.org/licenses/. */ + +/* About mini-gmp: This is a minimal implementation of a subset of the + GMP interface. It is intended for inclusion into applications which + have modest bignums needs, as a fallback when the real GMP library + is not installed. + + This file defines the public interface. */ + +#ifndef __MINI_GMP_H__ +#define __MINI_GMP_H__ + +/* For size_t */ +#include + +#if defined (__cplusplus) +extern "C" { +#endif + +void mp_set_memory_functions (void *(*) (size_t), + void *(*) (void *, size_t, size_t), + void (*) (void *, size_t)); + +void mp_get_memory_functions (void *(**) (size_t), + void *(**) (void *, size_t, size_t), + void (**) (void *, size_t)); + +#ifndef MINI_GMP_LIMB_TYPE +#define MINI_GMP_LIMB_TYPE long +#endif + +typedef unsigned MINI_GMP_LIMB_TYPE mp_limb_t; +typedef long mp_size_t; +typedef unsigned long mp_bitcnt_t; + +typedef mp_limb_t *mp_ptr; +typedef const mp_limb_t *mp_srcptr; + +typedef struct +{ + int _mp_alloc; /* Number of *limbs* allocated and pointed + to by the _mp_d field. */ + int _mp_size; /* abs(_mp_size) is the number of limbs the + last field points to. If _mp_size is + negative this is a negative number. */ + mp_limb_t *_mp_d; /* Pointer to the limbs. */ +} __mpz_struct; + +typedef __mpz_struct mpz_t[1]; + +typedef __mpz_struct *mpz_ptr; +typedef const __mpz_struct *mpz_srcptr; + +extern const int mp_bits_per_limb; + +void mpn_copyi (mp_ptr, mp_srcptr, mp_size_t); +void mpn_copyd (mp_ptr, mp_srcptr, mp_size_t); +void mpn_zero (mp_ptr, mp_size_t); + +int mpn_cmp (mp_srcptr, mp_srcptr, mp_size_t); +int mpn_zero_p (mp_srcptr, mp_size_t); + +mp_limb_t mpn_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); +mp_limb_t mpn_add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); +mp_limb_t mpn_add (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); + +mp_limb_t mpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); +mp_limb_t mpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); +mp_limb_t mpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); + +mp_limb_t mpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); +mp_limb_t mpn_addmul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); +mp_limb_t mpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); + +mp_limb_t mpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); +void mpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); +void mpn_sqr (mp_ptr, mp_srcptr, mp_size_t); +int mpn_perfect_square_p (mp_srcptr, mp_size_t); +mp_size_t mpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t); +mp_size_t mpn_gcd (mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t); + +mp_limb_t mpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int); +mp_limb_t mpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int); + +mp_bitcnt_t mpn_scan0 (mp_srcptr, mp_bitcnt_t); +mp_bitcnt_t mpn_scan1 (mp_srcptr, mp_bitcnt_t); + +void mpn_com (mp_ptr, mp_srcptr, mp_size_t); +mp_limb_t mpn_neg (mp_ptr, mp_srcptr, mp_size_t); + +mp_bitcnt_t mpn_popcount (mp_srcptr, mp_size_t); + +mp_limb_t mpn_invert_3by2 (mp_limb_t, mp_limb_t); +#define mpn_invert_limb(x) mpn_invert_3by2 ((x), 0) + +size_t mpn_get_str (unsigned char *, int, mp_ptr, mp_size_t); +mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int); + +void mpz_init (mpz_t); +void mpz_init2 (mpz_t, mp_bitcnt_t); +void mpz_clear (mpz_t); + +#define mpz_odd_p(z) (((z)->_mp_size != 0) & (int) (z)->_mp_d[0]) +#define mpz_even_p(z) (! mpz_odd_p (z)) + +int mpz_sgn (const mpz_t); +int mpz_cmp_si (const mpz_t, long); +int mpz_cmp_ui (const mpz_t, unsigned long); +int mpz_cmp (const mpz_t, const mpz_t); +int mpz_cmpabs_ui (const mpz_t, unsigned long); +int mpz_cmpabs (const mpz_t, const mpz_t); +int mpz_cmp_d (const mpz_t, double); +int mpz_cmpabs_d (const mpz_t, double); + +void mpz_abs (mpz_t, const mpz_t); +void mpz_neg (mpz_t, const mpz_t); +void mpz_swap (mpz_t, mpz_t); + +void mpz_add_ui (mpz_t, const mpz_t, unsigned long); +void mpz_add (mpz_t, const mpz_t, const mpz_t); +void mpz_sub_ui (mpz_t, const mpz_t, unsigned long); +void mpz_ui_sub (mpz_t, unsigned long, const mpz_t); +void mpz_sub (mpz_t, const mpz_t, const mpz_t); + +void mpz_mul_si (mpz_t, const mpz_t, long int); +void mpz_mul_ui (mpz_t, const mpz_t, unsigned long int); +void mpz_mul (mpz_t, const mpz_t, const mpz_t); +void mpz_mul_2exp (mpz_t, const mpz_t, mp_bitcnt_t); +void mpz_addmul_ui (mpz_t, const mpz_t, unsigned long int); +void mpz_addmul (mpz_t, const mpz_t, const mpz_t); +void mpz_submul_ui (mpz_t, const mpz_t, unsigned long int); +void mpz_submul (mpz_t, const mpz_t, const mpz_t); + +void mpz_cdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t); +void mpz_fdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t); +void mpz_tdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t); +void mpz_cdiv_q (mpz_t, const mpz_t, const mpz_t); +void mpz_fdiv_q (mpz_t, const mpz_t, const mpz_t); +void mpz_tdiv_q (mpz_t, const mpz_t, const mpz_t); +void mpz_cdiv_r (mpz_t, const mpz_t, const mpz_t); +void mpz_fdiv_r (mpz_t, const mpz_t, const mpz_t); +void mpz_tdiv_r (mpz_t, const mpz_t, const mpz_t); + +void mpz_cdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t); +void mpz_fdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t); +void mpz_tdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t); +void mpz_cdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t); +void mpz_fdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t); +void mpz_tdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t); + +void mpz_mod (mpz_t, const mpz_t, const mpz_t); + +void mpz_divexact (mpz_t, const mpz_t, const mpz_t); + +int mpz_divisible_p (const mpz_t, const mpz_t); +int mpz_congruent_p (const mpz_t, const mpz_t, const mpz_t); + +unsigned long mpz_cdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long); +unsigned long mpz_fdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long); +unsigned long mpz_tdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long); +unsigned long mpz_cdiv_q_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_fdiv_q_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_tdiv_q_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_cdiv_r_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_fdiv_r_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_tdiv_r_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_cdiv_ui (const mpz_t, unsigned long); +unsigned long mpz_fdiv_ui (const mpz_t, unsigned long); +unsigned long mpz_tdiv_ui (const mpz_t, unsigned long); + +unsigned long mpz_mod_ui (mpz_t, const mpz_t, unsigned long); + +void mpz_divexact_ui (mpz_t, const mpz_t, unsigned long); + +int mpz_divisible_ui_p (const mpz_t, unsigned long); + +unsigned long mpz_gcd_ui (mpz_t, const mpz_t, unsigned long); +void mpz_gcd (mpz_t, const mpz_t, const mpz_t); +void mpz_gcdext (mpz_t, mpz_t, mpz_t, const mpz_t, const mpz_t); +void mpz_lcm_ui (mpz_t, const mpz_t, unsigned long); +void mpz_lcm (mpz_t, const mpz_t, const mpz_t); +int mpz_invert (mpz_t, const mpz_t, const mpz_t); + +void mpz_sqrtrem (mpz_t, mpz_t, const mpz_t); +void mpz_sqrt (mpz_t, const mpz_t); +int mpz_perfect_square_p (const mpz_t); + +void mpz_pow_ui (mpz_t, const mpz_t, unsigned long); +void mpz_ui_pow_ui (mpz_t, unsigned long, unsigned long); +void mpz_powm (mpz_t, const mpz_t, const mpz_t, const mpz_t); +void mpz_powm_ui (mpz_t, const mpz_t, unsigned long, const mpz_t); + +void mpz_rootrem (mpz_t, mpz_t, const mpz_t, unsigned long); +int mpz_root (mpz_t, const mpz_t, unsigned long); + +void mpz_fac_ui (mpz_t, unsigned long); +void mpz_2fac_ui (mpz_t, unsigned long); +void mpz_mfac_uiui (mpz_t, unsigned long, unsigned long); +void mpz_bin_uiui (mpz_t, unsigned long, unsigned long); + +int mpz_probab_prime_p (const mpz_t, int); + +int mpz_tstbit (const mpz_t, mp_bitcnt_t); +void mpz_setbit (mpz_t, mp_bitcnt_t); +void mpz_clrbit (mpz_t, mp_bitcnt_t); +void mpz_combit (mpz_t, mp_bitcnt_t); + +void mpz_com (mpz_t, const mpz_t); +void mpz_and (mpz_t, const mpz_t, const mpz_t); +void mpz_ior (mpz_t, const mpz_t, const mpz_t); +void mpz_xor (mpz_t, const mpz_t, const mpz_t); + +mp_bitcnt_t mpz_popcount (const mpz_t); +mp_bitcnt_t mpz_hamdist (const mpz_t, const mpz_t); +mp_bitcnt_t mpz_scan0 (const mpz_t, mp_bitcnt_t); +mp_bitcnt_t mpz_scan1 (const mpz_t, mp_bitcnt_t); + +int mpz_fits_slong_p (const mpz_t); +int mpz_fits_ulong_p (const mpz_t); +int mpz_fits_sint_p (const mpz_t); +int mpz_fits_uint_p (const mpz_t); +int mpz_fits_sshort_p (const mpz_t); +int mpz_fits_ushort_p (const mpz_t); +long int mpz_get_si (const mpz_t); +unsigned long int mpz_get_ui (const mpz_t); +double mpz_get_d (const mpz_t); +size_t mpz_size (const mpz_t); +mp_limb_t mpz_getlimbn (const mpz_t, mp_size_t); + +void mpz_realloc2 (mpz_t, mp_bitcnt_t); +mp_srcptr mpz_limbs_read (mpz_srcptr); +mp_ptr mpz_limbs_modify (mpz_t, mp_size_t); +mp_ptr mpz_limbs_write (mpz_t, mp_size_t); +void mpz_limbs_finish (mpz_t, mp_size_t); +mpz_srcptr mpz_roinit_n (mpz_t, mp_srcptr, mp_size_t); + +#define MPZ_ROINIT_N(xp, xs) {{0, (xs),(xp) }} + +void mpz_set_si (mpz_t, signed long int); +void mpz_set_ui (mpz_t, unsigned long int); +void mpz_set (mpz_t, const mpz_t); +void mpz_set_d (mpz_t, double); + +void mpz_init_set_si (mpz_t, signed long int); +void mpz_init_set_ui (mpz_t, unsigned long int); +void mpz_init_set (mpz_t, const mpz_t); +void mpz_init_set_d (mpz_t, double); + +size_t mpz_sizeinbase (const mpz_t, int); +char *mpz_get_str (char *, int, const mpz_t); +int mpz_set_str (mpz_t, const char *, int); +int mpz_init_set_str (mpz_t, const char *, int); + +/* This long list taken from gmp.h. */ +/* For reference, "defined(EOF)" cannot be used here. In g++ 2.95.4, + defines EOF but not FILE. */ +#if defined (FILE) \ + || defined (H_STDIO) \ + || defined (_H_STDIO) /* AIX */ \ + || defined (_STDIO_H) /* glibc, Sun, SCO */ \ + || defined (_STDIO_H_) /* BSD, OSF */ \ + || defined (__STDIO_H) /* Borland */ \ + || defined (__STDIO_H__) /* IRIX */ \ + || defined (_STDIO_INCLUDED) /* HPUX */ \ + || defined (__dj_include_stdio_h_) /* DJGPP */ \ + || defined (_FILE_DEFINED) /* Microsoft */ \ + || defined (__STDIO__) /* Apple MPW MrC */ \ + || defined (_MSL_STDIO_H) /* Metrowerks */ \ + || defined (_STDIO_H_INCLUDED) /* QNX4 */ \ + || defined (_ISO_STDIO_ISO_H) /* Sun C++ */ \ + || defined (__STDIO_LOADED) /* VMS */ \ + || defined (_STDIO) /* HPE NonStop */ \ + || defined (__DEFINED_FILE) /* musl */ +size_t mpz_out_str (FILE *, int, const mpz_t); +#endif + +void mpz_import (mpz_t, size_t, int, size_t, int, size_t, const void *); +void *mpz_export (void *, size_t *, int, size_t, int, size_t, const mpz_t); + +#if defined (__cplusplus) +} +#endif +#endif /* __MINI_GMP_H__ */ diff --git a/src/klpt/CMakeLists.txt b/src/mp/CMakeLists.txt similarity index 100% rename from src/klpt/CMakeLists.txt rename to src/mp/CMakeLists.txt diff --git a/src/intbig/ref/CMakeLists.txt b/src/mp/ref/CMakeLists.txt similarity index 100% rename from src/intbig/ref/CMakeLists.txt rename to src/mp/ref/CMakeLists.txt diff --git a/src/mp/ref/generic/CMakeLists.txt b/src/mp/ref/generic/CMakeLists.txt new file mode 100644 index 0000000..fe9d5a4 --- /dev/null +++ b/src/mp/ref/generic/CMakeLists.txt @@ -0,0 +1,7 @@ +set(SOURCE_FILES_MP_GENERIC_REF + mp.c +) + +add_library(${LIB_MP} STATIC ${SOURCE_FILES_MP_GENERIC_REF}) +target_include_directories(${LIB_MP} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_MP}) +target_compile_options(${LIB_MP} PRIVATE ${C_OPT_FLAGS}) \ No newline at end of file diff --git a/src/mp/ref/generic/include/mp.h b/src/mp/ref/generic/include/mp.h new file mode 100644 index 0000000..b3733b5 --- /dev/null +++ b/src/mp/ref/generic/include/mp.h @@ -0,0 +1,88 @@ +#ifndef MP_H +#define MP_H + +#include +#include +#include + +// Functions taken from the GF module + +void mp_add(digit_t *c, const digit_t *a, const digit_t *b, const unsigned int nwords); +digit_t mp_shiftr(digit_t *x, const unsigned int shift, const unsigned int nwords); +void multiple_mp_shiftl(digit_t *x, const unsigned int shift, const unsigned int nwords); +void mp_shiftl(digit_t *x, const unsigned int shift, const unsigned int nwords); +void MUL(digit_t *out, const digit_t a, const digit_t b); + +// Functions taken from the EC module + +void mp_sub(digit_t *c, const digit_t *a, const digit_t *b, const unsigned int nwords); +void select_ct(digit_t *c, const digit_t *a, const digit_t *b, const digit_t mask, const int nwords); +void swap_ct(digit_t *a, digit_t *b, const digit_t option, const int nwords); +int mp_compare(const digit_t *a, const digit_t *b, unsigned int nwords); +bool mp_is_zero(const digit_t *a, unsigned int nwords); +void mp_mul2(digit_t *c, const digit_t *a, const digit_t *b); + +// Further functions for multiprecision arithmetic +void mp_print(const digit_t *a, size_t nwords); +void mp_copy(digit_t *b, const digit_t *a, size_t nwords); +void mp_neg(digit_t *a, unsigned int nwords); +bool mp_is_one(const digit_t *x, unsigned int nwords); +void mp_mul(digit_t *c, const digit_t *a, const digit_t *b, size_t nwords); +void mp_mod_2exp(digit_t *a, unsigned int e, unsigned int nwords); +void mp_inv_2e(digit_t *b, const digit_t *a, int e, unsigned int nwords); +void mp_invert_matrix(digit_t *r1, digit_t *r2, digit_t *s1, digit_t *s2, int e, unsigned int nwords); + +#define mp_is_odd(x, nwords) (((nwords) != 0) & (int)(x)[0]) +#define mp_is_even(x, nwords) (!mp_is_odd(x, nwords)) + +/********************** Constant-time unsigned comparisons ***********************/ + +// The following functions return 1 (TRUE) if condition is true, 0 (FALSE) otherwise +static inline unsigned int +is_digit_nonzero_ct(digit_t x) +{ // Is x != 0? + return (unsigned int)((x | (0 - x)) >> (RADIX - 1)); +} + +static inline unsigned int +is_digit_zero_ct(digit_t x) +{ // Is x = 0? + return (unsigned int)(1 ^ is_digit_nonzero_ct(x)); +} + +static inline unsigned int +is_digit_lessthan_ct(digit_t x, digit_t y) +{ // Is x < y? + return (unsigned int)((x ^ ((x ^ y) | ((x - y) ^ y))) >> (RADIX - 1)); +} + +/********************** Platform-independent macros for digit-size operations + * **********************/ + +// Digit addition with carry +#define ADDC(sumOut, carryOut, addend1, addend2, carryIn) \ + { \ + digit_t tempReg = (addend1) + (digit_t)(carryIn); \ + (sumOut) = (addend2) + tempReg; \ + (carryOut) = (is_digit_lessthan_ct(tempReg, (digit_t)(carryIn)) | is_digit_lessthan_ct((sumOut), tempReg)); \ + } + +// Digit subtraction with borrow +#define SUBC(differenceOut, borrowOut, minuend, subtrahend, borrowIn) \ + { \ + digit_t tempReg = (minuend) - (subtrahend); \ + unsigned int borrowReg = \ + (is_digit_lessthan_ct((minuend), (subtrahend)) | ((borrowIn) & is_digit_zero_ct(tempReg))); \ + (differenceOut) = tempReg - (digit_t)(borrowIn); \ + (borrowOut) = borrowReg; \ + } + +// Shift right with flexible datatype +#define SHIFTR(highIn, lowIn, shift, shiftOut, DigitSize) \ + (shiftOut) = ((lowIn) >> (shift)) ^ ((highIn) << (DigitSize - (shift))); + +// Digit shift left +#define SHIFTL(highIn, lowIn, shift, shiftOut, DigitSize) \ + (shiftOut) = ((highIn) << (shift)) ^ ((lowIn) >> (RADIX - (shift))); + +#endif diff --git a/src/mp/ref/generic/mp.c b/src/mp/ref/generic/mp.c new file mode 100644 index 0000000..27f4a96 --- /dev/null +++ b/src/mp/ref/generic/mp.c @@ -0,0 +1,357 @@ +#include +#include +#include +#include + +// double-wide multiplication +void +MUL(digit_t *out, const digit_t a, const digit_t b) +{ +#ifdef RADIX_32 + uint64_t r = (uint64_t)a * b; + out[0] = r & 0xFFFFFFFFUL; + out[1] = r >> 32; + +#elif defined(RADIX_64) && defined(_MSC_VER) + uint64_t umul_hi; + out[0] = _umul128(a, b, &umul_hi); + out[1] = umul_hi; + +#elif defined(RADIX_64) && defined(HAVE_UINT128) + unsigned __int128 umul_tmp; + umul_tmp = (unsigned __int128)(a) * (unsigned __int128)(b); + out[0] = (uint64_t)umul_tmp; + out[1] = (uint64_t)(umul_tmp >> 64); + +#else + register digit_t al, ah, bl, bh, temp; + digit_t albl, albh, ahbl, ahbh, res1, res2, res3, carry; + digit_t mask_low = (digit_t)(-1) >> (sizeof(digit_t) * 4), mask_high = (digit_t)(-1) << (sizeof(digit_t) * 4); + al = a & mask_low; // Low part + ah = a >> (sizeof(digit_t) * 4); // High part + bl = b & mask_low; + bh = b >> (sizeof(digit_t) * 4); + + albl = al * bl; + albh = al * bh; + ahbl = ah * bl; + ahbh = ah * bh; + out[0] = albl & mask_low; // out00 + + res1 = albl >> (sizeof(digit_t) * 4); + res2 = ahbl & mask_low; + res3 = albh & mask_low; + temp = res1 + res2 + res3; + carry = temp >> (sizeof(digit_t) * 4); + out[0] ^= temp << (sizeof(digit_t) * 4); // out01 + + res1 = ahbl >> (sizeof(digit_t) * 4); + res2 = albh >> (sizeof(digit_t) * 4); + res3 = ahbh & mask_low; + temp = res1 + res2 + res3 + carry; + out[1] = temp & mask_low; // out10 + carry = temp & mask_high; + out[1] ^= (ahbh & mask_high) + carry; // out11 + +#endif +} + +void +mp_add(digit_t *c, const digit_t *a, const digit_t *b, const unsigned int nwords) +{ // Multiprecision addition + unsigned int i, carry = 0; + + for (i = 0; i < nwords; i++) { + ADDC(c[i], carry, a[i], b[i], carry); + } +} + +digit_t +mp_shiftr(digit_t *x, const unsigned int shift, const unsigned int nwords) +{ // Multiprecision right shift by 1...RADIX-1 + digit_t bit_out = x[0] & 1; + + for (unsigned int i = 0; i < nwords - 1; i++) { + SHIFTR(x[i + 1], x[i], shift, x[i], RADIX); + } + x[nwords - 1] >>= shift; + return bit_out; +} + +void +mp_shiftl(digit_t *x, const unsigned int shift, const unsigned int nwords) +{ // Multiprecision left shift by 1...RADIX-1 + + for (int i = nwords - 1; i > 0; i--) { + SHIFTL(x[i], x[i - 1], shift, x[i], RADIX); + } + x[0] <<= shift; +} + +void +multiple_mp_shiftl(digit_t *x, const unsigned int shift, const unsigned int nwords) +{ + int t = shift; + while (t > RADIX - 1) { + mp_shiftl(x, RADIX - 1, nwords); + t = t - (RADIX - 1); + } + mp_shiftl(x, t, nwords); +} + +// The below functions were taken from the EC module + +void +mp_sub(digit_t *c, const digit_t *a, const digit_t *b, const unsigned int nwords) +{ // Multiprecision subtraction, assuming a > b + unsigned int i, borrow = 0; + + for (i = 0; i < nwords; i++) { + SUBC(c[i], borrow, a[i], b[i], borrow); + } +} + +void +select_ct(digit_t *c, const digit_t *a, const digit_t *b, const digit_t mask, const int nwords) +{ // Select c <- a if mask = 0, select c <- b if mask = 1...1 + + for (int i = 0; i < nwords; i++) { + c[i] = ((a[i] ^ b[i]) & mask) ^ a[i]; + } +} + +void +swap_ct(digit_t *a, digit_t *b, const digit_t option, const int nwords) +{ // Swap entries + // If option = 0 then P <- P and Q <- Q, else if option = 0xFF...FF then a <- b and b <- a + digit_t temp; + + for (int i = 0; i < nwords; i++) { + temp = option & (a[i] ^ b[i]); + a[i] = temp ^ a[i]; + b[i] = temp ^ b[i]; + } +} + +int +mp_compare(const digit_t *a, const digit_t *b, unsigned int nwords) +{ // Multiprecision comparison, a=b? : (1) a>b, (0) a=b, (-1) a= 0; i--) { + if (a[i] > b[i]) + return 1; + else if (a[i] < b[i]) + return -1; + } + return 0; +} + +bool +mp_is_zero(const digit_t *a, unsigned int nwords) +{ // Is a multiprecision element zero? + // Returns 1 (true) if a=0, 0 (false) otherwise + digit_t r = 0; + + for (unsigned int i = 0; i < nwords; i++) + r |= a[i] ^ 0; + + return (bool)is_digit_zero_ct(r); +} + +void +mp_mul2(digit_t *c, const digit_t *a, const digit_t *b) +{ // Multiprecision multiplication fixed to two-digit operands + unsigned int carry = 0; + digit_t t0[2], t1[2], t2[2]; + + MUL(t0, a[0], b[0]); + MUL(t1, a[0], b[1]); + ADDC(t0[1], carry, t0[1], t1[0], carry); + ADDC(t1[1], carry, 0, t1[1], carry); + MUL(t2, a[1], b[1]); + ADDC(t2[0], carry, t2[0], t1[1], carry); + ADDC(t2[1], carry, 0, t2[1], carry); + c[0] = t0[0]; + c[1] = t0[1]; + c[2] = t2[0]; + c[3] = t2[1]; +} + +void +mp_print(const digit_t *a, size_t nwords) +{ + printf("0x"); + for (size_t i = 0; i < nwords; i++) { +#ifdef RADIX_32 + printf("%08" PRIx32, a[nwords - i - 1]); // Print each word with 8 hex digits +#elif defined(RADIX_64) + printf("%016" PRIx64, a[nwords - i - 1]); // Print each word with 16 hex digits +#endif + } +} + +void +mp_copy(digit_t *b, const digit_t *a, size_t nwords) +{ + for (size_t i = 0; i < nwords; i++) { + b[i] = a[i]; + } +} + +void +mp_mul(digit_t *c, const digit_t *a, const digit_t *b, size_t nwords) +{ + // Multiprecision multiplication, c = a*b, for nwords-digit inputs, with nwords-digit output + // explicitly does not use the higher half of c, as we do not need in our applications + digit_t carry, UV[2], t[nwords], cc[nwords]; + + for (size_t i = 0; i < nwords; i++) { + cc[i] = 0; + } + + for (size_t i = 0; i < nwords; i++) { + + MUL(t, a[i], b[0]); + + for (size_t j = 1; j < nwords - 1; j++) { + MUL(UV, a[i], b[j]); + ADDC(t[j], carry, t[j], UV[0], 0); + t[j + 1] = UV[1] + carry; + } + + int j = nwords - 1; + MUL(UV, a[i], b[j]); + ADDC(t[j], carry, t[j], UV[0], 0); + + mp_add(&cc[i], &cc[i], t, nwords - i); + } + + mp_copy(c, cc, nwords); +} + +void +mp_mod_2exp(digit_t *a, unsigned int e, unsigned int nwords) +{ // Multiprecision modulo 2^e, with 0 <= a < 2^(e) + unsigned int i, q = e >> LOG2RADIX, r = e & (RADIX - 1); + + if (q < nwords) { + a[q] &= ((digit_t)1 << r) - 1; + + for (i = q + 1; i < nwords; i++) { + a[i] = 0; + } + } +} + +void +mp_neg(digit_t *a, unsigned int nwords) +{ // negates a + for (size_t i = 0; i < nwords; i++) { + a[i] ^= -1; + } + + a[0] += 1; +} + +bool +mp_is_one(const digit_t *x, unsigned int nwords) +{ // returns true if x represents 1, and false otherwise + if (x[0] != 1) { + return false; + } + + for (size_t i = 1; i < nwords; i++) { + if (x[i] != 0) { + return false; + } + } + return true; +} + +void +mp_inv_2e(digit_t *b, const digit_t *a, int e, unsigned int nwords) +{ // Inversion modulo 2^e, using Newton's method and Hensel lifting + // we take the first power of 2 larger than e to use + // requires a to be odd, of course + // returns b such that a*b = 1 mod 2^e + assert((a[0] & 1) == 1); + + digit_t x[nwords], y[nwords], aa[nwords], mp_one[nwords], tmp[nwords]; + mp_copy(aa, a, nwords); + + mp_one[0] = 1; + for (unsigned int i = 1; i < nwords; i++) { + mp_one[i] = 0; + } + + int p = 1; + while ((1 << p) < e) { + p++; + } + p -= 2; // using k = 4 for initial inverse + int w = (1 << (p + 2)); + + mp_mod_2exp(aa, w, nwords); + mp_add(x, aa, aa, nwords); + mp_add(x, x, aa, nwords); // should be 3a + x[0] ^= (1 << 1); // so that x equals (3a)^2 xor 2 + mp_mod_2exp(x, w, nwords); // now x*a = 1 mod 2^4, which we lift + + mp_mul(tmp, aa, x, nwords); + mp_neg(tmp, nwords); + mp_add(y, mp_one, tmp, nwords); + + // Hensel lifting for p rounds + for (int i = 0; i < p; i++) { + mp_add(tmp, mp_one, y, nwords); + mp_mul(x, x, tmp, nwords); + mp_mul(y, y, y, nwords); + } + + mp_mod_2exp(x, w, nwords); + mp_copy(b, x, nwords); + + // verify results + mp_mul(x, x, aa, nwords); + mp_mod_2exp(x, w, nwords); + assert(mp_is_one(x, nwords)); +} + +void +mp_invert_matrix(digit_t *r1, digit_t *r2, digit_t *s1, digit_t *s2, int e, unsigned int nwords) +{ + // given a matrix ( ( a, b ), (c, d) ) of values mod 2^e + // returns the inverse matrix gamma ( (d, -b), (-c, a) ) + // where gamma is the inverse of the determinant a*d - b*c + // assumes the matrix is invertible, otherwises, inversion of determinant fails + + int p = 1; + while ((1 << p) < e) { + p++; + } + int w = (1 << (p)); + + digit_t det[nwords], tmp[nwords], resa[nwords], resb[nwords], resc[nwords], resd[nwords]; + mp_mul(tmp, r1, s2, nwords); + mp_mul(det, r2, s1, nwords); + mp_sub(det, tmp, det, nwords); + mp_inv_2e(det, det, e, nwords); + + mp_mul(resa, det, s2, nwords); + mp_mul(resb, det, r2, nwords); + mp_mul(resc, det, s1, nwords); + mp_mul(resd, det, r1, nwords); + + mp_neg(resb, nwords); + mp_neg(resc, nwords); + + mp_mod_2exp(resa, w, nwords); + mp_mod_2exp(resb, w, nwords); + mp_mod_2exp(resc, w, nwords); + mp_mod_2exp(resd, w, nwords); + + mp_copy(r1, resa, nwords); + mp_copy(r2, resb, nwords); + mp_copy(s1, resc, nwords); + mp_copy(s2, resd, nwords); +} diff --git a/src/nistapi/lvl1/api.c b/src/nistapi/lvl1/api.c index b709419..baccd59 100644 --- a/src/nistapi/lvl1/api.c +++ b/src/nistapi/lvl1/api.c @@ -3,22 +3,31 @@ #include #include +#if defined(ENABLE_SIGN) + +SQISIGN_API int -crypto_sign_keypair(unsigned char *pk, unsigned char *sk) { +crypto_sign_keypair(unsigned char *pk, unsigned char *sk) +{ return sqisign_keypair(pk, sk); } +SQISIGN_API int crypto_sign(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) { + const unsigned char *sk) +{ return sqisign_sign(sm, smlen, m, mlen, sk); } +#endif +SQISIGN_API int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) { + const unsigned char *pk) +{ return sqisign_open(m, mlen, sm, smlen, pk); } diff --git a/src/nistapi/lvl1/api.h b/src/nistapi/lvl1/api.h index b2bacb8..93a3984 100644 --- a/src/nistapi/lvl1/api.h +++ b/src/nistapi/lvl1/api.h @@ -3,20 +3,27 @@ #ifndef api_h #define api_h -#define CRYPTO_SECRETKEYBYTES 782 -#define CRYPTO_PUBLICKEYBYTES 64 -#define CRYPTO_BYTES 177 +#include -#define CRYPTO_ALGNAME "lvl1" +#define CRYPTO_SECRETKEYBYTES 353 +#define CRYPTO_PUBLICKEYBYTES 65 +#define CRYPTO_BYTES 148 +#define CRYPTO_ALGNAME "SQIsign_lvl1" + +#if defined(ENABLE_SIGN) +SQISIGN_API int crypto_sign_keypair(unsigned char *pk, unsigned char *sk); +SQISIGN_API int crypto_sign(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, const unsigned char *sk); +#endif +SQISIGN_API int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, diff --git a/src/nistapi/lvl3/api.c b/src/nistapi/lvl3/api.c index b709419..e01f911 100644 --- a/src/nistapi/lvl3/api.c +++ b/src/nistapi/lvl3/api.c @@ -3,22 +3,30 @@ #include #include +#if defined(ENABLE_SIGN) +SQISIGN_API int -crypto_sign_keypair(unsigned char *pk, unsigned char *sk) { +crypto_sign_keypair(unsigned char *pk, unsigned char *sk) +{ return sqisign_keypair(pk, sk); } +SQISIGN_API int crypto_sign(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) { + const unsigned char *sk) +{ return sqisign_sign(sm, smlen, m, mlen, sk); } +#endif +SQISIGN_API int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) { + const unsigned char *pk) +{ return sqisign_open(m, mlen, sm, smlen, pk); } diff --git a/src/nistapi/lvl3/api.h b/src/nistapi/lvl3/api.h index ff18440..8a37d4b 100644 --- a/src/nistapi/lvl3/api.h +++ b/src/nistapi/lvl3/api.h @@ -3,20 +3,27 @@ #ifndef api_h #define api_h -#define CRYPTO_SECRETKEYBYTES 1138 -#define CRYPTO_PUBLICKEYBYTES 96 -#define CRYPTO_BYTES 263 +#include -#define CRYPTO_ALGNAME "lvl3" +#define CRYPTO_SECRETKEYBYTES 529 +#define CRYPTO_PUBLICKEYBYTES 97 +#define CRYPTO_BYTES 224 +#define CRYPTO_ALGNAME "SQIsign_lvl3" + +#if defined(ENABLE_SIGN) +SQISIGN_API int crypto_sign_keypair(unsigned char *pk, unsigned char *sk); +SQISIGN_API int crypto_sign(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, const unsigned char *sk); +#endif +SQISIGN_API int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, diff --git a/src/nistapi/lvl5/api.c b/src/nistapi/lvl5/api.c index b709419..e01f911 100644 --- a/src/nistapi/lvl5/api.c +++ b/src/nistapi/lvl5/api.c @@ -3,22 +3,30 @@ #include #include +#if defined(ENABLE_SIGN) +SQISIGN_API int -crypto_sign_keypair(unsigned char *pk, unsigned char *sk) { +crypto_sign_keypair(unsigned char *pk, unsigned char *sk) +{ return sqisign_keypair(pk, sk); } +SQISIGN_API int crypto_sign(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) { + const unsigned char *sk) +{ return sqisign_sign(sm, smlen, m, mlen, sk); } +#endif +SQISIGN_API int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) { + const unsigned char *pk) +{ return sqisign_open(m, mlen, sm, smlen, pk); } diff --git a/src/nistapi/lvl5/api.h b/src/nistapi/lvl5/api.h index 69226c2..dee239e 100644 --- a/src/nistapi/lvl5/api.h +++ b/src/nistapi/lvl5/api.h @@ -3,20 +3,27 @@ #ifndef api_h #define api_h -#define CRYPTO_SECRETKEYBYTES 1509 -#define CRYPTO_PUBLICKEYBYTES 128 -#define CRYPTO_BYTES 335 +#include -#define CRYPTO_ALGNAME "lvl5" +#define CRYPTO_SECRETKEYBYTES 701 +#define CRYPTO_PUBLICKEYBYTES 129 +#define CRYPTO_BYTES 292 +#define CRYPTO_ALGNAME "SQIsign_lvl5" + +#if defined(ENABLE_SIGN) +SQISIGN_API int crypto_sign_keypair(unsigned char *pk, unsigned char *sk); +SQISIGN_API int crypto_sign(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, const unsigned char *sk); +#endif +SQISIGN_API int crypto_sign_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long smlen, diff --git a/src/precomp/ref/lvl1/CMakeLists.txt b/src/precomp/ref/lvl1/CMakeLists.txt index 2fd08d3..c7637fa 100644 --- a/src/precomp/ref/lvl1/CMakeLists.txt +++ b/src/precomp/ref/lvl1/CMakeLists.txt @@ -1,49 +1 @@ -set(SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF - torsion_constants.c - quaternion_data.c - endomorphism_action.c - klpt_constants.c -) - -add_library(${LIB_PRECOMP_${SVARIANT_UPPER}} ${SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE common ${INC_INTBIG} ${INC_QUATERNION} ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src/ec/ref/include ${PROJECT_SOURCE_DIR}/src/ec/ref/${SVARIANT_LOWER}/include ${PROJECT_SOURCE_DIR}/src/gf/ref/${SVARIANT_LOWER}/include ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_COMMON}) -target_compile_options(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_custom_command( - OUTPUT - "${CMAKE_CURRENT_SOURCE_DIR}/torsion_constants.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/torsion_constants.h" - "${CMAKE_CURRENT_SOURCE_DIR}/include/klpt_constants.h" - "${CMAKE_CURRENT_SOURCE_DIR}/klpt_constants.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/encoded_sizes.h" - "${PROJECT_SOURCE_DIR}/src/nistapi/lvl1/api.h" - "${CMAKE_CURRENT_SOURCE_DIR}/quaternion_data.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/quaternion_data.h" - "${CMAKE_CURRENT_SOURCE_DIR}/endomorphism_action.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/endomorphism_action.h" - COMMAND - echo "Please run manually: make precomp" -) - -find_program(SAGEMATH sage) -add_custom_target(precomp_${SVARIANT_LOWER} - DEPENDS - "./sqisign_parameters.txt" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_torsion_constants.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_klpt_constants.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_sizes.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_quaternion_data.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_endomorphism_action.sage" - WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" -) - -set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM true) -set_target_properties(precomp_${SVARIANT_LOWER} PROPERTIES EXCLUDE_FROM_ALL TRUE) - -add_dependencies(precomp precomp_lvl1) +include(../lvlx.cmake) diff --git a/src/precomp/ref/lvl1/e0_basis.c b/src/precomp/ref/lvl1/e0_basis.c new file mode 100644 index 0000000..5be2b8e --- /dev/null +++ b/src/precomp/ref/lvl1/e0_basis.c @@ -0,0 +1,55 @@ +#include +const fp2_t BASIS_E0_PX = { +#if 0 +#elif RADIX == 16 +{0x107, 0xc, 0x1890, 0xf2a, 0x52b, 0xb68, 0x152d, 0xa4c, 0x1054, 0x642, 0x36a, 0x6f8, 0x7ad, 0x146c, 0x1d66, 0x1b67, 0x236, 0x10d, 0x1933, 0x3} +#elif RADIX == 32 +{0x3020e, 0xb795624, 0x5ab6829, 0x1514995, 0x1b5190a, 0x187ad37c, 0x19facd46, 0x8688db6, 0x3c998} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x52b795624001810, 0x8c8505452654b56d, 0xf59a8d87ad37c0da, 0x24e4cc21a236db3} +#else +{0x5bcab12000c08, 0x452654b56d052, 0x26f81b5190a0a, 0x36cfd66a361eb, 0x12726610d11b} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1f87, 0x83e, 0x32e, 0xe58, 0xd9d, 0x1416, 0x752, 0x13b4, 0x1efa, 0xe62, 0x12f5, 0x1907, 0x1814, 0x1ddd, 0x1aa6, 0x1420, 0x2cd, 0x1431, 0x1be2, 0x7} +#elif RADIX == 32 +{0x120fbf0f, 0x1d72c0cb, 0xa54166c, 0x1bea7687, 0x197ab98b, 0x1b814c83, 0x8354ddd, 0x188b368, 0x2df15} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xcd9d72c0cb907df8, 0x5cc5efa9da1d4a82, 0x6a9bbbb814c83cbd, 0x26ef8a8622cda10} +#else +{0x6b96065c83efc, 0x29da1d4a82cd9, 0x190797ab98bdf, 0x6841aa6eeee05, 0x1377c5431166} +#endif +#endif +}; +const fp2_t BASIS_E0_QX = { +#if 0 +#elif RADIX == 16 +{0x5ff, 0x1783, 0xadc, 0x775, 0xad4, 0x593, 0xb4c, 0x21e, 0x1cb2, 0x13d8, 0x179f, 0x680, 0x1a9c, 0x1824, 0x118e, 0x13d9, 0x24, 0x1956, 0x1dd2, 0x9} +#elif RADIX == 32 +{0x5e0cbff, 0x143baab7, 0x9859356, 0x12c843cb, 0xbcfcf63, 0x9a9c340, 0x16631d82, 0xab00927, 0x4ee96} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6ad43baab72f065f, 0xe7b1cb210f2d30b2, 0xc63b049a9c3405e7, 0x4ff74b2ac0249ec} +#else +{0x21dd55b97832f, 0x210f2d30b26ad, 0x680bcfcf6396, 0x27b318ec126a7, 0x4ffba5956012} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1c7f, 0x1117, 0xa4, 0x1164, 0x6e, 0x1e63, 0x1b7b, 0x1305, 0x424, 0x131a, 0x1b61, 0xae3, 0x17b1, 0xe5e, 0x1848, 0x1e81, 0x14a5, 0x1cb5, 0x1d87, 0x8} +#elif RADIX == 32 +{0x445f8ff, 0xe8b2029, 0xf7e6303, 0x109260bb, 0x1db0cc68, 0x1d7b1571, 0x7090e5, 0x5ad297d, 0x3ec3f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x606e8b2029222fc7, 0x6634424982edefcc, 0xe121cbd7b1571ed8, 0x4f761f96b4a5f40} +#else +{0x74590149117e3, 0x4982edefcc606, 0x2ae3db0cc6884, 0x7d0384872f5ec, 0x4fbb0fcb5a52} +#endif +#endif +}; diff --git a/src/precomp/ref/lvl1/ec_params.c b/src/precomp/ref/lvl1/ec_params.c new file mode 100644 index 0000000..5011f10 --- /dev/null +++ b/src/precomp/ref/lvl1/ec_params.c @@ -0,0 +1,4 @@ +#include +// p+1 divided by the power of 2 +const digit_t p_cofactor_for_2f[1] = {5}; + diff --git a/src/precomp/ref/lvl1/endomorphism_action.c b/src/precomp/ref/lvl1/endomorphism_action.c index 9114d1e..abeddc3 100644 --- a/src/precomp/ref/lvl1/endomorphism_action.c +++ b/src/precomp/ref/lvl1/endomorphism_action.c @@ -1,56 +1,3336 @@ #include #include #include +const curve_with_endomorphism_ring_t CURVES_WITH_ENDOMORPHISMS[7] = {{{{ #if 0 -#elif 8*DIGIT_LEN == 16 -const ec_basis_t BASIS_EVEN = {{{{0xaa6456e57b3d0e5c, 0x6e1e74cfc06d9529, 0xe77005c1d8e998d9, 0x207aef3d73fb9e71}, {0x918dbc45635410cb, 0x6ee588ba09396573, 0x68aa64be61e6f4c4, 0x16e37aee06350f3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xc71dcbb1e0f986f5, 0xbd60f6c8d8c31906, 0x753a060121887848, 0x2104aa23e92066b1}, {0x187b3ab8b007ee01, 0xa0cfdf9999fd088e, 0x1dbb43376c18e129, 0x1be43892abe83cab}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x5f063c05ab333c4b, 0x9432317b20a4a9dd, 0x3d246e5d9e99e169, 0x112c26ed94c42aea}, {0xf650f44ad5ca0053, 0xbe39aa3b866de04d, 0x8eca3998d4b32c4d, 0x24e1dfdd264f7289}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0x9225eb7dc4964589, 0x84809bd2660ac787, 0x9b120b36af060f7b, 0x26c6e5fb8ba413a2}, {0xc3243c45368044cd, 0xf4c6c6136b0396e3, 0x36e7ca367bcda18e, 0x2b2ea4f64b8d9b4d}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x2e78d4ca270d7e6b, 0xf9ac7eaa9713ab55, 0x6b68d02784ce09b1, 0x33fe700247f21db9}, {0x72995ed7921505e9, 0x9af528d378e626ba, 0x319a09e659f3fbf, 0x14f7b599168ae1bb}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x1fc31ea8afacffa9, 0x2198ad06ba5f7c1e, 0x867ee910c84f9241, 0x22f0ae8a117bf50}, {0x7624b1b2a61cca63, 0x6de050872be1c855, 0xf26e2a76937d44db, 0x13e175482bc586c4}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x1821f9af01cc0789, 0x66b67297ef3013a7, 0xe2f055ae52632d3d, 0xdadc43eddf1c21b}, {0xd236109f47f870ac, 0xf229a667744c0266, 0xf9d93d6f01f921fa, 0x2c3b6b5594983796}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x3abe763db230770c, 0xe4f9d39d2c76dbde, 0x15233adf6bc96db0, 0x9e8670c2795523}, {0xd80ba0bdd941e6ea, 0x6ff5c7474a4a781e, 0x9f7a618e8469d0a2, 0x304a4540668f3eb3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xb4ac0084a2b43849, 0xf00f44c1e014f6b5, 0x1bd32f9f8e5196ea, 0x15f9e117c931dba}, {0x682ed40c9aba9b0c, 0x23ecbcd17bcf48bb, 0xa965b22a1497f9d3, 0xcc6dae3c8db528a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xb382773d0ee2c6c5, 0x79bf22b00e75b701, 0x3dad4448a15e78b8, 0x2eb8550cb8d850d7}, {0x3289f573f719e381, 0xbeed476da914eb33, 0x6842f12d33d945f8, 0x1198a19ef03352bd}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x2c70e2ff4f8ed280, 0xd57145fbbd907950, 0x1ddf917bc2cd217f, 0x645838fc77dbffc}, {0x964fa32cefd3fdeb, 0xd551d0d6d0d1947b, 0x557b59a0b5fe55fc, 0x26cdcead70200b29}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x1e1dfa89820375fa, 0xf99b7f5e9addf912, 0xb316e64530602ca4, 0x1f6c3e438538999f}, {0x15924ed1bb15198, 0x4b5e6672bbda95e3, 0x6145e2a98ca22c88, 0xfcfc3a246698c7c}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x1821f9af01cc0789, 0x66b67297ef3013a7, 0xe2f055ae52632d3d, 0xdadc43eddf1c21b}, {0xd236109f47f870ac, 0xf229a667744c0266, 0xf9d93d6f01f921fa, 0x2c3b6b5594983796}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x3abe763db230770c, 0xe4f9d39d2c76dbde, 0x15233adf6bc96db0, 0x9e8670c2795523}, {0xd80ba0bdd941e6ea, 0x6ff5c7474a4a781e, 0x9f7a618e8469d0a2, 0x304a4540668f3eb3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xb4ac0084a2b43849, 0xf00f44c1e014f6b5, 0x1bd32f9f8e5196ea, 0x15f9e117c931dba}, {0x682ed40c9aba9b0c, 0x23ecbcd17bcf48bb, 0xa965b22a1497f9d3, 0xcc6dae3c8db528a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0x94437da213f9a8b1, 0xaba06afd54324148, 0x88ae0c022485a5f0, 0x14c75d2e824d358c}, {0xf66dc2e267ccd26c, 0x4874947cabbe1286, 0x9d58768934cf0ac, 0x204e323f499fb9c7}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x6df59b590d8b49c3, 0x1a9d2f960b7a3739, 0xb07ddc58241945ff, 0x3484655e395cb341}, {0x304ad2e438e5e35d, 0x2dae483b5d058280, 0x6f8c329dfd772ab6, 0x3185a956086f9c3a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xc005575f13b6b2c2, 0xddf9a6915407672a, 0x2c9a775fc6672c13, 0x1e1cabf3a03e1a97}, {0x63582f61f3e388aa, 0xcb1e01ccb3f27f1d, 0xd2f07c8953154892, 0x31dfa2e1a8469e03}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x46a8,0x9057,0x86de,0xcba9,0xc982,0xce00,0x3e5,0xafe9,0x7503,0xb4f7,0x31d9,0x45f1,0xb772,0x4e23,0x3858,0xcfd8,0x4244,0xf58d,0x271b,0x3760,0x5e52,0x9b69,0xb03c,0x29df,0x6f76}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x6727,0x3496,0xa592,0xd124,0xb138,0x5406,0x1e37,0xb681,0x76ad,0xc6bb,0x3525,0x6e4f,0xd837,0x95a4,0x9c8e,0x7ab7,0x2da8,0x8205,0x4c09,0x3094,0x3570,0x4038,0x4a69,0x2a6d,0xcee0,0x2}}}}, {{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x3fa9,0x8525,0xf0a8,0x5add,0xedd1,0xbf8,0xc425,0xab51,0x3750,0x2506,0x4007,0x68,0x782a,0x50ad,0xac25,0x9d19,0x61a2,0x845b,0x6841,0x3bfe,0x18f1,0x7633,0x7ee4,0x8fe2,0x2e11,0x5}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xb958,0x6fa8,0x7921,0x3456,0xfe7d,0x2ee0,0xd079,0xa9ed,0x3802,0xb215,0xfbd7,0x2861,0xd953,0xec53,0xc535,0xdcd9,0x22ea,0x9a6c,0x7b8,0x3207,0x7ed8,0x88c4,0x5112,0xbcd6,0x8860,0xb}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x8354,0xab63,0x73ba,0x2683,0x8448,0x368b,0x2cd5,0xc866,0x2b98,0x9216,0x53,0x88ab,0x347b,0xb226,0xfa60,0x3176,0x6542,0x6238,0x1e2c,0xa818,0x32f4,0xaf7a,0x882d,0xd0e1,0x29ca,0x6}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x10cf,0xf3dd,0x6e4e,0xe4d9,0xded9,0xd202,0x9877,0x2a7d,0x622f,0x396a,0xa0ef,0x5d91,0x65aa,0x4bcc,0xc09e,0x6a38,0x1eed,0x73c8,0x2bad,0xd729,0x39c9,0xaf44,0xfe5b,0x426b,0x97df,0x4}}}}, {{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xfebf,0x9134,0xff6b,0xdcc8,0xc195,0xc004,0xcffc,0xdb6,0xe162,0xffcc,0x3ce8,0xa30f,0x3924,0x8354,0xfb23,0xd944,0x52f4,0x6855,0x8c09,0xeb48,0x7623,0xb14a,0x6d25,0x3a99,0xc7db,0x5}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x7cac,0x549c,0x8c45,0xd97c,0x43b7,0xc656,0xa789,0x9170,0x816d,0xd4f6,0x2d5d,0xe5a8,0x5c49,0x8851,0x32d,0x7b3b,0xffed,0x2dc0,0x10a8,0xc14f,0xaa35,0x74b3,0x7921,0x15d4,0xce0c,0x5}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xcf39,0x123e,0x7e70,0x506e,0xc931,0x1913,0x6a42,0xc5f,0x890e,0x46e0,0x8d25,0x8c50,0x50f6,0x2e4e,0x6efa,0xa17e,0xae62,0x868e,0x7a98,0x601,0x2d87,0xcf47,0xfed6,0x5274,0x9d7c,0x5}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xd40c,0x78cc,0xb84c,0x8d05,0xea7a,0x2f1b,0xb273,0x7369,0x9dd7,0x2ce8,0xfa0b,0xc55c,0x1662,0x5710,0xbdc5,0xc9b4,0x318c,0xd27a,0xd4d7,0x3665,0x49f,0x71e7,0xdf5c,0x79c7,0xde2d,0x7}}}}, {{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xf71c,0x75ce,0xa9e9,0xb3d9,0x1118,0xbf1a,0x6441,0x7cd5,0xc3a,0xd7fb,0x1ac0,0xc439,0xeef7,0x9f3b,0x4181,0x7f05,0x7aed,0x1582,0x5bd0,0x920d,0x9286,0x3b44,0x9aa4,0xc48f,0x8111,0x5}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x30c7,0xedc1,0x818f,0xaf91,0xfece,0xe3cd,0x6a1c,0x4d77,0x23f8,0x202c,0xa08c,0xe202,0x3fce,0xc29,0x8e94,0xb33,0xb6cd,0x96a,0xb43c,0x6365,0xafa3,0x54e6,0x278,0x9441,0x5a5a,0x6}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x46a8,0x9057,0x86de,0xcba9,0xc982,0xce00,0x3e5,0xafe9,0x7503,0xb4f7,0x31d9,0x45f1,0xb772,0x4e23,0x3858,0xcfd8,0x4244,0xf58d,0x271b,0x3760,0x5e52,0x9b69,0xb03c,0x29df,0x6f76}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x6727,0x3496,0xa592,0xd124,0xb138,0x5406,0x1e37,0xb681,0x76ad,0xc6bb,0x3525,0x6e4f,0xd837,0x95a4,0x9c8e,0x7ab7,0x2da8,0x8205,0x4c09,0x3094,0x3570,0x4038,0x4a69,0x2a6d,0xcee0,0x2}}}}, {{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x3fa9,0x8525,0xf0a8,0x5add,0xedd1,0xbf8,0xc425,0xab51,0x3750,0x2506,0x4007,0x68,0x782a,0x50ad,0xac25,0x9d19,0x61a2,0x845b,0x6841,0x3bfe,0x18f1,0x7633,0x7ee4,0x8fe2,0x2e11,0x5}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xb958,0x6fa8,0x7921,0x3456,0xfe7d,0x2ee0,0xd079,0xa9ed,0x3802,0xb215,0xfbd7,0x2861,0xd953,0xec53,0xc535,0xdcd9,0x22ea,0x9a6c,0x7b8,0x3207,0x7ed8,0x88c4,0x5112,0xbcd6,0x8860,0xb}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x64fe,0x9ddd,0x7d4c,0x7916,0x26e5,0x8246,0x985d,0x3c27,0xd04e,0xa386,0x1916,0xe74e,0xf5f6,0x8024,0x995c,0x80a7,0xd3c3,0x2be2,0x22a4,0x6fbc,0xc8a3,0x2571,0x9c35,0x7d60,0x4ca0,0x3}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0xbbfb,0x9439,0x9f0,0x5aff,0xc809,0x9304,0x5b57,0x707f,0xec6e,0x8012,0x6b0a,0xe5f0,0x9ef0,0x70b8,0x2e96,0xf278,0xa64a,0x7ae6,0xbbdb,0x3de,0x379d,0x77be,0xa462,0xb66c,0xb35f,0x3}}}}, {{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x1f34,0xb2d,0x780a,0x9bd3,0xbbb3,0x646f,0xb440,0x896f,0xe2dc,0xc5ef,0x5550,0x8e5,0xa10a,0x873c,0x526b,0x9188,0xce3,0xbe55,0x118f,0xc857,0xb61f,0xa5d5,0xf6ac,0xd898,0x76e1,0xb}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x9b02,0x6222,0x82b3,0x86e9,0xa11a,0x7a9b,0x3c01,0x1daf,0xdcb8,0xc385,0x149a,0x8705,0x9ace,0xba52,0x6431,0x2c0a,0x916c,0x6416,0xc30,0xf9ab,0x1486,0xfebc,0x6519,0x6955,0xab36,0x8}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x679d,0x91f,0x3f38,0xa837,0xc898,0x8afa,0x1f50,0x331b,0x9b0a,0x56f6,0xdd6b,0xfd51,0xf0dd,0x3462,0x3644,0x2718,0x9c9,0x8b44,0x54b6,0xb7b4,0x8558,0xf9ba,0x8012,0x9c95,0xcaa9,0x8}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x6a06,0x3c66,0xdc26,0x4682,0xd93d,0x15fe,0x4369,0xe6a0,0xa56e,0x49fa,0x13de,0x19d8,0xd394,0xc8c3,0x5da9,0x3b33,0xcb5e,0x3139,0x81d6,0xcfe6,0x70e4,0xcb0a,0xf055,0x303e,0xeb02,0x9}}}}, {{{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x7b8e,0xbae7,0xd4f4,0x59ec,0x88c,0xdf8d,0xb220,0x3e6a,0x861d,0x6bfd,0x8d60,0xe21c,0xf77b,0xcf9d,0xa0c0,0xbf82,0x3d76,0xac1,0xade8,0x4906,0x4943,0x1da2,0xcd52,0xe247,0xc088,0x2}}}, {{._mp_alloc = 0, ._mp_size = 26, ._mp_d = (mp_limb_t[]) {0x9864,0xf6e0,0xc0c7,0x57c8,0xff67,0x71e6,0xb50e,0x26bb,0x11fc,0x1016,0x5046,0x7101,0x9fe7,0x614,0xc74a,0x8599,0x5b66,0x4b5,0xda1e,0xb1b2,0x57d1,0x2a73,0x813c,0x4a20,0x2d2d,0x3}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xa12e,0x6526,0xbcc1,0x5f91,0x18ef,0x4f6f,0x5206,0x73e4,0xe166,0x894b,0x63d0,0x3525,0xe0c3,0x5118,0x4d54,0xb2aa,0x12f2}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x255d,0x6cb1,0x39e6,0xeabd,0xf4f1,0x2b10,0xff77,0x8cc6,0x18d9,0xe0a9,0xade1,0x7274,0xec7c,0x8af5,0xde41,0xf859,0x8791}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x4550,0xc754,0xbb43,0xd9c9,0x1e09,0xf476,0x91c3,0x8f4f,0xae13,0x654d,0xc39b,0xbd46,0x5e10,0xbc3d,0xe06a,0x6ba6,0x32c4}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x5307,0xac34,0xc11e,0xde5,0x1e71,0x52c0,0x45fe,0xea6e,0x48d8,0xa5c4,0x4744,0xe26,0x47,0x7275,0x5965,0x8645,0xa46e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xf8fb,0x5ec5,0xdde5,0xed0c,0x7184,0x437d,0x1a51,0xe32f,0x673,0xa6f0,0x1916,0x8d28,0xac10,0x2e62,0xdf2c,0xccb2,0x2ce7}}}}}; -#elif 8*DIGIT_LEN == 32 -const ec_basis_t BASIS_EVEN = {{{{0xaa6456e57b3d0e5c, 0x6e1e74cfc06d9529, 0xe77005c1d8e998d9, 0x207aef3d73fb9e71}, {0x918dbc45635410cb, 0x6ee588ba09396573, 0x68aa64be61e6f4c4, 0x16e37aee06350f3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xc71dcbb1e0f986f5, 0xbd60f6c8d8c31906, 0x753a060121887848, 0x2104aa23e92066b1}, {0x187b3ab8b007ee01, 0xa0cfdf9999fd088e, 0x1dbb43376c18e129, 0x1be43892abe83cab}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x5f063c05ab333c4b, 0x9432317b20a4a9dd, 0x3d246e5d9e99e169, 0x112c26ed94c42aea}, {0xf650f44ad5ca0053, 0xbe39aa3b866de04d, 0x8eca3998d4b32c4d, 0x24e1dfdd264f7289}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0x9225eb7dc4964589, 0x84809bd2660ac787, 0x9b120b36af060f7b, 0x26c6e5fb8ba413a2}, {0xc3243c45368044cd, 0xf4c6c6136b0396e3, 0x36e7ca367bcda18e, 0x2b2ea4f64b8d9b4d}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x2e78d4ca270d7e6b, 0xf9ac7eaa9713ab55, 0x6b68d02784ce09b1, 0x33fe700247f21db9}, {0x72995ed7921505e9, 0x9af528d378e626ba, 0x319a09e659f3fbf, 0x14f7b599168ae1bb}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x1fc31ea8afacffa9, 0x2198ad06ba5f7c1e, 0x867ee910c84f9241, 0x22f0ae8a117bf50}, {0x7624b1b2a61cca63, 0x6de050872be1c855, 0xf26e2a76937d44db, 0x13e175482bc586c4}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x1821f9af01cc0789, 0x66b67297ef3013a7, 0xe2f055ae52632d3d, 0xdadc43eddf1c21b}, {0xd236109f47f870ac, 0xf229a667744c0266, 0xf9d93d6f01f921fa, 0x2c3b6b5594983796}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x3abe763db230770c, 0xe4f9d39d2c76dbde, 0x15233adf6bc96db0, 0x9e8670c2795523}, {0xd80ba0bdd941e6ea, 0x6ff5c7474a4a781e, 0x9f7a618e8469d0a2, 0x304a4540668f3eb3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xb4ac0084a2b43849, 0xf00f44c1e014f6b5, 0x1bd32f9f8e5196ea, 0x15f9e117c931dba}, {0x682ed40c9aba9b0c, 0x23ecbcd17bcf48bb, 0xa965b22a1497f9d3, 0xcc6dae3c8db528a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xb382773d0ee2c6c5, 0x79bf22b00e75b701, 0x3dad4448a15e78b8, 0x2eb8550cb8d850d7}, {0x3289f573f719e381, 0xbeed476da914eb33, 0x6842f12d33d945f8, 0x1198a19ef03352bd}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x2c70e2ff4f8ed280, 0xd57145fbbd907950, 0x1ddf917bc2cd217f, 0x645838fc77dbffc}, {0x964fa32cefd3fdeb, 0xd551d0d6d0d1947b, 0x557b59a0b5fe55fc, 0x26cdcead70200b29}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x1e1dfa89820375fa, 0xf99b7f5e9addf912, 0xb316e64530602ca4, 0x1f6c3e438538999f}, {0x15924ed1bb15198, 0x4b5e6672bbda95e3, 0x6145e2a98ca22c88, 0xfcfc3a246698c7c}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x1821f9af01cc0789, 0x66b67297ef3013a7, 0xe2f055ae52632d3d, 0xdadc43eddf1c21b}, {0xd236109f47f870ac, 0xf229a667744c0266, 0xf9d93d6f01f921fa, 0x2c3b6b5594983796}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x3abe763db230770c, 0xe4f9d39d2c76dbde, 0x15233adf6bc96db0, 0x9e8670c2795523}, {0xd80ba0bdd941e6ea, 0x6ff5c7474a4a781e, 0x9f7a618e8469d0a2, 0x304a4540668f3eb3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xb4ac0084a2b43849, 0xf00f44c1e014f6b5, 0x1bd32f9f8e5196ea, 0x15f9e117c931dba}, {0x682ed40c9aba9b0c, 0x23ecbcd17bcf48bb, 0xa965b22a1497f9d3, 0xcc6dae3c8db528a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0x94437da213f9a8b1, 0xaba06afd54324148, 0x88ae0c022485a5f0, 0x14c75d2e824d358c}, {0xf66dc2e267ccd26c, 0x4874947cabbe1286, 0x9d58768934cf0ac, 0x204e323f499fb9c7}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x6df59b590d8b49c3, 0x1a9d2f960b7a3739, 0xb07ddc58241945ff, 0x3484655e395cb341}, {0x304ad2e438e5e35d, 0x2dae483b5d058280, 0x6f8c329dfd772ab6, 0x3185a956086f9c3a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xc005575f13b6b2c2, 0xddf9a6915407672a, 0x2c9a775fc6672c13, 0x1e1cabf3a03e1a97}, {0x63582f61f3e388aa, 0xcb1e01ccb3f27f1d, 0xd2f07c8953154892, 0x31dfa2e1a8469e03}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x905746a8,0xcba986de,0xce00c982,0xafe903e5,0xb4f77503,0x45f131d9,0x4e23b772,0xcfd83858,0xf58d4244,0x3760271b,0x9b695e52,0x29dfb03c,0x6f76}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x34966727,0xd124a592,0x5406b138,0xb6811e37,0xc6bb76ad,0x6e4f3525,0x95a4d837,0x7ab79c8e,0x82052da8,0x30944c09,0x40383570,0x2a6d4a69,0x2cee0}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x85253fa9,0x5addf0a8,0xbf8edd1,0xab51c425,0x25063750,0x684007,0x50ad782a,0x9d19ac25,0x845b61a2,0x3bfe6841,0x763318f1,0x8fe27ee4,0x52e11}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x6fa8b958,0x34567921,0x2ee0fe7d,0xa9edd079,0xb2153802,0x2861fbd7,0xec53d953,0xdcd9c535,0x9a6c22ea,0x320707b8,0x88c47ed8,0xbcd65112,0xb8860}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xab638354,0x268373ba,0x368b8448,0xc8662cd5,0x92162b98,0x88ab0053,0xb226347b,0x3176fa60,0x62386542,0xa8181e2c,0xaf7a32f4,0xd0e1882d,0x629ca}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xf3dd10cf,0xe4d96e4e,0xd202ded9,0x2a7d9877,0x396a622f,0x5d91a0ef,0x4bcc65aa,0x6a38c09e,0x73c81eed,0xd7292bad,0xaf4439c9,0x426bfe5b,0x497df}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x9134febf,0xdcc8ff6b,0xc004c195,0xdb6cffc,0xffcce162,0xa30f3ce8,0x83543924,0xd944fb23,0x685552f4,0xeb488c09,0xb14a7623,0x3a996d25,0x5c7db}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x549c7cac,0xd97c8c45,0xc65643b7,0x9170a789,0xd4f6816d,0xe5a82d5d,0x88515c49,0x7b3b032d,0x2dc0ffed,0xc14f10a8,0x74b3aa35,0x15d47921,0x5ce0c}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x123ecf39,0x506e7e70,0x1913c931,0xc5f6a42,0x46e0890e,0x8c508d25,0x2e4e50f6,0xa17e6efa,0x868eae62,0x6017a98,0xcf472d87,0x5274fed6,0x59d7c}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x78ccd40c,0x8d05b84c,0x2f1bea7a,0x7369b273,0x2ce89dd7,0xc55cfa0b,0x57101662,0xc9b4bdc5,0xd27a318c,0x3665d4d7,0x71e7049f,0x79c7df5c,0x7de2d}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x75cef71c,0xb3d9a9e9,0xbf1a1118,0x7cd56441,0xd7fb0c3a,0xc4391ac0,0x9f3beef7,0x7f054181,0x15827aed,0x920d5bd0,0x3b449286,0xc48f9aa4,0x58111}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xedc130c7,0xaf91818f,0xe3cdfece,0x4d776a1c,0x202c23f8,0xe202a08c,0xc293fce,0xb338e94,0x96ab6cd,0x6365b43c,0x54e6afa3,0x94410278,0x65a5a}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x905746a8,0xcba986de,0xce00c982,0xafe903e5,0xb4f77503,0x45f131d9,0x4e23b772,0xcfd83858,0xf58d4244,0x3760271b,0x9b695e52,0x29dfb03c,0x6f76}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x34966727,0xd124a592,0x5406b138,0xb6811e37,0xc6bb76ad,0x6e4f3525,0x95a4d837,0x7ab79c8e,0x82052da8,0x30944c09,0x40383570,0x2a6d4a69,0x2cee0}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x85253fa9,0x5addf0a8,0xbf8edd1,0xab51c425,0x25063750,0x684007,0x50ad782a,0x9d19ac25,0x845b61a2,0x3bfe6841,0x763318f1,0x8fe27ee4,0x52e11}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x6fa8b958,0x34567921,0x2ee0fe7d,0xa9edd079,0xb2153802,0x2861fbd7,0xec53d953,0xdcd9c535,0x9a6c22ea,0x320707b8,0x88c47ed8,0xbcd65112,0xb8860}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x9ddd64fe,0x79167d4c,0x824626e5,0x3c27985d,0xa386d04e,0xe74e1916,0x8024f5f6,0x80a7995c,0x2be2d3c3,0x6fbc22a4,0x2571c8a3,0x7d609c35,0x34ca0}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x9439bbfb,0x5aff09f0,0x9304c809,0x707f5b57,0x8012ec6e,0xe5f06b0a,0x70b89ef0,0xf2782e96,0x7ae6a64a,0x3debbdb,0x77be379d,0xb66ca462,0x3b35f}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xb2d1f34,0x9bd3780a,0x646fbbb3,0x896fb440,0xc5efe2dc,0x8e55550,0x873ca10a,0x9188526b,0xbe550ce3,0xc857118f,0xa5d5b61f,0xd898f6ac,0xb76e1}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x62229b02,0x86e982b3,0x7a9ba11a,0x1daf3c01,0xc385dcb8,0x8705149a,0xba529ace,0x2c0a6431,0x6416916c,0xf9ab0c30,0xfebc1486,0x69556519,0x8ab36}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x91f679d,0xa8373f38,0x8afac898,0x331b1f50,0x56f69b0a,0xfd51dd6b,0x3462f0dd,0x27183644,0x8b4409c9,0xb7b454b6,0xf9ba8558,0x9c958012,0x8caa9}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x3c666a06,0x4682dc26,0x15fed93d,0xe6a04369,0x49faa56e,0x19d813de,0xc8c3d394,0x3b335da9,0x3139cb5e,0xcfe681d6,0xcb0a70e4,0x303ef055,0x9eb02}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xbae77b8e,0x59ecd4f4,0xdf8d088c,0x3e6ab220,0x6bfd861d,0xe21c8d60,0xcf9df77b,0xbf82a0c0,0xac13d76,0x4906ade8,0x1da24943,0xe247cd52,0x2c088}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xf6e09864,0x57c8c0c7,0x71e6ff67,0x26bbb50e,0x101611fc,0x71015046,0x6149fe7,0x8599c74a,0x4b55b66,0xb1b2da1e,0x2a7357d1,0x4a20813c,0x32d2d}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x6526a12e,0x5f91bcc1,0x4f6f18ef,0x73e45206,0x894be166,0x352563d0,0x5118e0c3,0xb2aa4d54,0x12f2}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x6cb1255d,0xeabd39e6,0x2b10f4f1,0x8cc6ff77,0xe0a918d9,0x7274ade1,0x8af5ec7c,0xf859de41,0x8791}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xc7544550,0xd9c9bb43,0xf4761e09,0x8f4f91c3,0x654dae13,0xbd46c39b,0xbc3d5e10,0x6ba6e06a,0x32c4}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xac345307,0xde5c11e,0x52c01e71,0xea6e45fe,0xa5c448d8,0xe264744,0x72750047,0x86455965,0xa46e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x5ec5f8fb,0xed0cdde5,0x437d7184,0xe32f1a51,0xa6f00673,0x8d281916,0x2e62ac10,0xccb2df2c,0x2ce7}}}}}; -#elif 8*DIGIT_LEN == 64 -const ec_basis_t BASIS_EVEN = {{{{0xaa6456e57b3d0e5c, 0x6e1e74cfc06d9529, 0xe77005c1d8e998d9, 0x207aef3d73fb9e71}, {0x918dbc45635410cb, 0x6ee588ba09396573, 0x68aa64be61e6f4c4, 0x16e37aee06350f3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xc71dcbb1e0f986f5, 0xbd60f6c8d8c31906, 0x753a060121887848, 0x2104aa23e92066b1}, {0x187b3ab8b007ee01, 0xa0cfdf9999fd088e, 0x1dbb43376c18e129, 0x1be43892abe83cab}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x5f063c05ab333c4b, 0x9432317b20a4a9dd, 0x3d246e5d9e99e169, 0x112c26ed94c42aea}, {0xf650f44ad5ca0053, 0xbe39aa3b866de04d, 0x8eca3998d4b32c4d, 0x24e1dfdd264f7289}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0x9225eb7dc4964589, 0x84809bd2660ac787, 0x9b120b36af060f7b, 0x26c6e5fb8ba413a2}, {0xc3243c45368044cd, 0xf4c6c6136b0396e3, 0x36e7ca367bcda18e, 0x2b2ea4f64b8d9b4d}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x2e78d4ca270d7e6b, 0xf9ac7eaa9713ab55, 0x6b68d02784ce09b1, 0x33fe700247f21db9}, {0x72995ed7921505e9, 0x9af528d378e626ba, 0x319a09e659f3fbf, 0x14f7b599168ae1bb}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x1fc31ea8afacffa9, 0x2198ad06ba5f7c1e, 0x867ee910c84f9241, 0x22f0ae8a117bf50}, {0x7624b1b2a61cca63, 0x6de050872be1c855, 0xf26e2a76937d44db, 0x13e175482bc586c4}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x1821f9af01cc0789, 0x66b67297ef3013a7, 0xe2f055ae52632d3d, 0xdadc43eddf1c21b}, {0xd236109f47f870ac, 0xf229a667744c0266, 0xf9d93d6f01f921fa, 0x2c3b6b5594983796}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x3abe763db230770c, 0xe4f9d39d2c76dbde, 0x15233adf6bc96db0, 0x9e8670c2795523}, {0xd80ba0bdd941e6ea, 0x6ff5c7474a4a781e, 0x9f7a618e8469d0a2, 0x304a4540668f3eb3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xb4ac0084a2b43849, 0xf00f44c1e014f6b5, 0x1bd32f9f8e5196ea, 0x15f9e117c931dba}, {0x682ed40c9aba9b0c, 0x23ecbcd17bcf48bb, 0xa965b22a1497f9d3, 0xcc6dae3c8db528a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xb382773d0ee2c6c5, 0x79bf22b00e75b701, 0x3dad4448a15e78b8, 0x2eb8550cb8d850d7}, {0x3289f573f719e381, 0xbeed476da914eb33, 0x6842f12d33d945f8, 0x1198a19ef03352bd}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x2c70e2ff4f8ed280, 0xd57145fbbd907950, 0x1ddf917bc2cd217f, 0x645838fc77dbffc}, {0x964fa32cefd3fdeb, 0xd551d0d6d0d1947b, 0x557b59a0b5fe55fc, 0x26cdcead70200b29}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x1e1dfa89820375fa, 0xf99b7f5e9addf912, 0xb316e64530602ca4, 0x1f6c3e438538999f}, {0x15924ed1bb15198, 0x4b5e6672bbda95e3, 0x6145e2a98ca22c88, 0xfcfc3a246698c7c}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x1821f9af01cc0789, 0x66b67297ef3013a7, 0xe2f055ae52632d3d, 0xdadc43eddf1c21b}, {0xd236109f47f870ac, 0xf229a667744c0266, 0xf9d93d6f01f921fa, 0x2c3b6b5594983796}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x3abe763db230770c, 0xe4f9d39d2c76dbde, 0x15233adf6bc96db0, 0x9e8670c2795523}, {0xd80ba0bdd941e6ea, 0x6ff5c7474a4a781e, 0x9f7a618e8469d0a2, 0x304a4540668f3eb3}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xb4ac0084a2b43849, 0xf00f44c1e014f6b5, 0x1bd32f9f8e5196ea, 0x15f9e117c931dba}, {0x682ed40c9aba9b0c, 0x23ecbcd17bcf48bb, 0xa965b22a1497f9d3, 0xcc6dae3c8db528a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0x94437da213f9a8b1, 0xaba06afd54324148, 0x88ae0c022485a5f0, 0x14c75d2e824d358c}, {0xf66dc2e267ccd26c, 0x4874947cabbe1286, 0x9d58768934cf0ac, 0x204e323f499fb9c7}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0x6df59b590d8b49c3, 0x1a9d2f960b7a3739, 0xb07ddc58241945ff, 0x3484655e395cb341}, {0x304ad2e438e5e35d, 0x2dae483b5d058280, 0x6f8c329dfd772ab6, 0x3185a956086f9c3a}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}, {{{0xc005575f13b6b2c2, 0xddf9a6915407672a, 0x2c9a775fc6672c13, 0x1e1cabf3a03e1a97}, {0x63582f61f3e388aa, 0xcb1e01ccb3f27f1d, 0xd2f07c8953154892, 0x31dfa2e1a8469e03}}, {{0x1, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xcba986de905746a8,0xafe903e5ce00c982,0x45f131d9b4f77503,0xcfd838584e23b772,0x3760271bf58d4244,0x29dfb03c9b695e52,0x6f76}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xd124a59234966727,0xb6811e375406b138,0x6e4f3525c6bb76ad,0x7ab79c8e95a4d837,0x30944c0982052da8,0x2a6d4a6940383570,0x2cee0}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x5addf0a885253fa9,0xab51c4250bf8edd1,0x68400725063750,0x9d19ac2550ad782a,0x3bfe6841845b61a2,0x8fe27ee4763318f1,0x52e11}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x345679216fa8b958,0xa9edd0792ee0fe7d,0x2861fbd7b2153802,0xdcd9c535ec53d953,0x320707b89a6c22ea,0xbcd6511288c47ed8,0xb8860}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x268373baab638354,0xc8662cd5368b8448,0x88ab005392162b98,0x3176fa60b226347b,0xa8181e2c62386542,0xd0e1882daf7a32f4,0x629ca}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xe4d96e4ef3dd10cf,0x2a7d9877d202ded9,0x5d91a0ef396a622f,0x6a38c09e4bcc65aa,0xd7292bad73c81eed,0x426bfe5baf4439c9,0x497df}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xdcc8ff6b9134febf,0xdb6cffcc004c195,0xa30f3ce8ffcce162,0xd944fb2383543924,0xeb488c09685552f4,0x3a996d25b14a7623,0x5c7db}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xd97c8c45549c7cac,0x9170a789c65643b7,0xe5a82d5dd4f6816d,0x7b3b032d88515c49,0xc14f10a82dc0ffed,0x15d4792174b3aa35,0x5ce0c}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x506e7e70123ecf39,0xc5f6a421913c931,0x8c508d2546e0890e,0xa17e6efa2e4e50f6,0x6017a98868eae62,0x5274fed6cf472d87,0x59d7c}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x8d05b84c78ccd40c,0x7369b2732f1bea7a,0xc55cfa0b2ce89dd7,0xc9b4bdc557101662,0x3665d4d7d27a318c,0x79c7df5c71e7049f,0x7de2d}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xb3d9a9e975cef71c,0x7cd56441bf1a1118,0xc4391ac0d7fb0c3a,0x7f0541819f3beef7,0x920d5bd015827aed,0xc48f9aa43b449286,0x58111}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xaf91818fedc130c7,0x4d776a1ce3cdfece,0xe202a08c202c23f8,0xb338e940c293fce,0x6365b43c096ab6cd,0x9441027854e6afa3,0x65a5a}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xcba986de905746a8,0xafe903e5ce00c982,0x45f131d9b4f77503,0xcfd838584e23b772,0x3760271bf58d4244,0x29dfb03c9b695e52,0x6f76}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xd124a59234966727,0xb6811e375406b138,0x6e4f3525c6bb76ad,0x7ab79c8e95a4d837,0x30944c0982052da8,0x2a6d4a6940383570,0x2cee0}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x5addf0a885253fa9,0xab51c4250bf8edd1,0x68400725063750,0x9d19ac2550ad782a,0x3bfe6841845b61a2,0x8fe27ee4763318f1,0x52e11}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x345679216fa8b958,0xa9edd0792ee0fe7d,0x2861fbd7b2153802,0xdcd9c535ec53d953,0x320707b89a6c22ea,0xbcd6511288c47ed8,0xb8860}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x79167d4c9ddd64fe,0x3c27985d824626e5,0xe74e1916a386d04e,0x80a7995c8024f5f6,0x6fbc22a42be2d3c3,0x7d609c352571c8a3,0x34ca0}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x5aff09f09439bbfb,0x707f5b579304c809,0xe5f06b0a8012ec6e,0xf2782e9670b89ef0,0x3debbdb7ae6a64a,0xb66ca46277be379d,0x3b35f}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x9bd3780a0b2d1f34,0x896fb440646fbbb3,0x8e55550c5efe2dc,0x9188526b873ca10a,0xc857118fbe550ce3,0xd898f6aca5d5b61f,0xb76e1}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x86e982b362229b02,0x1daf3c017a9ba11a,0x8705149ac385dcb8,0x2c0a6431ba529ace,0xf9ab0c306416916c,0x69556519febc1486,0x8ab36}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xa8373f38091f679d,0x331b1f508afac898,0xfd51dd6b56f69b0a,0x271836443462f0dd,0xb7b454b68b4409c9,0x9c958012f9ba8558,0x8caa9}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x4682dc263c666a06,0xe6a0436915fed93d,0x19d813de49faa56e,0x3b335da9c8c3d394,0xcfe681d63139cb5e,0x303ef055cb0a70e4,0x9eb02}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x59ecd4f4bae77b8e,0x3e6ab220df8d088c,0xe21c8d606bfd861d,0xbf82a0c0cf9df77b,0x4906ade80ac13d76,0xe247cd521da24943,0x2c088}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x57c8c0c7f6e09864,0x26bbb50e71e6ff67,0x71015046101611fc,0x8599c74a06149fe7,0xb1b2da1e04b55b66,0x4a20813c2a7357d1,0x32d2d}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x5f91bcc16526a12e,0x73e452064f6f18ef,0x352563d0894be166,0xb2aa4d545118e0c3,0x12f2}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xeabd39e66cb1255d,0x8cc6ff772b10f4f1,0x7274ade1e0a918d9,0xf859de418af5ec7c,0x8791}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xd9c9bb43c7544550,0x8f4f91c3f4761e09,0xbd46c39b654dae13,0x6ba6e06abc3d5e10,0x32c4}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xde5c11eac345307,0xea6e45fe52c01e71,0xe264744a5c448d8,0x8645596572750047,0xa46e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xed0cdde55ec5f8fb,0xe32f1a51437d7184,0x8d281916a6f00673,0xccb2df2c2e62ac10,0x2ce7}}}}}; +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} #endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x199, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6} +#elif RADIX == 32 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x19, 0x0, 0x0, 0x300000000000000} +#else +{0xc, 0x0, 0x0, 0x0, 0x400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x107, 0xc, 0x1890, 0xf2a, 0x52b, 0xb68, 0x152d, 0xa4c, 0x1054, 0x642, 0x36a, 0x6f8, 0x7ad, 0x146c, 0x1d66, 0x1b67, 0x236, 0x10d, 0x1933, 0x3} +#elif RADIX == 32 +{0x3020e, 0xb795624, 0x5ab6829, 0x1514995, 0x1b5190a, 0x187ad37c, 0x19facd46, 0x8688db6, 0x3c998} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x52b795624001810, 0x8c8505452654b56d, 0xf59a8d87ad37c0da, 0x24e4cc21a236db3} +#else +{0x5bcab12000c08, 0x452654b56d052, 0x26f81b5190a0a, 0x36cfd66a361eb, 0x12726610d11b} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1f87, 0x83e, 0x32e, 0xe58, 0xd9d, 0x1416, 0x752, 0x13b4, 0x1efa, 0xe62, 0x12f5, 0x1907, 0x1814, 0x1ddd, 0x1aa6, 0x1420, 0x2cd, 0x1431, 0x1be2, 0x7} +#elif RADIX == 32 +{0x120fbf0f, 0x1d72c0cb, 0xa54166c, 0x1bea7687, 0x197ab98b, 0x1b814c83, 0x8354ddd, 0x188b368, 0x2df15} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xcd9d72c0cb907df8, 0x5cc5efa9da1d4a82, 0x6a9bbbb814c83cbd, 0x26ef8a8622cda10} +#else +{0x6b96065c83efc, 0x29da1d4a82cd9, 0x190797ab98bdf, 0x6841aa6eeee05, 0x1377c5431166} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x5ff, 0x1783, 0xadc, 0x775, 0xad4, 0x593, 0xb4c, 0x21e, 0x1cb2, 0x13d8, 0x179f, 0x680, 0x1a9c, 0x1824, 0x118e, 0x13d9, 0x24, 0x1956, 0x1dd2, 0x9} +#elif RADIX == 32 +{0x5e0cbff, 0x143baab7, 0x9859356, 0x12c843cb, 0xbcfcf63, 0x9a9c340, 0x16631d82, 0xab00927, 0x4ee96} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6ad43baab72f065f, 0xe7b1cb210f2d30b2, 0xc63b049a9c3405e7, 0x4ff74b2ac0249ec} +#else +{0x21dd55b97832f, 0x210f2d30b26ad, 0x680bcfcf6396, 0x27b318ec126a7, 0x4ffba5956012} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1c7f, 0x1117, 0xa4, 0x1164, 0x6e, 0x1e63, 0x1b7b, 0x1305, 0x424, 0x131a, 0x1b61, 0xae3, 0x17b1, 0xe5e, 0x1848, 0x1e81, 0x14a5, 0x1cb5, 0x1d87, 0x8} +#elif RADIX == 32 +{0x445f8ff, 0xe8b2029, 0xf7e6303, 0x109260bb, 0x1db0cc68, 0x1d7b1571, 0x7090e5, 0x5ad297d, 0x3ec3f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x606e8b2029222fc7, 0x6634424982edefcc, 0xe121cbd7b1571ed8, 0x4f761f96b4a5f40} +#else +{0x74590149117e3, 0x4982edefcc606, 0x2ae3db0cc6884, 0x7d0384872f5ec, 0x4fbb0fcb5a52} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x342, 0xfb7, 0xed, 0x1d80, 0x17f1, 0x4a2, 0x1c26, 0xb96, 0x1367, 0x3dc, 0x1624, 0x1f2a, 0x5e, 0x1cab, 0x27, 0x1e89, 0x1293, 0x1e24, 0x417, 0x5} +#elif RADIX == 32 +{0xbedc685, 0x11ec003b, 0x4c4a2bf, 0xd9d72dc, 0xb120f72, 0x1605ef95, 0x2404fca, 0x1124a4fd, 0x20bf} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x57f1ec003b5f6e34, 0x7b93675cb709894, 0x809f95605ef95589, 0xc905fc49293f44} +#else +{0xf6001dafb71a, 0x75cb70989457f, 0x5f2ab120f726c, 0x7d12027e55817, 0x6482fe24949} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xf3c, 0x1d21, 0xd78, 0xe8e, 0x1f3c, 0x11b, 0x12c, 0x1851, 0x19b1, 0xd9, 0xf3f, 0x759, 0xf47, 0x1e88, 0x56e, 0x8ef, 0x116e, 0x1fa1, 0x1199, 0x0} +#elif RADIX == 32 +{0x7485e78, 0x1c74735e, 0x5811bf9, 0x6c70a21, 0x179f8367, 0x10f473ac, 0x1bcadde8, 0x1d0c5b91, 0x8ccf} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x7f3c74735e3a42f3, 0xc1b39b1c2884b023, 0x95bbd10f473acbcf, 0x3c4667f4316e477} +#else +{0x63a39af1d2179, 0x1c2884b0237f3, 0x675979f836736, 0x11de56ef443d1, 0x462333fa18b7} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x56db,0x1b54,0xbda2,0xc5d3,0xdd06,0x861d,0x9780,0x7475,0x33d1,0x41af,0x34b2,0x7f9d,0x7f8c,0xaa8c,0xb471,0xca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1b5456db,0xc5d3bda2,0x861ddd06,0x74759780,0x41af33d1,0x7f9d34b2,0xaa8c7f8c,0xcab471}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc5d3bda21b5456db,0x74759780861ddd06,0x7f9d34b241af33d1,0xcab471aa8c7f8c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7d7a,0x48b,0x7d32,0x7bfb,0x9bd3,0x63d8,0x9182,0xa955,0x3e1,0x344,0x6861,0x76bf,0x5cd0,0xeeb4,0x4ae3,0x57}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x48b7d7a,0x7bfb7d32,0x63d89bd3,0xa9559182,0x34403e1,0x76bf6861,0xeeb45cd0,0x574ae3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7bfb7d32048b7d7a,0xa955918263d89bd3,0x76bf6861034403e1,0x574ae3eeb45cd0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x444f,0x3698,0xd649,0x856f,0x41db,0x498f,0xafdf,0x189c,0xcb5b,0xe50b,0xbff,0xf7e0,0x47f9,0xa88b,0x35da,0x15}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3698444f,0x856fd649,0x498f41db,0x189cafdf,0xe50bcb5b,0xf7e00bff,0xa88b47f9,0x1535da}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x856fd6493698444f,0x189cafdf498f41db,0xf7e00bffe50bcb5b,0x1535daa88b47f9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa925,0xe4ab,0x425d,0x3a2c,0x22f9,0x79e2,0x687f,0x8b8a,0xcc2e,0xbe50,0xcb4d,0x8062,0x8073,0x5573,0x4b8e,0x35}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe4aba925,0x3a2c425d,0x79e222f9,0x8b8a687f,0xbe50cc2e,0x8062cb4d,0x55738073,0x354b8e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3a2c425de4aba925,0x8b8a687f79e222f9,0x8062cb4dbe50cc2e,0x354b8e55738073}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xabf,0x5490,0xd5fd,0x36ba,0xda0f,0x4a59,0x4eea,0xd1,0xa3f0,0xa7ae,0x6f6,0x9146,0x5004,0xcde6,0xa2d2,0x7d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x54900abf,0x36bad5fd,0x4a59da0f,0xd14eea,0xa7aea3f0,0x914606f6,0xcde65004,0x7da2d2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x36bad5fd54900abf,0xd14eea4a59da0f,0x914606f6a7aea3f0,0x7da2d2cde65004}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8680,0xb787,0xbde3,0x611d,0xa95f,0x8b68,0xc9ec,0x819,0x2361,0xf73e,0x5e31,0xbd7b,0x2b45,0x40d7,0x2400,0x68}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb7878680,0x611dbde3,0x8b68a95f,0x819c9ec,0xf73e2361,0xbd7b5e31,0x40d72b45,0x682400}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x611dbde3b7878680,0x819c9ec8b68a95f,0xbd7b5e31f73e2361,0x68240040d72b45}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4277,0x6d20,0x9e12,0x1f0c,0x977f,0xf854,0x9d1c,0x563f,0xdb,0xc2ed,0xaf54,0xe829,0x4fb,0xd83,0x7be8,0xca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6d204277,0x1f0c9e12,0xf854977f,0x563f9d1c,0xc2ed00db,0xe829af54,0xd8304fb,0xca7be8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1f0c9e126d204277,0x563f9d1cf854977f,0xe829af54c2ed00db,0xca7be80d8304fb}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf541,0xab6f,0x2a02,0xc945,0x25f0,0xb5a6,0xb115,0xff2e,0x5c0f,0x5851,0xf909,0x6eb9,0xaffb,0x3219,0x5d2d,0x82}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xab6ff541,0xc9452a02,0xb5a625f0,0xff2eb115,0x58515c0f,0x6eb9f909,0x3219affb,0x825d2d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc9452a02ab6ff541,0xff2eb115b5a625f0,0x6eb9f90958515c0f,0x825d2d3219affb}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xad7a,0xb685,0xde69,0x55d2,0x5675,0x84e8,0x5916,0x925f,0x8c0a,0x1cb6,0x7c51,0x8391,0xffce,0x11d1,0x96ce,0xcd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb685ad7a,0x55d2de69,0x84e85675,0x925f5916,0x1cb68c0a,0x83917c51,0x11d1ffce,0xcd96ce}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x55d2de69b685ad7a,0x925f591684e85675,0x83917c511cb68c0a,0xcd96ce11d1ffce}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3724,0x79bd,0x1b92,0x959b,0xb3ec,0x6f18,0x27d4,0x64a7,0x9b4b,0x8c7e,0xade7,0x664b,0xa6d9,0xa287,0x6a1d,0x48}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79bd3724,0x959b1b92,0x6f18b3ec,0x64a727d4,0x8c7e9b4b,0x664bade7,0xa287a6d9,0x486a1d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x959b1b9279bd3724,0x64a727d46f18b3ec,0x664bade78c7e9b4b,0x486a1da287a6d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x56db,0x1b54,0xbda2,0xc5d3,0xdd06,0x861d,0x9780,0x7475,0x33d1,0x41af,0x34b2,0x7f9d,0x7f8c,0xaa8c,0xb471,0xca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1b5456db,0xc5d3bda2,0x861ddd06,0x74759780,0x41af33d1,0x7f9d34b2,0xaa8c7f8c,0xcab471}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc5d3bda21b5456db,0x74759780861ddd06,0x7f9d34b241af33d1,0xcab471aa8c7f8c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7d7a,0x48b,0x7d32,0x7bfb,0x9bd3,0x63d8,0x9182,0xa955,0x3e1,0x344,0x6861,0x76bf,0x5cd0,0xeeb4,0x4ae3,0x57}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x48b7d7a,0x7bfb7d32,0x63d89bd3,0xa9559182,0x34403e1,0x76bf6861,0xeeb45cd0,0x574ae3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7bfb7d32048b7d7a,0xa955918263d89bd3,0x76bf6861034403e1,0x574ae3eeb45cd0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x444f,0x3698,0xd649,0x856f,0x41db,0x498f,0xafdf,0x189c,0xcb5b,0xe50b,0xbff,0xf7e0,0x47f9,0xa88b,0x35da,0x15}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3698444f,0x856fd649,0x498f41db,0x189cafdf,0xe50bcb5b,0xf7e00bff,0xa88b47f9,0x1535da}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x856fd6493698444f,0x189cafdf498f41db,0xf7e00bffe50bcb5b,0x1535daa88b47f9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa925,0xe4ab,0x425d,0x3a2c,0x22f9,0x79e2,0x687f,0x8b8a,0xcc2e,0xbe50,0xcb4d,0x8062,0x8073,0x5573,0x4b8e,0x35}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe4aba925,0x3a2c425d,0x79e222f9,0x8b8a687f,0xbe50cc2e,0x8062cb4d,0x55738073,0x354b8e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3a2c425de4aba925,0x8b8a687f79e222f9,0x8062cb4dbe50cc2e,0x354b8e55738073}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x30cd,0xb7f2,0x49cf,0xfe47,0xdb8a,0x683b,0x7335,0xbaa3,0xebe0,0x74ae,0x9dd4,0x8871,0x67c8,0x3c39,0x2ba2,0x24}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb7f230cd,0xfe4749cf,0x683bdb8a,0xbaa37335,0x74aeebe0,0x88719dd4,0x3c3967c8,0x242ba2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xfe4749cfb7f230cd,0xbaa37335683bdb8a,0x88719dd474aeebe0,0x242ba23c3967c8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x81fd,0xde09,0x9d8a,0x6e8c,0xa299,0x77a0,0xadb7,0x58b7,0x13a1,0x7d41,0x6349,0x1a1d,0xc40b,0x17c5,0xb772,0xdf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xde0981fd,0x6e8c9d8a,0x77a0a299,0x58b7adb7,0x7d4113a1,0x1a1d6349,0x17c5c40b,0xdfb772}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6e8c9d8ade0981fd,0x58b7adb777a0a299,0x1a1d63497d4113a1,0xdfb77217c5c40b}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4363,0xd1dc,0x3a2d,0x523e,0xecad,0x20f1,0x267e,0x376e,0x661b,0x53fc,0xddaa,0xf004,0x267a,0x5b07,0xd8e1,0x6f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd1dc4363,0x523e3a2d,0x20f1ecad,0x376e267e,0x53fc661b,0xf004ddaa,0x5b07267a,0x6fd8e1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x523e3a2dd1dc4363,0x376e267e20f1ecad,0xf004ddaa53fc661b,0x6fd8e15b07267a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcf33,0x480d,0xb630,0x1b8,0x2475,0x97c4,0x8cca,0x455c,0x141f,0x8b51,0x622b,0x778e,0x9837,0xc3c6,0xd45d,0xdb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x480dcf33,0x1b8b630,0x97c42475,0x455c8cca,0x8b51141f,0x778e622b,0xc3c69837,0xdbd45d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1b8b630480dcf33,0x455c8cca97c42475,0x778e622b8b51141f,0xdbd45dc3c69837}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd6bd,0xdb42,0x6f34,0xaae9,0x2b3a,0x4274,0xac8b,0x492f,0x4605,0x8e5b,0xbe28,0x41c8,0xffe7,0x8e8,0xcb67,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdb42d6bd,0xaae96f34,0x42742b3a,0x492fac8b,0x8e5b4605,0x41c8be28,0x8e8ffe7,0x66cb67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaae96f34db42d6bd,0x492fac8b42742b3a,0x41c8be288e5b4605,0x66cb6708e8ffe7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b92,0x3cde,0x8dc9,0x4acd,0x59f6,0x378c,0x93ea,0xb253,0x4da5,0xc63f,0xd6f3,0xb325,0xd36c,0xd143,0x350e,0x24}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3cde9b92,0x4acd8dc9,0x378c59f6,0xb25393ea,0xc63f4da5,0xb325d6f3,0xd143d36c,0x24350e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4acd8dc93cde9b92,0xb25393ea378c59f6,0xb325d6f3c63f4da5,0x24350ed143d36c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x19e1, 0x1d98, 0x1de9, 0x1dfc, 0x922, 0x1fb8, 0x476, 0xd05, 0xc85, 0x1788, 0x1967, 0x155d, 0x1f93, 0x629, 0x188f, 0x119, 0x1f6f, 0x241, 0x1378, 0x0} +#elif RADIX == 32 +{0xf6633c2, 0x2efe77a, 0xedfb849, 0x1215a0a4, 0x1cb3de21, 0x13f93aae, 0x6711e62, 0x120fdbc2, 0x9bc0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x922efe77a7b319e, 0xef10c8568291dbf7, 0xe23cc53f93aaee59, 0x54de0483f6f08c} +#else +{0x177f3bd3d98cf, 0x568291dbf7092, 0x755dcb3de2190, 0x423388f314fe4, 0x2a6f0241fb7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x811, 0xf66, 0x77a, 0x177f, 0x248, 0x17ee, 0x91d, 0xb41, 0x321, 0x1de2, 0xe59, 0x1d57, 0xfe4, 0x198a, 0xe23, 0x1846, 0xfdb, 0x90, 0x14de, 0x8} +#elif RADIX == 32 +{0x13d99023, 0x8bbf9de, 0x3b7ee12, 0xc856829, 0x172cf788, 0x14fe4eab, 0x119c4798, 0x483f6f0, 0x3a6f0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xc248bbf9de9ecc81, 0x7bc43215a0a476fd, 0x388f314fe4eabb96, 0x95378120fdbc23} +#else +{0x45dfcef4f6640, 0x15a0a476fdc24, 0x1d5772cf78864, 0x708ce23cc53f9, 0x2ca9bc0907ed} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x869, 0x197b, 0xcdb, 0x1d89, 0xf9b, 0x1d79, 0x18ec, 0xafe, 0x1d41, 0x77, 0x9d4, 0x1a3f, 0x2b, 0x46d, 0x173e, 0xedd, 0x172, 0x1c77, 0x8a6, 0x8} +#elif RADIX == 32 +{0x1e5ed0d3, 0x1bec4b36, 0x1d9d797c, 0x15055fd8, 0x14ea01df, 0x1a02bd1f, 0x176e7c46, 0x3b85c9d, 0x34537} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x2f9bec4b36f2f686, 0xefd4157f63b3af, 0xdcf88da02bd1fa75, 0x31229b8ee17276e} +#else +{0x5f6259b797b43, 0x157f63b3af2f9, 0x7a3f4ea01dfa8, 0x1dbb73e23680a, 0x18914dc770b9} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x124b, 0xed4, 0x1706, 0x32d, 0x1541, 0x11b8, 0x2b0, 0xbe4, 0x1ee8, 0x1a3c, 0x16e3, 0x1d25, 0x19bb, 0xb63, 0x1fc1, 0x5fa, 0xf03, 0xfa, 0x1ec, 0x9} +#elif RADIX == 32 +{0x13b52497, 0x1196dc1, 0x1611b8aa, 0x1ba17c82, 0x1b71e8f3, 0x79bbe92, 0x1ebf82b6, 0x7d3c0cb, 0x40f60} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1541196dc19da924, 0xf479ee85f20ac237, 0x7f056c79bbe92db8, 0x3b87b01f4f032fd} +#else +{0x8cb6e0ced492, 0x5f20ac237154, 0x7d25b71e8f3dd, 0x4bf5fc15b1e6e, 0x1dc3d80fa781} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1e71, 0xd67, 0x13da, 0x19eb, 0x137a, 0x1d27, 0x1ba7, 0x1996, 0x755, 0xe3d, 0x1139, 0x1764, 0x18ac, 0x1020, 0x3c4, 0x150e, 0x1ffd, 0x14fe, 0xa16, 0x6} +#elif RADIX == 32 +{0x1359fce3, 0x1acf5cf6, 0x14fd279b, 0x1d5732db, 0x89cb8f4, 0x18acbb2, 0x3878902, 0x7f7ff6a, 0x150b5} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf37acf5cf69acfe7, 0x5c7a755ccb6e9fa4, 0xf120418acbb244e, 0x8285a9fdffda87} +#else +{0x567ae7b4d67f3, 0x5ccb6e9fa4f37, 0x176489cb8f4ea, 0x6a1c3c481062b, 0x2c142d4feffe} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x13ec, 0x10a3, 0x1e69, 0x106f, 0x619, 0x1cb5, 0x9aa, 0x362, 0x53a, 0x1af5, 0x1bae, 0x60a, 0x2a4, 0x448, 0x3d0, 0x535, 0xeb1, 0x1a6e, 0x978, 0x5} +#elif RADIX == 32 +{0xc28e7d9, 0x19837f9a, 0x155cb530, 0x14e86c49, 0xdd76bd4, 0x102a4305, 0xd47a044, 0x1373ac4a, 0x4bc6} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xa619837f9a61473e, 0xb5ea53a1b126ab96, 0x8f408902a43056eb, 0x3ea5e34dceb129a} +#else +{0x4c1bfcd30a39f, 0x21b126ab96a61, 0x60add76bd4a7, 0x4a6a3d02240a9, 0x1f52f1a6e758} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x77a, 0x201, 0x168d, 0x8fe, 0x780, 0x1ccb, 0x52b, 0x1c83, 0x18dd, 0xcef, 0x11f5, 0x1446, 0x301, 0xb63, 0xe3f, 0x1b72, 0x1, 0x1da9, 0x1281, 0x8} +#elif RADIX == 32 +{0x8804ef5, 0x47f5a3, 0x57ccb3c, 0x3779065, 0x8fab3bf, 0x6301a23, 0x1c9c7eb6, 0xd480076, 0x3940f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x678047f5a3440277, 0x59df8dde4194af99, 0x38fd6c6301a2347d, 0x364a07b52001db9} +#else +{0x23fad1a2013b, 0x5e4194af99678, 0x34468fab3bf1b, 0x76e4e3f5b18c0, 0x432503da9000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1, 0xb39, 0x969, 0x1324, 0xbe6, 0x86e, 0x1021, 0x29a, 0x1ff0, 0xd23, 0x7d5, 0x72a, 0x1e33, 0x1fd9, 0x10af, 0x15bc, 0x1d56, 0x928, 0x1d49, 0x0} +#elif RADIX == 32 +{0xace4002, 0x699225a, 0x4286e5f, 0x1fc05350, 0x3eab48f, 0x13e33395, 0xf215ffd, 0x94755ab, 0xea4a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xcbe699225a567200, 0x5a47ff014d40850d, 0x42bffb3e333951f5, 0x57525251d56ade} +#else +{0x34c912d2b3900, 0x14d40850dcbe, 0x672a3eab48ffe, 0x2b790affecf8c, 0x2ba92928eab} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xef13,0xa8dc,0x8ceb,0xe405,0xe2f5,0xfda5,0x28ac,0x3bbe,0x41e5,0xee91,0xb0ff,0x5f5c,0x1920,0x1e33,0xef67,0x95}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa8dcef13,0xe4058ceb,0xfda5e2f5,0x3bbe28ac,0xee9141e5,0x5f5cb0ff,0x1e331920,0x95ef67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe4058ceba8dcef13,0x3bbe28acfda5e2f5,0x5f5cb0ffee9141e5,0x95ef671e331920}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6b6e,0x9e93,0xfbce,0xb1b6,0x80bb,0x14b8,0x20ae,0x6bcd,0xb7f4,0xfeff,0xc4a7,0xceb3,0xd874,0x65bf,0xe003,0xe9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9e936b6e,0xb1b6fbce,0x14b880bb,0x6bcd20ae,0xfeffb7f4,0xceb3c4a7,0x65bfd874,0xe9e003}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb1b6fbce9e936b6e,0x6bcd20ae14b880bb,0xceb3c4a7feffb7f4,0xe9e00365bfd874}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x47ff,0xc988,0x46b6,0x5236,0x9694,0xec04,0xd563,0x7d56,0x6833,0xc48f,0x8b0a,0xe195,0xb64e,0xe957,0x58b2,0xdb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc98847ff,0x523646b6,0xec049694,0x7d56d563,0xc48f6833,0xe1958b0a,0xe957b64e,0xdb58b2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x523646b6c98847ff,0x7d56d563ec049694,0xe1958b0ac48f6833,0xdb58b2e957b64e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x10ed,0x5723,0x7314,0x1bfa,0x1d0a,0x25a,0xd753,0xc441,0xbe1a,0x116e,0x4f00,0xa0a3,0xe6df,0xe1cc,0x1098,0x6a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x572310ed,0x1bfa7314,0x25a1d0a,0xc441d753,0x116ebe1a,0xa0a34f00,0xe1cce6df,0x6a1098}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1bfa7314572310ed,0xc441d753025a1d0a,0xa0a34f00116ebe1a,0x6a1098e1cce6df}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xad7a,0xb685,0xde69,0x55d2,0x5675,0x84e8,0x5916,0x925f,0x8c0a,0x1cb6,0x7c51,0x8391,0xffce,0x11d1,0x96ce,0xcd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb685ad7a,0x55d2de69,0x84e85675,0x925f5916,0x1cb68c0a,0x83917c51,0x11d1ffce,0xcd96ce}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x55d2de69b685ad7a,0x925f591684e85675,0x83917c511cb68c0a,0xcd96ce11d1ffce}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3724,0x79bd,0x1b92,0x959b,0xb3ec,0x6f18,0x27d4,0x64a7,0x9b4b,0x8c7e,0xade7,0x664b,0xa6d9,0xa287,0x6a1d,0x48}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79bd3724,0x959b1b92,0x6f18b3ec,0x64a727d4,0x8c7e9b4b,0x664bade7,0xa287a6d9,0x486a1d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x959b1b9279bd3724,0x64a727d46f18b3ec,0x664bade78c7e9b4b,0x486a1da287a6d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8d79,0x38f8,0xf94c,0xe776,0x2bdf,0x2d2e,0x4242,0x8677,0xddf0,0x1736,0xa2e3,0x8ee7,0x52ac,0x4bb1,0xbb55,0xa4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x38f88d79,0xe776f94c,0x2d2e2bdf,0x86774242,0x1736ddf0,0x8ee7a2e3,0x4bb152ac,0xa4bb55}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe776f94c38f88d79,0x867742422d2e2bdf,0x8ee7a2e31736ddf0,0xa4bb554bb152ac}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6774,0xe280,0xc0b8,0xd49d,0x3b88,0x2577,0xc53f,0x7a5d,0x3032,0x4cfb,0xd6b2,0x3ed5,0x27b8,0x584c,0x85b1,0xfc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe2806774,0xd49dc0b8,0x25773b88,0x7a5dc53f,0x4cfb3032,0x3ed5d6b2,0x584c27b8,0xfc85b1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd49dc0b8e2806774,0x7a5dc53f25773b88,0x3ed5d6b24cfb3032,0xfc85b1584c27b8}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc139,0x25cf,0xd25b,0xadb9,0xbd39,0xaa20,0x8867,0x4e7a,0x8b24,0xa81f,0x412a,0xacfc,0xee2d,0xab0c,0x1d50,0x20}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x25cfc139,0xadb9d25b,0xaa20bd39,0x4e7a8867,0xa81f8b24,0xacfc412a,0xab0cee2d,0x201d50}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xadb9d25b25cfc139,0x4e7a8867aa20bd39,0xacfc412aa81f8b24,0x201d50ab0cee2d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7287,0xc707,0x6b3,0x1889,0xd420,0xd2d1,0xbdbd,0x7988,0x220f,0xe8c9,0x5d1c,0x7118,0xad53,0xb44e,0x44aa,0x5b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc7077287,0x188906b3,0xd2d1d420,0x7988bdbd,0xe8c9220f,0x71185d1c,0xb44ead53,0x5b44aa}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x188906b3c7077287,0x7988bdbdd2d1d420,0x71185d1ce8c9220f,0x5b44aab44ead53}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xef13,0xa8dc,0x8ceb,0xe405,0xe2f5,0xfda5,0x28ac,0x3bbe,0x41e5,0xee91,0xb0ff,0x5f5c,0x1920,0x1e33,0xef67,0x95}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa8dcef13,0xe4058ceb,0xfda5e2f5,0x3bbe28ac,0xee9141e5,0x5f5cb0ff,0x1e331920,0x95ef67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe4058ceba8dcef13,0x3bbe28acfda5e2f5,0x5f5cb0ffee9141e5,0x95ef671e331920}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6b6e,0x9e93,0xfbce,0xb1b6,0x80bb,0x14b8,0x20ae,0x6bcd,0xb7f4,0xfeff,0xc4a7,0xceb3,0xd874,0x65bf,0xe003,0xe9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9e936b6e,0xb1b6fbce,0x14b880bb,0x6bcd20ae,0xfeffb7f4,0xceb3c4a7,0x65bfd874,0xe9e003}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb1b6fbce9e936b6e,0x6bcd20ae14b880bb,0xceb3c4a7feffb7f4,0xe9e00365bfd874}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x47ff,0xc988,0x46b6,0x5236,0x9694,0xec04,0xd563,0x7d56,0x6833,0xc48f,0x8b0a,0xe195,0xb64e,0xe957,0x58b2,0xdb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc98847ff,0x523646b6,0xec049694,0x7d56d563,0xc48f6833,0xe1958b0a,0xe957b64e,0xdb58b2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x523646b6c98847ff,0x7d56d563ec049694,0xe1958b0ac48f6833,0xdb58b2e957b64e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x10ed,0x5723,0x7314,0x1bfa,0x1d0a,0x25a,0xd753,0xc441,0xbe1a,0x116e,0x4f00,0xa0a3,0xe6df,0xe1cc,0x1098,0x6a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x572310ed,0x1bfa7314,0x25a1d0a,0xc441d753,0x116ebe1a,0xa0a34f00,0xe1cce6df,0x6a1098}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1bfa7314572310ed,0xc441d753025a1d0a,0xa0a34f00116ebe1a,0x6a1098e1cce6df}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd6bd,0xdb42,0x6f34,0xaae9,0x2b3a,0x4274,0xac8b,0x492f,0x4605,0x8e5b,0xbe28,0x41c8,0xffe7,0x8e8,0xcb67,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdb42d6bd,0xaae96f34,0x42742b3a,0x492fac8b,0x8e5b4605,0x41c8be28,0x8e8ffe7,0x66cb67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaae96f34db42d6bd,0x492fac8b42742b3a,0x41c8be288e5b4605,0x66cb6708e8ffe7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b92,0x3cde,0x8dc9,0x4acd,0x59f6,0x378c,0x93ea,0xb253,0x4da5,0xc63f,0xd6f3,0xb325,0xd36c,0xd143,0x350e,0x24}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3cde9b92,0x4acd8dc9,0x378c59f6,0xb25393ea,0xc63f4da5,0xb325d6f3,0xd143d36c,0x24350e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4acd8dc93cde9b92,0xb25393ea378c59f6,0xb325d6f3c63f4da5,0x24350ed143d36c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7029,0x8b30,0x7529,0x9941,0x2be8,0x7b3f,0xe3d7,0x4553,0x7065,0x7bef,0xb49c,0xc80b,0xfa3e,0x950c,0x1ece,0x18}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8b307029,0x99417529,0x7b3f2be8,0x4553e3d7,0x7bef7065,0xc80bb49c,0x950cfa3e,0x181ece}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x994175298b307029,0x4553e3d77b3f2be8,0xc80bb49c7bef7065,0x181ece950cfa3e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb399,0x92ce,0x85e8,0x7c82,0x86eb,0xb186,0x8924,0x64f1,0xd93,0x5e9a,0x3165,0x4196,0x5e79,0x158,0x55d5,0x31}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x92ceb399,0x7c8285e8,0xb18686eb,0x64f18924,0x5e9a0d93,0x41963165,0x1585e79,0x3155d5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7c8285e892ceb399,0x64f18924b18686eb,0x419631655e9a0d93,0x3155d501585e79}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xda47,0x29f8,0x7209,0xaa0c,0xfc22,0x39c9,0x6e19,0x517c,0xc94e,0xcfa4,0x20fc,0x1edc,0xe0d0,0x396d,0x85f0,0xdf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x29f8da47,0xaa0c7209,0x39c9fc22,0x517c6e19,0xcfa4c94e,0x1edc20fc,0x396de0d0,0xdf85f0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaa0c720929f8da47,0x517c6e1939c9fc22,0x1edc20fccfa4c94e,0xdf85f0396de0d0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8fd7,0x74cf,0x8ad6,0x66be,0xd417,0x84c0,0x1c28,0xbaac,0x8f9a,0x8410,0x4b63,0x37f4,0x5c1,0x6af3,0xe131,0xe7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x74cf8fd7,0x66be8ad6,0x84c0d417,0xbaac1c28,0x84108f9a,0x37f44b63,0x6af305c1,0xe7e131}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x66be8ad674cf8fd7,0xbaac1c2884c0d417,0x37f44b6384108f9a,0xe7e1316af305c1}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x13f5, 0x8b7, 0x1873, 0x144a, 0x1a89, 0x13f9, 0xd49, 0x6f2, 0x3bb, 0x102, 0x1ecb, 0x180b, 0x4d5, 0x608, 0x119, 0x5e6, 0x751, 0x961, 0xd37, 0x5} +#elif RADIX == 32 +{0x1a2de7eb, 0x9a2561c, 0x933f9d4, 0xeecde4d, 0x1f658408, 0x104d5c05, 0x19823260, 0xb09d44b, 0x69ba} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3a89a2561cd16f3f, 0xc2043bb37935267f, 0x464c104d5c05fb2, 0x1bb4dd2c27512f3} +#else +{0x4d12b0e68b79f, 0x337935267f3a8, 0x380bf65840877, 0x4bcc119304135, 0x35da6e9613a8} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1e96, 0x1a2d, 0x161c, 0xd12, 0xea2, 0xcfe, 0x1352, 0x19bc, 0x10ee, 0x1840, 0x1fb2, 0xe02, 0x135, 0x982, 0x1046, 0x979, 0x9d4, 0x1a58, 0x1b4d, 0x9} +#elif RADIX == 32 +{0x68b7d2d, 0x2689587, 0xa4cfe75, 0x3bb3793, 0xfd96102, 0x4135701, 0x1e608c98, 0x12c27512, 0x4da6e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xcea2689587345be9, 0xb0810eecde4d499f, 0xc1193041357017ec, 0x22ed374b09d44bc} +#else +{0x1344ac39a2df4, 0x6cde4d499fcea, 0x2e02fd961021d, 0x12f30464c104d, 0x39769ba584ea} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0xa82, 0x1d2d, 0x15b8, 0x404, 0x1a32, 0xaf9, 0xa86, 0xddf, 0x14bf, 0x100c, 0xc42, 0xa89, 0x1df, 0x82f, 0x1f07, 0x782, 0x664, 0x1ba5, 0x5d7, 0x2} +#elif RADIX == 32 +{0x74b5504, 0x1220256e, 0x10caf9d1, 0x12fdbbea, 0x16214032, 0x1e1df544, 0xbe0e82, 0x1d29990f, 0x22ebe} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3a3220256e3a5aa8, 0xa0194bf6efaa195f, 0x7c1d05e1df544b10, 0xb175f74a6643c1} +#else +{0x11012b71d2d54, 0x76efaa195f3a3, 0x6a89621403297, 0xf05f07417877, 0x58bafba5332} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x5a1, 0x46a, 0x17ab, 0x1cfa, 0x547, 0x1b9c, 0xda5, 0x141e, 0x216, 0x1f49, 0xaca, 0x15a1, 0xfe0, 0x1afb, 0x1a47, 0x133d, 0x1887, 0x590, 0xbc2, 0x1} +#elif RADIX == 32 +{0x191a8b42, 0x7e7d5ea, 0x14bb9c2a, 0x85a83cd, 0x15657d24, 0x16fe0ad0, 0xf748faf, 0xc8621e6, 0x15e11} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x8547e7d5eac8d45a, 0xbe92216a0f369773, 0xe91f5f6fe0ad0ab2, 0x5af08b2188799e} +#else +{0x3f3eaf5646a2d, 0x6a0f369773854, 0x15a15657d2442, 0x667ba47d7dbf8, 0x2d784590c43} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1311, 0x910, 0x413, 0x1d16, 0x14f7, 0x19c9, 0x14d3, 0x1504, 0x776, 0x1c2c, 0x15b0, 0xc6e, 0x36b, 0x1777, 0x1ed2, 0xb34, 0x1281, 0x1281, 0xd0f, 0x4} +#elif RADIX == 32 +{0x1a442622, 0x17e8b104, 0x1a79c9a7, 0x1ddaa094, 0xad870b0, 0xe36b637, 0xd3da577, 0x140ca056, 0x4687c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x34f7e8b104d22131, 0x3858776a82534f39, 0x7b4aeee36b63756c, 0x7343e50328159a} +#else +{0x3f45882691098, 0x6a82534f3934f, 0x6c6ead870b0ee, 0x5669ed2bbb8da, 0x2b9a1f281940} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x12d2, 0x6d8, 0x1e2c, 0x6f9, 0x5e8, 0x4e5, 0x32c, 0x58d, 0x1bda, 0x16f9, 0x8b5, 0x3c0, 0x10c, 0xb18, 0x450, 0x834, 0x3b7, 0x8d7, 0x15bf, 0x0} +#elif RADIX == 32 +{0x1b625a4, 0x837cf8b, 0x584e52f, 0xf68b1a3, 0x45adbe7, 0x1010c1e0, 0xd08a0b1, 0x6b8edd0, 0xadfa} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xa5e837cf8b0db12d, 0x6df3bda2c68cb09c, 0x114163010c1e022d, 0xa56fd1ae3b741a} +#else +{0x41be7c586d896, 0x22c68cb09ca5e, 0x3c045adbe77b, 0x506845058c043, 0x2d2b7e8d71db} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x5f, 0x444, 0x49e, 0xae7, 0x248, 0x1a37, 0x9b6, 0xc28, 0x464, 0x19b7, 0x1560, 0xd7a, 0x2e3, 0x81a, 0x6f5, 0x5f9, 0x1818, 0x164c, 0x1713, 0x7} +#elif RADIX == 32 +{0x111100bf, 0x8573927, 0x16da3712, 0x11918509, 0xab066dc, 0x142e36bd, 0x1e4dea81, 0x1266060b, 0x2b89d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe248573927888805, 0x336e46461426db46, 0x9bd50342e36bd558, 0x4edc4ec998182fc} +#else +{0x42b9c93c44402, 0x461426db46e24, 0x6d7aab066dc8c, 0xbf26f540d0b8, 0x4f6e2764cc0c} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x19b1, 0x1912, 0x1eb, 0x1cbc, 0x210, 0x17cf, 0x1b9e, 0x754, 0x38c, 0x816, 0x1431, 0x79a, 0xa57, 0x15ff, 0x756, 0xa60, 0x1064, 0x162f, 0x1e5e, 0x0} +#elif RADIX == 32 +{0x1e44b362, 0x10e5e07a, 0x13d7cf10, 0xe30ea9b, 0xa18a058, 0x1ea573cd, 0x180ead5f, 0x117c1914, 0xf2f5} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe210e5e07af2259b, 0x502c38c3aa6e7af9, 0x1d5abfea573cd50c, 0x5797ac5f064530} +#else +{0x72f03d7912cd, 0x43aa6e7af9e21, 0x679aa18a05871, 0x14c0756affa95, 0x2abcbd62f832} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5ff1,0xa594,0x52b3,0xe75d,0xdd09,0xd267,0x7d25,0xd976,0xbc5,0xc1a8,0x9aae,0x10bf,0xe894,0x8de3,0xae84,0x70}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa5945ff1,0xe75d52b3,0xd267dd09,0xd9767d25,0xc1a80bc5,0x10bf9aae,0x8de3e894,0x70ae84}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe75d52b3a5945ff1,0xd9767d25d267dd09,0x10bf9aaec1a80bc5,0x70ae848de3e894}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x11e6,0xb9e0,0x96c0,0xa6d7,0xee81,0x4b6,0x2f44,0xf4c5,0x4597,0xe75d,0x5b93,0xebb6,0x59c6,0xc08e,0x3084,0x16}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb9e011e6,0xa6d796c0,0x4b6ee81,0xf4c52f44,0xe75d4597,0xebb65b93,0xc08e59c6,0x163084}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa6d796c0b9e011e6,0xf4c52f4404b6ee81,0xebb65b93e75d4597,0x163084c08e59c6}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf41d,0x3463,0x6031,0x479f,0x6fe7,0x159f,0x1e6b,0x404e,0xe302,0x88a8,0xc1f7,0xad84,0x8b50,0x3175,0x3d66,0xab}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3463f41d,0x479f6031,0x159f6fe7,0x404e1e6b,0x88a8e302,0xad84c1f7,0x31758b50,0xab3d66}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x479f60313463f41d,0x404e1e6b159f6fe7,0xad84c1f788a8e302,0xab3d6631758b50}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa00f,0x5a6b,0xad4c,0x18a2,0x22f6,0x2d98,0x82da,0x2689,0xf43a,0x3e57,0x6551,0xef40,0x176b,0x721c,0x517b,0x8f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5a6ba00f,0x18a2ad4c,0x2d9822f6,0x268982da,0x3e57f43a,0xef406551,0x721c176b,0x8f517b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x18a2ad4c5a6ba00f,0x268982da2d9822f6,0xef4065513e57f43a,0x8f517b721c176b}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xad7a,0xb685,0xde69,0x55d2,0x5675,0x84e8,0x5916,0x925f,0x8c0a,0x1cb6,0x7c51,0x8391,0xffce,0x11d1,0x96ce,0xcd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb685ad7a,0x55d2de69,0x84e85675,0x925f5916,0x1cb68c0a,0x83917c51,0x11d1ffce,0xcd96ce}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x55d2de69b685ad7a,0x925f591684e85675,0x83917c511cb68c0a,0xcd96ce11d1ffce}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3724,0x79bd,0x1b92,0x959b,0xb3ec,0x6f18,0x27d4,0x64a7,0x9b4b,0x8c7e,0xade7,0x664b,0xa6d9,0xa287,0x6a1d,0x48}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79bd3724,0x959b1b92,0x6f18b3ec,0x64a727d4,0x8c7e9b4b,0x664bade7,0xa287a6d9,0x486a1d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x959b1b9279bd3724,0x64a727d46f18b3ec,0x664bade78c7e9b4b,0x486a1da287a6d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffc3,0x1fbe,0xc7ef,0x56c4,0x2834,0xfa5c,0x36aa,0x1ced,0x9076,0xa31d,0x8890,0xe52,0x87d2,0xef68,0x98bc,0xc2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1fbeffc3,0x56c4c7ef,0xfa5c2834,0x1ced36aa,0xa31d9076,0xe528890,0xef6887d2,0xc298bc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x56c4c7ef1fbeffc3,0x1ced36aafa5c2834,0xe528890a31d9076,0xc298bcef6887d2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4098,0xd740,0xb5c6,0x8109,0x299,0x3a8c,0x81c2,0xc0d0,0xe848,0x9243,0x8996,0x656a,0x8c87,0x6c99,0xb9f5,0x4c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd7404098,0x8109b5c6,0x3a8c0299,0xc0d081c2,0x9243e848,0x656a8996,0x6c998c87,0x4cb9f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8109b5c6d7404098,0xc0d081c23a8c0299,0x656a89969243e848,0x4cb9f56c998c87}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x712b,0xfeed,0x55b5,0xc5fe,0xe867,0x77a9,0x1775,0x7814,0x4780,0x73b1,0x86b1,0x3973,0x797a,0x7f0b,0x1fa,0xb0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfeed712b,0xc5fe55b5,0x77a9e867,0x78141775,0x73b14780,0x397386b1,0x7f0b797a,0xb001fa}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc5fe55b5feed712b,0x7814177577a9e867,0x397386b173b14780,0xb001fa7f0b797a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3d,0xe041,0x3810,0xa93b,0xd7cb,0x5a3,0xc955,0xe312,0x6f89,0x5ce2,0x776f,0xf1ad,0x782d,0x1097,0x6743,0x3d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe041003d,0xa93b3810,0x5a3d7cb,0xe312c955,0x5ce26f89,0xf1ad776f,0x1097782d,0x3d6743}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa93b3810e041003d,0xe312c95505a3d7cb,0xf1ad776f5ce26f89,0x3d67431097782d}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5ff1,0xa594,0x52b3,0xe75d,0xdd09,0xd267,0x7d25,0xd976,0xbc5,0xc1a8,0x9aae,0x10bf,0xe894,0x8de3,0xae84,0x70}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa5945ff1,0xe75d52b3,0xd267dd09,0xd9767d25,0xc1a80bc5,0x10bf9aae,0x8de3e894,0x70ae84}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe75d52b3a5945ff1,0xd9767d25d267dd09,0x10bf9aaec1a80bc5,0x70ae848de3e894}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x11e6,0xb9e0,0x96c0,0xa6d7,0xee81,0x4b6,0x2f44,0xf4c5,0x4597,0xe75d,0x5b93,0xebb6,0x59c6,0xc08e,0x3084,0x16}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb9e011e6,0xa6d796c0,0x4b6ee81,0xf4c52f44,0xe75d4597,0xebb65b93,0xc08e59c6,0x163084}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa6d796c0b9e011e6,0xf4c52f4404b6ee81,0xebb65b93e75d4597,0x163084c08e59c6}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf41d,0x3463,0x6031,0x479f,0x6fe7,0x159f,0x1e6b,0x404e,0xe302,0x88a8,0xc1f7,0xad84,0x8b50,0x3175,0x3d66,0xab}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3463f41d,0x479f6031,0x159f6fe7,0x404e1e6b,0x88a8e302,0xad84c1f7,0x31758b50,0xab3d66}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x479f60313463f41d,0x404e1e6b159f6fe7,0xad84c1f788a8e302,0xab3d6631758b50}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa00f,0x5a6b,0xad4c,0x18a2,0x22f6,0x2d98,0x82da,0x2689,0xf43a,0x3e57,0x6551,0xef40,0x176b,0x721c,0x517b,0x8f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5a6ba00f,0x18a2ad4c,0x2d9822f6,0x268982da,0x3e57f43a,0xef406551,0x721c176b,0x8f517b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x18a2ad4c5a6ba00f,0x268982da2d9822f6,0xef4065513e57f43a,0x8f517b721c176b}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd6bd,0xdb42,0x6f34,0xaae9,0x2b3a,0x4274,0xac8b,0x492f,0x4605,0x8e5b,0xbe28,0x41c8,0xffe7,0x8e8,0xcb67,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdb42d6bd,0xaae96f34,0x42742b3a,0x492fac8b,0x8e5b4605,0x41c8be28,0x8e8ffe7,0x66cb67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaae96f34db42d6bd,0x492fac8b42742b3a,0x41c8be288e5b4605,0x66cb6708e8ffe7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b92,0x3cde,0x8dc9,0x4acd,0x59f6,0x378c,0x93ea,0xb253,0x4da5,0xc63f,0xd6f3,0xb325,0xd36c,0xd143,0x350e,0x24}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3cde9b92,0x4acd8dc9,0x378c59f6,0xb25393ea,0xc63f4da5,0xb325d6f3,0xd143d36c,0x24350e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4acd8dc93cde9b92,0xb25393ea378c59f6,0xb325d6f3c63f4da5,0x24350ed143d36c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5d2b,0x1bd6,0xcc3f,0x7e74,0x4fea,0xfba0,0x9f84,0xd6d4,0x42a1,0x88d1,0x68b1,0x4f4e,0x13ec,0xa60c,0xb13b,0x2e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1bd65d2b,0x7e74cc3f,0xfba04fea,0xd6d49f84,0x88d142a1,0x4f4e68b1,0xa60c13ec,0x2eb13b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7e74cc3f1bd65d2b,0xd6d49f84fba04fea,0x4f4e68b188d142a1,0x2eb13ba60c13ec}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7b4f,0x9448,0xaa16,0x649a,0xe4b4,0x3bc2,0xd3fd,0x8df1,0x931e,0x4078,0x8caa,0xe896,0xdeec,0xbed5,0x166e,0x7c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x94487b4f,0x649aaa16,0x3bc2e4b4,0x8df1d3fd,0x4078931e,0xe8968caa,0xbed5deec,0x7c166e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x649aaa1694487b4f,0x8df1d3fd3bc2e4b4,0xe8968caa4078931e,0x7c166ebed5deec}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x101d,0x51aa,0xd32d,0x2b40,0x7ba,0xc5f8,0x257a,0xb323,0x9bde,0x20c5,0xdc8f,0x2c3d,0x4e7b,0x54a6,0x17b9,0x99}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x51aa101d,0x2b40d32d,0xc5f807ba,0xb323257a,0x20c59bde,0x2c3ddc8f,0x54a64e7b,0x9917b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2b40d32d51aa101d,0xb323257ac5f807ba,0x2c3ddc8f20c59bde,0x9917b954a64e7b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa2d5,0xe429,0x33c0,0x818b,0xb015,0x45f,0x607b,0x292b,0xbd5e,0x772e,0x974e,0xb0b1,0xec13,0x59f3,0x4ec4,0xd1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe429a2d5,0x818b33c0,0x45fb015,0x292b607b,0x772ebd5e,0xb0b1974e,0x59f3ec13,0xd14ec4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x818b33c0e429a2d5,0x292b607b045fb015,0xb0b1974e772ebd5e,0xd14ec459f3ec13}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0xa72, 0x186f, 0x81c, 0x105c, 0x151, 0x1451, 0x1b96, 0x4d1, 0x12be, 0x3bf, 0x996, 0x1130, 0x1460, 0x1ed8, 0xc2a, 0x1c23, 0x1ee, 0x3f4, 0xbe2, 0x9} +#elif RADIX == 32 +{0x61bd4e5, 0x1182e207, 0x12d4510a, 0xaf89a3b, 0x4cb0efe, 0x11460898, 0x8d855ed, 0x1fa07bb8, 0x45f10} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x215182e20730dea7, 0x877f2be268ee5a8a, 0xb0abdb1460898265, 0xeaf887e81eee11} +#else +{0xc17103986f53, 0x6268ee5a8a215, 0x11304cb0efe57, 0x3846c2af6c518, 0x2f57c43f40f7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1c36, 0x61b, 0x207, 0xc17, 0x854, 0x1514, 0xee5, 0x1134, 0x1caf, 0x10ef, 0x265, 0x44c, 0x518, 0x17b6, 0x1b0a, 0x1708, 0x7b, 0x10fd, 0xaf8, 0x3} +#elif RADIX == 32 +{0x1986f86c, 0x1460b881, 0x1cb51442, 0x12be268e, 0x132c3bf, 0xc518226, 0x236157b, 0x7e81eee, 0x357c4} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x885460b881cc37c3, 0x61dfcaf89a3b96a2, 0x6c2af6c518226099, 0x1fabe21fa07bb84} +#else +{0x2305c40e61be1, 0x789a3b96a2885, 0x44c132c3bf95, 0x6e11b0abdb146, 0x37d5f10fd03d} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x1c07, 0x15d6, 0x526, 0xde7, 0x149b, 0x719, 0x1786, 0x1272, 0x18b, 0x1bac, 0xf74, 0x1588, 0xe6f, 0x24c, 0x1204, 0x1e9d, 0x13bb, 0x1ccb, 0x78d, 0x9} +#elif RADIX == 32 +{0x1575b80f, 0x1b6f3949, 0x10c719a4, 0x62e4e57, 0x7ba6eb0, 0x18e6fac4, 0x7640824, 0x65ceefd, 0x43c6f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x349b6f3949abadc0, 0x375818b9395e18e3, 0xc810498e6fac43dd, 0x279e379973bbf4e} +#else +{0x5b79ca4d5d6e0, 0x39395e18e3349, 0x75887ba6eb031, 0x7d3b20412639b, 0x13cf1bccb9dd} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xddf, 0x238, 0xe4b, 0x1958, 0xe6e, 0x1059, 0x133, 0x1e11, 0x5ae, 0x2ab, 0x1044, 0xdd, 0xe9d, 0x1aa8, 0x15e2, 0xc9b, 0xaa6, 0x3c8, 0x10ac, 0x0} +#elif RADIX == 32 +{0x188e1bbe, 0xecac392, 0x6705973, 0x16bbc221, 0x18220aac, 0x10e9d06e, 0x6ebc5aa, 0x1e42a999, 0x8560} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x2e6ecac392c470dd, 0x5565aef0884ce0b, 0xd78b550e9d06ec11, 0x4b42b0790aa664d} +#else +{0x76561c962386e, 0x6f0884ce0b2e6, 0x20dd8220aacb5, 0x19375e2d543a7, 0x4da1583c8553} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x192, 0x1c6d, 0x18a4, 0x152, 0x1aa9, 0xec4, 0x1be8, 0x1209, 0x7f, 0x797, 0x1295, 0x1433, 0x1a75, 0x15a, 0x1d64, 0x146c, 0x12df, 0x10af, 0x188f, 0x1} +#elif RADIX == 32 +{0x71b4324, 0x90a9629, 0x1d0ec4d5, 0x1fe413b, 0x194a9e5c, 0x15a75a19, 0x1b3ac815, 0x57cb7e8, 0x1c47c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9aa90a962938da19, 0x4f2e07f904efa1d8, 0x75902b5a75a19ca5, 0xae23e15f2dfa36} +#else +{0x4854b149c6d0c, 0x7904efa1d89aa, 0x343394a9e5c0f, 0x68d9d640ad69d, 0x2d711f0af96f} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x129c, 0xe1d, 0x1bd3, 0xf2a, 0x937, 0xf81, 0xa47, 0x186b, 0x1bbe, 0x1c6d, 0x1edd, 0x1b51, 0xa10, 0x167a, 0x1f0b, 0x374, 0x720, 0x1547, 0x726, 0x1} +#elif RADIX == 32 +{0x1b876538, 0x177956f4, 0x8ef8149, 0xefb0d6a, 0x1f6ef1b7, 0x14a10da8, 0x1d3e1767, 0xa39c806, 0x13935} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x29377956f4dc3b29, 0x78dbbbec35a91df0, 0x7c2ecf4a10da8fb7, 0x3c9c9aa8e7201ba} +#else +{0x3bcab7a6e1d94, 0x6c35a91df0293, 0x1b51f6ef1b777, 0x6e9f0bb3d284, 0x464e4d547390} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x12cc, 0x495, 0x1a14, 0x1db0, 0xb66, 0x76a, 0x1a77, 0xaf6, 0x1656, 0x1ad7, 0xb35, 0x4b1, 0xffa, 0x37b, 0xabf, 0xa5c, 0xdc9, 0x1a74, 0x11c9, 0x8} +#elif RADIX == 32 +{0x1256599, 0x6ed8685, 0xee76a5b, 0x19595eda, 0x159aeb5e, 0x16ffa258, 0x17157e37, 0x13a37254, 0x38e4e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x4b66ed8685092b2c, 0x75af65657b69dced, 0x2afc6f6ffa258acd, 0x4047274e8dc952e} +#else +{0x376c342849596, 0x657b69dced4b6, 0x44b159aeb5eca, 0x54b8abf1bdbfe, 0x202393a746e4} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1379, 0x125e, 0x1c56, 0x1811, 0x144, 0x2a8, 0xbb3, 0x2ca, 0x6d2, 0x565, 0x91e, 0x1280, 0x1b4f, 0x51a, 0x1eb7, 0x35a, 0x14fe, 0x1b59, 0x182e, 0x2} +#elif RADIX == 32 +{0x1497a6f2, 0x4c08f15, 0x1662a80a, 0x1b48594b, 0x48f1594, 0x15b4f940, 0x16bd6e51, 0x1acd3f86, 0x2c176} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x144c08f15a4bd37, 0x8aca6d21652ecc55, 0x7adca35b4f940247, 0x2e60bb6b34fe1ad} +#else +{0x260478ad25e9b, 0x21652ecc55014, 0x728048f1594da, 0x6b5eb728d6d3, 0x3f305db59a7f} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x323f,0x7ed2,0x4455,0x415c,0x5876,0x4282,0x76ef,0xcc11,0xbdab,0x1142,0x4729,0x3405,0x1155,0x1779,0x7c1f,0xc5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7ed2323f,0x415c4455,0x42825876,0xcc1176ef,0x1142bdab,0x34054729,0x17791155,0xc57c1f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x415c44557ed2323f,0xcc1176ef42825876,0x340547291142bdab,0xc57c1f17791155}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc9ce,0xa958,0x4fac,0x8a69,0x31e1,0x9997,0x1a17,0x8c19,0xd118,0x68c7,0xc0eb,0x8113,0x62fd,0xf8c8,0xc94e,0x3f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa958c9ce,0x8a694fac,0x999731e1,0x8c191a17,0x68c7d118,0x8113c0eb,0xf8c862fd,0x3fc94e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8a694faca958c9ce,0x8c191a17999731e1,0x8113c0eb68c7d118,0x3fc94ef8c862fd}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x41cb,0xed47,0x8ea0,0x127c,0x69d5,0xf74c,0xce8c,0x3826,0x3da2,0x6bf3,0x56b,0xe695,0xc45c,0x84ac,0x5817,0xd0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xed4741cb,0x127c8ea0,0xf74c69d5,0x3826ce8c,0x6bf33da2,0xe695056b,0x84acc45c,0xd05817}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x127c8ea0ed4741cb,0x3826ce8cf74c69d5,0xe695056b6bf33da2,0xd0581784acc45c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcdc1,0x812d,0xbbaa,0xbea3,0xa789,0xbd7d,0x8910,0x33ee,0x4254,0xeebd,0xb8d6,0xcbfa,0xeeaa,0xe886,0x83e0,0x3a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x812dcdc1,0xbea3bbaa,0xbd7da789,0x33ee8910,0xeebd4254,0xcbfab8d6,0xe886eeaa,0x3a83e0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbea3bbaa812dcdc1,0x33ee8910bd7da789,0xcbfab8d6eebd4254,0x3a83e0e886eeaa}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5286,0x497a,0x2196,0xaa2d,0xa98a,0x7b17,0xa6e9,0x6da0,0x73f5,0xe349,0x83ae,0x7c6e,0x31,0xee2e,0x6931,0x32}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x497a5286,0xaa2d2196,0x7b17a98a,0x6da0a6e9,0xe34973f5,0x7c6e83ae,0xee2e0031,0x326931}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaa2d2196497a5286,0x6da0a6e97b17a98a,0x7c6e83aee34973f5,0x326931ee2e0031}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc8dc,0x8642,0xe46d,0x6a64,0x4c13,0x90e7,0xd82b,0x9b58,0x64b4,0x7381,0x5218,0x99b4,0x5926,0x5d78,0x95e2,0xb7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8642c8dc,0x6a64e46d,0x90e74c13,0x9b58d82b,0x738164b4,0x99b45218,0x5d785926,0xb795e2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6a64e46d8642c8dc,0x9b58d82b90e74c13,0x99b45218738164b4,0xb795e25d785926}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7363,0xbe7a,0xc901,0xb6e0,0x6a56,0x779d,0xbc42,0xd659,0x3476,0x3868,0x12f4,0x923a,0x6fa8,0x5412,0xd5f9,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbe7a7363,0xb6e0c901,0x779d6a56,0xd659bc42,0x38683476,0x923a12f4,0x54126fa8,0x3d5f9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb6e0c901be7a7363,0xd659bc42779d6a56,0x923a12f438683476,0x3d5f954126fa8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xedb4,0x4fd4,0x5c14,0x14b,0xf702,0xd6be,0x9c11,0x4bb,0x9f10,0xde25,0xb159,0x5085,0xb0a9,0x6f42,0xc4d3,0x1d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4fd4edb4,0x14b5c14,0xd6bef702,0x4bb9c11,0xde259f10,0x5085b159,0x6f42b0a9,0x1dc4d3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x14b5c144fd4edb4,0x4bb9c11d6bef702,0x5085b159de259f10,0x1dc4d36f42b0a9}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe873,0x4974,0xc7ed,0x6b01,0xaffb,0xf3d4,0xc641,0x20d6,0xca22,0x2d69,0x9f01,0x451e,0xfa05,0xef65,0xb43b,0xde}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4974e873,0x6b01c7ed,0xf3d4affb,0x20d6c641,0x2d69ca22,0x451e9f01,0xef65fa05,0xdeb43b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6b01c7ed4974e873,0x20d6c641f3d4affb,0x451e9f012d69ca22,0xdeb43bef65fa05}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8c9d,0x4185,0x36fe,0x491f,0x95a9,0x8862,0x43bd,0x29a6,0xcb89,0xc797,0xed0b,0x6dc5,0x9057,0xabed,0x2a06,0xfc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x41858c9d,0x491f36fe,0x886295a9,0x29a643bd,0xc797cb89,0x6dc5ed0b,0xabed9057,0xfc2a06}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x491f36fe41858c9d,0x29a643bd886295a9,0x6dc5ed0bc797cb89,0xfc2a06abed9057}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x323f,0x7ed2,0x4455,0x415c,0x5876,0x4282,0x76ef,0xcc11,0xbdab,0x1142,0x4729,0x3405,0x1155,0x1779,0x7c1f,0xc5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7ed2323f,0x415c4455,0x42825876,0xcc1176ef,0x1142bdab,0x34054729,0x17791155,0xc57c1f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x415c44557ed2323f,0xcc1176ef42825876,0x340547291142bdab,0xc57c1f17791155}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc9ce,0xa958,0x4fac,0x8a69,0x31e1,0x9997,0x1a17,0x8c19,0xd118,0x68c7,0xc0eb,0x8113,0x62fd,0xf8c8,0xc94e,0x3f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa958c9ce,0x8a694fac,0x999731e1,0x8c191a17,0x68c7d118,0x8113c0eb,0xf8c862fd,0x3fc94e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8a694faca958c9ce,0x8c191a17999731e1,0x8113c0eb68c7d118,0x3fc94ef8c862fd}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x41cb,0xed47,0x8ea0,0x127c,0x69d5,0xf74c,0xce8c,0x3826,0x3da2,0x6bf3,0x56b,0xe695,0xc45c,0x84ac,0x5817,0xd0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xed4741cb,0x127c8ea0,0xf74c69d5,0x3826ce8c,0x6bf33da2,0xe695056b,0x84acc45c,0xd05817}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x127c8ea0ed4741cb,0x3826ce8cf74c69d5,0xe695056b6bf33da2,0xd0581784acc45c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcdc1,0x812d,0xbbaa,0xbea3,0xa789,0xbd7d,0x8910,0x33ee,0x4254,0xeebd,0xb8d6,0xcbfa,0xeeaa,0xe886,0x83e0,0x3a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x812dcdc1,0xbea3bbaa,0xbd7da789,0x33ee8910,0xeebd4254,0xcbfab8d6,0xe886eeaa,0x3a83e0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbea3bbaa812dcdc1,0x33ee8910bd7da789,0xcbfab8d6eebd4254,0x3a83e0e886eeaa}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2943,0x24bd,0x90cb,0x5516,0xd4c5,0xbd8b,0x5374,0xb6d0,0xb9fa,0x71a4,0x41d7,0xbe37,0x18,0xf717,0x3498,0x99}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x24bd2943,0x551690cb,0xbd8bd4c5,0xb6d05374,0x71a4b9fa,0xbe3741d7,0xf7170018,0x993498}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x551690cb24bd2943,0xb6d05374bd8bd4c5,0xbe3741d771a4b9fa,0x993498f7170018}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x646e,0xc321,0x7236,0xb532,0xa609,0xc873,0x6c15,0x4dac,0xb25a,0x39c0,0x290c,0x4cda,0x2c93,0x2ebc,0xcaf1,0xdb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc321646e,0xb5327236,0xc873a609,0x4dac6c15,0x39c0b25a,0x4cda290c,0x2ebc2c93,0xdbcaf1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb5327236c321646e,0x4dac6c15c873a609,0x4cda290c39c0b25a,0xdbcaf12ebc2c93}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xca5b,0x1036,0x34a6,0x490c,0xc0ed,0x771b,0x1590,0x1c17,0x4855,0x977e,0x8054,0xdb98,0xb26f,0x1175,0x7722,0xfe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1036ca5b,0x490c34a6,0x771bc0ed,0x1c171590,0x977e4855,0xdb988054,0x1175b26f,0xfe7722}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x490c34a61036ca5b,0x1c171590771bc0ed,0xdb988054977e4855,0xfe77221175b26f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf543,0x821c,0xae0a,0xb0cb,0x642d,0x5a80,0xd2bf,0x2340,0xc8f,0xe1ce,0x4e38,0xdace,0x3445,0x807e,0x9bc4,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x821cf543,0xb0cbae0a,0x5a80642d,0x2340d2bf,0xe1ce0c8f,0xdace4e38,0x807e3445,0x59bc4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb0cbae0a821cf543,0x2340d2bf5a80642d,0xdace4e38e1ce0c8f,0x59bc4807e3445}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6e85,0xc3dc,0xfd4,0x39a7,0x5158,0x777b,0xb83,0xb0fe,0x55de,0x45b3,0x103f,0x53dc,0x27e2,0xb6cb,0x2b18,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc3dc6e85,0x39a70fd4,0x777b5158,0xb0fe0b83,0x45b355de,0x53dc103f,0xb6cb27e2,0x12b18}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x39a70fd4c3dc6e85,0xb0fe0b83777b5158,0x53dc103f45b355de,0x12b18b6cb27e2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x35a5,0xefc9,0xcb59,0xb6f3,0x3f12,0x88e4,0xea6f,0xe3e8,0xb7aa,0x6881,0x7fab,0x2467,0x4d90,0xee8a,0x88dd,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xefc935a5,0xb6f3cb59,0x88e43f12,0xe3e8ea6f,0x6881b7aa,0x24677fab,0xee8a4d90,0x188dd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb6f3cb59efc935a5,0xe3e8ea6f88e43f12,0x24677fab6881b7aa,0x188ddee8a4d90}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x102e, 0x4c4, 0x1586, 0x1184, 0xa12, 0x9ce, 0x1866, 0x433, 0x5ef, 0x82a, 0x13a5, 0xbc6, 0x591, 0x175b, 0x10bc, 0xfa5, 0x109d, 0x8d4, 0x1325, 0x9} +#elif RADIX == 32 +{0x1131205d, 0x128c2561, 0xcc9ce50, 0x17bc8678, 0x9d2a0a8, 0x165915e3, 0x9617975, 0x6a4275f, 0x4992a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xca128c2561898902, 0x50545ef219e19939, 0xc2f2eb65915e34e9, 0x4acc951a909d7d2} +#else +{0x14612b0c4c481, 0x7219e19939ca1, 0x2bc69d2a0a8bd, 0x5f4b0bcbad964, 0x25664a8d484e} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x5a5, 0x1131, 0x561, 0x1461, 0x1284, 0x1273, 0x1e19, 0x190c, 0x117b, 0xa0a, 0x14e9, 0xaf1, 0x1964, 0x5d6, 0xc2f, 0xbe9, 0x427, 0xa35, 0xcc9, 0x3} +#elif RADIX == 32 +{0xc4c4b4a, 0x4a30958, 0x3327394, 0x5ef219e, 0x1a74a82a, 0xd964578, 0x1a585e5d, 0x11a909d7, 0x3664a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x7284a3095862625a, 0x541517bc8678664e, 0xb0bcbad964578d3a, 0x1ab32546a4275f4} +#else +{0x25184ac31312d, 0x3c8678664e728, 0xaf1a74a82a2f, 0x57d2c2f2eb659, 0xd5992a35213} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x1b4a, 0xf6a, 0xadd, 0x302, 0x196b, 0x366, 0x1399, 0xe83, 0x1540, 0xcd, 0x169d, 0x1007, 0xfe6, 0x1fd2, 0xebb, 0x808, 0x1725, 0x1c1e, 0x1009, 0x8} +#elif RADIX == 32 +{0xbdab695, 0xb1812b7, 0x132366cb, 0x1501d073, 0x1b4e8336, 0x4fe6803, 0x21d77fd, 0xf5c950, 0x3804f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xd96b1812b75ed5b4, 0x419b540741ce646c, 0x3aeffa4fe6803da7, 0x36402783d725404} +#else +{0x58c095baf6ada, 0x741ce646cd96, 0x5007b4e8336a8, 0x5010ebbfe93f9, 0x1b2013c1eb92} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x122a, 0x94e, 0x1927, 0x1701, 0x58e, 0x79, 0x134e, 0xecc, 0xa0f, 0x7be, 0xc39, 0xfb2, 0x1df0, 0x79a, 0x154a, 0x1a4a, 0x23f, 0x3de, 0x1be1, 0x9} +#elif RADIX == 32 +{0x1a53a455, 0xeb80e49, 0x9c0792c, 0x83dd993, 0x61c9ef9, 0x15df07d9, 0x12aa9479, 0x1ef08ff4, 0x4df08} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x258eb80e49d29d22, 0x4f7ca0f7664d380f, 0x5528f35df07d930e, 0x36ef847bc23fd25} +#else +{0x75c0724e94e91, 0x77664d380f258, 0xfb261c9ef941, 0x749554a3cd77c, 0x1b77c23de11f} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1943, 0x2e1, 0x677, 0x614, 0x19e, 0x11e6, 0xde2, 0x104d, 0x551, 0x1455, 0x1d7e, 0xdd, 0x15e0, 0x14c5, 0xeeb, 0x14b5, 0x168f, 0x1a03, 0xa9d, 0x4} +#elif RADIX == 32 +{0x18b87286, 0x1e30a19d, 0x1c51e60c, 0x154609ad, 0x1ebf5154, 0xb5e006e, 0xd5dd74c, 0x101da3e9, 0x454ee} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xc19e30a19dc5c394, 0xa8aa551826b78a3c, 0xbbae98b5e006ef5f, 0x112a7740768fa5a} +#else +{0x71850cee2e1ca, 0x1826b78a3cc19, 0xddebf5154aa, 0x696aeeba62d78, 0x8953ba03b47} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x512, 0xda9, 0x31a, 0x1711, 0x1b65, 0x9f0, 0xe54, 0x1d4a, 0xe1c, 0xc90, 0x1837, 0x1728, 0x15fa, 0xa40, 0xf21, 0x1b43, 0x1716, 0x1277, 0x11a8, 0x9} +#elif RADIX == 32 +{0x136a4a25, 0x5b888c6, 0xa89f0db, 0x1873a94e, 0xc1bb241, 0x15fab94, 0x10de42a4, 0x13bdc5b6, 0x48d44} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1b65b888c69b5251, 0xd920e1cea539513e, 0xbc854815fab9460d, 0xec6a24ef716da1} +#else +{0x2dc44634da928, 0x4ea539513e1b6, 0x5728c1bb241c3, 0x3686f2152057e, 0x2f6351277b8b} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x822, 0x1a13, 0x11d, 0x10e0, 0x2b9, 0x1d20, 0x19f9, 0x1dc2, 0x1770, 0x135e, 0x1c13, 0x1cba, 0x14df, 0x5c8, 0x1f31, 0x215, 0x16ed, 0x1f7a, 0xc6c, 0x5} +#elif RADIX == 32 +{0xe84d045, 0x19870047, 0x1f3d2015, 0x1dc3b859, 0xe09cd7a, 0x114dfe5d, 0x57e625c, 0x1bd5bb44, 0x6367} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x2b9870047742682, 0xe6bd770ee167e7a4, 0xfcc4b914dfe5d704, 0xcb1b3ef56ed10a} +#else +{0x4c38023ba1341, 0xee167e7a402b, 0x7cbae09cd7aee, 0x442bf312e4537, 0x658d9f7ab76} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x2cc, 0xd50, 0xeda, 0x1c3c, 0x8a6, 0x1659, 0xffb, 0x1cee, 0x1f14, 0x17fe, 0x1860, 0x427, 0x132c, 0x5c0, 0xb9f, 0x143d, 0x639, 0x19f0, 0x1551, 0x7} +#elif RADIX == 32 +{0x13540599, 0x6e1e3b6, 0x1f765945, 0x1c539dcf, 0x1c305ffb, 0x132c213, 0xf573e5c, 0xf818e68, 0x2aa8e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x28a6e1e3b69aa02c, 0x2ffdf14e773feecb, 0xae7cb8132c213e18, 0x3fd5473e0639a1e} +#else +{0x370f1db4d5016, 0x4e773feecb28a, 0x427c305ffbe2, 0x687ab9f2e04cb, 0x1feaa39f031c} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x900d,0xd052,0xb453,0x206a,0xe61d,0x31f2,0xc579,0xfb21,0xc870,0x2bb,0xf38f,0xf9c1,0x83aa,0x47f1,0x58d1,0xeb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd052900d,0x206ab453,0x31f2e61d,0xfb21c579,0x2bbc870,0xf9c1f38f,0x47f183aa,0xeb58d1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x206ab453d052900d,0xfb21c57931f2e61d,0xf9c1f38f02bbc870,0xeb58d147f183aa}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x727e,0xa5e8,0xebc3,0x9e04,0xf1eb,0x38d7,0x68e0,0x8ea9,0x8f77,0x8331,0x48eb,0x82c0,0xb0a3,0x3583,0xf221,0x54}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa5e8727e,0x9e04ebc3,0x38d7f1eb,0x8ea968e0,0x83318f77,0x82c048eb,0x3583b0a3,0x54f221}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9e04ebc3a5e8727e,0x8ea968e038d7f1eb,0x82c048eb83318f77,0x54f2213583b0a3}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdba9,0x49e4,0xc9b3,0x34e9,0x7ab9,0xd876,0xcae0,0xcfb0,0x6177,0x26b3,0x2c98,0x1e30,0x4a38,0x53cc,0x3bdc,0x71}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x49e4dba9,0x34e9c9b3,0xd8767ab9,0xcfb0cae0,0x26b36177,0x1e302c98,0x53cc4a38,0x713bdc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x34e9c9b349e4dba9,0xcfb0cae0d8767ab9,0x1e302c9826b36177,0x713bdc53cc4a38}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6ff3,0x2fad,0x4bac,0xdf95,0x19e2,0xce0d,0x3a86,0x4de,0x378f,0xfd44,0xc70,0x63e,0x7c55,0xb80e,0xa72e,0x14}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2fad6ff3,0xdf954bac,0xce0d19e2,0x4de3a86,0xfd44378f,0x63e0c70,0xb80e7c55,0x14a72e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdf954bac2fad6ff3,0x4de3a86ce0d19e2,0x63e0c70fd44378f,0x14a72eb80e7c55}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xad7a,0xb685,0xde69,0x55d2,0x5675,0x84e8,0x5916,0x925f,0x8c0a,0x1cb6,0x7c51,0x8391,0xffce,0x11d1,0x96ce,0xcd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb685ad7a,0x55d2de69,0x84e85675,0x925f5916,0x1cb68c0a,0x83917c51,0x11d1ffce,0xcd96ce}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x55d2de69b685ad7a,0x925f591684e85675,0x83917c511cb68c0a,0xcd96ce11d1ffce}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3724,0x79bd,0x1b92,0x959b,0xb3ec,0x6f18,0x27d4,0x64a7,0x9b4b,0x8c7e,0xade7,0x664b,0xa6d9,0xa287,0x6a1d,0x48}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79bd3724,0x959b1b92,0x6f18b3ec,0x64a727d4,0x8c7e9b4b,0x664bade7,0xa287a6d9,0x486a1d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x959b1b9279bd3724,0x64a727d46f18b3ec,0x664bade78c7e9b4b,0x486a1da287a6d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2417,0x1b00,0xcfe,0x8960,0x662e,0x42d2,0xc00f,0x222c,0x7671,0x278b,0x863f,0xbcac,0xdb9c,0x6e5e,0x4c5a,0x1b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1b002417,0x89600cfe,0x42d2662e,0x222cc00f,0x278b7671,0xbcac863f,0x6e5edb9c,0x1b4c5a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x89600cfe1b002417,0x222cc00f42d2662e,0xbcac863f278b7671,0x1b4c5a6e5edb9c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x21e8,0xd92b,0x5a2d,0xef86,0xf492,0x1483,0x8ae0,0x6b37,0x7f78,0x7b90,0x69c5,0xf4ec,0x2fb9,0x1660,0x8296,0xf8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd92b21e8,0xef865a2d,0x1483f492,0x6b378ae0,0x7b907f78,0xf4ec69c5,0x16602fb9,0xf88296}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xef865a2dd92b21e8,0x6b378ae01483f492,0xf4ec69c57b907f78,0xf8829616602fb9}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x38ff,0x5dc5,0x9aea,0xbc0e,0xbea5,0x775d,0x447b,0xc311,0xf01c,0xb63a,0x15fd,0x162a,0xab76,0x9def,0x2a0d,0xc5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5dc538ff,0xbc0e9aea,0x775dbea5,0xc311447b,0xb63af01c,0x162a15fd,0x9defab76,0xc52a0d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbc0e9aea5dc538ff,0xc311447b775dbea5,0x162a15fdb63af01c,0xc52a0d9defab76}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdbe9,0xe4ff,0xf301,0x769f,0x99d1,0xbd2d,0x3ff0,0xddd3,0x898e,0xd874,0x79c0,0x4353,0x2463,0x91a1,0xb3a5,0xe4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe4ffdbe9,0x769ff301,0xbd2d99d1,0xddd33ff0,0xd874898e,0x435379c0,0x91a12463,0xe4b3a5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x769ff301e4ffdbe9,0xddd33ff0bd2d99d1,0x435379c0d874898e,0xe4b3a591a12463}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x900d,0xd052,0xb453,0x206a,0xe61d,0x31f2,0xc579,0xfb21,0xc870,0x2bb,0xf38f,0xf9c1,0x83aa,0x47f1,0x58d1,0xeb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd052900d,0x206ab453,0x31f2e61d,0xfb21c579,0x2bbc870,0xf9c1f38f,0x47f183aa,0xeb58d1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x206ab453d052900d,0xfb21c57931f2e61d,0xf9c1f38f02bbc870,0xeb58d147f183aa}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x727e,0xa5e8,0xebc3,0x9e04,0xf1eb,0x38d7,0x68e0,0x8ea9,0x8f77,0x8331,0x48eb,0x82c0,0xb0a3,0x3583,0xf221,0x54}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa5e8727e,0x9e04ebc3,0x38d7f1eb,0x8ea968e0,0x83318f77,0x82c048eb,0x3583b0a3,0x54f221}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9e04ebc3a5e8727e,0x8ea968e038d7f1eb,0x82c048eb83318f77,0x54f2213583b0a3}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdba9,0x49e4,0xc9b3,0x34e9,0x7ab9,0xd876,0xcae0,0xcfb0,0x6177,0x26b3,0x2c98,0x1e30,0x4a38,0x53cc,0x3bdc,0x71}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x49e4dba9,0x34e9c9b3,0xd8767ab9,0xcfb0cae0,0x26b36177,0x1e302c98,0x53cc4a38,0x713bdc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x34e9c9b349e4dba9,0xcfb0cae0d8767ab9,0x1e302c9826b36177,0x713bdc53cc4a38}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6ff3,0x2fad,0x4bac,0xdf95,0x19e2,0xce0d,0x3a86,0x4de,0x378f,0xfd44,0xc70,0x63e,0x7c55,0xb80e,0xa72e,0x14}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2fad6ff3,0xdf954bac,0xce0d19e2,0x4de3a86,0xfd44378f,0x63e0c70,0xb80e7c55,0x14a72e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdf954bac2fad6ff3,0x4de3a86ce0d19e2,0x63e0c70fd44378f,0x14a72eb80e7c55}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd6bd,0xdb42,0x6f34,0xaae9,0x2b3a,0x4274,0xac8b,0x492f,0x4605,0x8e5b,0xbe28,0x41c8,0xffe7,0x8e8,0xcb67,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdb42d6bd,0xaae96f34,0x42742b3a,0x492fac8b,0x8e5b4605,0x41c8be28,0x8e8ffe7,0x66cb67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaae96f34db42d6bd,0x492fac8b42742b3a,0x41c8be288e5b4605,0x66cb6708e8ffe7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b92,0x3cde,0x8dc9,0x4acd,0x59f6,0x378c,0x93ea,0xb253,0x4da5,0xc63f,0xd6f3,0xb325,0xd36c,0xd143,0x350e,0x24}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3cde9b92,0x4acd8dc9,0x378c59f6,0xb25393ea,0xc63f4da5,0xb325d6f3,0xd143d36c,0x24350e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4acd8dc93cde9b92,0xb25393ea378c59f6,0xb325d6f3c63f4da5,0x24350ed143d36c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x20f0,0x2693,0xacbf,0x731a,0xb0f3,0xd8ce,0x1bcd,0xf836,0x8469,0x44d5,0xd604,0xd3aa,0x4aa8,0xcdc3,0x9086,0x3f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x269320f0,0x731aacbf,0xd8ceb0f3,0xf8361bcd,0x44d58469,0xd3aad604,0xcdc34aa8,0x3f9086}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x731aacbf269320f0,0xf8361bcdd8ceb0f3,0xd3aad60444d58469,0x3f9086cdc34aa8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcc11,0xe55a,0x932f,0x9534,0x2895,0xaf43,0x2956,0x614f,0x4e84,0xe4b2,0x60c6,0x255,0xbb14,0xd70d,0xc61e,0x13}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe55acc11,0x9534932f,0xaf432895,0x614f2956,0xe4b24e84,0x25560c6,0xd70dbb14,0x13c61e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9534932fe55acc11,0x614f2956af432895,0x25560c6e4b24e84,0x13c61ed70dbb14}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x28d6,0x450d,0xd24f,0x54e4,0x6e67,0x81d,0x9b71,0xadbe,0x1088,0x6148,0x4ebf,0x4b68,0x829e,0x65c8,0xe1a6,0xe5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450d28d6,0x54e4d24f,0x81d6e67,0xadbe9b71,0x61481088,0x4b684ebf,0x65c8829e,0xe5e1a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x54e4d24f450d28d6,0xadbe9b71081d6e67,0x4b684ebf61481088,0xe5e1a665c8829e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf10,0xd96c,0x5340,0x8ce5,0x4f0c,0x2731,0xe432,0x7c9,0x7b96,0xbb2a,0x29fb,0x2c55,0xb557,0x323c,0x6f79,0xc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd96cdf10,0x8ce55340,0x27314f0c,0x7c9e432,0xbb2a7b96,0x2c5529fb,0x323cb557,0xc06f79}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8ce55340d96cdf10,0x7c9e43227314f0c,0x2c5529fbbb2a7b96,0xc06f79323cb557}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x6b9, 0xd4c, 0x1d8d, 0x1f99, 0x1be4, 0x1f53, 0x5c1, 0x1937, 0x9c, 0xe68, 0x61e, 0x14e8, 0x352, 0x3d6, 0x174, 0x133, 0x18a6, 0x1b19, 0x94b, 0x9} +#elif RADIX == 32 +{0xb530d73, 0x4fccf63, 0x183f53df, 0x27326e5, 0x30f39a0, 0xc352a74, 0xcc2e83d, 0x18ce2982, 0x44a5e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x7be4fccf635a986b, 0x9cd009cc9b9707ea, 0x85d07ac352a74187, 0x31a52f6338a6099} +#else +{0x27e67b1ad4c35, 0x4c9b9707ea7be, 0x54e830f39a013, 0x2661741eb0d4, 0x40d297b19c53} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x348, 0xb53, 0xf63, 0x7e6, 0x1ef9, 0xfd4, 0x1970, 0x64d, 0x27, 0x139a, 0x187, 0x153a, 0x10d4, 0xf5, 0x185d, 0x104c, 0xe29, 0x1ec6, 0x1a52, 0x0} +#elif RADIX == 32 +{0x1ad4c690, 0x193f33d8, 0xe0fd4f7, 0x9cc9b9, 0xc3ce68, 0xb0d4a9d, 0x1330ba0f, 0x16338a60, 0xd297} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9ef93f33d8d6a634, 0xe734027326e5c1fa, 0x61741eb0d4a9d061, 0x28694bd8ce29826} +#else +{0x49f99ec6b531a, 0x7326e5c1fa9ef, 0x153a0c3ce6804, 0x609985d07ac35, 0x1434a5ec6714} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x18af, 0xb6e, 0x124d, 0xa49, 0xa8c, 0x11f5, 0xea9, 0x298, 0xa55, 0x1738, 0xb61, 0x2b9, 0x8a, 0x167a, 0x17e6, 0x2b0, 0x1290, 0x16ad, 0x1505, 0x2} +#elif RADIX == 32 +{0xadbb15e, 0xc524c93, 0x1531f554, 0x954530e, 0x15b0dce1, 0x1408a15c, 0xc2fcd67, 0x156ca405, 0x2a82d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xaa8c524c9356dd8a, 0x6e70a5514c3aa63e, 0x5f9acf408a15cad8, 0x4c5416d5b290158} +#else +{0x6292649ab6ec5, 0x514c3aa63eaa8, 0x42b95b0dce14a, 0x5617e6b3d022, 0x262a0b6ad948} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1390, 0x1895, 0x9b7, 0xa5a, 0x1030, 0x16c1, 0xd21, 0x1053, 0x327, 0x1a4c, 0x1a22, 0x11e4, 0x16ba, 0x13a1, 0x1dbc, 0x1aac, 0x148c, 0x5c8, 0x15d2, 0x0} +#elif RADIX == 32 +{0x1e256720, 0x1052d26d, 0x436c181, 0xc9e0a6d, 0xd116930, 0x36ba8f2, 0xb3b793a, 0xe452335, 0xae91} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x303052d26df12b39, 0xb498327829b486d8, 0x76f27436ba8f2688, 0x5748b9148cd56} +#else +{0x296936f8959c, 0x7829b486d8303, 0x51e4d11693064, 0x3559dbc9d0dae, 0x282ba45c8a46} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1be6, 0x11b3, 0x14ba, 0xf43, 0x1bd1, 0x215, 0x1e9a, 0x137a, 0x7b2, 0x15, 0x126, 0x148, 0x1c2b, 0x1b70, 0xf1c, 0x1e48, 0x1259, 0x188a, 0x1e44, 0x7} +#elif RADIX == 32 +{0x146cf7cd, 0x117a1d2e, 0x134215de, 0x1eca6f5e, 0x930054, 0x1c2b0a4, 0x121e39b7, 0x454967c, 0x2f226} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbbd17a1d2ea367be, 0x802a7b29bd7a6842, 0x3c736e1c2b0a4049, 0x21f913115259f24} +#else +{0xbd0e9751b3df, 0x29bd7a6842bbd, 0x61480930054f6, 0x7c90f1cdb870a, 0x10fc8988a92c} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x4c5, 0x37e, 0xafa, 0x1b90, 0x13d, 0x8d3, 0xaa7, 0x489, 0x1d4a, 0x17bc, 0x168, 0x37f, 0x1ed6, 0x666, 0x1889, 0x1a4e, 0xa57, 0xeb7, 0xd37, 0x7} +#elif RADIX == 32 +{0x10df898b, 0x1ddc82be, 0x14e8d309, 0x1528912a, 0x10b45ef3, 0xded61bf, 0x13b11266, 0x15ba95f4, 0x269bb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x613ddc82be86fc4c, 0x2f79d4a244aa9d1a, 0x6224ccded61bf85a, 0x1cb4ddd6ea57d27} +#else +{0x6ee415f437e26, 0x2244aa9d1a613, 0x437f0b45ef3a9, 0x749d8893337b5, 0xe5a6eeb752b} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x447, 0x1b87, 0x1cf0, 0x155, 0xb1, 0x804, 0x97a, 0x64a, 0x886, 0x3a3, 0x126f, 0x1553, 0x74d, 0xde9, 0x941, 0x39c, 0x8f, 0x1bbb, 0xf3, 0x1} +#elif RADIX == 32 +{0x6e1c88e, 0x110aaf3c, 0xf480405, 0x218c949, 0x19378e8d, 0x1274daa9, 0x71282de, 0x1dd823c7, 0x1079e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x80b10aaf3c370e44, 0xc74688632525e900, 0x2505bd274daa9c9b, 0x2383cf77608f1ce} +#else +{0x85579e1b8722, 0x632525e90080b, 0x35539378e8d10, 0x47389416f49d3, 0x11c1e7bbb047} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xf9d, 0x552, 0x797, 0x19fc, 0x166, 0x7a8, 0x1ee5, 0xc77, 0x1ee7, 0x15ef, 0x340, 0x10df, 0x1d5f, 0x170, 0xf2, 0x123, 0x1bb1, 0xd23, 0x3fc, 0x6} +#elif RADIX == 32 +{0x19549f3b, 0x6cfe1e5, 0x1ca7a80b, 0x1b9d8efe, 0x11a057bf, 0x1d5f86f, 0x8c1e417, 0x91eec42, 0x11fe3} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x166cfe1e5caa4f9, 0x2bdfee763bfb94f5, 0x83c82e1d5f86f8d0, 0x440ff1a47bb1091} +#else +{0x367f0f2e5527c, 0x763bfb94f5016, 0x70df1a057bfdc, 0x42460f20b8757, 0x4a07f8d23dd8} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x27cb,0x4931,0x13e0,0xcd75,0x6846,0x3de7,0x5a91,0x9ff9,0xa270,0xa6d6,0x26ec,0xb972,0xb44,0xe4b8,0x52fc,0x3f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x493127cb,0xcd7513e0,0x3de76846,0x9ff95a91,0xa6d6a270,0xb97226ec,0xe4b80b44,0x3f52fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xcd7513e0493127cb,0x9ff95a913de76846,0xb97226eca6d6a270,0x3f52fce4b80b44}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2d7e,0x5a38,0xca74,0x1d16,0x2547,0x1674,0x8c29,0xafc2,0x2349,0x4856,0x2c73,0x7957,0x67e1,0x3c3e,0x4d3,0xad}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5a382d7e,0x1d16ca74,0x16742547,0xafc28c29,0x48562349,0x79572c73,0x3c3e67e1,0xad04d3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1d16ca745a382d7e,0xafc28c2916742547,0x79572c7348562349,0xad04d33c3e67e1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd8d7,0x27fb,0x321e,0xcf15,0xfbd3,0x6f8e,0x5fbd,0x7ed7,0xf394,0x58d6,0x5937,0xb73c,0xbfb,0xe027,0x64ac,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x27fbd8d7,0xcf15321e,0x6f8efbd3,0x7ed75fbd,0x58d6f394,0xb73c5937,0xe0270bfb,0x2264ac}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xcf15321e27fbd8d7,0x7ed75fbd6f8efbd3,0xb73c593758d6f394,0x2264ace0270bfb}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd835,0xb6ce,0xec1f,0x328a,0x97b9,0xc218,0xa56e,0x6006,0x5d8f,0x5929,0xd913,0x468d,0xf4bb,0x1b47,0xad03,0xc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb6ced835,0x328aec1f,0xc21897b9,0x6006a56e,0x59295d8f,0x468dd913,0x1b47f4bb,0xc0ad03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x328aec1fb6ced835,0x6006a56ec21897b9,0x468dd91359295d8f,0xc0ad031b47f4bb}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5286,0x497a,0x2196,0xaa2d,0xa98a,0x7b17,0xa6e9,0x6da0,0x73f5,0xe349,0x83ae,0x7c6e,0x31,0xee2e,0x6931,0x32}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x497a5286,0xaa2d2196,0x7b17a98a,0x6da0a6e9,0xe34973f5,0x7c6e83ae,0xee2e0031,0x326931}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaa2d2196497a5286,0x6da0a6e97b17a98a,0x7c6e83aee34973f5,0x326931ee2e0031}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc8dc,0x8642,0xe46d,0x6a64,0x4c13,0x90e7,0xd82b,0x9b58,0x64b4,0x7381,0x5218,0x99b4,0x5926,0x5d78,0x95e2,0xb7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8642c8dc,0x6a64e46d,0x90e74c13,0x9b58d82b,0x738164b4,0x99b45218,0x5d785926,0xb795e2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6a64e46d8642c8dc,0x9b58d82b90e74c13,0x99b45218738164b4,0xb795e25d785926}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x94df,0x6dc7,0xcd7f,0xebb2,0xb290,0x811d,0x2825,0xc88,0xd514,0x959a,0x7d64,0xc8c3,0x16a9,0x106a,0x1eea,0x32}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6dc794df,0xebb2cd7f,0x811db290,0xc882825,0x959ad514,0xc8c37d64,0x106a16a9,0x321eea}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xebb2cd7f6dc794df,0xc882825811db290,0xc8c37d64959ad514,0x321eea106a16a9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe08c,0xe778,0x1464,0x19fe,0xef25,0x1d24,0xa98f,0x4af0,0x70d3,0x8e4d,0x2b82,0x95ea,0x3277,0xc267,0x1695,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe778e08c,0x19fe1464,0x1d24ef25,0x4af0a98f,0x8e4d70d3,0x95ea2b82,0xc2673277,0xf1695}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x19fe1464e778e08c,0x4af0a98f1d24ef25,0x95ea2b828e4d70d3,0xf1695c2673277}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1df,0xb6e1,0xe2a4,0x4bc9,0xdc85,0x6365,0x3fca,0x9a38,0xee2,0xed03,0xca7f,0x1984,0xe709,0x1efe,0xc173,0x8b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb6e1f1df,0x4bc9e2a4,0x6365dc85,0x9a383fca,0xed030ee2,0x1984ca7f,0x1efee709,0x8bc173}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4bc9e2a4b6e1f1df,0x9a383fca6365dc85,0x1984ca7fed030ee2,0x8bc1731efee709}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6b21,0x9238,0x3280,0x144d,0x4d6f,0x7ee2,0xd7da,0xf377,0x2aeb,0x6a65,0x829b,0x373c,0xe956,0xef95,0xe115,0xcd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x92386b21,0x144d3280,0x7ee24d6f,0xf377d7da,0x6a652aeb,0x373c829b,0xef95e956,0xcde115}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x144d328092386b21,0xf377d7da7ee24d6f,0x373c829b6a652aeb,0xcde115ef95e956}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x27cb,0x4931,0x13e0,0xcd75,0x6846,0x3de7,0x5a91,0x9ff9,0xa270,0xa6d6,0x26ec,0xb972,0xb44,0xe4b8,0x52fc,0x3f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x493127cb,0xcd7513e0,0x3de76846,0x9ff95a91,0xa6d6a270,0xb97226ec,0xe4b80b44,0x3f52fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xcd7513e0493127cb,0x9ff95a913de76846,0xb97226eca6d6a270,0x3f52fce4b80b44}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2d7e,0x5a38,0xca74,0x1d16,0x2547,0x1674,0x8c29,0xafc2,0x2349,0x4856,0x2c73,0x7957,0x67e1,0x3c3e,0x4d3,0xad}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5a382d7e,0x1d16ca74,0x16742547,0xafc28c29,0x48562349,0x79572c73,0x3c3e67e1,0xad04d3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1d16ca745a382d7e,0xafc28c2916742547,0x79572c7348562349,0xad04d33c3e67e1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd8d7,0x27fb,0x321e,0xcf15,0xfbd3,0x6f8e,0x5fbd,0x7ed7,0xf394,0x58d6,0x5937,0xb73c,0xbfb,0xe027,0x64ac,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x27fbd8d7,0xcf15321e,0x6f8efbd3,0x7ed75fbd,0x58d6f394,0xb73c5937,0xe0270bfb,0x2264ac}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xcf15321e27fbd8d7,0x7ed75fbd6f8efbd3,0xb73c593758d6f394,0x2264ace0270bfb}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd835,0xb6ce,0xec1f,0x328a,0x97b9,0xc218,0xa56e,0x6006,0x5d8f,0x5929,0xd913,0x468d,0xf4bb,0x1b47,0xad03,0xc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb6ced835,0x328aec1f,0xc21897b9,0x6006a56e,0x59295d8f,0x468dd913,0x1b47f4bb,0xc0ad03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x328aec1fb6ced835,0x6006a56ec21897b9,0x468dd91359295d8f,0xc0ad031b47f4bb}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2943,0x24bd,0x90cb,0x5516,0xd4c5,0xbd8b,0x5374,0xb6d0,0xb9fa,0x71a4,0x41d7,0xbe37,0x18,0xf717,0x3498,0x99}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x24bd2943,0x551690cb,0xbd8bd4c5,0xb6d05374,0x71a4b9fa,0xbe3741d7,0xf7170018,0x993498}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x551690cb24bd2943,0xb6d05374bd8bd4c5,0xbe3741d771a4b9fa,0x993498f7170018}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x646e,0xc321,0x7236,0xb532,0xa609,0xc873,0x6c15,0x4dac,0xb25a,0x39c0,0x290c,0x4cda,0x2c93,0x2ebc,0xcaf1,0xdb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc321646e,0xb5327236,0xc873a609,0x4dac6c15,0x39c0b25a,0x4cda290c,0x2ebc2c93,0xdbcaf1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb5327236c321646e,0x4dac6c15c873a609,0x4cda290c39c0b25a,0xdbcaf12ebc2c93}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd647,0xf187,0x9a31,0x1ee,0x193b,0xeec2,0xbfed,0x9418,0x15b6,0xe9a,0x4c74,0xae85,0x3ebe,0x2677,0x3f12,0x42}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf187d647,0x1ee9a31,0xeec2193b,0x9418bfed,0xe9a15b6,0xae854c74,0x26773ebe,0x423f12}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1ee9a31f187d647,0x9418bfedeec2193b,0xae854c740e9a15b6,0x423f1226773ebe}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x68ff,0x99be,0x416c,0x7bbf,0xd44f,0x609f,0x7682,0xa8ff,0xa6bb,0xec03,0x8e77,0xc076,0x7873,0x9676,0xa152,0xf5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x99be68ff,0x7bbf416c,0x609fd44f,0xa8ff7682,0xec03a6bb,0xc0768e77,0x96767873,0xf5a152}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7bbf416c99be68ff,0xa8ff7682609fd44f,0xc0768e77ec03a6bb,0xf5a15296767873}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3739,0xf7da,0xbd23,0xa38e,0x8cf9,0x7690,0x6b0e,0x1a7,0x77f0,0xa2bd,0x5ac7,0x5101,0x3aae,0xa922,0x2d3a,0x95}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf7da3739,0xa38ebd23,0x76908cf9,0x1a76b0e,0xa2bd77f0,0x51015ac7,0xa9223aae,0x952d3a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa38ebd23f7da3739,0x1a76b0e76908cf9,0x51015ac7a2bd77f0,0x952d3aa9223aae}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x29b9,0xe78,0x65ce,0xfe11,0xe6c4,0x113d,0x4012,0x6be7,0xea49,0xf165,0xb38b,0x517a,0xc141,0xd988,0xc0ed,0xbd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe7829b9,0xfe1165ce,0x113de6c4,0x6be74012,0xf165ea49,0x517ab38b,0xd988c141,0xbdc0ed}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xfe1165ce0e7829b9,0x6be74012113de6c4,0x517ab38bf165ea49,0xbdc0edd988c141}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x1068, 0xf2c, 0x1ada, 0x1f58, 0x1343, 0x5cc, 0x90, 0x1bba, 0x50b, 0x1a35, 0x35f, 0x1388, 0x5ce, 0xc4f, 0x1462, 0x191f, 0x665, 0x843, 0x1cb1, 0x1} +#elif RADIX == 32 +{0x13cb20d0, 0x3fac6b6, 0x1205cc9a, 0x142f7740, 0x1afe8d4, 0x1e5ce9c4, 0x7e8c4c4, 0x2199972, 0x1e58a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9343fac6b69e5906, 0xf46a50bddd0240b9, 0xd18989e5ce9c40d7, 0x28f2c5086665c8f} +#else +{0x1fd635b4f2c83, 0x3ddd0240b9934, 0x53881afe8d4a1, 0x723f462627973, 0x147962843332} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x5b3, 0x13cb, 0x6b6, 0x1fd6, 0x4d0, 0x173, 0x1024, 0x1eee, 0x942, 0x1e8d, 0xd7, 0x14e2, 0x1973, 0x1313, 0x1d18, 0xe47, 0x1999, 0xa10, 0xf2c, 0x6} +#elif RADIX == 32 +{0x14f2cb67, 0x10feb1ad, 0x4817326, 0x50bddd0, 0x6bfa35, 0x7973a71, 0x11fa3131, 0x1086665c, 0x17962} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x64d0feb1ada7965b, 0xfd1a942f7740902e, 0xf462627973a71035, 0x123cb1421999723} +#else +{0x7f58d6d3cb2d, 0x2f7740902e64d, 0x74e206bfa3528, 0x5c8fd18989e5c, 0x311e58a10ccc} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x14ba, 0xa50, 0x219, 0x1ca8, 0x1858, 0xe67, 0x1b19, 0xb09, 0x17fa, 0x89f, 0x10d7, 0x1a55, 0x14de, 0x1f37, 0x12f0, 0x1247, 0x1aa6, 0x109f, 0x493, 0x6} +#elif RADIX == 32 +{0xa942975, 0x18e54086, 0x32e67c2, 0x1fe9613b, 0x186ba27e, 0xf4ded2a, 0x11e5e1f3, 0x4fea9a4, 0x1249c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf858e5408654a14b, 0xd13f7fa584ec65cc, 0xcbc3e6f4ded2ac35, 0x35124e13faa6923} +#else +{0x472a0432a50a5, 0x2584ec65ccf85, 0x5a5586ba27eff, 0x248f2f0f9bd37, 0x42892709fd53} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1ba, 0xab8, 0x1ded, 0xdc9, 0xf40, 0xaa3, 0x169, 0x53c, 0x2, 0x848, 0x9a6, 0xbad, 0xb7e, 0x15dc, 0x87, 0x1cf3, 0x1791, 0x1af2, 0x1cdf, 0x7} +#elif RADIX == 32 +{0xaae0375, 0x6e4f7b, 0xd2aa37a, 0x8a781, 0x14d32120, 0x18b7e5d6, 0x1cc10f5d, 0x1795e479, 0x2e6fe} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6f406e4f7b55701b, 0x909000229e05a554, 0x821ebb8b7e5d6a69, 0x35f37f5e5791e79} +#else +{0x3727bdaab80d, 0x229e05a5546f4, 0x4bad4d3212000, 0x79e6087aee2df, 0x42f9bfaf2bc8} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x5b, 0xad0, 0x69, 0x1038, 0x18d2, 0x180d, 0x1871, 0x46b, 0x26b, 0x1ef2, 0xe46, 0x72d, 0xc0d, 0x15a4, 0x6d7, 0x221, 0x1611, 0x1a89, 0xd3f, 0x8} +#elif RADIX == 32 +{0xab400b7, 0x1281c01a, 0xe380dc6, 0x9ac8d78, 0x17237bc8, 0x8c0d396, 0x84daf5a, 0x144d8444, 0x369fe} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xb8d281c01a55a005, 0xbde426b235e1c701, 0x9b5eb48c0d396b91, 0x3b34ff513611110} +#else +{0x140e00d2ad002, 0x3235e1c701b8d, 0x272d7237bc84d, 0x44426d7ad2303, 0x459a7fa89b08} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1131, 0xac7, 0xa16, 0x918, 0x5d8, 0x1e64, 0x3e5, 0x142c, 0x1f89, 0x1cb7, 0xf96, 0x370, 0x4da, 0xf45, 0x1aa5, 0x1872, 0x1fc, 0xd83, 0x1145, 0x6} +#elif RADIX == 32 +{0x12b1e263, 0x1848c285, 0x1cbe642e, 0x1e268583, 0x7cb72df, 0xa4da1b8, 0x1cb54af4, 0xc187f30, 0x18a2b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x85d848c285958f13, 0xb96ff89a160f97cc, 0x6a95e8a4da1b83e5, 0x84515b061fcc39} +#else +{0x4246142cac789, 0x1a160f97cc85d, 0x43707cb72dff1, 0x30e5aa57a2936, 0x2c228ad830fe} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x7a4, 0x388, 0xd00, 0x66c, 0x1a9a, 0xabc, 0x97b, 0xadc, 0xaab, 0x1601, 0x287, 0xb2a, 0x1ab7, 0x1803, 0x1d06, 0x81c, 0x890, 0x11e0, 0x1e19, 0x0} +#elif RADIX == 32 +{0xe20f48, 0x1a336340, 0xf6abcd4, 0xaad5b89, 0x143d805, 0x7ab7595, 0x73a0d80, 0xf022410, 0xf0cc} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9a9a33634007107a, 0xec02aab56e25ed57, 0x741b007ab75950a1, 0x1478663c089040e} +#else +{0x519b1a003883d, 0x356e25ed579a9, 0x6b2a143d80555, 0x1039d06c01ead, 0xa3c331e0448} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1e68, 0xcde, 0x29, 0x1777, 0x1ef8, 0x1a1c, 0x204, 0x148, 0x14ba, 0x1c39, 0x175, 0x1263, 0x4de, 0x1032, 0x1649, 0x5a4, 0xad, 0xcfb, 0x870, 0x3} +#elif RADIX == 32 +{0xb37bcd0, 0x18bbb80a, 0x9a1cf7, 0x12e82902, 0x10baf0e6, 0x44de931, 0x92c9303, 0x7d82b4b, 0x34383} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9ef8bbb80a59bde6, 0x78734ba0a4081343, 0x59260644de93185d, 0x29a1c19f60ad2d2} +#else +{0x45ddc052cdef3, 0x20a40813439ef, 0x52630baf0e697, 0x4b49649819137, 0x14d0e0cfb056} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7177,0xb186,0x73de,0xc572,0x9802,0xc0ee,0x7031,0xfe17,0xbc2e,0x41c5,0xe2a7,0xed41,0x1cbf,0x9ff9,0xf5bc,0x1e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb1867177,0xc57273de,0xc0ee9802,0xfe177031,0x41c5bc2e,0xed41e2a7,0x9ff91cbf,0x1ef5bc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc57273deb1867177,0xfe177031c0ee9802,0xed41e2a741c5bc2e,0x1ef5bc9ff91cbf}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x726a,0xbae3,0x32b6,0x75c2,0xe003,0x6e79,0xd172,0x382a,0x8a51,0x7962,0xa563,0x6a39,0x9cdd,0xc910,0xf6f0,0xa0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbae3726a,0x75c232b6,0x6e79e003,0x382ad172,0x79628a51,0x6a39a563,0xc9109cdd,0xa0f6f0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x75c232b6bae3726a,0x382ad1726e79e003,0x6a39a56379628a51,0xa0f6f0c9109cdd}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x246b,0x9fa9,0x54e6,0xbd87,0x15b5,0x1c70,0x6470,0x25fa,0x3f5c,0x8940,0xa6e9,0x7eb5,0x6109,0x54a1,0xa8df,0x16}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9fa9246b,0xbd8754e6,0x1c7015b5,0x25fa6470,0x89403f5c,0x7eb5a6e9,0x54a16109,0x16a8df}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbd8754e69fa9246b,0x25fa64701c7015b5,0x7eb5a6e989403f5c,0x16a8df54a16109}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8e89,0x4e79,0x8c21,0x3a8d,0x67fd,0x3f11,0x8fce,0x1e8,0x43d1,0xbe3a,0x1d58,0x12be,0xe340,0x6006,0xa43,0xe1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4e798e89,0x3a8d8c21,0x3f1167fd,0x1e88fce,0xbe3a43d1,0x12be1d58,0x6006e340,0xe10a43}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3a8d8c214e798e89,0x1e88fce3f1167fd,0x12be1d58be3a43d1,0xe10a436006e340}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x231b,0x1af2,0x1640,0xb19c,0xf713,0xe470,0x683e,0xf39a,0x3289,0x7a54,0xc26e,0x904e,0xd5a6,0x6a0c,0x55fc,0x44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1af2231b,0xb19c1640,0xe470f713,0xf39a683e,0x7a543289,0x904ec26e,0x6a0cd5a6,0x4455fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb19c16401af2231b,0xf39a683ee470f713,0x904ec26e7a543289,0x4455fc6a0cd5a6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xad7a,0xb685,0xde69,0x55d2,0x5675,0x84e8,0x5916,0x925f,0x8c0a,0x1cb6,0x7c51,0x8391,0xffce,0x11d1,0x96ce,0xcd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb685ad7a,0x55d2de69,0x84e85675,0x925f5916,0x1cb68c0a,0x83917c51,0x11d1ffce,0xcd96ce}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x55d2de69b685ad7a,0x925f591684e85675,0x83917c511cb68c0a,0xcd96ce11d1ffce}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3724,0x79bd,0x1b92,0x959b,0xb3ec,0x6f18,0x27d4,0x64a7,0x9b4b,0x8c7e,0xade7,0x664b,0xa6d9,0xa287,0x6a1d,0x48}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79bd3724,0x959b1b92,0x6f18b3ec,0x64a727d4,0x8c7e9b4b,0x664bade7,0xa287a6d9,0x486a1d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x959b1b9279bd3724,0x64a727d46f18b3ec,0x664bade78c7e9b4b,0x486a1da287a6d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdce5,0xe50d,0xe9bf,0x4e63,0x8ec,0x1b8f,0x97c1,0xc65,0xcd76,0x85ab,0x3d91,0x6fb1,0x2a59,0x95f3,0xaa03,0xbb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe50ddce5,0x4e63e9bf,0x1b8f08ec,0xc6597c1,0x85abcd76,0x6fb13d91,0x95f32a59,0xbbaa03}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4e63e9bfe50ddce5,0xc6597c11b8f08ec,0x6fb13d9185abcd76,0xbbaa0395f32a59}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1975,0x2b02,0x86c,0x9cbe,0x7576,0xb1c3,0xd9a7,0x737e,0x4de1,0xa245,0x7652,0xf9bf,0x4bf8,0xdc2c,0xeaa1,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2b021975,0x9cbe086c,0xb1c37576,0x737ed9a7,0xa2454de1,0xf9bf7652,0xdc2c4bf8,0x8eaa1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9cbe086c2b021975,0x737ed9a7b1c37576,0xf9bf7652a2454de1,0x8eaa1dc2c4bf8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee88,0x46bc,0x7177,0x337c,0x92b6,0x40dc,0xb657,0x3366,0x6c8a,0x2b98,0x40eb,0x1146,0xe116,0xb00a,0xa22f,0xe3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x46bcee88,0x337c7177,0x40dc92b6,0x3366b657,0x2b986c8a,0x114640eb,0xb00ae116,0xe3a22f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x337c717746bcee88,0x3366b65740dc92b6,0x114640eb2b986c8a,0xe3a22fb00ae116}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf28d,0x64d3,0xe248,0x40b9,0x5141,0x82bb,0x82ea,0xcf35,0xfaf0,0x3,0xd71f,0x6e88,0x7ac9,0xf4c9,0x6b9e,0xcc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x64d3f28d,0x40b9e248,0x82bb5141,0xcf3582ea,0x3faf0,0x6e88d71f,0xf4c97ac9,0xcc6b9e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x40b9e24864d3f28d,0xcf3582ea82bb5141,0x6e88d71f0003faf0,0xcc6b9ef4c97ac9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe68b,0xd4fd,0xf793,0x6341,0x8a89,0x4e3c,0x2658,0x8c81,0xb21e,0x5dba,0x89ad,0x640,0xb407,0x23d3,0x155e,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd4fde68b,0x6341f793,0x4e3c8a89,0x8c812658,0x5dbab21e,0x64089ad,0x23d3b407,0xf7155e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6341f793d4fde68b,0x8c8126584e3c8a89,0x64089ad5dbab21e,0xf7155e23d3b407}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7177,0xb186,0x73de,0xc572,0x9802,0xc0ee,0x7031,0xfe17,0xbc2e,0x41c5,0xe2a7,0xed41,0x1cbf,0x9ff9,0xf5bc,0x1e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb1867177,0xc57273de,0xc0ee9802,0xfe177031,0x41c5bc2e,0xed41e2a7,0x9ff91cbf,0x1ef5bc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc57273deb1867177,0xfe177031c0ee9802,0xed41e2a741c5bc2e,0x1ef5bc9ff91cbf}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x726a,0xbae3,0x32b6,0x75c2,0xe003,0x6e79,0xd172,0x382a,0x8a51,0x7962,0xa563,0x6a39,0x9cdd,0xc910,0xf6f0,0xa0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbae3726a,0x75c232b6,0x6e79e003,0x382ad172,0x79628a51,0x6a39a563,0xc9109cdd,0xa0f6f0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x75c232b6bae3726a,0x382ad1726e79e003,0x6a39a56379628a51,0xa0f6f0c9109cdd}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x246b,0x9fa9,0x54e6,0xbd87,0x15b5,0x1c70,0x6470,0x25fa,0x3f5c,0x8940,0xa6e9,0x7eb5,0x6109,0x54a1,0xa8df,0x16}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9fa9246b,0xbd8754e6,0x1c7015b5,0x25fa6470,0x89403f5c,0x7eb5a6e9,0x54a16109,0x16a8df}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbd8754e69fa9246b,0x25fa64701c7015b5,0x7eb5a6e989403f5c,0x16a8df54a16109}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8e89,0x4e79,0x8c21,0x3a8d,0x67fd,0x3f11,0x8fce,0x1e8,0x43d1,0xbe3a,0x1d58,0x12be,0xe340,0x6006,0xa43,0xe1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4e798e89,0x3a8d8c21,0x3f1167fd,0x1e88fce,0xbe3a43d1,0x12be1d58,0x6006e340,0xe10a43}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3a8d8c214e798e89,0x1e88fce3f1167fd,0x12be1d58be3a43d1,0xe10a436006e340}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x118e,0xd79,0xb20,0xd8ce,0x7b89,0x7238,0x341f,0xf9cd,0x1944,0x3d2a,0x6137,0x4827,0x6ad3,0x3506,0x2afe,0x22}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd79118e,0xd8ce0b20,0x72387b89,0xf9cd341f,0x3d2a1944,0x48276137,0x35066ad3,0x222afe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8ce0b200d79118e,0xf9cd341f72387b89,0x482761373d2a1944,0x222afe35066ad3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd6bd,0xdb42,0x6f34,0xaae9,0x2b3a,0x4274,0xac8b,0x492f,0x4605,0x8e5b,0xbe28,0x41c8,0xffe7,0x8e8,0xcb67,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdb42d6bd,0xaae96f34,0x42742b3a,0x492fac8b,0x8e5b4605,0x41c8be28,0x8e8ffe7,0x66cb67}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaae96f34db42d6bd,0x492fac8b42742b3a,0x41c8be288e5b4605,0x66cb6708e8ffe7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b92,0x3cde,0x8dc9,0x4acd,0x59f6,0x378c,0x93ea,0xb253,0x4da5,0xc63f,0xd6f3,0xb325,0xd36c,0xd143,0x350e,0x24}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3cde9b92,0x4acd8dc9,0x378c59f6,0xb25393ea,0xc63f4da5,0xb325d6f3,0xd143d36c,0x24350e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4acd8dc93cde9b92,0xb25393ea378c59f6,0xb325d6f3c63f4da5,0x24350ed143d36c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xee73,0xf286,0xf4df,0x2731,0x8476,0x8dc7,0xcbe0,0x632,0xe6bb,0xc2d5,0x9ec8,0xb7d8,0x952c,0xcaf9,0xd501,0xdd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf286ee73,0x2731f4df,0x8dc78476,0x632cbe0,0xc2d5e6bb,0xb7d89ec8,0xcaf9952c,0xddd501}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2731f4dff286ee73,0x632cbe08dc78476,0xb7d89ec8c2d5e6bb,0xddd501caf9952c}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x84a0,0x8ad1,0xbcc4,0xc440,0x94e1,0x46ea,0x15c6,0x784e,0x190,0xd26f,0x630,0x2bee,0x74b1,0x93ce,0xe061,0x3c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8ad184a0,0xc440bcc4,0x46ea94e1,0x784e15c6,0xd26f0190,0x2bee0630,0x93ce74b1,0x3ce061}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc440bcc48ad184a0,0x784e15c646ea94e1,0x2bee0630d26f0190,0x3ce06193ce74b1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1e2b,0xdafe,0xfa45,0xa69b,0xb77e,0xf670,0x927d,0xa0f9,0xccb5,0xc897,0x9607,0x5f22,0x47bf,0x867,0xf781,0xd9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdafe1e2b,0xa69bfa45,0xf670b77e,0xa0f9927d,0xc897ccb5,0x5f229607,0x86747bf,0xd9f781}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa69bfa45dafe1e2b,0xa0f9927df670b77e,0x5f229607c897ccb5,0xd9f781086747bf}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2aa2,0xbd3f,0x2ad,0x19bd,0xe6f0,0x3b95,0x3fff,0xd17e,0xf3a6,0x7888,0xda46,0x3b21,0xcc57,0x5301,0x3e50,0xc4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbd3f2aa2,0x19bd02ad,0x3b95e6f0,0xd17e3fff,0x7888f3a6,0x3b21da46,0x5301cc57,0xc43e50}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x19bd02adbd3f2aa2,0xd17e3fff3b95e6f0,0x3b21da467888f3a6,0xc43e505301cc57}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7b60,0x752e,0x433b,0x3bbf,0x6b1e,0xb915,0xea39,0x87b1,0xfe6f,0x2d90,0xf9cf,0xd411,0x8b4e,0x6c31,0x1f9e,0xc3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x752e7b60,0x3bbf433b,0xb9156b1e,0x87b1ea39,0x2d90fe6f,0xd411f9cf,0x6c318b4e,0xc31f9e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3bbf433b752e7b60,0x87b1ea39b9156b1e,0xd411f9cf2d90fe6f,0xc31f9e6c318b4e}}} +#endif +}}}}; diff --git a/src/precomp/ref/lvl1/hd_splitting_transforms.c b/src/precomp/ref/lvl1/hd_splitting_transforms.c new file mode 100644 index 0000000..6332d21 --- /dev/null +++ b/src/precomp/ref/lvl1/hd_splitting_transforms.c @@ -0,0 +1,143 @@ +#include + +#define FP2_ZERO 0 +#define FP2_ONE 1 +#define FP2_I 2 +#define FP2_MINUS_ONE 3 +#define FP2_MINUS_I 4 + +const int EVEN_INDEX[10][2] = {{0, 0}, {0, 1}, {0, 2}, {0, 3}, {1, 0}, {1, 2}, {2, 0}, {2, 1}, {3, 0}, {3, 3}}; +const int CHI_EVAL[4][4] = {{1, 1, 1, 1}, {1, -1, 1, -1}, {1, 1, -1, -1}, {1, -1, -1, 1}}; +const fp2_t FP2_CONSTANTS[5] = {{ +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x333, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x666, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x33, 0x0, 0x0, 0x100000000000000} +#else +{0x19, 0x0, 0x0, 0x0, 0x300000000000} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x1ccc, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x7} +#elif RADIX == 32 +{0x1ffff999, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x2ffff} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xffffffffffffffcc, 0xffffffffffffffff, 0xffffffffffffffff, 0x3ffffffffffffff} +#else +{0x7ffffffffffe6, 0x7ffffffffffff, 0x7ffffffffffff, 0x7ffffffffffff, 0x1fffffffffff} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1ccc, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x7} +#elif RADIX == 32 +{0x1ffff999, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x2ffff} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xffffffffffffffcc, 0xffffffffffffffff, 0xffffffffffffffff, 0x3ffffffffffffff} +#else +{0x7ffffffffffe6, 0x7ffffffffffff, 0x7ffffffffffff, 0x7ffffffffffff, 0x1fffffffffff} +#endif +#endif +}}; +const precomp_basis_change_matrix_t SPLITTING_TRANSFORMS[10] = {{{{FP2_ONE, FP2_I, FP2_ONE, FP2_I}, {FP2_ONE, FP2_MINUS_I, FP2_MINUS_ONE, FP2_I}, {FP2_ONE, FP2_I, FP2_MINUS_ONE, FP2_MINUS_I}, {FP2_MINUS_ONE, FP2_I, FP2_MINUS_ONE, FP2_I}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_MINUS_ONE, FP2_ZERO, FP2_ZERO}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_MINUS_ONE, FP2_ZERO}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_ONE, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}}}}; +const precomp_basis_change_matrix_t NORMALIZATION_TRANSFORMS[6] = {{{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}}}, {{{FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}}}, {{{FP2_MINUS_ONE, FP2_I, FP2_I, FP2_ONE}, {FP2_I, FP2_MINUS_ONE, FP2_ONE, FP2_I}, {FP2_I, FP2_ONE, FP2_MINUS_ONE, FP2_I}, {FP2_ONE, FP2_I, FP2_I, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_I, FP2_I, FP2_MINUS_ONE}, {FP2_I, FP2_ONE, FP2_MINUS_ONE, FP2_I}, {FP2_I, FP2_MINUS_ONE, FP2_ONE, FP2_I}, {FP2_MINUS_ONE, FP2_I, FP2_I, FP2_ONE}}}}; diff --git a/src/precomp/ref/lvl1/include/e0_basis.h b/src/precomp/ref/lvl1/include/e0_basis.h new file mode 100644 index 0000000..05cafb8 --- /dev/null +++ b/src/precomp/ref/lvl1/include/e0_basis.h @@ -0,0 +1,3 @@ +#include +extern const fp2_t BASIS_E0_PX; +extern const fp2_t BASIS_E0_QX; diff --git a/src/precomp/ref/lvl1/include/ec_params.h b/src/precomp/ref/lvl1/include/ec_params.h index 5b5ed67..e02ac1d 100644 --- a/src/precomp/ref/lvl1/include/ec_params.h +++ b/src/precomp/ref/lvl1/include/ec_params.h @@ -1,52 +1,12 @@ #ifndef EC_PARAMS_H #define EC_PARAMS_H -#include +#include -#define POWER_OF_2 75 -#define POWER_OF_3 36 +#define TORSION_EVEN_POWER 248 -static digit_t TWOpF[NWORDS_ORDER] = {0x0, 0x0800, 0x0, 0x0}; // 2^g -static digit_t TWOpFm1[NWORDS_ORDER] = {0x0, 0x0400, 0x0, 0x0}; // 2^(g-1) -static digit_t THREEpE[NWORDS_ORDER] = {0x0000000017179149, 0x0, 0x0, 0x0}; // 3^e -static digit_t THREEpF[NWORDS_ORDER] = {0x02153E468B91C6D1, 0x0, 0x0, 0x0}; // 3^f -static digit_t THREEpFdiv2[NWORDS_ORDER] = {0x010A9F2345C8E368, 0x0, 0x0, 0x0}; // Floor(3^f/2) +// p+1 divided by the power of 2 +extern const digit_t p_cofactor_for_2f[1]; +#define P_COFACTOR_FOR_2F_BITLENGTH 3 -#define scaled 1 // unscaled (0) or scaled (1) remainder tree approach -#define gap 83 - -#define P_LEN 9 -#define M_LEN 19 - -static digit_t p_plus_minus_bitlength[P_LEN + M_LEN] = - { 2,5,6,7,7,8,9,10,11,3,4,4,6,7,7,7,8,8,8,8,9,9,9,10,11,11,11,11 }; - -static digit_t p_cofactor_for_2f[3] = { 0x86e4a593c926aa29,0x318674d50cb0e80e,0x00069c53c50d72bb }; -#define P_COFACTOR_FOR_2F_BITLENGTH 179 - -static digit_t p_cofactor_for_3g[4] = { 0x0000000000000000,0x74f9dace0d9ec800,0x63a25b437f655001,0x0000000000000019 }; -#define P_COFACTOR_FOR_3G_BITLENGTH 197 - -static digit_t p_cofactor_for_6fg[4] = { 0x002E9F3B59C1B3D9,0x032C744B686FECAA }; -#define P_COFACTOR_FOR_6FG_BITLENGTH 122 - -static int STRATEGY4[36] = { 15, 9, 5, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 4, 2, 1, 1, 1, 2, 1, 1, 7, 4, 2, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, 1}; - -static int sizeI[] = { - 0, 2, 4, 6, 6, 7, 12, 14, 28, 1, 2, 3, 3, 5, 6, 6, 6, 6, 9, 8, 10, 12, 12, 12, 16, 16, 18, 22 -}; -static int sizeJ[] = { - 0, 2, 3, 4, 4, 7, 10, 13, 17, 1, 1, 1, 3, 4, 4, 4, 5, 5, 6, 7, 9, 8, 10, 12, 16, 16, 16, 22 -}; -static int sizeK[] = { - 1, 3, 5, 2, 6, 0, 5, 7, 4, 1, 1, 0, 0, 4, 0, 5, 5, 8, 3, 7, 11, 2, 9, 15, 4, 12, 20, 18 -}; - -#define sI_max 28 -#define sJ_max 22 -#define sK_max 59 - -#define ceil_log_sI_max 5 -#define ceil_log_sJ_max 5 - -#endif \ No newline at end of file +#endif diff --git a/src/precomp/ref/lvl1/include/encoded_sizes.h b/src/precomp/ref/lvl1/include/encoded_sizes.h index 77185a9..02f8642 100644 --- a/src/precomp/ref/lvl1/include/encoded_sizes.h +++ b/src/precomp/ref/lvl1/include/encoded_sizes.h @@ -1,14 +1,11 @@ +#define SECURITY_BITS 128 +#define SQIsign_response_length 126 +#define HASH_ITERATIONS 64 +#define FP_ENCODED_BYTES 32 #define FP2_ENCODED_BYTES 64 #define EC_CURVE_ENCODED_BYTES 64 #define EC_POINT_ENCODED_BYTES 64 #define EC_BASIS_ENCODED_BYTES 192 -#define CHAIN_LENGTH 9 -#define QUAT_ALG_ELEM_ENCODED_BITS 425 -#define QUAT_ALG_ELEM_ENCODED_BYTES 54 -#define ID2ISO_LONG_TWO_ISOG_ENCODED_BYTES 1170 -#define ZIP_CHAIN_LEN 14 -#define ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES 10 -#define ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES 141 -#define SIGNATURE_LEN 177 -#define PUBLICKEY_BYTES 64 -#define SECRETKEY_BYTES 782 +#define PUBLICKEY_BYTES 65 +#define SECRETKEY_BYTES 353 +#define SIGNATURE_BYTES 148 diff --git a/src/precomp/ref/lvl1/include/endomorphism_action.h b/src/precomp/ref/lvl1/include/endomorphism_action.h index f5397aa..1cc782a 100644 --- a/src/precomp/ref/lvl1/include/endomorphism_action.h +++ b/src/precomp/ref/lvl1/include/endomorphism_action.h @@ -1,19 +1,31 @@ -#include +#ifndef ENDOMORPHISM_ACTION_H +#define ENDOMORPHISM_ACTION_H +#include #include #include -extern const ec_basis_t BASIS_EVEN; -extern const ec_basis_t BASIS_ODD_PLUS; -extern const ec_basis_t BASIS_ODD_MINUS; -extern const ec_basis_t BASIS_COMMITMENT_PLUS; -extern const ec_basis_t BASIS_COMMITMENT_MINUS; -extern const ec_basis_t BASIS_CHALLENGE; -extern const ec_curve_t CURVE_E0; -extern const ec_point_t CURVE_E0_A24; -extern const ibz_mat_2x2_t ACTION_I; -extern const ibz_mat_2x2_t ACTION_J; -extern const ibz_mat_2x2_t ACTION_K; -extern const ibz_mat_2x2_t ACTION_GEN2; -extern const ibz_mat_2x2_t ACTION_GEN3; -extern const ibz_mat_2x2_t ACTION_GEN4; -extern const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN; -extern const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO; +/** Type for precomputed endomorphism rings applied to precomputed torsion bases. + * + * Precomputed by the precompute scripts. + * + * @typedef curve_with_endomorphism_ring_t + * + * @struct curve_with_endomorphism_ring + **/ +typedef struct curve_with_endomorphism_ring { + ec_curve_t curve; + ec_basis_t basis_even; + ibz_mat_2x2_t action_i, action_j, action_k; + ibz_mat_2x2_t action_gen2, action_gen3, action_gen4; +} curve_with_endomorphism_ring_t; +#define CURVE_E0 (CURVES_WITH_ENDOMORPHISMS->curve) +#define BASIS_EVEN (CURVES_WITH_ENDOMORPHISMS->basis_even) +#define ACTION_I (CURVES_WITH_ENDOMORPHISMS->action_i) +#define ACTION_J (CURVES_WITH_ENDOMORPHISMS->action_j) +#define ACTION_K (CURVES_WITH_ENDOMORPHISMS->action_k) +#define ACTION_GEN2 (CURVES_WITH_ENDOMORPHISMS->action_gen2) +#define ACTION_GEN3 (CURVES_WITH_ENDOMORPHISMS->action_gen3) +#define ACTION_GEN4 (CURVES_WITH_ENDOMORPHISMS->action_gen4) +#define NUM_ALTERNATE_STARTING_CURVES 6 +#define ALTERNATE_STARTING_CURVES (CURVES_WITH_ENDOMORPHISMS+1) +extern const curve_with_endomorphism_ring_t CURVES_WITH_ENDOMORPHISMS[7]; +#endif diff --git a/src/precomp/ref/lvl1/include/fp_constants.h b/src/precomp/ref/lvl1/include/fp_constants.h index 5eb016a..c770b78 100644 --- a/src/precomp/ref/lvl1/include/fp_constants.h +++ b/src/precomp/ref/lvl1/include/fp_constants.h @@ -1,4 +1,17 @@ +#if RADIX == 32 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +#define NWORDS_FIELD 8 +#else +#define NWORDS_FIELD 9 +#endif +#define NWORDS_ORDER 8 +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) #define NWORDS_FIELD 4 -#define NWORDS_ORDER 4 +#else +#define NWORDS_FIELD 5 +#endif +#define NWORDS_ORDER 4 +#endif #define BITS 256 #define LOG2P 8 diff --git a/src/precomp/ref/lvl1/include/hd_splitting_transforms.h b/src/precomp/ref/lvl1/include/hd_splitting_transforms.h new file mode 100644 index 0000000..b3147a4 --- /dev/null +++ b/src/precomp/ref/lvl1/include/hd_splitting_transforms.h @@ -0,0 +1,18 @@ +#ifndef HD_SPLITTING_H +#define HD_SPLITTING_H + +#include +#include + +typedef struct precomp_basis_change_matrix { + uint8_t m[4][4]; +} precomp_basis_change_matrix_t; + +extern const int EVEN_INDEX[10][2]; +extern const int CHI_EVAL[4][4]; +extern const fp2_t FP2_CONSTANTS[5]; +extern const precomp_basis_change_matrix_t SPLITTING_TRANSFORMS[10]; +extern const precomp_basis_change_matrix_t NORMALIZATION_TRANSFORMS[6]; + +#endif + diff --git a/src/precomp/ref/lvl1/include/klpt_constants.h b/src/precomp/ref/lvl1/include/klpt_constants.h deleted file mode 100644 index fcf1e50..0000000 --- a/src/precomp/ref/lvl1/include/klpt_constants.h +++ /dev/null @@ -1,27 +0,0 @@ -#include -#define KLPT_equiv_bound_coeff 6 -#define KLPT_equiv_num_iter 28561 -#define KLPT_primality_num_iter 32 -#define KLPT_signing_klpt_length 1050 -#define KLPT_signing_num_gamma_trial 64 -#define KLPT_gamma_exponent_interval_size 0 -#define KLPT_gamma_exponent_center_shift 14 -#define KLPT_repres_num_gamma_trial 16384 -#define KLPT_signing_number_strong_approx 3432 -#define KLPT_random_prime_attempts 64 -#define KLPT_secret_key_prime_size 64 -#define KLPT_keygen_length 675 -#define KLPT_keygen_num_gamma_trial 64 -#define KLPT_eichler_smallnorm_bitsize 112 -#define KLPT_keygen_number_strong_approx 2639 -#define KLPT_eichler_number_mu_norm 8 -#define KLPT_eichler_strong_approx_log_margin 2 -#define KLPT_eichler_num_equiv_ideal 26 -#define KLPT_eichler_number_strong_approx 2540 -#define SQISIGN_response_attempts 64 -#define SQISIGN_random_length 0 -#define SQISIGN_signing_total_length 1050 -#define SQISIGN_signing_length 14 -#define SQISIGN_keygen_length 9 -extern const short SMALL_PRIMES_1MOD4[11]; -extern const ibz_t PROD_SMALL_PRIMES_3MOD4; diff --git a/src/precomp/ref/lvl1/include/quaternion_constants.h b/src/precomp/ref/lvl1/include/quaternion_constants.h new file mode 100644 index 0000000..5dca7d7 --- /dev/null +++ b/src/precomp/ref/lvl1/include/quaternion_constants.h @@ -0,0 +1,6 @@ +#include +#define QUAT_primality_num_iter 32 +#define QUAT_repres_bound_input 20 +#define QUAT_equiv_bound_coeff 64 +#define FINDUV_box_size 2 +#define FINDUV_cube_size 624 diff --git a/src/precomp/ref/lvl1/include/quaternion_data.h b/src/precomp/ref/lvl1/include/quaternion_data.h index c3de3e1..a5eb110 100644 --- a/src/precomp/ref/lvl1/include/quaternion_data.h +++ b/src/precomp/ref/lvl1/include/quaternion_data.h @@ -1,7 +1,12 @@ -#include #include -#define NUM_ALTERNATE_EXTREMAL_ORDERS 7 +#define MAXORD_O0 (EXTREMAL_ORDERS->order) +#define STANDARD_EXTREMAL_ORDER (EXTREMAL_ORDERS[0]) +#define NUM_ALTERNATE_EXTREMAL_ORDERS 6 +#define ALTERNATE_EXTREMAL_ORDERS (EXTREMAL_ORDERS+1) +#define ALTERNATE_CONNECTING_IDEALS (CONNECTING_IDEALS+1) +#define ALTERNATE_CONJUGATING_ELEMENTS (CONJUGATING_ELEMENTS+1) +extern const ibz_t QUAT_prime_cofactor; extern const quat_alg_t QUATALG_PINFTY; -extern const quat_order_t MAXORD_O0; -extern const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER; -extern const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7]; +extern const quat_p_extremal_maximal_order_t EXTREMAL_ORDERS[7]; +extern const quat_left_ideal_t CONNECTING_IDEALS[7]; +extern const quat_alg_elem_t CONJUGATING_ELEMENTS[7]; diff --git a/src/precomp/ref/lvl1/include/torsion_constants.h b/src/precomp/ref/lvl1/include/torsion_constants.h index 98b30b3..2756a27 100644 --- a/src/precomp/ref/lvl1/include/torsion_constants.h +++ b/src/precomp/ref/lvl1/include/torsion_constants.h @@ -1,24 +1,6 @@ -#include -#define TORSION_2POWER_BYTES 10 -#define TORSION_3POWER_BYTES 8 -#define TORSION_23POWER_BYTES 17 -extern const uint64_t TORSION_PLUS_EVEN_POWER; -extern const uint64_t TORSION_ODD_PRIMES[28]; -extern const uint64_t TORSION_ODD_POWERS[28]; -extern const uint64_t TORSION_PLUS_ODD_PRIMES[9]; -extern const size_t TORSION_PLUS_ODD_POWERS[9]; -extern const uint64_t TORSION_MINUS_ODD_PRIMES[19]; -extern const size_t TORSION_MINUS_ODD_POWERS[19]; -extern const size_t DEGREE_COMMITMENT_POWERS[28]; -extern const ibz_t CHARACTERISTIC; -extern const ibz_t TORSION_ODD; -extern const ibz_t TORSION_ODD_PRIMEPOWERS[28]; -extern const ibz_t TORSION_ODD_PLUS; -extern const ibz_t TORSION_ODD_MINUS; +#include +#define TORSION_2POWER_BYTES 32 +extern const ibz_t TWO_TO_SECURITY_BITS; extern const ibz_t TORSION_PLUS_2POWER; -extern const ibz_t TORSION_PLUS_3POWER; -extern const ibz_t TORSION_PLUS_23POWER; -extern const ibz_t DEGREE_COMMITMENT; -extern const ibz_t DEGREE_COMMITMENT_PLUS; -extern const ibz_t DEGREE_COMMITMENT_MINUS; -extern const ibz_t DEGREE_CHALLENGE; +extern const ibz_t SEC_DEGREE; +extern const ibz_t COM_DEGREE; diff --git a/src/precomp/ref/lvl1/klpt_constants.c b/src/precomp/ref/lvl1/klpt_constants.c deleted file mode 100644 index 3358164..0000000 --- a/src/precomp/ref/lvl1/klpt_constants.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include -#if 0 -#elif 8*DIGIT_LEN == 16 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x173b,0x80bd,0xa9d7,0xa185}}}; -#elif 8*DIGIT_LEN == 32 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x80bd173b,0xa185a9d7}}}; -#elif 8*DIGIT_LEN == 64 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xa185a9d780bd173b}}}; -#endif diff --git a/src/precomp/ref/lvl1/quaternion_data.c b/src/precomp/ref/lvl1/quaternion_data.c index 0894028..baf3da0 100644 --- a/src/precomp/ref/lvl1/quaternion_data.c +++ b/src/precomp/ref/lvl1/quaternion_data.c @@ -1,20 +1,3176 @@ #include #include #include +const ibz_t QUAT_prime_cofactor = #if 0 -#elif 8*DIGIT_LEN == 16 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0x47ff,0x3551,0x9e49,0x252c,0x7437,0x8740,0xa865,0x33a6,0xd98c,0x6b95,0x9e28,0x34e2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0x47ff,0x3551,0x9e49,0x252c,0x7437,0x8740,0xa865,0x33a6,0xd98c,0x6b95,0x9e28,0x34e2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0x47ff,0x3551,0x9e49,0x252c,0x7437,0x8740,0xa865,0x33a6,0xd98c,0x6b95,0x9e28,0x34e2}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf508,0x9173,0xfad5,0xf531,0xa571,0xc66d,0x411,0x86fc}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf508,0x9173,0xfad5,0xf531,0xa571,0xc66d,0x411,0x86fc}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfa84,0xc8b9,0xfd6a,0xfa98,0xd2b8,0xe336,0x208,0x437e}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfa84,0xc8b9,0xfd6a,0xfa98,0xd2b8,0xe336,0x208,0x437e}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2820,0x8fdc,0xf7b4,0x7a9e,0xa5b,0xd77d,0xbc5f,0x3efd,0xf98b,0xf3a,0x3056,0x334a,0x40,0x4f65,0x662d,0x2396}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1410,0x47ee,0x7bda,0xbd4f,0x852d,0xebbe,0xde2f,0x9f7e,0x7cc5,0x79d,0x182b,0x19a5,0x8020,0xa7b2,0x3316,0x11cb}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9a27,0x95c,0xc884,0x91ff,0xef4b,0xc1ca,0xfabb,0x33b8,0xf98b,0xf3a,0x3056,0x334a,0x40,0x4f65,0x662d,0x2396}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfa84,0xc8b9,0xfd6a,0xfa98,0xd2b8,0xe336,0x208,0x437e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf508,0x9173,0xfad5,0xf531,0xa571,0xc66d,0x411,0x86fc}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x1bf2,0xcff,0x5e61,0xd13e,0x361f,0x2b64,0x8348,0x1689}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf38c,0x430,0x268d,0xa0fd,0x3891,0xcb70,0xeebe,0x3738}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf38c,0x430,0x268d,0xa0fd,0x3891,0xcb70,0xeebe,0x3738}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79c6,0x8218,0x9346,0xd07e,0x1c48,0x65b8,0x775f,0x1b9c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8a48,0x4e19,0xb498,0x4481,0x645a,0x6523,0xf47f,0xebd5,0x568c,0xd118,0x8fdd,0x4c28,0x44ef,0xa6c5,0xc19f,0x5f4}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe677,0x2da9,0x96e8,0xe7c7,0xfb55,0xa06f,0x1078,0xa192}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x79c6,0x8218,0x9346,0xd07e,0x1c48,0x65b8,0x775f,0x1b9c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf38c,0x430,0x268d,0xa0fd,0x3891,0xcb70,0xeebe,0x3738}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe677,0x2da9,0x96e8,0xe7c7,0xfb55,0xa06f,0x1078,0xa192}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2d2,0xe639,0x8fd6,0x201e,0x74ca,0xa699,0x7a91,0x3c02}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2d2,0xe639,0x8fd6,0x201e,0x74ca,0xa699,0x7a91,0x3c02}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8169,0x731c,0x47eb,0x100f,0xba65,0xd34c,0x3d48,0x1e01}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfa22,0xccc5,0xe86d,0x485c,0x6189,0x3a24,0xf08a,0x534d,0xf56d,0xb7c3,0x9377,0x7de4,0xd766,0x3586,0x94bd,0x708}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfd11,0xe662,0x7436,0xa42e,0x30c4,0x1d12,0xf845,0xa9a6,0xfab6,0xdbe1,0x49bb,0x3ef2,0x6bb3,0x9ac3,0x4a5e,0x384}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4a50,0xb78f,0x9382,0x4472,0xe7e4,0xd139,0xb64d,0x1794,0xf56d,0xb7c3,0x9377,0x7de4,0xd766,0x3586,0x94bd,0x708}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8169,0x731c,0x47eb,0x100f,0xba65,0xd34c,0x3d48,0x1e01}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2d2,0xe639,0x8fd6,0x201e,0x74ca,0xa699,0x7a91,0x3c02}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x5fa4,0x2a6d,0xa9d6,0x7d4,0xf34a,0xd1d4,0x7478,0x7772}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x13}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb00,0x5f26,0xd2c4,0x9c87,0xbe9e,0xebb0,0x6685,0x30af}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb00,0x5f26,0xd2c4,0x9c87,0xbe9e,0xebb0,0x6685,0x30af}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x580,0x2f93,0xe962,0x4e43,0x5f4f,0xf5d8,0xb342,0x1857}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x580,0x2f93,0xe962,0x4e43,0x5f4f,0xf5d8,0xb342,0x1857}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8000,0xa23c,0xce8,0xecd5,0x8721,0x2bf1,0xc989,0xe09b,0x202a,0x4453,0xaf22,0xd70b,0xc07f,0xc644,0x1f4f,0x4a1}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4000,0x511e,0x8674,0xf66a,0xc390,0x95f8,0xe4c4,0x704d,0x9015,0x2229,0xd791,0xeb85,0x603f,0xe322,0x8fa7,0x250}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9fff,0x7f60,0xf4db,0xdf95,0xdc35,0x6681,0x43d0,0xd71b,0x202a,0x4453,0xaf22,0xd70b,0xc07f,0xc644,0x1f4f,0x4a1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x580,0x2f93,0xe962,0x4e43,0x5f4f,0xf5d8,0xb342,0x1857}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb00,0x5f26,0xd2c4,0x9c87,0xbe9e,0xebb0,0x6685,0x30af}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xc002,0x45b7,0x301a,0x1a7e,0x55d8,0x8adf,0xb71,0x1301}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x17}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd48,0x934e,0xa756,0x46b3,0xb5a0,0xfcd8,0x6d15,0x3c16}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd48,0x934e,0xa756,0x46b3,0xb5a0,0xfcd8,0x6d15,0x3c16}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6a4,0x49a7,0xd3ab,0x2359,0x5ad0,0xfe6c,0x368a,0x1e0b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3220,0x6448,0xcbb6,0x8a9b,0x94f0,0xb96d,0x8e3,0xfea8,0xf1b,0x3c36,0x16c,0x2c52,0x62cb,0x9e64,0x428c,0x70d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x167f,0x8798,0xcb5d,0xabbe,0x4d9,0x4e90,0xf28c,0xd0b7,0xf1a,0x3c36,0x16c,0x2c52,0x62cb,0x9e64,0x428c,0x70d}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6a4,0x49a7,0xd3ab,0x2359,0x5ad0,0xfe6c,0x368a,0x1e0b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd48,0x934e,0xa756,0x46b3,0xb5a0,0xfcd8,0x6d15,0x3c16}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0x1ba1,0xdcb0,0x58,0xdedd,0x9016,0x6add,0x1657,0x2df0,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1d}, {{{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x5bbe,0x15d7,0x57f9,0x4168,0xa74e,0xc5bc,0xa151,0x546e,0x12}}}, {{{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x5bbe,0x15d7,0x57f9,0x4168,0xa74e,0xc5bc,0xa151,0x546e,0x12}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xaddf,0x8aeb,0x2bfc,0x20b4,0x53a7,0xe2de,0x50a8,0x2a37,0x9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x5082,0x3302,0x52ea,0x72c4,0x1346,0xc4d9,0xa79c,0x6dbe,0xe980,0xaf26,0xa05e,0x2cb3,0x9be1,0x401c,0xbc96,0xfdb3,0xa7}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x458f,0x2b52,0x290a,0x2bf3,0x5bd4,0x1e47,0x68e5,0xd1e8,0xfc86,0xface,0x7a4d,0xc6d6,0xaabc,0x37d3,0xc371,0xb301,0x40}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xaddf,0x8aeb,0x2bfc,0x20b4,0x53a7,0xe2de,0x50a8,0x2a37,0x9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x5bbe,0x15d7,0x57f9,0x4168,0xa74e,0xc5bc,0xa151,0x546e,0x12}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0x49ba,0xb00c,0x43bb,0xdadd,0xcbf9,0xaceb,0x528d,0xeae9,0x58}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x94}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x25}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc6aa,0xc7ce,0xf488,0x73ee,0x2bc9,0xe445,0x2ef7,0xae5e}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc6aa,0xc7ce,0xf488,0x73ee,0x2bc9,0xe445,0x2ef7,0xae5e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6355,0x63e7,0x7a44,0xb9f7,0x95e4,0xf222,0x177b,0x572f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb472,0x4fe1,0x2240,0x9939,0xb1f0,0xce40,0x7e04,0xed63,0x23c2,0x49d2,0x127e,0x9326,0xd832,0xc07b,0x153f,0x3b62}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6f69,0xb851,0xe08a,0xb75a,0x497c,0x1ca3,0x7b44,0x874d,0x5659,0xee23,0xcb8e,0x9bf7,0x671f,0xd84d,0x4d47,0x251d}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6355,0x63e7,0x7a44,0xb9f7,0x95e4,0xf222,0x177b,0x572f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc6aa,0xc7ce,0xf488,0x73ee,0x2bc9,0xe445,0x2ef7,0xae5e}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xaf2,0xccdd,0xa6eb,0x4346,0x2dcd,0x2229,0x9bf7,0x6885,0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x29}}; -#elif 8*DIGIT_LEN == 32 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0x355147ff,0x252c9e49,0x87407437,0x33a6a865,0x6b95d98c,0x34e29e28}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0x355147ff,0x252c9e49,0x87407437,0x33a6a865,0x6b95d98c,0x34e29e28}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0x355147ff,0x252c9e49,0x87407437,0x33a6a865,0x6b95d98c,0x34e29e28}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9173f508,0xf531fad5,0xc66da571,0x86fc0411}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9173f508,0xf531fad5,0xc66da571,0x86fc0411}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc8b9fa84,0xfa98fd6a,0xe336d2b8,0x437e0208}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc8b9fa84,0xfa98fd6a,0xe336d2b8,0x437e0208}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8fdc2820,0x7a9ef7b4,0xd77d0a5b,0x3efdbc5f,0xf3af98b,0x334a3056,0x4f650040,0x2396662d}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x47ee1410,0xbd4f7bda,0xebbe852d,0x9f7ede2f,0x79d7cc5,0x19a5182b,0xa7b28020,0x11cb3316}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x95c9a27,0x91ffc884,0xc1caef4b,0x33b8fabb,0xf3af98b,0x334a3056,0x4f650040,0x2396662d}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc8b9fa84,0xfa98fd6a,0xe336d2b8,0x437e0208}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9173f508,0xf531fad5,0xc66da571,0x86fc0411}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xcff1bf2,0xd13e5e61,0x2b64361f,0x16898348}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x430f38c,0xa0fd268d,0xcb703891,0x3738eebe}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x430f38c,0xa0fd268d,0xcb703891,0x3738eebe}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x821879c6,0xd07e9346,0x65b81c48,0x1b9c775f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4e198a48,0x4481b498,0x6523645a,0xebd5f47f,0xd118568c,0x4c288fdd,0xa6c544ef,0x5f4c19f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2da9e677,0xe7c796e8,0xa06ffb55,0xa1921078}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x821879c6,0xd07e9346,0x65b81c48,0x1b9c775f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x430f38c,0xa0fd268d,0xcb703891,0x3738eebe}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2da9e677,0xe7c796e8,0xa06ffb55,0xa1921078}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe63902d2,0x201e8fd6,0xa69974ca,0x3c027a91}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe63902d2,0x201e8fd6,0xa69974ca,0x3c027a91}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x731c8169,0x100f47eb,0xd34cba65,0x1e013d48}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xccc5fa22,0x485ce86d,0x3a246189,0x534df08a,0xb7c3f56d,0x7de49377,0x3586d766,0x70894bd}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe662fd11,0xa42e7436,0x1d1230c4,0xa9a6f845,0xdbe1fab6,0x3ef249bb,0x9ac36bb3,0x3844a5e}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb78f4a50,0x44729382,0xd139e7e4,0x1794b64d,0xb7c3f56d,0x7de49377,0x3586d766,0x70894bd}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x731c8169,0x100f47eb,0xd34cba65,0x1e013d48}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe63902d2,0x201e8fd6,0xa69974ca,0x3c027a91}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x2a6d5fa4,0x7d4a9d6,0xd1d4f34a,0x77727478}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x13}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5f260b00,0x9c87d2c4,0xebb0be9e,0x30af6685}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5f260b00,0x9c87d2c4,0xebb0be9e,0x30af6685}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2f930580,0x4e43e962,0xf5d85f4f,0x1857b342}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2f930580,0x4e43e962,0xf5d85f4f,0x1857b342}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa23c8000,0xecd50ce8,0x2bf18721,0xe09bc989,0x4453202a,0xd70baf22,0xc644c07f,0x4a11f4f}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x511e4000,0xf66a8674,0x95f8c390,0x704de4c4,0x22299015,0xeb85d791,0xe322603f,0x2508fa7}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7f609fff,0xdf95f4db,0x6681dc35,0xd71b43d0,0x4453202a,0xd70baf22,0xc644c07f,0x4a11f4f}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2f930580,0x4e43e962,0xf5d85f4f,0x1857b342}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5f260b00,0x9c87d2c4,0xebb0be9e,0x30af6685}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x45b7c002,0x1a7e301a,0x8adf55d8,0x13010b71}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x17}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x934e0d48,0x46b3a756,0xfcd8b5a0,0x3c166d15}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x934e0d48,0x46b3a756,0xfcd8b5a0,0x3c166d15}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x49a706a4,0x2359d3ab,0xfe6c5ad0,0x1e0b368a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x64483220,0x8a9bcbb6,0xb96d94f0,0xfea808e3,0x3c360f1b,0x2c52016c,0x9e6462cb,0x70d428c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8798167f,0xabbecb5d,0x4e9004d9,0xd0b7f28c,0x3c360f1a,0x2c52016c,0x9e6462cb,0x70d428c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x49a706a4,0x2359d3ab,0xfe6c5ad0,0x1e0b368a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x934e0d48,0x46b3a756,0xfcd8b5a0,0x3c166d15}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0xdcb01ba1,0xdedd0058,0x6add9016,0x2df01657,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1d}, {{{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x15d75bbe,0x416857f9,0xc5bca74e,0x546ea151,0x12}}}, {{{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x15d75bbe,0x416857f9,0xc5bca74e,0x546ea151,0x12}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x8aebaddf,0x20b42bfc,0xe2de53a7,0x2a3750a8,0x9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x33025082,0x72c452ea,0xc4d91346,0x6dbea79c,0xaf26e980,0x2cb3a05e,0x401c9be1,0xfdb3bc96,0xa7}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x2b52458f,0x2bf3290a,0x1e475bd4,0xd1e868e5,0xfacefc86,0xc6d67a4d,0x37d3aabc,0xb301c371,0x40}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x8aebaddf,0x20b42bfc,0xe2de53a7,0x2a3750a8,0x9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x15d75bbe,0x416857f9,0xc5bca74e,0x546ea151,0x12}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0xb00c49ba,0xdadd43bb,0xacebcbf9,0xeae9528d,0x58}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x94}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x25}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc7cec6aa,0x73eef488,0xe4452bc9,0xae5e2ef7}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc7cec6aa,0x73eef488,0xe4452bc9,0xae5e2ef7}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x63e76355,0xb9f77a44,0xf22295e4,0x572f177b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4fe1b472,0x99392240,0xce40b1f0,0xed637e04,0x49d223c2,0x9326127e,0xc07bd832,0x3b62153f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb8516f69,0xb75ae08a,0x1ca3497c,0x874d7b44,0xee235659,0x9bf7cb8e,0xd84d671f,0x251d4d47}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x63e76355,0xb9f77a44,0xf22295e4,0x572f177b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc7cec6aa,0x73eef488,0xe4452bc9,0xae5e2ef7}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xccdd0af2,0x4346a6eb,0x22292dcd,0x68859bf7,0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x29}}; -#elif 8*DIGIT_LEN == 64 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x252c9e49355147ff,0x33a6a86587407437,0x34e29e286b95d98c}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x252c9e49355147ff,0x33a6a86587407437,0x34e29e286b95d98c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x252c9e49355147ff,0x33a6a86587407437,0x34e29e286b95d98c}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xf531fad59173f508,0x86fc0411c66da571}}}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xf531fad59173f508,0x86fc0411c66da571}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xfa98fd6ac8b9fa84,0x437e0208e336d2b8}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xfa98fd6ac8b9fa84,0x437e0208e336d2b8}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7a9ef7b48fdc2820,0x3efdbc5fd77d0a5b,0x334a30560f3af98b,0x2396662d4f650040}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbd4f7bda47ee1410,0x9f7ede2febbe852d,0x19a5182b079d7cc5,0x11cb3316a7b28020}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x91ffc884095c9a27,0x33b8fabbc1caef4b,0x334a30560f3af98b,0x2396662d4f650040}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xfa98fd6ac8b9fa84,0x437e0208e336d2b8}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xf531fad59173f508,0x86fc0411c66da571}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xd13e5e610cff1bf2,0x168983482b64361f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xa0fd268d0430f38c,0x3738eebecb703891}}}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xa0fd268d0430f38c,0x3738eebecb703891}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd07e9346821879c6,0x1b9c775f65b81c48}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4481b4984e198a48,0xebd5f47f6523645a,0x4c288fddd118568c,0x5f4c19fa6c544ef}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xe7c796e82da9e677,0xa1921078a06ffb55}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd07e9346821879c6,0x1b9c775f65b81c48}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xa0fd268d0430f38c,0x3738eebecb703891}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xe7c796e82da9e677,0xa1921078a06ffb55}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x201e8fd6e63902d2,0x3c027a91a69974ca}}}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x201e8fd6e63902d2,0x3c027a91a69974ca}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x100f47eb731c8169,0x1e013d48d34cba65}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x485ce86dccc5fa22,0x534df08a3a246189,0x7de49377b7c3f56d,0x70894bd3586d766}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa42e7436e662fd11,0xa9a6f8451d1230c4,0x3ef249bbdbe1fab6,0x3844a5e9ac36bb3}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x44729382b78f4a50,0x1794b64dd139e7e4,0x7de49377b7c3f56d,0x70894bd3586d766}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x100f47eb731c8169,0x1e013d48d34cba65}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x201e8fd6e63902d2,0x3c027a91a69974ca}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0x7d4a9d62a6d5fa4,0x77727478d1d4f34a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x13}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x9c87d2c45f260b00,0x30af6685ebb0be9e}}}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x9c87d2c45f260b00,0x30af6685ebb0be9e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x4e43e9622f930580,0x1857b342f5d85f4f}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x4e43e9622f930580,0x1857b342f5d85f4f}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xecd50ce8a23c8000,0xe09bc9892bf18721,0xd70baf224453202a,0x4a11f4fc644c07f}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf66a8674511e4000,0x704de4c495f8c390,0xeb85d79122299015,0x2508fa7e322603f}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdf95f4db7f609fff,0xd71b43d06681dc35,0xd70baf224453202a,0x4a11f4fc644c07f}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x4e43e9622f930580,0x1857b342f5d85f4f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x9c87d2c45f260b00,0x30af6685ebb0be9e}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0x1a7e301a45b7c002,0x13010b718adf55d8}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x17}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x46b3a756934e0d48,0x3c166d15fcd8b5a0}}}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x46b3a756934e0d48,0x3c166d15fcd8b5a0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2359d3ab49a706a4,0x1e0b368afe6c5ad0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8a9bcbb664483220,0xfea808e3b96d94f0,0x2c52016c3c360f1b,0x70d428c9e6462cb}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xabbecb5d8798167f,0xd0b7f28c4e9004d9,0x2c52016c3c360f1a,0x70d428c9e6462cb}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2359d3ab49a706a4,0x1e0b368afe6c5ad0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x46b3a756934e0d48,0x3c166d15fcd8b5a0}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xdedd0058dcb01ba1,0x2df016576add9016,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1d}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x416857f915d75bbe,0x546ea151c5bca74e,0x12}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x416857f915d75bbe,0x546ea151c5bca74e,0x12}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x20b42bfc8aebaddf,0x2a3750a8e2de53a7,0x9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x72c452ea33025082,0x6dbea79cc4d91346,0x2cb3a05eaf26e980,0xfdb3bc96401c9be1,0xa7}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2bf3290a2b52458f,0xd1e868e51e475bd4,0xc6d67a4dfacefc86,0xb301c37137d3aabc,0x40}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x20b42bfc8aebaddf,0x2a3750a8e2de53a7,0x9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x416857f915d75bbe,0x546ea151c5bca74e,0x12}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xdadd43bbb00c49ba,0xeae9528dacebcbf9,0x58}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x94}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x25}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x73eef488c7cec6aa,0xae5e2ef7e4452bc9}}}, {{{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x73eef488c7cec6aa,0xae5e2ef7e4452bc9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xb9f77a4463e76355,0x572f177bf22295e4}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x993922404fe1b472,0xed637e04ce40b1f0,0x9326127e49d223c2,0x3b62153fc07bd832}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb75ae08ab8516f69,0x874d7b441ca3497c,0x9bf7cb8eee235659,0x251d4d47d84d671f}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xb9f77a4463e76355,0x572f177bf22295e4}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x73eef488c7cec6aa,0xae5e2ef7e4452bc9}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x4346a6ebccdd0af2,0x68859bf722292dcd,0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x29}}; +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x41,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x41,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x41,0x0,0x0,0x800000000000000}}} #endif +; +const quat_alg_t QUATALG_PINFTY = { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x4ff}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x4ffffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0x4ffffffffffffff}}} +#endif +}; +const quat_p_extremal_maximal_order_t EXTREMAL_ORDERS[7] = {{{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 1}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x10000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x1000000000000000}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x10000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x1000000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x8000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x800000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x80000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x8000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x800000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x10000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x1000000000000000}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 5}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x78d4,0x7b85,0x7a64,0xf5f2,0x29b9,0x3696,0x6101,0xb874}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7b8578d4,0xf5f27a64,0x369629b9,0xb8746101}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xf5f27a647b8578d4,0xb8746101369629b9}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x78d4,0x7b85,0x7a64,0xf5f2,0x29b9,0x3696,0x6101,0xb874}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7b8578d4,0xf5f27a64,0x369629b9,0xb8746101}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xf5f27a647b8578d4,0xb8746101369629b9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbc6a,0x3dc2,0x3d32,0xfaf9,0x14dc,0x9b4b,0x3080,0x5c3a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3dc2bc6a,0xfaf93d32,0x9b4b14dc,0x5c3a3080}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xfaf93d323dc2bc6a,0x5c3a30809b4b14dc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x7d47,0x6fa4,0x2ad5,0x95ad,0x8a4b,0x49be,0x77e7,0xc898,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x6fa47d47,0x95ad2ad5,0x49be8a4b,0xc89877e7,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x95ad2ad56fa47d47,0xc89877e749be8a4b,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3f47,0x7060,0x5e29,0x3e35,0xd950,0x2a1b,0x10ae,0x78dd,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x280}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x70603f47,0x3e355e29,0x2a1bd950,0x78dd10ae,0x0,0x0,0x0,0x2800000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3e355e2970603f47,0x78dd10ae2a1bd950,0x0,0x280000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbc6a,0x3dc2,0x3d32,0xfaf9,0x14dc,0x9b4b,0x3080,0x5c3a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3dc2bc6a,0xfaf93d32,0x9b4b14dc,0x5c3a3080}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xfaf93d323dc2bc6a,0x5c3a30809b4b14dc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x3fe7,0x28ee,0x26e8,0xb194,0x6d7a,0xaf58,0xe568,0xd6d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x28ee3fe7,0xb19426e8,0xaf586d7a,0xd6de568}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xb19426e828ee3fe7,0xd6de568af586d7a}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x78d4,0x7b85,0x7a64,0xf5f2,0x29b9,0x3696,0x6101,0xb874}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7b8578d4,0xf5f27a64,0x369629b9,0xb8746101}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xf5f27a647b8578d4,0xb8746101369629b9}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x7d47,0x6fa4,0x2ad5,0x95ad,0x8a4b,0x49be,0x77e7,0xc898,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x6fa47d47,0x95ad2ad5,0x49be8a4b,0xc89877e7,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x95ad2ad56fa47d47,0xc89877e749be8a4b,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 17}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe5e2,0x7715,0xa8e6,0x3c6f,0x9078,0x872b,0x9bec,0x1794}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7715e5e2,0x3c6fa8e6,0x872b9078,0x17949bec}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x3c6fa8e67715e5e2,0x17949bec872b9078}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe5e2,0x7715,0xa8e6,0x3c6f,0x9078,0x872b,0x9bec,0x1794}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7715e5e2,0x3c6fa8e6,0x872b9078,0x17949bec}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x3c6fa8e67715e5e2,0x17949bec872b9078}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf2f1,0x3b8a,0xd473,0x1e37,0xc83c,0x4395,0x4df6,0xbca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3b8af2f1,0x1e37d473,0x4395c83c,0xbca4df6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1e37d4733b8af2f1,0xbca4df64395c83c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x307a,0x74c8,0x8082,0xb034,0x4e8a,0xc43a,0x399a,0x9ab}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x74c8307a,0xb0348082,0xc43a4e8a,0x9ab399a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xb034808274c8307a,0x9ab399ac43a4e8a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x954f,0x6bc9,0xca46,0x3d25,0x431b,0x46ed,0x8229,0x4f5,0xe453,0x6eb3,0x4530,0xeb3e,0x5306,0xb3e4,0x306e,0x45}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6bc9954f,0x3d25ca46,0x46ed431b,0x4f58229,0x6eb3e453,0xeb3e4530,0xb3e45306,0x45306e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3d25ca466bc9954f,0x4f5822946ed431b,0xeb3e45306eb3e453,0x45306eb3e45306}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf2f1,0x3b8a,0xd473,0x1e37,0xc83c,0x4395,0x4df6,0xbca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3b8af2f1,0x1e37d473,0x4395c83c,0xbca4df6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1e37d4733b8af2f1,0xbca4df64395c83c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe7f,0xca3a,0x2454,0xbd31,0xe562,0xcb4c,0x72f0,0x21}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xca3a0e7f,0xbd312454,0xcb4ce562,0x2172f0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xbd312454ca3a0e7f,0x2172f0cb4ce562}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe5e2,0x7715,0xa8e6,0x3c6f,0x9078,0x872b,0x9bec,0x1794}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7715e5e2,0x3c6fa8e6,0x872b9078,0x17949bec}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x3c6fa8e67715e5e2,0x17949bec872b9078}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x307a,0x74c8,0x8082,0xb034,0x4e8a,0xc43a,0x399a,0x9ab}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x74c8307a,0xb0348082,0xc43a4e8a,0x9ab399a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xb034808274c8307a,0x9ab399ac43a4e8a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 37}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xafa2,0x6dee,0xc511,0xde33,0xc8ce,0xc89e,0x4f97,0x2df9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6deeafa2,0xde33c511,0xc89ec8ce,0x2df94f97}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xde33c5116deeafa2,0x2df94f97c89ec8ce}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xafa2,0x6dee,0xc511,0xde33,0xc8ce,0xc89e,0x4f97,0x2df9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6deeafa2,0xde33c511,0xc89ec8ce,0x2df94f97}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xde33c5116deeafa2,0x2df94f97c89ec8ce}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x57d1,0xb6f7,0xe288,0x6f19,0x6467,0xe44f,0xa7cb,0x16fc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb6f757d1,0x6f19e288,0xe44f6467,0x16fca7cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x6f19e288b6f757d1,0x16fca7cbe44f6467}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdd36,0xda6b,0xa943,0xd17a,0xe307,0x564c,0x4b0c,0x44d4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xda6bdd36,0xd17aa943,0x564ce307,0x44d44b0c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd17aa943da6bdd36,0x44d44b0c564ce307}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x3a03,0xc406,0x47c,0xa0a2,0x6dbc,0x1df4,0x796,0x6cee,0xce0c,0xe0c7,0xc7c,0xc7ce,0x7ce0,0xce0c,0xe0c7,0x7c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xc4063a03,0xa0a2047c,0x1df46dbc,0x6cee0796,0xe0c7ce0c,0xc7ce0c7c,0xce0c7ce0,0x7ce0c7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xa0a2047cc4063a03,0x6cee07961df46dbc,0xc7ce0c7ce0c7ce0c,0x7ce0c7ce0c7ce0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x57d1,0xb6f7,0xe288,0x6f19,0x6467,0xe44f,0xa7cb,0x16fc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb6f757d1,0x6f19e288,0xe44f6467,0x16fca7cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x6f19e288b6f757d1,0x16fca7cbe44f6467}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x188f,0xa1e2,0x2148,0xd9f8,0x2e79,0x1a07,0xe1b2,0xd6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xa1e2188f,0xd9f82148,0x1a072e79,0xd6e1b2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xd9f82148a1e2188f,0xd6e1b21a072e79}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xafa2,0x6dee,0xc511,0xde33,0xc8ce,0xc89e,0x4f97,0x2df9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6deeafa2,0xde33c511,0xc89ec8ce,0x2df94f97}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xde33c5116deeafa2,0x2df94f97c89ec8ce}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdd36,0xda6b,0xa943,0xd17a,0xe307,0x564c,0x4b0c,0x44d4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xda6bdd36,0xd17aa943,0x564ce307,0x44d44b0c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd17aa943da6bdd36,0x44d44b0c564ce307}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 41}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x96a4,0x25b,0x14f2,0x3800,0x4e7c,0x7958,0xab7f,0x7bbe,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x25b96a4,0x380014f2,0x79584e7c,0x7bbeab7f,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x380014f2025b96a4,0x7bbeab7f79584e7c,0x1}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x96a4,0x25b,0x14f2,0x3800,0x4e7c,0x7958,0xab7f,0x7bbe,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x25b96a4,0x380014f2,0x79584e7c,0x7bbeab7f,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x380014f2025b96a4,0x7bbeab7f79584e7c,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcb52,0x12d,0xa79,0x1c00,0x273e,0xbcac,0x55bf,0xbddf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x12dcb52,0x1c000a79,0xbcac273e,0xbddf55bf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1c000a79012dcb52,0xbddf55bfbcac273e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0x73e3,0x3339,0x19e7,0x4ba1,0x6ebc,0x2702,0xee62,0xdbd0,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0x333973e3,0x4ba119e7,0x27026ebc,0xdbd0ee62,0x7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x4ba119e7333973e3,0xdbd0ee6227026ebc,0x7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xca33,0x3dd0,0x1d92,0x9f0,0x2f81,0xafe9,0xe395,0x83f7,0xfffc,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x27f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3dd0ca33,0x9f01d92,0xafe92f81,0x83f7e395,0xfffffffc,0xffffffff,0xffffffff,0x27fffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9f01d923dd0ca33,0x83f7e395afe92f81,0xfffffffffffffffc,0x27fffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcb52,0x12d,0xa79,0x1c00,0x273e,0xbcac,0x55bf,0xbddf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x12dcb52,0x1c000a79,0xbcac273e,0xbddf55bf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1c000a79012dcb52,0xbddf55bfbcac273e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xeb73,0xf93c,0x71c0,0x87f5,0x667a,0xcb3c,0xb9cb,0x12fa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf93ceb73,0x87f571c0,0xcb3c667a,0x12fab9cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x87f571c0f93ceb73,0x12fab9cbcb3c667a}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x96a4,0x25b,0x14f2,0x3800,0x4e7c,0x7958,0xab7f,0x7bbe,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x25b96a4,0x380014f2,0x79584e7c,0x7bbeab7f,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x380014f2025b96a4,0x7bbeab7f79584e7c,0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0x73e3,0x3339,0x19e7,0x4ba1,0x6ebc,0x2702,0xee62,0xdbd0,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0x333973e3,0x4ba119e7,0x27026ebc,0xdbd0ee62,0x7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x4ba119e7333973e3,0xdbd0ee6227026ebc,0x7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 53}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x7ffa,0x55af,0x7b9e,0xe2b9,0xa7af,0x578c,0xf76b,0xc227,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x55af7ffa,0xe2b97b9e,0x578ca7af,0xc227f76b,0xf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe2b97b9e55af7ffa,0xc227f76b578ca7af,0xf}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x7ffa,0x55af,0x7b9e,0xe2b9,0xa7af,0x578c,0xf76b,0xc227,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x55af7ffa,0xe2b97b9e,0x578ca7af,0xc227f76b,0xf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe2b97b9e55af7ffa,0xc227f76b578ca7af,0xf}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xbffd,0x2ad7,0xbdcf,0xf15c,0x53d7,0xabc6,0xfbb5,0xe113,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2ad7bffd,0xf15cbdcf,0xabc653d7,0xe113fbb5,0x7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xf15cbdcf2ad7bffd,0xe113fbb5abc653d7,0x7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0xd16,0xf02b,0x1ce7,0xa2ef,0x54b,0x2c56,0x5963,0x667,0x6f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0xf02b0d16,0xa2ef1ce7,0x2c56054b,0x6675963,0x6f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xa2ef1ce7f02b0d16,0x66759632c56054b,0x6f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf0ab,0x9d3b,0x6ea,0x84ac,0x62e5,0xdde9,0x882b,0xd021,0xffe2,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x13ff}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9d3bf0ab,0x84ac06ea,0xdde962e5,0xd021882b,0xffffffe2,0xffffffff,0xffffffff,0x13ffffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x84ac06ea9d3bf0ab,0xd021882bdde962e5,0xffffffffffffffe2,0x13ffffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xbffd,0x2ad7,0xbdcf,0xf15c,0x53d7,0xabc6,0xfbb5,0xe113,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2ad7bffd,0xf15cbdcf,0xabc653d7,0xe113fbb5,0x7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xf15cbdcf2ad7bffd,0xe113fbb5abc653d7,0x7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x308}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x308}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x308}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1f37,0x5c4a,0x13f1,0x770,0x7183,0x5600,0xda31,0x9281}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5c4a1f37,0x77013f1,0x56007183,0x9281da31}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x77013f15c4a1f37,0x9281da3156007183}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x7ffa,0x55af,0x7b9e,0xe2b9,0xa7af,0x578c,0xf76b,0xc227,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x55af7ffa,0xe2b97b9e,0x578ca7af,0xc227f76b,0xf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe2b97b9e55af7ffa,0xc227f76b578ca7af,0xf}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0xd16,0xf02b,0x1ce7,0xa2ef,0x54b,0x2c56,0x5963,0x667,0x6f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0xf02b0d16,0xa2ef1ce7,0x2c56054b,0x6675963,0x6f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xa2ef1ce7f02b0d16,0x66759632c56054b,0x6f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x308}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x308}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x308}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 97}}; +const quat_left_ideal_t CONNECTING_IDEALS[7] = {{{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x6000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2,0x0,0x0,0x60000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2,0x6000000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x10000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1,0x1000000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x6000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2,0x0,0x0,0x60000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2,0x6000000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x5000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x50000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1,0x5000000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x3000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x30000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1,0x3000000000000000}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf5fe,0x8673,0x157b,0x7f90,0xd2c5,0xd00b,0xa646,0x78f4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8673f5fe,0x7f90157b,0xd00bd2c5,0x78f4a646}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x7f90157b8673f5fe,0x78f4a646d00bd2c5}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfee5,0x2b,0xd6d8,0xe65c,0x68a3,0xe72d,0x373d,0x5b1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2bfee5,0xe65cd6d8,0xe72d68a3,0x5b1373d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xe65cd6d8002bfee5,0x5b1373de72d68a3}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf5fe,0x8673,0x157b,0x7f90,0xd2c5,0xd00b,0xa646,0x78f4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8673f5fe,0x7f90157b,0xd00bd2c5,0x78f4a646}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x7f90157b8673f5fe,0x78f4a646d00bd2c5}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf719,0x8647,0x3ea3,0x9933,0x6a21,0xe8de,0x6f08,0x7343}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8647f719,0x99333ea3,0xe8de6a21,0x73436f08}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x99333ea38647f719,0x73436f08e8de6a21}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfaff,0xc339,0xabd,0xbfc8,0xe962,0x6805,0x5323,0x3c7a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc339faff,0xbfc80abd,0x6805e962,0x3c7a5323}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xbfc80abdc339faff,0x3c7a53236805e962}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe5e2,0x7715,0xa8e6,0x3c6f,0x9078,0x872b,0x9bec,0x1794}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7715e5e2,0x3c6fa8e6,0x872b9078,0x17949bec}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x3c6fa8e67715e5e2,0x17949bec872b9078}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8597,0x3af7,0xa5a,0xbb29,0x77c0,0xd2d9,0xf561,0x84f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3af78597,0xbb290a5a,0xd2d977c0,0x84ff561}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xbb290a5a3af78597,0x84ff561d2d977c0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe5e2,0x7715,0xa8e6,0x3c6f,0x9078,0x872b,0x9bec,0x1794}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7715e5e2,0x3c6fa8e6,0x872b9078,0x17949bec}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x3c6fa8e67715e5e2,0x17949bec872b9078}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x604b,0x3c1e,0x9e8c,0x8146,0x18b7,0xb452,0xa68a,0xf44}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3c1e604b,0x81469e8c,0xb45218b7,0xf44a68a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x81469e8c3c1e604b,0xf44a68ab45218b7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf2f1,0x3b8a,0xd473,0x1e37,0xc83c,0x4395,0x4df6,0xbca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3b8af2f1,0x1e37d473,0x4395c83c,0xbca4df6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1e37d4733b8af2f1,0xbca4df64395c83c}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xafa2,0x6dee,0xc511,0xde33,0xc8ce,0xc89e,0x4f97,0x2df9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6deeafa2,0xde33c511,0xc89ec8ce,0x2df94f97}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xde33c5116deeafa2,0x2df94f97c89ec8ce}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x519b,0xa90b,0xcdca,0xd5f5,0x757a,0x83dd,0xb354,0xe59}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa90b519b,0xd5f5cdca,0x83dd757a,0xe59b354}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd5f5cdcaa90b519b,0xe59b35483dd757a}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xafa2,0x6dee,0xc511,0xde33,0xc8ce,0xc89e,0x4f97,0x2df9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6deeafa2,0xde33c511,0xc89ec8ce,0x2df94f97}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xde33c5116deeafa2,0x2df94f97c89ec8ce}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5e07,0xc4e3,0xf746,0x83d,0x5354,0x44c1,0x9c43,0x1f9f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc4e35e07,0x83df746,0x44c15354,0x1f9f9c43}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x83df746c4e35e07,0x1f9f9c4344c15354}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x57d1,0xb6f7,0xe288,0x6f19,0x6467,0xe44f,0xa7cb,0x16fc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb6f757d1,0x6f19e288,0xe44f6467,0x16fca7cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x6f19e288b6f757d1,0x16fca7cbe44f6467}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x19f2,0x5594,0xee77,0x52a2,0xf459,0x45c9,0x2187,0xb348}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x559419f2,0x52a2ee77,0x45c9f459,0xb3482187}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x52a2ee77559419f2,0xb348218745c9f459}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdbd3,0x967a,0x8a96,0x1df4,0x7845,0xd70,0x419a,0x222}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x967adbd3,0x1df48a96,0xd707845,0x222419a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1df48a96967adbd3,0x222419a0d707845}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x19f2,0x5594,0xee77,0x52a2,0xf459,0x45c9,0x2187,0xb348}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x559419f2,0x52a2ee77,0x45c9f459,0xb3482187}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x52a2ee77559419f2,0xb348218745c9f459}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3e1f,0xbf19,0x63e0,0x34ae,0x7c14,0x3859,0xdfed,0xb125}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xbf193e1f,0x34ae63e0,0x38597c14,0xb125dfed}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x34ae63e0bf193e1f,0xb125dfed38597c14}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcf9,0xaaca,0x773b,0xa951,0xfa2c,0xa2e4,0x10c3,0x59a4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xaaca0cf9,0xa951773b,0xa2e4fa2c,0x59a410c3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xa951773baaca0cf9,0x59a410c3a2e4fa2c}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xaa3a,0x67cf,0x6ad7,0xd031,0x701,0xebca,0xd852,0x2996}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x67cfaa3a,0xd0316ad7,0xebca0701,0x2996d852}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd0316ad767cfaa3a,0x2996d852ebca0701}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x275,0xd7ab,0xedeb,0xbc67,0xad41,0xaeb5,0xf2e5,0x148e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd7ab0275,0xbc67edeb,0xaeb5ad41,0x148ef2e5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xbc67edebd7ab0275,0x148ef2e5aeb5ad41}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xaa3a,0x67cf,0x6ad7,0xd031,0x701,0xebca,0xd852,0x2996}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x67cfaa3a,0xd0316ad7,0xebca0701,0x2996d852}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd0316ad767cfaa3a,0x2996d852ebca0701}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa7c5,0x9024,0x7ceb,0x13c9,0x59c0,0x3d14,0xe56d,0x1507}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9024a7c5,0x13c97ceb,0x3d1459c0,0x1507e56d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x13c97ceb9024a7c5,0x1507e56d3d1459c0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd51d,0xb3e7,0xb56b,0xe818,0x380,0x75e5,0x6c29,0x14cb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb3e7d51d,0xe818b56b,0x75e50380,0x14cb6c29}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xe818b56bb3e7d51d,0x14cb6c2975e50380}}} +#endif +, &MAXORD_O0}}; +const quat_alg_elem_t CONJUGATING_ELEMENTS[7] = {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x10000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1,0x1000000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x1,0x0,0x0,0x10000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0x1,0x1000000000000000}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf94f,0x85ef,0x90f3,0xcc79,0x98d9,0x1a83,0x8d,0x67e1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x85eff94f,0xcc7990f3,0x1a8398d9,0x67e1008d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xcc7990f385eff94f,0x67e1008d1a8398d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xf94f,0x85ef,0x90f3,0xcc79,0x98d9,0x1a83,0x8d,0x67e1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x85eff94f,0xcc7990f3,0x1a8398d9,0x67e1008d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xcc7990f385eff94f,0x67e1008d1a8398d9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf2f1,0x3b8a,0xd473,0x1e37,0xc83c,0x4395,0x4df6,0xbca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3b8af2f1,0x1e37d473,0x4395c83c,0xbca4df6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1e37d4733b8af2f1,0xbca4df64395c83c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xf2f1,0x3b8a,0xd473,0x1e37,0xc83c,0x4395,0x4df6,0xbca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x3b8af2f1,0x1e37d473,0x4395c83c,0xbca4df6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0x1e37d4733b8af2f1,0xbca4df64395c83c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x57d1,0xb6f7,0xe288,0x6f19,0x6467,0xe44f,0xa7cb,0x16fc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb6f757d1,0x6f19e288,0xe44f6467,0x16fca7cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x6f19e288b6f757d1,0x16fca7cbe44f6467}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x57d1,0xb6f7,0xe288,0x6f19,0x6467,0xe44f,0xa7cb,0x16fc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xb6f757d1,0x6f19e288,0xe44f6467,0x16fca7cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0x6f19e288b6f757d1,0x16fca7cbe44f6467}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6511,0x45fa,0xa368,0xe869,0x4db2,0x88fc,0x6989,0xbdf3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x45fa6511,0xe869a368,0x88fc4db2,0xbdf36989}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xe869a36845fa6511,0xbdf3698988fc4db2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x6511,0x45fa,0xa368,0xe869,0x4db2,0x88fc,0x6989,0xbdf3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x45fa6511,0xe869a368,0x88fc4db2,0xbdf36989}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0xe869a36845fa6511,0xbdf3698988fc4db2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x5}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1e6b,0x5c4a,0x13f1,0x770,0x7183,0x5600,0xda31,0x9281}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5c4a1e6b,0x77013f1,0x56007183,0x9281da31}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x77013f15c4a1e6b,0x9281da3156007183}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x1e6b,0x5c4a,0x13f1,0x770,0x7183,0x5600,0xda31,0x9281}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x5c4a1e6b,0x77013f1,0x56007183,0x9281da31}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -2, ._mp_d = (mp_limb_t[]) {0x77013f15c4a1e6b,0x9281da3156007183}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4}}} +#endif +}}}; diff --git a/src/precomp/ref/lvl1/sqisign_parameters.txt b/src/precomp/ref/lvl1/sqisign_parameters.txt index d56d70c..8a1a26a 100644 --- a/src/precomp/ref/lvl1/sqisign_parameters.txt +++ b/src/precomp/ref/lvl1/sqisign_parameters.txt @@ -1,3 +1,3 @@ lvl = 1 -p = 0x34e29e286b95d98c33a6a86587407437252c9e49355147ffffffffffffffffff -B = 2000 +p = 0x4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +num_orders = 7 diff --git a/src/precomp/ref/lvl1/torsion_constants.c b/src/precomp/ref/lvl1/torsion_constants.c index d670025..d7a42bc 100644 --- a/src/precomp/ref/lvl1/torsion_constants.c +++ b/src/precomp/ref/lvl1/torsion_constants.c @@ -1,68 +1,43 @@ #include #include #include +const ibz_t TWO_TO_SECURITY_BITS = #if 0 -#elif 8*DIGIT_LEN == 16 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x4b; -const uint64_t TORSION_ODD_PRIMES[28] = {0x3, 0x17, 0x3b, 0x65, 0x6d, 0xc5, 0x1eb, 0x2e7, 0x779, 0x7, 0xb, 0xd, 0x25, 0x59, 0x61, 0x6b, 0x83, 0x89, 0xdf, 0xef, 0x17f, 0x185, 0x1f3, 0x25f, 0x409, 0x419, 0x4a9, 0x7b5}; -const uint64_t TORSION_ODD_POWERS[28] = {0x24, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[9] = {0x3, 0x17, 0x3b, 0x65, 0x6d, 0xc5, 0x1eb, 0x2e7, 0x779}; -const size_t TORSION_PLUS_ODD_POWERS[9] = {0x24, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}; -const uint64_t TORSION_MINUS_ODD_PRIMES[19] = {0x7, 0xb, 0xd, 0x25, 0x59, 0x61, 0x6b, 0x83, 0x89, 0xdf, 0xef, 0x17f, 0x185, 0x1f3, 0x25f, 0x409, 0x419, 0x4a9, 0x7b5}; -const size_t TORSION_MINUS_ODD_POWERS[19] = {0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[28] = {0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0x47ff,0x3551,0x9e49,0x252c,0x7437,0x8740,0xa865,0x33a6,0xd98c,0x6b95,0x9e28,0x34e2}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 21, ._mp_d = (mp_limb_t[]) {0x9c39,0x8bdf,0x3ada,0xa0cb,0xe195,0xb62c,0xca65,0x18ad,0x4ef2,0xb1c7,0x963f,0xa5f5,0xff2c,0xda91,0x2ce5,0xa54d,0x85bb,0x29e4,0xd6c0,0xfadc,0x17e}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[28] = {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc6d1,0x8b91,0x3e46,0x215}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x211}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd99}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x27d9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e69}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9799}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xadb9,0x3}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x6c71,0x8}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd731,0x37}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x961}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x61}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x83}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x89}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xdf}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xef}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x17f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x185}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1f3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x409}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x419}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4a9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7b5}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xaa29,0xc926,0xa593,0x86e4,0xe80e,0xcb0,0x74d5,0x3186,0x72bb,0xc50d,0x9c53,0x6}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xc391,0x81fc,0x4307,0xb45c,0x8cc7,0xa562,0x2134,0x3fea,0xef0a,0x39}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x800}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc6d1,0x8b91,0x3e46,0x215}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x8800,0x8e36,0x345c,0xa9f2,0x10}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x28e9,0xc551,0x1238,0xa0b3,0x76c,0x9d7d,0x4579,0xb59d,0xef3,0xb18b,0x664a,0xb2f1,0x383c,0x81df,0xa08,0x85e4,0xb7dc}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb3d9,0x59c1,0x9f3b,0x2e,0xecaa,0x686f,0x744b,0x32c}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xc391,0x81fc,0x4307,0xb45c,0x8cc7,0xa562,0x2134,0x3fea,0xef0a,0x39}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x8800,0x8e36,0x345c,0xa9f2,0x10}}}; -#elif 8*DIGIT_LEN == 32 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x4b; -const uint64_t TORSION_ODD_PRIMES[28] = {0x3, 0x17, 0x3b, 0x65, 0x6d, 0xc5, 0x1eb, 0x2e7, 0x779, 0x7, 0xb, 0xd, 0x25, 0x59, 0x61, 0x6b, 0x83, 0x89, 0xdf, 0xef, 0x17f, 0x185, 0x1f3, 0x25f, 0x409, 0x419, 0x4a9, 0x7b5}; -const uint64_t TORSION_ODD_POWERS[28] = {0x24, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[9] = {0x3, 0x17, 0x3b, 0x65, 0x6d, 0xc5, 0x1eb, 0x2e7, 0x779}; -const size_t TORSION_PLUS_ODD_POWERS[9] = {0x24, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}; -const uint64_t TORSION_MINUS_ODD_PRIMES[19] = {0x7, 0xb, 0xd, 0x25, 0x59, 0x61, 0x6b, 0x83, 0x89, 0xdf, 0xef, 0x17f, 0x185, 0x1f3, 0x25f, 0x409, 0x419, 0x4a9, 0x7b5}; -const size_t TORSION_MINUS_ODD_POWERS[19] = {0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[28] = {0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0x355147ff,0x252c9e49,0x87407437,0x33a6a865,0x6b95d98c,0x34e29e28}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 11, ._mp_d = (mp_limb_t[]) {0x8bdf9c39,0xa0cb3ada,0xb62ce195,0x18adca65,0xb1c74ef2,0xa5f5963f,0xda91ff2c,0xa54d2ce5,0x29e485bb,0xfadcd6c0,0x17e}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[28] = {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x8b91c6d1,0x2153e46}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x211}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd99}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x27d9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e69}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9799}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3adb9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x86c71}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x37d731}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x961}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x61}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x83}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x89}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xdf}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xef}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x17f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x185}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1f3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x409}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x419}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4a9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7b5}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc926aa29,0x86e4a593,0xcb0e80e,0x318674d5,0xc50d72bb,0x69c53}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x81fcc391,0xb45c4307,0xa5628cc7,0x3fea2134,0x39ef0a}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x800}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x8b91c6d1,0x2153e46}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x8e368800,0xa9f2345c,0x10}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xc55128e9,0xa0b31238,0x9d7d076c,0xb59d4579,0xb18b0ef3,0xb2f1664a,0x81df383c,0x85e40a08,0xb7dc}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x59c1b3d9,0x2e9f3b,0x686fecaa,0x32c744b}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x81fcc391,0xb45c4307,0xa5628cc7,0x3fea2134,0x39ef0a}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x8e368800,0xa9f2345c,0x10}}}; -#elif 8*DIGIT_LEN == 64 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x4b; -const uint64_t TORSION_ODD_PRIMES[28] = {0x3, 0x17, 0x3b, 0x65, 0x6d, 0xc5, 0x1eb, 0x2e7, 0x779, 0x7, 0xb, 0xd, 0x25, 0x59, 0x61, 0x6b, 0x83, 0x89, 0xdf, 0xef, 0x17f, 0x185, 0x1f3, 0x25f, 0x409, 0x419, 0x4a9, 0x7b5}; -const uint64_t TORSION_ODD_POWERS[28] = {0x24, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[9] = {0x3, 0x17, 0x3b, 0x65, 0x6d, 0xc5, 0x1eb, 0x2e7, 0x779}; -const size_t TORSION_PLUS_ODD_POWERS[9] = {0x24, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}; -const uint64_t TORSION_MINUS_ODD_PRIMES[19] = {0x7, 0xb, 0xd, 0x25, 0x59, 0x61, 0x6b, 0x83, 0x89, 0xdf, 0xef, 0x17f, 0x185, 0x1f3, 0x25f, 0x409, 0x419, 0x4a9, 0x7b5}; -const size_t TORSION_MINUS_ODD_POWERS[19] = {0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[28] = {0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x252c9e49355147ff,0x33a6a86587407437,0x34e29e286b95d98c}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xa0cb3ada8bdf9c39,0x18adca65b62ce195,0xa5f5963fb1c74ef2,0xa54d2ce5da91ff2c,0xfadcd6c029e485bb,0x17e}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[28] = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2153e468b91c6d1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x211}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd99}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x27d9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e69}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9799}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3adb9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x86c71}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x37d731}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x961}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x61}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x83}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x89}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xdf}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xef}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x17f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x185}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1f3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x409}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x419}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4a9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7b5}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x86e4a593c926aa29,0x318674d50cb0e80e,0x69c53c50d72bb}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xb45c430781fcc391,0x3fea2134a5628cc7,0x39ef0a}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x800}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2153e468b91c6d1}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x0,0xa9f2345c8e368800,0x10}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xa0b31238c55128e9,0xb59d45799d7d076c,0xb2f1664ab18b0ef3,0x85e40a0881df383c,0xb7dc}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2e9f3b59c1b3d9,0x32c744b686fecaa}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xb45c430781fcc391,0x3fea2134a5628cc7,0x39ef0a}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x0,0xa9f2345c8e368800,0x10}}}; +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x1}}} #endif +; +const ibz_t TORSION_PLUS_2POWER = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x100000000000000}}} +#endif +; +const ibz_t SEC_DEGREE = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 33, ._mp_d = (mp_limb_t[]) {0x4b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x4b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x4b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#endif +; +const ibz_t COM_DEGREE = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 33, ._mp_d = (mp_limb_t[]) {0x4b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x4b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x4b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#endif +; diff --git a/src/precomp/ref/lvl3/CMakeLists.txt b/src/precomp/ref/lvl3/CMakeLists.txt index b104660..c7637fa 100644 --- a/src/precomp/ref/lvl3/CMakeLists.txt +++ b/src/precomp/ref/lvl3/CMakeLists.txt @@ -1,49 +1 @@ -set(SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF - torsion_constants.c - quaternion_data.c - endomorphism_action.c - klpt_constants.c -) - -add_library(${LIB_PRECOMP_${SVARIANT_UPPER}} ${SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE common ${INC_INTBIG} ${INC_QUATERNION} ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src/ec/ref/include ${PROJECT_SOURCE_DIR}/src/ec/ref/${SVARIANT_LOWER}/include ${PROJECT_SOURCE_DIR}/src/gf/ref/${SVARIANT_LOWER}/include ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_COMMON}) -target_compile_options(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_custom_command( - OUTPUT - "${CMAKE_CURRENT_SOURCE_DIR}/torsion_constants.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/torsion_constants.h" - "${CMAKE_CURRENT_SOURCE_DIR}/include/klpt_constants.h" - "${CMAKE_CURRENT_SOURCE_DIR}/klpt_constants.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/encoded_sizes.h" - "${PROJECT_SOURCE_DIR}/src/nistapi/lvl3/api.h" - "${CMAKE_CURRENT_SOURCE_DIR}/quaternion_data.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/quaternion_data.h" - "${CMAKE_CURRENT_SOURCE_DIR}/endomorphism_action.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/endomorphism_action.h" - COMMAND - echo "Please run manually: make precomp" -) - -find_program(SAGEMATH sage) -add_custom_target(precomp_${SVARIANT_LOWER} - DEPENDS - "./sqisign_parameters.txt" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_torsion_constants.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_klpt_constants.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_sizes.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_quaternion_data.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_endomorphism_action.sage" - WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" -) - -set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM true) -set_target_properties(precomp_${SVARIANT_LOWER} PROPERTIES EXCLUDE_FROM_ALL TRUE) - -add_dependencies(precomp precomp_lvl3) +include(../lvlx.cmake) diff --git a/src/precomp/ref/lvl3/e0_basis.c b/src/precomp/ref/lvl3/e0_basis.c new file mode 100644 index 0000000..1b12a83 --- /dev/null +++ b/src/precomp/ref/lvl3/e0_basis.c @@ -0,0 +1,55 @@ +#include +const fp2_t BASIS_E0_PX = { +#if 0 +#elif RADIX == 16 +{0x1196, 0x134b, 0xdbd, 0x118d, 0x712, 0x1646, 0x5d7, 0x8eb, 0x431, 0xf5b, 0x161e, 0x13b6, 0x1c07, 0x42, 0x8ba, 0xeec, 0x1a43, 0x545, 0x1cdb, 0x1659, 0x1614, 0xde, 0x72d, 0x1b80, 0x1706, 0x15a3, 0x894, 0xd4a, 0x1b2f, 0x12} +#elif RADIX == 32 +{0x9a5c65a, 0xa31adbd, 0x7b231c4, 0xc51d65d, 0x1e7ad90, 0x1e76d6, 0x8ba0217, 0xe90ddd8, 0x3cdb2a2, 0xf5852cb, 0x72d06, 0xd1dc1b7, 0xa94894a, 0x14cbd} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x31c4a31adbd9a5c6, 0xe7ad90c51d65d7b2, 0x88ba021701e76d61, 0x2cb3cdb2a2e90ddd, 0xdc1b70072d06f585, 0x16eecbda94894ad1} +#else +{0x94635b7b34b8c, 0x431475975ec8c7, 0x380f3b6b0f3d6c, 0x2e90ddd88ba021, 0x5eb0a59679b654, 0x347706dc01cb41, 0xb7765ed4a44a5} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xa85, 0x10cc, 0x1ef, 0xb0b, 0x1082, 0x5be, 0xd14, 0x1100, 0x1a33, 0x174b, 0x181c, 0x83e, 0x1034, 0x18ba, 0x205, 0x1f39, 0x1e9, 0x1998, 0x130e, 0x801, 0xfeb, 0x698, 0xdf9, 0x6a5, 0x5b6, 0x2c8, 0x1283, 0xad9, 0x960, 0x1e} +#elif RADIX == 32 +{0x8662a17, 0x96161ef, 0x42df420, 0xce200d1, 0x1cba5e8, 0xd107d8, 0x205c5d4, 0x7a7e72, 0x330eccc, 0xc3fad00, 0x4adf934, 0x6416d8d, 0x5b32831, 0x2f581} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf42096161ef8662a, 0xcba5e8ce200d142d, 0x2205c5d40d107d81, 0xd00330eccc07a7e7, 0x16d8d4adf934c3fa, 0x6065815b3283164} +#else +{0x412c2c3df0cc54, 0x2338803450b7d0, 0x206883ec0e5d2f, 0x407a7e72205c5d, 0x187f5a00661d99, 0x5905b6352b7e4d, 0x3032c0ad99418} +#endif +#endif +}; +const fp2_t BASIS_E0_QX = { +#if 0 +#elif RADIX == 16 +{0x16ed, 0x818, 0x127a, 0xcfb, 0x1be6, 0x1b40, 0x1bf1, 0xe75, 0x129c, 0x151, 0x425, 0x142e, 0x1edb, 0x254, 0x5cc, 0x1a5b, 0x1e1d, 0x1e27, 0x1a12, 0x8a8, 0x59e, 0x933, 0x1647, 0x686, 0x19e, 0x1e51, 0x151f, 0x1b6e, 0x1efe, 0xd} +#elif RADIX == 32 +{0x40c5bb5, 0x99f727a, 0x1da06f9, 0x71cebbf, 0x250a8ca, 0xb6e85c4, 0x5cc12a7, 0xf8774b6, 0x1a12f13, 0x9967915, 0xd64749, 0x288678d, 0x6dd51ff, 0x2ebfb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6f999f727a40c5b, 0x50a8ca71cebbf1da, 0x65cc12a7b6e85c42, 0x9151a12f13f8774b, 0x8678d0d647499967, 0x2e23bfb6dd51ff28} +#else +{0x7333ee4f4818b7, 0x29c73aefc7681b, 0x3db742e2128546, 0x3f8774b65cc12a, 0x332cf22a3425e2, 0x4a219e343591d2, 0x6d1dfdb6ea8ff} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x18a9, 0x1838, 0x1588, 0x1720, 0xf3f, 0x1fcd, 0x44d, 0x1e6b, 0x681, 0x1249, 0x1f8a, 0x5af, 0x1f58, 0x1c12, 0xf21, 0x1887, 0x278, 0x156a, 0xbfe, 0x765, 0x12f7, 0x4da, 0x16ce, 0x7c1, 0x1c04, 0x1773, 0x853, 0xab7, 0xe1d, 0x1a} +#elif RADIX == 32 +{0xc1c62a7, 0xee41588, 0xdfe6bcf, 0x7cd644, 0x8a9249a, 0xd60b5ff, 0xf21e097, 0x9e310e, 0xabfeab5, 0xd4bdcec, 0x836ce26, 0xb9f010f, 0x56e853b, 0x10875} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6bcfee41588c1c62, 0xa9249a07cd644dfe, 0xef21e097d60b5ff8, 0xcecabfeab509e310, 0xf010f836ce26d4bd, 0x2a7787556e853bb9} +#else +{0x1fdc82b11838c5, 0x681f359137f9af, 0x3eb05affc54924, 0x509e310ef21e09, 0x5a97b9d957fd56, 0x6e7c043e0db389, 0x4fbc3aab7429d} +#endif +#endif +}; diff --git a/src/precomp/ref/lvl3/ec_params.c b/src/precomp/ref/lvl3/ec_params.c new file mode 100644 index 0000000..ae214aa --- /dev/null +++ b/src/precomp/ref/lvl3/ec_params.c @@ -0,0 +1,4 @@ +#include +// p+1 divided by the power of 2 +const digit_t p_cofactor_for_2f[1] = {65}; + diff --git a/src/precomp/ref/lvl3/endomorphism_action.c b/src/precomp/ref/lvl3/endomorphism_action.c index 0110474..8aafeac 100644 --- a/src/precomp/ref/lvl3/endomorphism_action.c +++ b/src/precomp/ref/lvl3/endomorphism_action.c @@ -1,56 +1,3812 @@ #include #include #include +const curve_with_endomorphism_ring_t CURVES_WITH_ENDOMORPHISMS[8] = {{{{ #if 0 -#elif 8*DIGIT_LEN == 16 -const ec_basis_t BASIS_EVEN = {{{{0x22e6355134b7d255, 0xa7f7f4f4597d08dc, 0xb8eb0e50d5888eec, 0xed36a84e0c7f72ba, 0xb6ed1c0b46f3f28e, 0x282153a62f4d1b8}, {0xd57efea74410a787, 0xea4460d69d71d250, 0xb3d9ad4193397a46, 0x3124b5b93ff1a081, 0x45a800b0c82d3709, 0x24b0e60e1353c61}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x17df8f9d274de7f, 0x351632cce83ec8aa, 0x56e019deae8daf7e, 0x3da35b5dc1820a3b, 0xbb60de7d759b75b1, 0x2e81949d5d0a4d9}, {0xa4efe85f225c5804, 0x9cbd9fc32e16b4f8, 0xa8be541ed7c20bbc, 0xe057875bd571d902, 0x35f5baf03dab21ff, 0x3493d2784699545}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xb37f8fba3f4420f8, 0x8d48f1acb03706df, 0x5f5d4860530ffdbc, 0x3346cb7307f4e98e, 0xebbd3a151d8187ef, 0x14e3e664b5f52b0}, {0xdab91da8f4656795, 0xdbdcf3c3108cac88, 0x272d467ca27bde21, 0x147ed2cd9dc73cf0, 0x67421707fd5d4d50, 0x1c9f704aa559bda}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0xdb68fd6ab36028ee, 0xb67ecbd22b247e6d, 0x3ddb4a10bff4a0, 0x31eccf041ed4eabc, 0x6c93b74e3dbd1615, 0xece18a8a69c342}, {0x3ac922e0d53a3b4e, 0xaaa4c42158564daf, 0x1359d8744b831fce, 0x6f1eb5f50a893a70, 0x290b2fffdf9f083e, 0x56212fe48636bb}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xd64d88142398fc70, 0x8cd791e2b175b8ad, 0x8cf816a594e65996, 0xdc15534f4bbc3e, 0x2ebd5f0fca9cb695, 0x2677728640635e3}, {0x8e859814dd48f154, 0x400b48d3d3fb2e17, 0x9e315059bbc401a9, 0x26c24fc85c0a4034, 0x2095f2ade3a1cc0e, 0x789dae43794796}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x55c5c814e95ff9e, 0x624aa7502d08f66d, 0xfaef96a43369b1b5, 0x6bd0164a386601da, 0xc4624eccbcab4884, 0x10154ec03218312}, {0x4fbfbe9e5f4e4beb, 0x1392132cc9a7a298, 0x87bee2902df2694c, 0x2fd70dedc82c836c, 0xb969a66833ea4330, 0xac80d610eac86e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x4668fbf6837118e1, 0xe3f7541cde4ef86b, 0x6222f4709df362fa, 0xfff04e39c27d3eeb, 0x950a899ed78c3ac4, 0x325b141dae45991}, {0xdcd302b823c975d7, 0x52a74513892de655, 0x71698b3599387e45, 0x190b468017eb95b1, 0x8d1e5211978b6ff3, 0x29dc08516c36f88}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x29ebd3656c338c34, 0x2bfcf65c705b22cb, 0xc34d5916fff804ae, 0x936fa5577596f777, 0x88bc262ea82314b1, 0x3cb841bc5ebf63f}, {0x1cd8d5a530a1914c, 0xaa47dc464b7fe567, 0xb2f6cfba20a12302, 0xbdec2a7f8ed5764a, 0x8d8caffb90342f7, 0x2bc600de26023a0}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xef90e01f16ec0b, 0xbe3b230014cdc8ca, 0x11d8068a91007c6a, 0xef60fc7a468eb46, 0x6ebe6eb84394eacc, 0xb27d0c0b9cc97e}, {0xfb44d144ffbc728, 0x35fed8aabb632fb0, 0xbce80df03ad44c4c, 0x94e973d6d612e79a, 0xf90b559988365d91, 0x1d8b3925fcef701}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xcf4ab671f3581670, 0xfe5bec2006b84191, 0x9c86c3022ef1c1dc, 0xca2fd261142cadc9, 0x615c338c784391f1, 0x220d6a5b67dc16c}, {0x827228cb3c97f27d, 0x62e6cbb0680bb491, 0x595f79839679df49, 0xb532dbc517c50a6e, 0x307360426131c2a7, 0x36d0c506b0ee9bf}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xa40cf5606210efd5, 0xe2a74bde914816ea, 0x3eaded7bce47ee4e, 0x5c13b2fc6d3f0e6f, 0x7c3d8e9de2169375, 0x1ff7fd7dbf97c03}, {0xc35492b3b8cb43e2, 0x3101d6730b5f0690, 0x18bb5b95ff4732ad, 0xc910043b50554bb7, 0xe157f6abd14ab159, 0x136ee8f2b5d364c}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x52706bfd8763b0c3, 0xa42c185c8aff91f3, 0x787da4c24686d040, 0xb481c545c5d853a3, 0xeff30a78ada95338, 0x42de7d5615621e}, {0x9c57da37895bac33, 0x151877b2e03774e0, 0x932f17a8d669aae8, 0xce9262ee9efce8c9, 0x31226e5e998455ab, 0x208b93fdae6a791}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x4668fbf6837118e1, 0xe3f7541cde4ef86b, 0x6222f4709df362fa, 0xfff04e39c27d3eeb, 0x950a899ed78c3ac4, 0x325b141dae45991}, {0xdcd302b823c975d7, 0x52a74513892de655, 0x71698b3599387e45, 0x190b468017eb95b1, 0x8d1e5211978b6ff3, 0x29dc08516c36f88}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x29ebd3656c338c34, 0x2bfcf65c705b22cb, 0xc34d5916fff804ae, 0x936fa5577596f777, 0x88bc262ea82314b1, 0x3cb841bc5ebf63f}, {0x1cd8d5a530a1914c, 0xaa47dc464b7fe567, 0xb2f6cfba20a12302, 0xbdec2a7f8ed5764a, 0x8d8caffb90342f7, 0x2bc600de26023a0}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xef90e01f16ec0b, 0xbe3b230014cdc8ca, 0x11d8068a91007c6a, 0xef60fc7a468eb46, 0x6ebe6eb84394eacc, 0xb27d0c0b9cc97e}, {0xfb44d144ffbc728, 0x35fed8aabb632fb0, 0xbce80df03ad44c4c, 0x94e973d6d612e79a, 0xf90b559988365d91, 0x1d8b3925fcef701}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0xbeb1828b6321b73b, 0x9b4ae33a51041b28, 0xb8eb52edec901458, 0x489f36189fbe40e2, 0x23b52fca75d8097a, 0x1fa77728850feb5}, {0x3c3181fa7491fa00, 0x90610c1cf4b08f0d, 0xc9a4e86e25007aa9, 0x5b71c5a9406460c7, 0xcc87c9e89706249a, 0x35c54d562e37057}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x4660c57fe78f45e1, 0x52046157833495f6, 0x3a046cb27e641924, 0x3d296d4fc4f86278, 0x53eab7beef1edc6b, 0x180b61ad44039e5}, {0x70a4e03a435a0a94, 0xf4446a3f06c86e3b, 0x83264cf9fe7b13b9, 0xded3fc0f6172e26, 0xc0ad14de5a337e74, 0x27cb876a7e80950}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xa6cb0f8ced1d3798, 0x7d2277dc624ef354, 0xed0fc61f3fcf514, 0x80d1db25eb940c0d, 0x5e0af0166b2e4f8f, 0x3a9eaad39577c49}, {0xe3b7bc63514ee9b3, 0x541be4cbdbf35256, 0x4ce81454a8ce471e, 0x97b4f5aca2ab4e14, 0x5e3ef1b3acf3da56, 0x1be60bf81366891}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xf9ad,0x5f9b,0x6ce9,0xbb0,0xd99f,0xfa8,0xd044,0x233e,0x87e8,0xca4e,0x4a37,0x56fc,0x9dca,0x9c29,0x5919,0xe176,0x49f2,0x703,0xedb8,0x79d4,0xee35,0xf59f,0x2616,0xd452,0x2b73,0xbe73,0x59c,0x7105,0xc02b,0x9deb,0xf129,0xd05f,0xa69,0x9aaa,0x470c,0xa988,0x270}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x4602,0x9ac2,0xb4ca,0x4dc4,0x4c48,0x81e5,0x7e0a,0x8b5b,0x89b7,0x7e46,0xfa8f,0x54fa,0x905e,0x76fc,0xb466,0xa68,0x6ea2,0xec93,0x1752,0x3208,0xa003,0x320,0xd8bc,0x5fbe,0x3e0a,0x73c0,0xf878,0x363a,0x288e,0xc25e,0xb565,0xdaee,0x880a,0x793b,0x4f3b,0x6e37,0x92}}}}, {{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xff8b,0xb5e4,0x8708,0x298b,0x12b1,0xd78a,0x68cb,0xb760,0xb439,0x8235,0x4322,0x2444,0xbb26,0x144c,0xcdf3,0x67ce,0x4c77,0x789a,0xe4a0,0xecfa,0x9e7e,0x8163,0x96c,0x510f,0xa6dc,0xf672,0x8152,0x5b7c,0xa824,0x40c,0x1d30,0xaca1,0xc8de,0xda4b,0x75d1,0x17,0xa58}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x653,0xa064,0x9316,0xf44f,0x2660,0xf057,0x96f1,0x46bd,0x1261,0x8b14,0x468e,0xf557,0x4bed,0x4122,0xb58d,0x5aa5,0x981f,0xe023,0x31d,0xfe62,0x8acd,0xcd7c,0xd36d,0xebeb,0x1ff9,0x9212,0xeb42,0xdfcb,0xe015,0xa9d4,0xd889,0xf67,0xdc26,0xc0dd,0xc1fb,0x9018,0xa92}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x5359,0xd834,0x93b2,0xd92d,0x9b7d,0x171d,0xe04c,0xdeef,0x7fd0,0xef48,0xc82f,0x8949,0x679b,0x832,0x868f,0x251d,0xdf6f,0x4f09,0xe75,0x1b2c,0xde6b,0x905,0x730,0x96d8,0x3651,0xf6f3,0xc0fb,0x6341,0xed57,0x8dd3,0x2678,0x6f49,0x905d,0xb032,0xb8e5,0xb1a,0x160}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xeab0,0x5959,0x9779,0xc157,0x9e09,0xabc0,0x4987,0xb2b2,0xc465,0x41cb,0x28f3,0xc425,0x800a,0x52b5,0xa793,0x9aa2,0x1b4d,0xba7d,0x78e3,0x1043,0x62b,0x48fe,0x67a5,0x6ac1,0xe1fd,0x7734,0x5d61,0xee4d,0x12cc,0xa978,0xab4c,0x69cb,0x4efc,0x85fa,0xaf33,0xb815,0xc3}}}}, {{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xa413,0x8161,0xeff,0x6861,0x5ea,0x270d,0x8480,0xa589,0xeec9,0xcd5e,0xd511,0x3613,0xcbc9,0xbce9,0x774e,0xcd73,0x995a,0x8ed7,0x85cb,0x7b1a,0x65de,0xdeb6,0xb79b,0xc9b2,0xb14f,0xa86d,0x5252,0xd55e,0xc3aa,0xe5c2,0xbcf9,0x5e0f,0xc2d7,0x85ad,0x2b48,0xf16e,0x19b}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xaca7,0x27cb,0x6c4d,0x26d2,0x6482,0xe8e2,0x86e9,0x8b0c,0x1a78,0x661a,0xc896,0xc309,0x821c,0xd519,0x8817,0x16fe,0x2a3,0x981d,0xe260,0x5d0a,0x9a98,0xba16,0xf254,0x2965,0x151c,0x5992,0x2fe3,0xed8f,0xb2e9,0xb9ec,0xa33a,0x707e,0x5632,0xab55,0x5022,0x2e86,0xba3}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x5e4b,0xf857,0x15d3,0x5f39,0x327d,0xf49d,0x1206,0x32f8,0x32d,0xb830,0x8d08,0x57bb,0xa63d,0xa3fa,0x31ce,0x4bb0,0xd817,0xa181,0x6a23,0x1056,0xb43c,0xa42d,0xbca9,0x8adf,0xc97c,0x67b5,0xa69b,0xd3e0,0xa039,0x82e0,0xeb8,0x5ea5,0xdad8,0x4264,0xd763,0x1170,0x1a1}}}, {{._mp_alloc = 0, ._mp_size = 36, ._mp_d = (mp_limb_t[]) {0xcc3e,0x8cf3,0xfe19,0x1ea2,0x1b31,0x311a,0x85ef,0x82ef,0xdd53,0xda45,0x6b4c,0x49a7,0xfd6a,0x628d,0x85f1,0x960d,0xf0e9,0x5e12,0xcf21,0xa0a0,0x169d,0x1240,0xb63d,0xee8f,0xaf8c,0x12da,0x802c,0x6d14,0x7027,0x4a5b,0xff7f,0xd76f,0x8a9,0x6a95,0xff1c,0xe83d}}}}, {{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x8c7c,0xdf9f,0xdbf8,0xc3e2,0x3533,0x3b5d,0x39e9,0x89df,0x3202,0x7b1e,0x8bc5,0x1c24,0xaa1e,0x134d,0x2977,0xee57,0x80b9,0xd74d,0x232a,0x3467,0x152a,0xc9cd,0x2f03,0xd2c5,0xd887,0xcda9,0x65cc,0x3bf9,0xc690,0x88d,0x9016,0xdb95,0xec1a,0x413a,0x8321,0xdd30,0xb06}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xa1b5,0x7a8,0xea2c,0xa0c6,0xcd82,0xb62,0x552f,0x3704,0x971c,0x9d32,0x3bd,0xf498,0x437a,0x3951,0xdcd8,0xf06b,0x9fa,0x45a5,0x86b2,0x67e0,0xc4c7,0x1eee,0x3cdb,0x355e,0x81f1,0xe8cf,0x4a43,0x7cf0,0x7,0xc4e0,0xbafa,0x8122,0xbb7,0x1923,0x31a5,0x2830,0xb62}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xf9ad,0x5f9b,0x6ce9,0xbb0,0xd99f,0xfa8,0xd044,0x233e,0x87e8,0xca4e,0x4a37,0x56fc,0x9dca,0x9c29,0x5919,0xe176,0x49f2,0x703,0xedb8,0x79d4,0xee35,0xf59f,0x2616,0xd452,0x2b73,0xbe73,0x59c,0x7105,0xc02b,0x9deb,0xf129,0xd05f,0xa69,0x9aaa,0x470c,0xa988,0x270}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x4602,0x9ac2,0xb4ca,0x4dc4,0x4c48,0x81e5,0x7e0a,0x8b5b,0x89b7,0x7e46,0xfa8f,0x54fa,0x905e,0x76fc,0xb466,0xa68,0x6ea2,0xec93,0x1752,0x3208,0xa003,0x320,0xd8bc,0x5fbe,0x3e0a,0x73c0,0xf878,0x363a,0x288e,0xc25e,0xb565,0xdaee,0x880a,0x793b,0x4f3b,0x6e37,0x92}}}}, {{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xff8b,0xb5e4,0x8708,0x298b,0x12b1,0xd78a,0x68cb,0xb760,0xb439,0x8235,0x4322,0x2444,0xbb26,0x144c,0xcdf3,0x67ce,0x4c77,0x789a,0xe4a0,0xecfa,0x9e7e,0x8163,0x96c,0x510f,0xa6dc,0xf672,0x8152,0x5b7c,0xa824,0x40c,0x1d30,0xaca1,0xc8de,0xda4b,0x75d1,0x17,0xa58}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x653,0xa064,0x9316,0xf44f,0x2660,0xf057,0x96f1,0x46bd,0x1261,0x8b14,0x468e,0xf557,0x4bed,0x4122,0xb58d,0x5aa5,0x981f,0xe023,0x31d,0xfe62,0x8acd,0xcd7c,0xd36d,0xebeb,0x1ff9,0x9212,0xeb42,0xdfcb,0xe015,0xa9d4,0xd889,0xf67,0xdc26,0xc0dd,0xc1fb,0x9018,0xa92}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x2683,0x1be8,0x4e,0x726f,0x3a8e,0x1363,0x8be3,0x3615,0xd101,0x77c,0xd197,0x164c,0xf78f,0xc0d3,0xf727,0x2157,0x5ba,0x9e9a,0xf681,0x69b,0x22d2,0xe0e1,0x1365,0x95b4,0xd699,0x2f5,0xdbbc,0x128b,0x26e2,0xb9c0,0x70aa,0x8fb8,0x40ab,0x5332,0x47d,0xf722,0x869}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x1859,0xfa0e,0x2621,0x78e,0xf529,0x16d2,0xe3c9,0x9f06,0x270e,0x6009,0x11c1,0x8c90,0x834,0xe4d9,0xadfc,0xd285,0x44f7,0x5388,0xc81b,0x2125,0x5317,0xa60f,0x2030,0xe540,0x9003,0xf57a,0x2aec,0x9244,0x1dad,0x35eb,0x3059,0xa25d,0xeb83,0x7f9a,0x7f37,0x1326,0xab}}}}, {{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x51cf,0x1ba3,0x4b04,0xc8f6,0x8c4d,0xff4b,0x2a40,0x6373,0x9ea6,0x527b,0xd47d,0xd355,0x3853,0x5741,0x29f4,0x38af,0x63f2,0xf74c,0x2da0,0x7026,0x3eb0,0x919b,0xdd46,0xed7f,0xd1cc,0x77b2,0xe242,0x40d5,0x608,0x98c8,0x51ee,0xf53c,0xb922,0x5dc0,0x5511,0x9593,0xc7b}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xd97d,0xe417,0xffb1,0x8d90,0xc571,0xec9c,0xdb52,0x33e6,0xc948,0x4de5,0xbf2f,0x3606,0xf229,0x1c77,0x177f,0x1ac4,0xdc58,0x488c,0xfa54,0x719a,0x5631,0xe23b,0xe61e,0x2a89,0x74d4,0x4d8f,0x1523,0x3e45,0x795f,0x8e00,0x5908,0x500f,0xa5e4,0x855,0x48b,0x427f,0x499}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xaf26,0xfc2b,0x8ae9,0xaf9c,0x993e,0x7a4e,0x3c9e,0x4e7a,0x4ebb,0x86c9,0x8ee7,0xd207,0x47fa,0xc0a3,0x203a,0xc3e6,0x5d14,0xc454,0xad7c,0xc446,0x169f,0x33a5,0xdb17,0x258e,0x8a75,0x5c1d,0xcbbd,0x9258,0xa03d,0xe550,0x6c35,0x1f36,0x60b4,0xcef6,0xf035,0x2588,0x752}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xe61f,0xc679,0x7f0c,0x8f51,0xd98,0x988d,0xf692,0x7675,0x3bce,0x97d4,0x7e09,0x4afd,0xf391,0x1fec,0xca4c,0xe914,0xe97d,0xa29c,0xdffb,0x8c6b,0x47d0,0xeaae,0xd7e0,0x5766,0xfd7d,0xb1af,0xb885,0x5ef2,0x834,0x490e,0xe499,0xdb9b,0x779c,0x630e,0x8412,0x10ef,0x682}}}}, {{{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0xc63e,0x6fcf,0x6dfc,0xe1f1,0x9a99,0x9dae,0xd08f,0xf9ed,0x6625,0xe840,0xe45,0x343c,0xc9eb,0xf84c,0x9c0e,0x1539,0x3166,0x5f3a,0xa00,0xd64f,0xc716,0x4674,0x9444,0xc981,0x91fa,0xf17,0x2b56,0xc665,0x3368,0xa827,0xace4,0x5dae,0x6955,0xce61,0xc614,0xb68,0xc05}}}, {{._mp_alloc = 0, ._mp_size = 37, ._mp_d = (mp_limb_t[]) {0x50db,0x3d4,0x7516,0x5063,0x66c1,0x85b1,0x2a97,0x1b82,0x4b8e,0xce99,0x1de,0x7a4c,0xa1bd,0x1ca8,0xee6c,0x7835,0x84fd,0x22d2,0x4359,0xb3f0,0x6263,0x8f77,0x1e6d,0x9aaf,0xc0f8,0xf467,0x2521,0xbe78,0x3,0x6270,0x5d7d,0xc091,0x85db,0x8c91,0x18d2,0x1418,0x5b1}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x5618,0x91a5,0xcb1,0xec10,0x5d13,0x966d,0x2570,0xdd22,0xbd4,0xdd08,0x2a09,0x3bbe,0x5f37,0xd115,0x4654,0x9e06,0x981d,0x14b8,0x39e7,0x8f5f,0xea39,0x3bac,0x3ec9,0x14f3}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa05f,0xee14,0xb22,0x39f7,0xd1f8,0x2e3b,0x1510,0xe8a4,0xc434,0xe2b9,0xfc70,0xe01f,0xae2e,0x1049,0xa35,0x1f9f,0x966,0x2daa,0x4084,0x4931,0x6e9e,0x907d,0x9561,0x722}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa744,0xe0f6,0x4a03,0xd4bd,0xbe44,0xcb47,0x692f,0x814b,0x8ab1,0x6803,0x716f,0x7a91,0x771c,0x9d47,0x39c2,0x70e8,0x1dc1,0xdb8e,0x7444,0x6673,0xe706,0xc21,0x4594,0x353d}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x387,0xa498,0xa53d,0x37dd,0xd4e,0x78a0,0x4d99,0x48b9,0xbcf4,0xc524,0xbdca,0xc972,0x3bd5,0x51be,0xb971,0x6d73,0x9f69,0x3a0d,0x60c,0x4c09,0x4e4,0xb155,0xcf32,0x565e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1b5d,0x8a51,0xdd5d,0x1483,0x3d75,0x8cbe,0x9d34,0x964,0x6d97,0x5409,0x3bb1,0x5e4e,0x9384,0x2ead,0x6dee,0x439d,0xcf8b,0x9c90,0xaf44,0x3f6f,0xf968,0x2120,0x1235,0x1663}}}}}; -#elif 8*DIGIT_LEN == 32 -const ec_basis_t BASIS_EVEN = {{{{0x22e6355134b7d255, 0xa7f7f4f4597d08dc, 0xb8eb0e50d5888eec, 0xed36a84e0c7f72ba, 0xb6ed1c0b46f3f28e, 0x282153a62f4d1b8}, {0xd57efea74410a787, 0xea4460d69d71d250, 0xb3d9ad4193397a46, 0x3124b5b93ff1a081, 0x45a800b0c82d3709, 0x24b0e60e1353c61}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x17df8f9d274de7f, 0x351632cce83ec8aa, 0x56e019deae8daf7e, 0x3da35b5dc1820a3b, 0xbb60de7d759b75b1, 0x2e81949d5d0a4d9}, {0xa4efe85f225c5804, 0x9cbd9fc32e16b4f8, 0xa8be541ed7c20bbc, 0xe057875bd571d902, 0x35f5baf03dab21ff, 0x3493d2784699545}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xb37f8fba3f4420f8, 0x8d48f1acb03706df, 0x5f5d4860530ffdbc, 0x3346cb7307f4e98e, 0xebbd3a151d8187ef, 0x14e3e664b5f52b0}, {0xdab91da8f4656795, 0xdbdcf3c3108cac88, 0x272d467ca27bde21, 0x147ed2cd9dc73cf0, 0x67421707fd5d4d50, 0x1c9f704aa559bda}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0xdb68fd6ab36028ee, 0xb67ecbd22b247e6d, 0x3ddb4a10bff4a0, 0x31eccf041ed4eabc, 0x6c93b74e3dbd1615, 0xece18a8a69c342}, {0x3ac922e0d53a3b4e, 0xaaa4c42158564daf, 0x1359d8744b831fce, 0x6f1eb5f50a893a70, 0x290b2fffdf9f083e, 0x56212fe48636bb}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xd64d88142398fc70, 0x8cd791e2b175b8ad, 0x8cf816a594e65996, 0xdc15534f4bbc3e, 0x2ebd5f0fca9cb695, 0x2677728640635e3}, {0x8e859814dd48f154, 0x400b48d3d3fb2e17, 0x9e315059bbc401a9, 0x26c24fc85c0a4034, 0x2095f2ade3a1cc0e, 0x789dae43794796}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x55c5c814e95ff9e, 0x624aa7502d08f66d, 0xfaef96a43369b1b5, 0x6bd0164a386601da, 0xc4624eccbcab4884, 0x10154ec03218312}, {0x4fbfbe9e5f4e4beb, 0x1392132cc9a7a298, 0x87bee2902df2694c, 0x2fd70dedc82c836c, 0xb969a66833ea4330, 0xac80d610eac86e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x4668fbf6837118e1, 0xe3f7541cde4ef86b, 0x6222f4709df362fa, 0xfff04e39c27d3eeb, 0x950a899ed78c3ac4, 0x325b141dae45991}, {0xdcd302b823c975d7, 0x52a74513892de655, 0x71698b3599387e45, 0x190b468017eb95b1, 0x8d1e5211978b6ff3, 0x29dc08516c36f88}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x29ebd3656c338c34, 0x2bfcf65c705b22cb, 0xc34d5916fff804ae, 0x936fa5577596f777, 0x88bc262ea82314b1, 0x3cb841bc5ebf63f}, {0x1cd8d5a530a1914c, 0xaa47dc464b7fe567, 0xb2f6cfba20a12302, 0xbdec2a7f8ed5764a, 0x8d8caffb90342f7, 0x2bc600de26023a0}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xef90e01f16ec0b, 0xbe3b230014cdc8ca, 0x11d8068a91007c6a, 0xef60fc7a468eb46, 0x6ebe6eb84394eacc, 0xb27d0c0b9cc97e}, {0xfb44d144ffbc728, 0x35fed8aabb632fb0, 0xbce80df03ad44c4c, 0x94e973d6d612e79a, 0xf90b559988365d91, 0x1d8b3925fcef701}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xcf4ab671f3581670, 0xfe5bec2006b84191, 0x9c86c3022ef1c1dc, 0xca2fd261142cadc9, 0x615c338c784391f1, 0x220d6a5b67dc16c}, {0x827228cb3c97f27d, 0x62e6cbb0680bb491, 0x595f79839679df49, 0xb532dbc517c50a6e, 0x307360426131c2a7, 0x36d0c506b0ee9bf}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xa40cf5606210efd5, 0xe2a74bde914816ea, 0x3eaded7bce47ee4e, 0x5c13b2fc6d3f0e6f, 0x7c3d8e9de2169375, 0x1ff7fd7dbf97c03}, {0xc35492b3b8cb43e2, 0x3101d6730b5f0690, 0x18bb5b95ff4732ad, 0xc910043b50554bb7, 0xe157f6abd14ab159, 0x136ee8f2b5d364c}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x52706bfd8763b0c3, 0xa42c185c8aff91f3, 0x787da4c24686d040, 0xb481c545c5d853a3, 0xeff30a78ada95338, 0x42de7d5615621e}, {0x9c57da37895bac33, 0x151877b2e03774e0, 0x932f17a8d669aae8, 0xce9262ee9efce8c9, 0x31226e5e998455ab, 0x208b93fdae6a791}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x4668fbf6837118e1, 0xe3f7541cde4ef86b, 0x6222f4709df362fa, 0xfff04e39c27d3eeb, 0x950a899ed78c3ac4, 0x325b141dae45991}, {0xdcd302b823c975d7, 0x52a74513892de655, 0x71698b3599387e45, 0x190b468017eb95b1, 0x8d1e5211978b6ff3, 0x29dc08516c36f88}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x29ebd3656c338c34, 0x2bfcf65c705b22cb, 0xc34d5916fff804ae, 0x936fa5577596f777, 0x88bc262ea82314b1, 0x3cb841bc5ebf63f}, {0x1cd8d5a530a1914c, 0xaa47dc464b7fe567, 0xb2f6cfba20a12302, 0xbdec2a7f8ed5764a, 0x8d8caffb90342f7, 0x2bc600de26023a0}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xef90e01f16ec0b, 0xbe3b230014cdc8ca, 0x11d8068a91007c6a, 0xef60fc7a468eb46, 0x6ebe6eb84394eacc, 0xb27d0c0b9cc97e}, {0xfb44d144ffbc728, 0x35fed8aabb632fb0, 0xbce80df03ad44c4c, 0x94e973d6d612e79a, 0xf90b559988365d91, 0x1d8b3925fcef701}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0xbeb1828b6321b73b, 0x9b4ae33a51041b28, 0xb8eb52edec901458, 0x489f36189fbe40e2, 0x23b52fca75d8097a, 0x1fa77728850feb5}, {0x3c3181fa7491fa00, 0x90610c1cf4b08f0d, 0xc9a4e86e25007aa9, 0x5b71c5a9406460c7, 0xcc87c9e89706249a, 0x35c54d562e37057}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x4660c57fe78f45e1, 0x52046157833495f6, 0x3a046cb27e641924, 0x3d296d4fc4f86278, 0x53eab7beef1edc6b, 0x180b61ad44039e5}, {0x70a4e03a435a0a94, 0xf4446a3f06c86e3b, 0x83264cf9fe7b13b9, 0xded3fc0f6172e26, 0xc0ad14de5a337e74, 0x27cb876a7e80950}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xa6cb0f8ced1d3798, 0x7d2277dc624ef354, 0xed0fc61f3fcf514, 0x80d1db25eb940c0d, 0x5e0af0166b2e4f8f, 0x3a9eaad39577c49}, {0xe3b7bc63514ee9b3, 0x541be4cbdbf35256, 0x4ce81454a8ce471e, 0x97b4f5aca2ab4e14, 0x5e3ef1b3acf3da56, 0x1be60bf81366891}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x5f9bf9ad,0xbb06ce9,0xfa8d99f,0x233ed044,0xca4e87e8,0x56fc4a37,0x9c299dca,0xe1765919,0x70349f2,0x79d4edb8,0xf59fee35,0xd4522616,0xbe732b73,0x7105059c,0x9debc02b,0xd05ff129,0x9aaa0a69,0xa988470c,0x270}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x9ac24602,0x4dc4b4ca,0x81e54c48,0x8b5b7e0a,0x7e4689b7,0x54fafa8f,0x76fc905e,0xa68b466,0xec936ea2,0x32081752,0x320a003,0x5fbed8bc,0x73c03e0a,0x363af878,0xc25e288e,0xdaeeb565,0x793b880a,0x6e374f3b,0x92}}}}, {{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xb5e4ff8b,0x298b8708,0xd78a12b1,0xb76068cb,0x8235b439,0x24444322,0x144cbb26,0x67cecdf3,0x789a4c77,0xecfae4a0,0x81639e7e,0x510f096c,0xf672a6dc,0x5b7c8152,0x40ca824,0xaca11d30,0xda4bc8de,0x1775d1,0xa58}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xa0640653,0xf44f9316,0xf0572660,0x46bd96f1,0x8b141261,0xf557468e,0x41224bed,0x5aa5b58d,0xe023981f,0xfe62031d,0xcd7c8acd,0xebebd36d,0x92121ff9,0xdfcbeb42,0xa9d4e015,0xf67d889,0xc0dddc26,0x9018c1fb,0xa92}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xd8345359,0xd92d93b2,0x171d9b7d,0xdeefe04c,0xef487fd0,0x8949c82f,0x832679b,0x251d868f,0x4f09df6f,0x1b2c0e75,0x905de6b,0x96d80730,0xf6f33651,0x6341c0fb,0x8dd3ed57,0x6f492678,0xb032905d,0xb1ab8e5,0x160}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x5959eab0,0xc1579779,0xabc09e09,0xb2b24987,0x41cbc465,0xc42528f3,0x52b5800a,0x9aa2a793,0xba7d1b4d,0x104378e3,0x48fe062b,0x6ac167a5,0x7734e1fd,0xee4d5d61,0xa97812cc,0x69cbab4c,0x85fa4efc,0xb815af33,0xc3}}}}, {{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x8161a413,0x68610eff,0x270d05ea,0xa5898480,0xcd5eeec9,0x3613d511,0xbce9cbc9,0xcd73774e,0x8ed7995a,0x7b1a85cb,0xdeb665de,0xc9b2b79b,0xa86db14f,0xd55e5252,0xe5c2c3aa,0x5e0fbcf9,0x85adc2d7,0xf16e2b48,0x19b}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x27cbaca7,0x26d26c4d,0xe8e26482,0x8b0c86e9,0x661a1a78,0xc309c896,0xd519821c,0x16fe8817,0x981d02a3,0x5d0ae260,0xba169a98,0x2965f254,0x5992151c,0xed8f2fe3,0xb9ecb2e9,0x707ea33a,0xab555632,0x2e865022,0xba3}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xf8575e4b,0x5f3915d3,0xf49d327d,0x32f81206,0xb830032d,0x57bb8d08,0xa3faa63d,0x4bb031ce,0xa181d817,0x10566a23,0xa42db43c,0x8adfbca9,0x67b5c97c,0xd3e0a69b,0x82e0a039,0x5ea50eb8,0x4264dad8,0x1170d763,0x1a1}}}, {{._mp_alloc = 0, ._mp_size = 18, ._mp_d = (mp_limb_t[]) {0x8cf3cc3e,0x1ea2fe19,0x311a1b31,0x82ef85ef,0xda45dd53,0x49a76b4c,0x628dfd6a,0x960d85f1,0x5e12f0e9,0xa0a0cf21,0x1240169d,0xee8fb63d,0x12daaf8c,0x6d14802c,0x4a5b7027,0xd76fff7f,0x6a9508a9,0xe83dff1c}}}}, {{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xdf9f8c7c,0xc3e2dbf8,0x3b5d3533,0x89df39e9,0x7b1e3202,0x1c248bc5,0x134daa1e,0xee572977,0xd74d80b9,0x3467232a,0xc9cd152a,0xd2c52f03,0xcda9d887,0x3bf965cc,0x88dc690,0xdb959016,0x413aec1a,0xdd308321,0xb06}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x7a8a1b5,0xa0c6ea2c,0xb62cd82,0x3704552f,0x9d32971c,0xf49803bd,0x3951437a,0xf06bdcd8,0x45a509fa,0x67e086b2,0x1eeec4c7,0x355e3cdb,0xe8cf81f1,0x7cf04a43,0xc4e00007,0x8122bafa,0x19230bb7,0x283031a5,0xb62}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x5f9bf9ad,0xbb06ce9,0xfa8d99f,0x233ed044,0xca4e87e8,0x56fc4a37,0x9c299dca,0xe1765919,0x70349f2,0x79d4edb8,0xf59fee35,0xd4522616,0xbe732b73,0x7105059c,0x9debc02b,0xd05ff129,0x9aaa0a69,0xa988470c,0x270}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x9ac24602,0x4dc4b4ca,0x81e54c48,0x8b5b7e0a,0x7e4689b7,0x54fafa8f,0x76fc905e,0xa68b466,0xec936ea2,0x32081752,0x320a003,0x5fbed8bc,0x73c03e0a,0x363af878,0xc25e288e,0xdaeeb565,0x793b880a,0x6e374f3b,0x92}}}}, {{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xb5e4ff8b,0x298b8708,0xd78a12b1,0xb76068cb,0x8235b439,0x24444322,0x144cbb26,0x67cecdf3,0x789a4c77,0xecfae4a0,0x81639e7e,0x510f096c,0xf672a6dc,0x5b7c8152,0x40ca824,0xaca11d30,0xda4bc8de,0x1775d1,0xa58}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xa0640653,0xf44f9316,0xf0572660,0x46bd96f1,0x8b141261,0xf557468e,0x41224bed,0x5aa5b58d,0xe023981f,0xfe62031d,0xcd7c8acd,0xebebd36d,0x92121ff9,0xdfcbeb42,0xa9d4e015,0xf67d889,0xc0dddc26,0x9018c1fb,0xa92}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x1be82683,0x726f004e,0x13633a8e,0x36158be3,0x77cd101,0x164cd197,0xc0d3f78f,0x2157f727,0x9e9a05ba,0x69bf681,0xe0e122d2,0x95b41365,0x2f5d699,0x128bdbbc,0xb9c026e2,0x8fb870aa,0x533240ab,0xf722047d,0x869}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xfa0e1859,0x78e2621,0x16d2f529,0x9f06e3c9,0x6009270e,0x8c9011c1,0xe4d90834,0xd285adfc,0x538844f7,0x2125c81b,0xa60f5317,0xe5402030,0xf57a9003,0x92442aec,0x35eb1dad,0xa25d3059,0x7f9aeb83,0x13267f37,0xab}}}}, {{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x1ba351cf,0xc8f64b04,0xff4b8c4d,0x63732a40,0x527b9ea6,0xd355d47d,0x57413853,0x38af29f4,0xf74c63f2,0x70262da0,0x919b3eb0,0xed7fdd46,0x77b2d1cc,0x40d5e242,0x98c80608,0xf53c51ee,0x5dc0b922,0x95935511,0xc7b}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xe417d97d,0x8d90ffb1,0xec9cc571,0x33e6db52,0x4de5c948,0x3606bf2f,0x1c77f229,0x1ac4177f,0x488cdc58,0x719afa54,0xe23b5631,0x2a89e61e,0x4d8f74d4,0x3e451523,0x8e00795f,0x500f5908,0x855a5e4,0x427f048b,0x499}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xfc2baf26,0xaf9c8ae9,0x7a4e993e,0x4e7a3c9e,0x86c94ebb,0xd2078ee7,0xc0a347fa,0xc3e6203a,0xc4545d14,0xc446ad7c,0x33a5169f,0x258edb17,0x5c1d8a75,0x9258cbbd,0xe550a03d,0x1f366c35,0xcef660b4,0x2588f035,0x752}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xc679e61f,0x8f517f0c,0x988d0d98,0x7675f692,0x97d43bce,0x4afd7e09,0x1fecf391,0xe914ca4c,0xa29ce97d,0x8c6bdffb,0xeaae47d0,0x5766d7e0,0xb1affd7d,0x5ef2b885,0x490e0834,0xdb9be499,0x630e779c,0x10ef8412,0x682}}}}, {{{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x6fcfc63e,0xe1f16dfc,0x9dae9a99,0xf9edd08f,0xe8406625,0x343c0e45,0xf84cc9eb,0x15399c0e,0x5f3a3166,0xd64f0a00,0x4674c716,0xc9819444,0xf1791fa,0xc6652b56,0xa8273368,0x5daeace4,0xce616955,0xb68c614,0xc05}}}, {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0x3d450db,0x50637516,0x85b166c1,0x1b822a97,0xce994b8e,0x7a4c01de,0x1ca8a1bd,0x7835ee6c,0x22d284fd,0xb3f04359,0x8f776263,0x9aaf1e6d,0xf467c0f8,0xbe782521,0x62700003,0xc0915d7d,0x8c9185db,0x141818d2,0x5b1}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x91a55618,0xec100cb1,0x966d5d13,0xdd222570,0xdd080bd4,0x3bbe2a09,0xd1155f37,0x9e064654,0x14b8981d,0x8f5f39e7,0x3bacea39,0x14f33ec9}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xee14a05f,0x39f70b22,0x2e3bd1f8,0xe8a41510,0xe2b9c434,0xe01ffc70,0x1049ae2e,0x1f9f0a35,0x2daa0966,0x49314084,0x907d6e9e,0x7229561}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe0f6a744,0xd4bd4a03,0xcb47be44,0x814b692f,0x68038ab1,0x7a91716f,0x9d47771c,0x70e839c2,0xdb8e1dc1,0x66737444,0xc21e706,0x353d4594}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa4980387,0x37dda53d,0x78a00d4e,0x48b94d99,0xc524bcf4,0xc972bdca,0x51be3bd5,0x6d73b971,0x3a0d9f69,0x4c09060c,0xb15504e4,0x565ecf32}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8a511b5d,0x1483dd5d,0x8cbe3d75,0x9649d34,0x54096d97,0x5e4e3bb1,0x2ead9384,0x439d6dee,0x9c90cf8b,0x3f6faf44,0x2120f968,0x16631235}}}}}; -#elif 8*DIGIT_LEN == 64 -const ec_basis_t BASIS_EVEN = {{{{0x22e6355134b7d255, 0xa7f7f4f4597d08dc, 0xb8eb0e50d5888eec, 0xed36a84e0c7f72ba, 0xb6ed1c0b46f3f28e, 0x282153a62f4d1b8}, {0xd57efea74410a787, 0xea4460d69d71d250, 0xb3d9ad4193397a46, 0x3124b5b93ff1a081, 0x45a800b0c82d3709, 0x24b0e60e1353c61}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x17df8f9d274de7f, 0x351632cce83ec8aa, 0x56e019deae8daf7e, 0x3da35b5dc1820a3b, 0xbb60de7d759b75b1, 0x2e81949d5d0a4d9}, {0xa4efe85f225c5804, 0x9cbd9fc32e16b4f8, 0xa8be541ed7c20bbc, 0xe057875bd571d902, 0x35f5baf03dab21ff, 0x3493d2784699545}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xb37f8fba3f4420f8, 0x8d48f1acb03706df, 0x5f5d4860530ffdbc, 0x3346cb7307f4e98e, 0xebbd3a151d8187ef, 0x14e3e664b5f52b0}, {0xdab91da8f4656795, 0xdbdcf3c3108cac88, 0x272d467ca27bde21, 0x147ed2cd9dc73cf0, 0x67421707fd5d4d50, 0x1c9f704aa559bda}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0xdb68fd6ab36028ee, 0xb67ecbd22b247e6d, 0x3ddb4a10bff4a0, 0x31eccf041ed4eabc, 0x6c93b74e3dbd1615, 0xece18a8a69c342}, {0x3ac922e0d53a3b4e, 0xaaa4c42158564daf, 0x1359d8744b831fce, 0x6f1eb5f50a893a70, 0x290b2fffdf9f083e, 0x56212fe48636bb}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xd64d88142398fc70, 0x8cd791e2b175b8ad, 0x8cf816a594e65996, 0xdc15534f4bbc3e, 0x2ebd5f0fca9cb695, 0x2677728640635e3}, {0x8e859814dd48f154, 0x400b48d3d3fb2e17, 0x9e315059bbc401a9, 0x26c24fc85c0a4034, 0x2095f2ade3a1cc0e, 0x789dae43794796}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x55c5c814e95ff9e, 0x624aa7502d08f66d, 0xfaef96a43369b1b5, 0x6bd0164a386601da, 0xc4624eccbcab4884, 0x10154ec03218312}, {0x4fbfbe9e5f4e4beb, 0x1392132cc9a7a298, 0x87bee2902df2694c, 0x2fd70dedc82c836c, 0xb969a66833ea4330, 0xac80d610eac86e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x4668fbf6837118e1, 0xe3f7541cde4ef86b, 0x6222f4709df362fa, 0xfff04e39c27d3eeb, 0x950a899ed78c3ac4, 0x325b141dae45991}, {0xdcd302b823c975d7, 0x52a74513892de655, 0x71698b3599387e45, 0x190b468017eb95b1, 0x8d1e5211978b6ff3, 0x29dc08516c36f88}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x29ebd3656c338c34, 0x2bfcf65c705b22cb, 0xc34d5916fff804ae, 0x936fa5577596f777, 0x88bc262ea82314b1, 0x3cb841bc5ebf63f}, {0x1cd8d5a530a1914c, 0xaa47dc464b7fe567, 0xb2f6cfba20a12302, 0xbdec2a7f8ed5764a, 0x8d8caffb90342f7, 0x2bc600de26023a0}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xef90e01f16ec0b, 0xbe3b230014cdc8ca, 0x11d8068a91007c6a, 0xef60fc7a468eb46, 0x6ebe6eb84394eacc, 0xb27d0c0b9cc97e}, {0xfb44d144ffbc728, 0x35fed8aabb632fb0, 0xbce80df03ad44c4c, 0x94e973d6d612e79a, 0xf90b559988365d91, 0x1d8b3925fcef701}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xcf4ab671f3581670, 0xfe5bec2006b84191, 0x9c86c3022ef1c1dc, 0xca2fd261142cadc9, 0x615c338c784391f1, 0x220d6a5b67dc16c}, {0x827228cb3c97f27d, 0x62e6cbb0680bb491, 0x595f79839679df49, 0xb532dbc517c50a6e, 0x307360426131c2a7, 0x36d0c506b0ee9bf}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xa40cf5606210efd5, 0xe2a74bde914816ea, 0x3eaded7bce47ee4e, 0x5c13b2fc6d3f0e6f, 0x7c3d8e9de2169375, 0x1ff7fd7dbf97c03}, {0xc35492b3b8cb43e2, 0x3101d6730b5f0690, 0x18bb5b95ff4732ad, 0xc910043b50554bb7, 0xe157f6abd14ab159, 0x136ee8f2b5d364c}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x52706bfd8763b0c3, 0xa42c185c8aff91f3, 0x787da4c24686d040, 0xb481c545c5d853a3, 0xeff30a78ada95338, 0x42de7d5615621e}, {0x9c57da37895bac33, 0x151877b2e03774e0, 0x932f17a8d669aae8, 0xce9262ee9efce8c9, 0x31226e5e998455ab, 0x208b93fdae6a791}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x4668fbf6837118e1, 0xe3f7541cde4ef86b, 0x6222f4709df362fa, 0xfff04e39c27d3eeb, 0x950a899ed78c3ac4, 0x325b141dae45991}, {0xdcd302b823c975d7, 0x52a74513892de655, 0x71698b3599387e45, 0x190b468017eb95b1, 0x8d1e5211978b6ff3, 0x29dc08516c36f88}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x29ebd3656c338c34, 0x2bfcf65c705b22cb, 0xc34d5916fff804ae, 0x936fa5577596f777, 0x88bc262ea82314b1, 0x3cb841bc5ebf63f}, {0x1cd8d5a530a1914c, 0xaa47dc464b7fe567, 0xb2f6cfba20a12302, 0xbdec2a7f8ed5764a, 0x8d8caffb90342f7, 0x2bc600de26023a0}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xef90e01f16ec0b, 0xbe3b230014cdc8ca, 0x11d8068a91007c6a, 0xef60fc7a468eb46, 0x6ebe6eb84394eacc, 0xb27d0c0b9cc97e}, {0xfb44d144ffbc728, 0x35fed8aabb632fb0, 0xbce80df03ad44c4c, 0x94e973d6d612e79a, 0xf90b559988365d91, 0x1d8b3925fcef701}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0xbeb1828b6321b73b, 0x9b4ae33a51041b28, 0xb8eb52edec901458, 0x489f36189fbe40e2, 0x23b52fca75d8097a, 0x1fa77728850feb5}, {0x3c3181fa7491fa00, 0x90610c1cf4b08f0d, 0xc9a4e86e25007aa9, 0x5b71c5a9406460c7, 0xcc87c9e89706249a, 0x35c54d562e37057}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x4660c57fe78f45e1, 0x52046157833495f6, 0x3a046cb27e641924, 0x3d296d4fc4f86278, 0x53eab7beef1edc6b, 0x180b61ad44039e5}, {0x70a4e03a435a0a94, 0xf4446a3f06c86e3b, 0x83264cf9fe7b13b9, 0xded3fc0f6172e26, 0xc0ad14de5a337e74, 0x27cb876a7e80950}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xa6cb0f8ced1d3798, 0x7d2277dc624ef354, 0xed0fc61f3fcf514, 0x80d1db25eb940c0d, 0x5e0af0166b2e4f8f, 0x3a9eaad39577c49}, {0xe3b7bc63514ee9b3, 0x541be4cbdbf35256, 0x4ce81454a8ce471e, 0x97b4f5aca2ab4e14, 0x5e3ef1b3acf3da56, 0x1be60bf81366891}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xbb06ce95f9bf9ad,0x233ed0440fa8d99f,0x56fc4a37ca4e87e8,0xe17659199c299dca,0x79d4edb8070349f2,0xd4522616f59fee35,0x7105059cbe732b73,0xd05ff1299debc02b,0xa988470c9aaa0a69,0x270}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x4dc4b4ca9ac24602,0x8b5b7e0a81e54c48,0x54fafa8f7e4689b7,0xa68b46676fc905e,0x32081752ec936ea2,0x5fbed8bc0320a003,0x363af87873c03e0a,0xdaeeb565c25e288e,0x6e374f3b793b880a,0x92}}}}, {{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x298b8708b5e4ff8b,0xb76068cbd78a12b1,0x244443228235b439,0x67cecdf3144cbb26,0xecfae4a0789a4c77,0x510f096c81639e7e,0x5b7c8152f672a6dc,0xaca11d30040ca824,0x1775d1da4bc8de,0xa58}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xf44f9316a0640653,0x46bd96f1f0572660,0xf557468e8b141261,0x5aa5b58d41224bed,0xfe62031de023981f,0xebebd36dcd7c8acd,0xdfcbeb4292121ff9,0xf67d889a9d4e015,0x9018c1fbc0dddc26,0xa92}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xd92d93b2d8345359,0xdeefe04c171d9b7d,0x8949c82fef487fd0,0x251d868f0832679b,0x1b2c0e754f09df6f,0x96d807300905de6b,0x6341c0fbf6f33651,0x6f4926788dd3ed57,0xb1ab8e5b032905d,0x160}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xc15797795959eab0,0xb2b24987abc09e09,0xc42528f341cbc465,0x9aa2a79352b5800a,0x104378e3ba7d1b4d,0x6ac167a548fe062b,0xee4d5d617734e1fd,0x69cbab4ca97812cc,0xb815af3385fa4efc,0xc3}}}}, {{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x68610eff8161a413,0xa5898480270d05ea,0x3613d511cd5eeec9,0xcd73774ebce9cbc9,0x7b1a85cb8ed7995a,0xc9b2b79bdeb665de,0xd55e5252a86db14f,0x5e0fbcf9e5c2c3aa,0xf16e2b4885adc2d7,0x19b}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x26d26c4d27cbaca7,0x8b0c86e9e8e26482,0xc309c896661a1a78,0x16fe8817d519821c,0x5d0ae260981d02a3,0x2965f254ba169a98,0xed8f2fe35992151c,0x707ea33ab9ecb2e9,0x2e865022ab555632,0xba3}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x5f3915d3f8575e4b,0x32f81206f49d327d,0x57bb8d08b830032d,0x4bb031cea3faa63d,0x10566a23a181d817,0x8adfbca9a42db43c,0xd3e0a69b67b5c97c,0x5ea50eb882e0a039,0x1170d7634264dad8,0x1a1}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x1ea2fe198cf3cc3e,0x82ef85ef311a1b31,0x49a76b4cda45dd53,0x960d85f1628dfd6a,0xa0a0cf215e12f0e9,0xee8fb63d1240169d,0x6d14802c12daaf8c,0xd76fff7f4a5b7027,0xe83dff1c6a9508a9}}}}, {{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xc3e2dbf8df9f8c7c,0x89df39e93b5d3533,0x1c248bc57b1e3202,0xee572977134daa1e,0x3467232ad74d80b9,0xd2c52f03c9cd152a,0x3bf965cccda9d887,0xdb959016088dc690,0xdd308321413aec1a,0xb06}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xa0c6ea2c07a8a1b5,0x3704552f0b62cd82,0xf49803bd9d32971c,0xf06bdcd83951437a,0x67e086b245a509fa,0x355e3cdb1eeec4c7,0x7cf04a43e8cf81f1,0x8122bafac4e00007,0x283031a519230bb7,0xb62}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xbb06ce95f9bf9ad,0x233ed0440fa8d99f,0x56fc4a37ca4e87e8,0xe17659199c299dca,0x79d4edb8070349f2,0xd4522616f59fee35,0x7105059cbe732b73,0xd05ff1299debc02b,0xa988470c9aaa0a69,0x270}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x4dc4b4ca9ac24602,0x8b5b7e0a81e54c48,0x54fafa8f7e4689b7,0xa68b46676fc905e,0x32081752ec936ea2,0x5fbed8bc0320a003,0x363af87873c03e0a,0xdaeeb565c25e288e,0x6e374f3b793b880a,0x92}}}}, {{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x298b8708b5e4ff8b,0xb76068cbd78a12b1,0x244443228235b439,0x67cecdf3144cbb26,0xecfae4a0789a4c77,0x510f096c81639e7e,0x5b7c8152f672a6dc,0xaca11d30040ca824,0x1775d1da4bc8de,0xa58}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xf44f9316a0640653,0x46bd96f1f0572660,0xf557468e8b141261,0x5aa5b58d41224bed,0xfe62031de023981f,0xebebd36dcd7c8acd,0xdfcbeb4292121ff9,0xf67d889a9d4e015,0x9018c1fbc0dddc26,0xa92}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x726f004e1be82683,0x36158be313633a8e,0x164cd197077cd101,0x2157f727c0d3f78f,0x69bf6819e9a05ba,0x95b41365e0e122d2,0x128bdbbc02f5d699,0x8fb870aab9c026e2,0xf722047d533240ab,0x869}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x78e2621fa0e1859,0x9f06e3c916d2f529,0x8c9011c16009270e,0xd285adfce4d90834,0x2125c81b538844f7,0xe5402030a60f5317,0x92442aecf57a9003,0xa25d305935eb1dad,0x13267f377f9aeb83,0xab}}}}, {{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xc8f64b041ba351cf,0x63732a40ff4b8c4d,0xd355d47d527b9ea6,0x38af29f457413853,0x70262da0f74c63f2,0xed7fdd46919b3eb0,0x40d5e24277b2d1cc,0xf53c51ee98c80608,0x959355115dc0b922,0xc7b}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x8d90ffb1e417d97d,0x33e6db52ec9cc571,0x3606bf2f4de5c948,0x1ac4177f1c77f229,0x719afa54488cdc58,0x2a89e61ee23b5631,0x3e4515234d8f74d4,0x500f59088e00795f,0x427f048b0855a5e4,0x499}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xaf9c8ae9fc2baf26,0x4e7a3c9e7a4e993e,0xd2078ee786c94ebb,0xc3e6203ac0a347fa,0xc446ad7cc4545d14,0x258edb1733a5169f,0x9258cbbd5c1d8a75,0x1f366c35e550a03d,0x2588f035cef660b4,0x752}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x8f517f0cc679e61f,0x7675f692988d0d98,0x4afd7e0997d43bce,0xe914ca4c1fecf391,0x8c6bdffba29ce97d,0x5766d7e0eaae47d0,0x5ef2b885b1affd7d,0xdb9be499490e0834,0x10ef8412630e779c,0x682}}}}, {{{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xe1f16dfc6fcfc63e,0xf9edd08f9dae9a99,0x343c0e45e8406625,0x15399c0ef84cc9eb,0xd64f0a005f3a3166,0xc98194444674c716,0xc6652b560f1791fa,0x5daeace4a8273368,0xb68c614ce616955,0xc05}}}, {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x5063751603d450db,0x1b822a9785b166c1,0x7a4c01dece994b8e,0x7835ee6c1ca8a1bd,0xb3f0435922d284fd,0x9aaf1e6d8f776263,0xbe782521f467c0f8,0xc0915d7d62700003,0x141818d28c9185db,0x5b1}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xec100cb191a55618,0xdd222570966d5d13,0x3bbe2a09dd080bd4,0x9e064654d1155f37,0x8f5f39e714b8981d,0x14f33ec93bacea39}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x39f70b22ee14a05f,0xe8a415102e3bd1f8,0xe01ffc70e2b9c434,0x1f9f0a351049ae2e,0x493140842daa0966,0x7229561907d6e9e}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd4bd4a03e0f6a744,0x814b692fcb47be44,0x7a91716f68038ab1,0x70e839c29d47771c,0x66737444db8e1dc1,0x353d45940c21e706}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x37dda53da4980387,0x48b94d9978a00d4e,0xc972bdcac524bcf4,0x6d73b97151be3bd5,0x4c09060c3a0d9f69,0x565ecf32b15504e4}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1483dd5d8a511b5d,0x9649d348cbe3d75,0x5e4e3bb154096d97,0x439d6dee2ead9384,0x3f6faf449c90cf8b,0x166312352120f968}}}}}; +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} #endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x7e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1} +#elif RADIX == 32 +{0x1f8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1, 0x0, 0x0, 0x0, 0x0, 0x3f00000000000000} +#else +{0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x1196, 0x134b, 0xdbd, 0x118d, 0x712, 0x1646, 0x5d7, 0x8eb, 0x431, 0xf5b, 0x161e, 0x13b6, 0x1c07, 0x42, 0x8ba, 0xeec, 0x1a43, 0x545, 0x1cdb, 0x1659, 0x1614, 0xde, 0x72d, 0x1b80, 0x1706, 0x15a3, 0x894, 0xd4a, 0x1b2f, 0x12} +#elif RADIX == 32 +{0x9a5c65a, 0xa31adbd, 0x7b231c4, 0xc51d65d, 0x1e7ad90, 0x1e76d6, 0x8ba0217, 0xe90ddd8, 0x3cdb2a2, 0xf5852cb, 0x72d06, 0xd1dc1b7, 0xa94894a, 0x14cbd} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x31c4a31adbd9a5c6, 0xe7ad90c51d65d7b2, 0x88ba021701e76d61, 0x2cb3cdb2a2e90ddd, 0xdc1b70072d06f585, 0x16eecbda94894ad1} +#else +{0x94635b7b34b8c, 0x431475975ec8c7, 0x380f3b6b0f3d6c, 0x2e90ddd88ba021, 0x5eb0a59679b654, 0x347706dc01cb41, 0xb7765ed4a44a5} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xa85, 0x10cc, 0x1ef, 0xb0b, 0x1082, 0x5be, 0xd14, 0x1100, 0x1a33, 0x174b, 0x181c, 0x83e, 0x1034, 0x18ba, 0x205, 0x1f39, 0x1e9, 0x1998, 0x130e, 0x801, 0xfeb, 0x698, 0xdf9, 0x6a5, 0x5b6, 0x2c8, 0x1283, 0xad9, 0x960, 0x1e} +#elif RADIX == 32 +{0x8662a17, 0x96161ef, 0x42df420, 0xce200d1, 0x1cba5e8, 0xd107d8, 0x205c5d4, 0x7a7e72, 0x330eccc, 0xc3fad00, 0x4adf934, 0x6416d8d, 0x5b32831, 0x2f581} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf42096161ef8662a, 0xcba5e8ce200d142d, 0x2205c5d40d107d81, 0xd00330eccc07a7e7, 0x16d8d4adf934c3fa, 0x6065815b3283164} +#else +{0x412c2c3df0cc54, 0x2338803450b7d0, 0x206883ec0e5d2f, 0x407a7e72205c5d, 0x187f5a00661d99, 0x5905b6352b7e4d, 0x3032c0ad99418} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x16ed, 0x818, 0x127a, 0xcfb, 0x1be6, 0x1b40, 0x1bf1, 0xe75, 0x129c, 0x151, 0x425, 0x142e, 0x1edb, 0x254, 0x5cc, 0x1a5b, 0x1e1d, 0x1e27, 0x1a12, 0x8a8, 0x59e, 0x933, 0x1647, 0x686, 0x19e, 0x1e51, 0x151f, 0x1b6e, 0x1efe, 0xd} +#elif RADIX == 32 +{0x40c5bb5, 0x99f727a, 0x1da06f9, 0x71cebbf, 0x250a8ca, 0xb6e85c4, 0x5cc12a7, 0xf8774b6, 0x1a12f13, 0x9967915, 0xd64749, 0x288678d, 0x6dd51ff, 0x2ebfb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6f999f727a40c5b, 0x50a8ca71cebbf1da, 0x65cc12a7b6e85c42, 0x9151a12f13f8774b, 0x8678d0d647499967, 0x2e23bfb6dd51ff28} +#else +{0x7333ee4f4818b7, 0x29c73aefc7681b, 0x3db742e2128546, 0x3f8774b65cc12a, 0x332cf22a3425e2, 0x4a219e343591d2, 0x6d1dfdb6ea8ff} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x18a9, 0x1838, 0x1588, 0x1720, 0xf3f, 0x1fcd, 0x44d, 0x1e6b, 0x681, 0x1249, 0x1f8a, 0x5af, 0x1f58, 0x1c12, 0xf21, 0x1887, 0x278, 0x156a, 0xbfe, 0x765, 0x12f7, 0x4da, 0x16ce, 0x7c1, 0x1c04, 0x1773, 0x853, 0xab7, 0xe1d, 0x1a} +#elif RADIX == 32 +{0xc1c62a7, 0xee41588, 0xdfe6bcf, 0x7cd644, 0x8a9249a, 0xd60b5ff, 0xf21e097, 0x9e310e, 0xabfeab5, 0xd4bdcec, 0x836ce26, 0xb9f010f, 0x56e853b, 0x10875} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6bcfee41588c1c62, 0xa9249a07cd644dfe, 0xef21e097d60b5ff8, 0xcecabfeab509e310, 0xf010f836ce26d4bd, 0x2a7787556e853bb9} +#else +{0x1fdc82b11838c5, 0x681f359137f9af, 0x3eb05affc54924, 0x509e310ef21e09, 0x5a97b9d957fd56, 0x6e7c043e0db389, 0x4fbc3aab7429d} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1e36, 0x1718, 0xced, 0x186e, 0x83d, 0x1a23, 0xf5b, 0x5ca, 0x194d, 0x1bd8, 0xb67, 0x9f7, 0x1806, 0x17ae, 0x508, 0x117f, 0x5cc, 0x1809, 0x14b1, 0x85f, 0xcf0, 0x1b0c, 0x1753, 0x1484, 0xb5f, 0x1d62, 0x808, 0x1cc3, 0x844, 0x9} +#elif RADIX == 32 +{0xb8c78d9, 0x70dcced, 0xbd11a0f, 0x34b94f5, 0x67dec65, 0x193eeb, 0x508bd76, 0x97322fe, 0xf4b1c04, 0x633c10b, 0x9753d8, 0xb12d7e9, 0x986808e, 0x9113} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1a0f70dccedb8c78, 0x7dec6534b94f5bd1, 0xe508bd760193eeb6, 0x10bf4b1c0497322f, 0x2d7e909753d8633c, 0x3722113986808eb1} +#else +{0x1ee1b99db718f1, 0x14d2e53d6f4468, 0x300c9f75b3ef63, 0x497322fe508bd7, 0xc678217e96380, 0x2c4b5fa425d4f6, 0xb51089cc34047} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1785, 0x1652, 0x4b4, 0x1b37, 0x918, 0x12d, 0x1340, 0x16d3, 0xee, 0xb43, 0x52a, 0x1ff, 0x1e6b, 0x1424, 0x609, 0x1e2c, 0x19bd, 0x18f, 0x174a, 0x134d, 0x6f4, 0xa33, 0x1d5c, 0xa53, 0x73c, 0x361, 0x372, 0x1242, 0x87c, 0x17} +#elif RADIX == 32 +{0xb295e16, 0x366e4b4, 0x96a46, 0xbada734, 0x2a5a183, 0x9ac3fe5, 0x609a127, 0xe6f7c58, 0xb74a0c7, 0x99bd269, 0xa7d5c51, 0xb09cf14, 0x4843721, 0x381f2} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6a46366e4b4b295e, 0xa5a183bada734009, 0x8609a1279ac3fe52, 0x269b74a0c7e6f7c5, 0x9cf14a7d5c5199bd, 0x5ce1f24843721b0} +#else +{0xc6cdc969652bc, 0xeeb69cd0025a9, 0x3cd61ff2952d0c, 0x7e6f7c58609a12, 0x3337a4d36e9418, 0x6c273c529f5714, 0x2e70f92421b90} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x97d1,0x8f9c,0x8477,0x3a,0x39d2,0x66ae,0xabd6,0x13da,0xf153,0xb9e7,0xf8db,0x5f9f,0x36f7,0xfcb2,0xa4f0,0x62b9,0x5c07,0x3694,0x539d,0xe8c5,0x7631,0xf16c,0xc691,0x9a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8f9c97d1,0x3a8477,0x66ae39d2,0x13daabd6,0xb9e7f153,0x5f9ff8db,0xfcb236f7,0x62b9a4f0,0x36945c07,0xe8c5539d,0xf16c7631,0x9ac691}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x3a84778f9c97d1,0x13daabd666ae39d2,0x5f9ff8dbb9e7f153,0x62b9a4f0fcb236f7,0xe8c5539d36945c07,0x9ac691f16c7631}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1ac2,0xbac6,0x4a43,0x76df,0xe925,0x4a2d,0x1cf8,0xd32d,0x7867,0x1dc0,0xc02f,0xdf8b,0xf122,0x4f0c,0xe07d,0x4a9e,0xa97,0x7ce2,0x8791,0x3570,0x1749,0x519b,0x34cc,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbac61ac2,0x76df4a43,0x4a2de925,0xd32d1cf8,0x1dc07867,0xdf8bc02f,0x4f0cf122,0x4a9ee07d,0x7ce20a97,0x35708791,0x519b1749,0x6634cc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x76df4a43bac61ac2,0xd32d1cf84a2de925,0xdf8bc02f1dc07867,0x4a9ee07d4f0cf122,0x357087917ce20a97,0x6634cc519b1749}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xfb0f,0x234,0xa481,0x9c61,0x4bd1,0xcd58,0x3a72,0xe38c,0xbe7b,0xea3,0xf102,0xdc99,0xf180,0xb229,0x5d86,0xef91,0x46c4,0x8831,0xa9d5,0xf66f,0xa451,0x6c02,0x9ebd,0xfc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x234fb0f,0x9c61a481,0xcd584bd1,0xe38c3a72,0xea3be7b,0xdc99f102,0xb229f180,0xef915d86,0x883146c4,0xf66fa9d5,0x6c02a451,0xfc9ebd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c61a4810234fb0f,0xe38c3a72cd584bd1,0xdc99f1020ea3be7b,0xef915d86b229f180,0xf66fa9d5883146c4,0xfc9ebd6c02a451}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x682f,0x7063,0x7b88,0xffc5,0xc62d,0x9951,0x5429,0xec25,0xeac,0x4618,0x724,0xa060,0xc908,0x34d,0x5b0f,0x9d46,0xa3f8,0xc96b,0xac62,0x173a,0x89ce,0xe93,0x396e,0x65}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7063682f,0xffc57b88,0x9951c62d,0xec255429,0x46180eac,0xa0600724,0x34dc908,0x9d465b0f,0xc96ba3f8,0x173aac62,0xe9389ce,0x65396e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffc57b887063682f,0xec2554299951c62d,0xa060072446180eac,0x9d465b0f034dc908,0x173aac62c96ba3f8,0x65396e0e9389ce}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x6f75,0xc742,0x1abb,0xc3b2,0x4bff,0xf015,0x66b,0xc51b,0xacd6,0x30c2,0xf641,0x625b,0x2e88,0xbe5,0x5121,0xbe40,0x8ac2,0x755b,0xb8c9,0x4eb6,0xb07,0x46b6,0x84cf,0x47}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc7426f75,0xc3b21abb,0xf0154bff,0xc51b066b,0x30c2acd6,0x625bf641,0xbe52e88,0xbe405121,0x755b8ac2,0x4eb6b8c9,0x46b60b07,0x4784cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc3b21abbc7426f75,0xc51b066bf0154bff,0x625bf64130c2acd6,0xbe4051210be52e88,0x4eb6b8c9755b8ac2,0x4784cf46b60b07}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x9db8,0x479b,0xe350,0xae1e,0x4f92,0x6572,0x60a4,0x89ed,0x12f4,0xb88d,0x64b6,0xf9ca,0x26b,0xc086,0x83b8,0xb2c7,0x88a8,0xe99b,0x57b3,0x9017,0xe033,0x9d5d,0x5de6,0x37}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x479b9db8,0xae1ee350,0x65724f92,0x89ed60a4,0xb88d12f4,0xf9ca64b6,0xc086026b,0xb2c783b8,0xe99b88a8,0x901757b3,0x9d5de033,0x375de6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xae1ee350479b9db8,0x89ed60a465724f92,0xf9ca64b6b88d12f4,0xb2c783b8c086026b,0x901757b3e99b88a8,0x375de69d5de033}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x23f7,0x1d02,0x3431,0x354e,0xba31,0x23a4,0xe6c4,0x6a9c,0x64c,0xea8,0x419f,0xe54f,0x3cb9,0xc02d,0x3caf,0xe7a3,0x2d32,0x31d4,0xed80,0x47d9,0x2086,0x69f4,0x80d3,0x25}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1d0223f7,0x354e3431,0x23a4ba31,0x6a9ce6c4,0xea8064c,0xe54f419f,0xc02d3cb9,0xe7a33caf,0x31d42d32,0x47d9ed80,0x69f42086,0x2580d3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x354e34311d0223f7,0x6a9ce6c423a4ba31,0xe54f419f0ea8064c,0xe7a33cafc02d3cb9,0x47d9ed8031d42d32,0x2580d369f42086}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x908b,0x38bd,0xe544,0x3c4d,0xb400,0xfea,0xf994,0x3ae4,0x5329,0xcf3d,0x9be,0x9da4,0xd177,0xf41a,0xaede,0x41bf,0x753d,0x8aa4,0x4736,0xb149,0xf4f8,0xb949,0x7b30,0xb8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x38bd908b,0x3c4de544,0xfeab400,0x3ae4f994,0xcf3d5329,0x9da409be,0xf41ad177,0x41bfaede,0x8aa4753d,0xb1494736,0xb949f4f8,0xb87b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x3c4de54438bd908b,0x3ae4f9940feab400,0x9da409becf3d5329,0x41bfaedef41ad177,0xb14947368aa4753d,0xb87b30b949f4f8}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf28e,0x2e0a,0xfab7,0x1f58,0x11ea,0x243,0x39c3,0x28d4,0xe1ba,0x1878,0x3aec,0x4d87,0xf832,0x354a,0xa312,0x7416,0xb5b,0x68ee,0x1627,0x78d2,0xfbbc,0x152f,0x1cb2,0xd1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2e0af28e,0x1f58fab7,0x24311ea,0x28d439c3,0x1878e1ba,0x4d873aec,0x354af832,0x7416a312,0x68ee0b5b,0x78d21627,0x152ffbbc,0xd11cb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1f58fab72e0af28e,0x28d439c3024311ea,0x4d873aec1878e1ba,0x7416a312354af832,0x78d2162768ee0b5b,0xd11cb2152ffbbc}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3134,0x8876,0x4246,0xdd4b,0x87d0,0x86b1,0x71e8,0x2d33,0xfe04,0xe6d8,0x6377,0xf6d6,0xdd4f,0x8b91,0x29d4,0x521e,0x3822,0xa1d5,0x2eb9,0x8c9c,0x35a1,0xab9f,0x2d4c,0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x88763134,0xdd4b4246,0x86b187d0,0x2d3371e8,0xe6d8fe04,0xf6d66377,0x8b91dd4f,0x521e29d4,0xa1d53822,0x8c9c2eb9,0xab9f35a1,0x112d4c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdd4b424688763134,0x2d3371e886b187d0,0xf6d66377e6d8fe04,0x521e29d48b91dd4f,0x8c9c2eb9a1d53822,0x112d4cab9f35a1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x97d1,0x8f9c,0x8477,0x3a,0x39d2,0x66ae,0xabd6,0x13da,0xf153,0xb9e7,0xf8db,0x5f9f,0x36f7,0xfcb2,0xa4f0,0x62b9,0x5c07,0x3694,0x539d,0xe8c5,0x7631,0xf16c,0xc691,0x9a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8f9c97d1,0x3a8477,0x66ae39d2,0x13daabd6,0xb9e7f153,0x5f9ff8db,0xfcb236f7,0x62b9a4f0,0x36945c07,0xe8c5539d,0xf16c7631,0x9ac691}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x3a84778f9c97d1,0x13daabd666ae39d2,0x5f9ff8dbb9e7f153,0x62b9a4f0fcb236f7,0xe8c5539d36945c07,0x9ac691f16c7631}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1ac2,0xbac6,0x4a43,0x76df,0xe925,0x4a2d,0x1cf8,0xd32d,0x7867,0x1dc0,0xc02f,0xdf8b,0xf122,0x4f0c,0xe07d,0x4a9e,0xa97,0x7ce2,0x8791,0x3570,0x1749,0x519b,0x34cc,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbac61ac2,0x76df4a43,0x4a2de925,0xd32d1cf8,0x1dc07867,0xdf8bc02f,0x4f0cf122,0x4a9ee07d,0x7ce20a97,0x35708791,0x519b1749,0x6634cc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x76df4a43bac61ac2,0xd32d1cf84a2de925,0xdf8bc02f1dc07867,0x4a9ee07d4f0cf122,0x357087917ce20a97,0x6634cc519b1749}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xfb0f,0x234,0xa481,0x9c61,0x4bd1,0xcd58,0x3a72,0xe38c,0xbe7b,0xea3,0xf102,0xdc99,0xf180,0xb229,0x5d86,0xef91,0x46c4,0x8831,0xa9d5,0xf66f,0xa451,0x6c02,0x9ebd,0xfc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x234fb0f,0x9c61a481,0xcd584bd1,0xe38c3a72,0xea3be7b,0xdc99f102,0xb229f180,0xef915d86,0x883146c4,0xf66fa9d5,0x6c02a451,0xfc9ebd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c61a4810234fb0f,0xe38c3a72cd584bd1,0xdc99f1020ea3be7b,0xef915d86b229f180,0xf66fa9d5883146c4,0xfc9ebd6c02a451}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x682f,0x7063,0x7b88,0xffc5,0xc62d,0x9951,0x5429,0xec25,0xeac,0x4618,0x724,0xa060,0xc908,0x34d,0x5b0f,0x9d46,0xa3f8,0xc96b,0xac62,0x173a,0x89ce,0xe93,0x396e,0x65}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7063682f,0xffc57b88,0x9951c62d,0xec255429,0x46180eac,0xa0600724,0x34dc908,0x9d465b0f,0xc96ba3f8,0x173aac62,0xe9389ce,0x65396e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffc57b887063682f,0xec2554299951c62d,0xa060072446180eac,0x9d465b0f034dc908,0x173aac62c96ba3f8,0x65396e0e9389ce}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x83a3,0xab6f,0x4f99,0xe1f6,0xc2e8,0x2b61,0xd921,0xec7a,0x4f14,0x7555,0xf78e,0xe0fd,0xb2bf,0x44b,0xfb09,0x107c,0xf365,0x55f7,0x633,0x9bbe,0x409c,0x9c11,0x25b0,0xf1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xab6f83a3,0xe1f64f99,0x2b61c2e8,0xec7ad921,0x75554f14,0xe0fdf78e,0x44bb2bf,0x107cfb09,0x55f7f365,0x9bbe0633,0x9c11409c,0xf125b0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe1f64f99ab6f83a3,0xec7ad9212b61c2e8,0xe0fdf78e75554f14,0x107cfb09044bb2bf,0x9bbe063355f7f365,0xf125b09c11409c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xdc3d,0x130,0x16ca,0x127f,0x1c5c,0x57d0,0x3ece,0x2e8d,0xc5ae,0xeb26,0x1272,0x6cab,0x79c7,0x7c9,0x321b,0xfeb3,0xc99f,0xb33e,0xefa2,0x62c3,0x7bbe,0x777c,0xc959,0x4e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x130dc3d,0x127f16ca,0x57d01c5c,0x2e8d3ece,0xeb26c5ae,0x6cab1272,0x7c979c7,0xfeb3321b,0xb33ec99f,0x62c3efa2,0x777c7bbe,0x4ec959}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x127f16ca0130dc3d,0x2e8d3ece57d01c5c,0x6cab1272eb26c5ae,0xfeb3321b07c979c7,0x62c3efa2b33ec99f,0x4ec959777c7bbe}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8f83,0xf9b,0xec59,0x68d7,0x8301,0x787e,0x909b,0x2714,0xe264,0x8ea5,0x9950,0x60f4,0x971d,0x392b,0x4d1b,0xeb9a,0xb9fb,0xdd02,0xcbaa,0x1f24,0x626c,0x6afb,0xfc8,0x91}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf9b8f83,0x68d7ec59,0x787e8301,0x2714909b,0x8ea5e264,0x60f49950,0x392b971d,0xeb9a4d1b,0xdd02b9fb,0x1f24cbaa,0x6afb626c,0x910fc8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x68d7ec590f9b8f83,0x2714909b787e8301,0x60f499508ea5e264,0xeb9a4d1b392b971d,0x1f24cbaadd02b9fb,0x910fc86afb626c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7c5d,0x5490,0xb066,0x1e09,0x3d17,0xd49e,0x26de,0x1385,0xb0eb,0x8aaa,0x871,0x1f02,0x4d40,0xfbb4,0x4f6,0xef83,0xc9a,0xaa08,0xf9cc,0x6441,0xbf63,0x63ee,0xda4f,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x54907c5d,0x1e09b066,0xd49e3d17,0x138526de,0x8aaab0eb,0x1f020871,0xfbb44d40,0xef8304f6,0xaa080c9a,0x6441f9cc,0x63eebf63,0xeda4f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1e09b06654907c5d,0x138526ded49e3d17,0x1f0208718aaab0eb,0xef8304f6fbb44d40,0x6441f9ccaa080c9a,0xeda4f63eebf63}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7947,0x9705,0x7d5b,0xfac,0x88f5,0x8121,0x1ce1,0x146a,0x70dd,0xc3c,0x9d76,0x26c3,0x7c19,0x1aa5,0x5189,0xba0b,0x5ad,0xb477,0xb13,0x3c69,0xfdde,0xa97,0x8e59,0x68}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x97057947,0xfac7d5b,0x812188f5,0x146a1ce1,0xc3c70dd,0x26c39d76,0x1aa57c19,0xba0b5189,0xb47705ad,0x3c690b13,0xa97fdde,0x688e59}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfac7d5b97057947,0x146a1ce1812188f5,0x26c39d760c3c70dd,0xba0b51891aa57c19,0x3c690b13b47705ad,0x688e590a97fdde}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x189a,0x443b,0xa123,0x6ea5,0xc3e8,0x4358,0xb8f4,0x1699,0x7f02,0xf36c,0x31bb,0xfb6b,0xeea7,0x45c8,0x14ea,0x290f,0x9c11,0xd0ea,0x175c,0xc64e,0x9ad0,0x55cf,0x96a6,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x443b189a,0x6ea5a123,0x4358c3e8,0x1699b8f4,0xf36c7f02,0xfb6b31bb,0x45c8eea7,0x290f14ea,0xd0ea9c11,0xc64e175c,0x55cf9ad0,0x896a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6ea5a123443b189a,0x1699b8f44358c3e8,0xfb6b31bbf36c7f02,0x290f14ea45c8eea7,0xc64e175cd0ea9c11,0x896a655cf9ad0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x194c, 0x43, 0xc70, 0x1c7a, 0xa7a, 0xdf7, 0x1564, 0x1809, 0x8e8, 0x3a5, 0x1399, 0xf0a, 0x914, 0x1a27, 0xb1c, 0xcd0, 0xfc, 0xaa4, 0xd87, 0x1ed2, 0x2c0, 0x8e4, 0x1b93, 0x1a3f, 0x1d9b, 0x1a00, 0xbce, 0x17d2, 0x1a07, 0xf} +#elif RADIX == 32 +{0x21e531, 0xb8f4c70, 0x46fba9e, 0xa301356, 0x991d2a3, 0x451e153, 0xb1cd13a, 0x3f19a0, 0x4d87552, 0x20b03da, 0x7fb9347, 0x766f4, 0xfa4bced, 0x3d81e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xba9eb8f4c70021e5, 0x91d2a3a30135646f, 0xb1cd13a451e1539, 0x3da4d8755203f19a, 0x766f47fb934720b0, 0xcae81efa4bced00} +#else +{0x3d71e98e0043ca, 0xe8c04d591beea, 0x5228f0a9cc8e95, 0x203f19a0b1cd13, 0x641607b49b0eaa, 0x401d9bd1fee4d1, 0x65740f7d25e76} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1ed1, 0x10, 0x131c, 0x171e, 0x1a9e, 0x37d, 0xd59, 0x602, 0xa3a, 0x8e9, 0x14e6, 0x3c2, 0x1a45, 0x689, 0x2c7, 0x334, 0x3f, 0x1aa9, 0x1361, 0x7b4, 0xb0, 0x1a39, 0x1ee4, 0x1e8f, 0x766, 0x1680, 0x12f3, 0x1df4, 0x1e81, 0x4} +#elif RADIX == 32 +{0x87b44, 0xae3d31c, 0x91beea7, 0xe8c04d5, 0xe6474a8, 0x9147854, 0x2c7344e, 0x80fc668, 0x9361d54, 0xc82c0f6, 0x1fee4d1, 0x401d9bd, 0xbe92f3b, 0x27a07} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xeea7ae3d31c0087b, 0x6474a8e8c04d591b, 0x82c7344e9147854e, 0xf69361d5480fc66, 0x1d9bd1fee4d1c82c, 0x116ba07be92f3b40} +#else +{0x4f5c7a638010f6, 0x23a30135646fba, 0x748a3c2a7323a5, 0x480fc6682c7344, 0x390581ed26c3aa, 0x500766f47fb934, 0x8b5d03df4979d} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x187c, 0x10c9, 0xfda, 0x189b, 0x3b, 0xbcd, 0x16ab, 0xabe, 0x102, 0x19b7, 0x288, 0x1c7e, 0x1ee8, 0x452, 0x853, 0x1b5a, 0x1ca8, 0x1129, 0xd16, 0x168a, 0x1414, 0x6ed, 0xc0, 0xda2, 0x19ae, 0x12fe, 0x1813, 0xdd8, 0x102e, 0x1f} +#elif RADIX == 32 +{0x864e1f3, 0xf136fda, 0xb5e680e, 0x957d6a, 0x88cdb84, 0xba38fc2, 0x8532297, 0xf2a36b4, 0x4d16894, 0x6d052d1, 0x440c037, 0x7f66b9b, 0xbb18139, 0x390b9} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x680ef136fda864e1, 0x8cdb840957d6ab5e, 0x48532297ba38fc28, 0x2d14d16894f2a36b, 0x66b9b440c0376d05, 0x3dec0b9bb181397f} +#else +{0x1de26dfb50c9c3, 0x10255f5aad79a0, 0x3dd1c7e14466dc, 0x4f2a36b4853229, 0x6da0a5a29a2d12, 0x5fd9ae6d10300d, 0xeb605cdd8c09c} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1ca3, 0x16ad, 0x12b3, 0x9d7, 0xb37, 0x118b, 0xb22, 0x1662, 0xa8f, 0xd68, 0x6d5, 0x1a1f, 0x1f29, 0x632, 0x1b7e, 0xb6, 0xba7, 0xeca, 0x11ed, 0x13b, 0x18cc, 0x19a2, 0x77, 0x1582, 0x11ff, 0xc5f, 0x7de, 0x4b1, 0x1a7f, 0x18} +#elif RADIX == 32 +{0xb56f28f, 0xd3af2b3, 0x28c5acd, 0x3ecc4b2, 0xd56b42a, 0xca743e6, 0xb7e3197, 0x2e9c16d, 0x71ed765, 0x1633027, 0x4077cd, 0x2fc7feb, 0x9627de6, 0x39fc} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x5acdd3af2b3b56f2, 0x56b42a3ecc4b228c, 0xdb7e3197ca743e6d, 0x2771ed7652e9c16, 0xc7feb04077cd1633, 0x24529fc9627de62f} +#else +{0x1ba75e5676ade5, 0x28fb312c8a316b, 0x3e53a1f36ab5a1, 0x52e9c16db7e319, 0x22c6604ee3daec, 0xbf1ffac101df3, 0x1e94fe4b13ef3} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1f7a, 0x1a13, 0x11f4, 0xaeb, 0x997, 0x12d, 0x315, 0x1d7, 0x2fc, 0x736, 0x927, 0x350, 0x695, 0x14ac, 0x703, 0x1ec7, 0x1567, 0x1527, 0x7ee, 0x1a23, 0x11aa, 0x919, 0x130b, 0x199e, 0x137d, 0x795, 0x4e4, 0x1dc6, 0xa87, 0xd} +#elif RADIX == 32 +{0xd09fde9, 0xd5d71f4, 0x5096a65, 0xf03ae31, 0x2739b0b, 0xa546a09, 0x703a561, 0xd59fd8e, 0x67eea93, 0xcc6ab44, 0x3d30b48, 0xcacdf73, 0xb8c4e43, 0x29a1f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6a65d5d71f4d09fd, 0x739b0bf03ae31509, 0xe703a561a546a092, 0xb4467eea93d59fd8, 0xcdf733d30b48cc6a, 0x3b52a1fb8c4e43ca} +#else +{0x4babae3e9a13fb, 0x2fc0eb8c5425a9, 0xd2a3504939cd8, 0x3d59fd8e703a56, 0x198d5688cfdd52, 0x72b37dccf4c2d2, 0xd6950fdc62721} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xa54, 0x1685, 0x1b20, 0x1632, 0x1047, 0x159e, 0x14a0, 0x94c, 0x3c8, 0x793, 0x3a2, 0x1938, 0x1899, 0x15b7, 0xefa, 0xcc8, 0x12c3, 0x1335, 0x4ef, 0x1e93, 0x1861, 0x1602, 0x1d6c, 0x1ae7, 0x187, 0x18b1, 0x857, 0x8da, 0x12f7, 0xa} +#elif RADIX == 32 +{0xb42a951, 0xec65b20, 0xacf411, 0x212994a, 0xa23c98f, 0x2672703, 0xefaadbe, 0xcb0d990, 0x64ef99a, 0x16187d2, 0xcfd6cb0, 0x58861f5, 0x1b4857c, 0x13bdd} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf411ec65b20b42a9, 0x23c98f212994a0ac, 0xefaadbe2672703a, 0x7d264ef99acb0d99, 0x861f5cfd6cb01618, 0x14a4bdd1b4857c58} +#else +{0x23d8cb64168552, 0x3c84a65282b3d0, 0x71339381d11e4c, 0x2cb0d990efaadb, 0x2c30fa4c9df33, 0x162187d73f5b2c, 0xa525ee8da42be} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1e6b, 0x111, 0x74d, 0xb04, 0x738, 0x178f, 0xdc5, 0x835, 0x724, 0xaf9, 0xf3c, 0x1855, 0x266, 0x1b16, 0x1cf0, 0x1aa3, 0x32f, 0xce, 0x1f26, 0x16ba, 0x1cb6, 0x9b8, 0x12de, 0x1cef, 0x1a72, 0x1d68, 0xa02, 0x1c67, 0xa67, 0x13} +#elif RADIX == 32 +{0x88f9ae, 0x160874d, 0x5bc79ce, 0x9106adc, 0x3c57c9c, 0x99b0aaf, 0xcf0d8b0, 0xcbf547, 0x5f26067, 0xc72dad7, 0xdf2de4d, 0xb469cb9, 0x8cea02e, 0x1899f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x79ce160874d088f9, 0xc57c9c9106adc5bc, 0x7cf0d8b099b0aaf3, 0xad75f260670cbf54, 0x69cb9df2de4dc72d, 0x2c4699f8cea02eb4} +#else +{0x1c2c10e9a111f3, 0x72441ab716f1e7, 0x4cd85579e2be4, 0x70cbf547cf0d8b, 0x38e5b5aebe4c0c, 0x2d1a72e77cb793, 0x5e34cfc675017} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x12d6, 0x1c7a, 0x9bb, 0x1ce1, 0x1ca, 0xf3f, 0x1036, 0x19a6, 0x1c79, 0x5bf, 0x3, 0x1a92, 0x1d08, 0xeaa, 0x11e8, 0xab1, 0x1ed2, 0x80c, 0x10c9, 0x1517, 0xc18, 0x1513, 0x1dff, 0xc00, 0x16a0, 0x14ce, 0x72d, 0x1a86, 0xd45, 0x19} +#elif RADIX == 32 +{0xe3d4b5b, 0xb9c29bb, 0x679f872, 0xe734d03, 0x32dff1, 0x4235240, 0x1e87557, 0x7b49563, 0xf0c9406, 0x9b062a2, 0x1dffa8, 0x675a818, 0x50c72da, 0x8517} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf872b9c29bbe3d4b, 0x32dff1e734d03679, 0x31e8755742352400, 0x2a2f0c94067b4956, 0x5a81801dffa89b06, 0x172351750c72da67} +#else +{0x657385377c7a96, 0x479cd340d9e7e1, 0x3a11a9200196ff, 0x67b495631e8755, 0x1360c545e19280, 0x19d6a060077fea, 0xb91a8ba86396d} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8d4f,0xfa2a,0xd4d0,0xce2,0x7436,0x8079,0xbe5f,0x2c18,0x5699,0x3569,0x7ecd,0xe106,0xea0,0x7d91,0xcc95,0x7293,0x5f1d,0xd812,0xb900,0x9858,0xd95a,0xc80e,0x1d4a,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xfa2a8d4f,0xce2d4d0,0x80797436,0x2c18be5f,0x35695699,0xe1067ecd,0x7d910ea0,0x7293cc95,0xd8125f1d,0x9858b900,0xc80ed95a,0xa1d4a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xce2d4d0fa2a8d4f,0x2c18be5f80797436,0xe1067ecd35695699,0x7293cc957d910ea0,0x9858b900d8125f1d,0xa1d4ac80ed95a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1eca,0x7027,0xf189,0x93f2,0x1c1f,0x5a6f,0xabbc,0x9e7d,0xa00a,0xc45,0x62a8,0x8db0,0x70cd,0x413f,0x400a,0xffaa,0x2ae6,0xd8a8,0xcb0e,0x69c4,0x7d9a,0x7a25,0xa679,0xad}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x70271eca,0x93f2f189,0x5a6f1c1f,0x9e7dabbc,0xc45a00a,0x8db062a8,0x413f70cd,0xffaa400a,0xd8a82ae6,0x69c4cb0e,0x7a257d9a,0xada679}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x93f2f18970271eca,0x9e7dabbc5a6f1c1f,0x8db062a80c45a00a,0xffaa400a413f70cd,0x69c4cb0ed8a82ae6,0xada6797a257d9a}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8949,0xfec5,0x9be5,0xc657,0xab10,0x2df6,0x3ee,0xc0f7,0x1a64,0x328e,0x3b3,0xb50c,0x650a,0xa23d,0x8ab,0xb103,0xf6e6,0xb27d,0x708a,0xc702,0x5301,0x2f00,0x9991,0x2f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xfec58949,0xc6579be5,0x2df6ab10,0xc0f703ee,0x328e1a64,0xb50c03b3,0xa23d650a,0xb10308ab,0xb27df6e6,0xc702708a,0x2f005301,0x2f9991}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc6579be5fec58949,0xc0f703ee2df6ab10,0xb50c03b3328e1a64,0xb10308aba23d650a,0xc702708ab27df6e6,0x2f99912f005301}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x72b1,0x5d5,0x2b2f,0xf31d,0x8bc9,0x7f86,0x41a0,0xd3e7,0xa966,0xca96,0x8132,0x1ef9,0xf15f,0x826e,0x336a,0x8d6c,0xa0e2,0x27ed,0x46ff,0x67a7,0x26a5,0x37f1,0xe2b5,0xf5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5d572b1,0xf31d2b2f,0x7f868bc9,0xd3e741a0,0xca96a966,0x1ef98132,0x826ef15f,0x8d6c336a,0x27eda0e2,0x67a746ff,0x37f126a5,0xf5e2b5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf31d2b2f05d572b1,0xd3e741a07f868bc9,0x1ef98132ca96a966,0x8d6c336a826ef15f,0x67a746ff27eda0e2,0xf5e2b537f126a5}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd72,0xd1f5,0x548,0xe0a7,0xee15,0xfdbc,0xc63c,0xd72b,0x1e45,0xe787,0xc513,0xb278,0x7cd,0xcab5,0x5ced,0x8be9,0xf4a4,0x9711,0xe9d8,0x872d,0x443,0xead0,0xe34d,0x2e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd1f50d72,0xe0a70548,0xfdbcee15,0xd72bc63c,0xe7871e45,0xb278c513,0xcab507cd,0x8be95ced,0x9711f4a4,0x872de9d8,0xead00443,0x2ee34d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe0a70548d1f50d72,0xd72bc63cfdbcee15,0xb278c513e7871e45,0x8be95cedcab507cd,0x872de9d89711f4a4,0x2ee34dead00443}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcecc,0x7789,0xbdb9,0x22b4,0x782f,0x794e,0x8e17,0xd2cc,0x1fb,0x1927,0x9c88,0x929,0x22b0,0x746e,0xd62b,0xade1,0xc7dd,0x5e2a,0xd146,0x7363,0xca5e,0x5460,0xd2b3,0xee}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7789cecc,0x22b4bdb9,0x794e782f,0xd2cc8e17,0x192701fb,0x9299c88,0x746e22b0,0xade1d62b,0x5e2ac7dd,0x7363d146,0x5460ca5e,0xeed2b3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x22b4bdb97789cecc,0xd2cc8e17794e782f,0x9299c88192701fb,0xade1d62b746e22b0,0x7363d1465e2ac7dd,0xeed2b35460ca5e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1ebb,0xe120,0x35fc,0x20e3,0xba01,0xff68,0x2ef4,0x62f6,0x5e93,0x94c1,0x3f93,0x804c,0xddc5,0x5b3d,0x1d31,0xf673,0x6e47,0x3d32,0x242c,0x6f7e,0x764b,0x63cb,0xbf4,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe1201ebb,0x20e335fc,0xff68ba01,0x62f62ef4,0x94c15e93,0x804c3f93,0x5b3dddc5,0xf6731d31,0x3d326e47,0x6f7e242c,0x63cb764b,0xf70bf4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x20e335fce1201ebb,0x62f62ef4ff68ba01,0x804c3f9394c15e93,0xf6731d315b3dddc5,0x6f7e242c3d326e47,0xf70bf463cb764b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe76c,0x34d0,0x684,0xee5,0x43c6,0x5a38,0x4bd5,0x2867,0xd3c5,0x2ee1,0xf790,0x18bf,0xbb64,0x3924,0x7d25,0xe0bc,0x913a,0x1355,0x50e9,0x7091,0x6724,0x21b2,0xc027,0xaa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x34d0e76c,0xee50684,0x5a3843c6,0x28674bd5,0x2ee1d3c5,0x18bff790,0x3924bb64,0xe0bc7d25,0x1355913a,0x709150e9,0x21b26724,0xaac027}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xee5068434d0e76c,0x28674bd55a3843c6,0x18bff7902ee1d3c5,0xe0bc7d253924bb64,0x709150e91355913a,0xaac02721b26724}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xbd01,0x45bb,0x58bc,0x8007,0xbf5b,0xfd7,0x440b,0x7f9,0x54ed,0xe5db,0x2ba9,0xcd7b,0xfc98,0x1314,0x1470,0x9e9b,0xca3,0x944c,0x73c6,0x4cc9,0xa757,0x45fe,0x8b40,0x46}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x45bbbd01,0x800758bc,0xfd7bf5b,0x7f9440b,0xe5db54ed,0xcd7b2ba9,0x1314fc98,0x9e9b1470,0x944c0ca3,0x4cc973c6,0x45fea757,0x468b40}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x800758bc45bbbd01,0x7f9440b0fd7bf5b,0xcd7b2ba9e5db54ed,0x9e9b14701314fc98,0x4cc973c6944c0ca3,0x468b4045fea757}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe145,0x1edf,0xca03,0xdf1c,0x45fe,0x97,0xd10b,0x9d09,0xa16c,0x6b3e,0xc06c,0x7fb3,0x223a,0xa4c2,0xe2ce,0x98c,0x91b8,0xc2cd,0xdbd3,0x9081,0x89b4,0x9c34,0xf40b,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1edfe145,0xdf1cca03,0x9745fe,0x9d09d10b,0x6b3ea16c,0x7fb3c06c,0xa4c2223a,0x98ce2ce,0xc2cd91b8,0x9081dbd3,0x9c3489b4,0x8f40b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdf1cca031edfe145,0x9d09d10b009745fe,0x7fb3c06c6b3ea16c,0x98ce2cea4c2223a,0x9081dbd3c2cd91b8,0x8f40b9c3489b4}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8d4f,0xfa2a,0xd4d0,0xce2,0x7436,0x8079,0xbe5f,0x2c18,0x5699,0x3569,0x7ecd,0xe106,0xea0,0x7d91,0xcc95,0x7293,0x5f1d,0xd812,0xb900,0x9858,0xd95a,0xc80e,0x1d4a,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xfa2a8d4f,0xce2d4d0,0x80797436,0x2c18be5f,0x35695699,0xe1067ecd,0x7d910ea0,0x7293cc95,0xd8125f1d,0x9858b900,0xc80ed95a,0xa1d4a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xce2d4d0fa2a8d4f,0x2c18be5f80797436,0xe1067ecd35695699,0x7293cc957d910ea0,0x9858b900d8125f1d,0xa1d4ac80ed95a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1eca,0x7027,0xf189,0x93f2,0x1c1f,0x5a6f,0xabbc,0x9e7d,0xa00a,0xc45,0x62a8,0x8db0,0x70cd,0x413f,0x400a,0xffaa,0x2ae6,0xd8a8,0xcb0e,0x69c4,0x7d9a,0x7a25,0xa679,0xad}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x70271eca,0x93f2f189,0x5a6f1c1f,0x9e7dabbc,0xc45a00a,0x8db062a8,0x413f70cd,0xffaa400a,0xd8a82ae6,0x69c4cb0e,0x7a257d9a,0xada679}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x93f2f18970271eca,0x9e7dabbc5a6f1c1f,0x8db062a80c45a00a,0xffaa400a413f70cd,0x69c4cb0ed8a82ae6,0xada6797a257d9a}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8949,0xfec5,0x9be5,0xc657,0xab10,0x2df6,0x3ee,0xc0f7,0x1a64,0x328e,0x3b3,0xb50c,0x650a,0xa23d,0x8ab,0xb103,0xf6e6,0xb27d,0x708a,0xc702,0x5301,0x2f00,0x9991,0x2f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xfec58949,0xc6579be5,0x2df6ab10,0xc0f703ee,0x328e1a64,0xb50c03b3,0xa23d650a,0xb10308ab,0xb27df6e6,0xc702708a,0x2f005301,0x2f9991}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc6579be5fec58949,0xc0f703ee2df6ab10,0xb50c03b3328e1a64,0xb10308aba23d650a,0xc702708ab27df6e6,0x2f99912f005301}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x72b1,0x5d5,0x2b2f,0xf31d,0x8bc9,0x7f86,0x41a0,0xd3e7,0xa966,0xca96,0x8132,0x1ef9,0xf15f,0x826e,0x336a,0x8d6c,0xa0e2,0x27ed,0x46ff,0x67a7,0x26a5,0x37f1,0xe2b5,0xf5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5d572b1,0xf31d2b2f,0x7f868bc9,0xd3e741a0,0xca96a966,0x1ef98132,0x826ef15f,0x8d6c336a,0x27eda0e2,0x67a746ff,0x37f126a5,0xf5e2b5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf31d2b2f05d572b1,0xd3e741a07f868bc9,0x1ef98132ca96a966,0x8d6c336a826ef15f,0x67a746ff27eda0e2,0xf5e2b537f126a5}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x86b9,0x68fa,0x82a4,0xf053,0x770a,0x7ede,0xe31e,0xeb95,0x8f22,0xf3c3,0x6289,0xd93c,0x83e6,0xe55a,0xae76,0x45f4,0xfa52,0x4b88,0xf4ec,0xc396,0x221,0xf568,0x71a6,0x97}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x68fa86b9,0xf05382a4,0x7ede770a,0xeb95e31e,0xf3c38f22,0xd93c6289,0xe55a83e6,0x45f4ae76,0x4b88fa52,0xc396f4ec,0xf5680221,0x9771a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf05382a468fa86b9,0xeb95e31e7ede770a,0xd93c6289f3c38f22,0x45f4ae76e55a83e6,0xc396f4ec4b88fa52,0x9771a6f5680221}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe766,0xbbc4,0x5edc,0x915a,0x3c17,0xbca7,0x470b,0xe966,0x80fd,0xc93,0xce44,0x494,0x1158,0xba37,0xeb15,0xd6f0,0x63ee,0x2f15,0xe8a3,0x39b1,0x652f,0xaa30,0x6959,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbbc4e766,0x915a5edc,0xbca73c17,0xe966470b,0xc9380fd,0x494ce44,0xba371158,0xd6f0eb15,0x2f1563ee,0x39b1e8a3,0xaa30652f,0xf76959}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x915a5edcbbc4e766,0xe966470bbca73c17,0x494ce440c9380fd,0xd6f0eb15ba371158,0x39b1e8a32f1563ee,0xf76959aa30652f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3e42,0x35b4,0xc315,0x4acc,0x7905,0x734e,0xe57,0x941d,0xcc00,0x9010,0x652,0x5679,0x1e7c,0x69d5,0x77f0,0x5936,0x9815,0xdc49,0xdbae,0x8415,0x2381,0x706d,0x1b55,0x35}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x35b43e42,0x4accc315,0x734e7905,0x941d0e57,0x9010cc00,0x56790652,0x69d51e7c,0x593677f0,0xdc499815,0x8415dbae,0x706d2381,0x351b55}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4accc31535b43e42,0x941d0e57734e7905,0x567906529010cc00,0x593677f069d51e7c,0x8415dbaedc499815,0x351b55706d2381}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x9f23,0x1f88,0x311a,0x8d4e,0x15a2,0x199f,0x997,0x8bcf,0xc7a0,0xc956,0x3de8,0x254b,0x1224,0x1a69,0x604a,0x9cb1,0xa8f7,0xc6ee,0x5903,0x65b8,0xe8a5,0xa271,0x7d6e,0xb3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1f889f23,0x8d4e311a,0x199f15a2,0x8bcf0997,0xc956c7a0,0x254b3de8,0x1a691224,0x9cb1604a,0xc6eea8f7,0x65b85903,0xa271e8a5,0xb37d6e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8d4e311a1f889f23,0x8bcf0997199f15a2,0x254b3de8c956c7a0,0x9cb1604a1a691224,0x65b85903c6eea8f7,0xb37d6ea271e8a5}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xfad4,0x9280,0x39ea,0xba3b,0xb12b,0x1c9c,0x5ffd,0x2c19,0x13bf,0x2145,0xaf34,0x30c1,0x70d8,0x27ea,0x6539,0xb50a,0x3106,0x3638,0x7fad,0xa5d2,0x912a,0xb0e6,0xb4a1,0xfd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9280fad4,0xba3b39ea,0x1c9cb12b,0x2c195ffd,0x214513bf,0x30c1af34,0x27ea70d8,0xb50a6539,0x36383106,0xa5d27fad,0xb0e6912a,0xfdb4a1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xba3b39ea9280fad4,0x2c195ffd1c9cb12b,0x30c1af34214513bf,0xb50a653927ea70d8,0xa5d27fad36383106,0xfdb4a1b0e6912a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc1be,0xca4b,0x3cea,0xb533,0x86fa,0x8cb1,0xf1a8,0x6be2,0x33ff,0x6fef,0xf9ad,0xa986,0xe183,0x962a,0x880f,0xa6c9,0x67ea,0x23b6,0x2451,0x7bea,0xdc7e,0x8f92,0xe4aa,0xca}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xca4bc1be,0xb5333cea,0x8cb186fa,0x6be2f1a8,0x6fef33ff,0xa986f9ad,0x962ae183,0xa6c9880f,0x23b667ea,0x7bea2451,0x8f92dc7e,0xcae4aa}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb5333ceaca4bc1be,0x6be2f1a88cb186fa,0xa986f9ad6fef33ff,0xa6c9880f962ae183,0x7bea245123b667ea,0xcae4aa8f92dc7e}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x9a9, 0x8c7, 0x119d, 0xada, 0x1d98, 0xc97, 0x1a31, 0xdc6, 0x192a, 0xf3c, 0x509, 0xc5b, 0xea7, 0x1eb9, 0x59d, 0x1e3c, 0x114b, 0x88, 0x5a9, 0x1154, 0x18c0, 0x11db, 0x1ba9, 0x3b8, 0x837, 0x18d0, 0x17eb, 0x211, 0x1aa7, 0x11} +#elif RADIX == 32 +{0x463a6a6, 0x15b519d, 0x164bf66, 0xa9b8da3, 0x979e64, 0xa9d8b65, 0x59df5cb, 0x452fc78, 0x85a9044, 0xde3022a, 0x71ba98e, 0x6820dc7, 0x4237ebc, 0xca9c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbf6615b519d463a6, 0x979e64a9b8da3164, 0x859df5cba9d8b650, 0x22a85a9044452fc7, 0x20dc771ba98ede30, 0x2a32a9c4237ebc68} +#else +{0x4c2b6a33a8c74d, 0x12a6e368c592fd, 0x5d4ec5b284bcf3, 0x4452fc7859df5c, 0x5bc604550b5208, 0x1a08371dc6ea63, 0x4d954e211bf5e} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1ae8, 0xa31, 0x1467, 0x2b6, 0x1f66, 0xb25, 0x168c, 0x1371, 0x64a, 0xbcf, 0x1942, 0x1b16, 0xba9, 0xfae, 0x167, 0x1f8f, 0x452, 0x822, 0x16a, 0x455, 0x1e30, 0xc76, 0x6ea, 0x18ee, 0x20d, 0x1e34, 0xdfa, 0x1884, 0x12a9, 0xd} +#elif RADIX == 32 +{0x518eba1, 0x856d467, 0xc592fd9, 0x2a6e368, 0x425e799, 0xea762d9, 0x1677d72, 0x114bf1e, 0xa16a411, 0xb78c08a, 0xdc6ea63, 0x1a08371, 0x108dfaf, 0x2baa7} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x2fd9856d467518eb, 0x25e7992a6e368c59, 0xe1677d72ea762d94, 0x8aa16a411114bf1, 0x8371dc6ea63b78c, 0x290caa7108dfaf1a} +#else +{0x330ada8cea31d7, 0x64a9b8da3164bf, 0x1753b16ca12f3c, 0x1114bf1e1677d7, 0x76f1811542d482, 0x46820dc771ba98, 0x4465538846fd7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x954, 0x49a, 0xee7, 0x1037, 0x171c, 0x81, 0x448, 0x76f, 0x1615, 0xefe, 0xe70, 0xc54, 0x3d4, 0xc30, 0x1aaf, 0x72c, 0x464, 0x7a7, 0x5b7, 0x1f2a, 0xa98, 0x8db, 0x1689, 0x1cc1, 0x11ae, 0x4bf, 0x1ddc, 0x1f93, 0x1b3e, 0xb} +#elif RADIX == 32 +{0x24d2551, 0x206eee7, 0x8040dc7, 0x54ede44, 0x7077f58, 0xf518a8e, 0xaaf6180, 0x9190e59, 0x45b73d3, 0xdaa63e5, 0x8368946, 0x5fc6bb9, 0xf27ddc2, 0x1dcfb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xdc7206eee724d25, 0x77f5854ede44804, 0x9aaf6180f518a8e7, 0x3e545b73d39190e5, 0xc6bb98368946daa6, 0x14aecfbf27ddc25f} +#else +{0xe40dddce49a4a, 0x6153b791201037, 0x7a8c547383bfa, 0x39190e59aaf618, 0x5b54c7ca8b6e7a, 0x17f1aee60da251, 0xa5767df93eee1} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xf14, 0xa31, 0x805, 0x19bd, 0x1b37, 0x5d5, 0x1211, 0x9c0, 0x557, 0x6b5, 0x1b2a, 0x775, 0x1a4f, 0x1d9, 0x520, 0x16be, 0x3d, 0x1cae, 0x4ca, 0x1a17, 0x1e64, 0x170b, 0x136, 0x1cd4, 0x150b, 0x1111, 0xf0b, 0x1af9, 0x3ce, 0x1c} +#elif RADIX == 32 +{0x518bc53, 0xf37a805, 0x12eaecd, 0x5d38121, 0x2a35a95, 0x93ceebb, 0x5200ece, 0xf6d7c, 0xe4cae57, 0x5f99342, 0xa8136b8, 0x88d42f9, 0x5f2f0b8, 0x1df3b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xaecdf37a805518bc, 0xa35a955d3812112e, 0xc5200ece93ceebb2, 0x342e4cae5700f6d7, 0xd42f9a8136b85f99, 0x1530f3b5f2f0b888} +#else +{0x1be6f500aa3178, 0x5574e04844babb, 0x749e775d951ad4, 0x700f6d7c5200ec, 0xbf32685c995ca, 0x22350be6a04dae, 0xa9879daf9785c} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1b6e, 0x5aa, 0x1bd9, 0x1e85, 0x1615, 0x1629, 0xb8b, 0x1066, 0x1532, 0x19ad, 0xe24, 0xcb8, 0x17fc, 0x2ab, 0x1726, 0x1ad5, 0x1c83, 0x1b32, 0x75e, 0x1794, 0x161d, 0x9c4, 0x11b6, 0x1c02, 0x14bb, 0x15d2, 0x10d5, 0x26b, 0x1765, 0x14} +#elif RADIX == 32 +{0x2d56dba, 0x7d0bbd9, 0xbb14d85, 0xca0ccb8, 0x24cd6d4, 0xff1970e, 0x726155d, 0x720f5ab, 0x875ed99, 0x25876f2, 0x51b64e, 0xe952ef8, 0x4d70d5a, 0x23d94} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x4d857d0bbd92d56d, 0x4cd6d4ca0ccb8bb1, 0xb726155dff1970e2, 0x6f2875ed99720f5a, 0x52ef8051b64e2587, 0x2f5dd944d70d5ae9} +#else +{0xafa177b25aadb, 0x5328332e2ec536, 0x6ff8cb871266b6, 0x1720f5ab726155, 0x44b0ede50ebdb3, 0x3a54bbe0146d93, 0x76eeca26b86ad} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x18aa, 0x459, 0x747, 0x401, 0x14be, 0x13ba, 0xafb, 0x1cb4, 0x636, 0xd10, 0x16ec, 0x1e6e, 0x1ee5, 0x1475, 0xf82, 0x1695, 0x1a54, 0xe4e, 0x1856, 0x459, 0x752, 0x1d56, 0x15a7, 0xde2, 0x158c, 0x623, 0x17, 0x10d9, 0x1156, 0x19} +#elif RADIX == 32 +{0x22ce2ab, 0x8802747, 0xb9dd52f, 0xdb968af, 0xec68818, 0xb97cdd6, 0xf82a3af, 0x6952d2a, 0x3856727, 0xb1d488b, 0xc55a7ea, 0x11d631b, 0x1b20173, 0x955a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xd52f880274722ce2, 0xc68818db968afb9d, 0xaf82a3afb97cdd6e, 0x88b38567276952d2, 0xd631bc55a7eab1d4, 0x2b7455a1b2017311} +#else +{0x5f1004e8e459c5, 0x636e5a2bee7754, 0x7dcbe6eb763440, 0x76952d2af82a3a, 0x563a911670ace4, 0x44758c6f1569fa, 0x57a2ad0d900b9} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1557, 0x1987, 0x65f, 0x1c20, 0x14ef, 0xb3b, 0xbbe, 0x19db, 0xc77, 0x566, 0x9ea, 0xcab, 0xafc, 0x1fda, 0xb44, 0x1fe6, 0x1af3, 0x1829, 0x2ef, 0xc23, 0x83d, 0x82c, 0x1fa8, 0x14b, 0xd6e, 0xde8, 0x260, 0x1019, 0x97a, 0x3} +#elif RADIX == 32 +{0xcc3d55c, 0xf84065f, 0xe59dd3b, 0xdf3b6bb, 0xea2b331, 0xbf19569, 0xb44fed2, 0xebcffcc, 0x62efc14, 0x620f584, 0x97fa841, 0xf435b82, 0x322606, 0x1a5ea} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xdd3bf84065fcc3d5, 0xa2b331df3b6bbe59, 0xcb44fed2bf19569e, 0x58462efc14ebcffc, 0x35b8297fa841620f, 0x17765ea0322606f4} +#else +{0x77f080cbf987aa, 0x477cedaef96774, 0x15f8cab4f51599, 0x4ebcffccb44fed, 0x2c41eb08c5df82, 0x3d0d6e0a5fea10, 0xbbb2f50191303} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xb02, 0xc60, 0x791, 0x1cf7, 0xc15, 0x125a, 0x1697, 0xca1, 0x327, 0x89f, 0xf64, 0xddf, 0xcb7, 0x1977, 0x29f, 0x100a, 0xdac, 0xc8, 0x1e16, 0x1c4e, 0xedf, 0x1ec0, 0x1ac0, 0x1bbd, 0x16ee, 0x106a, 0x35c, 0x11cc, 0xdde, 0x20} +#elif RADIX == 32 +{0x6302c0b, 0x79ee791, 0x792d305, 0x9d94369, 0x6444f8c, 0x2ddbbef, 0x29fcbbb, 0x36b2014, 0xde16064, 0x3b7f89, 0x7bac0f6, 0x355bbb7, 0x39835c8, 0x4077a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xd30579ee7916302c, 0x444f8c9d94369792, 0x429fcbbb2ddbbef6, 0xf89de1606436b201, 0x5bbb77bac0f603b7, 0x30b77a39835c835} +#else +{0xaf3dcf22c6058, 0x327650da5e4b4c, 0x596eddf7b2227c, 0x436b201429fcbb, 0x4076ff13bc2c0c, 0xd56eeddeeb03d, 0x185bbd1cc1ae4} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xb089,0xa64c,0xa5a7,0x17cc,0xe580,0xaa34,0x86e8,0x9328,0x2d1e,0x66ce,0x2dbc,0xd6e5,0x68f,0xaf97,0x8c7a,0xc341,0x4b41,0x4e1c,0xe0a3,0x580f,0xe796,0x8f21,0x8ad3,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa64cb089,0x17cca5a7,0xaa34e580,0x932886e8,0x66ce2d1e,0xd6e52dbc,0xaf97068f,0xc3418c7a,0x4e1c4b41,0x580fe0a3,0x8f21e796,0xf8ad3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x17cca5a7a64cb089,0x932886e8aa34e580,0xd6e52dbc66ce2d1e,0xc3418c7aaf97068f,0x580fe0a34e1c4b41,0xf8ad38f21e796}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xebe,0xec57,0xcd8c,0xef29,0xf13a,0xd391,0xa791,0x715c,0xe58e,0x194c,0xf950,0x5a37,0xdb9e,0xdab6,0x82c8,0x5cce,0x3197,0x339a,0xa700,0xad4,0xcd5b,0x91c1,0x5cff,0xb0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xec570ebe,0xef29cd8c,0xd391f13a,0x715ca791,0x194ce58e,0x5a37f950,0xdab6db9e,0x5cce82c8,0x339a3197,0xad4a700,0x91c1cd5b,0xb05cff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xef29cd8cec570ebe,0x715ca791d391f13a,0x5a37f950194ce58e,0x5cce82c8dab6db9e,0xad4a700339a3197,0xb05cff91c1cd5b}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3b4f,0x8fac,0x4b2c,0xc9a0,0x69a2,0xe4fa,0x3480,0xe41b,0x5801,0xd68b,0xa965,0x2f67,0x3134,0x7ac0,0x93a7,0x5352,0x9612,0x200e,0x33e6,0x44f,0xbca8,0x82f1,0xe411,0x4d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8fac3b4f,0xc9a04b2c,0xe4fa69a2,0xe41b3480,0xd68b5801,0x2f67a965,0x7ac03134,0x535293a7,0x200e9612,0x44f33e6,0x82f1bca8,0x4de411}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc9a04b2c8fac3b4f,0xe41b3480e4fa69a2,0x2f67a965d68b5801,0x535293a77ac03134,0x44f33e6200e9612,0x4de41182f1bca8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x4f77,0x59b3,0x5a58,0xe833,0x1a7f,0x55cb,0x7917,0x6cd7,0xd2e1,0x9931,0xd243,0x291a,0xf970,0x5068,0x7385,0x3cbe,0xb4be,0xb1e3,0x1f5c,0xa7f0,0x1869,0x70de,0x752c,0xf0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x59b34f77,0xe8335a58,0x55cb1a7f,0x6cd77917,0x9931d2e1,0x291ad243,0x5068f970,0x3cbe7385,0xb1e3b4be,0xa7f01f5c,0x70de1869,0xf0752c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe8335a5859b34f77,0x6cd7791755cb1a7f,0x291ad2439931d2e1,0x3cbe73855068f970,0xa7f01f5cb1e3b4be,0xf0752c70de1869}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf28e,0x2e0a,0xfab7,0x1f58,0x11ea,0x243,0x39c3,0x28d4,0xe1ba,0x1878,0x3aec,0x4d87,0xf832,0x354a,0xa312,0x7416,0xb5b,0x68ee,0x1627,0x78d2,0xfbbc,0x152f,0x1cb2,0xd1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2e0af28e,0x1f58fab7,0x24311ea,0x28d439c3,0x1878e1ba,0x4d873aec,0x354af832,0x7416a312,0x68ee0b5b,0x78d21627,0x152ffbbc,0xd11cb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1f58fab72e0af28e,0x28d439c3024311ea,0x4d873aec1878e1ba,0x7416a312354af832,0x78d2162768ee0b5b,0xd11cb2152ffbbc}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3134,0x8876,0x4246,0xdd4b,0x87d0,0x86b1,0x71e8,0x2d33,0xfe04,0xe6d8,0x6377,0xf6d6,0xdd4f,0x8b91,0x29d4,0x521e,0x3822,0xa1d5,0x2eb9,0x8c9c,0x35a1,0xab9f,0x2d4c,0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x88763134,0xdd4b4246,0x86b187d0,0x2d3371e8,0xe6d8fe04,0xf6d66377,0x8b91dd4f,0x521e29d4,0xa1d53822,0x8c9c2eb9,0xab9f35a1,0x112d4c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdd4b424688763134,0x2d3371e886b187d0,0xf6d66377e6d8fe04,0x521e29d48b91dd4f,0x8c9c2eb9a1d53822,0x112d4cab9f35a1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe463,0x3132,0x31,0xb872,0xdbee,0x1045,0x2b88,0x62c5,0xee3c,0xde5c,0xb179,0xa84f,0x18e5,0x355e,0x9a0f,0xbef8,0x783a,0x35b5,0x6d1c,0xaa31,0x3024,0xed81,0xa0f6,0x8a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3132e463,0xb8720031,0x1045dbee,0x62c52b88,0xde5cee3c,0xa84fb179,0x355e18e5,0xbef89a0f,0x35b5783a,0xaa316d1c,0xed813024,0x8aa0f6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb87200313132e463,0x62c52b881045dbee,0xa84fb179de5cee3c,0xbef89a0f355e18e5,0xaa316d1c35b5783a,0x8aa0f6ed813024}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcf24,0xdac2,0xe08b,0xd2f9,0x13a,0xf1f,0x9517,0xfa7c,0xa1c5,0x581e,0x4d0b,0x3e59,0x97cc,0x7506,0xee19,0xa48e,0xb1b0,0x50c2,0xb5a7,0x4b1d,0x2fcd,0xee68,0xab65,0x85}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdac2cf24,0xd2f9e08b,0xf1f013a,0xfa7c9517,0x581ea1c5,0x3e594d0b,0x750697cc,0xa48eee19,0x50c2b1b0,0x4b1db5a7,0xee682fcd,0x85ab65}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd2f9e08bdac2cf24,0xfa7c95170f1f013a,0x3e594d0b581ea1c5,0xa48eee19750697cc,0x4b1db5a750c2b1b0,0x85ab65ee682fcd}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8b69,0x7be5,0xdf28,0x9c91,0xf929,0x7c60,0x6c50,0x4f81,0x714a,0x59da,0x2741,0x3c71,0x223a,0x79bf,0x14bd,0xa26f,0xc787,0x606d,0xc74c,0xef81,0xd1c4,0x32a,0x55ff,0x6a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7be58b69,0x9c91df28,0x7c60f929,0x4f816c50,0x59da714a,0x3c712741,0x79bf223a,0xa26f14bd,0x606dc787,0xef81c74c,0x32ad1c4,0x6a55ff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c91df287be58b69,0x4f816c507c60f929,0x3c71274159da714a,0xa26f14bd79bf223a,0xef81c74c606dc787,0x6a55ff032ad1c4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1b9d,0xcecd,0xffce,0x478d,0x2411,0xefba,0xd477,0x9d3a,0x11c3,0x21a3,0x4e86,0x57b0,0xe71a,0xcaa1,0x65f0,0x4107,0x87c5,0xca4a,0x92e3,0x55ce,0xcfdb,0x127e,0x5f09,0x75}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecd1b9d,0x478dffce,0xefba2411,0x9d3ad477,0x21a311c3,0x57b04e86,0xcaa1e71a,0x410765f0,0xca4a87c5,0x55ce92e3,0x127ecfdb,0x755f09}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x478dffcececd1b9d,0x9d3ad477efba2411,0x57b04e8621a311c3,0x410765f0caa1e71a,0x55ce92e3ca4a87c5,0x755f09127ecfdb}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xb089,0xa64c,0xa5a7,0x17cc,0xe580,0xaa34,0x86e8,0x9328,0x2d1e,0x66ce,0x2dbc,0xd6e5,0x68f,0xaf97,0x8c7a,0xc341,0x4b41,0x4e1c,0xe0a3,0x580f,0xe796,0x8f21,0x8ad3,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa64cb089,0x17cca5a7,0xaa34e580,0x932886e8,0x66ce2d1e,0xd6e52dbc,0xaf97068f,0xc3418c7a,0x4e1c4b41,0x580fe0a3,0x8f21e796,0xf8ad3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x17cca5a7a64cb089,0x932886e8aa34e580,0xd6e52dbc66ce2d1e,0xc3418c7aaf97068f,0x580fe0a34e1c4b41,0xf8ad38f21e796}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xebe,0xec57,0xcd8c,0xef29,0xf13a,0xd391,0xa791,0x715c,0xe58e,0x194c,0xf950,0x5a37,0xdb9e,0xdab6,0x82c8,0x5cce,0x3197,0x339a,0xa700,0xad4,0xcd5b,0x91c1,0x5cff,0xb0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xec570ebe,0xef29cd8c,0xd391f13a,0x715ca791,0x194ce58e,0x5a37f950,0xdab6db9e,0x5cce82c8,0x339a3197,0xad4a700,0x91c1cd5b,0xb05cff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xef29cd8cec570ebe,0x715ca791d391f13a,0x5a37f950194ce58e,0x5cce82c8dab6db9e,0xad4a700339a3197,0xb05cff91c1cd5b}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3b4f,0x8fac,0x4b2c,0xc9a0,0x69a2,0xe4fa,0x3480,0xe41b,0x5801,0xd68b,0xa965,0x2f67,0x3134,0x7ac0,0x93a7,0x5352,0x9612,0x200e,0x33e6,0x44f,0xbca8,0x82f1,0xe411,0x4d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8fac3b4f,0xc9a04b2c,0xe4fa69a2,0xe41b3480,0xd68b5801,0x2f67a965,0x7ac03134,0x535293a7,0x200e9612,0x44f33e6,0x82f1bca8,0x4de411}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc9a04b2c8fac3b4f,0xe41b3480e4fa69a2,0x2f67a965d68b5801,0x535293a77ac03134,0x44f33e6200e9612,0x4de41182f1bca8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x4f77,0x59b3,0x5a58,0xe833,0x1a7f,0x55cb,0x7917,0x6cd7,0xd2e1,0x9931,0xd243,0x291a,0xf970,0x5068,0x7385,0x3cbe,0xb4be,0xb1e3,0x1f5c,0xa7f0,0x1869,0x70de,0x752c,0xf0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x59b34f77,0xe8335a58,0x55cb1a7f,0x6cd77917,0x9931d2e1,0x291ad243,0x5068f970,0x3cbe7385,0xb1e3b4be,0xa7f01f5c,0x70de1869,0xf0752c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe8335a5859b34f77,0x6cd7791755cb1a7f,0x291ad2439931d2e1,0x3cbe73855068f970,0xa7f01f5cb1e3b4be,0xf0752c70de1869}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7947,0x9705,0x7d5b,0xfac,0x88f5,0x8121,0x1ce1,0x146a,0x70dd,0xc3c,0x9d76,0x26c3,0x7c19,0x1aa5,0x5189,0xba0b,0x5ad,0xb477,0xb13,0x3c69,0xfdde,0xa97,0x8e59,0x68}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x97057947,0xfac7d5b,0x812188f5,0x146a1ce1,0xc3c70dd,0x26c39d76,0x1aa57c19,0xba0b5189,0xb47705ad,0x3c690b13,0xa97fdde,0x688e59}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfac7d5b97057947,0x146a1ce1812188f5,0x26c39d760c3c70dd,0xba0b51891aa57c19,0x3c690b13b47705ad,0x688e590a97fdde}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x189a,0x443b,0xa123,0x6ea5,0xc3e8,0x4358,0xb8f4,0x1699,0x7f02,0xf36c,0x31bb,0xfb6b,0xeea7,0x45c8,0x14ea,0x290f,0x9c11,0xd0ea,0x175c,0xc64e,0x9ad0,0x55cf,0x96a6,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x443b189a,0x6ea5a123,0x4358c3e8,0x1699b8f4,0xf36c7f02,0xfb6b31bb,0x45c8eea7,0x290f14ea,0xd0ea9c11,0xc64e175c,0x55cf9ad0,0x896a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6ea5a123443b189a,0x1699b8f44358c3e8,0xfb6b31bbf36c7f02,0x290f14ea45c8eea7,0xc64e175cd0ea9c11,0x896a655cf9ad0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd69f,0xa20a,0x2dbf,0x4897,0x3199,0xde89,0xe5f9,0x293e,0x826b,0xb67a,0x9878,0x508f,0x1cd5,0xbfc7,0xa6dc,0xa78c,0xa5a7,0xf717,0x2bd3,0x9a61,0x7d35,0xb772,0xba39,0x5d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa20ad69f,0x48972dbf,0xde893199,0x293ee5f9,0xb67a826b,0x508f9878,0xbfc71cd5,0xa78ca6dc,0xf717a5a7,0x9a612bd3,0xb7727d35,0x5dba39}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x48972dbfa20ad69f,0x293ee5f9de893199,0x508f9878b67a826b,0xa78ca6dcbfc71cd5,0x9a612bd3f717a5a7,0x5dba39b7727d35}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xeec1,0x1e36,0x61bb,0x9e9f,0xe1d8,0x9166,0x8a8e,0xb5cd,0xc787,0x4281,0xb7db,0xc5fe,0x29b,0x7038,0xad1a,0xdfb3,0x5d88,0xa643,0xce34,0xe9d5,0xfe7,0xc15c,0xb80f,0xbc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1e36eec1,0x9e9f61bb,0x9166e1d8,0xb5cd8a8e,0x4281c787,0xc5feb7db,0x7038029b,0xdfb3ad1a,0xa6435d88,0xe9d5ce34,0xc15c0fe7,0xbcb80f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9e9f61bb1e36eec1,0xb5cd8a8e9166e1d8,0xc5feb7db4281c787,0xdfb3ad1a7038029b,0xe9d5ce34a6435d88,0xbcb80fc15c0fe7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xb7ff,0xc2,0x2b8a,0x5a59,0xd318,0x52ca,0x9b64,0xad19,0x8df,0xc9b8,0x7b28,0x9d09,0xe309,0x9,0xfb09,0xcbb9,0x6a67,0x1137,0x707c,0xaa5,0xcdf5,0x3ffd,0xfb9e,0xb9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc2b7ff,0x5a592b8a,0x52cad318,0xad199b64,0xc9b808df,0x9d097b28,0x9e309,0xcbb9fb09,0x11376a67,0xaa5707c,0x3ffdcdf5,0xb9fb9e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x5a592b8a00c2b7ff,0xad199b6452cad318,0x9d097b28c9b808df,0xcbb9fb090009e309,0xaa5707c11376a67,0xb9fb9e3ffdcdf5}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x2961,0x5df5,0xd240,0xb768,0xce66,0x2176,0x1a06,0xd6c1,0x7d94,0x4985,0x6787,0xaf70,0xe32a,0x4038,0x5923,0x5873,0x5a58,0x8e8,0xd42c,0x659e,0x82ca,0x488d,0x45c6,0xa2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5df52961,0xb768d240,0x2176ce66,0xd6c11a06,0x49857d94,0xaf706787,0x4038e32a,0x58735923,0x8e85a58,0x659ed42c,0x488d82ca,0xa245c6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb768d2405df52961,0xd6c11a062176ce66,0xaf70678749857d94,0x587359234038e32a,0x659ed42c08e85a58,0xa245c6488d82ca}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0xccf, 0xad2, 0x1c72, 0x1f31, 0x155, 0xa3, 0x1062, 0xf6e, 0xe60, 0x87b, 0x1891, 0xb45, 0x1de8, 0x7f8, 0x18a6, 0x1e67, 0x988, 0x1887, 0xca7, 0x216, 0x1daa, 0x1aa5, 0xc3a, 0x11d3, 0x1282, 0x55d, 0x15fc, 0x1132, 0x1c5e, 0x8} +#elif RADIX == 32 +{0x569333d, 0x7e63c72, 0x2051855, 0x81edd06, 0x9143db9, 0x7a168b8, 0x8a63fc7, 0xa623ccf, 0xcca7c43, 0x2f6a842, 0xa6c3ad5, 0xaeca0a3, 0x2655fc2, 0x617a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x18557e63c7256933, 0x143db981edd06205, 0xf8a63fc77a168b89, 0x842cca7c43a623cc, 0xca0a3a6c3ad52f6a, 0xf8317a2655fc2ae} +#else +{0x2afcc78e4ad266, 0x6607b741881461, 0x3bd0b45c48a1ed, 0x3a623ccf8a63fc, 0x25ed5085994f88, 0x2bb2828e9b0eb5, 0x7c18bd132afe1} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x13b1, 0x12b4, 0xf1c, 0xfcc, 0x1855, 0x1028, 0x1418, 0x3db, 0x1b98, 0xa1e, 0xe24, 0x2d1, 0x77a, 0x11fe, 0x1e29, 0x799, 0x1a62, 0x1e21, 0x1329, 0x1085, 0xf6a, 0x16a9, 0x1b0e, 0x1474, 0xca0, 0x157, 0x157f, 0x144c, 0x1317, 0x1b} +#elif RADIX == 32 +{0x95a4ec7, 0x5f98f1c, 0x8814615, 0x607b741, 0x2450f6e, 0xde85a2e, 0xe298ff1, 0xe988f33, 0xb329f10, 0x4bdaa10, 0xe9b0eb5, 0xabb2828, 0x89957f0, 0x19c5e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x46155f98f1c95a4e, 0x450f6e607b741881, 0x3e298ff1de85a2e2, 0xa10b329f10e988f3, 0xb2828e9b0eb54bda, 0x32a0c5e89957f0ab} +#else +{0x2abf31e392b49d, 0x3981edd0620518, 0xef42d1712287b, 0xe988f33e298ff, 0x297b54216653e2, 0x2aeca0a3a6c3ad, 0x91062f44cabf8} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0xdd8, 0x13bc, 0x17ae, 0x83e, 0x10c6, 0x1a72, 0x270, 0x84, 0xb92, 0x431, 0x1fdf, 0x9cf, 0x2a9, 0x121d, 0x5d5, 0x1d9f, 0xa48, 0xec9, 0xcfc, 0x6ee, 0x1812, 0x66b, 0xed8, 0xf7, 0x117b, 0x1fb7, 0xc5, 0x1f00, 0x134f, 0x1f} +#elif RADIX == 32 +{0x9de3763, 0x907d7ae, 0xd39431, 0x4810827, 0xdf218ae, 0xaa539ff, 0x5d590e8, 0xa923b3e, 0xccfc764, 0x5e048dd, 0xeeed833, 0xdbc5ec1, 0xe000c5f, 0x39d3f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9431907d7ae9de37, 0xf218ae48108270d3, 0xe5d590e8aa539ffd, 0x8ddccfc764a923b3, 0xc5ec1eeed8335e04, 0x195cd3fe000c5fdb} +#else +{0x6320faf5d3bc6e, 0x39204209c34e50, 0x45529cffef90c5, 0x4a923b3e5d590e, 0x6bc091bb99f8ec, 0x76f17b07bbb60c, 0xcae69ff00062f} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xf36, 0x2c8, 0x1ab4, 0x17c1, 0x10be, 0x1a20, 0x1baf, 0x3ce, 0x1088, 0xd75, 0x1e25, 0x10f8, 0x3d2, 0x1b8, 0x9c7, 0x168, 0x44c, 0x372, 0xc50, 0x1d9a, 0x1b99, 0xab9, 0x8af, 0x657, 0xe84, 0xe1d, 0x1675, 0x47, 0x157e, 0xc} +#elif RADIX == 32 +{0x1643cd9, 0xaf83ab4, 0xfd1042f, 0x2079dba, 0x256bac2, 0xf4a1f1e, 0x9c70dc0, 0x11302d0, 0x4c501b9, 0xcee67b3, 0xae8af55, 0xeba10c, 0x8f6757, 0x245f8} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x42faf83ab41643c, 0x56bac22079dbafd1, 0x9c70dc0f4a1f1e2, 0x7b34c501b911302d, 0xba10cae8af55cee6, 0x373d5f808f67570e} +#else +{0x5f5f075682c879, 0x881e76ebf4410, 0x7a50f8f12b5d6, 0x111302d09c70dc, 0x39dccf6698a037, 0x43ae8432ba2bd5, 0xb5eafc047b3ab} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x4b0, 0x31c, 0x92f, 0xf0d, 0xbc1, 0x1e89, 0x4ce, 0x1480, 0xdee, 0x504, 0x970, 0x16c3, 0xcb6, 0xae7, 0x1147, 0x8c, 0xc2a, 0x1ff9, 0x7d8, 0xfe9, 0x1fb1, 0x748, 0x998, 0xb85, 0x1a8e, 0x19c7, 0x5f7, 0x103c, 0x12a4, 0xe} +#elif RADIX == 32 +{0x18e12c1, 0x5e1a92f, 0xef44af0, 0xba9004c, 0x7028237, 0x2dad869, 0x147573b, 0xb0a8119, 0x27d8ffc, 0x47ec5fd, 0xa9983a, 0xe3ea397, 0x785f7c, 0x33a92} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x4af05e1a92f18e12, 0x28237ba9004cef4, 0x9147573b2dad8697, 0x5fd27d8ffcb0a811, 0xea3970a9983a47ec, 0x3134a920785f7ce3} +#else +{0x60bc3525e31c25, 0x5eea40133bd12b, 0x596d6c34b81411, 0x4b0a8119147573, 0x48fd8bfa4fb1ff, 0x38fa8e5c2a660e, 0x85a54903c2fbe} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x15a9, 0x1ae1, 0x1dd2, 0xa61, 0x1259, 0xfad, 0xe49, 0x1f6d, 0xd9a, 0x1371, 0xee7, 0x1179, 0x1bcf, 0x876, 0x3ca, 0xf7c, 0x1192, 0x315, 0x916, 0x1aa5, 0x1ca9, 0x10cb, 0xe32, 0x18b9, 0xf58, 0x1932, 0x1cce, 0x1ba7, 0x1377, 0x6} +#elif RADIX == 32 +{0xd70d6a4, 0x54c3dd2, 0x97d6c96, 0x6bedae4, 0xe79b8b6, 0xf3e2f2e, 0x3ca43b6, 0xc649ef8, 0xa91618a, 0x5f2a754, 0x72e3286, 0x993d631, 0x74fccec, 0x34ddf} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6c9654c3dd2d70d6, 0x79b8b66bedae497d, 0x83ca43b6f3e2f2ee, 0x754a91618ac649ef, 0x3d63172e32865f2a, 0x29d8ddf74fccec99} +#else +{0x2ca987ba5ae1ad, 0x59afb6b925f5b2, 0x379f179773cdc5, 0x2c649ef83ca43b, 0x4be54ea9522c31, 0x264f58c5cb8ca1, 0x4ac6efba7e676} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1f79, 0xcad, 0x18f2, 0x1ba7, 0x1d14, 0x1fc6, 0x197d, 0x522, 0xab, 0x7bd, 0x57b, 0x1fbf, 0x12, 0xb50, 0x425, 0x1aa3, 0x1c8e, 0x11cf, 0x1c1b, 0x1774, 0x3fc, 0x36a, 0x148f, 0x1fd3, 0x608, 0x1711, 0x1142, 0xcfa, 0xd43, 0xd} +#elif RADIX == 32 +{0x656fde5, 0x374f8f2, 0xdfe3745, 0xaca4597, 0x7b3de82, 0x4bf7e5, 0x4255a80, 0xf23b546, 0x9c1b8e7, 0x50ff2ee, 0xa748f1b, 0x889823f, 0x9f5142b, 0x2a50d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3745374f8f2656fd, 0xb3de82aca4597dfe, 0x64255a8004bf7e57, 0x2ee9c1b8e7f23b54, 0x9823fa748f1b50ff, 0x3a4f50d9f5142b88} +#else +{0xa6e9f1e4cadfb, 0xab29165f7f8dd, 0x25fbf2bd9ef4, 0x7f23b5464255a8, 0x6a1fe5dd38371c, 0x622608fe9d23c6, 0xce7a86cfa8a15} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x14a, 0x1236, 0x839, 0xe2, 0xe2d, 0xe17, 0x1b8f, 0x18dd, 0xb20, 0xeb8, 0x1da9, 0xc53, 0x12e8, 0x146, 0x1b9b, 0x154, 0x1121, 0x1049, 0x105d, 0x631, 0xc9, 0xbe0, 0x8fa, 0xbc0, 0x34b, 0x178a, 0x77b, 0x2a7, 0x105b, 0x15} +#elif RADIX == 32 +{0x91b052a, 0x41c4839, 0xf70bb8b, 0x831bbb8, 0xa975c2c, 0xba18a7d, 0xb9b0a34, 0xc4842a9, 0x305d824, 0x324c6, 0x808fa5f, 0xc50d2d7, 0x54e77bb, 0x2a16c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbb8b41c483991b05, 0x975c2c831bbb8f70, 0x9b9b0a34ba18a7da, 0x4c6305d824c4842a, 0xd2d7808fa5f0032, 0xad416c54e77bbc5} +#else +{0x1683890732360a, 0x320c6eee3dc2ee, 0x25d0c53ed4bae1, 0x4c4842a9b9b0a3, 0x6006498c60bb04, 0x71434b5e023e97, 0x56a0b62a73bdd} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x4fff,0xe916,0xb451,0xaee,0xc580,0xfa2c,0xb766,0x199a,0xa8a0,0x36f2,0xaa1b,0x47dd,0xb34f,0x26f5,0xb1ba,0xc4c1,0xad4d,0xfcf8,0x21fd,0xf7a,0x2a36,0x4cd2,0x2b08,0x94}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe9164fff,0xaeeb451,0xfa2cc580,0x199ab766,0x36f2a8a0,0x47ddaa1b,0x26f5b34f,0xc4c1b1ba,0xfcf8ad4d,0xf7a21fd,0x4cd22a36,0x942b08}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xaeeb451e9164fff,0x199ab766fa2cc580,0x47ddaa1b36f2a8a0,0xc4c1b1ba26f5b34f,0xf7a21fdfcf8ad4d,0x942b084cd22a36}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf16e,0x5176,0xe09f,0xe2ae,0xa46d,0x6925,0xc9bd,0xbd66,0xdd5c,0x51ce,0xe98d,0x9ad3,0x6815,0x4476,0xbec8,0xa088,0x6799,0x1733,0xf164,0x1d16,0xc914,0x4af3,0x3b5b,0x84}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5176f16e,0xe2aee09f,0x6925a46d,0xbd66c9bd,0x51cedd5c,0x9ad3e98d,0x44766815,0xa088bec8,0x17336799,0x1d16f164,0x4af3c914,0x843b5b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe2aee09f5176f16e,0xbd66c9bd6925a46d,0x9ad3e98d51cedd5c,0xa088bec844766815,0x1d16f16417336799,0x843b5b4af3c914}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x22c1,0x4088,0xbc14,0x9620,0x7d53,0x77ec,0x89,0xda12,0x54df,0x3806,0xb925,0x6092,0xd1b4,0x59e3,0x3419,0x9617,0x9ae6,0x48a9,0xf008,0xb452,0x9756,0x35cb,0x9c5d,0x49}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x408822c1,0x9620bc14,0x77ec7d53,0xda120089,0x380654df,0x6092b925,0x59e3d1b4,0x96173419,0x48a99ae6,0xb452f008,0x35cb9756,0x499c5d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9620bc14408822c1,0xda12008977ec7d53,0x6092b925380654df,0x9617341959e3d1b4,0xb452f00848a99ae6,0x499c5d35cb9756}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xb001,0x16e9,0x4bae,0xf511,0x3a7f,0x5d3,0x4899,0xe665,0x575f,0xc90d,0x55e4,0xb822,0x4cb0,0xd90a,0x4e45,0x3b3e,0x52b2,0x307,0xde02,0xf085,0xd5c9,0xb32d,0xd4f7,0x6b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x16e9b001,0xf5114bae,0x5d33a7f,0xe6654899,0xc90d575f,0xb82255e4,0xd90a4cb0,0x3b3e4e45,0x30752b2,0xf085de02,0xb32dd5c9,0x6bd4f7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf5114bae16e9b001,0xe665489905d33a7f,0xb82255e4c90d575f,0x3b3e4e45d90a4cb0,0xf085de02030752b2,0x6bd4f7b32dd5c9}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf28e,0x2e0a,0xfab7,0x1f58,0x11ea,0x243,0x39c3,0x28d4,0xe1ba,0x1878,0x3aec,0x4d87,0xf832,0x354a,0xa312,0x7416,0xb5b,0x68ee,0x1627,0x78d2,0xfbbc,0x152f,0x1cb2,0xd1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2e0af28e,0x1f58fab7,0x24311ea,0x28d439c3,0x1878e1ba,0x4d873aec,0x354af832,0x7416a312,0x68ee0b5b,0x78d21627,0x152ffbbc,0xd11cb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1f58fab72e0af28e,0x28d439c3024311ea,0x4d873aec1878e1ba,0x7416a312354af832,0x78d2162768ee0b5b,0xd11cb2152ffbbc}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3134,0x8876,0x4246,0xdd4b,0x87d0,0x86b1,0x71e8,0x2d33,0xfe04,0xe6d8,0x6377,0xf6d6,0xdd4f,0x8b91,0x29d4,0x521e,0x3822,0xa1d5,0x2eb9,0x8c9c,0x35a1,0xab9f,0x2d4c,0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x88763134,0xdd4b4246,0x86b187d0,0x2d3371e8,0xe6d8fe04,0xf6d66377,0x8b91dd4f,0x521e29d4,0xa1d53822,0x8c9c2eb9,0xab9f35a1,0x112d4c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdd4b424688763134,0x2d3371e886b187d0,0xf6d66377e6d8fe04,0x521e29d48b91dd4f,0x8c9c2eb9a1d53822,0x112d4cab9f35a1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xafa5,0x4195,0xbb2d,0xdd24,0xa3ca,0xc678,0xf995,0x2ccb,0x5c3b,0xf9ff,0xd06,0x1f9b,0x926d,0x4e3b,0x2881,0x24f2,0xcf4c,0x8e9a,0xa38d,0x24cb,0xe8f2,0x28a1,0x581c,0xde}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4195afa5,0xdd24bb2d,0xc678a3ca,0x2ccbf995,0xf9ff5c3b,0x1f9b0d06,0x4e3b926d,0x24f22881,0x8e9acf4c,0x24cba38d,0x28a1e8f2,0xde581c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdd24bb2d4195afa5,0x2ccbf995c678a3ca,0x1f9b0d06f9ff5c3b,0x24f228814e3b926d,0x24cba38d8e9acf4c,0xde581c28a1e8f2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcd88,0x9cea,0x593c,0xb5a8,0x79c6,0xc07c,0x496f,0xfb85,0x5ac9,0x381c,0xf4f8,0xfa59,0xb7a3,0x5caa,0x24c2,0x67c8,0x31b3,0x7585,0xbe8a,0xb89f,0xa29f,0x6cd5,0xc156,0x25}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9ceacd88,0xb5a8593c,0xc07c79c6,0xfb85496f,0x381c5ac9,0xfa59f4f8,0x5caab7a3,0x67c824c2,0x758531b3,0xb89fbe8a,0x6cd5a29f,0x25c156}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb5a8593c9ceacd88,0xfb85496fc07c79c6,0xfa59f4f8381c5ac9,0x67c824c25caab7a3,0xb89fbe8a758531b3,0x25c1566cd5a29f}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x9627,0xd297,0x9200,0x73de,0xaa89,0xf44f,0x99c7,0x2d45,0xb1eb,0xab2b,0x4168,0x976f,0x1e88,0x7777,0x2f39,0x6648,0xc224,0xd5a1,0xb815,0x861b,0xf76f,0xb476,0x4123,0xbe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd2979627,0x73de9200,0xf44faa89,0x2d4599c7,0xab2bb1eb,0x976f4168,0x77771e88,0x66482f39,0xd5a1c224,0x861bb815,0xb476f76f,0xbe4123}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x73de9200d2979627,0x2d4599c7f44faa89,0x976f4168ab2bb1eb,0x66482f3977771e88,0x861bb815d5a1c224,0xbe4123b476f76f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x505b,0xbe6a,0x44d2,0x22db,0x5c35,0x3987,0x66a,0xd334,0xa3c4,0x600,0xf2f9,0xe064,0x6d92,0xb1c4,0xd77e,0xdb0d,0x30b3,0x7165,0x5c72,0xdb34,0x170d,0xd75e,0xa7e3,0x21}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbe6a505b,0x22db44d2,0x39875c35,0xd334066a,0x600a3c4,0xe064f2f9,0xb1c46d92,0xdb0dd77e,0x716530b3,0xdb345c72,0xd75e170d,0x21a7e3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x22db44d2be6a505b,0xd334066a39875c35,0xe064f2f90600a3c4,0xdb0dd77eb1c46d92,0xdb345c72716530b3,0x21a7e3d75e170d}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x4fff,0xe916,0xb451,0xaee,0xc580,0xfa2c,0xb766,0x199a,0xa8a0,0x36f2,0xaa1b,0x47dd,0xb34f,0x26f5,0xb1ba,0xc4c1,0xad4d,0xfcf8,0x21fd,0xf7a,0x2a36,0x4cd2,0x2b08,0x94}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe9164fff,0xaeeb451,0xfa2cc580,0x199ab766,0x36f2a8a0,0x47ddaa1b,0x26f5b34f,0xc4c1b1ba,0xfcf8ad4d,0xf7a21fd,0x4cd22a36,0x942b08}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xaeeb451e9164fff,0x199ab766fa2cc580,0x47ddaa1b36f2a8a0,0xc4c1b1ba26f5b34f,0xf7a21fdfcf8ad4d,0x942b084cd22a36}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf16e,0x5176,0xe09f,0xe2ae,0xa46d,0x6925,0xc9bd,0xbd66,0xdd5c,0x51ce,0xe98d,0x9ad3,0x6815,0x4476,0xbec8,0xa088,0x6799,0x1733,0xf164,0x1d16,0xc914,0x4af3,0x3b5b,0x84}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5176f16e,0xe2aee09f,0x6925a46d,0xbd66c9bd,0x51cedd5c,0x9ad3e98d,0x44766815,0xa088bec8,0x17336799,0x1d16f164,0x4af3c914,0x843b5b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe2aee09f5176f16e,0xbd66c9bd6925a46d,0x9ad3e98d51cedd5c,0xa088bec844766815,0x1d16f16417336799,0x843b5b4af3c914}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x22c1,0x4088,0xbc14,0x9620,0x7d53,0x77ec,0x89,0xda12,0x54df,0x3806,0xb925,0x6092,0xd1b4,0x59e3,0x3419,0x9617,0x9ae6,0x48a9,0xf008,0xb452,0x9756,0x35cb,0x9c5d,0x49}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x408822c1,0x9620bc14,0x77ec7d53,0xda120089,0x380654df,0x6092b925,0x59e3d1b4,0x96173419,0x48a99ae6,0xb452f008,0x35cb9756,0x499c5d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9620bc14408822c1,0xda12008977ec7d53,0x6092b925380654df,0x9617341959e3d1b4,0xb452f00848a99ae6,0x499c5d35cb9756}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xb001,0x16e9,0x4bae,0xf511,0x3a7f,0x5d3,0x4899,0xe665,0x575f,0xc90d,0x55e4,0xb822,0x4cb0,0xd90a,0x4e45,0x3b3e,0x52b2,0x307,0xde02,0xf085,0xd5c9,0xb32d,0xd4f7,0x6b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x16e9b001,0xf5114bae,0x5d33a7f,0xe6654899,0xc90d575f,0xb82255e4,0xd90a4cb0,0x3b3e4e45,0x30752b2,0xf085de02,0xb32dd5c9,0x6bd4f7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf5114bae16e9b001,0xe665489905d33a7f,0xb82255e4c90d575f,0x3b3e4e45d90a4cb0,0xf085de02030752b2,0x6bd4f7b32dd5c9}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7947,0x9705,0x7d5b,0xfac,0x88f5,0x8121,0x1ce1,0x146a,0x70dd,0xc3c,0x9d76,0x26c3,0x7c19,0x1aa5,0x5189,0xba0b,0x5ad,0xb477,0xb13,0x3c69,0xfdde,0xa97,0x8e59,0x68}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x97057947,0xfac7d5b,0x812188f5,0x146a1ce1,0xc3c70dd,0x26c39d76,0x1aa57c19,0xba0b5189,0xb47705ad,0x3c690b13,0xa97fdde,0x688e59}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfac7d5b97057947,0x146a1ce1812188f5,0x26c39d760c3c70dd,0xba0b51891aa57c19,0x3c690b13b47705ad,0x688e590a97fdde}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x189a,0x443b,0xa123,0x6ea5,0xc3e8,0x4358,0xb8f4,0x1699,0x7f02,0xf36c,0x31bb,0xfb6b,0xeea7,0x45c8,0x14ea,0x290f,0x9c11,0xd0ea,0x175c,0xc64e,0x9ad0,0x55cf,0x96a6,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x443b189a,0x6ea5a123,0x4358c3e8,0x1699b8f4,0xf36c7f02,0xfb6b31bb,0x45c8eea7,0x290f14ea,0xd0ea9c11,0xc64e175c,0x55cf9ad0,0x896a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6ea5a123443b189a,0x1699b8f44358c3e8,0xfb6b31bbf36c7f02,0x290f14ea45c8eea7,0xc64e175cd0ea9c11,0x896a655cf9ad0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x43c6,0x55d8,0x682a,0xc215,0x706e,0xac4c,0x5ce,0x1182,0x8b72,0x90e3,0xf04f,0x6a11,0xc345,0x3488,0x45b0,0x5d3f,0x556b,0x9896,0x7b20,0x8d46,0xa9e3,0x7b0c,0xd428,0xba}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x55d843c6,0xc215682a,0xac4c706e,0x118205ce,0x90e38b72,0x6a11f04f,0x3488c345,0x5d3f45b0,0x9896556b,0x8d467b20,0x7b0ca9e3,0xbad428}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc215682a55d843c6,0x118205ceac4c706e,0x6a11f04f90e38b72,0x5d3f45b03488c345,0x8d467b209896556b,0xbad4287b0ca9e3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x91a5,0xf9ad,0x243c,0xedb9,0xc4f5,0xce5f,0xd6d7,0x3592,0x40df,0xdead,0x1489,0xe297,0x55b1,0xee4d,0xda9d,0x9e1f,0x4a5c,0xd99a,0x6c6b,0xa585,0x62fc,0x4383,0xc1ad,0xc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf9ad91a5,0xedb9243c,0xce5fc4f5,0x3592d6d7,0xdead40df,0xe2971489,0xee4d55b1,0x9e1fda9d,0xd99a4a5c,0xa5856c6b,0x438362fc,0xc0c1ad}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xedb9243cf9ad91a5,0x3592d6d7ce5fc4f5,0xe2971489dead40df,0x9e1fda9dee4d55b1,0xa5856c6bd99a4a5c,0xc0c1ad438362fc}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf454,0x6191,0x2181,0x2fc4,0x66fb,0xc44f,0x7bb6,0x9b1c,0x99f,0xee09,0xb1a3,0xf8f9,0xf234,0x5151,0x595c,0x4e44,0xa80a,0x305c,0x9930,0x25f6,0x8e50,0xb812,0xff4d,0xb8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6191f454,0x2fc42181,0xc44f66fb,0x9b1c7bb6,0xee09099f,0xf8f9b1a3,0x5151f234,0x4e44595c,0x305ca80a,0x25f69930,0xb8128e50,0xb8ff4d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2fc421816191f454,0x9b1c7bb6c44f66fb,0xf8f9b1a3ee09099f,0x4e44595c5151f234,0x25f69930305ca80a,0xb8ff4db8128e50}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xbc3a,0xaa27,0x97d5,0x3dea,0x8f91,0x53b3,0xfa31,0xee7d,0x748d,0x6f1c,0xfb0,0x95ee,0x3cba,0xcb77,0xba4f,0xa2c0,0xaa94,0x6769,0x84df,0x72b9,0x561c,0x84f3,0x2bd7,0x45}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xaa27bc3a,0x3dea97d5,0x53b38f91,0xee7dfa31,0x6f1c748d,0x95ee0fb0,0xcb773cba,0xa2c0ba4f,0x6769aa94,0x72b984df,0x84f3561c,0x452bd7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x3dea97d5aa27bc3a,0xee7dfa3153b38f91,0x95ee0fb06f1c748d,0xa2c0ba4fcb773cba,0x72b984df6769aa94,0x452bd784f3561c}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x10c4, 0x1e1a, 0x1b68, 0xa71, 0xa1a, 0x1f60, 0xdda, 0xb59, 0x1bc0, 0x26c, 0x1325, 0x4cf, 0x1375, 0x10ef, 0x1702, 0x1eff, 0x171f, 0x467, 0xc1c, 0xf3b, 0xf74, 0x6fa, 0x177f, 0x911, 0x8bc, 0x16b7, 0x1022, 0xa5f, 0xa55, 0x9} +#elif RADIX == 32 +{0xf0d4311, 0x94e3b68, 0xafb0286, 0x16b2dd, 0x251366f, 0xdd499f3, 0x702877c, 0xdc7fdff, 0x6c1c233, 0xd3dd1e7, 0x2377f37, 0x5ba2f12, 0x4bf022b, 0x9955} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x28694e3b68f0d43, 0x51366f016b2ddafb, 0xf702877cdd499f32, 0x1e76c1c233dc7fdf, 0xa2f122377f37d3dd, 0x45a9554bf022b5b} +#else +{0xd29c76d1e1a86, 0x3c05acb76bec0a, 0x66ea4cf99289b3, 0x3dc7fdff702877, 0x7a7ba3ced83846, 0x56e8bc488ddfcd, 0x22d4aaa5f8115} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x14af, 0x786, 0xeda, 0x129c, 0x286, 0x17d8, 0xb76, 0x2d6, 0x6f0, 0x89b, 0x1cc9, 0x933, 0x1cdd, 0x143b, 0x1dc0, 0x1fbf, 0x1dc7, 0x119, 0x1b07, 0x3ce, 0x13dd, 0x19be, 0xddf, 0x244, 0x1a2f, 0x15ad, 0x1c08, 0xa97, 0xa95, 0x3} +#elif RADIX == 32 +{0x3c352bc, 0xa538eda, 0x6bec0a1, 0xc05acb7, 0xc944d9b, 0x375267c, 0xdc0a1df, 0xf71ff7f, 0xdb0708c, 0xf4f7479, 0x88ddfcd, 0xd6e8bc4, 0x52fc08a, 0x1aa55} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xc0a1a538eda3c352, 0x944d9bc05acb76be, 0xfdc0a1df375267cc, 0x479db0708cf71ff7, 0xe8bc488ddfcdf4f7, 0x2fd6a5552fc08ad6} +#else +{0x434a71db4786a5, 0x6f016b2ddafb02, 0x79ba933e64a26c, 0x4f71ff7fdc0a1d, 0x3e9ee8f3b60e11, 0x35ba2f122377f3, 0x7ab52aa97e045} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0xd3b, 0x1cbd, 0x1177, 0x1087, 0x5d2, 0x1535, 0x1cb5, 0x1372, 0x158a, 0x931, 0x12da, 0x1b9d, 0x44e, 0xa00, 0xb71, 0xe8a, 0x1c57, 0x1a1, 0x5bb, 0x1180, 0x15f0, 0x1ca3, 0x119b, 0x16cc, 0xd3a, 0xaa7, 0xbc3, 0x9fc, 0xb07, 0x1a} +#elif RADIX == 32 +{0xe5eb4ef, 0xa10f177, 0x5a9a974, 0x2a6e5cb, 0xda498d6, 0x13b73b2, 0xb715001, 0xf15dd14, 0x5bb0d0, 0x1d7c230, 0x9919be5, 0x53b4ead, 0x3f8bc35, 0xfc1d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xa974a10f177e5eb4, 0xa498d62a6e5cb5a9, 0x4b71500113b73b2d, 0x23005bb0d0f15dd1, 0xb4ead9919be51d7c, 0x3cbec1d3f8bc3553} +#else +{0x69421e2efcbd69, 0x58a9b972d6a6a5, 0x89db9d96d24c6, 0xf15dd14b71500, 0x23af84600b761a, 0x54ed3ab66466f9, 0xe1f60e9fc5e1a} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x186, 0x245, 0xa48, 0x11da, 0x1354, 0x9fc, 0x168f, 0xff7, 0x1f2c, 0x6a2, 0x6fb, 0x980, 0x164f, 0xbb8, 0x49c, 0x1ad1, 0x145f, 0x80a, 0xf93, 0x2d8, 0x1846, 0x43, 0x5a9, 0x3a, 0x72e, 0x1e10, 0x741, 0x783, 0x967, 0x1a} +#elif RADIX == 32 +{0x122861b, 0x23b4a48, 0xf4fe4d5, 0xb1fef68, 0xfb3517c, 0x93d3006, 0x49c5dc5, 0x517f5a2, 0xf93405, 0x1e1185b, 0x745a902, 0x81cb80, 0xf06741f, 0xf59c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe4d523b4a4812286, 0xb3517cb1fef68f4f, 0x249c5dc593d3006f, 0x85b0f93405517f5a, 0x1cb80745a9021e11, 0x6ea59cf06741f08} +#else +{0x2a47694902450c, 0x72c7fbda3d3f93, 0x2c9e98037d9a8b, 0x5517f5a249c5dc, 0x43c230b61f2680, 0x42072e01d16a40, 0x3752ce7833a0f} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1064, 0x8a7, 0x7c, 0x1876, 0xf16, 0x3a0, 0x124, 0x637, 0x11bf, 0x223, 0x6d, 0x58e, 0xcde, 0xaf, 0x99c, 0x1c62, 0xdcb, 0xe10, 0x7ba, 0x127f, 0x1a23, 0x69a, 0x7bd, 0x238, 0x455, 0x16ac, 0x1147, 0x12a, 0x14c1, 0x5} +#elif RADIX == 32 +{0x453c190, 0xb0ec07c, 0x41d03c5, 0xfcc6e12, 0x6d111c6, 0x378b1c0, 0x99c057b, 0x372f8c4, 0xe7ba708, 0xd688e4f, 0x707bd34, 0x5611544, 0x255147b, 0x2d304} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3c5b0ec07c453c1, 0xd111c6fcc6e1241d, 0x499c057b378b1c06, 0xe4fe7ba708372f8c, 0x11544707bd34d688, 0x24bd304255147b56} +#else +{0xb61d80f88a783, 0x1bf31b8490740f, 0x59bc58e036888e, 0x372f8c499c057, 0x1ad11c9fcf74e1, 0x55845511c1ef4d, 0x21e98212a8a3d} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xaab, 0x60b, 0x8a0, 0x15d7, 0xbd8, 0x3ab, 0x1641, 0x1771, 0x134a, 0x17a, 0x785, 0x624, 0x1d, 0x1c3d, 0xcb1, 0xb5e, 0x23f, 0xf53, 0x879, 0x5e2, 0x903, 0xaff, 0xf72, 0xa2d, 0x7f4, 0xeb8, 0xd96, 0x1715, 0xffa, 0xa} +#elif RADIX == 32 +{0x305aaad, 0x2bae8a0, 0x11d5af6, 0x2aee364, 0x850bd4d, 0x74c487, 0xcb1e1e8, 0x88fd6bc, 0x48797a9, 0xfa40cbc, 0x5af7257, 0x5c1fd14, 0xe2ad967, 0x12fea} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x5af62bae8a0305aa, 0x50bd4d2aee36411d, 0xccb1e1e8074c4878, 0xcbc48797a988fd6b, 0x1fd145af7257fa40, 0x2bfffeae2ad9675c} +#else +{0x6c575d14060b55, 0x34abb8d904756b, 0x403a6243c285ea, 0x188fd6bccb1e1e, 0x7f48197890f2f5, 0x5707f4516bdc95, 0x5bfff57156cb3} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x195c, 0x1d55, 0x99f, 0x11f, 0x106b, 0xab1, 0x3e7, 0x1e40, 0xa1e, 0xdf0, 0x1dd4, 0x5cd, 0xfc3, 0x1c99, 0xbfa, 0x1ead, 0x1f6, 0x12fa, 0x1465, 0xad7, 0x1a84, 0x18d8, 0x1b7f, 0x9fe, 0x14b1, 0x13b7, 0x189f, 0x12bc, 0xabc, 0x1f} +#elif RADIX == 32 +{0xeaae573, 0xc23e99f, 0x7558c1a, 0x7bc803e, 0xd46f828, 0xf0cb9bd, 0xbfae4cb, 0x7dbd5a, 0xf46597d, 0xc6a115a, 0xfdb7fc6, 0xdbd2c53, 0x57989f9, 0x37af2} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x8c1ac23e99feaae5, 0x46f8287bc803e755, 0xabfae4cbf0cb9bdd, 0x15af46597d07dbd5, 0xd2c53fdb7fc6c6a1, 0x1d6aaf257989f9db} +#else +{0x35847d33fd55ca, 0x21ef200f9d5630, 0x5f865cdeea37c1, 0x507dbd5abfae4c, 0x58d422b5e8cb2f, 0x76f4b14ff6dff1, 0xeb55792bcc4fc} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x970, 0x18b4, 0xc62, 0xf59, 0xf33, 0x6c0, 0x5ae, 0x86b, 0x1690, 0x17e1, 0x829, 0xab5, 0x169, 0x1115, 0x1b7e, 0x17fa, 0xcae, 0x1b7, 0xc7b, 0xb70, 0x11fc, 0x1417, 0x8b4, 0x1b78, 0x35a, 0x18e, 0x1e46, 0x15f0, 0xf64, 0x15} +#elif RADIX == 32 +{0xc5a25c2, 0xdeb2c62, 0xe3603cc, 0x410d65a, 0x29bf0da, 0x5a556a8, 0xb7e88a8, 0xb2baff5, 0xc7b0db, 0xbc7f16e, 0xf08b4a0, 0xc70d6b6, 0xbe1e460, 0x29d92} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3ccdeb2c62c5a25, 0x9bf0da410d65ae36, 0x5b7e88a85a556a82, 0x16e0c7b0dbb2baff, 0xd6b6f08b4a0bc7f, 0x316bd92be1e460c7} +#else +{0x19bd658c58b44b, 0x69043596b8d80f, 0x42d2ab5414df86, 0x3b2baff5b7e88a, 0x178fe2dc18f61b, 0x31c35adbc22d28, 0x875ec95f0f230} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x807f,0x9ad4,0xa2d5,0xb571,0xe39a,0x9682,0xbc36,0x2fde,0x80a1,0x55a9,0x2092,0x49c9,0x4269,0x7a75,0x7411,0xde67,0x75d6,0x9689,0xaf23,0x7b89,0x819b,0x60e4,0x276f,0x1a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9ad4807f,0xb571a2d5,0x9682e39a,0x2fdebc36,0x55a980a1,0x49c92092,0x7a754269,0xde677411,0x968975d6,0x7b89af23,0x60e4819b,0x1a276f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb571a2d59ad4807f,0x2fdebc369682e39a,0x49c9209255a980a1,0xde6774117a754269,0x7b89af23968975d6,0x1a276f60e4819b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc876,0x218,0xd2f9,0x49ab,0x3ef7,0x1ab3,0x4dc4,0xf981,0x381a,0xdb9c,0x12c5,0xc5e1,0x5b21,0xc148,0x9d31,0x5369,0x5706,0x2277,0xcf63,0x1c7d,0xe151,0xd481,0xcd50,0x4b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x218c876,0x49abd2f9,0x1ab33ef7,0xf9814dc4,0xdb9c381a,0xc5e112c5,0xc1485b21,0x53699d31,0x22775706,0x1c7dcf63,0xd481e151,0x4bcd50}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x49abd2f90218c876,0xf9814dc41ab33ef7,0xc5e112c5db9c381a,0x53699d31c1485b21,0x1c7dcf6322775706,0x4bcd50d481e151}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x2191,0x98ac,0x5708,0x78cc,0x63fa,0xe9c9,0x168,0x4c13,0x19e6,0xe2be,0xd010,0xd629,0xf3ff,0x3b08,0x7c2b,0xed3e,0x356e,0x5d94,0x253b,0xa0f5,0xc652,0x60d4,0x9dac,0x63}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x98ac2191,0x78cc5708,0xe9c963fa,0x4c130168,0xe2be19e6,0xd629d010,0x3b08f3ff,0xed3e7c2b,0x5d94356e,0xa0f5253b,0x60d4c652,0x639dac}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x78cc570898ac2191,0x4c130168e9c963fa,0xd629d010e2be19e6,0xed3e7c2b3b08f3ff,0xa0f5253b5d94356e,0x639dac60d4c652}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7f81,0x652b,0x5d2a,0x4a8e,0x1c65,0x697d,0x43c9,0xd021,0x7f5e,0xaa56,0xdf6d,0xb636,0xbd96,0x858a,0x8bee,0x2198,0x8a29,0x6976,0x50dc,0x8476,0x7e64,0x9f1b,0xd890,0xe5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x652b7f81,0x4a8e5d2a,0x697d1c65,0xd02143c9,0xaa567f5e,0xb636df6d,0x858abd96,0x21988bee,0x69768a29,0x847650dc,0x9f1b7e64,0xe5d890}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4a8e5d2a652b7f81,0xd02143c9697d1c65,0xb636df6daa567f5e,0x21988bee858abd96,0x847650dc69768a29,0xe5d8909f1b7e64}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd72,0xd1f5,0x548,0xe0a7,0xee15,0xfdbc,0xc63c,0xd72b,0x1e45,0xe787,0xc513,0xb278,0x7cd,0xcab5,0x5ced,0x8be9,0xf4a4,0x9711,0xe9d8,0x872d,0x443,0xead0,0xe34d,0x2e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd1f50d72,0xe0a70548,0xfdbcee15,0xd72bc63c,0xe7871e45,0xb278c513,0xcab507cd,0x8be95ced,0x9711f4a4,0x872de9d8,0xead00443,0x2ee34d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe0a70548d1f50d72,0xd72bc63cfdbcee15,0xb278c513e7871e45,0x8be95cedcab507cd,0x872de9d89711f4a4,0x2ee34dead00443}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcecc,0x7789,0xbdb9,0x22b4,0x782f,0x794e,0x8e17,0xd2cc,0x1fb,0x1927,0x9c88,0x929,0x22b0,0x746e,0xd62b,0xade1,0xc7dd,0x5e2a,0xd146,0x7363,0xca5e,0x5460,0xd2b3,0xee}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7789cecc,0x22b4bdb9,0x794e782f,0xd2cc8e17,0x192701fb,0x9299c88,0x746e22b0,0xade1d62b,0x5e2ac7dd,0x7363d146,0x5460ca5e,0xeed2b3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x22b4bdb97789cecc,0xd2cc8e17794e782f,0x9299c88192701fb,0xade1d62b746e22b0,0x7363d1465e2ac7dd,0xeed2b35460ca5e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x313b,0xc18a,0x812a,0x406d,0x472a,0x9fca,0x9f07,0xb030,0x8b7b,0x7924,0x2af6,0x9e99,0x2b81,0x8eb8,0x35ee,0x59c8,0x7655,0x34cc,0x5aaf,0x326,0xe58d,0xf8b7,0x969a,0x6e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc18a313b,0x406d812a,0x9fca472a,0xb0309f07,0x79248b7b,0x9e992af6,0x8eb82b81,0x59c835ee,0x34cc7655,0x3265aaf,0xf8b7e58d,0x6e969a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x406d812ac18a313b,0xb0309f079fca472a,0x9e992af679248b7b,0x59c835ee8eb82b81,0x3265aaf34cc7655,0x6e969af8b7e58d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x6610,0xfd89,0xb147,0xcf39,0x2b02,0x4ccf,0xed64,0x8470,0xaaf6,0x1891,0x8c78,0xf074,0x8a4c,0xfaed,0xd66c,0xf52b,0xf1c5,0xb0a,0x5cd,0x46f8,0x79a3,0x81de,0x451d,0xd9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xfd896610,0xcf39b147,0x4ccf2b02,0x8470ed64,0x1891aaf6,0xf0748c78,0xfaed8a4c,0xf52bd66c,0xb0af1c5,0x46f805cd,0x81de79a3,0xd9451d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xcf39b147fd896610,0x8470ed644ccf2b02,0xf0748c781891aaf6,0xf52bd66cfaed8a4c,0x46f805cd0b0af1c5,0xd9451d81de79a3}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1869,0x2ce0,0x425c,0x7d0f,0x30c8,0x1c3e,0xd562,0xfb41,0x3951,0xeccc,0x9c8a,0xb265,0x829,0xd879,0x3c42,0x2cbf,0xb1d2,0xd9d3,0xee28,0x7fdf,0xccdd,0x3ad,0xa6d9,0x3b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2ce01869,0x7d0f425c,0x1c3e30c8,0xfb41d562,0xeccc3951,0xb2659c8a,0xd8790829,0x2cbf3c42,0xd9d3b1d2,0x7fdfee28,0x3adccdd,0x3ba6d9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7d0f425c2ce01869,0xfb41d5621c3e30c8,0xb2659c8aeccc3951,0x2cbf3c42d8790829,0x7fdfee28d9d3b1d2,0x3ba6d903adccdd}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcec5,0x3e75,0x7ed5,0xbf92,0xb8d5,0x6035,0x60f8,0x4fcf,0x7484,0x86db,0xd509,0x6166,0xd47e,0x7147,0xca11,0xa637,0x89aa,0xcb33,0xa550,0xfcd9,0x1a72,0x748,0x6965,0x91}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3e75cec5,0xbf927ed5,0x6035b8d5,0x4fcf60f8,0x86db7484,0x6166d509,0x7147d47e,0xa637ca11,0xcb3389aa,0xfcd9a550,0x7481a72,0x916965}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xbf927ed53e75cec5,0x4fcf60f86035b8d5,0x6166d50986db7484,0xa637ca117147d47e,0xfcd9a550cb3389aa,0x91696507481a72}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x807f,0x9ad4,0xa2d5,0xb571,0xe39a,0x9682,0xbc36,0x2fde,0x80a1,0x55a9,0x2092,0x49c9,0x4269,0x7a75,0x7411,0xde67,0x75d6,0x9689,0xaf23,0x7b89,0x819b,0x60e4,0x276f,0x1a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9ad4807f,0xb571a2d5,0x9682e39a,0x2fdebc36,0x55a980a1,0x49c92092,0x7a754269,0xde677411,0x968975d6,0x7b89af23,0x60e4819b,0x1a276f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb571a2d59ad4807f,0x2fdebc369682e39a,0x49c9209255a980a1,0xde6774117a754269,0x7b89af23968975d6,0x1a276f60e4819b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc876,0x218,0xd2f9,0x49ab,0x3ef7,0x1ab3,0x4dc4,0xf981,0x381a,0xdb9c,0x12c5,0xc5e1,0x5b21,0xc148,0x9d31,0x5369,0x5706,0x2277,0xcf63,0x1c7d,0xe151,0xd481,0xcd50,0x4b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x218c876,0x49abd2f9,0x1ab33ef7,0xf9814dc4,0xdb9c381a,0xc5e112c5,0xc1485b21,0x53699d31,0x22775706,0x1c7dcf63,0xd481e151,0x4bcd50}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x49abd2f90218c876,0xf9814dc41ab33ef7,0xc5e112c5db9c381a,0x53699d31c1485b21,0x1c7dcf6322775706,0x4bcd50d481e151}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x2191,0x98ac,0x5708,0x78cc,0x63fa,0xe9c9,0x168,0x4c13,0x19e6,0xe2be,0xd010,0xd629,0xf3ff,0x3b08,0x7c2b,0xed3e,0x356e,0x5d94,0x253b,0xa0f5,0xc652,0x60d4,0x9dac,0x63}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x98ac2191,0x78cc5708,0xe9c963fa,0x4c130168,0xe2be19e6,0xd629d010,0x3b08f3ff,0xed3e7c2b,0x5d94356e,0xa0f5253b,0x60d4c652,0x639dac}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x78cc570898ac2191,0x4c130168e9c963fa,0xd629d010e2be19e6,0xed3e7c2b3b08f3ff,0xa0f5253b5d94356e,0x639dac60d4c652}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7f81,0x652b,0x5d2a,0x4a8e,0x1c65,0x697d,0x43c9,0xd021,0x7f5e,0xaa56,0xdf6d,0xb636,0xbd96,0x858a,0x8bee,0x2198,0x8a29,0x6976,0x50dc,0x8476,0x7e64,0x9f1b,0xd890,0xe5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x652b7f81,0x4a8e5d2a,0x697d1c65,0xd02143c9,0xaa567f5e,0xb636df6d,0x858abd96,0x21988bee,0x69768a29,0x847650dc,0x9f1b7e64,0xe5d890}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4a8e5d2a652b7f81,0xd02143c9697d1c65,0xb636df6daa567f5e,0x21988bee858abd96,0x847650dc69768a29,0xe5d8909f1b7e64}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x86b9,0x68fa,0x82a4,0xf053,0x770a,0x7ede,0xe31e,0xeb95,0x8f22,0xf3c3,0x6289,0xd93c,0x83e6,0xe55a,0xae76,0x45f4,0xfa52,0x4b88,0xf4ec,0xc396,0x221,0xf568,0x71a6,0x97}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x68fa86b9,0xf05382a4,0x7ede770a,0xeb95e31e,0xf3c38f22,0xd93c6289,0xe55a83e6,0x45f4ae76,0x4b88fa52,0xc396f4ec,0xf5680221,0x9771a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf05382a468fa86b9,0xeb95e31e7ede770a,0xd93c6289f3c38f22,0x45f4ae76e55a83e6,0xc396f4ec4b88fa52,0x9771a6f5680221}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe766,0xbbc4,0x5edc,0x915a,0x3c17,0xbca7,0x470b,0xe966,0x80fd,0xc93,0xce44,0x494,0x1158,0xba37,0xeb15,0xd6f0,0x63ee,0x2f15,0xe8a3,0x39b1,0x652f,0xaa30,0x6959,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbbc4e766,0x915a5edc,0xbca73c17,0xe966470b,0xc9380fd,0x494ce44,0xba371158,0xd6f0eb15,0x2f1563ee,0x39b1e8a3,0xaa30652f,0xf76959}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x915a5edcbbc4e766,0xe966470bbca73c17,0x494ce440c9380fd,0xd6f0eb15ba371158,0x39b1e8a32f1563ee,0xf76959aa30652f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x29a3,0x7abe,0x2ef1,0x26a6,0xa5a5,0x54e6,0xf4c8,0xb56f,0x2bae,0x1aae,0xd9ba,0x94ed,0x2df5,0x882c,0xc686,0x6f64,0x29f7,0x850a,0x9eee,0x617c,0x5678,0x3108,0x8ebe,0x86}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7abe29a3,0x26a62ef1,0x54e6a5a5,0xb56ff4c8,0x1aae2bae,0x94edd9ba,0x882c2df5,0x6f64c686,0x850a29f7,0x617c9eee,0x31085678,0x868ebe}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x26a62ef17abe29a3,0xb56ff4c854e6a5a5,0x94edd9ba1aae2bae,0x6f64c686882c2df5,0x617c9eee850a29f7,0x868ebe31085678}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc2a5,0x8ce6,0x3729,0xaa2b,0xb9d2,0xbf43,0xe2be,0xaf25,0x4ffb,0xec8e,0xf85a,0x94c6,0xe027,0x3c64,0xf4ad,0xf63,0x86ba,0xa244,0xde0f,0x2390,0x11e1,0xdd7c,0xcd4c,0x33}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8ce6c2a5,0xaa2b3729,0xbf43b9d2,0xaf25e2be,0xec8e4ffb,0x94c6f85a,0x3c64e027,0xf63f4ad,0xa24486ba,0x2390de0f,0xdd7c11e1,0x33cd4c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xaa2b37298ce6c2a5,0xaf25e2bebf43b9d2,0x94c6f85aec8e4ffb,0xf63f4ad3c64e027,0x2390de0fa24486ba,0x33cd4cdd7c11e1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1893,0xa4bf,0x1eb8,0x9df0,0x91b1,0x17b0,0xe4ae,0x6ba1,0x35fd,0xd56b,0xc03f,0x82a8,0x99cd,0x30be,0xf3a3,0x181e,0x879b,0x518,0x3e8,0xed0e,0xc0ff,0xe2d6,0xe29c,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa4bf1893,0x9df01eb8,0x17b091b1,0x6ba1e4ae,0xd56b35fd,0x82a8c03f,0x30be99cd,0x181ef3a3,0x518879b,0xed0e03e8,0xe2d6c0ff,0x1e29c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9df01eb8a4bf1893,0x6ba1e4ae17b091b1,0x82a8c03fd56b35fd,0x181ef3a330be99cd,0xed0e03e80518879b,0x1e29ce2d6c0ff}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd65d,0x8541,0xd10e,0xd959,0x5a5a,0xab19,0xb37,0x4a90,0xd451,0xe551,0x2645,0x6b12,0xd20a,0x77d3,0x3979,0x909b,0xd608,0x7af5,0x6111,0x9e83,0xa987,0xcef7,0x7141,0x79}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8541d65d,0xd959d10e,0xab195a5a,0x4a900b37,0xe551d451,0x6b122645,0x77d3d20a,0x909b3979,0x7af5d608,0x9e836111,0xcef7a987,0x797141}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd959d10e8541d65d,0x4a900b37ab195a5a,0x6b122645e551d451,0x909b397977d3d20a,0x9e8361117af5d608,0x797141cef7a987}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x187f, 0x1c7d, 0x163a, 0x54d, 0x197f, 0x1a5d, 0x1833, 0x823, 0x11ae, 0x225, 0xd6d, 0x1627, 0xd6c, 0x1625, 0xa36, 0xf64, 0xcfa, 0x327, 0x188d, 0xfab, 0x56b, 0x91c, 0x1cc5, 0x4fe, 0x2ae, 0x181a, 0x195, 0x1288, 0x10fc, 0x3} +#elif RADIX == 32 +{0xe3ee1fc, 0xca9b63a, 0x3d2ee5f, 0xb904783, 0x6d112c6, 0x5b2c4ed, 0xa36b12b, 0xb3e9ec8, 0x788d193, 0xe15adf5, 0xfdcc548, 0xd0ab89, 0x510195c, 0x1c3f2} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xee5fca9b63ae3ee1, 0xd112c6b9047833d2, 0x8a36b12b5b2c4ed6, 0xdf5788d193b3e9ec, 0xab89fdcc548e15a, 0x40183f2510195c0d} +#else +{0x3f9536c75c7dc3, 0x1ae411e0cf4bb9, 0x5ad96276b68896, 0x3b3e9ec8a36b12, 0x1c2b5beaf11a32, 0x342ae27f73152, 0xfcc1f92880cae} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0xe9d, 0x171f, 0xd8e, 0x1953, 0xe5f, 0x1e97, 0x1e0c, 0x1208, 0xc6b, 0x889, 0x1b5b, 0x589, 0xb5b, 0x1589, 0x28d, 0x13d9, 0x1b3e, 0x8c9, 0x1e23, 0x1bea, 0x15a, 0xa47, 0x1731, 0x113f, 0x10ab, 0xe06, 0x65, 0x4a2, 0x83f, 0x1a} +#elif RADIX == 32 +{0xb8fba77, 0xf2a6d8e, 0xcf4bb97, 0xae411e0, 0x5b444b1, 0xd6cb13b, 0x28dac4a, 0xecfa7b2, 0x5e23464, 0x3856b7d, 0x7f73152, 0x342ae2, 0x9440657, 0xf0fc} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbb97f2a6d8eb8fba, 0xb444b1ae411e0cf4, 0x228dac4ad6cb13b5, 0xb7d5e23464ecfa7b, 0x42ae27f731523856, 0x1e460fc944065703} +#else +{0x2fe54db1d71f74, 0x46b9047833d2ee, 0x56b6589dada225, 0x4ecfa7b228dac4, 0x470ad6fabc468c, 0x40d0ab89fdcc54, 0xf2307e4a2032b} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x237, 0xee8, 0xd8c, 0xafb, 0x18cd, 0x1ce1, 0x162a, 0x11c9, 0x1bbc, 0x1415, 0x1c35, 0x1d0c, 0x1104, 0x1558, 0x9d, 0xb17, 0x1097, 0x16d2, 0xc02, 0x1573, 0x1c5f, 0x1bec, 0x1a73, 0x1dfe, 0x1923, 0x18d6, 0x221, 0x11ee, 0x1581, 0xb} +#elif RADIX == 32 +{0x77408dd, 0x55f6d8c, 0xae70e33, 0xf239362, 0x35a0aee, 0x413a19c, 0x9daac4, 0x425d62e, 0x6c02b69, 0x6717eae, 0xfda73df, 0x6b648fb, 0x3dc221c, 0x1c606} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe3355f6d8c77408, 0x5a0aeef239362ae7, 0xe09daac4413a19c3, 0xeae6c02b69425d62, 0x648fbfda73df6717, 0x38396063dc221c6b} +#else +{0x66abedb18ee811, 0x3bc8e4d8ab9c38, 0x2209d0ce1ad057, 0x1425d62e09daac, 0x6ce2fd5cd8056d, 0x1ad923eff69cf7, 0xbdcb031ee110e} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x16a4, 0x11f0, 0x446, 0x1b2b, 0x129e, 0x1b52, 0x25, 0x18e4, 0x15d7, 0x545, 0x1502, 0x3af, 0x1b45, 0xff3, 0x1423, 0x1574, 0x1c5a, 0xff0, 0x1663, 0x114b, 0xc99, 0x1c89, 0x11f0, 0x15fd, 0x17a1, 0x14dd, 0x17f7, 0x1451, 0x5af, 0x17} +#elif RADIX == 32 +{0x8f85a92, 0xb656446, 0x5da94a7, 0x5f1c802, 0x22a2d7, 0xd1475f5, 0x4237f9e, 0x716aae9, 0x76637f8, 0x4b26629, 0xfb1f0e4, 0x6ede86b, 0x8a37f7a, 0x376be} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x94a7b6564468f85a, 0x22a2d75f1c8025da, 0x94237f9ed1475f50, 0x62976637f8716aae, 0xde86bfb1f0e44b26, 0x25496be8a37f7a6e} +#else +{0x4f6cac88d1f0b5, 0x5d7c7200976a52, 0x768a3afa811516, 0x716aae94237f9, 0x964cc52ecc6ff, 0x1bb7a1afec7c39, 0x264b5f451bfbd} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0xc89, 0x16f8, 0x1bcf, 0x14c7, 0x1c81, 0x1c37, 0x3b1, 0xb00, 0x5e, 0xdb5, 0x920, 0x14db, 0x41, 0x1bd7, 0x159d, 0x1889, 0x1318, 0x95d, 0x13d5, 0x46b, 0x18bd, 0x1bf1, 0x1bf6, 0x1ba2, 0x2d6, 0x1b06, 0x17c1, 0x1a40, 0x1f02, 0x11} +#elif RADIX == 32 +{0xb7c3226, 0x698fbcf, 0x1e1bf20, 0x796003b, 0x206da81, 0x1069b69, 0x59ddeb8, 0xcc63113, 0x73d54ae, 0x8e2f48d, 0x45bf6df, 0x830b5b7, 0x4817c1d, 0xdc0b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbf20698fbcfb7c32, 0x6da81796003b1e1, 0x359ddeb81069b692, 0x48d73d54aecc6311, 0xb5b745bf6df8e2f, 0x9b3c0b4817c1d83} +#else +{0x40d31f79f6f864, 0x5e5800ec786fc, 0x40834db49036d4, 0x6cc6311359ddeb, 0x71c5e91ae7aa95, 0x60c2d6dd16fdb7, 0x4d9e05a40be0e} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x8c0, 0x125b, 0x1d1c, 0x8a8, 0x1c41, 0xbb7, 0x15bf, 0x15ec, 0x959, 0x1fc5, 0xc2, 0x2ff, 0x1dd2, 0x1c02, 0x9db, 0x139d, 0x9a, 0x1654, 0xce7, 0xf6d, 0x13e5, 0x19be, 0x1f28, 0x161c, 0xe9f, 0x940, 0x77d, 0x162c, 0x385, 0x4} +#elif RADIX == 32 +{0x92da300, 0x5151d1c, 0xf5dbf10, 0x66bd95b, 0xc2fe2a5, 0x7485fe0, 0x9dbe017, 0x26a73a, 0xace7b2a, 0xf4f95ed, 0x39f28cd, 0xa03a7ec, 0xc5877d4, 0x20e16} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbf105151d1c92da3, 0x2fe2a566bd95bf5d, 0xa9dbe0177485fe0c, 0x5edace7b2a026a73, 0x3a7ec39f28cdf4f9, 0x20e16c5877d4a0} +#else +{0x20a2a3a3925b46, 0x159af656fd76fc, 0x3ba42ff0617f15, 0x2026a73a9dbe01, 0x3e9f2bdb59cf65, 0x280e9fb0e7ca33, 0x1070b62c3bea} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0xd30, 0x670, 0x165f, 0x18f8, 0x3fe, 0x11e5, 0x663, 0x270, 0x18cb, 0x42b, 0x11c3, 0xe0a, 0x4fc, 0x18ad, 0xfd0, 0x3fa, 0x1957, 0x1544, 0x941, 0x181e, 0x661, 0x18b9, 0x74a, 0xa70, 0x866, 0x11f8, 0xd20, 0xae3, 0x19b8, 0xb} +#elif RADIX == 32 +{0x33834c1, 0xb1f165f, 0x38f28ff, 0x2c4e066, 0xc3215e3, 0x3f1c151, 0xfd0c569, 0x655c7f4, 0xc941aa2, 0xc998703, 0xe074ac5, 0xfc21994, 0x5c6d208, 0x1d6e1} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x28ffb1f165f33834, 0x3215e32c4e06638f, 0x4fd0c5693f1c151c, 0x703c941aa2655c7f, 0x21994e074ac5c998, 0x311e6e15c6d208fc} +#else +{0x7f63e2cbe67069, 0xcb138198e3ca3, 0x49f8e0a8e190af, 0x2655c7f4fd0c56, 0x39330e07928354, 0x3f08665381d2b1, 0x84f370ae36904} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1f47, 0x9e3, 0x5d, 0xdc6, 0x18a3, 0x1c99, 0x1253, 0x179f, 0x16b, 0x1b87, 0x27a, 0x9f8, 0x1064, 0x9ed, 0xe66, 0x47d, 0x4e9, 0x1805, 0x1349, 0x40, 0x1bbd, 0x7f6, 0x1c57, 0x1f9f, 0x11e9, 0x14cf, 0xe61, 0x1892, 0x833, 0x10} +#elif RADIX == 32 +{0x4f1fd1e, 0xdb8c05d, 0x3e4ce28, 0xaef3f25, 0x7adc385, 0x1913f02, 0xe664f6c, 0x93a48fa, 0x1349c02, 0xb6ef408, 0x3fc573f, 0x67c7a7f, 0x124e61a, 0xcf} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xce28db8c05d4f1fd, 0xadc385aef3f253e4, 0xae664f6c1913f027, 0x4081349c0293a48f, 0xc7a7f3fc573fb6ef, 0x79e0cf124e61a67} +#else +{0x51b7180ba9e3fa, 0x16bbcfc94f9338, 0x60c89f813d6e1c, 0x293a48fae664f6, 0x76dde810269380, 0x19f1e9fcff15cf, 0x3cf067892730d} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x5419,0x8a5a,0x8d5e,0x1367,0xae77,0x3903,0xcf47,0xab31,0xf30c,0x9219,0xed73,0x2055,0xcc84,0x4098,0x7046,0x4d6f,0x5c68,0xe641,0x224,0xd5ed,0x977a,0xdfcd,0x15c8,0xe4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8a5a5419,0x13678d5e,0x3903ae77,0xab31cf47,0x9219f30c,0x2055ed73,0x4098cc84,0x4d6f7046,0xe6415c68,0xd5ed0224,0xdfcd977a,0xe415c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x13678d5e8a5a5419,0xab31cf473903ae77,0x2055ed739219f30c,0x4d6f70464098cc84,0xd5ed0224e6415c68,0xe415c8dfcd977a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x92ea,0x29a5,0x41ba,0x7e17,0x33c,0xaeb2,0x4b64,0x1b0d,0x4be,0xe57e,0x2d2e,0x1554,0xe7f7,0xea1e,0x4267,0x7d2a,0x17cd,0xd234,0xc388,0x147a,0x43e6,0xaa63,0x83bd,0x4f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x29a592ea,0x7e1741ba,0xaeb2033c,0x1b0d4b64,0xe57e04be,0x15542d2e,0xea1ee7f7,0x7d2a4267,0xd23417cd,0x147ac388,0xaa6343e6,0x4f83bd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7e1741ba29a592ea,0x1b0d4b64aeb2033c,0x15542d2ee57e04be,0x7d2a4267ea1ee7f7,0x147ac388d23417cd,0x4f83bdaa6343e6}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa8b7,0x5b17,0x819c,0x465e,0xa6fb,0xb2a1,0x91c3,0x953,0x486,0x4ed4,0xc367,0x75ba,0xcc01,0x115f,0xe242,0xe751,0x4748,0xbf53,0x4ec0,0x950a,0xe08e,0x7ea2,0xec82,0x7d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5b17a8b7,0x465e819c,0xb2a1a6fb,0x95391c3,0x4ed40486,0x75bac367,0x115fcc01,0xe751e242,0xbf534748,0x950a4ec0,0x7ea2e08e,0x7dec82}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x465e819c5b17a8b7,0x95391c3b2a1a6fb,0x75bac3674ed40486,0xe751e242115fcc01,0x950a4ec0bf534748,0x7dec827ea2e08e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xabe7,0x75a5,0x72a1,0xec98,0x5188,0xc6fc,0x30b8,0x54ce,0xcf3,0x6de6,0x128c,0xdfaa,0x337b,0xbf67,0x8fb9,0xb290,0xa397,0x19be,0xfddb,0x2a12,0x6885,0x2032,0xea37,0x1b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x75a5abe7,0xec9872a1,0xc6fc5188,0x54ce30b8,0x6de60cf3,0xdfaa128c,0xbf67337b,0xb2908fb9,0x19bea397,0x2a12fddb,0x20326885,0x1bea37}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xec9872a175a5abe7,0x54ce30b8c6fc5188,0xdfaa128c6de60cf3,0xb2908fb9bf67337b,0x2a12fddb19bea397,0x1bea3720326885}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf28e,0x2e0a,0xfab7,0x1f58,0x11ea,0x243,0x39c3,0x28d4,0xe1ba,0x1878,0x3aec,0x4d87,0xf832,0x354a,0xa312,0x7416,0xb5b,0x68ee,0x1627,0x78d2,0xfbbc,0x152f,0x1cb2,0xd1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2e0af28e,0x1f58fab7,0x24311ea,0x28d439c3,0x1878e1ba,0x4d873aec,0x354af832,0x7416a312,0x68ee0b5b,0x78d21627,0x152ffbbc,0xd11cb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1f58fab72e0af28e,0x28d439c3024311ea,0x4d873aec1878e1ba,0x7416a312354af832,0x78d2162768ee0b5b,0xd11cb2152ffbbc}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3134,0x8876,0x4246,0xdd4b,0x87d0,0x86b1,0x71e8,0x2d33,0xfe04,0xe6d8,0x6377,0xf6d6,0xdd4f,0x8b91,0x29d4,0x521e,0x3822,0xa1d5,0x2eb9,0x8c9c,0x35a1,0xab9f,0x2d4c,0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x88763134,0xdd4b4246,0x86b187d0,0x2d3371e8,0xe6d8fe04,0xf6d66377,0x8b91dd4f,0x521e29d4,0xa1d53822,0x8c9c2eb9,0xab9f35a1,0x112d4c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdd4b424688763134,0x2d3371e886b187d0,0xf6d66377e6d8fe04,0x521e29d48b91dd4f,0x8c9c2eb9a1d53822,0x112d4cab9f35a1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x703,0xe86d,0xe89e,0xbcf8,0x675b,0xe250,0x9f65,0xe8ec,0x2c83,0x11ca,0x4751,0x192a,0xf9d8,0xf46a,0xeb89,0x4f40,0x2a2c,0xdcf,0xfff9,0x13f9,0x24e7,0x8348,0xb9af,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe86d0703,0xbcf8e89e,0xe250675b,0xe8ec9f65,0x11ca2c83,0x192a4751,0xf46af9d8,0x4f40eb89,0xdcf2a2c,0x13f9fff9,0x834824e7,0x6b9af}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xbcf8e89ee86d0703,0xe8ec9f65e250675b,0x192a475111ca2c83,0x4f40eb89f46af9d8,0x13f9fff90dcf2a2c,0x6b9af834824e7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1e40,0xb548,0xf9c7,0x6598,0x7e33,0x25c6,0x6cbf,0x2ef2,0xa630,0xdd99,0xaef2,0xf320,0x4a2,0x93a7,0x4541,0x2f7c,0xbf45,0x1a7a,0x24f4,0x52a9,0xd3b4,0xa12a,0x9d37,0xb0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb5481e40,0x6598f9c7,0x25c67e33,0x2ef26cbf,0xdd99a630,0xf320aef2,0x93a704a2,0x2f7c4541,0x1a7abf45,0x52a924f4,0xa12ad3b4,0xb09d37}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6598f9c7b5481e40,0x2ef26cbf25c67e33,0xf320aef2dd99a630,0x2f7c454193a704a2,0x52a924f41a7abf45,0xb09d37a12ad3b4}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1e1,0x2283,0x3774,0x83d4,0xf33f,0x1fc,0x2790,0xde59,0xe89d,0xc942,0x2c1b,0x6574,0x55b1,0x3a3c,0x9f11,0xbb0a,0x6813,0xa69,0xff9d,0xc94c,0xdede,0xce6b,0x18c6,0xa9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x228301e1,0x83d43774,0x1fcf33f,0xde592790,0xc942e89d,0x65742c1b,0x3a3c55b1,0xbb0a9f11,0xa696813,0xc94cff9d,0xce6bdede,0xa918c6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x83d43774228301e1,0xde59279001fcf33f,0x65742c1bc942e89d,0xbb0a9f113a3c55b1,0xc94cff9d0a696813,0xa918c6ce6bdede}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf8fd,0x1792,0x1761,0x4307,0x98a4,0x1daf,0x609a,0x1713,0xd37c,0xee35,0xb8ae,0xe6d5,0x627,0xb95,0x1476,0xb0bf,0xd5d3,0xf230,0x6,0xec06,0xdb18,0x7cb7,0x4650,0xf9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1792f8fd,0x43071761,0x1daf98a4,0x1713609a,0xee35d37c,0xe6d5b8ae,0xb950627,0xb0bf1476,0xf230d5d3,0xec060006,0x7cb7db18,0xf94650}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x430717611792f8fd,0x1713609a1daf98a4,0xe6d5b8aeee35d37c,0xb0bf14760b950627,0xec060006f230d5d3,0xf946507cb7db18}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x5419,0x8a5a,0x8d5e,0x1367,0xae77,0x3903,0xcf47,0xab31,0xf30c,0x9219,0xed73,0x2055,0xcc84,0x4098,0x7046,0x4d6f,0x5c68,0xe641,0x224,0xd5ed,0x977a,0xdfcd,0x15c8,0xe4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8a5a5419,0x13678d5e,0x3903ae77,0xab31cf47,0x9219f30c,0x2055ed73,0x4098cc84,0x4d6f7046,0xe6415c68,0xd5ed0224,0xdfcd977a,0xe415c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x13678d5e8a5a5419,0xab31cf473903ae77,0x2055ed739219f30c,0x4d6f70464098cc84,0xd5ed0224e6415c68,0xe415c8dfcd977a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x92ea,0x29a5,0x41ba,0x7e17,0x33c,0xaeb2,0x4b64,0x1b0d,0x4be,0xe57e,0x2d2e,0x1554,0xe7f7,0xea1e,0x4267,0x7d2a,0x17cd,0xd234,0xc388,0x147a,0x43e6,0xaa63,0x83bd,0x4f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x29a592ea,0x7e1741ba,0xaeb2033c,0x1b0d4b64,0xe57e04be,0x15542d2e,0xea1ee7f7,0x7d2a4267,0xd23417cd,0x147ac388,0xaa6343e6,0x4f83bd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7e1741ba29a592ea,0x1b0d4b64aeb2033c,0x15542d2ee57e04be,0x7d2a4267ea1ee7f7,0x147ac388d23417cd,0x4f83bdaa6343e6}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa8b7,0x5b17,0x819c,0x465e,0xa6fb,0xb2a1,0x91c3,0x953,0x486,0x4ed4,0xc367,0x75ba,0xcc01,0x115f,0xe242,0xe751,0x4748,0xbf53,0x4ec0,0x950a,0xe08e,0x7ea2,0xec82,0x7d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x5b17a8b7,0x465e819c,0xb2a1a6fb,0x95391c3,0x4ed40486,0x75bac367,0x115fcc01,0xe751e242,0xbf534748,0x950a4ec0,0x7ea2e08e,0x7dec82}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x465e819c5b17a8b7,0x95391c3b2a1a6fb,0x75bac3674ed40486,0xe751e242115fcc01,0x950a4ec0bf534748,0x7dec827ea2e08e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xabe7,0x75a5,0x72a1,0xec98,0x5188,0xc6fc,0x30b8,0x54ce,0xcf3,0x6de6,0x128c,0xdfaa,0x337b,0xbf67,0x8fb9,0xb290,0xa397,0x19be,0xfddb,0x2a12,0x6885,0x2032,0xea37,0x1b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x75a5abe7,0xec9872a1,0xc6fc5188,0x54ce30b8,0x6de60cf3,0xdfaa128c,0xbf67337b,0xb2908fb9,0x19bea397,0x2a12fddb,0x20326885,0x1bea37}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xec9872a175a5abe7,0x54ce30b8c6fc5188,0xdfaa128c6de60cf3,0xb2908fb9bf67337b,0x2a12fddb19bea397,0x1bea3720326885}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7947,0x9705,0x7d5b,0xfac,0x88f5,0x8121,0x1ce1,0x146a,0x70dd,0xc3c,0x9d76,0x26c3,0x7c19,0x1aa5,0x5189,0xba0b,0x5ad,0xb477,0xb13,0x3c69,0xfdde,0xa97,0x8e59,0x68}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x97057947,0xfac7d5b,0x812188f5,0x146a1ce1,0xc3c70dd,0x26c39d76,0x1aa57c19,0xba0b5189,0xb47705ad,0x3c690b13,0xa97fdde,0x688e59}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfac7d5b97057947,0x146a1ce1812188f5,0x26c39d760c3c70dd,0xba0b51891aa57c19,0x3c690b13b47705ad,0x688e590a97fdde}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x189a,0x443b,0xa123,0x6ea5,0xc3e8,0x4358,0xb8f4,0x1699,0x7f02,0xf36c,0x31bb,0xfb6b,0xeea7,0x45c8,0x14ea,0x290f,0x9c11,0xd0ea,0x175c,0xc64e,0x9ad0,0x55cf,0x96a6,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x443b189a,0x6ea5a123,0x4358c3e8,0x1699b8f4,0xf36c7f02,0xfb6b31bb,0x45c8eea7,0x290f14ea,0xd0ea9c11,0xc64e175c,0x55cf9ad0,0x896a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6ea5a123443b189a,0x1699b8f44358c3e8,0xfb6b31bbf36c7f02,0x290f14ea45c8eea7,0xc64e175cd0ea9c11,0x896a655cf9ad0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x2d5d,0x46e9,0x4215,0x63b0,0x8358,0xdc91,0x80aa,0x6970,0x4e7d,0x266d,0xc13a,0xe4ea,0x504e,0xbc38,0xdbaf,0x119b,0xa3cc,0x45d8,0x98db,0x7b90,0x3a5b,0xde6a,0x3676,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x46e92d5d,0x63b04215,0xdc918358,0x697080aa,0x266d4e7d,0xe4eac13a,0xbc38504e,0x119bdbaf,0x45d8a3cc,0x7b9098db,0xde6a3a5b,0x83676}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x63b0421546e92d5d,0x697080aadc918358,0xe4eac13a266d4e7d,0x119bdbafbc38504e,0x7b9098db45d8a3cc,0x83676de6a3a5b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1db1,0x61ae,0x220b,0xc2e,0xa7ee,0xb16a,0x8697,0xf90c,0x7505,0xced5,0x5cf8,0xb601,0x6235,0x27ad,0x9fdf,0x57d0,0xca2,0xa6d2,0x94db,0xb53a,0x8bd2,0xa3ad,0xfe95,0x92}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x61ae1db1,0xc2e220b,0xb16aa7ee,0xf90c8697,0xced57505,0xb6015cf8,0x27ad6235,0x57d09fdf,0xa6d20ca2,0xb53a94db,0xa3ad8bd2,0x92fe95}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc2e220b61ae1db1,0xf90c8697b16aa7ee,0xb6015cf8ced57505,0x57d09fdf27ad6235,0xb53a94dba6d20ca2,0x92fe95a3ad8bd2}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa809,0xf0cf,0xb393,0xf0ab,0x181a,0xb5bc,0x1833,0xb0ea,0xff0e,0x3088,0xb299,0x4f5c,0x5a20,0x5b86,0xad7b,0x9ffd,0x2216,0x4e4c,0xb8eb,0x989,0x712f,0xa798,0x8e8f,0x45}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf0cfa809,0xf0abb393,0xb5bc181a,0xb0ea1833,0x3088ff0e,0x4f5cb299,0x5b865a20,0x9ffdad7b,0x4e4c2216,0x989b8eb,0xa798712f,0x458e8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf0abb393f0cfa809,0xb0ea1833b5bc181a,0x4f5cb2993088ff0e,0x9ffdad7b5b865a20,0x989b8eb4e4c2216,0x458e8fa798712f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd2a3,0xb916,0xbdea,0x9c4f,0x7ca7,0x236e,0x7f55,0x968f,0xb182,0xd992,0x3ec5,0x1b15,0xafb1,0x43c7,0x2450,0xee64,0x5c33,0xba27,0x6724,0x846f,0xc5a4,0x2195,0xc989,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb916d2a3,0x9c4fbdea,0x236e7ca7,0x968f7f55,0xd992b182,0x1b153ec5,0x43c7afb1,0xee642450,0xba275c33,0x846f6724,0x2195c5a4,0xf7c989}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c4fbdeab916d2a3,0x968f7f55236e7ca7,0x1b153ec5d992b182,0xee64245043c7afb1,0x846f6724ba275c33,0xf7c9892195c5a4}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x17bf, 0xbb8, 0x485, 0x1296, 0x1b32, 0xe0b, 0x13f9, 0x15f5, 0x1a2b, 0xff6, 0xf53, 0x70a, 0x36c, 0x40f, 0xa89, 0xca6, 0x37e, 0x1488, 0x1796, 0x1be2, 0x1e0f, 0xf10, 0x1628, 0x1a20, 0x1ee7, 0x1e53, 0x48c, 0x94, 0xd53, 0xd} +#elif RADIX == 32 +{0x5dc5efd, 0xa52c485, 0x9705ecc, 0xaebeb3f, 0x537fb68, 0xdb0e14f, 0xa892078, 0xdf994c, 0x5796a44, 0x8783f7c, 0x4162878, 0x29fb9f4, 0x12848cf, 0x2a54c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x5ecca52c4855dc5e, 0x37fb68aebeb3f970, 0xca892078db0e14f5, 0xf7c5796a440df994, 0xfb9f441628788783, 0x406754c12848cf29} +#else +{0x194a5890abb8bd, 0x22bafacfe5c17b, 0x46d870a7a9bfdb, 0x40df994ca89207, 0x10f07ef8af2d48, 0x4a7ee7d1058a1e, 0xff3aa60942467} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x66d, 0xaee, 0x1121, 0x14a5, 0x1ecc, 0xb82, 0xcfe, 0x1d7d, 0x168a, 0x1bfd, 0x13d4, 0x1c2, 0x18db, 0x903, 0x12a2, 0x1329, 0xdf, 0x1522, 0x15e5, 0x1ef8, 0x783, 0x3c4, 0x58a, 0x1e88, 0x1fb9, 0x794, 0x123, 0x1825, 0x1754, 0x1c} +#elif RADIX == 32 +{0x57719b7, 0x294b121, 0xe5c17b3, 0x2bafacf, 0xd4dfeda, 0x36c3853, 0x2a2481e, 0x37e653, 0x15e5a91, 0x21e0fdf, 0x1058a1e, 0xca7ee7d, 0x4a1233, 0x22d53} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x17b3294b12157719, 0x4dfeda2bafacfe5c, 0x32a2481e36c3853d, 0xfdf15e5a91037e65, 0x7ee7d1058a1e21e0, 0x2e99d5304a1233ca} +#else +{0x665296242aee33, 0x68aebeb3f9705e, 0x71b61c29ea6ff6, 0x1037e6532a2481, 0x443c1fbe2bcb52, 0x729fb9f4416287, 0x70cea98250919} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x3e9, 0x9f6, 0x1c50, 0x27e, 0xa85, 0x39c, 0xa7b, 0x177c, 0xdfc, 0x77e, 0x1490, 0x11b8, 0xd2b, 0x17dc, 0xd7c, 0x16a0, 0xe21, 0xb86, 0x15bb, 0x844, 0x146c, 0xe51, 0xc6d, 0x143d, 0x1d2b, 0x1715, 0x18bb, 0xdc8, 0x55d, 0x16} +#elif RADIX == 32 +{0x4fb0fa6, 0x44fdc50, 0xb1ce2a1, 0xf2ef8a7, 0x903bf37, 0x4ae3714, 0xd7cbee3, 0x3886d40, 0x95bb5c3, 0x8d1b108, 0x7ac6d72, 0x8af4ae8, 0xb918bbb, 0x2f575} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe2a144fdc504fb0f, 0x3bf37f2ef8a7b1c, 0xd7cbee34ae37149, 0x10895bb5c33886d4, 0xf4ae87ac6d728d1b, 0x2a55575b918bbb8a} +#else +{0x4289fb8a09f61f, 0x5fcbbe29ec738a, 0x1a571b8a481df9, 0x33886d40d7cbee, 0x51a362112b76b8, 0x62bd2ba1eb1b5c, 0x4eaabadc8c5dd} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x793, 0x1095, 0x8d0, 0x676, 0x2be, 0x1a9d, 0x6d6, 0x1d0, 0x112a, 0x18e1, 0x1741, 0xc68, 0x156d, 0x113f, 0x181e, 0x201, 0xcd7, 0xbb7, 0xdb, 0x64c, 0x181e, 0x63, 0x965, 0xf2, 0xc95, 0x50d, 0x1ec2, 0x1c03, 0x5b4, 0x1b} +#elif RADIX == 32 +{0x84a9e4f, 0x8cec8d0, 0x6d4e8af, 0xa83a06d, 0x41c70c4, 0x5b58d17, 0x81e89fd, 0xb35c403, 0x80db5db, 0x1e078c9, 0xe496503, 0x86b2541, 0x807ec22, 0x166d3} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe8af8cec8d084a9e, 0x1c70c4a83a06d6d4, 0x381e89fd5b58d174, 0x8c980db5dbb35c40, 0xb2541e4965031e07, 0x14256d3807ec2286} +#else +{0x5f19d91a10953c, 0x12a0e81b5b53a2, 0x6adac68ba0e386, 0x3b35c40381e89f, 0x63c0f19301b6bb, 0x21ac9507925940, 0xa12b69c03f611} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x71d, 0xf0e, 0x506, 0x1aec, 0x3f6, 0x2c1, 0x17dd, 0x43f, 0x1552, 0x1488, 0x10c3, 0x5ea, 0xfd4, 0x634, 0x1eb1, 0x1711, 0x1424, 0xeb1, 0xfe1, 0xa0a, 0x165f, 0x5c8, 0x1544, 0x1493, 0x329, 0x19ec, 0x1db4, 0x983, 0x790, 0x1d} +#elif RADIX == 32 +{0x7871c77, 0xb5d8506, 0xd1608fd, 0x4887f7d, 0xc3a4455, 0xf50bd50, 0xeb131a3, 0xd092e23, 0x4fe1758, 0x4597d41, 0x275442e, 0xf60ca69, 0x307db4c, 0x26e41} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x8fdb5d85067871c, 0x3a44554887f7dd16, 0x3eb131a3f50bd50c, 0xd414fe1758d092e2, 0xca69275442e4597, 0x1e5de41307db4cf6} +#else +{0x7b6bb0a0cf0e38, 0x55221fdf745823, 0x1fa85ea861d222, 0xd092e23eb131a, 0x48b2fa829fc2eb, 0x3d8329a49d510b, 0xf2ef20983eda6} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x704, 0x1718, 0x1f41, 0x1569, 0x1353, 0x403, 0x8ba, 0xd3b, 0x1e9a, 0xca6, 0x1433, 0xc05, 0x2dd, 0xf7d, 0x12c8, 0x1109, 0x1797, 0x4e2, 0xf77, 0x569, 0xfcf, 0x1dd4, 0x11a4, 0x1354, 0x1563, 0x14b7, 0x6ad, 0xf7e, 0x251, 0xe} +#elif RADIX == 32 +{0xb8c1c11, 0xead3f41, 0xa201cd4, 0x69a768b, 0x336537a, 0xb7580b4, 0x2c87be8, 0x5e5e213, 0x2f77271, 0xa3f3cad, 0xa91a4ee, 0x5bd58e6, 0xefc6ada, 0x2f945} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1cd4ead3f41b8c1c, 0x36537a69a768ba20, 0x32c87be8b7580b43, 0xcad2f772715e5e21, 0xd58e6a91a4eea3f3, 0x480945efc6ada5b} +#else +{0x29d5a7e8371838, 0x69a69da2e88073, 0x45bac05a19b29b, 0x15e5e2132c87be, 0x547e795a5eee4e, 0x16f5639aa4693b, 0x2404a2f7e356d} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0xf6, 0x15a2, 0x1cbc, 0x185c, 0x9a1, 0xc2f, 0x1123, 0x11, 0xda7, 0x1628, 0x41, 0x1163, 0x12f7, 0x9aa, 0x1235, 0x1444, 0x1c4a, 0x3b6, 0xfee, 0x96, 0x1ed, 0x1f4d, 0x5ec, 0x1bf2, 0x1bca, 0x151d, 0x58f, 0x293, 0x960, 0x20} +#elif RADIX == 32 +{0xad103db, 0x70b9cbc, 0x3617a68, 0x9c02312, 0x41b1436, 0xbde2c60, 0x2354d54, 0x712a889, 0xcfee1db, 0x687b412, 0xe45ecfa, 0x8eef2b7, 0x52658fa, 0x3f580} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x7a6870b9cbcad103, 0x1b14369c02312361, 0x92354d54bde2c604, 0x412cfee1db712a88, 0xef2b7e45ecfa687b, 0x37da58052658fa8e} +#else +{0x50e1739795a207, 0x5a7008c48d85e9, 0x25ef163020d8a1, 0x3712a8892354d5, 0x4d0f68259fdc3b, 0x23bbcadf917b3e, 0xbad2c02932c7d} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xbc5, 0xa1d, 0xe8a, 0xe9c, 0x1af1, 0x13b5, 0xa68, 0x4a4, 0x135e, 0x171, 0x716, 0x2c2, 0x1c2b, 0x332, 0x349, 0x138c, 0x168b, 0x21c, 0x1629, 0xb97, 0x186, 0x629, 0x6e8, 0x497, 0x128c, 0x19d2, 0xcc1, 0x121, 0x250, 0x1a} +#elif RADIX == 32 +{0x50eaf17, 0x5d38e8a, 0x89daebc, 0x78948a6, 0x160b8cd, 0xac5847, 0x3491997, 0x5a2e718, 0xf62910e, 0x4861972, 0x2e6e831, 0xe94a309, 0x242cc1c, 0xd940} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xaebc5d38e8a50eaf, 0x60b8cd78948a689d, 0x834919970ac58471, 0x972f62910e5a2e71, 0x4a3092e6e8314861, 0x5e4940242cc1ce9} +#else +{0x78ba71d14a1d5e, 0x35e25229a276ba, 0x38562c238b05c6, 0x65a2e718349199, 0x290c32e5ec5221, 0x3a528c24b9ba0c, 0x2f24a0121660e} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc761,0xa939,0x45c3,0xca85,0x6b48,0xe2f1,0x7d5b,0x8e01,0xb824,0x1b34,0x31da,0x3fa1,0xaae4,0x143a,0xc0b8,0xe32f,0x843,0x2c29,0xd142,0x4e56,0xd55c,0xc504,0x24cd,0xc5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa939c761,0xca8545c3,0xe2f16b48,0x8e017d5b,0x1b34b824,0x3fa131da,0x143aaae4,0xe32fc0b8,0x2c290843,0x4e56d142,0xc504d55c,0xc524cd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xca8545c3a939c761,0x8e017d5be2f16b48,0x3fa131da1b34b824,0xe32fc0b8143aaae4,0x4e56d1422c290843,0xc524cdc504d55c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe87a,0x6127,0x8903,0x2308,0xfbed,0x12dc,0x3209,0xc898,0x715,0x2ab8,0x446f,0x1078,0x2808,0x2493,0x34a9,0xf92b,0x96f4,0xa3a,0xf860,0xd4ad,0xc8a9,0x410d,0x626b,0xe5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6127e87a,0x23088903,0x12dcfbed,0xc8983209,0x2ab80715,0x1078446f,0x24932808,0xf92b34a9,0xa3a96f4,0xd4adf860,0x410dc8a9,0xe5626b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x230889036127e87a,0xc898320912dcfbed,0x1078446f2ab80715,0xf92b34a924932808,0xd4adf8600a3a96f4,0xe5626b410dc8a9}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa06f,0xcd2e,0x736e,0xdfff,0x28f9,0xe694,0x7c39,0xab16,0x21f5,0xbc4,0x4883,0xe8f6,0xcaae,0xf3c3,0xa9f1,0x8d46,0x16e4,0xa8e2,0x5d95,0x3838,0xa6f1,0x34b7,0x94da,0xde}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcd2ea06f,0xdfff736e,0xe69428f9,0xab167c39,0xbc421f5,0xe8f64883,0xf3c3caae,0x8d46a9f1,0xa8e216e4,0x38385d95,0x34b7a6f1,0xde94da}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdfff736ecd2ea06f,0xab167c39e69428f9,0xe8f648830bc421f5,0x8d46a9f1f3c3caae,0x38385d95a8e216e4,0xde94da34b7a6f1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x389f,0x56c6,0xba3c,0x357a,0x94b7,0x1d0e,0x82a4,0x71fe,0x47db,0xe4cb,0xce25,0xc05e,0x551b,0xebc5,0x3f47,0x1cd0,0xf7bc,0xd3d6,0x2ebd,0xb1a9,0x2aa3,0x3afb,0xdb32,0x3a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x56c6389f,0x357aba3c,0x1d0e94b7,0x71fe82a4,0xe4cb47db,0xc05ece25,0xebc5551b,0x1cd03f47,0xd3d6f7bc,0xb1a92ebd,0x3afb2aa3,0x3adb32}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x357aba3c56c6389f,0x71fe82a41d0e94b7,0xc05ece25e4cb47db,0x1cd03f47ebc5551b,0xb1a92ebdd3d6f7bc,0x3adb323afb2aa3}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd72,0xd1f5,0x548,0xe0a7,0xee15,0xfdbc,0xc63c,0xd72b,0x1e45,0xe787,0xc513,0xb278,0x7cd,0xcab5,0x5ced,0x8be9,0xf4a4,0x9711,0xe9d8,0x872d,0x443,0xead0,0xe34d,0x2e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd1f50d72,0xe0a70548,0xfdbcee15,0xd72bc63c,0xe7871e45,0xb278c513,0xcab507cd,0x8be95ced,0x9711f4a4,0x872de9d8,0xead00443,0x2ee34d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe0a70548d1f50d72,0xd72bc63cfdbcee15,0xb278c513e7871e45,0x8be95cedcab507cd,0x872de9d89711f4a4,0x2ee34dead00443}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcecc,0x7789,0xbdb9,0x22b4,0x782f,0x794e,0x8e17,0xd2cc,0x1fb,0x1927,0x9c88,0x929,0x22b0,0x746e,0xd62b,0xade1,0xc7dd,0x5e2a,0xd146,0x7363,0xca5e,0x5460,0xd2b3,0xee}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7789cecc,0x22b4bdb9,0x794e782f,0xd2cc8e17,0x192701fb,0x9299c88,0x746e22b0,0xade1d62b,0x5e2ac7dd,0x7363d146,0x5460ca5e,0xeed2b3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x22b4bdb97789cecc,0xd2cc8e17794e782f,0x9299c88192701fb,0xade1d62b746e22b0,0x7363d1465e2ac7dd,0xeed2b35460ca5e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac65,0x6102,0xe1f0,0x7b39,0x64be,0xff4d,0x8256,0xd11b,0x4645,0x7a89,0x814c,0x66e7,0x77a,0xc4d8,0xe691,0x1f42,0xfdb9,0x547b,0x752,0x18d9,0x9279,0xe604,0xbed4,0xec}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6102ac65,0x7b39e1f0,0xff4d64be,0xd11b8256,0x7a894645,0x66e7814c,0xc4d8077a,0x1f42e691,0x547bfdb9,0x18d90752,0xe6049279,0xecbed4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7b39e1f06102ac65,0xd11b8256ff4d64be,0x66e7814c7a894645,0x1f42e691c4d8077a,0x18d90752547bfdb9,0xecbed4e6049279}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3380,0xe477,0x9e18,0x218d,0xddc6,0x4cc5,0xb33f,0x59e7,0xb291,0xa1a1,0x8f77,0x92a2,0x480e,0x82af,0x40f1,0x5d48,0x83b0,0x4229,0xcb9e,0xff7a,0x2e32,0xa78,0x71fc,0x16}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe4773380,0x218d9e18,0x4cc5ddc6,0x59e7b33f,0xa1a1b291,0x92a28f77,0x82af480e,0x5d4840f1,0x422983b0,0xff7acb9e,0xa782e32,0x1671fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x218d9e18e4773380,0x59e7b33f4cc5ddc6,0x92a28f77a1a1b291,0x5d4840f182af480e,0xff7acb9e422983b0,0x1671fc0a782e32}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xbb17,0xaa62,0x774e,0x2e59,0xe440,0xebce,0x874e,0xbfdb,0x3afd,0xa7ba,0xded2,0x78aa,0x7568,0xcfed,0x5633,0xa1de,0x4c5e,0x5796,0x5727,0xec25,0xac0a,0xce9c,0x3f13,0x98}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xaa62bb17,0x2e59774e,0xebcee440,0xbfdb874e,0xa7ba3afd,0x78aaded2,0xcfed7568,0xa1de5633,0x57964c5e,0xec255727,0xce9cac0a,0x983f13}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2e59774eaa62bb17,0xbfdb874eebcee440,0x78aaded2a7ba3afd,0xa1de5633cfed7568,0xec25572757964c5e,0x983f13ce9cac0a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x539b,0x9efd,0x1e0f,0x84c6,0x9b41,0xb2,0x7da9,0x2ee4,0xb9ba,0x8576,0x7eb3,0x9918,0xf885,0x3b27,0x196e,0xe0bd,0x246,0xab84,0xf8ad,0xe726,0x6d86,0x19fb,0x412b,0x13}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9efd539b,0x84c61e0f,0xb29b41,0x2ee47da9,0x8576b9ba,0x99187eb3,0x3b27f885,0xe0bd196e,0xab840246,0xe726f8ad,0x19fb6d86,0x13412b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x84c61e0f9efd539b,0x2ee47da900b29b41,0x99187eb38576b9ba,0xe0bd196e3b27f885,0xe726f8adab840246,0x13412b19fb6d86}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc761,0xa939,0x45c3,0xca85,0x6b48,0xe2f1,0x7d5b,0x8e01,0xb824,0x1b34,0x31da,0x3fa1,0xaae4,0x143a,0xc0b8,0xe32f,0x843,0x2c29,0xd142,0x4e56,0xd55c,0xc504,0x24cd,0xc5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xa939c761,0xca8545c3,0xe2f16b48,0x8e017d5b,0x1b34b824,0x3fa131da,0x143aaae4,0xe32fc0b8,0x2c290843,0x4e56d142,0xc504d55c,0xc524cd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xca8545c3a939c761,0x8e017d5be2f16b48,0x3fa131da1b34b824,0xe32fc0b8143aaae4,0x4e56d1422c290843,0xc524cdc504d55c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe87a,0x6127,0x8903,0x2308,0xfbed,0x12dc,0x3209,0xc898,0x715,0x2ab8,0x446f,0x1078,0x2808,0x2493,0x34a9,0xf92b,0x96f4,0xa3a,0xf860,0xd4ad,0xc8a9,0x410d,0x626b,0xe5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6127e87a,0x23088903,0x12dcfbed,0xc8983209,0x2ab80715,0x1078446f,0x24932808,0xf92b34a9,0xa3a96f4,0xd4adf860,0x410dc8a9,0xe5626b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x230889036127e87a,0xc898320912dcfbed,0x1078446f2ab80715,0xf92b34a924932808,0xd4adf8600a3a96f4,0xe5626b410dc8a9}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa06f,0xcd2e,0x736e,0xdfff,0x28f9,0xe694,0x7c39,0xab16,0x21f5,0xbc4,0x4883,0xe8f6,0xcaae,0xf3c3,0xa9f1,0x8d46,0x16e4,0xa8e2,0x5d95,0x3838,0xa6f1,0x34b7,0x94da,0xde}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcd2ea06f,0xdfff736e,0xe69428f9,0xab167c39,0xbc421f5,0xe8f64883,0xf3c3caae,0x8d46a9f1,0xa8e216e4,0x38385d95,0x34b7a6f1,0xde94da}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xdfff736ecd2ea06f,0xab167c39e69428f9,0xe8f648830bc421f5,0x8d46a9f1f3c3caae,0x38385d95a8e216e4,0xde94da34b7a6f1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x389f,0x56c6,0xba3c,0x357a,0x94b7,0x1d0e,0x82a4,0x71fe,0x47db,0xe4cb,0xce25,0xc05e,0x551b,0xebc5,0x3f47,0x1cd0,0xf7bc,0xd3d6,0x2ebd,0xb1a9,0x2aa3,0x3afb,0xdb32,0x3a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x56c6389f,0x357aba3c,0x1d0e94b7,0x71fe82a4,0xe4cb47db,0xc05ece25,0xebc5551b,0x1cd03f47,0xd3d6f7bc,0xb1a92ebd,0x3afb2aa3,0x3adb32}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x357aba3c56c6389f,0x71fe82a41d0e94b7,0xc05ece25e4cb47db,0x1cd03f47ebc5551b,0xb1a92ebdd3d6f7bc,0x3adb323afb2aa3}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x86b9,0x68fa,0x82a4,0xf053,0x770a,0x7ede,0xe31e,0xeb95,0x8f22,0xf3c3,0x6289,0xd93c,0x83e6,0xe55a,0xae76,0x45f4,0xfa52,0x4b88,0xf4ec,0xc396,0x221,0xf568,0x71a6,0x97}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x68fa86b9,0xf05382a4,0x7ede770a,0xeb95e31e,0xf3c38f22,0xd93c6289,0xe55a83e6,0x45f4ae76,0x4b88fa52,0xc396f4ec,0xf5680221,0x9771a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf05382a468fa86b9,0xeb95e31e7ede770a,0xd93c6289f3c38f22,0x45f4ae76e55a83e6,0xc396f4ec4b88fa52,0x9771a6f5680221}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe766,0xbbc4,0x5edc,0x915a,0x3c17,0xbca7,0x470b,0xe966,0x80fd,0xc93,0xce44,0x494,0x1158,0xba37,0xeb15,0xd6f0,0x63ee,0x2f15,0xe8a3,0x39b1,0x652f,0xaa30,0x6959,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbbc4e766,0x915a5edc,0xbca73c17,0xe966470b,0xc9380fd,0x494ce44,0xba371158,0xd6f0eb15,0x2f1563ee,0x39b1e8a3,0xaa30652f,0xf76959}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x915a5edcbbc4e766,0xe966470bbca73c17,0x494ce440c9380fd,0xd6f0eb15ba371158,0x39b1e8a32f1563ee,0xf76959aa30652f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xb919,0xcfad,0xeb7f,0x81f8,0x4d97,0xf272,0x4300,0xdd38,0x1b01,0x826,0x1894,0x3e43,0x7310,0xa84,0x4161,0x7c63,0xec4,0x9625,0xe475,0xadc9,0x5a7,0xfa6a,0xb7e3,0x7e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcfadb919,0x81f8eb7f,0xf2724d97,0xdd384300,0x8261b01,0x3e431894,0xa847310,0x7c634161,0x96250ec4,0xadc9e475,0xfa6a05a7,0x7eb7e3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x81f8eb7fcfadb919,0xdd384300f2724d97,0x3e43189408261b01,0x7c6341610a847310,0xadc9e47596250ec4,0x7eb7e3fa6a05a7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1e83,0xade4,0x9d21,0x2e51,0x42e5,0xd3,0xac79,0xe0a8,0x32e2,0xfcf2,0xb504,0xc941,0xa0d0,0x8016,0x5485,0x3331,0xabd7,0xc296,0xf76e,0xef5,0xce39,0x8e31,0x165c,0x56}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xade41e83,0x2e519d21,0xd342e5,0xe0a8ac79,0xfcf232e2,0xc941b504,0x8016a0d0,0x33315485,0xc296abd7,0xef5f76e,0x8e31ce39,0x56165c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2e519d21ade41e83,0xe0a8ac7900d342e5,0xc941b504fcf232e2,0x333154858016a0d0,0xef5f76ec296abd7,0x56165c8e31ce39}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xdd11,0x6e27,0xfbdb,0xf5d9,0xd6cb,0x9fef,0xc59a,0x7a4,0xfbd,0x5c3e,0xbc2,0xd091,0x6546,0xc9d0,0x193e,0x93fa,0x776,0x2763,0xdecd,0xbbe3,0xcec1,0x6abf,0x9070,0x66}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6e27dd11,0xf5d9fbdb,0x9fefd6cb,0x7a4c59a,0x5c3e0fbd,0xd0910bc2,0xc9d06546,0x93fa193e,0x27630776,0xbbe3decd,0x6abfcec1,0x669070}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf5d9fbdb6e27dd11,0x7a4c59a9fefd6cb,0xd0910bc25c3e0fbd,0x93fa193ec9d06546,0xbbe3decd27630776,0x6690706abfcec1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x46e7,0x3052,0x1480,0x7e07,0xb268,0xd8d,0xbcff,0x22c7,0xe4fe,0xf7d9,0xe76b,0xc1bc,0x8cef,0xf57b,0xbe9e,0x839c,0xf13b,0x69da,0x1b8a,0x5236,0xfa58,0x595,0x481c,0x81}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x305246e7,0x7e071480,0xd8db268,0x22c7bcff,0xf7d9e4fe,0xc1bce76b,0xf57b8cef,0x839cbe9e,0x69daf13b,0x52361b8a,0x595fa58,0x81481c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7e071480305246e7,0x22c7bcff0d8db268,0xc1bce76bf7d9e4fe,0x839cbe9ef57b8cef,0x52361b8a69daf13b,0x81481c0595fa58}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0xb89, 0xf4d, 0xbd8, 0x18d2, 0x781, 0x1f79, 0xef5, 0xcfd, 0xa7d, 0x121a, 0x59e, 0x18a3, 0x2b, 0x122f, 0x9d5, 0x18aa, 0x105f, 0x1bcd, 0x871, 0x1f9d, 0xae4, 0xc5c, 0x385, 0xbe8, 0x1878, 0xcd8, 0x7a1, 0x7c8, 0x5b4, 0xe} +#elif RADIX == 32 +{0x7a6ae25, 0x71a4bd8, 0x5fbc9e0, 0xf59faef, 0x9e90d29, 0xaf1465, 0x9d59178, 0xc17f154, 0xa871de6, 0xe2b93f3, 0xd038562, 0x6c61e17, 0xf907a16, 0x306d0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xc9e071a4bd87a6ae, 0xe90d29f59faef5fb, 0x49d591780af14659, 0x3f3a871de6c17f15, 0x61e17d038562e2b9, 0x9956d0f907a166c} +#else +{0x40e3497b0f4d5c, 0x27d67ebbd7ef27, 0x40578a32cf4869, 0x6c17f1549d5917, 0x5c5727e750e3bc, 0x1b18785f40e158, 0x4cab687c83d0b} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0xb60, 0x3d3, 0x12f6, 0xe34, 0x9e0, 0xfde, 0xbbd, 0xb3f, 0x129f, 0x1486, 0x1967, 0x1e28, 0x180a, 0xc8b, 0x1275, 0x1e2a, 0xc17, 0xef3, 0xa1c, 0x7e7, 0x2b9, 0xb17, 0xe1, 0x2fa, 0x61e, 0xb36, 0x1e8, 0x1f2, 0x156d, 0xc} +#elif RADIX == 32 +{0x1e9ad81, 0x1c692f6, 0xd7ef278, 0x7d67ebb, 0x67a434a, 0x2bc519, 0x275645e, 0xb05fc55, 0xea1c779, 0xb8ae4fc, 0xf40e158, 0x9b18785, 0x3e41e85, 0x245b4} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf2781c692f61e9ad, 0x7a434a7d67ebbd7e, 0x5275645e02bc5196, 0x4fcea1c779b05fc5, 0x18785f40e158b8ae, 0x20e55b43e41e859b} +#else +{0x7038d25ec3d35b, 0x29f59faef5fbc9, 0x7015e28cb3d21a, 0x1b05fc55275645, 0x1715c9f9d438ef, 0x66c61e17d03856, 0x32ada1f20f42} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x441, 0x1774, 0x1527, 0x106a, 0x577, 0x3fc, 0xf92, 0x12c4, 0x96a, 0x10ea, 0x10f5, 0x11c9, 0x1f8, 0x1407, 0x1bcc, 0x16c4, 0x15c1, 0x790, 0x5bc, 0x1c28, 0xbc6, 0x123c, 0xf19, 0x1d6f, 0x361, 0x1fcd, 0x1dc9, 0x20c, 0x17c6, 0x6} +#elif RADIX == 32 +{0xbba1104, 0xe0d5527, 0x21fe15d, 0xaa588f9, 0xf587525, 0x7e23930, 0xbcca038, 0x5706d89, 0x5bc3c8, 0xe2f1b85, 0xdef1991, 0xe68d87a, 0x419dc9f, 0x35f18} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe15de0d5527bba11, 0x587525aa588f921f, 0x9bcca0387e23930f, 0xb8505bc3c85706d8, 0x8d87adef1991e2f1, 0x139f18419dc9fe6} +#else +{0x3bc1aaa4f77422, 0x16a9623e487f85, 0x43f11c987ac3a9, 0x5706d89bcca03, 0x3c5e370a0b7879, 0x79a361eb7bc664, 0x9cf8c20cee4f} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x98a, 0x1bbb, 0x7d8, 0xd84, 0x3fe, 0x90b, 0xfe8, 0x12c3, 0x1e84, 0xde3, 0xbe1, 0x1217, 0x1925, 0x84a, 0xa0e, 0x7cd, 0x1854, 0x768, 0x6e6, 0x1d87, 0xfac, 0x6df, 0x109b, 0x64d, 0x9f2, 0x596, 0x435, 0x1918, 0x1095, 0x0} +#elif RADIX == 32 +{0xddda628, 0x9b087d8, 0x84858ff, 0x12586fe, 0xe16f1fa, 0x49642eb, 0xa0e4256, 0x6150f9a, 0xe6e63b4, 0xfbeb3b0, 0x9b09b36, 0xcb27c8c, 0x2304352, 0x4257} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x58ff9b087d8ddda6, 0x16f1fa12586fe848, 0xaa0e425649642ebe, 0x3b0e6e63b46150f9, 0x27c8c9b09b36fbeb, 0xa2c2572304352cb} +#else +{0x7f3610fb1bbb4c, 0x684961bfa12163, 0x324b2175f0b78f, 0x46150f9aa0e425, 0x5f7d6761cdcc76, 0x32c9f2326c26cd, 0x51612b91821a9} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x17ec, 0x6b9, 0x1dc0, 0x1783, 0x18ee, 0xdd4, 0x1c7f, 0x1fb2, 0x16b0, 0x196e, 0x1e5a, 0x1fda, 0x11f9, 0x117, 0x1c30, 0x1a47, 0x2a2, 0x19e6, 0x1347, 0x2bb, 0x1463, 0x1f37, 0xa64, 0x3c6, 0x1910, 0x2bc, 0xbc0, 0x17e8, 0x1cfd, 0xa} +#elif RADIX == 32 +{0x35cdfb1, 0xaf07dc0, 0xf6ea63b, 0xc3f65c7, 0x5acb75a, 0x7e7fb5e, 0xc3008bc, 0xa8b48f, 0x7347cf3, 0xbd18c57, 0x8ca64f9, 0x5e64407, 0xfd0bc01, 0x163f6} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xa63baf07dc035cdf, 0xacb75ac3f65c7f6e, 0xfc3008bc7e7fb5e5, 0xc577347cf30a8b48, 0x644078ca64f9bd18, 0x2d073f6fd0bc015e} +#else +{0x775e0fb806b9bf, 0x6b0fd971fdba98, 0x63f3fdaf2d65ba, 0x30a8b48fc3008b, 0x37a318aee68f9e, 0x5799101e32993e, 0x6439fb7e85e00} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x440, 0x172e, 0x4f, 0x1e07, 0x15ce, 0x1b55, 0x68e, 0x2c, 0x13bb, 0x1f43, 0x1dda, 0x1fb4, 0xe54, 0x1502, 0x723, 0x7e7, 0x1147, 0x1ba0, 0x3d0, 0xf7c, 0x1754, 0x5fc, 0x1098, 0x16aa, 0x182, 0x1c1d, 0x18e9, 0x13ce, 0xbae, 0x18} +#elif RADIX == 32 +{0xb971102, 0xbc0e04f, 0xedaad73, 0xec05868, 0xdafa1ce, 0x953f69d, 0x723a813, 0x451cfce, 0x83d0dd0, 0xe5d51ef, 0x550982f, 0xe860ad, 0x79d8e9e, 0x40eba} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xad73bc0e04fb9711, 0xafa1ceec05868eda, 0xe723a813953f69dd, 0x1ef83d0dd0451cfc, 0x860ad550982fe5d5, 0xc2eba79d8e9e0e} +#else +{0x67781c09f72e22, 0x3bb0161a3b6ab5, 0x1ca9fb4eed7d0e, 0x451cfce723a81, 0x7cbaa3df07a1ba, 0x3a182b554260b, 0x6175d3cec74f} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x18c5, 0x1326, 0x1d4d, 0x19eb, 0xea, 0x947, 0x1adf, 0xbf5, 0xafe, 0x1225, 0x18a0, 0xb3a, 0x8e0, 0xaea, 0x17aa, 0x19a5, 0x912, 0x634, 0x15c7, 0x1df7, 0x13cb, 0x1894, 0xeaa, 0xa69, 0x6ca, 0x1b49, 0x26f, 0x1f50, 0xd92, 0x6} +#elif RADIX == 32 +{0x9936314, 0xb3d7d4d, 0xf4a383a, 0xf97ebad, 0xa0912ab, 0x3816758, 0x7aa5752, 0x244b34b, 0xf5c731a, 0xa4f2fbe, 0xd2eaac4, 0xa49b294, 0xea026fd, 0x3364b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x383ab3d7d4d99363, 0x912abf97ebadf4a, 0xb7aa57523816758a, 0xfbef5c731a244b34, 0x9b294d2eaac4a4f2, 0x54764bea026fda4} +#else +{0x7567afa9b326c6, 0x2fe5faeb7d28e0, 0x11c0b3ac504895, 0x2244b34b7aa575, 0x149e5f7deb8e63, 0x6926ca534baab1, 0x2a3b25f50137e} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x132f, 0x6d5, 0x95b, 0xa68, 0x1814, 0x12d3, 0x1f1e, 0x857, 0x14fa, 0xcf, 0x1f19, 0xe1b, 0x1cf7, 0xa53, 0x1455, 0x5ef, 0x3e2, 0x199c, 0x1162, 0x38d, 0x174b, 0x794, 0xef6, 0xf74, 0x9c, 0x1f55, 0x1c4d, 0x56f, 0x1638, 0x19} +#elif RADIX == 32 +{0x36accbf, 0x14d095b, 0xe969e05, 0xe90aff1, 0x19067d3, 0x3ddc37f, 0x455529f, 0xf88bdf, 0xb162cce, 0xa5d2c71, 0xe8ef63c, 0xaa8271e, 0xadfc4df, 0xa8e0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x9e0514d095b36acc, 0x9067d3e90aff1e96, 0xf455529f3ddc37f1, 0xc71b162cce0f88bd, 0x8271ee8ef63ca5d2, 0x30898e0adfc4dfaa} +#else +{0xa29a12b66d599, 0x4fa42bfc7a5a78, 0x79eee1bf8c833e, 0x60f88bdf455529, 0x14ba58e362c599, 0x6aa09c7ba3bd8f, 0x804c7056fe26f} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe7,0x36f4,0xe2a7,0x986d,0x214b,0xf464,0x7818,0x49f7,0x5ea0,0x73e7,0x9e17,0x85a0,0xd1cc,0xc33d,0x7833,0xbb28,0xba60,0x69d5,0xd73c,0x879e,0x6732,0x905,0xeefd,0xc8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x36f400e7,0x986de2a7,0xf464214b,0x49f77818,0x73e75ea0,0x85a09e17,0xc33dd1cc,0xbb287833,0x69d5ba60,0x879ed73c,0x9056732,0xc8eefd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x986de2a736f400e7,0x49f77818f464214b,0x85a09e1773e75ea0,0xbb287833c33dd1cc,0x879ed73c69d5ba60,0xc8eefd09056732}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x925e,0xff6f,0xa6dc,0x2eff,0xb2a6,0xe88c,0xab24,0x6829,0x91eb,0x118,0x77ac,0x8506,0x9934,0x5a86,0x5cac,0xfd15,0x5869,0xc232,0xebcf,0xcdef,0x254,0xf9e4,0xcc7b,0x96}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xff6f925e,0x2effa6dc,0xe88cb2a6,0x6829ab24,0x11891eb,0x850677ac,0x5a869934,0xfd155cac,0xc2325869,0xcdefebcf,0xf9e40254,0x96cc7b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2effa6dcff6f925e,0x6829ab24e88cb2a6,0x850677ac011891eb,0xfd155cac5a869934,0xcdefebcfc2325869,0x96cc7bf9e40254}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xae19,0xed4d,0x178c,0x7829,0x7b15,0x4808,0xdab3,0xebc6,0x25cb,0x3298,0xe9bd,0x3d5e,0xe9a4,0x960,0x92e6,0xb3ea,0x33e,0xf491,0x2343,0xbdb9,0xa17d,0x63a5,0x767f,0x41}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xed4dae19,0x7829178c,0x48087b15,0xebc6dab3,0x329825cb,0x3d5ee9bd,0x960e9a4,0xb3ea92e6,0xf491033e,0xbdb92343,0x63a5a17d,0x41767f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7829178ced4dae19,0xebc6dab348087b15,0x3d5ee9bd329825cb,0xb3ea92e60960e9a4,0xbdb92343f491033e,0x41767f63a5a17d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xff19,0xc90b,0x1d58,0x6792,0xdeb4,0xb9b,0x87e7,0xb608,0xa15f,0x8c18,0x61e8,0x7a5f,0x2e33,0x3cc2,0x87cc,0x44d7,0x459f,0x962a,0x28c3,0x7861,0x98cd,0xf6fa,0x1102,0x37}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc90bff19,0x67921d58,0xb9bdeb4,0xb60887e7,0x8c18a15f,0x7a5f61e8,0x3cc22e33,0x44d787cc,0x962a459f,0x786128c3,0xf6fa98cd,0x371102}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x67921d58c90bff19,0xb60887e70b9bdeb4,0x7a5f61e88c18a15f,0x44d787cc3cc22e33,0x786128c3962a459f,0x371102f6fa98cd}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xa74d,0x6268,0x6670,0x157d,0x36bf,0xbff5,0x13f3,0x62fb,0x404b,0x863b,0xb7a3,0xada5,0x355f,0xc945,0x6b4c,0x7d75,0x9efd,0x8901,0x4c90,0xba3e,0x48f0,0x5677,0x49eb,0x93}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6268a74d,0x157d6670,0xbff536bf,0x62fb13f3,0x863b404b,0xada5b7a3,0xc945355f,0x7d756b4c,0x89019efd,0xba3e4c90,0x567748f0,0x9349eb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x157d66706268a74d,0x62fb13f3bff536bf,0xada5b7a3863b404b,0x7d756b4cc945355f,0xba3e4c9089019efd,0x9349eb567748f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd72,0xd1f5,0x548,0xe0a7,0xee15,0xfdbc,0xc63c,0xd72b,0x1e45,0xe787,0xc513,0xb278,0x7cd,0xcab5,0x5ced,0x8be9,0xf4a4,0x9711,0xe9d8,0x872d,0x443,0xead0,0xe34d,0x2e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd1f50d72,0xe0a70548,0xfdbcee15,0xd72bc63c,0xe7871e45,0xb278c513,0xcab507cd,0x8be95ced,0x9711f4a4,0x872de9d8,0xead00443,0x2ee34d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe0a70548d1f50d72,0xd72bc63cfdbcee15,0xb278c513e7871e45,0x8be95cedcab507cd,0x872de9d89711f4a4,0x2ee34dead00443}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xcecc,0x7789,0xbdb9,0x22b4,0x782f,0x794e,0x8e17,0xd2cc,0x1fb,0x1927,0x9c88,0x929,0x22b0,0x746e,0xd62b,0xade1,0xc7dd,0x5e2a,0xd146,0x7363,0xca5e,0x5460,0xd2b3,0xee}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7789cecc,0x22b4bdb9,0x794e782f,0xd2cc8e17,0x192701fb,0x9299c88,0x746e22b0,0xade1d62b,0x5e2ac7dd,0x7363d146,0x5460ca5e,0xeed2b3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x22b4bdb97789cecc,0xd2cc8e17794e782f,0x9299c88192701fb,0xade1d62b746e22b0,0x7363d1465e2ac7dd,0xeed2b35460ca5e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x58b3,0x9d97,0x998f,0xea82,0xc940,0x400a,0xec0c,0x9d04,0xbfb4,0x79c4,0x485c,0x525a,0xcaa0,0x36ba,0x94b3,0x828a,0x6102,0x76fe,0xb36f,0x45c1,0xb70f,0xa988,0xb614,0x6c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9d9758b3,0xea82998f,0x400ac940,0x9d04ec0c,0x79c4bfb4,0x525a485c,0x36bacaa0,0x828a94b3,0x76fe6102,0x45c1b36f,0xa988b70f,0x6cb614}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea82998f9d9758b3,0x9d04ec0c400ac940,0x525a485c79c4bfb4,0x828a94b336bacaa0,0x45c1b36f76fe6102,0x6cb614a988b70f}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3d63,0xdad1,0xf501,0xd58f,0x8741,0xd265,0xf8bd,0xb3b9,0xac08,0xfc8b,0x45ab,0xbcdf,0x501,0x9f7,0x10ed,0x102f,0xc6e3,0xdc57,0xf892,0x8db4,0x2c76,0x21ab,0x2bc3,0x8e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdad13d63,0xd58ff501,0xd2658741,0xb3b9f8bd,0xfc8bac08,0xbcdf45ab,0x9f70501,0x102f10ed,0xdc57c6e3,0x8db4f892,0x21ab2c76,0x8e2bc3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd58ff501dad13d63,0xb3b9f8bdd2658741,0xbcdf45abfc8bac08,0x102f10ed09f70501,0x8db4f892dc57c6e3,0x8e2bc321ab2c76}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc998,0x418c,0xa8e4,0x2354,0x622a,0xb76d,0x5487,0xdad9,0x1672,0x522b,0xa00f,0xdfa5,0x296b,0xe17c,0x595e,0x91e1,0xa22d,0xe126,0x904c,0x9288,0x5075,0xc6c5,0x61b0,0xb1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x418cc998,0x2354a8e4,0xb76d622a,0xdad95487,0x522b1672,0xdfa5a00f,0xe17c296b,0x91e1595e,0xe126a22d,0x9288904c,0xc6c55075,0xb161b0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2354a8e4418cc998,0xdad95487b76d622a,0xdfa5a00f522b1672,0x91e1595ee17c296b,0x9288904ce126a22d,0xb161b0c6c55075}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1271,0x594e,0x16ee,0x35fa,0xaf0e,0x11b2,0x1fca,0x24b7,0xa3e3,0x2bcc,0xc2f0,0x6409,0xf8e1,0x6a8f,0x67e,0xe7ee,0xad00,0x2b9a,0x6813,0x5e0a,0x6dec,0x48f5,0xbd1d,0xb3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x594e1271,0x35fa16ee,0x11b2af0e,0x24b71fca,0x2bcca3e3,0x6409c2f0,0x6a8ff8e1,0xe7ee067e,0x2b9aad00,0x5e0a6813,0x48f56dec,0xb3bd1d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x35fa16ee594e1271,0x24b71fca11b2af0e,0x6409c2f02bcca3e3,0xe7ee067e6a8ff8e1,0x5e0a68132b9aad00,0xb3bd1d48f56dec}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xc29d,0x252e,0xafe,0x2a70,0x78be,0x2d9a,0x742,0x4c46,0x53f7,0x374,0xba54,0x4320,0xfafe,0xf608,0xef12,0xefd0,0x391c,0x23a8,0x76d,0x724b,0xd389,0xde54,0xd43c,0x71}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x252ec29d,0x2a700afe,0x2d9a78be,0x4c460742,0x37453f7,0x4320ba54,0xf608fafe,0xefd0ef12,0x23a8391c,0x724b076d,0xde54d389,0x71d43c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2a700afe252ec29d,0x4c4607422d9a78be,0x4320ba54037453f7,0xefd0ef12f608fafe,0x724b076d23a8391c,0x71d43cde54d389}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe7,0x36f4,0xe2a7,0x986d,0x214b,0xf464,0x7818,0x49f7,0x5ea0,0x73e7,0x9e17,0x85a0,0xd1cc,0xc33d,0x7833,0xbb28,0xba60,0x69d5,0xd73c,0x879e,0x6732,0x905,0xeefd,0xc8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x36f400e7,0x986de2a7,0xf464214b,0x49f77818,0x73e75ea0,0x85a09e17,0xc33dd1cc,0xbb287833,0x69d5ba60,0x879ed73c,0x9056732,0xc8eefd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x986de2a736f400e7,0x49f77818f464214b,0x85a09e1773e75ea0,0xbb287833c33dd1cc,0x879ed73c69d5ba60,0xc8eefd09056732}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x925e,0xff6f,0xa6dc,0x2eff,0xb2a6,0xe88c,0xab24,0x6829,0x91eb,0x118,0x77ac,0x8506,0x9934,0x5a86,0x5cac,0xfd15,0x5869,0xc232,0xebcf,0xcdef,0x254,0xf9e4,0xcc7b,0x96}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xff6f925e,0x2effa6dc,0xe88cb2a6,0x6829ab24,0x11891eb,0x850677ac,0x5a869934,0xfd155cac,0xc2325869,0xcdefebcf,0xf9e40254,0x96cc7b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2effa6dcff6f925e,0x6829ab24e88cb2a6,0x850677ac011891eb,0xfd155cac5a869934,0xcdefebcfc2325869,0x96cc7bf9e40254}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xae19,0xed4d,0x178c,0x7829,0x7b15,0x4808,0xdab3,0xebc6,0x25cb,0x3298,0xe9bd,0x3d5e,0xe9a4,0x960,0x92e6,0xb3ea,0x33e,0xf491,0x2343,0xbdb9,0xa17d,0x63a5,0x767f,0x41}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xed4dae19,0x7829178c,0x48087b15,0xebc6dab3,0x329825cb,0x3d5ee9bd,0x960e9a4,0xb3ea92e6,0xf491033e,0xbdb92343,0x63a5a17d,0x41767f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7829178ced4dae19,0xebc6dab348087b15,0x3d5ee9bd329825cb,0xb3ea92e60960e9a4,0xbdb92343f491033e,0x41767f63a5a17d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xff19,0xc90b,0x1d58,0x6792,0xdeb4,0xb9b,0x87e7,0xb608,0xa15f,0x8c18,0x61e8,0x7a5f,0x2e33,0x3cc2,0x87cc,0x44d7,0x459f,0x962a,0x28c3,0x7861,0x98cd,0xf6fa,0x1102,0x37}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc90bff19,0x67921d58,0xb9bdeb4,0xb60887e7,0x8c18a15f,0x7a5f61e8,0x3cc22e33,0x44d787cc,0x962a459f,0x786128c3,0xf6fa98cd,0x371102}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x67921d58c90bff19,0xb60887e70b9bdeb4,0x7a5f61e88c18a15f,0x44d787cc3cc22e33,0x786128c3962a459f,0x371102f6fa98cd}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x53a7,0x3134,0xb338,0x8abe,0x9b5f,0xdffa,0x89f9,0xb17d,0xa025,0xc31d,0xdbd1,0xd6d2,0x9aaf,0x64a2,0xb5a6,0xbeba,0xcf7e,0x4480,0x2648,0x5d1f,0xa478,0xab3b,0xa4f5,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x313453a7,0x8abeb338,0xdffa9b5f,0xb17d89f9,0xc31da025,0xd6d2dbd1,0x64a29aaf,0xbebab5a6,0x4480cf7e,0x5d1f2648,0xab3ba478,0xc9a4f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8abeb338313453a7,0xb17d89f9dffa9b5f,0xd6d2dbd1c31da025,0xbebab5a664a29aaf,0x5d1f26484480cf7e,0xc9a4f5ab3ba478}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x86b9,0x68fa,0x82a4,0xf053,0x770a,0x7ede,0xe31e,0xeb95,0x8f22,0xf3c3,0x6289,0xd93c,0x83e6,0xe55a,0xae76,0x45f4,0xfa52,0x4b88,0xf4ec,0xc396,0x221,0xf568,0x71a6,0x97}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x68fa86b9,0xf05382a4,0x7ede770a,0xeb95e31e,0xf3c38f22,0xd93c6289,0xe55a83e6,0x45f4ae76,0x4b88fa52,0xc396f4ec,0xf5680221,0x9771a6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf05382a468fa86b9,0xeb95e31e7ede770a,0xd93c6289f3c38f22,0x45f4ae76e55a83e6,0xc396f4ec4b88fa52,0x9771a6f5680221}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe766,0xbbc4,0x5edc,0x915a,0x3c17,0xbca7,0x470b,0xe966,0x80fd,0xc93,0xce44,0x494,0x1158,0xba37,0xeb15,0xd6f0,0x63ee,0x2f15,0xe8a3,0x39b1,0x652f,0xaa30,0x6959,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbbc4e766,0x915a5edc,0xbca73c17,0xe966470b,0xc9380fd,0x494ce44,0xba371158,0xd6f0eb15,0x2f1563ee,0x39b1e8a3,0xaa30652f,0xf76959}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x915a5edcbbc4e766,0xe966470bbca73c17,0x494ce440c9380fd,0xd6f0eb15ba371158,0x39b1e8a32f1563ee,0xf76959aa30652f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xac5a,0xcecb,0x4cc7,0x7541,0x64a0,0x2005,0x7606,0x4e82,0x5fda,0x3ce2,0x242e,0x292d,0x6550,0x9b5d,0x4a59,0x4145,0x3081,0xbb7f,0xd9b7,0xa2e0,0x5b87,0x54c4,0x5b0a,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xcecbac5a,0x75414cc7,0x200564a0,0x4e827606,0x3ce25fda,0x292d242e,0x9b5d6550,0x41454a59,0xbb7f3081,0xa2e0d9b7,0x54c45b87,0x365b0a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x75414cc7cecbac5a,0x4e827606200564a0,0x292d242e3ce25fda,0x41454a599b5d6550,0xa2e0d9b7bb7f3081,0x365b0a54c45b87}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd70d,0x31e4,0xa551,0x7483,0x6f09,0x34d,0x6a80,0x85f,0x6b11,0xe29b,0x188,0x38d2,0x85b,0xa241,0xc423,0xddc8,0x3260,0x1722,0xf3a4,0x7cf7,0x36e8,0x7955,0xeeb9,0xc6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x31e4d70d,0x7483a551,0x34d6f09,0x85f6a80,0xe29b6b11,0x38d20188,0xa241085b,0xddc8c423,0x17223260,0x7cf7f3a4,0x795536e8,0xc6eeb9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7483a55131e4d70d,0x85f6a80034d6f09,0x38d20188e29b6b11,0xddc8c423a241085b,0x7cf7f3a417223260,0xc6eeb9795536e8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x59a9,0x8f53,0xd42f,0xf65b,0x7134,0x4475,0x9543,0x8428,0x4555,0x7d45,0x7bfb,0xe15d,0xe9c2,0x24ec,0xf17f,0x88ea,0x766c,0xbf2d,0x2b42,0x2771,0x5dfc,0xd040,0xfa62,0xc9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8f5359a9,0xf65bd42f,0x44757134,0x84289543,0x7d454555,0xe15d7bfb,0x24ece9c2,0x88eaf17f,0xbf2d766c,0x27712b42,0xd0405dfc,0xc9fa62}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf65bd42f8f5359a9,0x8428954344757134,0xe15d7bfb7d454555,0x88eaf17f24ece9c2,0x27712b42bf2d766c,0xc9fa62d0405dfc}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x4b49,0x89b0,0x8c52,0x91ca,0xed1b,0xd527,0x453,0x82d,0xb0eb,0xb6bf,0x3790,0x5816,0x49bb,0xa0a7,0xffc6,0x5530,0x23b9,0x12bb,0x52c4,0x6f51,0x25fd,0x62d,0x723d,0xc6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x89b04b49,0x91ca8c52,0xd527ed1b,0x82d0453,0xb6bfb0eb,0x58163790,0xa0a749bb,0x5530ffc6,0x12bb23b9,0x6f5152c4,0x62d25fd,0xc6723d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x91ca8c5289b04b49,0x82d0453d527ed1b,0x58163790b6bfb0eb,0x5530ffc6a0a749bb,0x6f5152c412bb23b9,0xc6723d062d25fd}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x28f3,0xce1b,0x5aae,0x8b7c,0x90f6,0xfcb2,0x957f,0xf7a0,0x94ee,0x1d64,0xfe77,0xc72d,0xf7a4,0x5dbe,0x3bdc,0x2237,0xcd9f,0xe8dd,0xc5b,0x8308,0xc917,0x86aa,0x1146,0x39}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xce1b28f3,0x8b7c5aae,0xfcb290f6,0xf7a0957f,0x1d6494ee,0xc72dfe77,0x5dbef7a4,0x22373bdc,0xe8ddcd9f,0x83080c5b,0x86aac917,0x391146}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x8b7c5aaece1b28f3,0xf7a0957ffcb290f6,0xc72dfe771d6494ee,0x22373bdc5dbef7a4,0x83080c5be8ddcd9f,0x39114686aac917}}} +#endif +}}}}; diff --git a/src/precomp/ref/lvl3/hd_splitting_transforms.c b/src/precomp/ref/lvl3/hd_splitting_transforms.c new file mode 100644 index 0000000..d980d12 --- /dev/null +++ b/src/precomp/ref/lvl3/hd_splitting_transforms.c @@ -0,0 +1,143 @@ +#include + +#define FP2_ZERO 0 +#define FP2_ONE 1 +#define FP2_I 2 +#define FP2_MINUS_ONE 3 +#define FP2_MINUS_I 4 + +const int EVEN_INDEX[10][2] = {{0, 0}, {0, 1}, {0, 2}, {0, 3}, {1, 0}, {1, 2}, {2, 0}, {2, 1}, {3, 0}, {3, 3}}; +const int CHI_EVAL[4][4] = {{1, 1, 1, 1}, {1, -1, 1, -1}, {1, 1, -1, -1}, {1, -1, -1, 1}}; +const fp2_t FP2_CONSTANTS[5] = {{ +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} +#elif RADIX == 32 +{0x3f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10000} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3, 0x0, 0x0, 0x0, 0x0, 0x3d00000000000000} +#else +{0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe400000000000} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x1f03, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0xfff, 0x1e} +#elif RADIX == 32 +{0xffffc0f, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0x30fff} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xfffffffffffffffc, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x3ffffffffffffff} +#else +{0x7ffffffffffff8, 0x7fffffffffffff, 0x7fffffffffffff, 0x7fffffffffffff, 0x7fffffffffffff, 0x7fffffffffffff, 0x1ffffffffffff} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1f03, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0xfff, 0x1e} +#elif RADIX == 32 +{0xffffc0f, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, 0x30fff} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xfffffffffffffffc, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x3ffffffffffffff} +#else +{0x7ffffffffffff8, 0x7fffffffffffff, 0x7fffffffffffff, 0x7fffffffffffff, 0x7fffffffffffff, 0x7fffffffffffff, 0x1ffffffffffff} +#endif +#endif +}}; +const precomp_basis_change_matrix_t SPLITTING_TRANSFORMS[10] = {{{{FP2_ONE, FP2_I, FP2_ONE, FP2_I}, {FP2_ONE, FP2_MINUS_I, FP2_MINUS_ONE, FP2_I}, {FP2_ONE, FP2_I, FP2_MINUS_ONE, FP2_MINUS_I}, {FP2_MINUS_ONE, FP2_I, FP2_MINUS_ONE, FP2_I}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_MINUS_ONE, FP2_ZERO, FP2_ZERO}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_MINUS_ONE, FP2_ZERO}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_ONE, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}}}}; +const precomp_basis_change_matrix_t NORMALIZATION_TRANSFORMS[6] = {{{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}}}, {{{FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}}}, {{{FP2_MINUS_ONE, FP2_I, FP2_I, FP2_ONE}, {FP2_I, FP2_MINUS_ONE, FP2_ONE, FP2_I}, {FP2_I, FP2_ONE, FP2_MINUS_ONE, FP2_I}, {FP2_ONE, FP2_I, FP2_I, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_I, FP2_I, FP2_MINUS_ONE}, {FP2_I, FP2_ONE, FP2_MINUS_ONE, FP2_I}, {FP2_I, FP2_MINUS_ONE, FP2_ONE, FP2_I}, {FP2_MINUS_ONE, FP2_I, FP2_I, FP2_ONE}}}}; diff --git a/src/precomp/ref/lvl3/include/e0_basis.h b/src/precomp/ref/lvl3/include/e0_basis.h new file mode 100644 index 0000000..05cafb8 --- /dev/null +++ b/src/precomp/ref/lvl3/include/e0_basis.h @@ -0,0 +1,3 @@ +#include +extern const fp2_t BASIS_E0_PX; +extern const fp2_t BASIS_E0_QX; diff --git a/src/precomp/ref/lvl3/include/ec_params.h b/src/precomp/ref/lvl3/include/ec_params.h index aae6504..941abd5 100644 --- a/src/precomp/ref/lvl3/include/ec_params.h +++ b/src/precomp/ref/lvl3/include/ec_params.h @@ -1,69 +1,12 @@ #ifndef EC_PARAMS_H #define EC_PARAMS_H -#define POWER_OF_2 97 -#define POWER_OF_3 68 +#include -static digit_t TWOpF[NWORDS_ORDER] = {0x0, 0x200000000, 0x0, 0x0, 0x0, 0x0}; // 2^g -static digit_t TWOpFm1[NWORDS_ORDER] = {0x0, 0x100000000, 0x0, 0x0, 0x0, 0x0}; // 2^(g-1) -static digit_t THREEpE[NWORDS_ORDER] = {0x003B3FCEF3103289, 0x0, 0x0, 0x0, 0x0, 0x0}; // 3^e -static digit_t THREEpF[NWORDS_ORDER] = {0x58DE83727119CD51, 0x00000DB6794B8C65, 0x0, 0x0, 0x0, 0x0}; // 3^f -static digit_t THREEpFdiv2[NWORDS_ORDER] = {0xAC6F41B9388CE6A8, 0x000006DB3CA5C632, 0x0, 0x0, 0x0, 0x0}; // Floor(3^f/2) +#define TORSION_EVEN_POWER 376 -#define scaled 1 // unscaled (0) or scaled (1) remainder tree approach -#define gap 83 +// p+1 divided by the power of 2 +extern const digit_t p_cofactor_for_2f[1]; +#define P_COFACTOR_FOR_2F_BITLENGTH 7 -#define P_LEN 7 -#define M_LEN 21 - -static digit_t p_plus_minus_bitlength[P_LEN + M_LEN] = -{ 2, 3, 4, 6, 8, 9, 10, 3, 4, 7, 7, 8, 8, 8, 8, 9, 10, 11, 12, - 12, 13, 13, 13, 13, 14, 15, 16, 16}; - -static digit_t p_cofactor_for_2f[5] = { -0x9AB752342630BA61, -0x48575BA8E3917B34, -0x22E8856B32DE1705, -0x558438D163573025, -0x0000000001EFB777 -}; -#define P_COFACTOR_FOR_2F_BITLENGTH 281 - -static digit_t p_cofactor_for_3g[5] = { - 0x0000000000000000, - 0x97E5302200000000, - 0xEE54EDDA13CFE081, - 0xC6BFE309D9209F3F, - 0x000000000000484C -}; - -#define P_COFACTOR_FOR_3G_BITLENGTH 271 - - -static digit_t p_cofactor_for_6fg[3] = { - 0x09E7F040CBF29811, - 0xEC904F9FF72A76ED, - 0x00002426635FF184 -}; -#define P_COFACTOR_FOR_6FG_BITLENGTH 174 - -static int STRATEGY4[47] = { 19, 12, 7, 4, 2, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, 1, 5, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 7, 5, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 3, 2, 1, 1, 1, 1}; - -static int sizeI[P_LEN+M_LEN] = { - 0, 1, 2, 3, 6, 14, 14, 1, 3, 5, 5, 7, 8, 8, 10, 11, 14, 19, 26, 30, 35, 40, 44, 44, 52, 88, 114, 114 -}; -static int sizeJ[P_LEN+M_LEN] = { - 0, 1, 1, 3, 6, 9, 13, 1, 1, 4, 5, 6, 7, 7, 6, 10, 10, 16, 23, 28, 32, 32, 32, 33, 45, 76, 87, 104 -}; -static int sizeK[P_LEN+M_LEN] = { - 1, 1, 1, 5, 6, 2, 16, 0, 0, 4, 6, 2, 4, 7, 0, 1, 4, 6, 0, 5, 18, 13, 30, 2, 18, 12, 3, 8 -}; - -#define sI_max 114 -#define sJ_max 104 -#define sK_max 47 - -#define ceil_log_sI_max 7 -#define ceil_log_sJ_max 7 - -#endif \ No newline at end of file +#endif diff --git a/src/precomp/ref/lvl3/include/encoded_sizes.h b/src/precomp/ref/lvl3/include/encoded_sizes.h index 33c5aac..50a8781 100644 --- a/src/precomp/ref/lvl3/include/encoded_sizes.h +++ b/src/precomp/ref/lvl3/include/encoded_sizes.h @@ -1,14 +1,11 @@ +#define SECURITY_BITS 192 +#define SQIsign_response_length 192 +#define HASH_ITERATIONS 256 +#define FP_ENCODED_BYTES 48 #define FP2_ENCODED_BYTES 96 #define EC_CURVE_ENCODED_BYTES 96 #define EC_POINT_ENCODED_BYTES 96 #define EC_BASIS_ENCODED_BYTES 288 -#define CHAIN_LENGTH 10 -#define QUAT_ALG_ELEM_ENCODED_BITS 588 -#define QUAT_ALG_ELEM_ENCODED_BYTES 74 -#define ID2ISO_LONG_TWO_ISOG_ENCODED_BYTES 1940 -#define ZIP_CHAIN_LEN 16 -#define ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES 13 -#define ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES 209 -#define SIGNATURE_LEN 263 -#define PUBLICKEY_BYTES 96 -#define SECRETKEY_BYTES 1138 +#define PUBLICKEY_BYTES 97 +#define SECRETKEY_BYTES 529 +#define SIGNATURE_BYTES 224 diff --git a/src/precomp/ref/lvl3/include/endomorphism_action.h b/src/precomp/ref/lvl3/include/endomorphism_action.h index f5397aa..5bb17f5 100644 --- a/src/precomp/ref/lvl3/include/endomorphism_action.h +++ b/src/precomp/ref/lvl3/include/endomorphism_action.h @@ -1,19 +1,31 @@ -#include +#ifndef ENDOMORPHISM_ACTION_H +#define ENDOMORPHISM_ACTION_H +#include #include #include -extern const ec_basis_t BASIS_EVEN; -extern const ec_basis_t BASIS_ODD_PLUS; -extern const ec_basis_t BASIS_ODD_MINUS; -extern const ec_basis_t BASIS_COMMITMENT_PLUS; -extern const ec_basis_t BASIS_COMMITMENT_MINUS; -extern const ec_basis_t BASIS_CHALLENGE; -extern const ec_curve_t CURVE_E0; -extern const ec_point_t CURVE_E0_A24; -extern const ibz_mat_2x2_t ACTION_I; -extern const ibz_mat_2x2_t ACTION_J; -extern const ibz_mat_2x2_t ACTION_K; -extern const ibz_mat_2x2_t ACTION_GEN2; -extern const ibz_mat_2x2_t ACTION_GEN3; -extern const ibz_mat_2x2_t ACTION_GEN4; -extern const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN; -extern const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO; +/** Type for precomputed endomorphism rings applied to precomputed torsion bases. + * + * Precomputed by the precompute scripts. + * + * @typedef curve_with_endomorphism_ring_t + * + * @struct curve_with_endomorphism_ring + **/ +typedef struct curve_with_endomorphism_ring { + ec_curve_t curve; + ec_basis_t basis_even; + ibz_mat_2x2_t action_i, action_j, action_k; + ibz_mat_2x2_t action_gen2, action_gen3, action_gen4; +} curve_with_endomorphism_ring_t; +#define CURVE_E0 (CURVES_WITH_ENDOMORPHISMS->curve) +#define BASIS_EVEN (CURVES_WITH_ENDOMORPHISMS->basis_even) +#define ACTION_I (CURVES_WITH_ENDOMORPHISMS->action_i) +#define ACTION_J (CURVES_WITH_ENDOMORPHISMS->action_j) +#define ACTION_K (CURVES_WITH_ENDOMORPHISMS->action_k) +#define ACTION_GEN2 (CURVES_WITH_ENDOMORPHISMS->action_gen2) +#define ACTION_GEN3 (CURVES_WITH_ENDOMORPHISMS->action_gen3) +#define ACTION_GEN4 (CURVES_WITH_ENDOMORPHISMS->action_gen4) +#define NUM_ALTERNATE_STARTING_CURVES 7 +#define ALTERNATE_STARTING_CURVES (CURVES_WITH_ENDOMORPHISMS+1) +extern const curve_with_endomorphism_ring_t CURVES_WITH_ENDOMORPHISMS[8]; +#endif diff --git a/src/precomp/ref/lvl3/include/fp_constants.h b/src/precomp/ref/lvl3/include/fp_constants.h index c38f167..063579a 100644 --- a/src/precomp/ref/lvl3/include/fp_constants.h +++ b/src/precomp/ref/lvl3/include/fp_constants.h @@ -1,4 +1,17 @@ +#if RADIX == 32 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +#define NWORDS_FIELD 12 +#else +#define NWORDS_FIELD 14 +#endif +#define NWORDS_ORDER 12 +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) #define NWORDS_FIELD 6 -#define NWORDS_ORDER 6 +#else +#define NWORDS_FIELD 7 +#endif +#define NWORDS_ORDER 6 +#endif #define BITS 384 #define LOG2P 9 diff --git a/src/precomp/ref/lvl3/include/hd_splitting_transforms.h b/src/precomp/ref/lvl3/include/hd_splitting_transforms.h new file mode 100644 index 0000000..b3147a4 --- /dev/null +++ b/src/precomp/ref/lvl3/include/hd_splitting_transforms.h @@ -0,0 +1,18 @@ +#ifndef HD_SPLITTING_H +#define HD_SPLITTING_H + +#include +#include + +typedef struct precomp_basis_change_matrix { + uint8_t m[4][4]; +} precomp_basis_change_matrix_t; + +extern const int EVEN_INDEX[10][2]; +extern const int CHI_EVAL[4][4]; +extern const fp2_t FP2_CONSTANTS[5]; +extern const precomp_basis_change_matrix_t SPLITTING_TRANSFORMS[10]; +extern const precomp_basis_change_matrix_t NORMALIZATION_TRANSFORMS[6]; + +#endif + diff --git a/src/precomp/ref/lvl3/include/klpt_constants.h b/src/precomp/ref/lvl3/include/klpt_constants.h deleted file mode 100644 index 9c42124..0000000 --- a/src/precomp/ref/lvl3/include/klpt_constants.h +++ /dev/null @@ -1,27 +0,0 @@ -#include -#define KLPT_equiv_bound_coeff 7 -#define KLPT_equiv_num_iter 50625 -#define KLPT_primality_num_iter 32 -#define KLPT_signing_klpt_length 1552 -#define KLPT_signing_num_gamma_trial 64 -#define KLPT_gamma_exponent_interval_size 0 -#define KLPT_gamma_exponent_center_shift 15 -#define KLPT_repres_num_gamma_trial 32768 -#define KLPT_signing_number_strong_approx 5108 -#define KLPT_random_prime_attempts 64 -#define KLPT_secret_key_prime_size 95 -#define KLPT_keygen_length 970 -#define KLPT_keygen_num_gamma_trial 64 -#define KLPT_eichler_smallnorm_bitsize 165 -#define KLPT_keygen_number_strong_approx 3929 -#define KLPT_eichler_number_mu_norm 12 -#define KLPT_eichler_strong_approx_log_margin 2 -#define KLPT_eichler_num_equiv_ideal 38 -#define KLPT_eichler_number_strong_approx 3780 -#define SQISIGN_response_attempts 64 -#define SQISIGN_random_length 0 -#define SQISIGN_signing_total_length 1552 -#define SQISIGN_signing_length 16 -#define SQISIGN_keygen_length 10 -extern const short SMALL_PRIMES_1MOD4[11]; -extern const ibz_t PROD_SMALL_PRIMES_3MOD4; diff --git a/src/precomp/ref/lvl3/include/quaternion_constants.h b/src/precomp/ref/lvl3/include/quaternion_constants.h new file mode 100644 index 0000000..a2f4b52 --- /dev/null +++ b/src/precomp/ref/lvl3/include/quaternion_constants.h @@ -0,0 +1,6 @@ +#include +#define QUAT_primality_num_iter 32 +#define QUAT_repres_bound_input 21 +#define QUAT_equiv_bound_coeff 64 +#define FINDUV_box_size 3 +#define FINDUV_cube_size 2400 diff --git a/src/precomp/ref/lvl3/include/quaternion_data.h b/src/precomp/ref/lvl3/include/quaternion_data.h index c3de3e1..740da6e 100644 --- a/src/precomp/ref/lvl3/include/quaternion_data.h +++ b/src/precomp/ref/lvl3/include/quaternion_data.h @@ -1,7 +1,12 @@ -#include #include +#define MAXORD_O0 (EXTREMAL_ORDERS->order) +#define STANDARD_EXTREMAL_ORDER (EXTREMAL_ORDERS[0]) #define NUM_ALTERNATE_EXTREMAL_ORDERS 7 +#define ALTERNATE_EXTREMAL_ORDERS (EXTREMAL_ORDERS+1) +#define ALTERNATE_CONNECTING_IDEALS (CONNECTING_IDEALS+1) +#define ALTERNATE_CONJUGATING_ELEMENTS (CONJUGATING_ELEMENTS+1) +extern const ibz_t QUAT_prime_cofactor; extern const quat_alg_t QUATALG_PINFTY; -extern const quat_order_t MAXORD_O0; -extern const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER; -extern const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7]; +extern const quat_p_extremal_maximal_order_t EXTREMAL_ORDERS[8]; +extern const quat_left_ideal_t CONNECTING_IDEALS[8]; +extern const quat_alg_elem_t CONJUGATING_ELEMENTS[8]; diff --git a/src/precomp/ref/lvl3/include/torsion_constants.h b/src/precomp/ref/lvl3/include/torsion_constants.h index e2d197d..f5e4e9f 100644 --- a/src/precomp/ref/lvl3/include/torsion_constants.h +++ b/src/precomp/ref/lvl3/include/torsion_constants.h @@ -1,24 +1,6 @@ -#include -#define TORSION_2POWER_BYTES 13 -#define TORSION_3POWER_BYTES 14 -#define TORSION_23POWER_BYTES 26 -extern const uint64_t TORSION_PLUS_EVEN_POWER; -extern const uint64_t TORSION_ODD_PRIMES[28]; -extern const uint64_t TORSION_ODD_POWERS[28]; -extern const uint64_t TORSION_PLUS_ODD_PRIMES[7]; -extern const size_t TORSION_PLUS_ODD_POWERS[7]; -extern const uint64_t TORSION_MINUS_ODD_PRIMES[21]; -extern const size_t TORSION_MINUS_ODD_POWERS[21]; -extern const size_t DEGREE_COMMITMENT_POWERS[28]; -extern const ibz_t CHARACTERISTIC; -extern const ibz_t TORSION_ODD; -extern const ibz_t TORSION_ODD_PRIMEPOWERS[28]; -extern const ibz_t TORSION_ODD_PLUS; -extern const ibz_t TORSION_ODD_MINUS; +#include +#define TORSION_2POWER_BYTES 48 +extern const ibz_t TWO_TO_SECURITY_BITS; extern const ibz_t TORSION_PLUS_2POWER; -extern const ibz_t TORSION_PLUS_3POWER; -extern const ibz_t TORSION_PLUS_23POWER; -extern const ibz_t DEGREE_COMMITMENT; -extern const ibz_t DEGREE_COMMITMENT_PLUS; -extern const ibz_t DEGREE_COMMITMENT_MINUS; -extern const ibz_t DEGREE_CHALLENGE; +extern const ibz_t SEC_DEGREE; +extern const ibz_t COM_DEGREE; diff --git a/src/precomp/ref/lvl3/klpt_constants.c b/src/precomp/ref/lvl3/klpt_constants.c deleted file mode 100644 index 3358164..0000000 --- a/src/precomp/ref/lvl3/klpt_constants.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include -#if 0 -#elif 8*DIGIT_LEN == 16 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x173b,0x80bd,0xa9d7,0xa185}}}; -#elif 8*DIGIT_LEN == 32 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x80bd173b,0xa185a9d7}}}; -#elif 8*DIGIT_LEN == 64 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xa185a9d780bd173b}}}; -#endif diff --git a/src/precomp/ref/lvl3/quaternion_data.c b/src/precomp/ref/lvl3/quaternion_data.c index f465ab6..2440225 100644 --- a/src/precomp/ref/lvl3/quaternion_data.c +++ b/src/precomp/ref/lvl3/quaternion_data.c @@ -1,20 +1,3626 @@ #include #include #include +const ibz_t QUAT_prime_cofactor = #if 0 -#elif 8*DIGIT_LEN == 16 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x74c1,0x4c61,0xa468,0x356e,0xf669,0xc722,0xb751,0x90ae,0x2e0a,0x65bc,0xad6,0x45d1,0x604a,0xc6ae,0x71a2,0xab08,0x6eee,0x3df}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x74c1,0x4c61,0xa468,0x356e,0xf669,0xc722,0xb751,0x90ae,0x2e0a,0x65bc,0xad6,0x45d1,0x604a,0xc6ae,0x71a2,0xab08,0x6eee,0x3df}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x74c1,0x4c61,0xa468,0x356e,0xf669,0xc722,0xb751,0x90ae,0x2e0a,0x65bc,0xad6,0x45d1,0x604a,0xc6ae,0x71a2,0xab08,0x6eee,0x3df}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd07e,0x99c6,0x707e,0x2590,0xe6e5,0x16a9,0x15cb,0xf289,0x7b19,0x349,0x2937,0x2890}}}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd07e,0x99c6,0x707e,0x2590,0xe6e5,0x16a9,0x15cb,0xf289,0x7b19,0x349,0x2937,0x2890}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x683f,0x4ce3,0x383f,0x92c8,0xf372,0x8b54,0x8ae5,0xf944,0xbd8c,0x81a4,0x149b,0x1448}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7f02,0xe45a,0x5dd2,0x5621,0x7342,0x517f,0x2c7e,0xf602,0x361e,0x307,0x521b,0x10d9,0x45c7,0xc8a3,0xe540,0xdb2b,0x3e19,0x138f,0xd9ec,0x4603,0xaa01,0xcac6,0xaf07,0x336}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x3f81,0x722d,0xaee9,0x2b10,0xb9a1,0x28bf,0x163f,0x7b01,0x9b0f,0x8183,0xa90d,0x886c,0xa2e3,0x6451,0xf2a0,0xed95,0x9f0c,0x9c7,0xecf6,0xa301,0x5500,0xe563,0x5783,0x19b}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x95e,0x7e34,0x3884,0x5e12,0xef66,0xa920,0x266b,0xbcb1,0x75cb,0xbadf,0x4ba2,0xf93}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x683f,0x4ce3,0x383f,0x92c8,0xf372,0x8b54,0x8ae5,0xf944,0xbd8c,0x81a4,0x149b,0x1448}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd07e,0x99c6,0x707e,0x2590,0xe6e5,0x16a9,0x15cb,0xf289,0x7b19,0x349,0x2937,0x2890}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x12bc,0xfc68,0x7108,0xbc24,0xdecc,0x5241,0x4cd7,0x7962,0xeb97,0x75be,0x9745,0x1f26}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf18,0xfecc,0x9d2,0xe5c5,0xcbb8,0x1c34,0xa029,0x9a05,0x3cc5,0x4c22,0x4674,0x5472}}}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf18,0xfecc,0x9d2,0xe5c5,0xcbb8,0x1c34,0xa029,0x9a05,0x3cc5,0x4c22,0x4674,0x5472}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x78c,0x7f66,0x84e9,0x72e2,0x65dc,0x8e1a,0xd014,0xcd02,0x1e62,0x2611,0x233a,0x2a39}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe920,0xd791,0x1fd,0xc431,0xbfb0,0x70fd,0xeb42,0xf1d5,0x4a4,0x499,0xd63f,0x40a,0xb3d6,0x2e8c,0x87b9,0x9b64,0x6f5a,0xe716,0x2d0a,0xcdfc,0xa6b,0x9277,0x989f,0xded}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xd9e1,0xbea1,0x3b1f,0x1b20,0xec88,0x4320,0x7b3a,0x1b1d,0xed2e,0xce2,0x705,0x1ff7,0x47ef,0xac38,0xcfe3,0xd7c1,0x5fbd,0x5c6f,0x1204,0x8598,0x6a91,0xa0fc,0x3d0c,0x592}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x78c,0x7f66,0x84e9,0x72e2,0x65dc,0x8e1a,0xd014,0xcd02,0x1e62,0x2611,0x233a,0x2a39}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf18,0xfecc,0x9d2,0xe5c5,0xcbb8,0x1c34,0xa029,0x9a05,0x3cc5,0x4c22,0x4674,0x5472}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x90db,0xf5fa,0xdc5c,0xc0,0xe0b9,0x9256,0x6e61,0x5c18,0x6763,0xc8c3,0x8964,0x6842}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x5}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xee3a,0x7214,0xac30,0xb093,0xc9ce,0x8af1,0xaa71,0x8469,0xaf6a,0x1492,0x46dd,0x17e9}}}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xee3a,0x7214,0xac30,0xb093,0xc9ce,0x8af1,0xaa71,0x8469,0xaf6a,0x1492,0x46dd,0x17e9}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x771d,0x390a,0xd618,0x5849,0xe4e7,0xc578,0xd538,0x4234,0x57b5,0x8a49,0xa36e,0xbf4}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf292,0xdf5f,0xf5d0,0x38b4,0xb3b4,0xaca5,0xa340,0x5c40,0xfe7f,0xc31f,0x507a,0x2da9,0xdc1b,0x1e9a,0x9af0,0x9404,0x8b76,0x21d7,0x3160,0x9944,0xba5a,0xe5df,0xdfa6,0x11d}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xf949,0x6faf,0x7ae8,0x1c5a,0xd9da,0x5652,0x51a0,0xae20,0xff3f,0x618f,0xa83d,0x96d4,0x6e0d,0xf4d,0x4d78,0x4a02,0xc5bb,0x10eb,0x18b0,0x4ca2,0xdd2d,0x72ef,0xefd3,0x8e}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1c90,0x402d,0x1529,0xd2ba,0xab53,0xe4e7,0xa27,0xf893,0xf471,0x95a7,0x4a3f,0x305}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x771d,0x390a,0xd618,0x5849,0xe4e7,0xc578,0xd538,0x4234,0x57b5,0x8a49,0xa36e,0xbf4}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xee3a,0x7214,0xac30,0xb093,0xc9ce,0x8af1,0xaa71,0x8469,0xaf6a,0x1492,0x46dd,0x17e9}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3920,0x805a,0x2a52,0xa574,0x56a7,0xc9cf,0x144f,0xf126,0xe8e3,0x2b4f,0x947f,0x60a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x7}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6ce0,0x5a29,0xcaf5,0x75fb,0x4497,0x847e,0xed64,0xe2d9,0x27c3,0x72c3,0xd228,0x2a98}}}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6ce0,0x5a29,0xcaf5,0x75fb,0x4497,0x847e,0xed64,0xe2d9,0x27c3,0x72c3,0xd228,0x2a98}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb670,0xad14,0xe57a,0xbafd,0x224b,0x423f,0xf6b2,0xf16c,0x93e1,0x3961,0x6914,0x154c}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb670,0xad14,0xe57a,0xbafd,0x224b,0x423f,0xf6b2,0xf16c,0x93e1,0x3961,0x6914,0x154c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xe200,0xc706,0x8600,0xa90e,0x1c37,0x36d3,0x9648,0x17b7,0xc8e4,0x6528,0x662b,0x3031,0xa41,0x7e15,0x5e0e,0x5586,0x68d5,0xb086,0x8b21,0xde5c,0x59bb,0xc11b,0x4017,0x38b}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x7100,0x6383,0x4300,0xd487,0x8e1b,0x1b69,0xcb24,0xbdb,0x6472,0xb294,0xb315,0x9818,0x8520,0x3f0a,0x2f07,0xaac3,0x346a,0xd843,0x4590,0xef2e,0xacdd,0xe08d,0xa00b,0x1c5}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xaf81,0x415e,0x1985,0xc8f4,0x3cdb,0xadd5,0xfc00,0x4aa8,0x50e4,0xc673,0xb005,0xf0f5,0xa40,0x7e15,0x5e0e,0x5586,0x68d5,0xb086,0x8b21,0xde5c,0x59bb,0xc11b,0x4017,0x38b}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb670,0xad14,0xe57a,0xbafd,0x224b,0x423f,0xf6b2,0xf16c,0x93e1,0x3961,0x6914,0x154c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6ce0,0x5a29,0xcaf5,0x75fb,0x4497,0x847e,0xed64,0xe2d9,0x27c3,0x72c3,0xd228,0x2a98}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x64fe,0xb50,0xd8f7,0xc034,0xbeb7,0x11fb,0x348f,0x9a1d,0xefff,0x3d6a,0x6c4b,0x7e77}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xb}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4de0,0xfae4,0x6267,0x7fd9,0x7eca,0x2350,0x494b,0x1927,0xce89,0x9621,0xaf08,0x8bb}}}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4de0,0xfae4,0x6267,0x7fd9,0x7eca,0x2350,0x494b,0x1927,0xce89,0x9621,0xaf08,0x8bb}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x26f0,0xfd72,0xb133,0x3fec,0x3f65,0x91a8,0xa4a5,0x8c93,0xe744,0x4b10,0xd784,0x45d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x4200,0x2758,0x6efa,0x757c,0x8411,0xdefe,0xd643,0x4fe6,0x93ab,0x49f7,0x2818,0xa66f,0x6ca1,0x715d,0x530f,0x20b8,0xb136,0x4f0b,0x97b7,0x2032,0x17ec,0xdbcd,0x2244,0x26}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x9c01,0x2d01,0x5ee8,0x6446,0xc360,0xbf96,0xf68,0xf85c,0x6232,0xa024,0x9706,0xa637,0x6ca1,0x715d,0x530f,0x20b8,0xb136,0x4f0b,0x97b7,0x2032,0x17ec,0xdbcd,0x2244,0x26}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x26f0,0xfd72,0xb133,0x3fec,0x3f65,0x91a8,0xa4a5,0x8c93,0xe744,0x4b10,0xd784,0x45d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4de0,0xfae4,0x6267,0x7fd9,0x7eca,0x2350,0x494b,0x1927,0xce89,0x9621,0xaf08,0x8bb}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xa5ff,0xfa56,0x1011,0x1136,0xc0b1,0x1f67,0xc6db,0x578a,0x3178,0xa9d3,0x9111,0x37}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3a40,0x9c50,0x8440,0xbfd9,0xd7e0,0x1f7,0x8a32,0xcaca,0xb3b,0x2615,0x3d3f,0xa14}}}, {{{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3a40,0x9c50,0x8440,0xbfd9,0xd7e0,0x1f7,0x8a32,0xcaca,0xb3b,0x2615,0x3d3f,0xa14}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1d20,0x4e28,0xc220,0x5fec,0xebf0,0xfb,0x4519,0xe565,0x859d,0x930a,0x1e9f,0x50a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8800,0x3aa0,0x8011,0xc210,0x6c37,0x8c6c,0x2407,0xecce,0x1310,0xd5f6,0xd7b4,0x4e72,0xd10e,0xb8d1,0x3e55,0x32d1,0x8e65,0x3702,0xe4ca,0x1c47,0x5ff2,0x47bf,0xcb31,0x32}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x801,0x1c89,0x9f98,0x742c,0x299c,0xb098,0x59ca,0xb28b,0xf560,0x704e,0xff55,0x1b1e}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x1d20,0x4e28,0xc220,0x5fec,0xebf0,0xfb,0x4519,0xe565,0x859d,0x930a,0x1e9f,0x50a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3a40,0x9c50,0x8440,0xbfd9,0xd7e0,0x1f7,0x8a32,0xcaca,0xb3b,0x2615,0x3d3f,0xa14}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x801,0x1c89,0x9f98,0x742c,0x299c,0xb098,0x59ca,0xb28b,0xf560,0x704e,0xff55,0x1b1e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x11}, {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x45b6,0x2d1f,0x4788,0xdecc,0x42f4,0xf406,0x7975,0xbe12,0xb753,0x7d46,0x15d0,0xd278,0x6}}}, {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x45b6,0x2d1f,0x4788,0xdecc,0x42f4,0xf406,0x7975,0xbe12,0xb753,0x7d46,0x15d0,0xd278,0x6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa2db,0x168f,0x23c4,0x6f66,0x217a,0xfa03,0x3cba,0xdf09,0x5ba9,0x3ea3,0xae8,0x693c,0x3}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xceb2,0xf887,0x83d9,0x9f4,0xd993,0x4dae,0x8051,0x4055,0xa807,0x62d2,0x4d70,0x6776,0x4f8b,0xbd48,0x5ec2,0xacb2,0xdd61,0xa2ef,0xfcf9,0xcac0,0xf6ab,0x3114,0x20f2,0x4555,0x17}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xe759,0xfc43,0x41ec,0x84fa,0x6cc9,0xa6d7,0xc028,0xa02a,0x5403,0x3169,0x26b8,0xb3bb,0x27c5,0x5ea4,0x2f61,0xd659,0xeeb0,0xd177,0x7e7c,0xe560,0x7b55,0x188a,0x9079,0xa2aa,0xb}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x5870,0xf2e6,0xe47b,0x8186,0x85ec,0x260e,0xfec1,0xb9e8,0x6d00,0xb89b,0x58ba,0xf414,0x2294,0x73b0,0x4a97,0x5637,0x551f,0x94c1,0xb0c5,0xd296,0x1d55,0xa609,0x331,0x1e25,0xa}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa2db,0x168f,0x23c4,0x6f66,0x217a,0xfa03,0x3cba,0xdf09,0x5ba9,0x3ea3,0xae8,0x693c,0x3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x45b6,0x2d1f,0x4788,0xdecc,0x42f4,0xf406,0x7975,0xbe12,0xb753,0x7d46,0x15d0,0xd278,0x6}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -13, ._mp_d = (mp_limb_t[]) {0x41c8,0xc538,0x3ec1,0x80dd,0xeefd,0x3b0c,0x3fa5,0x9ed0,0x8a6f,0x8c87,0x1b3a,0x3996,0x20}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x17}}; -#elif 8*DIGIT_LEN == 32 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0x4c6174c1,0x356ea468,0xc722f669,0x90aeb751,0x65bc2e0a,0x45d10ad6,0xc6ae604a,0xab0871a2,0x3df6eee}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0x4c6174c1,0x356ea468,0xc722f669,0x90aeb751,0x65bc2e0a,0x45d10ad6,0xc6ae604a,0xab0871a2,0x3df6eee}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0x4c6174c1,0x356ea468,0xc722f669,0x90aeb751,0x65bc2e0a,0x45d10ad6,0xc6ae604a,0xab0871a2,0x3df6eee}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x99c6d07e,0x2590707e,0x16a9e6e5,0xf28915cb,0x3497b19,0x28902937}}}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x99c6d07e,0x2590707e,0x16a9e6e5,0xf28915cb,0x3497b19,0x28902937}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4ce3683f,0x92c8383f,0x8b54f372,0xf9448ae5,0x81a4bd8c,0x1448149b}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe45a7f02,0x56215dd2,0x517f7342,0xf6022c7e,0x307361e,0x10d9521b,0xc8a345c7,0xdb2be540,0x138f3e19,0x4603d9ec,0xcac6aa01,0x336af07}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x722d3f81,0x2b10aee9,0x28bfb9a1,0x7b01163f,0x81839b0f,0x886ca90d,0x6451a2e3,0xed95f2a0,0x9c79f0c,0xa301ecf6,0xe5635500,0x19b5783}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7e34095e,0x5e123884,0xa920ef66,0xbcb1266b,0xbadf75cb,0xf934ba2}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4ce3683f,0x92c8383f,0x8b54f372,0xf9448ae5,0x81a4bd8c,0x1448149b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x99c6d07e,0x2590707e,0x16a9e6e5,0xf28915cb,0x3497b19,0x28902937}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xfc6812bc,0xbc247108,0x5241decc,0x79624cd7,0x75beeb97,0x1f269745}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfecc0f18,0xe5c509d2,0x1c34cbb8,0x9a05a029,0x4c223cc5,0x54724674}}}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfecc0f18,0xe5c509d2,0x1c34cbb8,0x9a05a029,0x4c223cc5,0x54724674}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7f66078c,0x72e284e9,0x8e1a65dc,0xcd02d014,0x26111e62,0x2a39233a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd791e920,0xc43101fd,0x70fdbfb0,0xf1d5eb42,0x49904a4,0x40ad63f,0x2e8cb3d6,0x9b6487b9,0xe7166f5a,0xcdfc2d0a,0x92770a6b,0xded989f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbea1d9e1,0x1b203b1f,0x4320ec88,0x1b1d7b3a,0xce2ed2e,0x1ff70705,0xac3847ef,0xd7c1cfe3,0x5c6f5fbd,0x85981204,0xa0fc6a91,0x5923d0c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7f66078c,0x72e284e9,0x8e1a65dc,0xcd02d014,0x26111e62,0x2a39233a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfecc0f18,0xe5c509d2,0x1c34cbb8,0x9a05a029,0x4c223cc5,0x54724674}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xf5fa90db,0xc0dc5c,0x9256e0b9,0x5c186e61,0xc8c36763,0x68428964}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x5}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7214ee3a,0xb093ac30,0x8af1c9ce,0x8469aa71,0x1492af6a,0x17e946dd}}}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7214ee3a,0xb093ac30,0x8af1c9ce,0x8469aa71,0x1492af6a,0x17e946dd}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x390a771d,0x5849d618,0xc578e4e7,0x4234d538,0x8a4957b5,0xbf4a36e}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdf5ff292,0x38b4f5d0,0xaca5b3b4,0x5c40a340,0xc31ffe7f,0x2da9507a,0x1e9adc1b,0x94049af0,0x21d78b76,0x99443160,0xe5dfba5a,0x11ddfa6}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6faff949,0x1c5a7ae8,0x5652d9da,0xae2051a0,0x618fff3f,0x96d4a83d,0xf4d6e0d,0x4a024d78,0x10ebc5bb,0x4ca218b0,0x72efdd2d,0x8eefd3}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x402d1c90,0xd2ba1529,0xe4e7ab53,0xf8930a27,0x95a7f471,0x3054a3f}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x390a771d,0x5849d618,0xc578e4e7,0x4234d538,0x8a4957b5,0xbf4a36e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x7214ee3a,0xb093ac30,0x8af1c9ce,0x8469aa71,0x1492af6a,0x17e946dd}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x805a3920,0xa5742a52,0xc9cf56a7,0xf126144f,0x2b4fe8e3,0x60a947f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x7}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x5a296ce0,0x75fbcaf5,0x847e4497,0xe2d9ed64,0x72c327c3,0x2a98d228}}}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x5a296ce0,0x75fbcaf5,0x847e4497,0xe2d9ed64,0x72c327c3,0x2a98d228}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xad14b670,0xbafde57a,0x423f224b,0xf16cf6b2,0x396193e1,0x154c6914}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xad14b670,0xbafde57a,0x423f224b,0xf16cf6b2,0x396193e1,0x154c6914}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc706e200,0xa90e8600,0x36d31c37,0x17b79648,0x6528c8e4,0x3031662b,0x7e150a41,0x55865e0e,0xb08668d5,0xde5c8b21,0xc11b59bb,0x38b4017}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x63837100,0xd4874300,0x1b698e1b,0xbdbcb24,0xb2946472,0x9818b315,0x3f0a8520,0xaac32f07,0xd843346a,0xef2e4590,0xe08dacdd,0x1c5a00b}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x415eaf81,0xc8f41985,0xadd53cdb,0x4aa8fc00,0xc67350e4,0xf0f5b005,0x7e150a40,0x55865e0e,0xb08668d5,0xde5c8b21,0xc11b59bb,0x38b4017}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xad14b670,0xbafde57a,0x423f224b,0xf16cf6b2,0x396193e1,0x154c6914}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x5a296ce0,0x75fbcaf5,0x847e4497,0xe2d9ed64,0x72c327c3,0x2a98d228}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb5064fe,0xc034d8f7,0x11fbbeb7,0x9a1d348f,0x3d6aefff,0x7e776c4b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xb}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfae44de0,0x7fd96267,0x23507eca,0x1927494b,0x9621ce89,0x8bbaf08}}}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfae44de0,0x7fd96267,0x23507eca,0x1927494b,0x9621ce89,0x8bbaf08}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfd7226f0,0x3fecb133,0x91a83f65,0x8c93a4a5,0x4b10e744,0x45dd784}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x27584200,0x757c6efa,0xdefe8411,0x4fe6d643,0x49f793ab,0xa66f2818,0x715d6ca1,0x20b8530f,0x4f0bb136,0x203297b7,0xdbcd17ec,0x262244}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2d019c01,0x64465ee8,0xbf96c360,0xf85c0f68,0xa0246232,0xa6379706,0x715d6ca1,0x20b8530f,0x4f0bb136,0x203297b7,0xdbcd17ec,0x262244}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfd7226f0,0x3fecb133,0x91a83f65,0x8c93a4a5,0x4b10e744,0x45dd784}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfae44de0,0x7fd96267,0x23507eca,0x1927494b,0x9621ce89,0x8bbaf08}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xfa56a5ff,0x11361011,0x1f67c0b1,0x578ac6db,0xa9d33178,0x379111}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c503a40,0xbfd98440,0x1f7d7e0,0xcaca8a32,0x26150b3b,0xa143d3f}}}, {{{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c503a40,0xbfd98440,0x1f7d7e0,0xcaca8a32,0x26150b3b,0xa143d3f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4e281d20,0x5fecc220,0xfbebf0,0xe5654519,0x930a859d,0x50a1e9f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3aa08800,0xc2108011,0x8c6c6c37,0xecce2407,0xd5f61310,0x4e72d7b4,0xb8d1d10e,0x32d13e55,0x37028e65,0x1c47e4ca,0x47bf5ff2,0x32cb31}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1c890801,0x742c9f98,0xb098299c,0xb28b59ca,0x704ef560,0x1b1eff55}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4e281d20,0x5fecc220,0xfbebf0,0xe5654519,0x930a859d,0x50a1e9f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9c503a40,0xbfd98440,0x1f7d7e0,0xcaca8a32,0x26150b3b,0xa143d3f}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1c890801,0x742c9f98,0xb098299c,0xb28b59ca,0x704ef560,0x1b1eff55}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x11}, {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x2d1f45b6,0xdecc4788,0xf40642f4,0xbe127975,0x7d46b753,0xd27815d0,0x6}}}, {{{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x2d1f45b6,0xdecc4788,0xf40642f4,0xbe127975,0x7d46b753,0xd27815d0,0x6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x168fa2db,0x6f6623c4,0xfa03217a,0xdf093cba,0x3ea35ba9,0x693c0ae8,0x3}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xf887ceb2,0x9f483d9,0x4daed993,0x40558051,0x62d2a807,0x67764d70,0xbd484f8b,0xacb25ec2,0xa2efdd61,0xcac0fcf9,0x3114f6ab,0x455520f2,0x17}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xfc43e759,0x84fa41ec,0xa6d76cc9,0xa02ac028,0x31695403,0xb3bb26b8,0x5ea427c5,0xd6592f61,0xd177eeb0,0xe5607e7c,0x188a7b55,0xa2aa9079,0xb}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xf2e65870,0x8186e47b,0x260e85ec,0xb9e8fec1,0xb89b6d00,0xf41458ba,0x73b02294,0x56374a97,0x94c1551f,0xd296b0c5,0xa6091d55,0x1e250331,0xa}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x168fa2db,0x6f6623c4,0xfa03217a,0xdf093cba,0x3ea35ba9,0x693c0ae8,0x3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x2d1f45b6,0xdecc4788,0xf40642f4,0xbe127975,0x7d46b753,0xd27815d0,0x6}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -7, ._mp_d = (mp_limb_t[]) {0xc53841c8,0x80dd3ec1,0x3b0ceefd,0x9ed03fa5,0x8c878a6f,0x39961b3a,0x20}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x17}}; -#elif 8*DIGIT_LEN == 64 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x4c6174c1ffffffff,0xc722f669356ea468,0x65bc2e0a90aeb751,0xc6ae604a45d10ad6,0x3df6eeeab0871a2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x4c6174c1ffffffff,0xc722f669356ea468,0x65bc2e0a90aeb751,0xc6ae604a45d10ad6,0x3df6eeeab0871a2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x4c6174c1ffffffff,0xc722f669356ea468,0x65bc2e0a90aeb751,0xc6ae604a45d10ad6,0x3df6eeeab0871a2}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2590707e99c6d07e,0xf28915cb16a9e6e5,0x2890293703497b19}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2590707e99c6d07e,0xf28915cb16a9e6e5,0x2890293703497b19}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x92c8383f4ce3683f,0xf9448ae58b54f372,0x1448149b81a4bd8c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x56215dd2e45a7f02,0xf6022c7e517f7342,0x10d9521b0307361e,0xdb2be540c8a345c7,0x4603d9ec138f3e19,0x336af07cac6aa01}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x2b10aee9722d3f81,0x7b01163f28bfb9a1,0x886ca90d81839b0f,0xed95f2a06451a2e3,0xa301ecf609c79f0c,0x19b5783e5635500}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x5e1238847e34095e,0xbcb1266ba920ef66,0xf934ba2badf75cb}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x92c8383f4ce3683f,0xf9448ae58b54f372,0x1448149b81a4bd8c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2590707e99c6d07e,0xf28915cb16a9e6e5,0x2890293703497b19}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xbc247108fc6812bc,0x79624cd75241decc,0x1f26974575beeb97}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe5c509d2fecc0f18,0x9a05a0291c34cbb8,0x547246744c223cc5}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe5c509d2fecc0f18,0x9a05a0291c34cbb8,0x547246744c223cc5}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x72e284e97f66078c,0xcd02d0148e1a65dc,0x2a39233a26111e62}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc43101fdd791e920,0xf1d5eb4270fdbfb0,0x40ad63f049904a4,0x9b6487b92e8cb3d6,0xcdfc2d0ae7166f5a,0xded989f92770a6b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1b203b1fbea1d9e1,0x1b1d7b3a4320ec88,0x1ff707050ce2ed2e,0xd7c1cfe3ac3847ef,0x859812045c6f5fbd,0x5923d0ca0fc6a91}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x72e284e97f66078c,0xcd02d0148e1a65dc,0x2a39233a26111e62}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe5c509d2fecc0f18,0x9a05a0291c34cbb8,0x547246744c223cc5}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xc0dc5cf5fa90db,0x5c186e619256e0b9,0x68428964c8c36763}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x5}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xb093ac307214ee3a,0x8469aa718af1c9ce,0x17e946dd1492af6a}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xb093ac307214ee3a,0x8469aa718af1c9ce,0x17e946dd1492af6a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x5849d618390a771d,0x4234d538c578e4e7,0xbf4a36e8a4957b5}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x38b4f5d0df5ff292,0x5c40a340aca5b3b4,0x2da9507ac31ffe7f,0x94049af01e9adc1b,0x9944316021d78b76,0x11ddfa6e5dfba5a}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1c5a7ae86faff949,0xae2051a05652d9da,0x96d4a83d618fff3f,0x4a024d780f4d6e0d,0x4ca218b010ebc5bb,0x8eefd372efdd2d}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xd2ba1529402d1c90,0xf8930a27e4e7ab53,0x3054a3f95a7f471}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x5849d618390a771d,0x4234d538c578e4e7,0xbf4a36e8a4957b5}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xb093ac307214ee3a,0x8469aa718af1c9ce,0x17e946dd1492af6a}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xa5742a52805a3920,0xf126144fc9cf56a7,0x60a947f2b4fe8e3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x7}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x75fbcaf55a296ce0,0xe2d9ed64847e4497,0x2a98d22872c327c3}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x75fbcaf55a296ce0,0xe2d9ed64847e4497,0x2a98d22872c327c3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbafde57aad14b670,0xf16cf6b2423f224b,0x154c6914396193e1}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbafde57aad14b670,0xf16cf6b2423f224b,0x154c6914396193e1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xa90e8600c706e200,0x17b7964836d31c37,0x3031662b6528c8e4,0x55865e0e7e150a41,0xde5c8b21b08668d5,0x38b4017c11b59bb}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd487430063837100,0xbdbcb241b698e1b,0x9818b315b2946472,0xaac32f073f0a8520,0xef2e4590d843346a,0x1c5a00be08dacdd}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc8f41985415eaf81,0x4aa8fc00add53cdb,0xf0f5b005c67350e4,0x55865e0e7e150a40,0xde5c8b21b08668d5,0x38b4017c11b59bb}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbafde57aad14b670,0xf16cf6b2423f224b,0x154c6914396193e1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x75fbcaf55a296ce0,0xe2d9ed64847e4497,0x2a98d22872c327c3}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xc034d8f70b5064fe,0x9a1d348f11fbbeb7,0x7e776c4b3d6aefff}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xb}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7fd96267fae44de0,0x1927494b23507eca,0x8bbaf089621ce89}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7fd96267fae44de0,0x1927494b23507eca,0x8bbaf089621ce89}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x3fecb133fd7226f0,0x8c93a4a591a83f65,0x45dd7844b10e744}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x757c6efa27584200,0x4fe6d643defe8411,0xa66f281849f793ab,0x20b8530f715d6ca1,0x203297b74f0bb136,0x262244dbcd17ec}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x64465ee82d019c01,0xf85c0f68bf96c360,0xa6379706a0246232,0x20b8530f715d6ca1,0x203297b74f0bb136,0x262244dbcd17ec}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x3fecb133fd7226f0,0x8c93a4a591a83f65,0x45dd7844b10e744}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7fd96267fae44de0,0x1927494b23507eca,0x8bbaf089621ce89}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x11361011fa56a5ff,0x578ac6db1f67c0b1,0x379111a9d33178}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbfd984409c503a40,0xcaca8a3201f7d7e0,0xa143d3f26150b3b}}}, {{{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbfd984409c503a40,0xcaca8a3201f7d7e0,0xa143d3f26150b3b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x5fecc2204e281d20,0xe565451900fbebf0,0x50a1e9f930a859d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc21080113aa08800,0xecce24078c6c6c37,0x4e72d7b4d5f61310,0x32d13e55b8d1d10e,0x1c47e4ca37028e65,0x32cb3147bf5ff2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x742c9f981c890801,0xb28b59cab098299c,0x1b1eff55704ef560}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x5fecc2204e281d20,0xe565451900fbebf0,0x50a1e9f930a859d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbfd984409c503a40,0xcaca8a3201f7d7e0,0xa143d3f26150b3b}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x742c9f981c890801,0xb28b59cab098299c,0x1b1eff55704ef560}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x11}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdecc47882d1f45b6,0xbe127975f40642f4,0xd27815d07d46b753,0x6}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdecc47882d1f45b6,0xbe127975f40642f4,0xd27815d07d46b753,0x6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6f6623c4168fa2db,0xdf093cbafa03217a,0x693c0ae83ea35ba9,0x3}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x9f483d9f887ceb2,0x405580514daed993,0x67764d7062d2a807,0xacb25ec2bd484f8b,0xcac0fcf9a2efdd61,0x455520f23114f6ab,0x17}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x84fa41ecfc43e759,0xa02ac028a6d76cc9,0xb3bb26b831695403,0xd6592f615ea427c5,0xe5607e7cd177eeb0,0xa2aa9079188a7b55,0xb}}}, {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x8186e47bf2e65870,0xb9e8fec1260e85ec,0xf41458bab89b6d00,0x56374a9773b02294,0xd296b0c594c1551f,0x1e250331a6091d55,0xa}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6f6623c4168fa2db,0xdf093cbafa03217a,0x693c0ae83ea35ba9,0x3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdecc47882d1f45b6,0xbe127975f40642f4,0xd27815d07d46b753,0x6}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x80dd3ec1c53841c8,0x9ed03fa53b0ceefd,0x39961b3a8c878a6f,0x20}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x17}}; +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x171,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x171,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x171,0x0,0x0,0x0,0x0,0x8000000000000000}}} #endif +; +const quat_alg_t QUATALG_PINFTY = { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x40ff}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x40ffffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0x40ffffffffffffff}}} +#endif +}; +const quat_p_extremal_maximal_order_t EXTREMAL_ORDERS[8] = {{{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 1}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xafcc,0xe7ed,0x58f3,0x3e59,0x9763,0x88d6,0xf2c5,0x4a6d,0x3afe,0xf44b,0x7d27,0x3c31}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe7edafcc,0x3e5958f3,0x88d69763,0x4a6df2c5,0xf44b3afe,0x3c317d27}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x3e5958f3e7edafcc,0x4a6df2c588d69763,0x3c317d27f44b3afe}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xafcc,0xe7ed,0x58f3,0x3e59,0x9763,0x88d6,0xf2c5,0x4a6d,0x3afe,0xf44b,0x7d27,0x3c31}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe7edafcc,0x3e5958f3,0x88d69763,0x4a6df2c5,0xf44b3afe,0x3c317d27}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x3e5958f3e7edafcc,0x4a6df2c588d69763,0x3c317d27f44b3afe}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd7e6,0xf3f6,0xac79,0x9f2c,0x4bb1,0xc46b,0xf962,0x2536,0x9d7f,0xfa25,0xbe93,0x1e18}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf3f6d7e6,0x9f2cac79,0xc46b4bb1,0x2536f962,0xfa259d7f,0x1e18be93}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x9f2cac79f3f6d7e6,0x2536f962c46b4bb1,0x1e18be93fa259d7f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2fb7,0xea91,0xa3ea,0x2a21,0x9cd1,0x26b3,0xde73,0xa2d3,0xcecc,0x20a1,0xc963,0x266b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea912fb7,0x2a21a3ea,0x26b39cd1,0xa2d3de73,0x20a1cecc,0x266bc963}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2a21a3eaea912fb7,0xa2d3de7326b39cd1,0x266bc96320a1cecc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x1e5f,0x4aa8,0x9064,0x8436,0x8fae,0x50ab,0x2fd8,0xdd15,0x617a,0x8343,0x9423,0x3d7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x680}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4aa81e5f,0x84369064,0x50ab8fae,0xdd152fd8,0x8343617a,0x3d79423,0x0,0x0,0x0,0x0,0x0,0x6800000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x843690644aa81e5f,0xdd152fd850ab8fae,0x3d794238343617a,0x0,0x0,0x680000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd7e6,0xf3f6,0xac79,0x9f2c,0x4bb1,0xc46b,0xf962,0x2536,0x9d7f,0xfa25,0xbe93,0x1e18}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xf3f6d7e6,0x9f2cac79,0xc46b4bb1,0x2536f962,0xfa259d7f,0x1e18be93}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x9f2cac79f3f6d7e6,0x2536f962c46b4bb1,0x1e18be93fa259d7f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x1e5f,0x4aa8,0x9064,0x8436,0x8fae,0x50ab,0x2fd8,0xdd15,0x617a,0x8343,0x9423,0x3d7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x4aa81e5f,0x84369064,0x50ab8fae,0xdd152fd8,0x8343617a,0x3d79423}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x843690644aa81e5f,0xdd152fd850ab8fae,0x3d794238343617a}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xafcc,0xe7ed,0x58f3,0x3e59,0x9763,0x88d6,0xf2c5,0x4a6d,0x3afe,0xf44b,0x7d27,0x3c31}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xe7edafcc,0x3e5958f3,0x88d69763,0x4a6df2c5,0xf44b3afe,0x3c317d27}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x3e5958f3e7edafcc,0x4a6df2c588d69763,0x3c317d27f44b3afe}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2fb7,0xea91,0xa3ea,0x2a21,0x9cd1,0x26b3,0xde73,0xa2d3,0xcecc,0x20a1,0xc963,0x266b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xea912fb7,0x2a21a3ea,0x26b39cd1,0xa2d3de73,0x20a1cecc,0x266bc963}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2a21a3eaea912fb7,0xa2d3de7326b39cd1,0x266bc96320a1cecc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 5}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc40,0xb21f,0x5bc7,0x8dca,0xc2a2,0xca0a,0xc8b1,0xbddd,0xcb7d,0xc9d5,0xa9d,0x3cc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb21f0c40,0x8dca5bc7,0xca0ac2a2,0xbdddc8b1,0xc9d5cb7d,0x3cc00a9d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x8dca5bc7b21f0c40,0xbdddc8b1ca0ac2a2,0x3cc00a9dc9d5cb7d}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc40,0xb21f,0x5bc7,0x8dca,0xc2a2,0xca0a,0xc8b1,0xbddd,0xcb7d,0xc9d5,0xa9d,0x3cc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb21f0c40,0x8dca5bc7,0xca0ac2a2,0xbdddc8b1,0xc9d5cb7d,0x3cc00a9d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x8dca5bc7b21f0c40,0xbdddc8b1ca0ac2a2,0x3cc00a9dc9d5cb7d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8620,0xd90f,0x2de3,0x46e5,0x6151,0xe505,0xe458,0xdeee,0xe5be,0xe4ea,0x54e,0x1e60}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd90f8620,0x46e52de3,0xe5056151,0xdeeee458,0xe4eae5be,0x1e60054e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x46e52de3d90f8620,0xdeeee458e5056151,0x1e60054ee4eae5be}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6801,0x9f6f,0x4e1e,0xbd0b,0x5c5e,0xaa12,0xb4c6,0x3849,0xd6c7,0x2d76,0x3227,0xb106}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9f6f6801,0xbd0b4e1e,0xaa125c5e,0x3849b4c6,0x2d76d6c7,0xb1063227}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbd0b4e1e9f6f6801,0x3849b4c6aa125c5e,0xb10632272d76d6c7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x8400,0x4135,0x343c,0xa4cf,0x6603,0xa414,0xc207,0x5ac7,0x921b,0xd084,0x1ed,0x6cf,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x280}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x41358400,0xa4cf343c,0xa4146603,0x5ac7c207,0xd084921b,0x6cf01ed,0x0,0x0,0x0,0x0,0x0,0x2800000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xa4cf343c41358400,0x5ac7c207a4146603,0x6cf01edd084921b,0x0,0x0,0x280000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8620,0xd90f,0x2de3,0x46e5,0x6151,0xe505,0xe458,0xdeee,0xe5be,0xe4ea,0x54e,0x1e60}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd90f8620,0x46e52de3,0xe5056151,0xdeeee458,0xe4eae5be,0x1e60054e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x46e52de3d90f8620,0xdeeee458e5056151,0x1e60054ee4eae5be}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x8400,0x4135,0x343c,0xa4cf,0x6603,0xa414,0xc207,0x5ac7,0x921b,0xd084,0x1ed,0x6cf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x41358400,0xa4cf343c,0xa4146603,0x5ac7c207,0xd084921b,0x6cf01ed}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xa4cf343c41358400,0x5ac7c207a4146603,0x6cf01edd084921b}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xc40,0xb21f,0x5bc7,0x8dca,0xc2a2,0xca0a,0xc8b1,0xbddd,0xcb7d,0xc9d5,0xa9d,0x3cc0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb21f0c40,0x8dca5bc7,0xca0ac2a2,0xbdddc8b1,0xc9d5cb7d,0x3cc00a9d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x8dca5bc7b21f0c40,0xbdddc8b1ca0ac2a2,0x3cc00a9dc9d5cb7d}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x6801,0x9f6f,0x4e1e,0xbd0b,0x5c5e,0xaa12,0xb4c6,0x3849,0xd6c7,0x2d76,0x3227,0xb106}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9f6f6801,0xbd0b4e1e,0xaa125c5e,0x3849b4c6,0x2d76d6c7,0xb1063227}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbd0b4e1e9f6f6801,0x3849b4c6aa125c5e,0xb10632272d76d6c7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 13}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x5b40,0x7328,0xdb38,0x5357,0x465b,0x31d8,0x1f3,0x85cf,0x32b9,0xd8dc,0x6f6d,0x3dab,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x73285b40,0x5357db38,0x31d8465b,0x85cf01f3,0xd8dc32b9,0x3dab6f6d,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5357db3873285b40,0x85cf01f331d8465b,0x3dab6f6dd8dc32b9,0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x5b40,0x7328,0xdb38,0x5357,0x465b,0x31d8,0x1f3,0x85cf,0x32b9,0xd8dc,0x6f6d,0x3dab,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x73285b40,0x5357db38,0x31d8465b,0x85cf01f3,0xd8dc32b9,0x3dab6f6d,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5357db3873285b40,0x85cf01f331d8465b,0x3dab6f6dd8dc32b9,0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x2da0,0x3994,0xed9c,0xa9ab,0x232d,0x98ec,0x80f9,0xc2e7,0x195c,0xec6e,0xb7b6,0x1ed5,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x39942da0,0xa9abed9c,0x98ec232d,0xc2e780f9,0xec6e195c,0x1ed5b7b6,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa9abed9c39942da0,0xc2e780f998ec232d,0x1ed5b7b6ec6e195c,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -13, ._mp_d = (mp_limb_t[]) {0xb7ef,0x4ddc,0x58cc,0xe284,0xc4a7,0xb9ed,0xdca9,0xc383,0xc3dd,0x5a13,0xd2bc,0x7663,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -7, ._mp_d = (mp_limb_t[]) {0x4ddcb7ef,0xe28458cc,0xb9edc4a7,0xc383dca9,0x5a13c3dd,0x7663d2bc,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xe28458cc4ddcb7ef,0xc383dca9b9edc4a7,0x7663d2bc5a13c3dd,0x3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xdc07,0x925a,0x605a,0x9489,0x475b,0x7944,0x880f,0x65fa,0xed5a,0x329c,0x13f8,0x78f2,0xfffe,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x207f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x925adc07,0x9489605a,0x7944475b,0x65fa880f,0x329ced5a,0x78f213f8,0xfffffffe,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x207fffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9489605a925adc07,0x65fa880f7944475b,0x78f213f8329ced5a,0xfffffffffffffffe,0xffffffffffffffff,0x207fffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x2da0,0x3994,0xed9c,0xa9ab,0x232d,0x98ec,0x80f9,0xc2e7,0x195c,0xec6e,0xb7b6,0x1ed5,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x39942da0,0xa9abed9c,0x98ec232d,0xc2e780f9,0xec6e195c,0x1ed5b7b6,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa9abed9c39942da0,0xc2e780f998ec232d,0x1ed5b7b6ec6e195c,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x9c07,0x5ca4,0xc660,0xc2e5,0x94d7,0x2b1d,0x3b32,0xa3de,0x67a4,0x2fd3,0xfeab,0x1a11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x5ca49c07,0xc2e5c660,0x2b1d94d7,0xa3de3b32,0x2fd367a4,0x1a11feab}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xc2e5c6605ca49c07,0xa3de3b322b1d94d7,0x1a11feab2fd367a4}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x5b40,0x7328,0xdb38,0x5357,0x465b,0x31d8,0x1f3,0x85cf,0x32b9,0xd8dc,0x6f6d,0x3dab,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x73285b40,0x5357db38,0x31d8465b,0x85cf01f3,0xd8dc32b9,0x3dab6f6d,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5357db3873285b40,0x85cf01f331d8465b,0x3dab6f6dd8dc32b9,0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -13, ._mp_d = (mp_limb_t[]) {0xb7ef,0x4ddc,0x58cc,0xe284,0xc4a7,0xb9ed,0xdca9,0xc383,0xc3dd,0x5a13,0xd2bc,0x7663,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -7, ._mp_d = (mp_limb_t[]) {0x4ddcb7ef,0xe28458cc,0xb9edc4a7,0xc383dca9,0x5a13c3dd,0x7663d2bc,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xe28458cc4ddcb7ef,0xc383dca9b9edc4a7,0x7663d2bc5a13c3dd,0x3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 17}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdfda,0xabc3,0xd4b8,0x7c1c,0x4727,0x66b2,0x21da,0x79cc,0xe3a3,0x553d,0x9b8d,0xa12d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xabc3dfda,0x7c1cd4b8,0x66b24727,0x79cc21da,0x553de3a3,0xa12d9b8d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7c1cd4b8abc3dfda,0x79cc21da66b24727,0xa12d9b8d553de3a3}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdfda,0xabc3,0xd4b8,0x7c1c,0x4727,0x66b2,0x21da,0x79cc,0xe3a3,0x553d,0x9b8d,0xa12d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xabc3dfda,0x7c1cd4b8,0x66b24727,0x79cc21da,0x553de3a3,0xa12d9b8d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7c1cd4b8abc3dfda,0x79cc21da66b24727,0xa12d9b8d553de3a3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xefed,0x55e1,0x6a5c,0xbe0e,0x2393,0x3359,0x10ed,0xbce6,0xf1d1,0xaa9e,0xcdc6,0x5096}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x55e1efed,0xbe0e6a5c,0x33592393,0xbce610ed,0xaa9ef1d1,0x5096cdc6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbe0e6a5c55e1efed,0xbce610ed33592393,0x5096cdc6aa9ef1d1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xe8e2,0xea6f,0x72f1,0x2e52,0x152a,0xc137,0x5fe4,0xfd0e,0x9736,0x7a1,0xfa3d,0xc6b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xea6fe8e2,0x2e5272f1,0xc137152a,0xfd0e5fe4,0x7a19736,0xc6bfa3d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x2e5272f1ea6fe8e2,0xfd0e5fe4c137152a,0xc6bfa3d07a19736}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x9a15,0x48a0,0x16ae,0xa42,0x3772,0x534a,0x26a7,0x2f5e,0xce7c,0x39eb,0xa365,0x745c,0x6a25,0xa257,0x2576,0x576a,0x76a2,0x6a25,0xa257,0x2576,0x576a,0x76a2,0x6a25,0x657}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x48a09a15,0xa4216ae,0x534a3772,0x2f5e26a7,0x39ebce7c,0x745ca365,0xa2576a25,0x576a2576,0x6a2576a2,0x2576a257,0x76a2576a,0x6576a25}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xa4216ae48a09a15,0x2f5e26a7534a3772,0x745ca36539ebce7c,0x576a2576a2576a25,0x2576a2576a2576a2,0x6576a2576a2576a}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xefed,0x55e1,0x6a5c,0xbe0e,0x2393,0x3359,0x10ed,0xbce6,0xf1d1,0xaa9e,0xcdc6,0x5096}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x55e1efed,0xbe0e6a5c,0x33592393,0xbce610ed,0xaa9ef1d1,0x5096cdc6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbe0e6a5c55e1efed,0xbce610ed33592393,0x5096cdc6aa9ef1d1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x50e5,0x2533,0xb03b,0x2c45,0xfde,0xaaf1,0xafff,0x8c73,0xebfd,0xfb3,0xc7bc,0x26}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x253350e5,0x2c45b03b,0xaaf10fde,0x8c73afff,0xfb3ebfd,0x26c7bc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2c45b03b253350e5,0x8c73afffaaf10fde,0x26c7bc0fb3ebfd}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdfda,0xabc3,0xd4b8,0x7c1c,0x4727,0x66b2,0x21da,0x79cc,0xe3a3,0x553d,0x9b8d,0xa12d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xabc3dfda,0x7c1cd4b8,0x66b24727,0x79cc21da,0x553de3a3,0xa12d9b8d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7c1cd4b8abc3dfda,0x79cc21da66b24727,0xa12d9b8d553de3a3}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xe8e2,0xea6f,0x72f1,0x2e52,0x152a,0xc137,0x5fe4,0xfd0e,0x9736,0x7a1,0xfa3d,0xc6b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xea6fe8e2,0x2e5272f1,0xc137152a,0xfd0e5fe4,0x7a19736,0xc6bfa3d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x2e5272f1ea6fe8e2,0xfd0e5fe4c137152a,0xc6bfa3d07a19736}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x8}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 41}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb000,0x6067,0x56e7,0x950c,0xb3d,0x28e6,0x1bfb,0xb990,0xeb8,0x7184,0x2273,0x29aa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6067b000,0x950c56e7,0x28e60b3d,0xb9901bfb,0x71840eb8,0x29aa2273}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x950c56e76067b000,0xb9901bfb28e60b3d,0x29aa227371840eb8}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb000,0x6067,0x56e7,0x950c,0xb3d,0x28e6,0x1bfb,0xb990,0xeb8,0x7184,0x2273,0x29aa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6067b000,0x950c56e7,0x28e60b3d,0xb9901bfb,0x71840eb8,0x29aa2273}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x950c56e76067b000,0xb9901bfb28e60b3d,0x29aa227371840eb8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd800,0xb033,0x2b73,0xca86,0x59e,0x9473,0xdfd,0x5cc8,0x75c,0xb8c2,0x1139,0x14d5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb033d800,0xca862b73,0x9473059e,0x5cc80dfd,0xb8c2075c,0x14d51139}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xca862b73b033d800,0x5cc80dfd9473059e,0x14d51139b8c2075c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xffff,0xef7f,0x6120,0xdec9,0x3d80,0xfcb4,0xe8d7,0x2d72,0x4077,0xeecc,0xcd2a,0x4bc9,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xef7fffff,0xdec96120,0xfcb43d80,0x2d72e8d7,0xeecc4077,0x4bc9cd2a,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdec96120ef7fffff,0x2d72e8d7fcb43d80,0x4bc9cd2aeecc4077,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -24, ._mp_d = (mp_limb_t[]) {0x73ba,0x1227,0x9519,0xedfb,0x605b,0xe80,0x1a20,0xf0b2,0xb418,0xa90c,0xb325,0xefd6,0x7e3e,0xf8fc,0xe3f1,0x8fc7,0x3f1f,0xfc7e,0xf1f8,0xc7e3,0x1f8f,0x7e3f,0xf8fc,0x71}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x122773ba,0xedfb9519,0xe80605b,0xf0b21a20,0xa90cb418,0xefd6b325,0xf8fc7e3e,0x8fc7e3f1,0xfc7e3f1f,0xc7e3f1f8,0x7e3f1f8f,0x71f8fc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xedfb9519122773ba,0xf0b21a200e80605b,0xefd6b325a90cb418,0x8fc7e3f1f8fc7e3e,0xc7e3f1f8fc7e3f1f,0x71f8fc7e3f1f8f}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xd800,0xb033,0x2b73,0xca86,0x59e,0x9473,0xdfd,0x5cc8,0x75c,0xb8c2,0x1139,0x14d5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xb033d800,0xca862b73,0x9473059e,0x5cc80dfd,0xb8c2075c,0x14d51139}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xca862b73b033d800,0x5cc80dfd9473059e,0x14d51139b8c2075c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x73ba,0x8a7,0x681e,0x130f,0xeee3,0xd966,0x4ebe,0xf78b,0xba4d,0xfa9,0xc409,0x245}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x8a773ba,0x130f681e,0xd966eee3,0xf78b4ebe,0xfa9ba4d,0x245c409}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x130f681e08a773ba,0xf78b4ebed966eee3,0x245c4090fa9ba4d}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xb000,0x6067,0x56e7,0x950c,0xb3d,0x28e6,0x1bfb,0xb990,0xeb8,0x7184,0x2273,0x29aa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6067b000,0x950c56e7,0x28e60b3d,0xb9901bfb,0x71840eb8,0x29aa2273}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x950c56e76067b000,0xb9901bfb28e60b3d,0x29aa227371840eb8}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xffff,0xef7f,0x6120,0xdec9,0x3d80,0xfcb4,0xe8d7,0x2d72,0x4077,0xeecc,0xcd2a,0x4bc9,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xef7fffff,0xdec96120,0xfcb43d80,0x2d72e8d7,0xeecc4077,0x4bc9cd2a,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdec96120ef7fffff,0x2d72e8d7fcb43d80,0x4bc9cd2aeecc4077,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 73}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7b26,0x37a0,0xc8dc,0x97d3,0x7f2f,0xd6bd,0x931,0x1df2,0x2918,0x4a3e,0x2591,0x6ee7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x37a07b26,0x97d3c8dc,0xd6bd7f2f,0x1df20931,0x4a3e2918,0x6ee72591}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x97d3c8dc37a07b26,0x1df20931d6bd7f2f,0x6ee725914a3e2918}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7b26,0x37a0,0xc8dc,0x97d3,0x7f2f,0xd6bd,0x931,0x1df2,0x2918,0x4a3e,0x2591,0x6ee7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x37a07b26,0x97d3c8dc,0xd6bd7f2f,0x1df20931,0x4a3e2918,0x6ee72591}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x97d3c8dc37a07b26,0x1df20931d6bd7f2f,0x6ee725914a3e2918}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3d93,0x1bd0,0xe46e,0xcbe9,0xbf97,0xeb5e,0x498,0xef9,0x148c,0xa51f,0x92c8,0x3773}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1bd03d93,0xcbe9e46e,0xeb5ebf97,0xef90498,0xa51f148c,0x377392c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xcbe9e46e1bd03d93,0xef90498eb5ebf97,0x377392c8a51f148c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4fae,0x9faa,0x2b8a,0x6a69,0x436c,0x633a,0x7892,0x301c,0xec62,0xcb54,0xe41,0xac50}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9faa4fae,0x6a692b8a,0x633a436c,0x301c7892,0xcb54ec62,0xac500e41}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x6a692b8a9faa4fae,0x301c7892633a436c,0xac500e41cb54ec62}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -24, ._mp_d = (mp_limb_t[]) {0x30b3,0xeb66,0x87b7,0x617e,0x27c,0xfa7,0xdcf4,0x90c8,0x7e8b,0x9e3c,0xaf36,0xb7ba,0x5eeb,0xbaf7,0xbdd7,0x75ee,0x7baf,0xebdd,0xf75e,0xd7ba,0xeebd,0xaf75,0xdd7b,0x2eb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xeb6630b3,0x617e87b7,0xfa7027c,0x90c8dcf4,0x9e3c7e8b,0xb7baaf36,0xbaf75eeb,0x75eebdd7,0xebdd7baf,0xd7baf75e,0xaf75eebd,0x2ebdd7b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x617e87b7eb6630b3,0x90c8dcf40fa7027c,0xb7baaf369e3c7e8b,0x75eebdd7baf75eeb,0xd7baf75eebdd7baf,0x2ebdd7baf75eebd}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3d93,0x1bd0,0xe46e,0xcbe9,0xbf97,0xeb5e,0x498,0xef9,0x148c,0xa51f,0x92c8,0x3773}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1bd03d93,0xcbe9e46e,0xeb5ebf97,0xef90498,0xa51f148c,0x377392c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xcbe9e46e1bd03d93,0xef90498eb5ebf97,0x377392c8a51f148c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xb5ab,0x986,0x1b92,0x5123,0x4b2a,0x653b,0x4896,0xc0fd,0x579e,0xc06c,0xd20e,0xf7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x986b5ab,0x51231b92,0x653b4b2a,0xc0fd4896,0xc06c579e,0xf7d20e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x51231b920986b5ab,0xc0fd4896653b4b2a,0xf7d20ec06c579e}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7b26,0x37a0,0xc8dc,0x97d3,0x7f2f,0xd6bd,0x931,0x1df2,0x2918,0x4a3e,0x2591,0x6ee7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x37a07b26,0x97d3c8dc,0xd6bd7f2f,0x1df20931,0x4a3e2918,0x6ee72591}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x97d3c8dc37a07b26,0x1df20931d6bd7f2f,0x6ee725914a3e2918}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4fae,0x9faa,0x2b8a,0x6a69,0x436c,0x633a,0x7892,0x301c,0xec62,0xcb54,0xe41,0xac50}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9faa4fae,0x6a692b8a,0x633a436c,0x301c7892,0xcb54ec62,0xac500e41}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x6a692b8a9faa4fae,0x301c7892633a436c,0xac500e41cb54ec62}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x8}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 89}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa194,0x6df0,0x4b4c,0xf874,0xb43e,0x362a,0x11bb,0x84f2,0xc623,0x61a2,0x7d42,0xe501,0x30}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x6df0a194,0xf8744b4c,0x362ab43e,0x84f211bb,0x61a2c623,0xe5017d42,0x30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf8744b4c6df0a194,0x84f211bb362ab43e,0xe5017d4261a2c623,0x30}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa194,0x6df0,0x4b4c,0xf874,0xb43e,0x362a,0x11bb,0x84f2,0xc623,0x61a2,0x7d42,0xe501,0x30}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x6df0a194,0xf8744b4c,0x362ab43e,0x84f211bb,0x61a2c623,0xe5017d42,0x30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf8744b4c6df0a194,0x84f211bb362ab43e,0xe5017d4261a2c623,0x30}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x50ca,0x36f8,0x25a6,0x7c3a,0x5a1f,0x9b15,0x8dd,0xc279,0x6311,0x30d1,0xbea1,0x7280,0x18}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x36f850ca,0x7c3a25a6,0x9b155a1f,0xc27908dd,0x30d16311,0x7280bea1,0x18}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7c3a25a636f850ca,0xc27908dd9b155a1f,0x7280bea130d16311,0x18}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x83f7,0x63ae,0x245e,0x2154,0x883c,0x544b,0x8f96,0x1b2d,0xcc0c,0x8d73,0x7bdd,0x118e,0x1df}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x63ae83f7,0x2154245e,0x544b883c,0x1b2d8f96,0x8d73cc0c,0x118e7bdd,0x1df}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2154245e63ae83f7,0x1b2d8f96544b883c,0x118e7bdd8d73cc0c,0x1df}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -24, ._mp_d = (mp_limb_t[]) {0xbd79,0x489c,0xbd84,0xce46,0x9344,0xb194,0x642a,0x3c5a,0xdb04,0x96f5,0x6e1f,0x4dcb,0xff6e,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x207f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x489cbd79,0xce46bd84,0xb1949344,0x3c5a642a,0x96f5db04,0x4dcb6e1f,0xffffff6e,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x207fffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xce46bd84489cbd79,0x3c5a642ab1949344,0x4dcb6e1f96f5db04,0xffffffffffffff6e,0xffffffffffffffff,0x207fffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x50ca,0x36f8,0x25a6,0x7c3a,0x5a1f,0x9b15,0x8dd,0xc279,0x6311,0x30d1,0xbea1,0x7280,0x18}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x36f850ca,0x7c3a25a6,0x9b155a1f,0xc27908dd,0x30d16311,0x7280bea1,0x18}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7c3a25a636f850ca,0xc27908dd9b155a1f,0x7280bea130d16311,0x18}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -13, ._mp_d = (mp_limb_t[]) {0xa1c9,0x3fda,0x577,0x71a8,0xf4d3,0x4269,0xecf2,0x2a5d,0x41b6,0x6e41,0x47e5,0x782c,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -7, ._mp_d = (mp_limb_t[]) {0x3fdaa1c9,0x71a80577,0x4269f4d3,0x2a5decf2,0x6e4141b6,0x782c47e5,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x71a805773fdaa1c9,0x2a5decf24269f4d3,0x782c47e56e4141b6,0x2}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa194,0x6df0,0x4b4c,0xf874,0xb43e,0x362a,0x11bb,0x84f2,0xc623,0x61a2,0x7d42,0xe501,0x30}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x6df0a194,0xf8744b4c,0x362ab43e,0x84f211bb,0x61a2c623,0xe5017d42,0x30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf8744b4c6df0a194,0x84f211bb362ab43e,0xe5017d4261a2c623,0x30}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x83f7,0x63ae,0x245e,0x2154,0x883c,0x544b,0x8f96,0x1b2d,0xcc0c,0x8d73,0x7bdd,0x118e,0x1df}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x63ae83f7,0x2154245e,0x544b883c,0x1b2d8f96,0x8d73cc0c,0x118e7bdd,0x1df}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x2154245e63ae83f7,0x1b2d8f96544b883c,0x118e7bdd8d73cc0c,0x1df}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 97}}; +const quat_left_ideal_t CONNECTING_IDEALS[8] = {{{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xbf5a,0x9a6f,0xcde1,0x21d4,0x52b1,0xe7a0,0xf3ba,0x78eb,0xc45c,0x787f,0x5c29,0x1c51,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x9a6fbf5a,0x21d4cde1,0xe7a052b1,0x78ebf3ba,0x787fc45c,0x1c515c29,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x21d4cde19a6fbf5a,0x78ebf3bae7a052b1,0x1c515c29787fc45c,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x8015,0xfd5c,0xb508,0x1437,0xfa92,0x6222,0x1452,0xa79a,0x6c31,0xd3a9,0xb3c4,0x15c5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xfd5c8015,0x1437b508,0x6222fa92,0xa79a1452,0xd3a96c31,0x15c5b3c4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x1437b508fd5c8015,0xa79a14526222fa92,0x15c5b3c4d3a96c31}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xbf5a,0x9a6f,0xcde1,0x21d4,0x52b1,0xe7a0,0xf3ba,0x78eb,0xc45c,0x787f,0x5c29,0x1c51,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x9a6fbf5a,0x21d4cde1,0xe7a052b1,0x78ebf3ba,0x787fc45c,0x1c515c29,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x21d4cde19a6fbf5a,0x78ebf3bae7a052b1,0x1c515c29787fc45c,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x3f45,0x9d13,0x18d8,0xd9d,0x581f,0x857d,0xdf68,0xd151,0x582a,0xa4d6,0xa864,0x68b,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x9d133f45,0xd9d18d8,0x857d581f,0xd151df68,0xa4d6582a,0x68ba864,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd9d18d89d133f45,0xd151df68857d581f,0x68ba864a4d6582a,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdfad,0xcd37,0x66f0,0x90ea,0x2958,0x73d0,0xf9dd,0x3c75,0xe22e,0xbc3f,0xae14,0x8e28}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xcd37dfad,0x90ea66f0,0x73d02958,0x3c75f9dd,0xbc3fe22e,0x8e28ae14}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x90ea66f0cd37dfad,0x3c75f9dd73d02958,0x8e28ae14bc3fe22e}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x9d7a,0x920e,0xe71,0xc120,0x8fbf,0x607e,0x29f,0xff55,0x7422,0x4796,0xbca4,0x125b,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x920e9d7a,0xc1200e71,0x607e8fbf,0xff55029f,0x47967422,0x125bbca4,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc1200e71920e9d7a,0xff55029f607e8fbf,0x125bbca447967422,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xbcbf,0x76ed,0xc538,0xec53,0xeb88,0xb40d,0xa54e,0x14f,0x8bb2,0x300a,0xedb2,0x539}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x76edbcbf,0xec53c538,0xb40deb88,0x14fa54e,0x300a8bb2,0x539edb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xec53c53876edbcbf,0x14fa54eb40deb88,0x539edb2300a8bb2}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x9d7a,0x920e,0xe71,0xc120,0x8fbf,0x607e,0x29f,0xff55,0x7422,0x4796,0xbca4,0x125b,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x920e9d7a,0xc1200e71,0x607e8fbf,0xff55029f,0x47967422,0x125bbca4,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc1200e71920e9d7a,0xff55029f607e8fbf,0x125bbca447967422,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xe0bb,0x1b20,0x4939,0xd4cc,0xa436,0xac70,0x5d50,0xfe05,0xe870,0x178b,0xcef2,0xd21,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x1b20e0bb,0xd4cc4939,0xac70a436,0xfe055d50,0x178be870,0xd21cef2,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd4cc49391b20e0bb,0xfe055d50ac70a436,0xd21cef2178be870,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4ebd,0xc907,0x738,0xe090,0x47df,0xb03f,0x814f,0x7faa,0x3a11,0x23cb,0xde52,0x892d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xc9074ebd,0xe0900738,0xb03f47df,0x7faa814f,0x23cb3a11,0x892dde52}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xe0900738c9074ebd,0x7faa814fb03f47df,0x892dde5223cb3a11}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xd282,0xcb1f,0x6532,0xe33e,0x153d,0xfd8,0x4275,0x2b62,0xf17d,0xdb04,0x3f12,0xf722,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xcb1fd282,0xe33e6532,0xfd8153d,0x2b624275,0xdb04f17d,0xf7223f12,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe33e6532cb1fd282,0x2b6242750fd8153d,0xf7223f12db04f17d,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x50bf,0xeebf,0xe944,0xea4d,0x76d,0xcbc5,0x4919,0x12b0,0x71f3,0x9e30,0x3304,0x1265}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xeebf50bf,0xea4de944,0xcbc5076d,0x12b04919,0x9e3071f3,0x12653304}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xea4de944eebf50bf,0x12b04919cbc5076d,0x126533049e3071f3}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xd282,0xcb1f,0x6532,0xe33e,0x153d,0xfd8,0x4275,0x2b62,0xf17d,0xdb04,0x3f12,0xf722,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xcb1fd282,0xe33e6532,0xfd8153d,0x2b624275,0xdb04f17d,0xf7223f12,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe33e6532cb1fd282,0x2b6242750fd8153d,0xf7223f12db04f17d,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x81c3,0xdc60,0x7bed,0xf8f0,0xdcf,0x4413,0xf95b,0x18b1,0x7f8a,0x3cd4,0xc0e,0xe4bd,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xdc6081c3,0xf8f07bed,0x44130dcf,0x18b1f95b,0x3cd47f8a,0xe4bd0c0e,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf8f07beddc6081c3,0x18b1f95b44130dcf,0xe4bd0c0e3cd47f8a,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe941,0x658f,0x3299,0xf19f,0xa9e,0x87ec,0x213a,0x95b1,0x78be,0x6d82,0x1f89,0xfb91}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x658fe941,0xf19f3299,0x87ec0a9e,0x95b1213a,0x6d8278be,0xfb911f89}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xf19f3299658fe941,0x95b1213a87ec0a9e,0xfb911f896d8278be}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdfda,0xabc3,0xd4b8,0x7c1c,0x4727,0x66b2,0x21da,0x79cc,0xe3a3,0x553d,0x9b8d,0xa12d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xabc3dfda,0x7c1cd4b8,0x66b24727,0x79cc21da,0x553de3a3,0xa12d9b8d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7c1cd4b8abc3dfda,0x79cc21da66b24727,0xa12d9b8d553de3a3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x60fb,0xd399,0x887f,0xd263,0xe0e7,0xb202,0x699b,0xea34,0x5a15,0x4b8a,0x6763,0x8e95}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd39960fb,0xd263887f,0xb202e0e7,0xea34699b,0x4b8a5a15,0x8e956763}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xd263887fd39960fb,0xea34699bb202e0e7,0x8e9567634b8a5a15}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xdfda,0xabc3,0xd4b8,0x7c1c,0x4727,0x66b2,0x21da,0x79cc,0xe3a3,0x553d,0x9b8d,0xa12d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xabc3dfda,0x7c1cd4b8,0x66b24727,0x79cc21da,0x553de3a3,0xa12d9b8d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x7c1cd4b8abc3dfda,0x79cc21da66b24727,0xa12d9b8d553de3a3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7edf,0xd82a,0x4c38,0xa9b9,0x663f,0xb4af,0xb83e,0x8f97,0x898d,0x9b3,0x342a,0x1298}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xd82a7edf,0xa9b94c38,0xb4af663f,0x8f97b83e,0x9b3898d,0x1298342a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xa9b94c38d82a7edf,0x8f97b83eb4af663f,0x1298342a09b3898d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xefed,0x55e1,0x6a5c,0xbe0e,0x2393,0x3359,0x10ed,0xbce6,0xf1d1,0xaa9e,0xcdc6,0x5096}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x55e1efed,0xbe0e6a5c,0x33592393,0xbce610ed,0xaa9ef1d1,0x5096cdc6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbe0e6a5c55e1efed,0xbce610ed33592393,0x5096cdc6aa9ef1d1}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xe00e,0xd869,0x1a76,0xd8de,0xfe4c,0xabc5,0x99e1,0xf264,0x7d83,0x9c3,0x32ab,0xb60b,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xd869e00e,0xd8de1a76,0xabc5fe4c,0xf26499e1,0x9c37d83,0xb60b32ab,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8de1a76d869e00e,0xf26499e1abc5fe4c,0xb60b32ab09c37d83,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xb00f,0x8bbf,0x19a9,0xd6b,0xf7b,0xcd5c,0x74e7,0xd7e2,0xa419,0x3593,0x56a8,0x8de8,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x8bbfb00f,0xd6b19a9,0xcd5c0f7b,0xd7e274e7,0x3593a419,0x8de856a8,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd6b19a98bbfb00f,0xd7e274e7cd5c0f7b,0x8de856a83593a419,0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xe00e,0xd869,0x1a76,0xd8de,0xfe4c,0xabc5,0x99e1,0xf264,0x7d83,0x9c3,0x32ab,0xb60b,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xd869e00e,0xd8de1a76,0xabc5fe4c,0xf26499e1,0x9c37d83,0xb60b32ab,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xd8de1a76d869e00e,0xf26499e1abc5fe4c,0xb60b32ab09c37d83,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2fff,0x4caa,0xcd,0xcb73,0xeed1,0xde69,0x24f9,0x1a82,0xd96a,0xd42f,0xdc02,0x2822}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4caa2fff,0xcb7300cd,0xde69eed1,0x1a8224f9,0xd42fd96a,0x2822dc02}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xcb7300cd4caa2fff,0x1a8224f9de69eed1,0x2822dc02d42fd96a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xf007,0x6c34,0xd3b,0x6c6f,0xff26,0xd5e2,0x4cf0,0xf932,0xbec1,0x84e1,0x9955,0xdb05}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6c34f007,0x6c6f0d3b,0xd5e2ff26,0xf9324cf0,0x84e1bec1,0xdb059955}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x6c6f0d3b6c34f007,0xf9324cf0d5e2ff26,0xdb05995584e1bec1}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7b26,0x37a0,0xc8dc,0x97d3,0x7f2f,0xd6bd,0x931,0x1df2,0x2918,0x4a3e,0x2591,0x6ee7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x37a07b26,0x97d3c8dc,0xd6bd7f2f,0x1df20931,0x4a3e2918,0x6ee72591}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x97d3c8dc37a07b26,0x1df20931d6bd7f2f,0x6ee725914a3e2918}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3a91,0xcd01,0xac55,0x9a52,0x9887,0x118f,0x4dec,0x4245,0xd869,0x1022,0x1d16,0x7ad}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xcd013a91,0x9a52ac55,0x118f9887,0x42454dec,0x1022d869,0x7ad1d16}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x9a52ac55cd013a91,0x42454dec118f9887,0x7ad1d161022d869}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x7b26,0x37a0,0xc8dc,0x97d3,0x7f2f,0xd6bd,0x931,0x1df2,0x2918,0x4a3e,0x2591,0x6ee7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x37a07b26,0x97d3c8dc,0xd6bd7f2f,0x1df20931,0x4a3e2918,0x6ee72591}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x97d3c8dc37a07b26,0x1df20931d6bd7f2f,0x6ee725914a3e2918}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4095,0x6a9f,0x1c86,0xfd81,0xe6a7,0xc52d,0xbb45,0xdbac,0x50ae,0x3a1b,0x87b,0x673a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x6a9f4095,0xfd811c86,0xc52de6a7,0xdbacbb45,0x3a1b50ae,0x673a087b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xfd811c866a9f4095,0xdbacbb45c52de6a7,0x673a087b3a1b50ae}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3d93,0x1bd0,0xe46e,0xcbe9,0xbf97,0xeb5e,0x498,0xef9,0x148c,0xa51f,0x92c8,0x3773}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1bd03d93,0xcbe9e46e,0xeb5ebf97,0xef90498,0xa51f148c,0x377392c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xcbe9e46e1bd03d93,0xef90498eb5ebf97,0x377392c8a51f148c}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe5ca,0x3b34,0xb04b,0x430f,0xe795,0xa04a,0x8c7d,0xec47,0x77df,0x8e5c,0xb71e,0xd31f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x3b34e5ca,0x430fb04b,0xa04ae795,0xec478c7d,0x8e5c77df,0xd31fb71e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x430fb04b3b34e5ca,0xec478c7da04ae795,0xd31fb71e8e5c77df}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x4d27,0x98d5,0x3839,0x83ff,0x48b7,0x4d5b,0xc95b,0xbe45,0x9d44,0x36f3,0x4d57,0x6c26}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x98d54d27,0x83ff3839,0x4d5b48b7,0xbe45c95b,0x36f39d44,0x6c264d57}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x83ff383998d54d27,0xbe45c95b4d5b48b7,0x6c264d5736f39d44}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xe5ca,0x3b34,0xb04b,0x430f,0xe795,0xa04a,0x8c7d,0xec47,0x77df,0x8e5c,0xb71e,0xd31f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x3b34e5ca,0x430fb04b,0xa04ae795,0xec478c7d,0x8e5c77df,0xd31fb71e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x430fb04b3b34e5ca,0xec478c7da04ae795,0xd31fb71e8e5c77df}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x98a3,0xa25f,0x7811,0xbf10,0x9edd,0x52ef,0xc322,0x2e01,0xda9b,0x5768,0x69c7,0x66f9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xa25f98a3,0xbf107811,0x52ef9edd,0x2e01c322,0x5768da9b,0x66f969c7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbf107811a25f98a3,0x2e01c32252ef9edd,0x66f969c75768da9b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x72e5,0x9d9a,0xd825,0xa187,0x73ca,0xd025,0xc63e,0xf623,0x3bef,0x472e,0xdb8f,0x698f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x9d9a72e5,0xa187d825,0xd02573ca,0xf623c63e,0x472e3bef,0x698fdb8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xa187d8259d9a72e5,0xf623c63ed02573ca,0x698fdb8f472e3bef}}} +#endif +, &MAXORD_O0}}; +const quat_alg_elem_t CONJUGATING_ELEMENTS[8] = {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x8015,0xfd5c,0xb508,0x1437,0xfa92,0x6222,0x1452,0xa79a,0x6c31,0xd3a9,0xb3c4,0x15c5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xfd5c8015,0x1437b508,0x6222fa92,0xa79a1452,0xd3a96c31,0x15c5b3c4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x1437b508fd5c8015,0xa79a14526222fa92,0x15c5b3c4d3a96c31}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x8015,0xfd5c,0xb508,0x1437,0xfa92,0x6222,0x1452,0xa79a,0x6c31,0xd3a9,0xb3c4,0x15c5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0xfd5c8015,0x1437b508,0x6222fa92,0xa79a1452,0xd3a96c31,0x15c5b3c4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0x1437b508fd5c8015,0xa79a14526222fa92,0x15c5b3c4d3a96c31}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xbcbf,0x76ed,0xc538,0xec53,0xeb88,0xb40d,0xa54e,0x14f,0x8bb2,0x300a,0xedb2,0x539}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x76edbcbf,0xec53c538,0xb40deb88,0x14fa54e,0x300a8bb2,0x539edb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xec53c53876edbcbf,0x14fa54eb40deb88,0x539edb2300a8bb2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xbcbf,0x76ed,0xc538,0xec53,0xeb88,0xb40d,0xa54e,0x14f,0x8bb2,0x300a,0xedb2,0x539}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x76edbcbf,0xec53c538,0xb40deb88,0x14fa54e,0x300a8bb2,0x539edb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xec53c53876edbcbf,0x14fa54eb40deb88,0x539edb2300a8bb2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x2341,0xb9df,0x4e77,0xcd8c,0x1cab,0xdb9d,0x8b8e,0x3e12,0x6370,0x7935,0x7217,0x987,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xb9df2341,0xcd8c4e77,0xdb9d1cab,0x3e128b8e,0x79356370,0x9877217,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xcd8c4e77b9df2341,0x3e128b8edb9d1cab,0x987721779356370,0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -13, ._mp_d = (mp_limb_t[]) {0x2341,0xb9df,0x4e77,0xcd8c,0x1cab,0xdb9d,0x8b8e,0x3e12,0x6370,0x7935,0x7217,0x987,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -7, ._mp_d = (mp_limb_t[]) {0xb9df2341,0xcd8c4e77,0xdb9d1cab,0x3e128b8e,0x79356370,0x9877217,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xcd8c4e77b9df2341,0x3e128b8edb9d1cab,0x987721779356370,0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xefed,0x55e1,0x6a5c,0xbe0e,0x2393,0x3359,0x10ed,0xbce6,0xf1d1,0xaa9e,0xcdc6,0x5096}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x55e1efed,0xbe0e6a5c,0x33592393,0xbce610ed,0xaa9ef1d1,0x5096cdc6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xbe0e6a5c55e1efed,0xbce610ed33592393,0x5096cdc6aa9ef1d1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0xefed,0x55e1,0x6a5c,0xbe0e,0x2393,0x3359,0x10ed,0xbce6,0xf1d1,0xaa9e,0xcdc6,0x5096}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x55e1efed,0xbe0e6a5c,0x33592393,0xbce610ed,0xaa9ef1d1,0x5096cdc6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xbe0e6a5c55e1efed,0xbce610ed33592393,0x5096cdc6aa9ef1d1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x2fff,0x4caa,0xcd,0xcb73,0xeed1,0xde69,0x24f9,0x1a82,0xd96a,0xd42f,0xdc02,0x2822}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x4caa2fff,0xcb7300cd,0xde69eed1,0x1a8224f9,0xd42fd96a,0x2822dc02}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xcb7300cd4caa2fff,0x1a8224f9de69eed1,0x2822dc02d42fd96a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2fff,0x4caa,0xcd,0xcb73,0xeed1,0xde69,0x24f9,0x1a82,0xd96a,0xd42f,0xdc02,0x2822}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x4caa2fff,0xcb7300cd,0xde69eed1,0x1a8224f9,0xd42fd96a,0x2822dc02}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xcb7300cd4caa2fff,0x1a8224f9de69eed1,0x2822dc02d42fd96a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3d93,0x1bd0,0xe46e,0xcbe9,0xbf97,0xeb5e,0x498,0xef9,0x148c,0xa51f,0x92c8,0x3773}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x1bd03d93,0xcbe9e46e,0xeb5ebf97,0xef90498,0xa51f148c,0x377392c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xcbe9e46e1bd03d93,0xef90498eb5ebf97,0x377392c8a51f148c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -12, ._mp_d = (mp_limb_t[]) {0x3d93,0x1bd0,0xe46e,0xcbe9,0xbf97,0xeb5e,0x498,0xef9,0x148c,0xa51f,0x92c8,0x3773}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -6, ._mp_d = (mp_limb_t[]) {0x1bd03d93,0xcbe9e46e,0xeb5ebf97,0xef90498,0xa51f148c,0x377392c8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -3, ._mp_d = (mp_limb_t[]) {0xcbe9e46e1bd03d93,0xef90498eb5ebf97,0x377392c8a51f148c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x4385,0xf091,0xe8e9,0xfaa3,0x7d60,0x8ab7,0x68b2,0x8a57,0x2754,0xa10c,0x6f20,0x71e4,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xf0914385,0xfaa3e8e9,0x8ab77d60,0x8a5768b2,0xa10c2754,0x71e46f20,0x4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xfaa3e8e9f0914385,0x8a5768b28ab77d60,0x71e46f20a10c2754,0x4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x4385,0xf091,0xe8e9,0xfaa3,0x7d60,0x8ab7,0x68b2,0x8a57,0x2754,0xa10c,0x6f20,0x71e4,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xf0914385,0xfaa3e8e9,0x8ab77d60,0x8a5768b2,0xa10c2754,0x71e46f20,0x4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xfaa3e8e9f0914385,0x8a5768b28ab77d60,0x71e46f20a10c2754,0x4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9}}} +#endif +}}}; diff --git a/src/precomp/ref/lvl3/sqisign_parameters.txt b/src/precomp/ref/lvl3/sqisign_parameters.txt index c22eb65..52241be 100644 --- a/src/precomp/ref/lvl3/sqisign_parameters.txt +++ b/src/precomp/ref/lvl3/sqisign_parameters.txt @@ -1,3 +1,3 @@ lvl = 3 -p = 0x3df6eeeab0871a2c6ae604a45d10ad665bc2e0a90aeb751c722f669356ea4684c6174c1ffffffffffffffffffffffff -B = 48000 +p = 0x40ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +num_orders = 8 diff --git a/src/precomp/ref/lvl3/torsion_constants.c b/src/precomp/ref/lvl3/torsion_constants.c index 5e87f49..1a6c203 100644 --- a/src/precomp/ref/lvl3/torsion_constants.c +++ b/src/precomp/ref/lvl3/torsion_constants.c @@ -1,68 +1,43 @@ #include #include #include +const ibz_t TWO_TO_SECURITY_BITS = #if 0 -#elif 8*DIGIT_LEN == 16 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x61; -const uint64_t TORSION_ODD_PRIMES[28] = {0x3, 0x7, 0xb, 0x2f, 0x9d, 0x1fd, 0x2f9, 0x5, 0xd, 0x59, 0x71, 0xad, 0xe9, 0xef, 0xf1, 0x1bb, 0x239, 0x4cd, 0x959, 0xd2b, 0x11a5, 0x141b, 0x163d, 0x16b5, 0x24b5, 0x6899, 0x9aff, 0xb951}; -const uint64_t TORSION_ODD_POWERS[28] = {0x44, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[7] = {0x3, 0x7, 0xb, 0x2f, 0x9d, 0x1fd, 0x2f9}; -const size_t TORSION_PLUS_ODD_POWERS[7] = {0x44, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4}; -const uint64_t TORSION_MINUS_ODD_PRIMES[21] = {0x5, 0xd, 0x59, 0x71, 0xad, 0xe9, 0xef, 0xf1, 0x1bb, 0x239, 0x4cd, 0x959, 0xd2b, 0x11a5, 0x141b, 0x163d, 0x16b5, 0x24b5, 0x6899, 0x9aff, 0xb951}; -const size_t TORSION_MINUS_ODD_POWERS[21] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[28] = {0x0, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x74c1,0x4c61,0xa468,0x356e,0xf669,0xc722,0xb751,0x90ae,0x2e0a,0x65bc,0xad6,0x45d1,0x604a,0xc6ae,0x71a2,0xab08,0x6eee,0x3df}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 31, ._mp_d = (mp_limb_t[]) {0x339b,0xb4fe,0x4d24,0x2ab1,0xc863,0x2629,0xf4dc,0x6ea5,0x753,0x1e0e,0x7109,0xf393,0x786a,0xbc1b,0x3c81,0x618e,0xfcc2,0xe01e,0xa5b6,0xa842,0x786f,0xa868,0x5020,0xa3e0,0xe4d9,0xefe3,0xf347,0x2dc3,0x8484,0x9cd0,0x681}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[28] = {{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xcd51,0x7119,0x8372,0x58de,0x8c65,0x794b,0xdb6}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x4821,0x3901,0x3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3931}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x7541,0x4a}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xd4d1,0x2436}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x2851,0xa0d7,0xf}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xf561,0x1645,0x4e}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x71}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xad}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xe9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xef}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xf1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1bb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x239}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4cd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x959}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd2b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11a5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x141b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x163d}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x16b5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x24b5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6899}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9aff}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb951}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 18, ._mp_d = (mp_limb_t[]) {0xba61,0x2630,0x5234,0x9ab7,0x7b34,0xe391,0x5ba8,0x4857,0x1705,0x32de,0x856b,0x22e8,0x3025,0x6357,0x38d1,0x5584,0xb777,0x1ef}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 14, ._mp_d = (mp_limb_t[]) {0x77b,0xeffc,0x1f3,0x9185,0x14e6,0x6206,0x1598,0x97dd,0x54d7,0xf6ce,0xab08,0x9035,0x5c29,0x3}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x2}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xcd51,0x7119,0x8372,0x58de,0x8c65,0x794b,0xdb6}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x9aa2,0xe233,0x6e4,0xb1bd,0x18ca,0xf297,0x1b6c}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x872b,0x2f73,0xdc9e,0x43e5,0x8784,0x5ec0,0x2835,0xe933,0xbdb4,0x5490,0x1a83,0x3cb,0xfec3,0x48dc,0xafb,0xf32d,0x47fe,0x6014,0xd35c,0xabe0,0xac24,0x65b7,0xd459,0x7976}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 11, ._mp_d = (mp_limb_t[]) {0x9811,0xcbf2,0xf040,0x9e7,0x76ed,0xf72a,0x4f9f,0xec90,0xf184,0x635f,0x2426}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 14, ._mp_d = (mp_limb_t[]) {0x77b,0xeffc,0x1f3,0x9185,0x14e6,0x6206,0x1598,0x97dd,0x54d7,0xf6ce,0xab08,0x9035,0x5c29,0x3}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x9aa2,0xe233,0x6e4,0xb1bd,0x18ca,0xf297,0x1b6c}}}; -#elif 8*DIGIT_LEN == 32 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x61; -const uint64_t TORSION_ODD_PRIMES[28] = {0x3, 0x7, 0xb, 0x2f, 0x9d, 0x1fd, 0x2f9, 0x5, 0xd, 0x59, 0x71, 0xad, 0xe9, 0xef, 0xf1, 0x1bb, 0x239, 0x4cd, 0x959, 0xd2b, 0x11a5, 0x141b, 0x163d, 0x16b5, 0x24b5, 0x6899, 0x9aff, 0xb951}; -const uint64_t TORSION_ODD_POWERS[28] = {0x44, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[7] = {0x3, 0x7, 0xb, 0x2f, 0x9d, 0x1fd, 0x2f9}; -const size_t TORSION_PLUS_ODD_POWERS[7] = {0x44, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4}; -const uint64_t TORSION_MINUS_ODD_PRIMES[21] = {0x5, 0xd, 0x59, 0x71, 0xad, 0xe9, 0xef, 0xf1, 0x1bb, 0x239, 0x4cd, 0x959, 0xd2b, 0x11a5, 0x141b, 0x163d, 0x16b5, 0x24b5, 0x6899, 0x9aff, 0xb951}; -const size_t TORSION_MINUS_ODD_POWERS[21] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[28] = {0x0, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0x4c6174c1,0x356ea468,0xc722f669,0x90aeb751,0x65bc2e0a,0x45d10ad6,0xc6ae604a,0xab0871a2,0x3df6eee}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb4fe339b,0x2ab14d24,0x2629c863,0x6ea5f4dc,0x1e0e0753,0xf3937109,0xbc1b786a,0x618e3c81,0xe01efcc2,0xa842a5b6,0xa868786f,0xa3e05020,0xefe3e4d9,0x2dc3f347,0x9cd08484,0x681}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[28] = {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7119cd51,0x58de8372,0x794b8c65,0xdb6}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x39014821,0x3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3931}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4a7541}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2436d4d1}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xa0d72851,0xf}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1645f561,0x4e}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x71}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xad}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xe9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xef}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xf1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1bb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x239}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4cd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x959}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd2b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11a5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x141b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x163d}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x16b5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x24b5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6899}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9aff}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb951}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x2630ba61,0x9ab75234,0xe3917b34,0x48575ba8,0x32de1705,0x22e8856b,0x63573025,0x558438d1,0x1efb777}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xeffc077b,0x918501f3,0x620614e6,0x97dd1598,0xf6ce54d7,0x9035ab08,0x35c29}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x2}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7119cd51,0x58de8372,0x794b8c65,0xdb6}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0xe2339aa2,0xb1bd06e4,0xf29718ca,0x1b6c}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x2f73872b,0x43e5dc9e,0x5ec08784,0xe9332835,0x5490bdb4,0x3cb1a83,0x48dcfec3,0xf32d0afb,0x601447fe,0xabe0d35c,0x65b7ac24,0x7976d459}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xcbf29811,0x9e7f040,0xf72a76ed,0xec904f9f,0x635ff184,0x2426}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0xeffc077b,0x918501f3,0x620614e6,0x97dd1598,0xf6ce54d7,0x9035ab08,0x35c29}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0xe2339aa2,0xb1bd06e4,0xf29718ca,0x1b6c}}}; -#elif 8*DIGIT_LEN == 64 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x61; -const uint64_t TORSION_ODD_PRIMES[28] = {0x3, 0x7, 0xb, 0x2f, 0x9d, 0x1fd, 0x2f9, 0x5, 0xd, 0x59, 0x71, 0xad, 0xe9, 0xef, 0xf1, 0x1bb, 0x239, 0x4cd, 0x959, 0xd2b, 0x11a5, 0x141b, 0x163d, 0x16b5, 0x24b5, 0x6899, 0x9aff, 0xb951}; -const uint64_t TORSION_ODD_POWERS[28] = {0x44, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[7] = {0x3, 0x7, 0xb, 0x2f, 0x9d, 0x1fd, 0x2f9}; -const size_t TORSION_PLUS_ODD_POWERS[7] = {0x44, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4}; -const uint64_t TORSION_MINUS_ODD_PRIMES[21] = {0x5, 0xd, 0x59, 0x71, 0xad, 0xe9, 0xef, 0xf1, 0x1bb, 0x239, 0x4cd, 0x959, 0xd2b, 0x11a5, 0x141b, 0x163d, 0x16b5, 0x24b5, 0x6899, 0x9aff, 0xb951}; -const size_t TORSION_MINUS_ODD_POWERS[21] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[28] = {0x0, 0xc, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0x4c6174c1ffffffff,0xc722f669356ea468,0x65bc2e0a90aeb751,0xc6ae604a45d10ad6,0x3df6eeeab0871a2}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2ab14d24b4fe339b,0x6ea5f4dc2629c863,0xf39371091e0e0753,0x618e3c81bc1b786a,0xa842a5b6e01efcc2,0xa3e05020a868786f,0x2dc3f347efe3e4d9,0x6819cd08484}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[28] = {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x58de83727119cd51,0xdb6794b8c65}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x339014821}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3931}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4a7541}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2436d4d1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xfa0d72851}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4e1645f561}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x71}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xad}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xe9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xef}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xf1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1bb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x239}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4cd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x959}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd2b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11a5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x141b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x163d}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x16b5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x24b5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6899}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9aff}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb951}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x9ab752342630ba61,0x48575ba8e3917b34,0x22e8856b32de1705,0x558438d163573025,0x1efb777}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x918501f3effc077b,0x97dd1598620614e6,0x9035ab08f6ce54d7,0x35c29}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x0,0x200000000}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x58de83727119cd51,0xdb6794b8c65}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0xe2339aa200000000,0xf29718cab1bd06e4,0x1b6c}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x43e5dc9e2f73872b,0xe93328355ec08784,0x3cb1a835490bdb4,0xf32d0afb48dcfec3,0xabe0d35c601447fe,0x7976d45965b7ac24}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x9e7f040cbf29811,0xec904f9ff72a76ed,0x2426635ff184}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x918501f3effc077b,0x97dd1598620614e6,0x9035ab08f6ce54d7,0x35c29}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0xe2339aa200000000,0xf29718cab1bd06e4,0x1b6c}}}; +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 7, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x1}}} #endif +; +const ibz_t TORSION_PLUS_2POWER = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 24, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x100000000000000}}} +#endif +; +const ibz_t SEC_DEGREE = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 49, ._mp_d = (mp_limb_t[]) {0xb7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xb7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xb7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#endif +; +const ibz_t COM_DEGREE = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 49, ._mp_d = (mp_limb_t[]) {0xb7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xb7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xb7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#endif +; diff --git a/src/precomp/ref/lvl5/CMakeLists.txt b/src/precomp/ref/lvl5/CMakeLists.txt index 389782d..c7637fa 100644 --- a/src/precomp/ref/lvl5/CMakeLists.txt +++ b/src/precomp/ref/lvl5/CMakeLists.txt @@ -1,49 +1 @@ -set(SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF - torsion_constants.c - quaternion_data.c - endomorphism_action.c - klpt_constants.c -) - -add_library(${LIB_PRECOMP_${SVARIANT_UPPER}} ${SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF}) -target_include_directories(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE common ${INC_INTBIG} ${INC_QUATERNION} ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src/ec/ref/include ${PROJECT_SOURCE_DIR}/src/ec/ref/${SVARIANT_LOWER}/include ${PROJECT_SOURCE_DIR}/src/gf/ref/${SVARIANT_LOWER}/include ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_COMMON}) -target_compile_options(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_custom_command( - OUTPUT - "${CMAKE_CURRENT_SOURCE_DIR}/torsion_constants.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/torsion_constants.h" - "${CMAKE_CURRENT_SOURCE_DIR}/include/klpt_constants.h" - "${CMAKE_CURRENT_SOURCE_DIR}/klpt_constants.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/encoded_sizes.h" - "${PROJECT_SOURCE_DIR}/src/nistapi/lvl5/api.h" - "${CMAKE_CURRENT_SOURCE_DIR}/quaternion_data.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/quaternion_data.h" - "${CMAKE_CURRENT_SOURCE_DIR}/endomorphism_action.c" - "${CMAKE_CURRENT_SOURCE_DIR}/include/endomorphism_action.h" - COMMAND - echo "Please run manually: make precomp" -) - -find_program(SAGEMATH sage) -add_custom_target(precomp_${SVARIANT_LOWER} - DEPENDS - "./sqisign_parameters.txt" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_torsion_constants.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_klpt_constants.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_sizes.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_quaternion_data.sage" - COMMAND - "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precompute_endomorphism_action.sage" - WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" -) - -set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM true) -set_target_properties(precomp_${SVARIANT_LOWER} PROPERTIES EXCLUDE_FROM_ALL TRUE) - -add_dependencies(precomp precomp_lvl5) +include(../lvlx.cmake) diff --git a/src/precomp/ref/lvl5/e0_basis.c b/src/precomp/ref/lvl5/e0_basis.c new file mode 100644 index 0000000..a7148e4 --- /dev/null +++ b/src/precomp/ref/lvl5/e0_basis.c @@ -0,0 +1,55 @@ +#include +const fp2_t BASIS_E0_PX = { +#if 0 +#elif RADIX == 16 +{0x1099, 0xa9f, 0x14f8, 0x1537, 0x1a13, 0x97e, 0x1095, 0xc8b, 0xdd2, 0x1c5f, 0xbdf, 0x1344, 0x1330, 0x1733, 0x185d, 0x1b08, 0x464, 0x76f, 0xe44, 0x3fc, 0x1dc0, 0x1c62, 0x88, 0x972, 0x13f4, 0x18c8, 0x6bd, 0x804, 0x1269, 0x19e0, 0x14bd, 0x10a1, 0xe5e, 0x1af2, 0x156c, 0x3f7, 0x16a1, 0x47d, 0x314} +#elif RADIX == 32 +{0x184cba61, 0xf4f854f, 0x1fb42753, 0x45c2552, 0x1c5f6e93, 0x2688bdf, 0xedcce66, 0x64d8461, 0x1c8876f2, 0x177007f8, 0x12044718, 0x1913f44b, 0x10d7b8, 0x1cf049a5, 0x1d0a1a5e, 0x1b35e4e5, 0x1508fdea, 0x66d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x27537a7c2a7e132e, 0x7dba4c8b84aa5fb4, 0xedcce6613445eff1, 0xc7221dbc8c9b08c2, 0x8972044718bb803f, 0x24d280435ee3227e, 0x6bc9cbd0a1a5ee78, 0x1011f6d423f7ab6} +#else +{0xa6f4f854fc265d, 0x4c8b84aa5fb427, 0x1309a22f7f8bedd, 0x12326c230bb7339, 0x1177007f8e443b7, 0x3227e897204471, 0x173c12694021af7, 0xd9af272f428697, 0x523eda847ef5} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x4b1, 0x178f, 0x107b, 0x6f6, 0x75e, 0x1b27, 0x4db, 0x1e1b, 0xd78, 0x15b6, 0x1130, 0x8cc, 0x1ac0, 0x9b7, 0x692, 0x1e07, 0x1f4, 0xfd7, 0x2ab, 0x7b5, 0x1040, 0xa43, 0xb6d, 0x13a1, 0x1422, 0x10c9, 0x10b0, 0x1540, 0x827, 0xa69, 0x1761, 0x1f25, 0x1d16, 0x16f2, 0x1fcb, 0x92, 0xcba, 0x1c03, 0x3c7} +#elif RADIX == 32 +{0x1258c7b1, 0xd07bbc7, 0x9cebc6f, 0x10d936f6, 0x15b66bc7, 0x1199130, 0x926df58, 0x1f4f039a, 0x556fd70, 0x1c100f6a, 0x15b6a90, 0x1934229d, 0x15021610, 0x1534a09e, 0xdf25bb0, 0x12ede5d1, 0x5d024bf, 0xa9b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbc6f683dde3c9631, 0xd9af1e1b26dec9ce, 0x926df5808cc89856, 0x5155bf5c3e9e0734, 0x53a15b6a90e0807b, 0x504f540858432684, 0xdbcba2df25bb0a9a, 0x18f00d974092fe5} +#else +{0xded07bbc792c63, 0x11e1b26dec9cebc, 0xc046644c2b6cd7, 0x10fa781cd249b7d, 0x1c100f6a2ab7eb, 0x3268453a15b6a9, 0x54d2827aa042c2, 0x1976f2e8b7c96ec, 0x16e01b2e8125f} +#endif +#endif +}; +const fp2_t BASIS_E0_QX = { +#if 0 +#elif RADIX == 16 +{0x15c, 0x865, 0x1af6, 0x17b9, 0x6a2, 0x1c22, 0x17c5, 0x1149, 0xa7, 0x151e, 0xe57, 0x4c2, 0x18cd, 0xbd2, 0x7a4, 0x7c6, 0x74a, 0xd2, 0x902, 0x68c, 0x21e, 0x1e44, 0x1f5a, 0x1d4c, 0x115b, 0x1777, 0x16d4, 0x503, 0x3af, 0x7e4, 0x1aa7, 0x3dd, 0x827, 0x186b, 0x765, 0x1fc5, 0xc78, 0x9bd, 0xfe} +#elif RADIX == 32 +{0x10ae12d6, 0x13af6432, 0x88d457b, 0xa4df178, 0x151e053c, 0x14984e57, 0x122f4b19, 0x14a3e31e, 0x12040d23, 0x878d18, 0xcfad791, 0xef15bea, 0x140eda97, 0x13f20ebc, 0xe3ddd53, 0x1970d682, 0x3c7f14e, 0x4eb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x457b9d7b21942b84, 0x7814f149be2f088d, 0x22f4b19a4c272bd4, 0xc4810348e947c63d, 0x7d4cfad791043c68, 0x75e503b6a5dde2b, 0xe1ad04e3ddd539f9, 0x1326f58f1fc53b2} +#else +{0xf73af643285709, 0xf149be2f088d45, 0xcd261395ea3c0a, 0x3a51f18f48bd2c, 0x20878d18902069, 0x1dde2b7d4cfad79, 0x1cfc83af281db52, 0xcb86b4138f7754, 0xb4deb1e3f8a7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x6ac, 0x25e, 0xc7a, 0x1492, 0xd01, 0xbc0, 0x118, 0x376, 0x3e0, 0x7ae, 0x573, 0x171f, 0x35a, 0x1725, 0x48f, 0xc94, 0x133c, 0x16a4, 0x10a8, 0x178d, 0xdd7, 0x798, 0x1d05, 0x39f, 0xc2a, 0x179c, 0x407, 0xd3, 0x118a, 0x1c9f, 0xeac, 0x145b, 0xc35, 0x11a2, 0x58b, 0xe4, 0x5e3, 0xae7, 0x330} +#elif RADIX == 32 +{0x3563c78, 0x4c7a12f, 0x101a0349, 0x1bb04617, 0x7ae1f00, 0xae3e573, 0x7dc946b, 0x13c64a12, 0x1516a49, 0x375ef1b, 0x1fe829e6, 0x138c2a1c, 0x34c80f7, 0xe4fc628, 0xb45b756, 0x2e344c3, 0xf18390b, 0x339} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x349263d0978d58f, 0xb87c037608c2f01a, 0x7dc946b571f2b99e, 0xd8545a92678c9424, 0x439fe829e61baf78, 0xe3140d3203de7185, 0xc68986b45b756727, 0x32b9cbc60e42c5} +#else +{0x924c7a12f1ab1e, 0x37608c2f01a03, 0x15ab8f95ccf5c3e, 0x99e325091f7251, 0xc375ef1b0a8b52, 0x1e7185439fe829e, 0x1393f18a069901e, 0x1171a261ad16dd5, 0x6573978c1c85} +#endif +#endif +}; diff --git a/src/precomp/ref/lvl5/ec_params.c b/src/precomp/ref/lvl5/ec_params.c new file mode 100644 index 0000000..d2aa074 --- /dev/null +++ b/src/precomp/ref/lvl5/ec_params.c @@ -0,0 +1,4 @@ +#include +// p+1 divided by the power of 2 +const digit_t p_cofactor_for_2f[1] = {27}; + diff --git a/src/precomp/ref/lvl5/endomorphism_action.c b/src/precomp/ref/lvl5/endomorphism_action.c index 00ec494..dd089e6 100644 --- a/src/precomp/ref/lvl5/endomorphism_action.c +++ b/src/precomp/ref/lvl5/endomorphism_action.c @@ -1,56 +1,3336 @@ #include #include #include +const curve_with_endomorphism_ring_t CURVES_WITH_ENDOMORPHISMS[7] = {{{{ #if 0 -#elif 8*DIGIT_LEN == 16 -const ec_basis_t BASIS_EVEN = {{{{0xf893b25235cd05, 0xcfad0c31816a3767, 0x24d6633b878c9852, 0x947ef3f6bd7e54a9, 0xcfcc6931acebc9ec, 0x7a593c6f226d62a7, 0xd773da3276d4514e, 0xf93f309a42dec}, {0x70e6b5b84d87aff3, 0x3b39ea4b8a9af50f, 0x33bb72fc45f05294, 0x1103f3d679fb626a, 0x29e23daba686e722, 0xd7683a594c898767, 0x41c4ad3db823bae1, 0x13f1daa2e21221}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xac16948532220971, 0x5652f704391431a5, 0xca5ee11424c4943d, 0xaa2208832540971a, 0x9e289f9c846e5c2b, 0xde48d5cd32bd5fe2, 0x913b3efa3bc42565, 0xd203dedb14213}, {0x5872c77992dd67c0, 0xb937a740922a8754, 0x21f7d1669ef949f, 0x2a7139b6c8587d0f, 0xf8bab24328aa27ab, 0xdab9bd3b2ddeec79, 0xe83b475f203bcb65, 0x556741a934ed3}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x90f4d4d80ba9ed72, 0xc8b9a440304ca99d, 0xc943b3a8997d4b88, 0xf08d352edc87530f, 0x767ca098b77d7071, 0x50dba761679c1732, 0x545a298536db6db9, 0x1381accb5f9aff}, {0x97233d48b02e6714, 0x684847c5bc2333e7, 0x18886606aeba8b01, 0xe4d42f848dafb6fc, 0xcc8ac9374d922260, 0x63189d0ed97c756, 0xa21cc3b155e35e31, 0x17400333e40769}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0xcde42ca0952857f6, 0x43986ee6663ef6cd, 0x55871379b845a923, 0x76ed1adf6ebef960, 0xabc4b150fc745f1e, 0x1c8a9c2defeb0f13, 0x13dd17be34fd733, 0x19e43fe41e4c43}, {0x2fa1833df935bc09, 0x69f359ab51c26ad9, 0xf9586cab92e541d6, 0x7362de7c9a12a54, 0xf971e28525d978bc, 0xf9e36a9529d0f3bd, 0xaea48e8b461db588, 0x1c33797cdc407}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x89c16fec8e55f16c, 0x1ff4d48fd451c2bb, 0x7b18fb54214c6532, 0x9ef491c4f579c67e, 0x38cd883c7d0cd40e, 0x499dc1361f2d123, 0x1335e051324fdbc7, 0xfd4fddbdc2a7f}, {0xcb3f9f71c926dc70, 0xebc2bb04385445c8, 0x6fd7a4eaca478a40, 0x151e3f61abfba2cb, 0x761770fecf1ee8c0, 0xd021aa20f5cd88a9, 0xbfcf8539dcdfb928, 0x18506735ab454e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x2df9cd51f27fb63e, 0x70ba06f5979446db, 0xa3fbb7300b16af8d, 0x992c1287f9a1c577, 0xb243e4491d37450e, 0x8473713e201019e0, 0xef9c23305e454581, 0x67b9998e13889}, {0x452150d05e768c9b, 0x4fe2b493696f8226, 0xac671e6158fedc93, 0x670fe96577281a7c, 0xa28c4be3e9ad4931, 0x6f20e70a714aae4b, 0x9890ecbc08f30c2e, 0x24a2c3ff722e18}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x2d2d051047dbd624, 0xfca1b15a916f7be5, 0x441312cd63f16c3f, 0xff7438fdce0ea446, 0x9fdef5936357fab, 0xf9ae02a9421f5416, 0xf7b77ef02bd1c1f8, 0x16f3f63378f96e}, {0x407ce7ffebc92b8e, 0x55fe79acf73aa929, 0x3337fb9216805495, 0xf6db0b7b43176f92, 0x853ee17ab74bf23d, 0xec5cbc949d4b0709, 0xce952df77dfd072f, 0xb16ebf531bef1}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x230916c16a0947e7, 0xa5a77aa3652d437b, 0x945736cf18a280b2, 0xe714d31d874572f1, 0x41bfcb5db198a4ac, 0x33c4ca4686e96f44, 0xe393b5d625debb73, 0x13895d37996b33}, {0xada606e483b73739, 0xe88daed540f3341d, 0xf398a06307ae9e8e, 0x61c2dfd85ef3c1a5, 0xbd29fb1cf683401c, 0x9aae565349a44142, 0x87a7c3de59a75f0d, 0x24c83660611a31}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x102024e8a598a5e8, 0x2bc941882c5f9245, 0xd6d60580934ea556, 0x86a4552d3207e718, 0x96eee147b2e294b5, 0x3ab66e6e93801f2e, 0xc8a390dff6441c41, 0x86407d5d6eb31}, {0xbd273dcfdc4cc333, 0x739eb9e099d67c56, 0x72a7fb0c255bdc52, 0x478eeb66fd200a09, 0x18965b28ca1ee442, 0xafff9738826e71d0, 0xa5a3e52397324a99, 0x22814353549863}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xf74e278739139769, 0x58be58577063e414, 0x7eb0edc56149472a, 0xcca10962fd516fae, 0x1ff09b1f54235f02, 0xfaba3bd39b494a4e, 0x59131f688c981aa3, 0x1d51b125134e7b}, {0x65f0988abfc680f0, 0xa7ec54e82f4f2ab4, 0x9cf1b55adef48a73, 0xcd7037d25eae0ef2, 0xf92fd0cacb35869a, 0x4afc0821a671bcfa, 0x2d0ff9a442d5b9a3, 0x2478f31e1b0ea8}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x357c1914bd227f58, 0x8c0d19f6290630f6, 0x49b100de6a80c2b8, 0xa1d365344bbb92d1, 0x20457092ad863380, 0x8274b2b3309427b, 0x57f899ef3140dadd, 0x25503c1a2afc85}, {0x85cd3fa621493a3d, 0x92741aa3b1184149, 0x57dc1c77e580e8ac, 0xd58459bf1d974197, 0x7a88578d886499ce, 0x22ca10e6b3805ca4, 0x2762f95867f32794, 0x1f3dac32b57131}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x2f94ba52e8516cfd, 0xc0cc95a65ef5d3f0, 0x78cd1286af1a549, 0xc58dfb5ca45bda4f, 0xfcb50d3ddcf80ec3, 0x90c191d252c72d27, 0x33d25fd46c7f1402, 0x1c30b1fd3aa2f7}, {0x2a5802b9b8b9188f, 0xeb15e1196bf95ce6, 0x8667c8dd3375a95d, 0x6c5e7827fd12c65d, 0x7b22fdd30e62d493, 0xc59204eeb4f57f61, 0x4c18ee49e098a97f, 0x230ac44ef70718}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x2d2d051047dbd624, 0xfca1b15a916f7be5, 0x441312cd63f16c3f, 0xff7438fdce0ea446, 0x9fdef5936357fab, 0xf9ae02a9421f5416, 0xf7b77ef02bd1c1f8, 0x16f3f63378f96e}, {0x407ce7ffebc92b8e, 0x55fe79acf73aa929, 0x3337fb9216805495, 0xf6db0b7b43176f92, 0x853ee17ab74bf23d, 0xec5cbc949d4b0709, 0xce952df77dfd072f, 0xb16ebf531bef1}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x230916c16a0947e7, 0xa5a77aa3652d437b, 0x945736cf18a280b2, 0xe714d31d874572f1, 0x41bfcb5db198a4ac, 0x33c4ca4686e96f44, 0xe393b5d625debb73, 0x13895d37996b33}, {0xada606e483b73739, 0xe88daed540f3341d, 0xf398a06307ae9e8e, 0x61c2dfd85ef3c1a5, 0xbd29fb1cf683401c, 0x9aae565349a44142, 0x87a7c3de59a75f0d, 0x24c83660611a31}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x102024e8a598a5e8, 0x2bc941882c5f9245, 0xd6d60580934ea556, 0x86a4552d3207e718, 0x96eee147b2e294b5, 0x3ab66e6e93801f2e, 0xc8a390dff6441c41, 0x86407d5d6eb31}, {0xbd273dcfdc4cc333, 0x739eb9e099d67c56, 0x72a7fb0c255bdc52, 0x478eeb66fd200a09, 0x18965b28ca1ee442, 0xafff9738826e71d0, 0xa5a3e52397324a99, 0x22814353549863}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0x6e2338651dd6b809, 0xa0b4a74a516bc856, 0xcef4dc03ae64bc, 0x7e04105e61ad1ccc, 0x824a280776a0a61a, 0xb0cbb7066de4598f, 0x91147e22289f3e7c, 0x1159e486ae42c7}, {0x4ad227aedc9e33c9, 0xe3050d4ccb8cd5e6, 0x859f12c8125c3c76, 0xc70299649231184f, 0xde2bae7b1651dfd, 0x38ae5d76b98a0bf5, 0x4afcb9cdd51c75ac, 0x1cd37f9c7ba50e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x9712f28d07df37f6, 0x3c0fdc3f6b148b77, 0x498753d83c208925, 0x3e9d6e57123afc04, 0xff41fe276d7b38de, 0x6fd059cabd88b549, 0x206a33c3360330d5, 0x5b66cd2ad497f}, {0x9b6c484b0169169b, 0x6854e01c5c87805c, 0x3217830c5fa9e618, 0x26b5dc3839eb347d, 0xc1b369290ec7c6b1, 0x7a2f3702ffd2460d, 0x2a17887c3a6da2f1, 0x16971eee1d9a05}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x6274b50ea5c661fa, 0xe3c3462c17e5a676, 0x73863c6c6e3e939d, 0x36adea15c2e668ab, 0x20ea8297e2acacbb, 0x720c5bd322a623a1, 0xa914186e4ebaa9a2, 0x4e9c355009afd}, {0x8dbb2dc3278a80f0, 0x9c6baecf247fbe32, 0x2fca5dddae71c5fd, 0x6e944e9e7de384cd, 0xeef1669c4da7aede, 0x6fb68320ff68c3a7, 0x9150f158b68d6cdb, 0x22c905c30fedc8}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x822e,0xa4c8,0x4610,0x5a8b,0x2415,0xfeac,0x27bd,0xb1f5,0x1e46,0xb5f,0x52cf,0xf527,0x53e,0x2406,0x8456,0x58a3,0x55b0,0x54e8,0x90e1,0x5e13,0x3229,0x4390,0x8aba,0x2806,0xb85f,0xfabd,0xf21c,0x5c49,0x2802,0x1c51,0x64aa,0x7530,0x8d3f,0x229a,0x2de7,0x3aab,0xfa6,0x4f85,0xca7b,0x5c65,0x1198,0xaa3,0x4a56,0xcad6,0xa026,0xe372,0xd9e3,0x99a0,0x1ab2,0x38}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x257b,0x88f,0xfa56,0x95aa,0xf879,0x9e34,0x5ab5,0xfea2,0x4f0b,0x7758,0x41d9,0x1edc,0x2b25,0x4ef,0x23a0,0xedeb,0xfe6f,0x9288,0x8fed,0xb5ee,0xb32c,0x240b,0x753d,0x9ce5,0x5aeb,0xdeca,0x191,0xa317,0xf4e6,0x2c6f,0x6fed,0xf7f0,0xfb81,0xa76f,0xcb2f,0x21c4,0x5d27,0x5125,0xb7ae,0x7953,0x3ff5,0x9b6c,0x21c2,0x6861,0x4476,0xcc4d,0xcfe,0x75eb,0x10dc,0x68}}}}, {{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x9ac1,0x5782,0xe01b,0x8f27,0x73fc,0x2e55,0x613d,0x3632,0xba61,0x3dc1,0xcfeb,0x7133,0x4a27,0xd9f8,0xd3ae,0xd0f,0x6ce5,0xa488,0x75cd,0xfecc,0x50d3,0x3560,0x5752,0x8933,0x5c00,0x3c5b,0x583d,0x303f,0x69c5,0x3a5c,0xd22,0x4af1,0x52a1,0x3fb9,0x797b,0xcc3b,0xc5ff,0x2557,0x8699,0x562d,0x2e84,0x4437,0xc1f7,0xe16d,0x17b6,0xeed8,0x6dda,0x75d9,0x7954,0x38}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x7dd2,0x5b37,0xb9ef,0xa574,0xdbea,0x153,0xd842,0x4e0a,0xe1b9,0xbd26,0x3743,0x35e3,0x1d37,0xb434,0x9134,0xcdd8,0x1fe9,0x2753,0xf73c,0x7d67,0x92d,0xbb80,0x7f34,0xd0e,0x96a0,0x9889,0x4088,0xd457,0x238f,0xa756,0xb8b0,0x294b,0x4357,0x8b14,0xf093,0xa16b,0xa910,0x8b65,0x8a58,0xf9c,0xcdcf,0xe3db,0x3f9e,0xc7e2,0xe1a,0x1fe6,0xfd20,0x5411,0x475,0xb8}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x53e2,0xb9aa,0x7cd,0xfbce,0x1786,0x909,0xcbe1,0x91b7,0x6c2f,0x3100,0x8ce2,0x6711,0xfad9,0xcb2,0x320d,0x1698,0x9936,0xbcd1,0xf50d,0x2ce4,0xd029,0xc55c,0xa859,0x4872,0x7c20,0xf3ac,0x11d9,0xe67c,0xf3e,0x8965,0x8b84,0x3900,0x4281,0x5674,0x8d53,0x6101,0x31a5,0xbf38,0xcf4d,0x4e17,0x5651,0x1d6d,0x5c60,0x48a,0xde9,0xf8e2,0x6a63,0x88ca,0xc38e,0x36}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xc805,0x885a,0xd41e,0xacd,0x15f1,0x3188,0x690b,0x64a4,0x8291,0xed45,0xa35d,0xed6f,0x1b45,0x37f3,0x1f5,0xfb40,0x48fe,0x3599,0x7340,0xd12e,0xa8a8,0x9fb7,0x22b4,0x9977,0xb379,0x8172,0x574c,0x6ff6,0x2c45,0x589e,0x1bd2,0x3868,0x24e6,0x8eaf,0x4af3,0xad81,0x3d8b,0x9011,0x1195,0xe06,0x8bd4,0xc1ee,0xcbad,0x3653,0x3365,0x35d7,0x4728,0x51e5,0xdce,0x5b}}}}, {{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xd419,0xdb92,0xdb57,0xe34b,0x69cd,0xbc6e,0x768a,0x8c63,0xf85c,0x1fca,0xd738,0x293,0xf4fb,0xe1bb,0x3f5d,0xa950,0x9c75,0x17e1,0x3f25,0x1832,0x1847,0x6a78,0x1768,0xd9e3,0xedf6,0x6f05,0x6bdc,0x5e0f,0x8dbd,0xdb9f,0xfc08,0x669b,0xbbbe,0x8b9e,0xfd0d,0x6942,0xdc1c,0x29a6,0x401e,0xcca4,0x8a3e,0x9ee2,0x9a7d,0x23a0,0x239f,0x448e,0xb7b5,0x716b,0x9da3,0x2b}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xac1e,0x4655,0xf832,0x431,0xe879,0xf6f6,0x341e,0x6e48,0x93d0,0x9785,0xfd30,0xc3f8,0x279c,0xcb87,0xe37d,0xfe3,0xdc64,0xbf69,0x930f,0xae96,0x6b2d,0x39b3,0x6195,0xeca2,0xd2de,0x9f9a,0x20cb,0x4a25,0x3c53,0x3a42,0x91d6,0x657b,0x8e15,0x573a,0x9127,0x7b15,0x8711,0x1bb2,0x8586,0x1dea,0x8916,0xd111,0x2d94,0x8e2e,0xa058,0xa76,0x6ca0,0x64e8,0x5b99,0xb9}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x5b9f,0x25ee,0x122c,0xed15,0xbaee,0x4d2c,0x2a4b,0xf9df,0xddb0,0xa7de,0xbfc9,0xc687,0xa41,0x793a,0x5337,0x94c7,0xf7e5,0xae44,0xf53d,0xd1be,0xc28d,0x16b8,0x25e0,0x18d9,0xef55,0x7fc1,0xf8dd,0xa414,0x867e,0x69b6,0xa158,0xd472,0x8197,0xac11,0x1d8e,0xbba1,0xa476,0x3a0f,0x698b,0x14a7,0xed3f,0xabd3,0xea8,0xa036,0xf3df,0x828a,0xc3f,0x32d0,0x2cb8,0xc9}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x8350,0x5396,0xc5bc,0xf2ef,0xddf2,0xb7eb,0x8199,0x9019,0x2bc2,0xaad8,0xc8cc,0x783d,0x2106,0xb3ac,0xee4d,0x933d,0xe79,0xd197,0x6276,0x72e,0x94e2,0xda67,0x2fdb,0x6857,0x58d0,0x5bb8,0x5564,0x8a78,0xfdab,0x5b1a,0xfd2d,0xeb82,0x524e,0x3b70,0x22e5,0x4f48,0x78bf,0x3823,0x3b77,0x3874,0xac01,0xba36,0xd345,0xcd62,0xe28d,0xcf00,0xa286,0x6fe7,0x4eab,0x31}}}}, {{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x62e4,0x1b04,0xae30,0x7650,0xf5e0,0x65cf,0x1fcc,0x8486,0xe766,0x1861,0xae85,0x1df5,0x87e,0xcd2f,0xaf4c,0x4e45,0xf712,0xf583,0x8287,0xb4a3,0x473,0xd091,0x2015,0xe441,0x437c,0xe472,0x9b77,0x3adf,0x5de5,0xd627,0xb1d5,0x5f80,0x910,0x5175,0x69d0,0x7af3,0x4a2,0x5348,0x140e,0x1f3a,0x57c0,0xc9e2,0x532,0xeda6,0x93a9,0x55ee,0x1001,0xd3ec,0xfd1a,0xd5}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xa461,0xda11,0xedd3,0x12ea,0x4511,0xb2d3,0xd5b4,0x620,0x224f,0x20a7,0xca49,0x6482,0x1834,0x5f00,0xc253,0x91b4,0x7db4,0xcdf6,0x92df,0x9bc,0x78c9,0xe857,0xe40e,0x1c3b,0x5faa,0x1385,0x39c8,0x8c8c,0xc513,0x59f0,0x7c02,0xca09,0x4efe,0x19d,0xec,0x2076,0x1440,0xa0db,0xeb48,0x575a,0xf228,0x42aa,0x7b4c,0xf282,0xba61,0x80cd,0xcac4,0xbae2,0xf26f,0x26}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x822e,0xa4c8,0x4610,0x5a8b,0x2415,0xfeac,0x27bd,0xb1f5,0x1e46,0xb5f,0x52cf,0xf527,0x53e,0x2406,0x8456,0x58a3,0x55b0,0x54e8,0x90e1,0x5e13,0x3229,0x4390,0x8aba,0x2806,0xb85f,0xfabd,0xf21c,0x5c49,0x2802,0x1c51,0x64aa,0x7530,0x8d3f,0x229a,0x2de7,0x3aab,0xfa6,0x4f85,0xca7b,0x5c65,0x1198,0xaa3,0x4a56,0xcad6,0xa026,0xe372,0xd9e3,0x99a0,0x1ab2,0x38}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x257b,0x88f,0xfa56,0x95aa,0xf879,0x9e34,0x5ab5,0xfea2,0x4f0b,0x7758,0x41d9,0x1edc,0x2b25,0x4ef,0x23a0,0xedeb,0xfe6f,0x9288,0x8fed,0xb5ee,0xb32c,0x240b,0x753d,0x9ce5,0x5aeb,0xdeca,0x191,0xa317,0xf4e6,0x2c6f,0x6fed,0xf7f0,0xfb81,0xa76f,0xcb2f,0x21c4,0x5d27,0x5125,0xb7ae,0x7953,0x3ff5,0x9b6c,0x21c2,0x6861,0x4476,0xcc4d,0xcfe,0x75eb,0x10dc,0x68}}}}, {{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x9ac1,0x5782,0xe01b,0x8f27,0x73fc,0x2e55,0x613d,0x3632,0xba61,0x3dc1,0xcfeb,0x7133,0x4a27,0xd9f8,0xd3ae,0xd0f,0x6ce5,0xa488,0x75cd,0xfecc,0x50d3,0x3560,0x5752,0x8933,0x5c00,0x3c5b,0x583d,0x303f,0x69c5,0x3a5c,0xd22,0x4af1,0x52a1,0x3fb9,0x797b,0xcc3b,0xc5ff,0x2557,0x8699,0x562d,0x2e84,0x4437,0xc1f7,0xe16d,0x17b6,0xeed8,0x6dda,0x75d9,0x7954,0x38}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x7dd2,0x5b37,0xb9ef,0xa574,0xdbea,0x153,0xd842,0x4e0a,0xe1b9,0xbd26,0x3743,0x35e3,0x1d37,0xb434,0x9134,0xcdd8,0x1fe9,0x2753,0xf73c,0x7d67,0x92d,0xbb80,0x7f34,0xd0e,0x96a0,0x9889,0x4088,0xd457,0x238f,0xa756,0xb8b0,0x294b,0x4357,0x8b14,0xf093,0xa16b,0xa910,0x8b65,0x8a58,0xf9c,0xcdcf,0xe3db,0x3f9e,0xc7e2,0xe1a,0x1fe6,0xfd20,0x5411,0x475,0xb8}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x6b08,0x2f39,0xa6ef,0x2b2c,0x9dce,0x83da,0x79cf,0x21d6,0xc53b,0x272,0xb4e2,0x43a1,0x9147,0x479,0xe5f7,0x4adb,0xb240,0x46fa,0x706,0xb33a,0x9ed4,0x83fe,0x1e81,0x52c7,0xc1bf,0x40d8,0x9b4e,0xb9b3,0xc169,0xb4ae,0x86c4,0xa656,0xd02b,0x935e,0xecda,0x3be1,0xfd01,0x74d3,0xf74e,0x8b3f,0xa3a8,0x8b47,0x9855,0xb10c,0xae28,0xefd6,0xda5,0x880f,0x7eb4,0xaf}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xf6c0,0x4874,0x673a,0x503c,0x8735,0x67de,0x61e0,0xb1a3,0xe8ce,0xb24e,0xf29b,0x8625,0x2335,0x9e71,0x92ca,0x7495,0x23b7,0xe411,0x8196,0xc38e,0xadea,0xe1e1,0x4bf8,0x9b2e,0x8732,0x301e,0xac6f,0x986,0x1096,0xc287,0x45df,0x182c,0x9034,0x9b0f,0xb11,0x67a3,0x4d59,0xf09b,0xe4a1,0xc3ac,0x65e4,0x2ead,0x76b8,0xcf5a,0x3bed,0x8112,0x2a13,0x63e8,0x8f55,0x61}}}}, {{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xb76d,0x998a,0xddb9,0x3939,0xeee5,0xf561,0xebe3,0xe14a,0x595e,0xaec6,0xd391,0x39e3,0x1f91,0x5dda,0x986,0x5b30,0x4ad,0x5e35,0x5a79,0x8b7f,0x348d,0x4fec,0x375d,0xb18b,0xa4fb,0xd5b0,0x620c,0x4727,0xfbc1,0x8afd,0x8495,0xd8c6,0x72f,0x65ac,0x3b44,0x1abf,0x510e,0xa77f,0xe35b,0x9168,0xdc61,0x718c,0x2e3a,0x287,0x1dab,0x19b3,0x92c8,0xf3a2,0xb7b,0x32}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x94f8,0xd0c6,0x5910,0xd4d3,0x6231,0x7c25,0x8630,0xde29,0x3ac4,0xc613,0xd530,0xe768,0x912e,0xd3c0,0x2f93,0xdba0,0xc359,0x3540,0x8117,0x2841,0x9c82,0x7b11,0xeb6d,0xe24d,0x8d3f,0x526e,0x9757,0x76ed,0x8a28,0xef8,0x9696,0xf825,0x6a,0x1a50,0x31a0,0xa035,0xbbb5,0x6616,0x5d85,0xe0c2,0x3bbe,0x6337,0xf19f,0xe1ab,0x18,0x1382,0xc95e,0x65a3,0xa073,0x40}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x2dd0,0x12f7,0x8916,0x768a,0x5d77,0xa696,0x9525,0x7cef,0x6ed8,0xd3ef,0xdfe4,0xe343,0x520,0xbc9d,0xa99b,0xca63,0x7bf2,0xd722,0x7a9e,0xe8df,0x6146,0xb5c,0x92f0,0x8c6c,0xf7aa,0xbfe0,0x7c6e,0x520a,0x433f,0x34db,0x50ac,0xea39,0xc0cb,0x5608,0x8ec7,0x5dd0,0xd23b,0x9d07,0xb4c5,0x8a53,0xf69f,0x55e9,0x754,0xd01b,0x79ef,0xc145,0x61f,0x1968,0x965c,0x64}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x41a8,0x29cb,0xe2de,0x7977,0xeef9,0xdbf5,0xc0cc,0x480c,0x15e1,0x556c,0xe466,0x3c1e,0x1083,0xd9d6,0xf726,0xc99e,0x873c,0x68cb,0x313b,0x397,0xca71,0xed33,0x97ed,0x342b,0x2c68,0x2ddc,0x2ab2,0xc53c,0x7ed5,0xad8d,0x7e96,0x75c1,0x2927,0x9db8,0x1172,0xa7a4,0xbc5f,0x9c11,0x1dbb,0x9c3a,0x5600,0xdd1b,0x69a2,0xe6b1,0x7146,0x6780,0xd143,0xb7f3,0xa755,0x18}}}}, {{{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0x3172,0xd82,0x5718,0x3b28,0xfaf0,0x32e7,0xfe6,0x4243,0xf3b3,0x8c30,0xd742,0xefa,0x843f,0x6697,0xd7a6,0x2722,0xfb89,0xfac1,0xc143,0xda51,0x8239,0xe848,0x900a,0x7220,0x21be,0xf239,0xcdbb,0x9d6f,0xaef2,0xeb13,0x58ea,0x2fc0,0x8488,0x28ba,0xb4e8,0x3d79,0x251,0x29a4,0xa07,0xf9d,0x2be0,0x64f1,0x299,0xf6d3,0x49d4,0xaaf7,0x800,0x69f6,0xfe8d,0x6a}}}, {{._mp_alloc = 0, ._mp_size = 50, ._mp_d = (mp_limb_t[]) {0xd231,0xed08,0x76e9,0x8975,0xa288,0x5969,0x6ada,0x8310,0x9127,0xf496,0xaa2d,0x47c6,0x1d55,0x1b9d,0x6bef,0x5c18,0xf9a7,0xa518,0xd7e,0xf29c,0xda0f,0xf3b3,0x76fe,0xa8a8,0x5754,0xd366,0xb636,0xde96,0x852,0x8ecc,0xccae,0xb442,0xfca,0x57a6,0x8fb3,0x7e46,0xe67b,0x3de2,0xa00e,0xe1ae,0xe8c7,0x9894,0x82a0,0xc29d,0x3451,0x4213,0xd0e4,0xd44a,0x88cb,0x8b}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2f}}}, {{._mp_alloc = 0, ._mp_size = 33, ._mp_d = (mp_limb_t[]) {0xd1c1,0x4acf,0xea1c,0x9efb,0xde65,0x1c30,0xe5e,0x92ff,0x9031,0xadb3,0xac6b,0xa6e1,0x40c9,0xcfdf,0xd9f6,0x3fcb,0x6ca9,0xfde9,0x3e37,0xa52e,0xe3c5,0x1855,0xa01,0x11fd,0x3cdf,0x1ecc,0x318a,0x9c0c,0x31c6,0xda41,0x2065,0xd27f,0x148f}}}, {{._mp_alloc = 0, ._mp_size = 34, ._mp_d = (mp_limb_t[]) {0x2651,0x5ce6,0x8d81,0xc6c,0x8011,0xe8,0x76e8,0xf200,0x83a6,0x53dd,0x21c8,0x4a4c,0xcdfe,0xd5e6,0x8812,0x2d1,0x13b0,0x7da5,0x638f,0xe681,0x397f,0xcba6,0x2308,0x8001,0x90ee,0x9192,0xeb6c,0x66fc,0x4f59,0xd7c8,0x865f,0x32e2,0x641f,0x2}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 34, ._mp_d = (mp_limb_t[]) {0x6411,0x75eb,0x930b,0x5585,0xa500,0x63ee,0x180f,0xf861,0x366a,0x1e88,0xebd2,0x2f7,0x80da,0xeec4,0x5e4b,0xb27b,0x9c18,0x974a,0xa082,0x8f32,0x3c1,0x62b1,0x80f3,0x2258,0xcfd,0xa073,0x5874,0x4603,0x22c8,0xa576,0x292b,0xb895,0xac23,0xb}}}, {{._mp_alloc = 0, ._mp_size = 33, ._mp_d = (mp_limb_t[]) {0xcbaf,0xa2ff,0xe66d,0xf297,0x48aa,0xd8da,0x9c8e,0x46de,0x64f4,0x77e2,0x9ac5,0x7c21,0x5419,0xb16b,0x4768,0x60c9,0xd3ad,0x864,0x2dc1,0x2,0xb239,0xe38,0x26d3,0x176c,0x2111,0x1b64,0xfdbc,0x4b36,0x249f,0x1151,0x8a54,0x332d,0x143a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 34, ._mp_d = (mp_limb_t[]) {0xb8d4,0xc97b,0x68a5,0xf1fc,0xcaea,0x1cfa,0xcc66,0x1af8,0x9a15,0x9012,0x7ea,0x390a,0x75fd,0x9a00,0x8094,0xb3db,0x4547,0x9ce8,0x99a1,0x91fc,0x46a6,0xb0b0,0x56e9,0x6c5c,0x128c,0x5d38,0x7b27,0x2240,0xea36,0xd094,0x20,0xb736,0xe1ff,0x15}}}}}; -#elif 8*DIGIT_LEN == 32 -const ec_basis_t BASIS_EVEN = {{{{0xf893b25235cd05, 0xcfad0c31816a3767, 0x24d6633b878c9852, 0x947ef3f6bd7e54a9, 0xcfcc6931acebc9ec, 0x7a593c6f226d62a7, 0xd773da3276d4514e, 0xf93f309a42dec}, {0x70e6b5b84d87aff3, 0x3b39ea4b8a9af50f, 0x33bb72fc45f05294, 0x1103f3d679fb626a, 0x29e23daba686e722, 0xd7683a594c898767, 0x41c4ad3db823bae1, 0x13f1daa2e21221}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xac16948532220971, 0x5652f704391431a5, 0xca5ee11424c4943d, 0xaa2208832540971a, 0x9e289f9c846e5c2b, 0xde48d5cd32bd5fe2, 0x913b3efa3bc42565, 0xd203dedb14213}, {0x5872c77992dd67c0, 0xb937a740922a8754, 0x21f7d1669ef949f, 0x2a7139b6c8587d0f, 0xf8bab24328aa27ab, 0xdab9bd3b2ddeec79, 0xe83b475f203bcb65, 0x556741a934ed3}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x90f4d4d80ba9ed72, 0xc8b9a440304ca99d, 0xc943b3a8997d4b88, 0xf08d352edc87530f, 0x767ca098b77d7071, 0x50dba761679c1732, 0x545a298536db6db9, 0x1381accb5f9aff}, {0x97233d48b02e6714, 0x684847c5bc2333e7, 0x18886606aeba8b01, 0xe4d42f848dafb6fc, 0xcc8ac9374d922260, 0x63189d0ed97c756, 0xa21cc3b155e35e31, 0x17400333e40769}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0xcde42ca0952857f6, 0x43986ee6663ef6cd, 0x55871379b845a923, 0x76ed1adf6ebef960, 0xabc4b150fc745f1e, 0x1c8a9c2defeb0f13, 0x13dd17be34fd733, 0x19e43fe41e4c43}, {0x2fa1833df935bc09, 0x69f359ab51c26ad9, 0xf9586cab92e541d6, 0x7362de7c9a12a54, 0xf971e28525d978bc, 0xf9e36a9529d0f3bd, 0xaea48e8b461db588, 0x1c33797cdc407}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x89c16fec8e55f16c, 0x1ff4d48fd451c2bb, 0x7b18fb54214c6532, 0x9ef491c4f579c67e, 0x38cd883c7d0cd40e, 0x499dc1361f2d123, 0x1335e051324fdbc7, 0xfd4fddbdc2a7f}, {0xcb3f9f71c926dc70, 0xebc2bb04385445c8, 0x6fd7a4eaca478a40, 0x151e3f61abfba2cb, 0x761770fecf1ee8c0, 0xd021aa20f5cd88a9, 0xbfcf8539dcdfb928, 0x18506735ab454e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x2df9cd51f27fb63e, 0x70ba06f5979446db, 0xa3fbb7300b16af8d, 0x992c1287f9a1c577, 0xb243e4491d37450e, 0x8473713e201019e0, 0xef9c23305e454581, 0x67b9998e13889}, {0x452150d05e768c9b, 0x4fe2b493696f8226, 0xac671e6158fedc93, 0x670fe96577281a7c, 0xa28c4be3e9ad4931, 0x6f20e70a714aae4b, 0x9890ecbc08f30c2e, 0x24a2c3ff722e18}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x2d2d051047dbd624, 0xfca1b15a916f7be5, 0x441312cd63f16c3f, 0xff7438fdce0ea446, 0x9fdef5936357fab, 0xf9ae02a9421f5416, 0xf7b77ef02bd1c1f8, 0x16f3f63378f96e}, {0x407ce7ffebc92b8e, 0x55fe79acf73aa929, 0x3337fb9216805495, 0xf6db0b7b43176f92, 0x853ee17ab74bf23d, 0xec5cbc949d4b0709, 0xce952df77dfd072f, 0xb16ebf531bef1}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x230916c16a0947e7, 0xa5a77aa3652d437b, 0x945736cf18a280b2, 0xe714d31d874572f1, 0x41bfcb5db198a4ac, 0x33c4ca4686e96f44, 0xe393b5d625debb73, 0x13895d37996b33}, {0xada606e483b73739, 0xe88daed540f3341d, 0xf398a06307ae9e8e, 0x61c2dfd85ef3c1a5, 0xbd29fb1cf683401c, 0x9aae565349a44142, 0x87a7c3de59a75f0d, 0x24c83660611a31}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x102024e8a598a5e8, 0x2bc941882c5f9245, 0xd6d60580934ea556, 0x86a4552d3207e718, 0x96eee147b2e294b5, 0x3ab66e6e93801f2e, 0xc8a390dff6441c41, 0x86407d5d6eb31}, {0xbd273dcfdc4cc333, 0x739eb9e099d67c56, 0x72a7fb0c255bdc52, 0x478eeb66fd200a09, 0x18965b28ca1ee442, 0xafff9738826e71d0, 0xa5a3e52397324a99, 0x22814353549863}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xf74e278739139769, 0x58be58577063e414, 0x7eb0edc56149472a, 0xcca10962fd516fae, 0x1ff09b1f54235f02, 0xfaba3bd39b494a4e, 0x59131f688c981aa3, 0x1d51b125134e7b}, {0x65f0988abfc680f0, 0xa7ec54e82f4f2ab4, 0x9cf1b55adef48a73, 0xcd7037d25eae0ef2, 0xf92fd0cacb35869a, 0x4afc0821a671bcfa, 0x2d0ff9a442d5b9a3, 0x2478f31e1b0ea8}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x357c1914bd227f58, 0x8c0d19f6290630f6, 0x49b100de6a80c2b8, 0xa1d365344bbb92d1, 0x20457092ad863380, 0x8274b2b3309427b, 0x57f899ef3140dadd, 0x25503c1a2afc85}, {0x85cd3fa621493a3d, 0x92741aa3b1184149, 0x57dc1c77e580e8ac, 0xd58459bf1d974197, 0x7a88578d886499ce, 0x22ca10e6b3805ca4, 0x2762f95867f32794, 0x1f3dac32b57131}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x2f94ba52e8516cfd, 0xc0cc95a65ef5d3f0, 0x78cd1286af1a549, 0xc58dfb5ca45bda4f, 0xfcb50d3ddcf80ec3, 0x90c191d252c72d27, 0x33d25fd46c7f1402, 0x1c30b1fd3aa2f7}, {0x2a5802b9b8b9188f, 0xeb15e1196bf95ce6, 0x8667c8dd3375a95d, 0x6c5e7827fd12c65d, 0x7b22fdd30e62d493, 0xc59204eeb4f57f61, 0x4c18ee49e098a97f, 0x230ac44ef70718}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x2d2d051047dbd624, 0xfca1b15a916f7be5, 0x441312cd63f16c3f, 0xff7438fdce0ea446, 0x9fdef5936357fab, 0xf9ae02a9421f5416, 0xf7b77ef02bd1c1f8, 0x16f3f63378f96e}, {0x407ce7ffebc92b8e, 0x55fe79acf73aa929, 0x3337fb9216805495, 0xf6db0b7b43176f92, 0x853ee17ab74bf23d, 0xec5cbc949d4b0709, 0xce952df77dfd072f, 0xb16ebf531bef1}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x230916c16a0947e7, 0xa5a77aa3652d437b, 0x945736cf18a280b2, 0xe714d31d874572f1, 0x41bfcb5db198a4ac, 0x33c4ca4686e96f44, 0xe393b5d625debb73, 0x13895d37996b33}, {0xada606e483b73739, 0xe88daed540f3341d, 0xf398a06307ae9e8e, 0x61c2dfd85ef3c1a5, 0xbd29fb1cf683401c, 0x9aae565349a44142, 0x87a7c3de59a75f0d, 0x24c83660611a31}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x102024e8a598a5e8, 0x2bc941882c5f9245, 0xd6d60580934ea556, 0x86a4552d3207e718, 0x96eee147b2e294b5, 0x3ab66e6e93801f2e, 0xc8a390dff6441c41, 0x86407d5d6eb31}, {0xbd273dcfdc4cc333, 0x739eb9e099d67c56, 0x72a7fb0c255bdc52, 0x478eeb66fd200a09, 0x18965b28ca1ee442, 0xafff9738826e71d0, 0xa5a3e52397324a99, 0x22814353549863}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0x6e2338651dd6b809, 0xa0b4a74a516bc856, 0xcef4dc03ae64bc, 0x7e04105e61ad1ccc, 0x824a280776a0a61a, 0xb0cbb7066de4598f, 0x91147e22289f3e7c, 0x1159e486ae42c7}, {0x4ad227aedc9e33c9, 0xe3050d4ccb8cd5e6, 0x859f12c8125c3c76, 0xc70299649231184f, 0xde2bae7b1651dfd, 0x38ae5d76b98a0bf5, 0x4afcb9cdd51c75ac, 0x1cd37f9c7ba50e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x9712f28d07df37f6, 0x3c0fdc3f6b148b77, 0x498753d83c208925, 0x3e9d6e57123afc04, 0xff41fe276d7b38de, 0x6fd059cabd88b549, 0x206a33c3360330d5, 0x5b66cd2ad497f}, {0x9b6c484b0169169b, 0x6854e01c5c87805c, 0x3217830c5fa9e618, 0x26b5dc3839eb347d, 0xc1b369290ec7c6b1, 0x7a2f3702ffd2460d, 0x2a17887c3a6da2f1, 0x16971eee1d9a05}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x6274b50ea5c661fa, 0xe3c3462c17e5a676, 0x73863c6c6e3e939d, 0x36adea15c2e668ab, 0x20ea8297e2acacbb, 0x720c5bd322a623a1, 0xa914186e4ebaa9a2, 0x4e9c355009afd}, {0x8dbb2dc3278a80f0, 0x9c6baecf247fbe32, 0x2fca5dddae71c5fd, 0x6e944e9e7de384cd, 0xeef1669c4da7aede, 0x6fb68320ff68c3a7, 0x9150f158b68d6cdb, 0x22c905c30fedc8}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xa4c8822e,0x5a8b4610,0xfeac2415,0xb1f527bd,0xb5f1e46,0xf52752cf,0x2406053e,0x58a38456,0x54e855b0,0x5e1390e1,0x43903229,0x28068aba,0xfabdb85f,0x5c49f21c,0x1c512802,0x753064aa,0x229a8d3f,0x3aab2de7,0x4f850fa6,0x5c65ca7b,0xaa31198,0xcad64a56,0xe372a026,0x99a0d9e3,0x381ab2}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x88f257b,0x95aafa56,0x9e34f879,0xfea25ab5,0x77584f0b,0x1edc41d9,0x4ef2b25,0xedeb23a0,0x9288fe6f,0xb5ee8fed,0x240bb32c,0x9ce5753d,0xdeca5aeb,0xa3170191,0x2c6ff4e6,0xf7f06fed,0xa76ffb81,0x21c4cb2f,0x51255d27,0x7953b7ae,0x9b6c3ff5,0x686121c2,0xcc4d4476,0x75eb0cfe,0x6810dc}}}}, {{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x57829ac1,0x8f27e01b,0x2e5573fc,0x3632613d,0x3dc1ba61,0x7133cfeb,0xd9f84a27,0xd0fd3ae,0xa4886ce5,0xfecc75cd,0x356050d3,0x89335752,0x3c5b5c00,0x303f583d,0x3a5c69c5,0x4af10d22,0x3fb952a1,0xcc3b797b,0x2557c5ff,0x562d8699,0x44372e84,0xe16dc1f7,0xeed817b6,0x75d96dda,0x387954}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x5b377dd2,0xa574b9ef,0x153dbea,0x4e0ad842,0xbd26e1b9,0x35e33743,0xb4341d37,0xcdd89134,0x27531fe9,0x7d67f73c,0xbb80092d,0xd0e7f34,0x988996a0,0xd4574088,0xa756238f,0x294bb8b0,0x8b144357,0xa16bf093,0x8b65a910,0xf9c8a58,0xe3dbcdcf,0xc7e23f9e,0x1fe60e1a,0x5411fd20,0xb80475}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xb9aa53e2,0xfbce07cd,0x9091786,0x91b7cbe1,0x31006c2f,0x67118ce2,0xcb2fad9,0x1698320d,0xbcd19936,0x2ce4f50d,0xc55cd029,0x4872a859,0xf3ac7c20,0xe67c11d9,0x89650f3e,0x39008b84,0x56744281,0x61018d53,0xbf3831a5,0x4e17cf4d,0x1d6d5651,0x48a5c60,0xf8e20de9,0x88ca6a63,0x36c38e}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x885ac805,0xacdd41e,0x318815f1,0x64a4690b,0xed458291,0xed6fa35d,0x37f31b45,0xfb4001f5,0x359948fe,0xd12e7340,0x9fb7a8a8,0x997722b4,0x8172b379,0x6ff6574c,0x589e2c45,0x38681bd2,0x8eaf24e6,0xad814af3,0x90113d8b,0xe061195,0xc1ee8bd4,0x3653cbad,0x35d73365,0x51e54728,0x5b0dce}}}}, {{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xdb92d419,0xe34bdb57,0xbc6e69cd,0x8c63768a,0x1fcaf85c,0x293d738,0xe1bbf4fb,0xa9503f5d,0x17e19c75,0x18323f25,0x6a781847,0xd9e31768,0x6f05edf6,0x5e0f6bdc,0xdb9f8dbd,0x669bfc08,0x8b9ebbbe,0x6942fd0d,0x29a6dc1c,0xcca4401e,0x9ee28a3e,0x23a09a7d,0x448e239f,0x716bb7b5,0x2b9da3}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x4655ac1e,0x431f832,0xf6f6e879,0x6e48341e,0x978593d0,0xc3f8fd30,0xcb87279c,0xfe3e37d,0xbf69dc64,0xae96930f,0x39b36b2d,0xeca26195,0x9f9ad2de,0x4a2520cb,0x3a423c53,0x657b91d6,0x573a8e15,0x7b159127,0x1bb28711,0x1dea8586,0xd1118916,0x8e2e2d94,0xa76a058,0x64e86ca0,0xb95b99}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x25ee5b9f,0xed15122c,0x4d2cbaee,0xf9df2a4b,0xa7deddb0,0xc687bfc9,0x793a0a41,0x94c75337,0xae44f7e5,0xd1bef53d,0x16b8c28d,0x18d925e0,0x7fc1ef55,0xa414f8dd,0x69b6867e,0xd472a158,0xac118197,0xbba11d8e,0x3a0fa476,0x14a7698b,0xabd3ed3f,0xa0360ea8,0x828af3df,0x32d00c3f,0xc92cb8}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x53968350,0xf2efc5bc,0xb7ebddf2,0x90198199,0xaad82bc2,0x783dc8cc,0xb3ac2106,0x933dee4d,0xd1970e79,0x72e6276,0xda6794e2,0x68572fdb,0x5bb858d0,0x8a785564,0x5b1afdab,0xeb82fd2d,0x3b70524e,0x4f4822e5,0x382378bf,0x38743b77,0xba36ac01,0xcd62d345,0xcf00e28d,0x6fe7a286,0x314eab}}}}, {{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x1b0462e4,0x7650ae30,0x65cff5e0,0x84861fcc,0x1861e766,0x1df5ae85,0xcd2f087e,0x4e45af4c,0xf583f712,0xb4a38287,0xd0910473,0xe4412015,0xe472437c,0x3adf9b77,0xd6275de5,0x5f80b1d5,0x51750910,0x7af369d0,0x534804a2,0x1f3a140e,0xc9e257c0,0xeda60532,0x55ee93a9,0xd3ec1001,0xd5fd1a}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xda11a461,0x12eaedd3,0xb2d34511,0x620d5b4,0x20a7224f,0x6482ca49,0x5f001834,0x91b4c253,0xcdf67db4,0x9bc92df,0xe85778c9,0x1c3be40e,0x13855faa,0x8c8c39c8,0x59f0c513,0xca097c02,0x19d4efe,0x207600ec,0xa0db1440,0x575aeb48,0x42aaf228,0xf2827b4c,0x80cdba61,0xbae2cac4,0x26f26f}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xa4c8822e,0x5a8b4610,0xfeac2415,0xb1f527bd,0xb5f1e46,0xf52752cf,0x2406053e,0x58a38456,0x54e855b0,0x5e1390e1,0x43903229,0x28068aba,0xfabdb85f,0x5c49f21c,0x1c512802,0x753064aa,0x229a8d3f,0x3aab2de7,0x4f850fa6,0x5c65ca7b,0xaa31198,0xcad64a56,0xe372a026,0x99a0d9e3,0x381ab2}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x88f257b,0x95aafa56,0x9e34f879,0xfea25ab5,0x77584f0b,0x1edc41d9,0x4ef2b25,0xedeb23a0,0x9288fe6f,0xb5ee8fed,0x240bb32c,0x9ce5753d,0xdeca5aeb,0xa3170191,0x2c6ff4e6,0xf7f06fed,0xa76ffb81,0x21c4cb2f,0x51255d27,0x7953b7ae,0x9b6c3ff5,0x686121c2,0xcc4d4476,0x75eb0cfe,0x6810dc}}}}, {{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x57829ac1,0x8f27e01b,0x2e5573fc,0x3632613d,0x3dc1ba61,0x7133cfeb,0xd9f84a27,0xd0fd3ae,0xa4886ce5,0xfecc75cd,0x356050d3,0x89335752,0x3c5b5c00,0x303f583d,0x3a5c69c5,0x4af10d22,0x3fb952a1,0xcc3b797b,0x2557c5ff,0x562d8699,0x44372e84,0xe16dc1f7,0xeed817b6,0x75d96dda,0x387954}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x5b377dd2,0xa574b9ef,0x153dbea,0x4e0ad842,0xbd26e1b9,0x35e33743,0xb4341d37,0xcdd89134,0x27531fe9,0x7d67f73c,0xbb80092d,0xd0e7f34,0x988996a0,0xd4574088,0xa756238f,0x294bb8b0,0x8b144357,0xa16bf093,0x8b65a910,0xf9c8a58,0xe3dbcdcf,0xc7e23f9e,0x1fe60e1a,0x5411fd20,0xb80475}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x2f396b08,0x2b2ca6ef,0x83da9dce,0x21d679cf,0x272c53b,0x43a1b4e2,0x4799147,0x4adbe5f7,0x46fab240,0xb33a0706,0x83fe9ed4,0x52c71e81,0x40d8c1bf,0xb9b39b4e,0xb4aec169,0xa65686c4,0x935ed02b,0x3be1ecda,0x74d3fd01,0x8b3ff74e,0x8b47a3a8,0xb10c9855,0xefd6ae28,0x880f0da5,0xaf7eb4}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x4874f6c0,0x503c673a,0x67de8735,0xb1a361e0,0xb24ee8ce,0x8625f29b,0x9e712335,0x749592ca,0xe41123b7,0xc38e8196,0xe1e1adea,0x9b2e4bf8,0x301e8732,0x986ac6f,0xc2871096,0x182c45df,0x9b0f9034,0x67a30b11,0xf09b4d59,0xc3ace4a1,0x2ead65e4,0xcf5a76b8,0x81123bed,0x63e82a13,0x618f55}}}}, {{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x998ab76d,0x3939ddb9,0xf561eee5,0xe14aebe3,0xaec6595e,0x39e3d391,0x5dda1f91,0x5b300986,0x5e3504ad,0x8b7f5a79,0x4fec348d,0xb18b375d,0xd5b0a4fb,0x4727620c,0x8afdfbc1,0xd8c68495,0x65ac072f,0x1abf3b44,0xa77f510e,0x9168e35b,0x718cdc61,0x2872e3a,0x19b31dab,0xf3a292c8,0x320b7b}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xd0c694f8,0xd4d35910,0x7c256231,0xde298630,0xc6133ac4,0xe768d530,0xd3c0912e,0xdba02f93,0x3540c359,0x28418117,0x7b119c82,0xe24deb6d,0x526e8d3f,0x76ed9757,0xef88a28,0xf8259696,0x1a50006a,0xa03531a0,0x6616bbb5,0xe0c25d85,0x63373bbe,0xe1abf19f,0x13820018,0x65a3c95e,0x40a073}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x12f72dd0,0x768a8916,0xa6965d77,0x7cef9525,0xd3ef6ed8,0xe343dfe4,0xbc9d0520,0xca63a99b,0xd7227bf2,0xe8df7a9e,0xb5c6146,0x8c6c92f0,0xbfe0f7aa,0x520a7c6e,0x34db433f,0xea3950ac,0x5608c0cb,0x5dd08ec7,0x9d07d23b,0x8a53b4c5,0x55e9f69f,0xd01b0754,0xc14579ef,0x1968061f,0x64965c}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0x29cb41a8,0x7977e2de,0xdbf5eef9,0x480cc0cc,0x556c15e1,0x3c1ee466,0xd9d61083,0xc99ef726,0x68cb873c,0x397313b,0xed33ca71,0x342b97ed,0x2ddc2c68,0xc53c2ab2,0xad8d7ed5,0x75c17e96,0x9db82927,0xa7a41172,0x9c11bc5f,0x9c3a1dbb,0xdd1b5600,0xe6b169a2,0x67807146,0xb7f3d143,0x18a755}}}}, {{{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xd823172,0x3b285718,0x32e7faf0,0x42430fe6,0x8c30f3b3,0xefad742,0x6697843f,0x2722d7a6,0xfac1fb89,0xda51c143,0xe8488239,0x7220900a,0xf23921be,0x9d6fcdbb,0xeb13aef2,0x2fc058ea,0x28ba8488,0x3d79b4e8,0x29a40251,0xf9d0a07,0x64f12be0,0xf6d30299,0xaaf749d4,0x69f60800,0x6afe8d}}}, {{._mp_alloc = 0, ._mp_size = 25, ._mp_d = (mp_limb_t[]) {0xed08d231,0x897576e9,0x5969a288,0x83106ada,0xf4969127,0x47c6aa2d,0x1b9d1d55,0x5c186bef,0xa518f9a7,0xf29c0d7e,0xf3b3da0f,0xa8a876fe,0xd3665754,0xde96b636,0x8ecc0852,0xb442ccae,0x57a60fca,0x7e468fb3,0x3de2e67b,0xe1aea00e,0x9894e8c7,0xc29d82a0,0x42133451,0xd44ad0e4,0x8b88cb}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2f}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x4acfd1c1,0x9efbea1c,0x1c30de65,0x92ff0e5e,0xadb39031,0xa6e1ac6b,0xcfdf40c9,0x3fcbd9f6,0xfde96ca9,0xa52e3e37,0x1855e3c5,0x11fd0a01,0x1ecc3cdf,0x9c0c318a,0xda4131c6,0xd27f2065,0x148f}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x5ce62651,0xc6c8d81,0xe88011,0xf20076e8,0x53dd83a6,0x4a4c21c8,0xd5e6cdfe,0x2d18812,0x7da513b0,0xe681638f,0xcba6397f,0x80012308,0x919290ee,0x66fceb6c,0xd7c84f59,0x32e2865f,0x2641f}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x75eb6411,0x5585930b,0x63eea500,0xf861180f,0x1e88366a,0x2f7ebd2,0xeec480da,0xb27b5e4b,0x974a9c18,0x8f32a082,0x62b103c1,0x225880f3,0xa0730cfd,0x46035874,0xa57622c8,0xb895292b,0xbac23}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xa2ffcbaf,0xf297e66d,0xd8da48aa,0x46de9c8e,0x77e264f4,0x7c219ac5,0xb16b5419,0x60c94768,0x864d3ad,0x22dc1,0xe38b239,0x176c26d3,0x1b642111,0x4b36fdbc,0x1151249f,0x332d8a54,0x143a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xc97bb8d4,0xf1fc68a5,0x1cfacaea,0x1af8cc66,0x90129a15,0x390a07ea,0x9a0075fd,0xb3db8094,0x9ce84547,0x91fc99a1,0xb0b046a6,0x6c5c56e9,0x5d38128c,0x22407b27,0xd094ea36,0xb7360020,0x15e1ff}}}}}; -#elif 8*DIGIT_LEN == 64 -const ec_basis_t BASIS_EVEN = {{{{0xf893b25235cd05, 0xcfad0c31816a3767, 0x24d6633b878c9852, 0x947ef3f6bd7e54a9, 0xcfcc6931acebc9ec, 0x7a593c6f226d62a7, 0xd773da3276d4514e, 0xf93f309a42dec}, {0x70e6b5b84d87aff3, 0x3b39ea4b8a9af50f, 0x33bb72fc45f05294, 0x1103f3d679fb626a, 0x29e23daba686e722, 0xd7683a594c898767, 0x41c4ad3db823bae1, 0x13f1daa2e21221}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0xac16948532220971, 0x5652f704391431a5, 0xca5ee11424c4943d, 0xaa2208832540971a, 0x9e289f9c846e5c2b, 0xde48d5cd32bd5fe2, 0x913b3efa3bc42565, 0xd203dedb14213}, {0x5872c77992dd67c0, 0xb937a740922a8754, 0x21f7d1669ef949f, 0x2a7139b6c8587d0f, 0xf8bab24328aa27ab, 0xdab9bd3b2ddeec79, 0xe83b475f203bcb65, 0x556741a934ed3}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x90f4d4d80ba9ed72, 0xc8b9a440304ca99d, 0xc943b3a8997d4b88, 0xf08d352edc87530f, 0x767ca098b77d7071, 0x50dba761679c1732, 0x545a298536db6db9, 0x1381accb5f9aff}, {0x97233d48b02e6714, 0x684847c5bc2333e7, 0x18886606aeba8b01, 0xe4d42f848dafb6fc, 0xcc8ac9374d922260, 0x63189d0ed97c756, 0xa21cc3b155e35e31, 0x17400333e40769}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_PLUS = {{{{0xcde42ca0952857f6, 0x43986ee6663ef6cd, 0x55871379b845a923, 0x76ed1adf6ebef960, 0xabc4b150fc745f1e, 0x1c8a9c2defeb0f13, 0x13dd17be34fd733, 0x19e43fe41e4c43}, {0x2fa1833df935bc09, 0x69f359ab51c26ad9, 0xf9586cab92e541d6, 0x7362de7c9a12a54, 0xf971e28525d978bc, 0xf9e36a9529d0f3bd, 0xaea48e8b461db588, 0x1c33797cdc407}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x89c16fec8e55f16c, 0x1ff4d48fd451c2bb, 0x7b18fb54214c6532, 0x9ef491c4f579c67e, 0x38cd883c7d0cd40e, 0x499dc1361f2d123, 0x1335e051324fdbc7, 0xfd4fddbdc2a7f}, {0xcb3f9f71c926dc70, 0xebc2bb04385445c8, 0x6fd7a4eaca478a40, 0x151e3f61abfba2cb, 0x761770fecf1ee8c0, 0xd021aa20f5cd88a9, 0xbfcf8539dcdfb928, 0x18506735ab454e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x2df9cd51f27fb63e, 0x70ba06f5979446db, 0xa3fbb7300b16af8d, 0x992c1287f9a1c577, 0xb243e4491d37450e, 0x8473713e201019e0, 0xef9c23305e454581, 0x67b9998e13889}, {0x452150d05e768c9b, 0x4fe2b493696f8226, 0xac671e6158fedc93, 0x670fe96577281a7c, 0xa28c4be3e9ad4931, 0x6f20e70a714aae4b, 0x9890ecbc08f30c2e, 0x24a2c3ff722e18}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_ODD_MINUS = {{{{0x2d2d051047dbd624, 0xfca1b15a916f7be5, 0x441312cd63f16c3f, 0xff7438fdce0ea446, 0x9fdef5936357fab, 0xf9ae02a9421f5416, 0xf7b77ef02bd1c1f8, 0x16f3f63378f96e}, {0x407ce7ffebc92b8e, 0x55fe79acf73aa929, 0x3337fb9216805495, 0xf6db0b7b43176f92, 0x853ee17ab74bf23d, 0xec5cbc949d4b0709, 0xce952df77dfd072f, 0xb16ebf531bef1}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x230916c16a0947e7, 0xa5a77aa3652d437b, 0x945736cf18a280b2, 0xe714d31d874572f1, 0x41bfcb5db198a4ac, 0x33c4ca4686e96f44, 0xe393b5d625debb73, 0x13895d37996b33}, {0xada606e483b73739, 0xe88daed540f3341d, 0xf398a06307ae9e8e, 0x61c2dfd85ef3c1a5, 0xbd29fb1cf683401c, 0x9aae565349a44142, 0x87a7c3de59a75f0d, 0x24c83660611a31}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x102024e8a598a5e8, 0x2bc941882c5f9245, 0xd6d60580934ea556, 0x86a4552d3207e718, 0x96eee147b2e294b5, 0x3ab66e6e93801f2e, 0xc8a390dff6441c41, 0x86407d5d6eb31}, {0xbd273dcfdc4cc333, 0x739eb9e099d67c56, 0x72a7fb0c255bdc52, 0x478eeb66fd200a09, 0x18965b28ca1ee442, 0xafff9738826e71d0, 0xa5a3e52397324a99, 0x22814353549863}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_PLUS = {{{{0xf74e278739139769, 0x58be58577063e414, 0x7eb0edc56149472a, 0xcca10962fd516fae, 0x1ff09b1f54235f02, 0xfaba3bd39b494a4e, 0x59131f688c981aa3, 0x1d51b125134e7b}, {0x65f0988abfc680f0, 0xa7ec54e82f4f2ab4, 0x9cf1b55adef48a73, 0xcd7037d25eae0ef2, 0xf92fd0cacb35869a, 0x4afc0821a671bcfa, 0x2d0ff9a442d5b9a3, 0x2478f31e1b0ea8}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x357c1914bd227f58, 0x8c0d19f6290630f6, 0x49b100de6a80c2b8, 0xa1d365344bbb92d1, 0x20457092ad863380, 0x8274b2b3309427b, 0x57f899ef3140dadd, 0x25503c1a2afc85}, {0x85cd3fa621493a3d, 0x92741aa3b1184149, 0x57dc1c77e580e8ac, 0xd58459bf1d974197, 0x7a88578d886499ce, 0x22ca10e6b3805ca4, 0x2762f95867f32794, 0x1f3dac32b57131}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x2f94ba52e8516cfd, 0xc0cc95a65ef5d3f0, 0x78cd1286af1a549, 0xc58dfb5ca45bda4f, 0xfcb50d3ddcf80ec3, 0x90c191d252c72d27, 0x33d25fd46c7f1402, 0x1c30b1fd3aa2f7}, {0x2a5802b9b8b9188f, 0xeb15e1196bf95ce6, 0x8667c8dd3375a95d, 0x6c5e7827fd12c65d, 0x7b22fdd30e62d493, 0xc59204eeb4f57f61, 0x4c18ee49e098a97f, 0x230ac44ef70718}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_COMMITMENT_MINUS = {{{{0x2d2d051047dbd624, 0xfca1b15a916f7be5, 0x441312cd63f16c3f, 0xff7438fdce0ea446, 0x9fdef5936357fab, 0xf9ae02a9421f5416, 0xf7b77ef02bd1c1f8, 0x16f3f63378f96e}, {0x407ce7ffebc92b8e, 0x55fe79acf73aa929, 0x3337fb9216805495, 0xf6db0b7b43176f92, 0x853ee17ab74bf23d, 0xec5cbc949d4b0709, 0xce952df77dfd072f, 0xb16ebf531bef1}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x230916c16a0947e7, 0xa5a77aa3652d437b, 0x945736cf18a280b2, 0xe714d31d874572f1, 0x41bfcb5db198a4ac, 0x33c4ca4686e96f44, 0xe393b5d625debb73, 0x13895d37996b33}, {0xada606e483b73739, 0xe88daed540f3341d, 0xf398a06307ae9e8e, 0x61c2dfd85ef3c1a5, 0xbd29fb1cf683401c, 0x9aae565349a44142, 0x87a7c3de59a75f0d, 0x24c83660611a31}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x102024e8a598a5e8, 0x2bc941882c5f9245, 0xd6d60580934ea556, 0x86a4552d3207e718, 0x96eee147b2e294b5, 0x3ab66e6e93801f2e, 0xc8a390dff6441c41, 0x86407d5d6eb31}, {0xbd273dcfdc4cc333, 0x739eb9e099d67c56, 0x72a7fb0c255bdc52, 0x478eeb66fd200a09, 0x18965b28ca1ee442, 0xafff9738826e71d0, 0xa5a3e52397324a99, 0x22814353549863}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_basis_t BASIS_CHALLENGE = {{{{0x6e2338651dd6b809, 0xa0b4a74a516bc856, 0xcef4dc03ae64bc, 0x7e04105e61ad1ccc, 0x824a280776a0a61a, 0xb0cbb7066de4598f, 0x91147e22289f3e7c, 0x1159e486ae42c7}, {0x4ad227aedc9e33c9, 0xe3050d4ccb8cd5e6, 0x859f12c8125c3c76, 0xc70299649231184f, 0xde2bae7b1651dfd, 0x38ae5d76b98a0bf5, 0x4afcb9cdd51c75ac, 0x1cd37f9c7ba50e}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x9712f28d07df37f6, 0x3c0fdc3f6b148b77, 0x498753d83c208925, 0x3e9d6e57123afc04, 0xff41fe276d7b38de, 0x6fd059cabd88b549, 0x206a33c3360330d5, 0x5b66cd2ad497f}, {0x9b6c484b0169169b, 0x6854e01c5c87805c, 0x3217830c5fa9e618, 0x26b5dc3839eb347d, 0xc1b369290ec7c6b1, 0x7a2f3702ffd2460d, 0x2a17887c3a6da2f1, 0x16971eee1d9a05}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}, {{{0x6274b50ea5c661fa, 0xe3c3462c17e5a676, 0x73863c6c6e3e939d, 0x36adea15c2e668ab, 0x20ea8297e2acacbb, 0x720c5bd322a623a1, 0xa914186e4ebaa9a2, 0x4e9c355009afd}, {0x8dbb2dc3278a80f0, 0x9c6baecf247fbe32, 0x2fca5dddae71c5fd, 0x6e944e9e7de384cd, 0xeef1669c4da7aede, 0x6fb68320ff68c3a7, 0x9150f158b68d6cdb, 0x22c905c30fedc8}}, {{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}}; -const ec_curve_t CURVE_E0 = {{{0x0}}, {{0x1}}}; -const ec_point_t CURVE_E0_A24 = {{{0x0}}, {{0x1}}}; -const ibz_mat_2x2_t ACTION_I = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x5a8b4610a4c8822e,0xb1f527bdfeac2415,0xf52752cf0b5f1e46,0x58a384562406053e,0x5e1390e154e855b0,0x28068aba43903229,0x5c49f21cfabdb85f,0x753064aa1c512802,0x3aab2de7229a8d3f,0x5c65ca7b4f850fa6,0xcad64a560aa31198,0x99a0d9e3e372a026,0x381ab2}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x95aafa56088f257b,0xfea25ab59e34f879,0x1edc41d977584f0b,0xedeb23a004ef2b25,0xb5ee8fed9288fe6f,0x9ce5753d240bb32c,0xa3170191deca5aeb,0xf7f06fed2c6ff4e6,0x21c4cb2fa76ffb81,0x7953b7ae51255d27,0x686121c29b6c3ff5,0x75eb0cfecc4d4476,0x6810dc}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x8f27e01b57829ac1,0x3632613d2e5573fc,0x7133cfeb3dc1ba61,0xd0fd3aed9f84a27,0xfecc75cda4886ce5,0x89335752356050d3,0x303f583d3c5b5c00,0x4af10d223a5c69c5,0xcc3b797b3fb952a1,0x562d86992557c5ff,0xe16dc1f744372e84,0x75d96ddaeed817b6,0x387954}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa574b9ef5b377dd2,0x4e0ad8420153dbea,0x35e33743bd26e1b9,0xcdd89134b4341d37,0x7d67f73c27531fe9,0xd0e7f34bb80092d,0xd4574088988996a0,0x294bb8b0a756238f,0xa16bf0938b144357,0xf9c8a588b65a910,0xc7e23f9ee3dbcdcf,0x5411fd201fe60e1a,0xb80475}}}}}; -const ibz_mat_2x2_t ACTION_J = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xfbce07cdb9aa53e2,0x91b7cbe109091786,0x67118ce231006c2f,0x1698320d0cb2fad9,0x2ce4f50dbcd19936,0x4872a859c55cd029,0xe67c11d9f3ac7c20,0x39008b8489650f3e,0x61018d5356744281,0x4e17cf4dbf3831a5,0x48a5c601d6d5651,0x88ca6a63f8e20de9,0x36c38e}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xacdd41e885ac805,0x64a4690b318815f1,0xed6fa35ded458291,0xfb4001f537f31b45,0xd12e7340359948fe,0x997722b49fb7a8a8,0x6ff6574c8172b379,0x38681bd2589e2c45,0xad814af38eaf24e6,0xe06119590113d8b,0x3653cbadc1ee8bd4,0x51e5472835d73365,0x5b0dce}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xe34bdb57db92d419,0x8c63768abc6e69cd,0x293d7381fcaf85c,0xa9503f5de1bbf4fb,0x18323f2517e19c75,0xd9e317686a781847,0x5e0f6bdc6f05edf6,0x669bfc08db9f8dbd,0x6942fd0d8b9ebbbe,0xcca4401e29a6dc1c,0x23a09a7d9ee28a3e,0x716bb7b5448e239f,0x2b9da3}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x431f8324655ac1e,0x6e48341ef6f6e879,0xc3f8fd30978593d0,0xfe3e37dcb87279c,0xae96930fbf69dc64,0xeca2619539b36b2d,0x4a2520cb9f9ad2de,0x657b91d63a423c53,0x7b159127573a8e15,0x1dea85861bb28711,0x8e2e2d94d1118916,0x64e86ca00a76a058,0xb95b99}}}}}; -const ibz_mat_2x2_t ACTION_K = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xed15122c25ee5b9f,0xf9df2a4b4d2cbaee,0xc687bfc9a7deddb0,0x94c75337793a0a41,0xd1bef53dae44f7e5,0x18d925e016b8c28d,0xa414f8dd7fc1ef55,0xd472a15869b6867e,0xbba11d8eac118197,0x14a7698b3a0fa476,0xa0360ea8abd3ed3f,0x32d00c3f828af3df,0xc92cb8}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xf2efc5bc53968350,0x90198199b7ebddf2,0x783dc8ccaad82bc2,0x933dee4db3ac2106,0x72e6276d1970e79,0x68572fdbda6794e2,0x8a7855645bb858d0,0xeb82fd2d5b1afdab,0x4f4822e53b70524e,0x38743b77382378bf,0xcd62d345ba36ac01,0x6fe7a286cf00e28d,0x314eab}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x7650ae301b0462e4,0x84861fcc65cff5e0,0x1df5ae851861e766,0x4e45af4ccd2f087e,0xb4a38287f583f712,0xe4412015d0910473,0x3adf9b77e472437c,0x5f80b1d5d6275de5,0x7af369d051750910,0x1f3a140e534804a2,0xeda60532c9e257c0,0xd3ec100155ee93a9,0xd5fd1a}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x12eaedd3da11a461,0x620d5b4b2d34511,0x6482ca4920a7224f,0x91b4c2535f001834,0x9bc92dfcdf67db4,0x1c3be40ee85778c9,0x8c8c39c813855faa,0xca097c0259f0c513,0x207600ec019d4efe,0x575aeb48a0db1440,0xf2827b4c42aaf228,0xbae2cac480cdba61,0x26f26f}}}}}; -const ibz_mat_2x2_t ACTION_GEN2 = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x5a8b4610a4c8822e,0xb1f527bdfeac2415,0xf52752cf0b5f1e46,0x58a384562406053e,0x5e1390e154e855b0,0x28068aba43903229,0x5c49f21cfabdb85f,0x753064aa1c512802,0x3aab2de7229a8d3f,0x5c65ca7b4f850fa6,0xcad64a560aa31198,0x99a0d9e3e372a026,0x381ab2}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x95aafa56088f257b,0xfea25ab59e34f879,0x1edc41d977584f0b,0xedeb23a004ef2b25,0xb5ee8fed9288fe6f,0x9ce5753d240bb32c,0xa3170191deca5aeb,0xf7f06fed2c6ff4e6,0x21c4cb2fa76ffb81,0x7953b7ae51255d27,0x686121c29b6c3ff5,0x75eb0cfecc4d4476,0x6810dc}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x8f27e01b57829ac1,0x3632613d2e5573fc,0x7133cfeb3dc1ba61,0xd0fd3aed9f84a27,0xfecc75cda4886ce5,0x89335752356050d3,0x303f583d3c5b5c00,0x4af10d223a5c69c5,0xcc3b797b3fb952a1,0x562d86992557c5ff,0xe16dc1f744372e84,0x75d96ddaeed817b6,0x387954}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xa574b9ef5b377dd2,0x4e0ad8420153dbea,0x35e33743bd26e1b9,0xcdd89134b4341d37,0x7d67f73c27531fe9,0xd0e7f34bb80092d,0xd4574088988996a0,0x294bb8b0a756238f,0xa16bf0938b144357,0xf9c8a588b65a910,0xc7e23f9ee3dbcdcf,0x5411fd201fe60e1a,0xb80475}}}}}; -const ibz_mat_2x2_t ACTION_GEN3 = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x2b2ca6ef2f396b08,0x21d679cf83da9dce,0x43a1b4e20272c53b,0x4adbe5f704799147,0xb33a070646fab240,0x52c71e8183fe9ed4,0xb9b39b4e40d8c1bf,0xa65686c4b4aec169,0x3be1ecda935ed02b,0x8b3ff74e74d3fd01,0xb10c98558b47a3a8,0x880f0da5efd6ae28,0xaf7eb4}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x503c673a4874f6c0,0xb1a361e067de8735,0x8625f29bb24ee8ce,0x749592ca9e712335,0xc38e8196e41123b7,0x9b2e4bf8e1e1adea,0x986ac6f301e8732,0x182c45dfc2871096,0x67a30b119b0f9034,0xc3ace4a1f09b4d59,0xcf5a76b82ead65e4,0x63e82a1381123bed,0x618f55}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x3939ddb9998ab76d,0xe14aebe3f561eee5,0x39e3d391aec6595e,0x5b3009865dda1f91,0x8b7f5a795e3504ad,0xb18b375d4fec348d,0x4727620cd5b0a4fb,0xd8c684958afdfbc1,0x1abf3b4465ac072f,0x9168e35ba77f510e,0x2872e3a718cdc61,0xf3a292c819b31dab,0x320b7b}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0xd4d35910d0c694f8,0xde2986307c256231,0xe768d530c6133ac4,0xdba02f93d3c0912e,0x284181173540c359,0xe24deb6d7b119c82,0x76ed9757526e8d3f,0xf82596960ef88a28,0xa03531a01a50006a,0xe0c25d856616bbb5,0xe1abf19f63373bbe,0x65a3c95e13820018,0x40a073}}}}}; -const ibz_mat_2x2_t ACTION_GEN4 = {{{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x768a891612f72dd0,0x7cef9525a6965d77,0xe343dfe4d3ef6ed8,0xca63a99bbc9d0520,0xe8df7a9ed7227bf2,0x8c6c92f00b5c6146,0x520a7c6ebfe0f7aa,0xea3950ac34db433f,0x5dd08ec75608c0cb,0x8a53b4c59d07d23b,0xd01b075455e9f69f,0x1968061fc14579ef,0x64965c}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x7977e2de29cb41a8,0x480cc0ccdbf5eef9,0x3c1ee466556c15e1,0xc99ef726d9d61083,0x397313b68cb873c,0x342b97eded33ca71,0xc53c2ab22ddc2c68,0x75c17e96ad8d7ed5,0xa7a411729db82927,0x9c3a1dbb9c11bc5f,0xe6b169a2dd1b5600,0xb7f3d14367807146,0x18a755}}}}, {{{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x3b2857180d823172,0x42430fe632e7faf0,0xefad7428c30f3b3,0x2722d7a66697843f,0xda51c143fac1fb89,0x7220900ae8488239,0x9d6fcdbbf23921be,0x2fc058eaeb13aef2,0x3d79b4e828ba8488,0xf9d0a0729a40251,0xf6d3029964f12be0,0x69f60800aaf749d4,0x6afe8d}}}, {{._mp_alloc = 0, ._mp_size = 13, ._mp_d = (mp_limb_t[]) {0x897576e9ed08d231,0x83106ada5969a288,0x47c6aa2df4969127,0x5c186bef1b9d1d55,0xf29c0d7ea518f9a7,0xa8a876fef3b3da0f,0xde96b636d3665754,0xb442ccae8ecc0852,0x7e468fb357a60fca,0xe1aea00e3de2e67b,0xc29d82a09894e8c7,0xd44ad0e442133451,0x8b88cb}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2f}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x9efbea1c4acfd1c1,0x92ff0e5e1c30de65,0xa6e1ac6badb39031,0x3fcbd9f6cfdf40c9,0xa52e3e37fde96ca9,0x11fd0a011855e3c5,0x9c0c318a1ecc3cdf,0xd27f2065da4131c6,0x148f}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xc6c8d815ce62651,0xf20076e800e88011,0x4a4c21c853dd83a6,0x2d18812d5e6cdfe,0xe681638f7da513b0,0x80012308cba6397f,0x66fceb6c919290ee,0x32e2865fd7c84f59,0x2641f}}}}}; -const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x5585930b75eb6411,0xf861180f63eea500,0x2f7ebd21e88366a,0xb27b5e4beec480da,0x8f32a082974a9c18,0x225880f362b103c1,0x46035874a0730cfd,0xb895292ba57622c8,0xbac23}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xf297e66da2ffcbaf,0x46de9c8ed8da48aa,0x7c219ac577e264f4,0x60c94768b16b5419,0x22dc10864d3ad,0x176c26d30e38b239,0x4b36fdbc1b642111,0x332d8a541151249f,0x143a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xf1fc68a5c97bb8d4,0x1af8cc661cfacaea,0x390a07ea90129a15,0xb3db80949a0075fd,0x91fc99a19ce84547,0x6c5c56e9b0b046a6,0x22407b275d38128c,0xb7360020d094ea36,0x15e1ff}}}}}; +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} #endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x280} +#elif RADIX == 32 +{0x12f68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x4b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x170000000000000} +#else +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1300000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x1099, 0xa9f, 0x14f8, 0x1537, 0x1a13, 0x97e, 0x1095, 0xc8b, 0xdd2, 0x1c5f, 0xbdf, 0x1344, 0x1330, 0x1733, 0x185d, 0x1b08, 0x464, 0x76f, 0xe44, 0x3fc, 0x1dc0, 0x1c62, 0x88, 0x972, 0x13f4, 0x18c8, 0x6bd, 0x804, 0x1269, 0x19e0, 0x14bd, 0x10a1, 0xe5e, 0x1af2, 0x156c, 0x3f7, 0x16a1, 0x47d, 0x314} +#elif RADIX == 32 +{0x184cba61, 0xf4f854f, 0x1fb42753, 0x45c2552, 0x1c5f6e93, 0x2688bdf, 0xedcce66, 0x64d8461, 0x1c8876f2, 0x177007f8, 0x12044718, 0x1913f44b, 0x10d7b8, 0x1cf049a5, 0x1d0a1a5e, 0x1b35e4e5, 0x1508fdea, 0x66d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x27537a7c2a7e132e, 0x7dba4c8b84aa5fb4, 0xedcce6613445eff1, 0xc7221dbc8c9b08c2, 0x8972044718bb803f, 0x24d280435ee3227e, 0x6bc9cbd0a1a5ee78, 0x1011f6d423f7ab6} +#else +{0xa6f4f854fc265d, 0x4c8b84aa5fb427, 0x1309a22f7f8bedd, 0x12326c230bb7339, 0x1177007f8e443b7, 0x3227e897204471, 0x173c12694021af7, 0xd9af272f428697, 0x523eda847ef5} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x4b1, 0x178f, 0x107b, 0x6f6, 0x75e, 0x1b27, 0x4db, 0x1e1b, 0xd78, 0x15b6, 0x1130, 0x8cc, 0x1ac0, 0x9b7, 0x692, 0x1e07, 0x1f4, 0xfd7, 0x2ab, 0x7b5, 0x1040, 0xa43, 0xb6d, 0x13a1, 0x1422, 0x10c9, 0x10b0, 0x1540, 0x827, 0xa69, 0x1761, 0x1f25, 0x1d16, 0x16f2, 0x1fcb, 0x92, 0xcba, 0x1c03, 0x3c7} +#elif RADIX == 32 +{0x1258c7b1, 0xd07bbc7, 0x9cebc6f, 0x10d936f6, 0x15b66bc7, 0x1199130, 0x926df58, 0x1f4f039a, 0x556fd70, 0x1c100f6a, 0x15b6a90, 0x1934229d, 0x15021610, 0x1534a09e, 0xdf25bb0, 0x12ede5d1, 0x5d024bf, 0xa9b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbc6f683dde3c9631, 0xd9af1e1b26dec9ce, 0x926df5808cc89856, 0x5155bf5c3e9e0734, 0x53a15b6a90e0807b, 0x504f540858432684, 0xdbcba2df25bb0a9a, 0x18f00d974092fe5} +#else +{0xded07bbc792c63, 0x11e1b26dec9cebc, 0xc046644c2b6cd7, 0x10fa781cd249b7d, 0x1c100f6a2ab7eb, 0x3268453a15b6a9, 0x54d2827aa042c2, 0x1976f2e8b7c96ec, 0x16e01b2e8125f} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x15c, 0x865, 0x1af6, 0x17b9, 0x6a2, 0x1c22, 0x17c5, 0x1149, 0xa7, 0x151e, 0xe57, 0x4c2, 0x18cd, 0xbd2, 0x7a4, 0x7c6, 0x74a, 0xd2, 0x902, 0x68c, 0x21e, 0x1e44, 0x1f5a, 0x1d4c, 0x115b, 0x1777, 0x16d4, 0x503, 0x3af, 0x7e4, 0x1aa7, 0x3dd, 0x827, 0x186b, 0x765, 0x1fc5, 0xc78, 0x9bd, 0xfe} +#elif RADIX == 32 +{0x10ae12d6, 0x13af6432, 0x88d457b, 0xa4df178, 0x151e053c, 0x14984e57, 0x122f4b19, 0x14a3e31e, 0x12040d23, 0x878d18, 0xcfad791, 0xef15bea, 0x140eda97, 0x13f20ebc, 0xe3ddd53, 0x1970d682, 0x3c7f14e, 0x4eb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x457b9d7b21942b84, 0x7814f149be2f088d, 0x22f4b19a4c272bd4, 0xc4810348e947c63d, 0x7d4cfad791043c68, 0x75e503b6a5dde2b, 0xe1ad04e3ddd539f9, 0x1326f58f1fc53b2} +#else +{0xf73af643285709, 0xf149be2f088d45, 0xcd261395ea3c0a, 0x3a51f18f48bd2c, 0x20878d18902069, 0x1dde2b7d4cfad79, 0x1cfc83af281db52, 0xcb86b4138f7754, 0xb4deb1e3f8a7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x6ac, 0x25e, 0xc7a, 0x1492, 0xd01, 0xbc0, 0x118, 0x376, 0x3e0, 0x7ae, 0x573, 0x171f, 0x35a, 0x1725, 0x48f, 0xc94, 0x133c, 0x16a4, 0x10a8, 0x178d, 0xdd7, 0x798, 0x1d05, 0x39f, 0xc2a, 0x179c, 0x407, 0xd3, 0x118a, 0x1c9f, 0xeac, 0x145b, 0xc35, 0x11a2, 0x58b, 0xe4, 0x5e3, 0xae7, 0x330} +#elif RADIX == 32 +{0x3563c78, 0x4c7a12f, 0x101a0349, 0x1bb04617, 0x7ae1f00, 0xae3e573, 0x7dc946b, 0x13c64a12, 0x1516a49, 0x375ef1b, 0x1fe829e6, 0x138c2a1c, 0x34c80f7, 0xe4fc628, 0xb45b756, 0x2e344c3, 0xf18390b, 0x339} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x349263d0978d58f, 0xb87c037608c2f01a, 0x7dc946b571f2b99e, 0xd8545a92678c9424, 0x439fe829e61baf78, 0xe3140d3203de7185, 0xc68986b45b756727, 0x32b9cbc60e42c5} +#else +{0x924c7a12f1ab1e, 0x37608c2f01a03, 0x15ab8f95ccf5c3e, 0x99e325091f7251, 0xc375ef1b0a8b52, 0x1e7185439fe829e, 0x1393f18a069901e, 0x1171a261ad16dd5, 0x6573978c1c85} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x19da, 0x19cd, 0x19e2, 0x5ea, 0x1079, 0x11ba, 0x1f5e, 0x228, 0x1a45, 0x16ee, 0x18a1, 0x11eb, 0x127a, 0x1d6f, 0x106f, 0x118f, 0x1d0c, 0x1571, 0x1b2d, 0xb60, 0xb27, 0xe1f, 0xe58, 0xe01, 0x4f4, 0x183, 0x13a9, 0x1584, 0x5cb, 0xcce, 0x1ce7, 0x4da, 0x1e62, 0x1213, 0x7fe, 0x1e6, 0x17d, 0x350, 0x3a0} +#elif RADIX == 32 +{0x1ced44bf, 0x159e2ce6, 0xea0f25e, 0x1147d7a3, 0x16eed228, 0xa3d78a1, 0x17f5be4f, 0x10c8c7c1, 0x165b571e, 0x1ac9d6c1, 0x172c387, 0x1064f470, 0x16127521, 0x1667172e, 0x44dae73, 0x1fa427e6, 0xbe8798f, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf25eacf167373b51, 0xbb48a228faf46ea0, 0x7f5be4f51ebc50db, 0xd96d5c7a1918f83, 0x8e0172c387d64eb6, 0x8b975849d4860c9e, 0x484fcc44dae73b33, 0x50d402fa1e63ff} +#else +{0xbd59e2ce6e76a2, 0xa228faf46ea0f2, 0x7a8f5e286ddda4, 0x1e86463e0dfd6f9, 0xfac9d6c1b2dab8, 0x60c9e8e0172c38, 0x1d99c5cbac24ea4, 0x1fd213f31136b9c, 0xa1a805f43cc7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1dea, 0x1bbc, 0x9b0, 0x1066, 0x10fb, 0x1fe8, 0x1bca, 0x34d, 0x275, 0x42a, 0xc7b, 0x6e8, 0x1f5c, 0x12e5, 0x155d, 0x4f2, 0x1422, 0xfce, 0x603, 0x17a8, 0xd9f, 0x182d, 0x9fe, 0x3b1, 0x342, 0x1c21, 0x1aff, 0x1e38, 0x1ac8, 0x1c98, 0x51f, 0x897, 0xe23, 0x17e7, 0xced, 0x1e6, 0x125a, 0x18f3, 0x1b8} +#elif RADIX == 32 +{0xef520a6, 0xc9b0dde, 0x1a21f706, 0x1a6ef2bf, 0x42a13a8, 0x10dd0c7b, 0xecb97eb, 0x2227955, 0xc06fcea, 0xb67ef50, 0x114ff60b, 0x423421d, 0x18e35ffc, 0x1e4c6b23, 0x689728f, 0x1b6fcee2, 0x12d07999, 0x69c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf70664d86ef3bd48, 0xa84ea34dde57fa21, 0xecb97eb86e863d90, 0x8301bf3a8444f2aa, 0x43b14ff60b5b3f7a, 0x3591e38d7ff08468, 0xdf9dc4689728ff26, 0x463ce4b41e6676} +#else +{0xcc9b0dde77a90, 0xa34dde57fa21f7, 0x15c37431ec85427, 0xa1113caabb2e5f, 0x16b67ef506037e7, 0x10846843b14ff60, 0x1f931ac8f1c6bff, 0x1db7e7711a25ca3, 0x8c79c9683ccc} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3337,0x86b9,0x96a8,0x892f,0x9f38,0x4c8e,0xc497,0xdf75,0x4fd7,0xd5b3,0x5dec,0xd543,0xf3dc,0xd5c3,0x8de3,0xa71e,0xd939,0x1324,0x7073,0x5af3,0xbb6b,0x4122,0x9d0,0x81d7,0x74de,0x3877,0x5ea0,0x6d85,0x7c31,0x8f2d,0x9df2,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x86b93337,0x892f96a8,0x4c8e9f38,0xdf75c497,0xd5b34fd7,0xd5435dec,0xd5c3f3dc,0xa71e8de3,0x1324d939,0x5af37073,0x4122bb6b,0x81d709d0,0x387774de,0x6d855ea0,0x8f2d7c31,0x19df2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x892f96a886b93337,0xdf75c4974c8e9f38,0xd5435decd5b34fd7,0xa71e8de3d5c3f3dc,0x5af370731324d939,0x81d709d04122bb6b,0x6d855ea0387774de,0x19df28f2d7c31}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x28e,0xcfd,0xe1c2,0x2061,0xe412,0x3b18,0x40df,0x716c,0xd025,0xd980,0xc041,0xebb9,0xbb45,0x4982,0x17de,0xa8fe,0xb079,0xffe5,0x34d9,0x2aa6,0x2b0b,0x6787,0x9bab,0x6bc3,0x7365,0x3c03,0xf512,0xb57b,0x897,0xf0b5,0x9c9c,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcfd028e,0x2061e1c2,0x3b18e412,0x716c40df,0xd980d025,0xebb9c041,0x4982bb45,0xa8fe17de,0xffe5b079,0x2aa634d9,0x67872b0b,0x6bc39bab,0x3c037365,0xb57bf512,0xf0b50897,0x89c9c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2061e1c20cfd028e,0x716c40df3b18e412,0xebb9c041d980d025,0xa8fe17de4982bb45,0x2aa634d9ffe5b079,0x6bc39bab67872b0b,0xb57bf5123c037365,0x89c9cf0b50897}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x45b1,0x429e,0x37b2,0xd856,0x2f81,0x86cd,0x39cb,0x81ba,0x771e,0xee7e,0x58,0xfbe4,0xa4b,0x28fb,0x7a7d,0x5bb8,0xa413,0x1657,0x2d54,0x3a9d,0xbbad,0x75a3,0x689,0x3069,0xb0ad,0x2fdd,0x2e81,0xad39,0xd3cd,0x2bff,0xb5cb,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x429e45b1,0xd85637b2,0x86cd2f81,0x81ba39cb,0xee7e771e,0xfbe40058,0x28fb0a4b,0x5bb87a7d,0x1657a413,0x3a9d2d54,0x75a3bbad,0x30690689,0x2fddb0ad,0xad392e81,0x2bffd3cd,0x7b5cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd85637b2429e45b1,0x81ba39cb86cd2f81,0xfbe40058ee7e771e,0x5bb87a7d28fb0a4b,0x3a9d2d541657a413,0x3069068975a3bbad,0xad392e812fddb0ad,0x7b5cb2bffd3cd}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xccc9,0x7946,0x6957,0x76d0,0x60c7,0xb371,0x3b68,0x208a,0xb028,0x2a4c,0xa213,0x2abc,0xc23,0x2a3c,0x721c,0x58e1,0x26c6,0xecdb,0x8f8c,0xa50c,0x4494,0xbedd,0xf62f,0x7e28,0x8b21,0xc788,0xa15f,0x927a,0x83ce,0x70d2,0x620d,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7946ccc9,0x76d06957,0xb37160c7,0x208a3b68,0x2a4cb028,0x2abca213,0x2a3c0c23,0x58e1721c,0xecdb26c6,0xa50c8f8c,0xbedd4494,0x7e28f62f,0xc7888b21,0x927aa15f,0x70d283ce,0xe620d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x76d069577946ccc9,0x208a3b68b37160c7,0x2abca2132a4cb028,0x58e1721c2a3c0c23,0xa50c8f8cecdb26c6,0x7e28f62fbedd4494,0x927aa15fc7888b21,0xe620d70d283ce}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x20f3,0x77e0,0xc9a6,0xeb4f,0xb334,0xff68,0xecb4,0xa6e3,0x5015,0x43c1,0x9e87,0xf4eb,0x22e7,0x5f37,0x9392,0x80a0,0x9ea0,0x670f,0x1be3,0x7559,0x2cb5,0x900d,0xfa83,0x1519,0x67b8,0x4d7c,0xaf3a,0x6dc4,0x12e1,0x1e51,0x8d84,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77e020f3,0xeb4fc9a6,0xff68b334,0xa6e3ecb4,0x43c15015,0xf4eb9e87,0x5f3722e7,0x80a09392,0x670f9ea0,0x75591be3,0x900d2cb5,0x1519fa83,0x4d7c67b8,0x6dc4af3a,0x1e5112e1,0x58d84}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xeb4fc9a677e020f3,0xa6e3ecb4ff68b334,0xf4eb9e8743c15015,0x80a093925f3722e7,0x75591be3670f9ea0,0x1519fa83900d2cb5,0x6dc4af3a4d7c67b8,0x58d841e5112e1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x8e98,0xe430,0x6d21,0x2fa6,0x524f,0xf0cf,0xe5eb,0x30ec,0x3658,0x7711,0x7d2f,0x47bf,0xbbc5,0x720c,0xe7a6,0x1ef4,0x335f,0x2c25,0x59e5,0x471c,0x5e06,0x5d38,0x62d6,0xa2a7,0x65f3,0xdefc,0x5e15,0x7a7a,0xdac4,0xc542,0x7bb8,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe4308e98,0x2fa66d21,0xf0cf524f,0x30ece5eb,0x77113658,0x47bf7d2f,0x720cbbc5,0x1ef4e7a6,0x2c25335f,0x471c59e5,0x5d385e06,0xa2a762d6,0xdefc65f3,0x7a7a5e15,0xc542dac4,0xd7bb8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2fa66d21e4308e98,0x30ece5ebf0cf524f,0x47bf7d2f77113658,0x1ef4e7a6720cbbc5,0x471c59e52c25335f,0xa2a762d65d385e06,0x7a7a5e15defc65f3,0xd7bb8c542dac4}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3249,0xe4fe,0xec61,0x49e0,0x5b5f,0xc495,0x6ef6,0x811,0x4fdf,0x59fc,0xbd69,0x608e,0xafe2,0xe9a9,0x5706,0x98ac,0xb327,0x481a,0x9c4e,0xecac,0x19fa,0x6401,0xfaad,0x14a4,0xeda,0x3fb5,0x7eb5,0x9768,0x6597,0x4c10,0xdc28,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe4fe3249,0x49e0ec61,0xc4955b5f,0x8116ef6,0x59fc4fdf,0x608ebd69,0xe9a9afe2,0x98ac5706,0x481ab327,0xecac9c4e,0x640119fa,0x14a4faad,0x3fb50eda,0x97687eb5,0x4c106597,0xbdc28}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x49e0ec61e4fe3249,0x8116ef6c4955b5f,0x608ebd6959fc4fdf,0x98ac5706e9a9afe2,0xecac9c4e481ab327,0x14a4faad640119fa,0x97687eb53fb50eda,0xbdc284c106597}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdf0d,0x881f,0x3659,0x14b0,0x4ccb,0x97,0x134b,0x591c,0xafea,0xbc3e,0x6178,0xb14,0xdd18,0xa0c8,0x6c6d,0x7f5f,0x615f,0x98f0,0xe41c,0x8aa6,0xd34a,0x6ff2,0x57c,0xeae6,0x9847,0xb283,0x50c5,0x923b,0xed1e,0xe1ae,0x727b,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x881fdf0d,0x14b03659,0x974ccb,0x591c134b,0xbc3eafea,0xb146178,0xa0c8dd18,0x7f5f6c6d,0x98f0615f,0x8aa6e41c,0x6ff2d34a,0xeae6057c,0xb2839847,0x923b50c5,0xe1aeed1e,0xa727b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x14b03659881fdf0d,0x591c134b00974ccb,0xb146178bc3eafea,0x7f5f6c6da0c8dd18,0x8aa6e41c98f0615f,0xeae6057c6ff2d34a,0x923b50c5b2839847,0xa727be1aeed1e}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbdde,0x1bf3,0x7bc0,0xcae7,0x8d2e,0x58a8,0x4b1a,0xbcb8,0xccd9,0x3d98,0xfcf2,0x4881,0x66f8,0x3473,0x2e8a,0x730d,0xabbf,0x4789,0xdce9,0x58ea,0xf54,0x6169,0x58d0,0x3280,0xe1f9,0x5bd0,0x67a0,0x23d2,0x2611,0x18e1,0xd51f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1bf3bdde,0xcae77bc0,0x58a88d2e,0xbcb84b1a,0x3d98ccd9,0x4881fcf2,0x347366f8,0x730d2e8a,0x4789abbf,0x58eadce9,0x61690f54,0x328058d0,0x5bd0e1f9,0x23d267a0,0x18e12611,0x7d51f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcae77bc01bf3bdde,0xbcb84b1a58a88d2e,0x4881fcf23d98ccd9,0x730d2e8a347366f8,0x58eadce94789abbf,0x328058d061690f54,0x23d267a05bd0e1f9,0x7d51f18e12611}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xee54,0xe36f,0x939d,0xea02,0xe6db,0xa7ae,0x9f39,0x8bb3,0x7f02,0xf594,0xa9ab,0xae5e,0x9a76,0x7fc0,0xd9a,0xbecd,0x692d,0x8b68,0x30f4,0xff9a,0xd1ae,0xfd43,0xbdfc,0xc552,0xfe0d,0xa4bf,0x33e5,0x981b,0x202c,0x45e8,0x8573,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe36fee54,0xea02939d,0xa7aee6db,0x8bb39f39,0xf5947f02,0xae5ea9ab,0x7fc09a76,0xbecd0d9a,0x8b68692d,0xff9a30f4,0xfd43d1ae,0xc552bdfc,0xa4bffe0d,0x981b33e5,0x45e8202c,0xc8573}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xea02939de36fee54,0x8bb39f39a7aee6db,0xae5ea9abf5947f02,0xbecd0d9a7fc09a76,0xff9a30f48b68692d,0xc552bdfcfd43d1ae,0x981b33e5a4bffe0d,0xc857345e8202c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3337,0x86b9,0x96a8,0x892f,0x9f38,0x4c8e,0xc497,0xdf75,0x4fd7,0xd5b3,0x5dec,0xd543,0xf3dc,0xd5c3,0x8de3,0xa71e,0xd939,0x1324,0x7073,0x5af3,0xbb6b,0x4122,0x9d0,0x81d7,0x74de,0x3877,0x5ea0,0x6d85,0x7c31,0x8f2d,0x9df2,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x86b93337,0x892f96a8,0x4c8e9f38,0xdf75c497,0xd5b34fd7,0xd5435dec,0xd5c3f3dc,0xa71e8de3,0x1324d939,0x5af37073,0x4122bb6b,0x81d709d0,0x387774de,0x6d855ea0,0x8f2d7c31,0x19df2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x892f96a886b93337,0xdf75c4974c8e9f38,0xd5435decd5b34fd7,0xa71e8de3d5c3f3dc,0x5af370731324d939,0x81d709d04122bb6b,0x6d855ea0387774de,0x19df28f2d7c31}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x28e,0xcfd,0xe1c2,0x2061,0xe412,0x3b18,0x40df,0x716c,0xd025,0xd980,0xc041,0xebb9,0xbb45,0x4982,0x17de,0xa8fe,0xb079,0xffe5,0x34d9,0x2aa6,0x2b0b,0x6787,0x9bab,0x6bc3,0x7365,0x3c03,0xf512,0xb57b,0x897,0xf0b5,0x9c9c,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcfd028e,0x2061e1c2,0x3b18e412,0x716c40df,0xd980d025,0xebb9c041,0x4982bb45,0xa8fe17de,0xffe5b079,0x2aa634d9,0x67872b0b,0x6bc39bab,0x3c037365,0xb57bf512,0xf0b50897,0x89c9c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2061e1c20cfd028e,0x716c40df3b18e412,0xebb9c041d980d025,0xa8fe17de4982bb45,0x2aa634d9ffe5b079,0x6bc39bab67872b0b,0xb57bf5123c037365,0x89c9cf0b50897}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x45b1,0x429e,0x37b2,0xd856,0x2f81,0x86cd,0x39cb,0x81ba,0x771e,0xee7e,0x58,0xfbe4,0xa4b,0x28fb,0x7a7d,0x5bb8,0xa413,0x1657,0x2d54,0x3a9d,0xbbad,0x75a3,0x689,0x3069,0xb0ad,0x2fdd,0x2e81,0xad39,0xd3cd,0x2bff,0xb5cb,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x429e45b1,0xd85637b2,0x86cd2f81,0x81ba39cb,0xee7e771e,0xfbe40058,0x28fb0a4b,0x5bb87a7d,0x1657a413,0x3a9d2d54,0x75a3bbad,0x30690689,0x2fddb0ad,0xad392e81,0x2bffd3cd,0x7b5cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd85637b2429e45b1,0x81ba39cb86cd2f81,0xfbe40058ee7e771e,0x5bb87a7d28fb0a4b,0x3a9d2d541657a413,0x3069068975a3bbad,0xad392e812fddb0ad,0x7b5cb2bffd3cd}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xccc9,0x7946,0x6957,0x76d0,0x60c7,0xb371,0x3b68,0x208a,0xb028,0x2a4c,0xa213,0x2abc,0xc23,0x2a3c,0x721c,0x58e1,0x26c6,0xecdb,0x8f8c,0xa50c,0x4494,0xbedd,0xf62f,0x7e28,0x8b21,0xc788,0xa15f,0x927a,0x83ce,0x70d2,0x620d,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7946ccc9,0x76d06957,0xb37160c7,0x208a3b68,0x2a4cb028,0x2abca213,0x2a3c0c23,0x58e1721c,0xecdb26c6,0xa50c8f8c,0xbedd4494,0x7e28f62f,0xc7888b21,0x927aa15f,0x70d283ce,0xe620d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x76d069577946ccc9,0x208a3b68b37160c7,0x2abca2132a4cb028,0x58e1721c2a3c0c23,0xa50c8f8cecdb26c6,0x7e28f62fbedd4494,0x927aa15fc7888b21,0xe620d70d283ce}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xaa15,0x7f4c,0xb027,0xba3f,0xa936,0x25fb,0xd8a6,0xc32c,0x4ff6,0xcba,0x7e3a,0x6517,0x8b62,0x1a7d,0x90bb,0x13df,0x3bed,0x3d1a,0x462b,0x6826,0xf410,0xe897,0x8229,0x4b78,0xee4b,0x42f9,0x6ed,0x6da5,0x4789,0x56bf,0x95bb,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7f4caa15,0xba3fb027,0x25fba936,0xc32cd8a6,0xcba4ff6,0x65177e3a,0x1a7d8b62,0x13df90bb,0x3d1a3bed,0x6826462b,0xe897f410,0x4b788229,0x42f9ee4b,0x6da506ed,0x56bf4789,0xb95bb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xba3fb0277f4caa15,0xc32cd8a625fba936,0x65177e3a0cba4ff6,0x13df90bb1a7d8b62,0x6826462b3d1a3bed,0x4b788229e897f410,0x6da506ed42f9ee4b,0xb95bb56bf4789}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc893,0xf896,0x2771,0xa804,0x1b30,0x95f4,0x9365,0xd12c,0x33e,0xa849,0x9eb8,0x99bc,0xbb85,0x5dc7,0x7fc2,0x63f9,0x71ec,0x9605,0x475f,0xb8e1,0xc488,0xe25f,0x7f40,0x8735,0xecac,0xd7f,0x2994,0x17fb,0xf1ae,0xdafb,0xc2a,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf896c893,0xa8042771,0x95f41b30,0xd12c9365,0xa849033e,0x99bc9eb8,0x5dc7bb85,0x63f97fc2,0x960571ec,0xb8e1475f,0xe25fc488,0x87357f40,0xd7fecac,0x17fb2994,0xdafbf1ae,0x30c2a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa8042771f896c893,0xd12c936595f41b30,0x99bc9eb8a849033e,0x63f97fc25dc7bb85,0xb8e1475f960571ec,0x87357f40e25fc488,0x17fb29940d7fecac,0x30c2adafbf1ae}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3bfd,0x13ce,0x920a,0x911b,0x4570,0x25b1,0xd461,0xc4e5,0x637e,0x243d,0x5ee1,0x2e39,0x5d17,0x952,0x68c2,0x7a32,0x2b9d,0x2f39,0xe4d1,0x13a4,0x6ad4,0x6cd2,0x9b,0xa287,0x5fc3,0x37c9,0xd69b,0xa250,0x1cb2,0xbc08,0xc8f9,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x13ce3bfd,0x911b920a,0x25b14570,0xc4e5d461,0x243d637e,0x2e395ee1,0x9525d17,0x7a3268c2,0x2f392b9d,0x13a4e4d1,0x6cd26ad4,0xa287009b,0x37c95fc3,0xa250d69b,0xbc081cb2,0x1c8f9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x911b920a13ce3bfd,0xc4e5d46125b14570,0x2e395ee1243d637e,0x7a3268c209525d17,0x13a4e4d12f392b9d,0xa287009b6cd26ad4,0xa250d69b37c95fc3,0x1c8f9bc081cb2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x55eb,0x80b3,0x4fd8,0x45c0,0x56c9,0xda04,0x2759,0x3cd3,0xb009,0xf345,0x81c5,0x9ae8,0x749d,0xe582,0x6f44,0xec20,0xc412,0xc2e5,0xb9d4,0x97d9,0xbef,0x1768,0x7dd6,0xb487,0x11b4,0xbd06,0xf912,0x925a,0xb876,0xa940,0x6a44,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x80b355eb,0x45c04fd8,0xda0456c9,0x3cd32759,0xf345b009,0x9ae881c5,0xe582749d,0xec206f44,0xc2e5c412,0x97d9b9d4,0x17680bef,0xb4877dd6,0xbd0611b4,0x925af912,0xa940b876,0x46a44}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x45c04fd880b355eb,0x3cd32759da0456c9,0x9ae881c5f345b009,0xec206f44e582749d,0x97d9b9d4c2e5c412,0xb4877dd617680bef,0x925af912bd0611b4,0x46a44a940b876}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdeef,0xdf9,0xbde0,0x6573,0x4697,0x2c54,0x258d,0xde5c,0x666c,0x1ecc,0xfe79,0x2440,0xb37c,0x1a39,0x9745,0xb986,0xd5df,0xa3c4,0x6e74,0x2c75,0x87aa,0x30b4,0x2c68,0x9940,0x70fc,0x2de8,0x33d0,0x91e9,0x9308,0x8c70,0xea8f,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf9deef,0x6573bde0,0x2c544697,0xde5c258d,0x1ecc666c,0x2440fe79,0x1a39b37c,0xb9869745,0xa3c4d5df,0x2c756e74,0x30b487aa,0x99402c68,0x2de870fc,0x91e933d0,0x8c709308,0xbea8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6573bde00df9deef,0xde5c258d2c544697,0x2440fe791ecc666c,0xb98697451a39b37c,0x2c756e74a3c4d5df,0x99402c6830b487aa,0x91e933d02de870fc,0xbea8f8c709308}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf72a,0xf1b7,0x49ce,0xf501,0x736d,0xd3d7,0xcf9c,0x45d9,0x3f81,0xfaca,0x54d5,0x572f,0x4d3b,0x3fe0,0x86cd,0xdf66,0x3496,0x45b4,0x187a,0x7fcd,0xe8d7,0x7ea1,0x5efe,0xe2a9,0xff06,0xd25f,0x99f2,0x4c0d,0x1016,0xa2f4,0x42b9,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1b7f72a,0xf50149ce,0xd3d7736d,0x45d9cf9c,0xfaca3f81,0x572f54d5,0x3fe04d3b,0xdf6686cd,0x45b43496,0x7fcd187a,0x7ea1e8d7,0xe2a95efe,0xd25fff06,0x4c0d99f2,0xa2f41016,0xe42b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf50149cef1b7f72a,0x45d9cf9cd3d7736d,0x572f54d5faca3f81,0xdf6686cd3fe04d3b,0x7fcd187a45b43496,0xe2a95efe7ea1e8d7,0x4c0d99f2d25fff06,0xe42b9a2f41016}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x4d6, 0x18fd, 0x18c0, 0x13c1, 0x1718, 0x122c, 0x830, 0xa02, 0xee0, 0x1ad1, 0x1485, 0x27f, 0x13e5, 0x118f, 0xdce, 0x31c, 0x1b49, 0x998, 0x117, 0x343, 0xdae, 0x1fe7, 0x16a0, 0x1c43, 0x172, 0xa6e, 0x702, 0xeb8, 0x835, 0x1cf, 0x48d, 0x4e4, 0x13eb, 0x57d, 0xccf, 0x97e, 0x3b6, 0x910, 0x2dd} +#elif RADIX == 32 +{0x126b3651, 0x38c0c7e, 0xb2e313c, 0x10120c24, 0x1ad17702, 0x144ff485, 0x7463e7c, 0x14918e37, 0x22e998d, 0x1b6b8686, 0x3b507f9, 0xdc172e2, 0x1ae0e04a, 0x10e7a0d5, 0x164e4246, 0x13cafb3e, 0x1db25f99, 0x300} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x313c1c6063f49acd, 0x45dc0a0241848b2e, 0x7463e7ca27fa42eb, 0x308ba66369231c6e, 0x5c43b507f9db5c34, 0xd06aeb838129b82e, 0x95f67d64e4246873, 0xfa44076c97e667} +#else +{0x7838c0c7e9359b, 0xa0241848b2e31, 0x1e513fd2175a2ee, 0xda48c71b9d18f9, 0x13b6b86861174cc, 0x9b82e5c43b507f, 0x1439e83575c1c09, 0x19e57d9f5939091, 0x44880ed92fcc} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x937, 0x63f, 0xe30, 0x4f0, 0x5c6, 0x48b, 0x120c, 0x280, 0xbb8, 0xeb4, 0x1d21, 0x89f, 0x1cf9, 0x1463, 0x373, 0x8c7, 0x6d2, 0x1a66, 0x1845, 0x10d0, 0x1b6b, 0x7f9, 0x1da8, 0x1710, 0x105c, 0x129b, 0x1c0, 0xbae, 0x1a0d, 0x873, 0x123, 0x1939, 0xcfa, 0x195f, 0x1333, 0x125f, 0xed, 0xa44, 0x697} +#elif RADIX == 32 +{0x149bfcfc, 0xe3031f, 0x2cb8c4f, 0x14048309, 0xeb45dc0, 0x513fd21, 0x19d18f9f, 0xd24638d, 0x108ba663, 0xedae1a1, 0x10ed41fe, 0x13705cb8, 0xeb83812, 0x1439e835, 0x15939091, 0xcf2becf, 0x76c97e6, 0x820} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x8c4f071818fd26ff, 0xd1770280906122cb, 0x9d18f9f289fe90ba, 0xc22e998da48c71b, 0x9710ed41fe76d70d, 0xf41abae0e04a6e0b, 0xe57d9f5939091a1c, 0x6a9101db25f999} +#else +{0x9e0e3031fa4dfe, 0x10280906122cb8c, 0xf944ff485d68bb, 0x369231c6e7463e, 0x1cedae1a1845d33, 0xa6e0b9710ed41f, 0xd0e7a0d5d70702, 0x6795f67d64e424, 0xd52203b64bf3} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x1863, 0x635, 0x19a9, 0x17fc, 0xdfe, 0x1784, 0x150b, 0x16c3, 0x15c0, 0x1f5f, 0x11d9, 0x1064, 0x1893, 0x1829, 0x211, 0x1a9e, 0x2e1, 0x3cc, 0x1e64, 0x12ed, 0x1c2c, 0x18b9, 0x121d, 0x234, 0xec9, 0x14dc, 0x4b6, 0xaad, 0x19f6, 0x805, 0x1984, 0x1843, 0xfca, 0x1a7a, 0xe04, 0x4af, 0x881, 0x65b, 0x421} +#elif RADIX == 32 +{0x1c31ce4f, 0x199a931a, 0x11bfd7f, 0x161d42ef, 0x1f5fae05, 0xe0c91d9, 0x8e0a712, 0xe1d4f08, 0x1cc83cc1, 0xf0b25db, 0x1490ee2e, 0x1b8ec911, 0xab496d4, 0x402e7d9, 0x15843cc2, 0x134f4fc, 0x4092bdc, 0x85a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xfd7fccd498d70c73, 0x7eb816c3a85de11b, 0x8e0a71270648ecfd, 0xdf320f305c3a9e10, 0x223490ee2e78592e, 0x73ecaad25b5371d9, 0x69e9f95843cc2201, 0xf996d1024af702} +#else +{0xff99a931ae18e7, 0x16c3a85de11bfd, 0x938324767ebf5c, 0x170ea78423829c, 0x1cf0b25dbe641e6, 0x1371d9223490ee2, 0x1100b9f655692da, 0x9a7a7e5610f30, 0x432da20495ee} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1a7, 0x175b, 0x9bd, 0xb94, 0x1a66, 0x1d52, 0x1eb3, 0x1431, 0x9e7, 0x1b9d, 0x75f, 0xcba, 0x17e9, 0xe1d, 0xdb, 0xc7b, 0x76, 0xa04, 0xd73, 0x3f7, 0x17dd, 0x1555, 0x5d6, 0x16ee, 0x1df6, 0x1429, 0x15cb, 0x140b, 0x1aeb, 0x14fb, 0x1984, 0x179b, 0x1ba1, 0x125e, 0xb62, 0x249, 0x95a, 0x137a, 0x7c} +#elif RADIX == 32 +{0x10d3893a, 0x89bdbad, 0x14b4ccb9, 0x18facfa, 0x1b9d4f3d, 0x597475f, 0xdb876fd, 0x7663d83, 0x1ae6a040, 0xdf747ee, 0xe2eb555, 0x53df6b7, 0x102eb974, 0xa7debae, 0x379bcc2, 0x18a4bdba, 0xad09256, 0xcd2} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xccb944dedd6c34e2, 0x753cf431f59f54b4, 0xdb876fd2cba3afee, 0x76b9a8100ecc7b06, 0xd6ee2eb5556fba3f, 0xf5d740bae5d0a7be, 0x497b74379bcc253e, 0x84de92b42495b1} +#else +{0x17289bdbad869c4, 0xf431f59f54b4cc, 0x1e965d1d7f73a9e, 0x3b31ec1b6e1db, 0xadf747eed73502, 0x10a7bed6ee2eb55, 0x129f7aeba05d72e, 0xc525edd0de6f30, 0x109bd2568492b} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1d6a, 0x5b, 0x24a, 0x1bfc, 0x1cef, 0xc7e, 0x1cac, 0x1e4, 0x68, 0x16da, 0x30d, 0x13a5, 0x505, 0x329, 0x9f4, 0x1dae, 0x371, 0x111b, 0x200, 0x1b69, 0x1e51, 0x3b7, 0x316, 0x509, 0x1af2, 0x1220, 0x8c2, 0x195a, 0x1050, 0x1b7a, 0xd8b, 0x1a21, 0x336, 0x14fa, 0x1a4b, 0x11d, 0x167d, 0x1501, 0x302} +#elif RADIX == 32 +{0x1eb53915, 0x1824a02d, 0x1fb9dfbf, 0xf272b18, 0x16da0340, 0x1674a30d, 0x1a0ca4a0, 0x171ed727, 0x40111b1, 0x1f9476d2, 0x918b0ed, 0x41af228, 0x5691852, 0x1dbd4143, 0xda216c5, 0x12e9f433, 0x13e84774, 0xc8d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xdfbfc125016fad4e, 0x680d01e4e5631fb9, 0xa0ca4a0b3a5186db, 0x9100446c6e3dae4f, 0x450918b0edfca3b6, 0xa0a195a46148835e, 0xd3e866da216c5ede, 0x75406cfa11dd25} +#else +{0x17f824a02df5a9c, 0x101e4e5631fb9df, 0x1059d28c36db406, 0x11b8f6b93e83292, 0x1bf9476d220088d, 0x8835e450918b0e, 0xf6f5050cad230a, 0x974fa19b6885b1, 0xea80d9f423ba} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1e9d, 0xbb9, 0x14f9, 0xc51, 0x1731, 0x122e, 0x1901, 0x59a, 0xcc1, 0xb65, 0xc68, 0x1eaf, 0x1f48, 0x1e46, 0xe46, 0x9c1, 0x1013, 0x12f8, 0x18a, 0x177f, 0x1e19, 0x1cca, 0x257, 0x18b9, 0xa38, 0x184b, 0x15a4, 0x86d, 0xa8c, 0x1df5, 0xf2, 0x37, 0x5d9, 0x292, 0x11ae, 0x9e, 0x1fce, 0x7f4, 0x407} +#elif RADIX == 32 +{0x1f4ecc63, 0x34f95dc, 0xbae62c5, 0xcd64064, 0xb656609, 0x3d5ec68, 0x3791be9, 0x134e0b9, 0x3152f88, 0x17866efe, 0x1912bf32, 0x96a38c5, 0x1b6b498, 0xefaaa31, 0x12037079, 0xb85245d, 0x1e7027a3, 0x727} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x62c51a7caee7d3b3, 0x9598259ac80c8bae, 0x3791be91eaf6342d, 0xf0c54be20269c172, 0x18b912bf32bc3377, 0x551886dad2612d47, 0xa48bb203707977d, 0x29fd3f9c09e8d7} +#else +{0x18a34f95dcfa766, 0x259ac80c8bae62, 0x148f57b1a16cacc, 0x809a705c8de46f, 0x57866efe18a97c, 0x12d4718b912bf3, 0xbbeaa8c436d693, 0x15c2922ec80dc1e, 0x53fa7f3813d1} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x177, 0xf70, 0x25, 0x503, 0x1f96, 0x1abd, 0x6f5, 0x115b, 0xa68, 0x1192, 0x338, 0x1bae, 0x15af, 0x1570, 0xb79, 0x1c9a, 0xe78, 0x19de, 0x860, 0x1076, 0x1a63, 0x1d52, 0x1511, 0x10c5, 0x1fdf, 0xab1, 0x1454, 0x2c4, 0x292, 0x1135, 0x273, 0x1d, 0xefa, 0x47, 0x344, 0x226, 0x9c1, 0x1af, 0x639} +#elif RADIX == 32 +{0xbbf600, 0x60257b8, 0xf7f2c50, 0xad9bd75, 0x11925344, 0x1f75c338, 0x1cd5c2b5, 0x78e4d2d, 0x10c19de7, 0x1698e0ec, 0x5a88f54, 0x163fdf86, 0xb128a8a, 0x189a8a48, 0x1401d139, 0x11008eef, 0xe088986, 0xd7a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x2c503012bdc02efd, 0x494d115b37aeaf7f, 0xcd5c2b5fbae19c46, 0x64306779cf1c9a5b, 0xf0c5a88f54b4c707, 0x45242c4a2a2ac7fb, 0x11ddf401d139c4d, 0xd86bd3822261a2} +#else +{0xa060257b805dfb, 0x1115b37aeaf7f2c, 0x1afdd70ce2324a6, 0x73c72696f3570a, 0x9698e0ec860cef, 0xac7fbf0c5a88f5, 0xe26a2921625151, 0x8804777d00744e, 0xd7a70444c3} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x153b, 0x598, 0x100c, 0x1537, 0x1eda, 0x190b, 0x1406, 0x186e, 0x457, 0x469, 0x14a0, 0x1ce0, 0x1f6d, 0xf2f, 0x1837, 0x616, 0x16d0, 0xf35, 0x192b, 0x106, 0x17d6, 0x6b3, 0x169e, 0x27a, 0xe54, 0xa42, 0x1694, 0x16c3, 0x7b, 0x298, 0x118, 0xb0, 0x893, 0xbca, 0x1678, 0x19de, 0xb59, 0x3a, 0x43} +#elif RADIX == 32 +{0xa9d84f6, 0xf00c2cc, 0x2fdb553, 0x37501b2, 0x46922be, 0x179c14a0, 0x1bbcbfed, 0xd030b60, 0x1256f35b, 0x1df5820d, 0x1ab4f1ac, 0x84e5413, 0x1b0ed28a, 0x14c01ee, 0x60b008c, 0x1e179489, 0x1ace77ac, 0x8d2} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xb55378061662a761, 0xa48af86ea03642fd, 0xbbcbfedbce0a5011, 0x6c95bcd6da0616c1, 0x827ab4f1acefac10, 0xf76c3b4a2909ca, 0x2f291260b008c0a6, 0x680e96b39deb3c} +#else +{0xa6f00c2cc54ec2, 0xf86ea03642fdb5, 0x16de7052808d245, 0x1b68185b06ef2ff, 0x19df5820d92b79a, 0x909ca827ab4f1a, 0x53007bb61da51, 0xf0bca44982c023, 0xd01d2d673bd6} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x625d,0xe815,0xba6a,0x6297,0x1a75,0xd2b2,0xc698,0xd28b,0xb1,0x97f3,0x82e4,0x4126,0xf8e7,0x3639,0x1816,0x9c43,0xd2cf,0x37da,0xad52,0x2b8a,0x91cb,0x4297,0x6be7,0x1a98,0x19e4,0xa8a,0x22de,0x835c,0x4d5f,0x4596,0xa957,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe815625d,0x6297ba6a,0xd2b21a75,0xd28bc698,0x97f300b1,0x412682e4,0x3639f8e7,0x9c431816,0x37dad2cf,0x2b8aad52,0x429791cb,0x1a986be7,0xa8a19e4,0x835c22de,0x45964d5f,0x7a957}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6297ba6ae815625d,0xd28bc698d2b21a75,0x412682e497f300b1,0x9c4318163639f8e7,0x2b8aad5237dad2cf,0x1a986be7429791cb,0x835c22de0a8a19e4,0x7a95745964d5f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf6c6,0x71f7,0xa10,0xf04d,0x23dd,0x2419,0x60da,0xbcad,0xe86c,0xb26d,0x2f1d,0xdb61,0xae7,0xd947,0xb159,0x9d94,0x42db,0x8401,0xe3fe,0xcd5c,0x7586,0xfd38,0xf28a,0xc4c5,0x40d7,0x5c22,0x185c,0xd31f,0x843f,0xe782,0xb462,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x71f7f6c6,0xf04d0a10,0x241923dd,0xbcad60da,0xb26de86c,0xdb612f1d,0xd9470ae7,0x9d94b159,0x840142db,0xcd5ce3fe,0xfd387586,0xc4c5f28a,0x5c2240d7,0xd31f185c,0xe782843f,0x5b462}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf04d0a1071f7f6c6,0xbcad60da241923dd,0xdb612f1db26de86c,0x9d94b159d9470ae7,0xcd5ce3fe840142db,0xc4c5f28afd387586,0xd31f185c5c2240d7,0x5b462e782843f}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1c53,0x7318,0xfc96,0x4b34,0xd504,0xae17,0x4d56,0xa914,0x6a8c,0x69,0x2448,0x28b,0x5716,0xce1b,0xa7cc,0xd29c,0x48cf,0x1028,0xc81e,0x40dd,0xbcdf,0x6d4,0x36f7,0xcb9f,0x8d7,0x3a34,0x99c0,0x38d3,0x6e18,0xb4bc,0xe1a8,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x73181c53,0x4b34fc96,0xae17d504,0xa9144d56,0x696a8c,0x28b2448,0xce1b5716,0xd29ca7cc,0x102848cf,0x40ddc81e,0x6d4bcdf,0xcb9f36f7,0x3a3408d7,0x38d399c0,0xb4bc6e18,0xbe1a8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4b34fc9673181c53,0xa9144d56ae17d504,0x28b244800696a8c,0xd29ca7ccce1b5716,0x40ddc81e102848cf,0xcb9f36f706d4bcdf,0x38d399c03a3408d7,0xbe1a8b4bc6e18}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9da3,0x17ea,0x4595,0x9d68,0xe58a,0x2d4d,0x3967,0x2d74,0xff4e,0x680c,0x7d1b,0xbed9,0x718,0xc9c6,0xe7e9,0x63bc,0x2d30,0xc825,0x52ad,0xd475,0x6e34,0xbd68,0x9418,0xe567,0xe61b,0xf575,0xdd21,0x7ca3,0xb2a0,0xba69,0x56a8,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x17ea9da3,0x9d684595,0x2d4de58a,0x2d743967,0x680cff4e,0xbed97d1b,0xc9c60718,0x63bce7e9,0xc8252d30,0xd47552ad,0xbd686e34,0xe5679418,0xf575e61b,0x7ca3dd21,0xba69b2a0,0x856a8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9d68459517ea9da3,0x2d7439672d4de58a,0xbed97d1b680cff4e,0x63bce7e9c9c60718,0xd47552adc8252d30,0xe5679418bd686e34,0x7ca3dd21f575e61b,0x856a8ba69b2a0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbdde,0x1bf3,0x7bc0,0xcae7,0x8d2e,0x58a8,0x4b1a,0xbcb8,0xccd9,0x3d98,0xfcf2,0x4881,0x66f8,0x3473,0x2e8a,0x730d,0xabbf,0x4789,0xdce9,0x58ea,0xf54,0x6169,0x58d0,0x3280,0xe1f9,0x5bd0,0x67a0,0x23d2,0x2611,0x18e1,0xd51f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1bf3bdde,0xcae77bc0,0x58a88d2e,0xbcb84b1a,0x3d98ccd9,0x4881fcf2,0x347366f8,0x730d2e8a,0x4789abbf,0x58eadce9,0x61690f54,0x328058d0,0x5bd0e1f9,0x23d267a0,0x18e12611,0x7d51f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcae77bc01bf3bdde,0xbcb84b1a58a88d2e,0x4881fcf23d98ccd9,0x730d2e8a347366f8,0x58eadce94789abbf,0x328058d061690f54,0x23d267a05bd0e1f9,0x7d51f18e12611}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xee54,0xe36f,0x939d,0xea02,0xe6db,0xa7ae,0x9f39,0x8bb3,0x7f02,0xf594,0xa9ab,0xae5e,0x9a76,0x7fc0,0xd9a,0xbecd,0x692d,0x8b68,0x30f4,0xff9a,0xd1ae,0xfd43,0xbdfc,0xc552,0xfe0d,0xa4bf,0x33e5,0x981b,0x202c,0x45e8,0x8573,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe36fee54,0xea02939d,0xa7aee6db,0x8bb39f39,0xf5947f02,0xae5ea9ab,0x7fc09a76,0xbecd0d9a,0x8b68692d,0xff9a30f4,0xfd43d1ae,0xc552bdfc,0xa4bffe0d,0x981b33e5,0x45e8202c,0xc8573}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xea02939de36fee54,0x8bb39f39a7aee6db,0xae5ea9abf5947f02,0xbecd0d9a7fc09a76,0xff9a30f48b68692d,0xc552bdfcfd43d1ae,0x981b33e5a4bffe0d,0xc857345e8202c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1aff,0x9f84,0xf1c6,0xd816,0xbdd0,0xd450,0x1990,0x119,0xbcf7,0x1a97,0x4780,0x8209,0x695b,0x1d73,0x20ba,0x7b53,0x5e3c,0x4ce5,0xac53,0x351f,0xaaa3,0x5a3e,0xd54c,0x121f,0xbf17,0xdb55,0xc9c,0x8370,0x2061,0x415c,0x1f35,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9f841aff,0xd816f1c6,0xd450bdd0,0x1191990,0x1a97bcf7,0x82094780,0x1d73695b,0x7b5320ba,0x4ce55e3c,0x351fac53,0x5a3eaaa3,0x121fd54c,0xdb55bf17,0x83700c9c,0x415c2061,0xc1f35}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd816f1c69f841aff,0x1191990d450bdd0,0x820947801a97bcf7,0x7b5320ba1d73695b,0x351fac534ce55e3c,0x121fd54c5a3eaaa3,0x83700c9cdb55bf17,0xc1f35415c2061}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x7734,0xde6f,0xbab1,0xd4f3,0xc928,0x6c68,0x69b0,0x7cc0,0x994f,0x296c,0xb1dc,0x2eb2,0xe4ce,0x8494,0xa8ff,0x95d3,0x5f30,0xe7f,0x918,0x6cd6,0xae27,0x747c,0x1f93,0xed96,0x5590,0xc91a,0x713d,0xc33e,0xc075,0x40fd,0x9ce5,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xde6f7734,0xd4f3bab1,0x6c68c928,0x7cc069b0,0x296c994f,0x2eb2b1dc,0x8494e4ce,0x95d3a8ff,0xe7f5f30,0x6cd60918,0x747cae27,0xed961f93,0xc91a5590,0xc33e713d,0x40fdc075,0x39ce5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd4f3bab1de6f7734,0x7cc069b06c68c928,0x2eb2b1dc296c994f,0x95d3a8ff8494e4ce,0x6cd609180e7f5f30,0xed961f93747cae27,0xc33e713dc91a5590,0x39ce540fdc075}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xda85,0x89f5,0x1aaf,0x9ec7,0xcfff,0xec63,0x3ae9,0x20bc,0xc2f3,0x9942,0x7d84,0xfa25,0x5e69,0xeb7b,0xc357,0x9342,0x5c58,0xd26c,0x857b,0x7a7f,0x757,0xfb5c,0xbb97,0x33,0x6c28,0xfceb,0xd644,0xcc0a,0x22ad,0xe1c0,0x12d6,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x89f5da85,0x9ec71aaf,0xec63cfff,0x20bc3ae9,0x9942c2f3,0xfa257d84,0xeb7b5e69,0x9342c357,0xd26c5c58,0x7a7f857b,0xfb5c0757,0x33bb97,0xfceb6c28,0xcc0ad644,0xe1c022ad,0x412d6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9ec71aaf89f5da85,0x20bc3ae9ec63cfff,0xfa257d849942c2f3,0x9342c357eb7b5e69,0x7a7f857bd26c5c58,0x33bb97fb5c0757,0xcc0ad644fceb6c28,0x412d6e1c022ad}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xe501,0x607b,0xe39,0x27e9,0x422f,0x2baf,0xe66f,0xfee6,0x4308,0xe568,0xb87f,0x7df6,0x96a4,0xe28c,0xdf45,0x84ac,0xa1c3,0xb31a,0x53ac,0xcae0,0x555c,0xa5c1,0x2ab3,0xede0,0x40e8,0x24aa,0xf363,0x7c8f,0xdf9e,0xbea3,0xe0ca,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x607be501,0x27e90e39,0x2baf422f,0xfee6e66f,0xe5684308,0x7df6b87f,0xe28c96a4,0x84acdf45,0xb31aa1c3,0xcae053ac,0xa5c1555c,0xede02ab3,0x24aa40e8,0x7c8ff363,0xbea3df9e,0x3e0ca}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x27e90e39607be501,0xfee6e66f2baf422f,0x7df6b87fe5684308,0x84acdf45e28c96a4,0xcae053acb31aa1c3,0xede02ab3a5c1555c,0x7c8ff36324aa40e8,0x3e0cabea3df9e}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x625d,0xe815,0xba6a,0x6297,0x1a75,0xd2b2,0xc698,0xd28b,0xb1,0x97f3,0x82e4,0x4126,0xf8e7,0x3639,0x1816,0x9c43,0xd2cf,0x37da,0xad52,0x2b8a,0x91cb,0x4297,0x6be7,0x1a98,0x19e4,0xa8a,0x22de,0x835c,0x4d5f,0x4596,0xa957,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe815625d,0x6297ba6a,0xd2b21a75,0xd28bc698,0x97f300b1,0x412682e4,0x3639f8e7,0x9c431816,0x37dad2cf,0x2b8aad52,0x429791cb,0x1a986be7,0xa8a19e4,0x835c22de,0x45964d5f,0x7a957}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6297ba6ae815625d,0xd28bc698d2b21a75,0x412682e497f300b1,0x9c4318163639f8e7,0x2b8aad5237dad2cf,0x1a986be7429791cb,0x835c22de0a8a19e4,0x7a95745964d5f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf6c6,0x71f7,0xa10,0xf04d,0x23dd,0x2419,0x60da,0xbcad,0xe86c,0xb26d,0x2f1d,0xdb61,0xae7,0xd947,0xb159,0x9d94,0x42db,0x8401,0xe3fe,0xcd5c,0x7586,0xfd38,0xf28a,0xc4c5,0x40d7,0x5c22,0x185c,0xd31f,0x843f,0xe782,0xb462,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x71f7f6c6,0xf04d0a10,0x241923dd,0xbcad60da,0xb26de86c,0xdb612f1d,0xd9470ae7,0x9d94b159,0x840142db,0xcd5ce3fe,0xfd387586,0xc4c5f28a,0x5c2240d7,0xd31f185c,0xe782843f,0x5b462}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf04d0a1071f7f6c6,0xbcad60da241923dd,0xdb612f1db26de86c,0x9d94b159d9470ae7,0xcd5ce3fe840142db,0xc4c5f28afd387586,0xd31f185c5c2240d7,0x5b462e782843f}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1c53,0x7318,0xfc96,0x4b34,0xd504,0xae17,0x4d56,0xa914,0x6a8c,0x69,0x2448,0x28b,0x5716,0xce1b,0xa7cc,0xd29c,0x48cf,0x1028,0xc81e,0x40dd,0xbcdf,0x6d4,0x36f7,0xcb9f,0x8d7,0x3a34,0x99c0,0x38d3,0x6e18,0xb4bc,0xe1a8,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x73181c53,0x4b34fc96,0xae17d504,0xa9144d56,0x696a8c,0x28b2448,0xce1b5716,0xd29ca7cc,0x102848cf,0x40ddc81e,0x6d4bcdf,0xcb9f36f7,0x3a3408d7,0x38d399c0,0xb4bc6e18,0xbe1a8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4b34fc9673181c53,0xa9144d56ae17d504,0x28b244800696a8c,0xd29ca7ccce1b5716,0x40ddc81e102848cf,0xcb9f36f706d4bcdf,0x38d399c03a3408d7,0xbe1a8b4bc6e18}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9da3,0x17ea,0x4595,0x9d68,0xe58a,0x2d4d,0x3967,0x2d74,0xff4e,0x680c,0x7d1b,0xbed9,0x718,0xc9c6,0xe7e9,0x63bc,0x2d30,0xc825,0x52ad,0xd475,0x6e34,0xbd68,0x9418,0xe567,0xe61b,0xf575,0xdd21,0x7ca3,0xb2a0,0xba69,0x56a8,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x17ea9da3,0x9d684595,0x2d4de58a,0x2d743967,0x680cff4e,0xbed97d1b,0xc9c60718,0x63bce7e9,0xc8252d30,0xd47552ad,0xbd686e34,0xe5679418,0xf575e61b,0x7ca3dd21,0xba69b2a0,0x856a8}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9d68459517ea9da3,0x2d7439672d4de58a,0xbed97d1b680cff4e,0x63bce7e9c9c60718,0xd47552adc8252d30,0xe5679418bd686e34,0x7ca3dd21f575e61b,0x856a8ba69b2a0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdeef,0xdf9,0xbde0,0x6573,0x4697,0x2c54,0x258d,0xde5c,0x666c,0x1ecc,0xfe79,0x2440,0xb37c,0x1a39,0x9745,0xb986,0xd5df,0xa3c4,0x6e74,0x2c75,0x87aa,0x30b4,0x2c68,0x9940,0x70fc,0x2de8,0x33d0,0x91e9,0x9308,0x8c70,0xea8f,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf9deef,0x6573bde0,0x2c544697,0xde5c258d,0x1ecc666c,0x2440fe79,0x1a39b37c,0xb9869745,0xa3c4d5df,0x2c756e74,0x30b487aa,0x99402c68,0x2de870fc,0x91e933d0,0x8c709308,0xbea8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6573bde00df9deef,0xde5c258d2c544697,0x2440fe791ecc666c,0xb98697451a39b37c,0x2c756e74a3c4d5df,0x99402c6830b487aa,0x91e933d02de870fc,0xbea8f8c709308}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf72a,0xf1b7,0x49ce,0xf501,0x736d,0xd3d7,0xcf9c,0x45d9,0x3f81,0xfaca,0x54d5,0x572f,0x4d3b,0x3fe0,0x86cd,0xdf66,0x3496,0x45b4,0x187a,0x7fcd,0xe8d7,0x7ea1,0x5efe,0xe2a9,0xff06,0xd25f,0x99f2,0x4c0d,0x1016,0xa2f4,0x42b9,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1b7f72a,0xf50149ce,0xd3d7736d,0x45d9cf9c,0xfaca3f81,0x572f54d5,0x3fe04d3b,0xdf6686cd,0x45b43496,0x7fcd187a,0x7ea1e8d7,0xe2a95efe,0xd25fff06,0x4c0d99f2,0xa2f41016,0xe42b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf50149cef1b7f72a,0x45d9cf9cd3d7736d,0x572f54d5faca3f81,0xdf6686cd3fe04d3b,0x7fcd187a45b43496,0xe2a95efe7ea1e8d7,0x4c0d99f2d25fff06,0xe42b9a2f41016}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x679c,0x35ac,0x6c8c,0xee5e,0x2827,0x29fa,0x9f6c,0xbda,0x2083,0x5e20,0xd351,0x39bd,0xd9bc,0x4085,0x3727,0x8f2,0xe905,0x55dd,0x6f90,0x6e26,0x6779,0xf15a,0xf170,0xec90,0xdb0e,0x53a0,0x6f99,0xe710,0xad92,0xa7f0,0xe2e1,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x35ac679c,0xee5e6c8c,0x29fa2827,0xbda9f6c,0x5e202083,0x39bdd351,0x4085d9bc,0x8f23727,0x55dde905,0x6e266f90,0xf15a6779,0xec90f170,0x53a0db0e,0xe7106f99,0xa7f0ad92,0xde2e1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xee5e6c8c35ac679c,0xbda9f6c29fa2827,0x39bdd3515e202083,0x8f237274085d9bc,0x6e266f9055dde905,0xec90f170f15a6779,0xe7106f9953a0db0e,0xde2e1a7f0ad92}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa483,0xbf25,0x238c,0x4c65,0xdd0b,0xccc9,0xc5af,0xac20,0xe998,0xb162,0xe2bf,0xbd24,0x5fd,0x6720,0xd781,0xd37d,0xa89,0x595a,0x76b0,0x7f86,0xdea4,0x59ea,0x2c01,0xd679,0x714b,0x5454,0xe262,0x2bcf,0xfad4,0x8bc0,0x8cd3,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbf25a483,0x4c65238c,0xccc9dd0b,0xac20c5af,0xb162e998,0xbd24e2bf,0x672005fd,0xd37dd781,0x595a0a89,0x7f8676b0,0x59eadea4,0xd6792c01,0x5454714b,0x2bcfe262,0x8bc0fad4,0xc8cd3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4c65238cbf25a483,0xac20c5afccc9dd0b,0xbd24e2bfb162e998,0xd37dd781672005fd,0x7f8676b0595a0a89,0xd6792c0159eadea4,0x2bcfe2625454714b,0xc8cd38bc0fad4}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3f72,0x6188,0x95e8,0xed15,0x2b1a,0x2fd,0xaae9,0x15d9,0x5945,0x23ff,0xfe55,0xce25,0xaa48,0xa648,0x8534,0x16db,0x3fcf,0xa301,0xfb7c,0x3a68,0x4ba,0x1c1d,0x30ee,0xf044,0x116f,0xc4f8,0x98b2,0x4971,0xea5c,0xb93e,0x2836,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x61883f72,0xed1595e8,0x2fd2b1a,0x15d9aae9,0x23ff5945,0xce25fe55,0xa648aa48,0x16db8534,0xa3013fcf,0x3a68fb7c,0x1c1d04ba,0xf04430ee,0xc4f8116f,0x497198b2,0xb93eea5c,0x32836}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xed1595e861883f72,0x15d9aae902fd2b1a,0xce25fe5523ff5945,0x16db8534a648aa48,0x3a68fb7ca3013fcf,0xf04430ee1c1d04ba,0x497198b2c4f8116f,0x32836b93eea5c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9864,0xca53,0x9373,0x11a1,0xd7d8,0xd605,0x6093,0xf425,0xdf7c,0xa1df,0x2cae,0xc642,0x2643,0xbf7a,0xc8d8,0xf70d,0x16fa,0xaa22,0x906f,0x91d9,0x9886,0xea5,0xe8f,0x136f,0x24f1,0xac5f,0x9066,0x18ef,0x526d,0x580f,0x1d1e,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xca539864,0x11a19373,0xd605d7d8,0xf4256093,0xa1dfdf7c,0xc6422cae,0xbf7a2643,0xf70dc8d8,0xaa2216fa,0x91d9906f,0xea59886,0x136f0e8f,0xac5f24f1,0x18ef9066,0x580f526d,0x21d1e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x11a19373ca539864,0xf4256093d605d7d8,0xc6422caea1dfdf7c,0xf70dc8d8bf7a2643,0x91d9906faa2216fa,0x136f0e8f0ea59886,0x18ef9066ac5f24f1,0x21d1e580f526d}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x185f, 0xecc, 0x21c, 0xa62, 0x77, 0x8b1, 0x1188, 0xec2, 0xda1, 0xbf0, 0xb11, 0x82d, 0x1fe9, 0x10d4, 0x1e36, 0x194e, 0x77e, 0x1112, 0x14c0, 0x1dcd, 0x1be7, 0x1a4c, 0x140e, 0x10c5, 0x1aaf, 0x236, 0xdf3, 0x1a21, 0x1dff, 0x15bb, 0xda8, 0x30e, 0x17b0, 0xc7b, 0xd1, 0xcb, 0x868, 0x2e5, 0x5a} +#elif RADIX == 32 +{0xc2f86ac, 0x421c766, 0xc40eea6, 0x16146211, 0xbf06d0b, 0x505ab11, 0x1b4353fd, 0x17eca778, 0x9811123, 0x6f9fb9b, 0x5a07693, 0x6daaf86, 0x885be62, 0xaddf7ff, 0x30e6d4, 0x1458f77b, 0x34032c1, 0x52a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xeea6210e3b330be1, 0xc1b42ec28c422c40, 0xb4353fd282d588af, 0xda604448efd94ef1, 0xf0c5a0769337cfdc, 0xfbffa216f988db55, 0xb1eef6030e6d456e, 0x120b950d00cb068} +#else +{0x14c421c766617c3, 0x2ec28c422c40ee, 0x1e9416ac457e0da, 0x3bf653bc6d0d4f, 0x66f9fb9b4c0889, 0x8db55f0c5a0769, 0x2b77dffd10b7cc, 0x1a2c7bbd80c39b5, 0x9172a1a01960} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x61a, 0x3b3, 0x1087, 0x1a98, 0x81d, 0x22c, 0x1462, 0xbb0, 0x368, 0xafc, 0xac4, 0xa0b, 0x7fa, 0x1435, 0x178d, 0x1653, 0x11df, 0x444, 0xd30, 0x1f73, 0x6f9, 0x1693, 0xd03, 0x1c31, 0x16ab, 0x188d, 0xb7c, 0x1e88, 0x1f7f, 0x56e, 0x136a, 0xc3, 0x1dec, 0xb1e, 0x1834, 0x32, 0xa1a, 0x10b9, 0xe6} +#elif RADIX == 32 +{0x130d1113, 0x110871d9, 0xb103ba9, 0x1d851884, 0xafc1b42, 0x9416ac4, 0x6d0d4ff, 0x1dfb29de, 0x1a604448, 0x19be7ee6, 0x11681da4, 0x11b6abe1, 0x1a216f98, 0x2b77dff, 0x180c39b5, 0xd163dde, 0x10d00cb0, 0x54a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3ba988438eccc344, 0xf06d0bb0a3108b10, 0x6d0d4ff4a0b5622b, 0x369811123bf653bc, 0x7c31681da4cdf3f7, 0xbeffe885be6236d5, 0x2c7bbd80c39b515b, 0x742e5434032c1a} +#else +{0x15310871d998688, 0x10bb0a3108b103b, 0x1fa505ab115f836, 0x8efd94ef1b4353, 0x99be7ee6d30222, 0x236d57c31681da, 0x8addf7ff442df3, 0x68b1eef6030e6d, 0xe85ca8680658} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0xa5a, 0x2ab, 0x659, 0x149f, 0xf1b, 0xa1a, 0xb05, 0x1915, 0x1aa8, 0x1aa0, 0x1c4d, 0xe2f, 0xe1c, 0x19ab, 0x1d34, 0xa8f, 0xf59, 0x1f1, 0xc6d, 0x520, 0xb6e, 0x127f, 0x5dd, 0x175a, 0x1957, 0x1ca4, 0x1563, 0x122f, 0x705, 0xcd6, 0x1c02, 0xdc1, 0x93b, 0x387, 0x1870, 0x54, 0x853, 0x1adc, 0x6bc} +#elif RADIX == 32 +{0x152d7fc4, 0x1e659155, 0x69e3749, 0x8aac154, 0x1aa0d546, 0x11c5fc4d, 0x1a66adc3, 0x159547f4, 0x18da1f17, 0x1adb8a40, 0x1a2eec9f, 0x149957ba, 0x8beac7c, 0x66b1c16, 0x16dc1e01, 0x1c070e93, 0x2981530, 0xe2} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3749f32c8aad4b5f, 0x83551915582a869e, 0xa66adc38e2fe26ea, 0x63687c5eb2a8fe9, 0xf75a2eec9fd6dc52, 0x8e0b22fab1f2932a, 0xe1d276dc1e01335, 0x196b710a6054c38} +#else +{0x93e659155a96bf, 0x11915582a869e37, 0x1c717f137541aa, 0x17acaa3fa699ab7, 0x1fadb8a40c6d0f8, 0x12932af75a2eec9, 0x99ac705917d58f, 0xe038749db70780, 0x17d6e214c0a98} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x66e, 0xe79, 0xadd, 0x23, 0xf11, 0x7d6, 0x1091, 0x42a, 0x1885, 0x128, 0x6f9, 0xcdd, 0x1d55, 0x19bd, 0x116f, 0x1dbd, 0x107b, 0xaef, 0x8bc, 0xa74, 0x7b5, 0xdff, 0x743, 0x17e0, 0x453, 0x414, 0x672, 0xf28, 0x198a, 0x19c4, 0x1e85, 0xcb9, 0x17c2, 0x14c6, 0x1871, 0x1034, 0x6cb, 0x55b, 0xbf} +#elif RADIX == 32 +{0x13370e29, 0x6add73c, 0x159e2202, 0x154244f, 0x128c429, 0x159ba6f9, 0x17e6f7aa, 0x7bedec5, 0x1178aef8, 0x19ed54e8, 0x3a1b7f, 0x28453bf, 0x1ca0ce44, 0x1ce26629, 0x4cb9f42, 0x1c698d7c, 0x165c0d30, 0x159} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x2202356eb9e4cdc3, 0xa310a42a8489f59e, 0x7e6f7aaacdd37c84, 0x445e2bbe0f7dbd8b, 0x77e03a1b7fcf6aa7, 0x3314f2833910508a, 0xd31af84cb9f42e71, 0xe956cd97034c38} +#else +{0x46add73c99b87, 0xa42a8489f59e22, 0x15566e9be425188, 0x183df6f62df9bde, 0x1f9ed54e88bc577, 0x10508a77e03a1b7, 0x1738998a79419c8, 0xe34c6be132e7d0, 0x22ad9b2e0698} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x165f, 0x1e7c, 0xe41, 0x12eb, 0xa1, 0x1655, 0x6db, 0x1dfc, 0x4a, 0xac7, 0x1dcb, 0x3d9, 0x16a0, 0x562, 0x1d70, 0x528, 0xaa7, 0x172e, 0x36c, 0x728, 0x1e76, 0x23f, 0x6e6, 0x53e, 0x1640, 0x1a82, 0x1b78, 0x1066, 0x895, 0x17eb, 0x1713, 0x174d, 0x679, 0x1415, 0x19a8, 0xe7c, 0x674, 0x1f81, 0x15} +#elif RADIX == 32 +{0xb2f81a0, 0x16e41f3e, 0x1541432e, 0xfe1b6ec, 0xac70257, 0x7b3dcb, 0x18158ad4, 0xa729475, 0x6d972e5, 0x1f9d8e50, 0x1e37308f, 0x10564029, 0x19b6f1a, 0x1bf5a256, 0x1374db89, 0xa282a67, 0x13a39f33, 0xc09} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x432eb720f9f2cbe0, 0x1c095dfc36dd9541, 0x8158ad403d9ee5ab, 0x81b65cb954e528eb, 0x53e37308ffcec72, 0xd12b066dbc6a0ac8, 0x5054cf374db89dfa, 0xafe04ce8e7ccd4} +#else +{0x5d6e41f3e597c0, 0x15dfc36dd954143, 0xa01ecf72d58e04, 0x55394a3ae0562b, 0x1ff9d8e5036cb97, 0xa0ac8053e37308, 0xefd68958336de3, 0x15141533cdd36e2, 0x15fc099d1cf99} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1e32, 0x1f7c, 0x1c05, 0x372, 0x34a, 0x1d26, 0x11b9, 0x294, 0xa87, 0x1835, 0x158f, 0x1d19, 0x13e8, 0x4dc, 0x1e1a, 0x195f, 0x116e, 0x62c, 0x1839, 0x107a, 0xa4f, 0x119f, 0x18f3, 0xc48, 0x1c7a, 0x100d, 0x2e9, 0x12df, 0xbec, 0x6f1, 0x8bf, 0xe24, 0xa57, 0x50c, 0x28b, 0x31e, 0x430, 0x1b08, 0x378} +#elif RADIX == 32 +{0xf1941d7, 0x5c05fbe, 0x9869437, 0x14a46e7a, 0x18355438, 0x3a3358f, 0xd13727d, 0x16ecaff8, 0x107262c8, 0x1a93e0f5, 0x8c79c67, 0x1bc7a62, 0xb7c5d30, 0x1378afb2, 0xee2445f, 0x2ca18a5, 0x180c785, 0x1c1} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x94372e02fdf3c650, 0xd550e2948dcf4986, 0xd13727d1d19ac7e0, 0xac1c98b22dd95ff0, 0x4c48c79c67d49f07, 0x57d92df174c0378f, 0x94314aee2445f9bc, 0xc6c2086031e145} +#else +{0x6e5c05fbe78ca0, 0xe2948dcf498694, 0x1e8e8cd63f06aa8, 0x8b7657fc344dc9, 0xfa93e0f5839316, 0x378f4c48c79c6, 0x1cde2bec96f8ba6, 0x11650c52bb89117, 0x18d8410c063c2} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1044, 0x2d0, 0x1004, 0x1082, 0x535, 0x141a, 0x10a6, 0x1f9d, 0xc2d, 0x1347, 0xdf4, 0x1db1, 0x90e, 0x116d, 0x59c, 0xc2b, 0x7c2, 0x15d7, 0x119, 0x32c, 0x1e89, 0x1b01, 0xe5f, 0x105f, 0xd7d, 0xb4f, 0x1c33, 0x1b3b, 0xf2d, 0xc22, 0x11d8, 0x1848, 0x11a9, 0x1ee7, 0x6ea, 0x165d, 0x17d4, 0x77, 0x64b} +#elif RADIX == 32 +{0x8227755, 0x5004168, 0x68a6b08, 0x1cec29a8, 0x1347616f, 0x1bb62df4, 0xe45b521, 0x1c261596, 0x2335d73, 0xfa24658, 0x1f72fec0, 0x9ed7d82, 0xcef866b, 0x6113cb7, 0x138488ec, 0x1abdcf1a, 0x1ea5974d, 0x83d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6b0828020b42089d, 0x1d85bf9d8535068a, 0xe45b521ddb16fa4d, 0xc08cd75cf84c2b2c, 0xb05f72fec07d1232, 0x9e5bb3be19ad3daf, 0x7b9e3538488ec308, 0x1681defa965d375} +#else +{0x1050041684113b, 0x1bf9d8535068a6b, 0x10eed8b7d268ec2, 0x13e130acb3916d4, 0xfa24658119aeb, 0xd3dafb05f72fec, 0x1844f2dd9df0cd, 0x1d5ee78d4e1223b, 0x1203bdf52cba6} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x7bc, 0x14d4, 0x1225, 0x1afb, 0x179e, 0x2c0, 0x1c0, 0x1267, 0x450, 0x1f26, 0x1e3f, 0x2bb, 0x19a5, 0x12f9, 0xa57, 0x2d, 0x1ed, 0xa16, 0x754, 0x1893, 0x759, 0x6bb, 0x618, 0x1379, 0xff3, 0x1989, 0x1abb, 0x1c40, 0x1bf5, 0x71e, 0xd6d, 0xc04, 0x15ef, 0x6aa, 0x4da, 0x1fb6, 0xb5b, 0x9f2, 0x211} +#elif RADIX == 32 +{0x3de2735, 0x17225a6a, 0x102f3daf, 0x13387005, 0x1f262284, 0x14577e3f, 0xbcbe734, 0x1ed016a9, 0xea8a160, 0x19d67126, 0x1930c1ae, 0x112ff39b, 0x11035779, 0x138f6fd7, 0x1ec046b6, 0x168d555e, 0x1adfed89, 0x412} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3dafb912d350f789, 0x988a12670e00b02f, 0xbcbe734a2bbf1ffc, 0x33aa28583da02d52, 0x737930c1aeceb389, 0xb7ebc40d5de625fe, 0x1aaabdec046b69c7, 0x15a7c96b7fb626d} +#else +{0x15f7225a6a1ef13, 0x12670e00b02f3d, 0x1a515df8ffe4c45, 0xf680b54af2f9c, 0x1d9d6712675450b, 0x625fe737930c1a, 0x14e3dbf5e206aef, 0x1b46aaaf7b011ad, 0x104f92d6ff6c4} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5b0b,0xfec,0x3254,0x9d11,0x8130,0x32bb,0x65ca,0x86b8,0x8184,0xfce7,0x3cc3,0x667c,0xa54b,0x4e65,0x271e,0x9834,0xa9c,0x1d81,0x5e0d,0x45fd,0x26eb,0x4b0b,0x5f8f,0x7e57,0xd36f,0xcb4c,0x56b4,0xe984,0xad75,0xcfdf,0x59a1,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfec5b0b,0x9d113254,0x32bb8130,0x86b865ca,0xfce78184,0x667c3cc3,0x4e65a54b,0x9834271e,0x1d810a9c,0x45fd5e0d,0x4b0b26eb,0x7e575f8f,0xcb4cd36f,0xe98456b4,0xcfdfad75,0xb59a1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9d1132540fec5b0b,0x86b865ca32bb8130,0x667c3cc3fce78184,0x9834271e4e65a54b,0x45fd5e0d1d810a9c,0x7e575f8f4b0b26eb,0xe98456b4cb4cd36f,0xb59a1cfdfad75}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2bba,0x15e8,0x1c2b,0x55ed,0xb72c,0xb3cc,0x3a5c,0xb409,0x2f3d,0x71b,0xd365,0x90a1,0xb2f5,0x1e26,0xbe0,0xa633,0xc5a6,0xe2bd,0xe0e3,0x49b3,0xd4c8,0x9f1c,0x9ba3,0x3674,0x2e5a,0x5411,0xc603,0xcdd3,0xfb23,0x2e7e,0x88a,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x15e82bba,0x55ed1c2b,0xb3ccb72c,0xb4093a5c,0x71b2f3d,0x90a1d365,0x1e26b2f5,0xa6330be0,0xe2bdc5a6,0x49b3e0e3,0x9f1cd4c8,0x36749ba3,0x54112e5a,0xcdd3c603,0x2e7efb23,0x4088a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x55ed1c2b15e82bba,0xb4093a5cb3ccb72c,0x90a1d365071b2f3d,0xa6330be01e26b2f5,0x49b3e0e3e2bdc5a6,0x36749ba39f1cd4c8,0xcdd3c60354112e5a,0x4088a2e7efb23}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa8e5,0xb5b7,0x12fc,0x2365,0x6f00,0x2267,0x5260,0x5ece,0xbf38,0x93ee,0xfcde,0xe5b3,0x9f9,0x712a,0x1770,0xdd48,0xdd27,0x5350,0xb7f5,0xbdf,0x46a4,0x7cb4,0xe6a9,0xca36,0x8565,0x3c9,0xe43b,0x3713,0x4fe2,0xeeb1,0x806a,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb5b7a8e5,0x236512fc,0x22676f00,0x5ece5260,0x93eebf38,0xe5b3fcde,0x712a09f9,0xdd481770,0x5350dd27,0xbdfb7f5,0x7cb446a4,0xca36e6a9,0x3c98565,0x3713e43b,0xeeb14fe2,0x4806a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x236512fcb5b7a8e5,0x5ece526022676f00,0xe5b3fcde93eebf38,0xdd481770712a09f9,0xbdfb7f55350dd27,0xca36e6a97cb446a4,0x3713e43b03c98565,0x4806aeeb14fe2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa4f5,0xf013,0xcdab,0x62ee,0x7ecf,0xcd44,0x9a35,0x7947,0x7e7b,0x318,0xc33c,0x9983,0x5ab4,0xb19a,0xd8e1,0x67cb,0xf563,0xe27e,0xa1f2,0xba02,0xd914,0xb4f4,0xa070,0x81a8,0x2c90,0x34b3,0xa94b,0x167b,0x528a,0x3020,0xa65e,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf013a4f5,0x62eecdab,0xcd447ecf,0x79479a35,0x3187e7b,0x9983c33c,0xb19a5ab4,0x67cbd8e1,0xe27ef563,0xba02a1f2,0xb4f4d914,0x81a8a070,0x34b32c90,0x167ba94b,0x3020528a,0x4a65e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x62eecdabf013a4f5,0x79479a35cd447ecf,0x9983c33c03187e7b,0x67cbd8e1b19a5ab4,0xba02a1f2e27ef563,0x81a8a070b4f4d914,0x167ba94b34b32c90,0x4a65e3020528a}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbdde,0x1bf3,0x7bc0,0xcae7,0x8d2e,0x58a8,0x4b1a,0xbcb8,0xccd9,0x3d98,0xfcf2,0x4881,0x66f8,0x3473,0x2e8a,0x730d,0xabbf,0x4789,0xdce9,0x58ea,0xf54,0x6169,0x58d0,0x3280,0xe1f9,0x5bd0,0x67a0,0x23d2,0x2611,0x18e1,0xd51f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1bf3bdde,0xcae77bc0,0x58a88d2e,0xbcb84b1a,0x3d98ccd9,0x4881fcf2,0x347366f8,0x730d2e8a,0x4789abbf,0x58eadce9,0x61690f54,0x328058d0,0x5bd0e1f9,0x23d267a0,0x18e12611,0x7d51f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcae77bc01bf3bdde,0xbcb84b1a58a88d2e,0x4881fcf23d98ccd9,0x730d2e8a347366f8,0x58eadce94789abbf,0x328058d061690f54,0x23d267a05bd0e1f9,0x7d51f18e12611}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xee54,0xe36f,0x939d,0xea02,0xe6db,0xa7ae,0x9f39,0x8bb3,0x7f02,0xf594,0xa9ab,0xae5e,0x9a76,0x7fc0,0xd9a,0xbecd,0x692d,0x8b68,0x30f4,0xff9a,0xd1ae,0xfd43,0xbdfc,0xc552,0xfe0d,0xa4bf,0x33e5,0x981b,0x202c,0x45e8,0x8573,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe36fee54,0xea02939d,0xa7aee6db,0x8bb39f39,0xf5947f02,0xae5ea9ab,0x7fc09a76,0xbecd0d9a,0x8b68692d,0xff9a30f4,0xfd43d1ae,0xc552bdfc,0xa4bffe0d,0x981b33e5,0x45e8202c,0xc8573}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xea02939de36fee54,0x8bb39f39a7aee6db,0xae5ea9abf5947f02,0xbecd0d9a7fc09a76,0xff9a30f48b68692d,0xc552bdfcfd43d1ae,0x981b33e5a4bffe0d,0xc857345e8202c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5eb9,0x2393,0xd8e8,0xc566,0xd78,0xa77f,0x1bf1,0x4577,0x3141,0xecd3,0x132c,0x281,0x13b5,0x1d34,0xb4bb,0xf25,0xdc3,0xbf86,0x5e9f,0xde50,0xf536,0xe95e,0xd5b0,0x687d,0x3ab,0x992c,0xdb8d,0xc8cc,0xfaf0,0xd954,0x6e1a,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x23935eb9,0xc566d8e8,0xa77f0d78,0x45771bf1,0xecd33141,0x281132c,0x1d3413b5,0xf25b4bb,0xbf860dc3,0xde505e9f,0xe95ef536,0x687dd5b0,0x992c03ab,0xc8ccdb8d,0xd954faf0,0x56e1a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc566d8e823935eb9,0x45771bf1a77f0d78,0x281132cecd33141,0xf25b4bb1d3413b5,0xde505e9fbf860dc3,0x687dd5b0e95ef536,0xc8ccdb8d992c03ab,0x56e1ad954faf0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf17c,0xf7a8,0xd9f7,0x1544,0xb2c8,0xf5aa,0x3812,0x3fba,0xf63e,0xb545,0x678c,0xad77,0xed9f,0x12f8,0xa5dc,0x74c9,0xec1d,0xc1e0,0x806f,0x14a0,0xfb25,0x34f3,0x606c,0x57d5,0x9733,0x9c8c,0x83e3,0xa787,0x7cae,0x503b,0x2499,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf7a8f17c,0x1544d9f7,0xf5aab2c8,0x3fba3812,0xb545f63e,0xad77678c,0x12f8ed9f,0x74c9a5dc,0xc1e0ec1d,0x14a0806f,0x34f3fb25,0x57d5606c,0x9c8c9733,0xa78783e3,0x503b7cae,0x12499}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1544d9f7f7a8f17c,0x3fba3812f5aab2c8,0xad77678cb545f63e,0x74c9a5dc12f8ed9f,0x14a0806fc1e0ec1d,0x57d5606c34f3fb25,0xa78783e39c8c9733,0x12499503b7cae}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5d83,0x57ac,0xb73f,0xb74d,0x1869,0x3588,0x43,0x915,0x7f31,0x82eb,0x4487,0xb830,0x6627,0x70a7,0x9911,0x5646,0x4779,0xe113,0x168c,0x925d,0xc1e8,0xd347,0xa95e,0xd5a6,0x7deb,0xbeb,0x72,0xf755,0x306,0x9ee2,0x7ef9,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x57ac5d83,0xb74db73f,0x35881869,0x9150043,0x82eb7f31,0xb8304487,0x70a76627,0x56469911,0xe1134779,0x925d168c,0xd347c1e8,0xd5a6a95e,0xbeb7deb,0xf7550072,0x9ee20306,0x27ef9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb74db73f57ac5d83,0x915004335881869,0xb830448782eb7f31,0x5646991170a76627,0x925d168ce1134779,0xd5a6a95ed347c1e8,0xf75500720beb7deb,0x27ef99ee20306}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa147,0xdc6c,0x2717,0x3a99,0xf287,0x5880,0xe40e,0xba88,0xcebe,0x132c,0xecd3,0xfd7e,0xec4a,0xe2cb,0x4b44,0xf0da,0xf23c,0x4079,0xa160,0x21af,0xac9,0x16a1,0x2a4f,0x9782,0xfc54,0x66d3,0x2472,0x3733,0x50f,0x26ab,0x91e5,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdc6ca147,0x3a992717,0x5880f287,0xba88e40e,0x132ccebe,0xfd7eecd3,0xe2cbec4a,0xf0da4b44,0x4079f23c,0x21afa160,0x16a10ac9,0x97822a4f,0x66d3fc54,0x37332472,0x26ab050f,0xa91e5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3a992717dc6ca147,0xba88e40e5880f287,0xfd7eecd3132ccebe,0xf0da4b44e2cbec4a,0x21afa1604079f23c,0x97822a4f16a10ac9,0x3733247266d3fc54,0xa91e526ab050f}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5b0b,0xfec,0x3254,0x9d11,0x8130,0x32bb,0x65ca,0x86b8,0x8184,0xfce7,0x3cc3,0x667c,0xa54b,0x4e65,0x271e,0x9834,0xa9c,0x1d81,0x5e0d,0x45fd,0x26eb,0x4b0b,0x5f8f,0x7e57,0xd36f,0xcb4c,0x56b4,0xe984,0xad75,0xcfdf,0x59a1,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfec5b0b,0x9d113254,0x32bb8130,0x86b865ca,0xfce78184,0x667c3cc3,0x4e65a54b,0x9834271e,0x1d810a9c,0x45fd5e0d,0x4b0b26eb,0x7e575f8f,0xcb4cd36f,0xe98456b4,0xcfdfad75,0xb59a1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9d1132540fec5b0b,0x86b865ca32bb8130,0x667c3cc3fce78184,0x9834271e4e65a54b,0x45fd5e0d1d810a9c,0x7e575f8f4b0b26eb,0xe98456b4cb4cd36f,0xb59a1cfdfad75}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2bba,0x15e8,0x1c2b,0x55ed,0xb72c,0xb3cc,0x3a5c,0xb409,0x2f3d,0x71b,0xd365,0x90a1,0xb2f5,0x1e26,0xbe0,0xa633,0xc5a6,0xe2bd,0xe0e3,0x49b3,0xd4c8,0x9f1c,0x9ba3,0x3674,0x2e5a,0x5411,0xc603,0xcdd3,0xfb23,0x2e7e,0x88a,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x15e82bba,0x55ed1c2b,0xb3ccb72c,0xb4093a5c,0x71b2f3d,0x90a1d365,0x1e26b2f5,0xa6330be0,0xe2bdc5a6,0x49b3e0e3,0x9f1cd4c8,0x36749ba3,0x54112e5a,0xcdd3c603,0x2e7efb23,0x4088a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x55ed1c2b15e82bba,0xb4093a5cb3ccb72c,0x90a1d365071b2f3d,0xa6330be01e26b2f5,0x49b3e0e3e2bdc5a6,0x36749ba39f1cd4c8,0xcdd3c60354112e5a,0x4088a2e7efb23}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa8e5,0xb5b7,0x12fc,0x2365,0x6f00,0x2267,0x5260,0x5ece,0xbf38,0x93ee,0xfcde,0xe5b3,0x9f9,0x712a,0x1770,0xdd48,0xdd27,0x5350,0xb7f5,0xbdf,0x46a4,0x7cb4,0xe6a9,0xca36,0x8565,0x3c9,0xe43b,0x3713,0x4fe2,0xeeb1,0x806a,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb5b7a8e5,0x236512fc,0x22676f00,0x5ece5260,0x93eebf38,0xe5b3fcde,0x712a09f9,0xdd481770,0x5350dd27,0xbdfb7f5,0x7cb446a4,0xca36e6a9,0x3c98565,0x3713e43b,0xeeb14fe2,0x4806a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x236512fcb5b7a8e5,0x5ece526022676f00,0xe5b3fcde93eebf38,0xdd481770712a09f9,0xbdfb7f55350dd27,0xca36e6a97cb446a4,0x3713e43b03c98565,0x4806aeeb14fe2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa4f5,0xf013,0xcdab,0x62ee,0x7ecf,0xcd44,0x9a35,0x7947,0x7e7b,0x318,0xc33c,0x9983,0x5ab4,0xb19a,0xd8e1,0x67cb,0xf563,0xe27e,0xa1f2,0xba02,0xd914,0xb4f4,0xa070,0x81a8,0x2c90,0x34b3,0xa94b,0x167b,0x528a,0x3020,0xa65e,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf013a4f5,0x62eecdab,0xcd447ecf,0x79479a35,0x3187e7b,0x9983c33c,0xb19a5ab4,0x67cbd8e1,0xe27ef563,0xba02a1f2,0xb4f4d914,0x81a8a070,0x34b32c90,0x167ba94b,0x3020528a,0x4a65e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x62eecdabf013a4f5,0x79479a35cd447ecf,0x9983c33c03187e7b,0x67cbd8e1b19a5ab4,0xba02a1f2e27ef563,0x81a8a070b4f4d914,0x167ba94b34b32c90,0x4a65e3020528a}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdeef,0xdf9,0xbde0,0x6573,0x4697,0x2c54,0x258d,0xde5c,0x666c,0x1ecc,0xfe79,0x2440,0xb37c,0x1a39,0x9745,0xb986,0xd5df,0xa3c4,0x6e74,0x2c75,0x87aa,0x30b4,0x2c68,0x9940,0x70fc,0x2de8,0x33d0,0x91e9,0x9308,0x8c70,0xea8f,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf9deef,0x6573bde0,0x2c544697,0xde5c258d,0x1ecc666c,0x2440fe79,0x1a39b37c,0xb9869745,0xa3c4d5df,0x2c756e74,0x30b487aa,0x99402c68,0x2de870fc,0x91e933d0,0x8c709308,0xbea8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6573bde00df9deef,0xde5c258d2c544697,0x2440fe791ecc666c,0xb98697451a39b37c,0x2c756e74a3c4d5df,0x99402c6830b487aa,0x91e933d02de870fc,0xbea8f8c709308}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf72a,0xf1b7,0x49ce,0xf501,0x736d,0xd3d7,0xcf9c,0x45d9,0x3f81,0xfaca,0x54d5,0x572f,0x4d3b,0x3fe0,0x86cd,0xdf66,0x3496,0x45b4,0x187a,0x7fcd,0xe8d7,0x7ea1,0x5efe,0xe2a9,0xff06,0xd25f,0x99f2,0x4c0d,0x1016,0xa2f4,0x42b9,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1b7f72a,0xf50149ce,0xd3d7736d,0x45d9cf9c,0xfaca3f81,0x572f54d5,0x3fe04d3b,0xdf6686cd,0x45b43496,0x7fcd187a,0x7ea1e8d7,0xe2a95efe,0xd25fff06,0x4c0d99f2,0xa2f41016,0xe42b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf50149cef1b7f72a,0x45d9cf9cd3d7736d,0x572f54d5faca3f81,0xdf6686cd3fe04d3b,0x7fcd187a45b43496,0xe2a95efe7ea1e8d7,0x4c0d99f2d25fff06,0xe42b9a2f41016}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x6f0b,0x3478,0x5aeb,0x64,0x9a1a,0xecff,0xccf0,0x2fab,0xf3a8,0x718a,0x97e7,0xc31a,0xa0cd,0xb872,0x514e,0x5ee1,0x4b79,0x4af9,0xd0c3,0x97c6,0x9591,0x2370,0xa987,0xa5e6,0xe201,0x8730,0x3150,0x1980,0x8452,0x3b83,0x25c9,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x34786f0b,0x645aeb,0xecff9a1a,0x2fabccf0,0x718af3a8,0xc31a97e7,0xb872a0cd,0x5ee1514e,0x4af94b79,0x97c6d0c3,0x23709591,0xa5e6a987,0x8730e201,0x19803150,0x3b838452,0xb25c9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x645aeb34786f0b,0x2fabccf0ecff9a1a,0xc31a97e7718af3a8,0x5ee1514eb872a0cd,0x97c6d0c34af94b79,0xa5e6a98723709591,0x198031508730e201,0xb25c93b838452}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1de7,0x7f69,0xdefe,0xfc6b,0x6fd5,0xc100,0x5188,0x1318,0x416e,0x10dd,0x33ac,0x4260,0x8985,0x1d0e,0x5b13,0xd02e,0x6fb5,0x6e28,0x9b7d,0x4f72,0x9665,0xd5f3,0xf00d,0xda5f,0x98f2,0xd778,0x4b2a,0x958d,0xfcef,0xd837,0x4a93,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7f691de7,0xfc6bdefe,0xc1006fd5,0x13185188,0x10dd416e,0x426033ac,0x1d0e8985,0xd02e5b13,0x6e286fb5,0x4f729b7d,0xd5f39665,0xda5ff00d,0xd77898f2,0x958d4b2a,0xd837fcef,0x34a93}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xfc6bdefe7f691de7,0x13185188c1006fd5,0x426033ac10dd416e,0xd02e5b131d0e8985,0x4f729b7d6e286fb5,0xda5ff00dd5f39665,0x958d4b2ad77898f2,0x34a93d837fcef}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x8527,0x81f3,0xcb8f,0x5e0d,0x7c93,0x7448,0x613,0xedcf,0x7d31,0x77c7,0x19dc,0x8ace,0xbfb8,0xa582,0x9ccc,0x28df,0xb6e0,0x4f69,0x33e6,0x546b,0xcfb2,0x1627,0x53ed,0xdc8d,0xd80b,0xb843,0xc438,0xb942,0x8fb5,0xb3c0,0xc1dc,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x81f38527,0x5e0dcb8f,0x74487c93,0xedcf0613,0x77c77d31,0x8ace19dc,0xa582bfb8,0x28df9ccc,0x4f69b6e0,0x546b33e6,0x1627cfb2,0xdc8d53ed,0xb843d80b,0xb942c438,0xb3c08fb5,0x2c1dc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5e0dcb8f81f38527,0xedcf061374487c93,0x8ace19dc77c77d31,0x28df9ccca582bfb8,0x546b33e64f69b6e0,0xdc8d53ed1627cfb2,0xb942c438b843d80b,0x2c1dcb3c08fb5}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x90f5,0xcb87,0xa514,0xff9b,0x65e5,0x1300,0x330f,0xd054,0xc57,0x8e75,0x6818,0x3ce5,0x5f32,0x478d,0xaeb1,0xa11e,0xb486,0xb506,0x2f3c,0x6839,0x6a6e,0xdc8f,0x5678,0x5a19,0x1dfe,0x78cf,0xceaf,0xe67f,0x7bad,0xc47c,0xda36,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcb8790f5,0xff9ba514,0x130065e5,0xd054330f,0x8e750c57,0x3ce56818,0x478d5f32,0xa11eaeb1,0xb506b486,0x68392f3c,0xdc8f6a6e,0x5a195678,0x78cf1dfe,0xe67fceaf,0xc47c7bad,0x4da36}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xff9ba514cb8790f5,0xd054330f130065e5,0x3ce568188e750c57,0xa11eaeb1478d5f32,0x68392f3cb506b486,0x5a195678dc8f6a6e,0xe67fceaf78cf1dfe,0x4da36c47c7bad}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x14d5, 0x1163, 0xf47, 0x337, 0x71e, 0x4ad, 0x1071, 0x19d4, 0x11d9, 0xdce, 0x186a, 0x1785, 0x13c8, 0x695, 0xe1b, 0x54b, 0x174f, 0xd0c, 0x17cb, 0x17db, 0xb41, 0xb78, 0x1a46, 0x66f, 0x23, 0x836, 0x19ce, 0xcdf, 0x90b, 0x6fb, 0x1508, 0x1bb5, 0x6aa, 0x1219, 0x1bba, 0x1d67, 0x1e46, 0x8d8, 0x62c} +#elif RADIX == 32 +{0x1a6af50e, 0xef478b1, 0xb4e3c33, 0xea41c49, 0xdce8ece, 0x2f0b86a, 0xd9a5679, 0x14f2a5b8, 0xf96d0cb, 0x2d06fb7, 0xfd232de, 0x6c02333, 0x137f39c8, 0x37da42d, 0x15bb5a84, 0xea4326a, 0x123759f7, 0x9c7} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x3c3377a3c58e9abd, 0x3a3b39d483892b4e, 0xd9a56791785c3537, 0xbbe5b432e9e54b70, 0x666fd232de16837d, 0xd216cdfce720d804, 0x4864d55bb5a841be, 0x72363c8dd67ddd} +#else +{0x66ef478b1d357a, 0x139d483892b4e3c, 0x1c8bc2e1a9b9d1d, 0xba7952dc366959, 0x1c2d06fb77cb686, 0xd804666fd232d, 0xdf690b66fe739, 0x1752193556ed6a1, 0xe46c791bacfb} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1d37, 0x1c58, 0x1bd1, 0x10cd, 0x9c7, 0x92b, 0x41c, 0xe75, 0x1476, 0x1373, 0xe1a, 0x5e1, 0xcf2, 0x19a5, 0x1b86, 0x1952, 0x5d3, 0x1b43, 0x1df2, 0xdf6, 0x2d0, 0x12de, 0x1e91, 0x199b, 0x1008, 0x120d, 0x1e73, 0x1b37, 0x1a42, 0x1be, 0xd42, 0x16ed, 0x9aa, 0x1486, 0x1eee, 0x1759, 0x791, 0x236, 0x5bb} +#elif RADIX == 32 +{0xe9becab, 0x1bbd1e2c, 0xad38f0c, 0x13a90712, 0x1373a3b3, 0x8bc2e1a, 0x366959e, 0x1d3ca96e, 0x1be5b432, 0x10b41bed, 0x1bf48cb7, 0x1b008cc, 0xcdfce72, 0xdf690b, 0x156ed6a1, 0x1ba90c9a, 0x1c8dd67d, 0xd31} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x8f0cdde8f163a6fb, 0xce8ece7520e24ad3, 0x366959e45e170d4d, 0x6ef96d0cba7952dc, 0x199bf48cb785a0df, 0xb485b37f39c83601, 0x52193556ed6a106f, 0x488d8f23759f77} +#else +{0x19bbd1e2c74df6, 0xce7520e24ad38f, 0xf22f0b86a6e747, 0x12e9e54b70d9a56, 0xf0b41beddf2da1, 0x83601199bf48cb, 0x837da42d9bf9ce, 0x1dd4864d55bb5a8, 0x911b1e46eb3e} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x8f6, 0xe30, 0x75, 0xaf7, 0xb3c, 0x1672, 0x1e05, 0x157a, 0x16b1, 0x1fd, 0x3c2, 0x114d, 0x1000, 0x1b4f, 0x1f37, 0xc0e, 0xdd, 0x4de, 0xdff, 0x55e, 0x1a2f, 0x353, 0xc4a, 0x1225, 0x9ed, 0x9ff, 0x1493, 0x18e6, 0x96c, 0x163c, 0xa76, 0x1c78, 0x11b4, 0x1087, 0x1519, 0xc82, 0x3e0, 0x7d4, 0xf5} +#elif RADIX == 32 +{0x47b122a, 0xe075718, 0x1c9678af, 0xbd7816c, 0x1fdb58d, 0x229a3c2, 0x1bed3e00, 0xdd6077c, 0x1bfe4de0, 0x1e8bcabc, 0x56250d4, 0x1fe9ed91, 0x39a9269, 0xb1e25b3, 0x9c7853b, 0x6610f1b, 0x1f0320aa, 0x7a0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x78af703ab8c11ec4, 0xf6d6357af02d9c96, 0xbed3e00114d1e107, 0xe6ff93781bac0ef9, 0xb2256250d4f45e55, 0x12d98e6a49a7fd3d, 0xc21e369c7853b58f, 0xe9f507c0c82a8c} +#else +{0x15ee07571823d89, 0x357af02d9c9678, 0x8a68f083fb6b, 0x6eb03be6fb4f8, 0x9e8bcabcdff26f, 0x7fd3db2256250d, 0x1ac7896cc73524d, 0x330878da71e14e, 0x23ea0f819055} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1227, 0x1240, 0x423, 0xd84, 0x1dc1, 0x982, 0x1cb3, 0x14e1, 0x16eb, 0x1409, 0xf49, 0xec8, 0x888, 0xe0b, 0x1c45, 0x176, 0x49e, 0x1d40, 0x1e6b, 0x7a3, 0xfba, 0x175f, 0x1908, 0xb88, 0x168c, 0x1324, 0x159f, 0x1077, 0xac3, 0x10b4, 0x478, 0x240, 0x1682, 0x14f, 0x1599, 0x152f, 0x1197, 0xad5, 0x133} +#elif RADIX == 32 +{0x91396c4, 0x8423920, 0xbb82d8, 0x70f2cd3, 0x1409b75d, 0x1d90f49, 0x2b82d11, 0x9e0bb71, 0x1cd7d402, 0x1bee8f47, 0x8c845d7, 0x4968c5c, 0x1deb3f3, 0x85a2b0e, 0x424023c, 0x6429f68, 0xcbd4beb, 0xac} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x82d84211c90244e5, 0x26dd74e1e59a60bb, 0x2b82d110ec87a4d0, 0x3f35f50093c176e2, 0x8b88c845d7df747a, 0x1587077acfcc92d1, 0x853ed0424023c42d, 0x12ab5632f52facc} +#else +{0x1b08423920489cb, 0x174e1e59a60bb82, 0x887643d268136e, 0x24f05db88ae0b4, 0xfbee8f47e6bea0, 0xc92d18b88c845d, 0x2168ac383bd67e, 0x13214fb4109008f, 0xa56ac65ea5f5} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1544, 0x1dea, 0x162d, 0x73d, 0x6d1, 0x1511, 0x5f2, 0x275, 0x1aff, 0x1c7, 0x1d84, 0x1875, 0x10df, 0x2e0, 0x70b, 0x9eb, 0x897, 0xf0f, 0xa5d, 0xf38, 0x108c, 0x1c12, 0x1649, 0x1849, 0x9b8, 0x2bc, 0x1b0, 0xd0e, 0xfdb, 0x8ee, 0x1b0b, 0x1fdc, 0xc1, 0x1771, 0x1776, 0xa12, 0x1392, 0xd10, 0x618} +#elif RADIX == 32 +{0xaa27395, 0x1b62def5, 0x44da273, 0x13a97caa, 0x1c7d7f8, 0x1f0ebd84, 0x58b821b, 0x974f59c, 0x14baf0f4, 0x14231e70, 0x9b24f04, 0x1789b8c2, 0x14383602, 0x14773f6d, 0x3fdcd85, 0x1daee20c, 0x1c9284ae, 0xd04} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xa273db16f7aaa89c, 0x1f5fe2752f95444d, 0x58b821bf875ec207, 0x852ebc3d12e9eb38, 0x1849b24f04a118f3, 0x9fb6d0e0d80af137, 0x5dc4183fdcd85a3b, 0x183442724a12bbb} +#else +{0xe7b62def555139, 0x1e2752f95444da2, 0xdfc3af61038faf, 0x144ba7ace162e08, 0x94231e70a5d787, 0xaf1371849b24f0, 0xd1dcfdb68706c0, 0xed771060ff7361, 0x156884e494257} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1756, 0x1187, 0x608, 0x637, 0x5c5, 0x459, 0x12f2, 0x9a1, 0x314, 0xe7f, 0x1c73, 0x27f, 0xa8d, 0x17f8, 0x1e33, 0x1878, 0x1c21, 0x123b, 0xb76, 0x7ea, 0x157, 0x16b4, 0xad7, 0x413, 0x56e, 0x4f3, 0x881, 0x1319, 0x1cc3, 0x1813, 0x1575, 0x1f0, 0x13f9, 0x1ef4, 0x8ae, 0x17c8, 0xd48, 0x157d, 0x5ea} +#elif RADIX == 32 +{0x1bab7032, 0xe6088c3, 0x164b8a63, 0xd0cbc88, 0xe7f18a2, 0x144ffc73, 0x19dfe151, 0x21c3c78, 0x16ed23be, 0x55cfd4, 0x1356bdad, 0x1e656e20, 0xc651024, 0x1c09f30e, 0x121f0aba, 0xbbde93f, 0xa45f211, 0x8eb} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x8a637304461eeadc, 0xfc6289a19791164b, 0x9dfe151a27fe39b9, 0xa5bb48ef843878f1, 0xc41356bdad02ae7e, 0xf98731944093ccad, 0x7bd27f21f0abae04, 0x155f5a917c8457} +#else +{0xc6e6088c3dd5b8, 0x89a19791164b8a, 0x8d13ff1cdcfe31, 0x1e10e1e3c677f85, 0x1a055cfd4b7691d, 0x13ccadc41356bda, 0x17027cc398ca204, 0x15def49fc87c2ae, 0x2abeb522f908} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0xbba, 0x1eb6, 0x49a, 0x12a5, 0x12d2, 0x30a, 0x172f, 0x174d, 0x1231, 0x1036, 0x122e, 0x158, 0x743, 0xf10, 0x1e52, 0x18c7, 0x152e, 0x13b1, 0x7ae, 0x128d, 0x9c4, 0x848, 0x4, 0x1e64, 0x1e6f, 0x10ca, 0x3d4, 0x164, 0x1c8, 0x3e2, 0x4e8, 0x27b, 0x1d32, 0x1cc2, 0x1c60, 0x7a8, 0x13df, 0x1f6b, 0x6ad} +#elif RADIX == 32 +{0x5dd7eaa, 0xa49af5b, 0x2a5a52a, 0x1a6dcbc6, 0x1036918d, 0xc2b122e, 0x93c40e8, 0x12ec63f9, 0xf5d3b1a, 0x271251a, 0x4002212, 0x195e6ff3, 0x5907a90, 0x1f10720, 0x427b274, 0x183985d3, 0x1ef9ea38, 0x45c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xa52a524d7ad9775f, 0xda46374db978c2a5, 0x93c40e8615891740, 0xd3d74ec6a5d8c7f2, 0xfe64002212138928, 0x83901641ea432bcd, 0x730ba6427b2740f8, 0x11fdae7be7a8e30} +#else +{0x54a49af5b2eebf, 0x374db978c2a5a5, 0x1430ac48ba06d23, 0x1a97631fca4f103, 0x4271251a7ae9d8, 0x32bcdfe6400221, 0x7c41c80b20f52, 0xc1cc2e9909ec9d, 0x8fb5cf7cf51c} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1d5e, 0x18e6, 0xc97, 0x1db2, 0x9df, 0x19d3, 0x1564, 0x1a3a, 0x90, 0xea5, 0xd74, 0x19fc, 0xf84, 0xadd, 0x2e5, 0x10bb, 0x183f, 0x1334, 0xa50, 0x54b, 0xd22, 0x1295, 0xf11, 0xfa1, 0x1810, 0xa3, 0xa81, 0x1026, 0x2b2, 0x19ee, 0x1a4a, 0xf8a, 0xfb3, 0x1463, 0x19c5, 0x42c, 0x830, 0x562, 0x3db} +#elif RADIX == 32 +{0xeaf491f, 0x4c97c73, 0x14d3bfdb, 0x11d55933, 0xea50486, 0x133f8d74, 0x12ab75f0, 0x3f85d8b, 0x14a1334c, 0xb488a96, 0x1788ca5, 0x1478107d, 0x995020, 0xcf70aca, 0x6f8ad25, 0x1168c6fb, 0x1810b33, 0x892} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xbfdb264be39babd2, 0x94121a3aab2674d3, 0x2ab75f099fc6ba3a, 0xb5284cd307f0bb17, 0xfa1788ca55a4454, 0x8565026540828f02, 0xd18df66f8ad2567b, 0x7958906042cce2} +#else +{0x1b64c97c73757a4, 0x1a3aab2674d3bf, 0x184cfe35d1d4a09, 0xc1fc2ec5caadd7, 0xab488a96a5099a, 0x28f020fa1788ca, 0xb3dc2b28132a04, 0x18b4637d9be2b49, 0xf2b120c08599} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3919,0x9bc5,0xcbb7,0xe8a6,0x3f55,0x22a,0x8690,0xc64e,0x8e93,0x6c4d,0x80e8,0x422f,0xffd,0x7e1,0xf545,0xb342,0x87be,0x80a5,0xa62b,0xfb8d,0x4048,0x466e,0x4697,0xd4d,0x9d79,0xc9ba,0x52c1,0xa008,0x21f1,0xf309,0xb87c,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9bc53919,0xe8a6cbb7,0x22a3f55,0xc64e8690,0x6c4d8e93,0x422f80e8,0x7e10ffd,0xb342f545,0x80a587be,0xfb8da62b,0x466e4048,0xd4d4697,0xc9ba9d79,0xa00852c1,0xf30921f1,0xab87c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe8a6cbb79bc53919,0xc64e8690022a3f55,0x422f80e86c4d8e93,0xb342f54507e10ffd,0xfb8da62b80a587be,0xd4d4697466e4048,0xa00852c1c9ba9d79,0xab87cf30921f1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc03e,0x86b5,0xcdfe,0x5bc4,0xc7a1,0xbc7b,0x90d9,0x9464,0xc604,0x9345,0x853d,0xc710,0x1ad2,0x4b98,0x4050,0x8ef4,0xd73c,0x6664,0xbd2,0xb610,0x483e,0x5e87,0xabe9,0xcf72,0x679e,0xbfbf,0x52b1,0x3483,0xf7c,0x4a36,0xbd53,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x86b5c03e,0x5bc4cdfe,0xbc7bc7a1,0x946490d9,0x9345c604,0xc710853d,0x4b981ad2,0x8ef44050,0x6664d73c,0xb6100bd2,0x5e87483e,0xcf72abe9,0xbfbf679e,0x348352b1,0x4a360f7c,0xebd53}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5bc4cdfe86b5c03e,0x946490d9bc7bc7a1,0xc710853d9345c604,0x8ef440504b981ad2,0xb6100bd26664d73c,0xcf72abe95e87483e,0x348352b1bfbf679e,0xebd534a360f7c}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5937,0x9b8c,0xba31,0x676c,0x8d31,0x9c3d,0xf619,0x42e2,0x4d1a,0xd072,0x76e5,0x390a,0x5086,0x7643,0x2d16,0xfd71,0x341,0xff7b,0x56ec,0xed63,0x1436,0x7324,0x6a5d,0x9488,0x9f0,0x145,0xd6b5,0x4043,0x10d8,0xeb6e,0x7784,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b8c5937,0x676cba31,0x9c3d8d31,0x42e2f619,0xd0724d1a,0x390a76e5,0x76435086,0xfd712d16,0xff7b0341,0xed6356ec,0x73241436,0x94886a5d,0x14509f0,0x4043d6b5,0xeb6e10d8,0xf7784}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x676cba319b8c5937,0x42e2f6199c3d8d31,0x390a76e5d0724d1a,0xfd712d1676435086,0xed6356ecff7b0341,0x94886a5d73241436,0x4043d6b5014509f0,0xf7784eb6e10d8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc6e7,0x643a,0x3448,0x1759,0xc0aa,0xfdd5,0x796f,0x39b1,0x716c,0x93b2,0x7f17,0xbdd0,0xf002,0xf81e,0xaba,0x4cbd,0x7841,0x7f5a,0x59d4,0x472,0xbfb7,0xb991,0xb968,0xf2b2,0x6286,0x3645,0xad3e,0x5ff7,0xde0e,0xcf6,0x4783,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x643ac6e7,0x17593448,0xfdd5c0aa,0x39b1796f,0x93b2716c,0xbdd07f17,0xf81ef002,0x4cbd0aba,0x7f5a7841,0x47259d4,0xb991bfb7,0xf2b2b968,0x36456286,0x5ff7ad3e,0xcf6de0e,0x54783}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x17593448643ac6e7,0x39b1796ffdd5c0aa,0xbdd07f1793b2716c,0x4cbd0abaf81ef002,0x47259d47f5a7841,0xf2b2b968b991bfb7,0x5ff7ad3e36456286,0x547830cf6de0e}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbdde,0x1bf3,0x7bc0,0xcae7,0x8d2e,0x58a8,0x4b1a,0xbcb8,0xccd9,0x3d98,0xfcf2,0x4881,0x66f8,0x3473,0x2e8a,0x730d,0xabbf,0x4789,0xdce9,0x58ea,0xf54,0x6169,0x58d0,0x3280,0xe1f9,0x5bd0,0x67a0,0x23d2,0x2611,0x18e1,0xd51f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1bf3bdde,0xcae77bc0,0x58a88d2e,0xbcb84b1a,0x3d98ccd9,0x4881fcf2,0x347366f8,0x730d2e8a,0x4789abbf,0x58eadce9,0x61690f54,0x328058d0,0x5bd0e1f9,0x23d267a0,0x18e12611,0x7d51f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcae77bc01bf3bdde,0xbcb84b1a58a88d2e,0x4881fcf23d98ccd9,0x730d2e8a347366f8,0x58eadce94789abbf,0x328058d061690f54,0x23d267a05bd0e1f9,0x7d51f18e12611}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xee54,0xe36f,0x939d,0xea02,0xe6db,0xa7ae,0x9f39,0x8bb3,0x7f02,0xf594,0xa9ab,0xae5e,0x9a76,0x7fc0,0xd9a,0xbecd,0x692d,0x8b68,0x30f4,0xff9a,0xd1ae,0xfd43,0xbdfc,0xc552,0xfe0d,0xa4bf,0x33e5,0x981b,0x202c,0x45e8,0x8573,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe36fee54,0xea02939d,0xa7aee6db,0x8bb39f39,0xf5947f02,0xae5ea9ab,0x7fc09a76,0xbecd0d9a,0x8b68692d,0xff9a30f4,0xfd43d1ae,0xc552bdfc,0xa4bffe0d,0x981b33e5,0x45e8202c,0xc8573}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xea02939de36fee54,0x8bb39f39a7aee6db,0xae5ea9abf5947f02,0xbecd0d9a7fc09a76,0xff9a30f48b68692d,0xc552bdfcfd43d1ae,0x981b33e5a4bffe0d,0xc857345e8202c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5fd3,0xc1bb,0x3527,0x289e,0x97fd,0xf5ce,0xa8e1,0xfbf2,0x8f04,0xb5e7,0xdf66,0xcb44,0x5b5,0x8314,0x31c,0x6e5c,0xa6b9,0x3134,0x3d19,0x5ea9,0x860d,0x37fe,0x8003,0xafb9,0xbfdd,0xf377,0xa36d,0xde5a,0xa9df,0x8da,0xc872,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc1bb5fd3,0x289e3527,0xf5ce97fd,0xfbf2a8e1,0xb5e78f04,0xcb44df66,0x831405b5,0x6e5c031c,0x3134a6b9,0x5ea93d19,0x37fe860d,0xafb98003,0xf377bfdd,0xde5aa36d,0x8daa9df,0xbc872}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x289e3527c1bb5fd3,0xfbf2a8e1f5ce97fd,0xcb44df66b5e78f04,0x6e5c031c831405b5,0x5ea93d193134a6b9,0xafb9800337fe860d,0xde5aa36df377bfdd,0xbc87208daa9df}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xb354,0x6a4f,0xd461,0xf7db,0x4aec,0x6786,0xff6,0xb274,0xfcf4,0x66d,0x97e9,0x277e,0x5e43,0x68a3,0xb1fa,0x6062,0xa56a,0x8c2b,0x67ed,0xd926,0x444a,0x4883,0x5bc5,0x8084,0x1f0a,0x209e,0x3b85,0x4eb6,0x14fe,0xb973,0xb05c,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6a4fb354,0xf7dbd461,0x67864aec,0xb2740ff6,0x66dfcf4,0x277e97e9,0x68a35e43,0x6062b1fa,0x8c2ba56a,0xd92667ed,0x4883444a,0x80845bc5,0x209e1f0a,0x4eb63b85,0xb97314fe,0xab05c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf7dbd4616a4fb354,0xb2740ff667864aec,0x277e97e9066dfcf4,0x6062b1fa68a35e43,0xd92667ed8c2ba56a,0x80845bc54883444a,0x4eb63b85209e1f0a,0xab05cb97314fe}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9c41,0x213b,0x2271,0x4d2a,0xca4c,0x987c,0xf3fd,0x8462,0x84ba,0x5504,0xf930,0x5ca1,0xb075,0x84d2,0xb16,0x1bc1,0xe1ac,0xfeb5,0xe84e,0x4bb0,0xf6b6,0x57b6,0x3d98,0x97f4,0xda24,0x9866,0x1aae,0xb84,0x36ec,0xfcb7,0x4a2d,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x213b9c41,0x4d2a2271,0x987cca4c,0x8462f3fd,0x550484ba,0x5ca1f930,0x84d2b075,0x1bc10b16,0xfeb5e1ac,0x4bb0e84e,0x57b6f6b6,0x97f43d98,0x9866da24,0xb841aae,0xfcb736ec,0xf4a2d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4d2a2271213b9c41,0x8462f3fd987cca4c,0x5ca1f930550484ba,0x1bc10b1684d2b075,0x4bb0e84efeb5e1ac,0x97f43d9857b6f6b6,0xb841aae9866da24,0xf4a2dfcb736ec}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xa02d,0x3e44,0xcad8,0xd761,0x6802,0xa31,0x571e,0x40d,0x70fb,0x4a18,0x2099,0x34bb,0xfa4a,0x7ceb,0xfce3,0x91a3,0x5946,0xcecb,0xc2e6,0xa156,0x79f2,0xc801,0x7ffc,0x5046,0x4022,0xc88,0x5c92,0x21a5,0x5620,0xf725,0x378d,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3e44a02d,0xd761cad8,0xa316802,0x40d571e,0x4a1870fb,0x34bb2099,0x7cebfa4a,0x91a3fce3,0xcecb5946,0xa156c2e6,0xc80179f2,0x50467ffc,0xc884022,0x21a55c92,0xf7255620,0x4378d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd761cad83e44a02d,0x40d571e0a316802,0x34bb20994a1870fb,0x91a3fce37cebfa4a,0xa156c2e6cecb5946,0x50467ffcc80179f2,0x21a55c920c884022,0x4378df7255620}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3919,0x9bc5,0xcbb7,0xe8a6,0x3f55,0x22a,0x8690,0xc64e,0x8e93,0x6c4d,0x80e8,0x422f,0xffd,0x7e1,0xf545,0xb342,0x87be,0x80a5,0xa62b,0xfb8d,0x4048,0x466e,0x4697,0xd4d,0x9d79,0xc9ba,0x52c1,0xa008,0x21f1,0xf309,0xb87c,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9bc53919,0xe8a6cbb7,0x22a3f55,0xc64e8690,0x6c4d8e93,0x422f80e8,0x7e10ffd,0xb342f545,0x80a587be,0xfb8da62b,0x466e4048,0xd4d4697,0xc9ba9d79,0xa00852c1,0xf30921f1,0xab87c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe8a6cbb79bc53919,0xc64e8690022a3f55,0x422f80e86c4d8e93,0xb342f54507e10ffd,0xfb8da62b80a587be,0xd4d4697466e4048,0xa00852c1c9ba9d79,0xab87cf30921f1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc03e,0x86b5,0xcdfe,0x5bc4,0xc7a1,0xbc7b,0x90d9,0x9464,0xc604,0x9345,0x853d,0xc710,0x1ad2,0x4b98,0x4050,0x8ef4,0xd73c,0x6664,0xbd2,0xb610,0x483e,0x5e87,0xabe9,0xcf72,0x679e,0xbfbf,0x52b1,0x3483,0xf7c,0x4a36,0xbd53,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x86b5c03e,0x5bc4cdfe,0xbc7bc7a1,0x946490d9,0x9345c604,0xc710853d,0x4b981ad2,0x8ef44050,0x6664d73c,0xb6100bd2,0x5e87483e,0xcf72abe9,0xbfbf679e,0x348352b1,0x4a360f7c,0xebd53}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5bc4cdfe86b5c03e,0x946490d9bc7bc7a1,0xc710853d9345c604,0x8ef440504b981ad2,0xb6100bd26664d73c,0xcf72abe95e87483e,0x348352b1bfbf679e,0xebd534a360f7c}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5937,0x9b8c,0xba31,0x676c,0x8d31,0x9c3d,0xf619,0x42e2,0x4d1a,0xd072,0x76e5,0x390a,0x5086,0x7643,0x2d16,0xfd71,0x341,0xff7b,0x56ec,0xed63,0x1436,0x7324,0x6a5d,0x9488,0x9f0,0x145,0xd6b5,0x4043,0x10d8,0xeb6e,0x7784,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9b8c5937,0x676cba31,0x9c3d8d31,0x42e2f619,0xd0724d1a,0x390a76e5,0x76435086,0xfd712d16,0xff7b0341,0xed6356ec,0x73241436,0x94886a5d,0x14509f0,0x4043d6b5,0xeb6e10d8,0xf7784}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x676cba319b8c5937,0x42e2f6199c3d8d31,0x390a76e5d0724d1a,0xfd712d1676435086,0xed6356ecff7b0341,0x94886a5d73241436,0x4043d6b5014509f0,0xf7784eb6e10d8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc6e7,0x643a,0x3448,0x1759,0xc0aa,0xfdd5,0x796f,0x39b1,0x716c,0x93b2,0x7f17,0xbdd0,0xf002,0xf81e,0xaba,0x4cbd,0x7841,0x7f5a,0x59d4,0x472,0xbfb7,0xb991,0xb968,0xf2b2,0x6286,0x3645,0xad3e,0x5ff7,0xde0e,0xcf6,0x4783,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x643ac6e7,0x17593448,0xfdd5c0aa,0x39b1796f,0x93b2716c,0xbdd07f17,0xf81ef002,0x4cbd0aba,0x7f5a7841,0x47259d4,0xb991bfb7,0xf2b2b968,0x36456286,0x5ff7ad3e,0xcf6de0e,0x54783}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x17593448643ac6e7,0x39b1796ffdd5c0aa,0xbdd07f1793b2716c,0x4cbd0abaf81ef002,0x47259d47f5a7841,0xf2b2b968b991bfb7,0x5ff7ad3e36456286,0x547830cf6de0e}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdeef,0xdf9,0xbde0,0x6573,0x4697,0x2c54,0x258d,0xde5c,0x666c,0x1ecc,0xfe79,0x2440,0xb37c,0x1a39,0x9745,0xb986,0xd5df,0xa3c4,0x6e74,0x2c75,0x87aa,0x30b4,0x2c68,0x9940,0x70fc,0x2de8,0x33d0,0x91e9,0x9308,0x8c70,0xea8f,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf9deef,0x6573bde0,0x2c544697,0xde5c258d,0x1ecc666c,0x2440fe79,0x1a39b37c,0xb9869745,0xa3c4d5df,0x2c756e74,0x30b487aa,0x99402c68,0x2de870fc,0x91e933d0,0x8c709308,0xbea8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6573bde00df9deef,0xde5c258d2c544697,0x2440fe791ecc666c,0xb98697451a39b37c,0x2c756e74a3c4d5df,0x99402c6830b487aa,0x91e933d02de870fc,0xbea8f8c709308}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf72a,0xf1b7,0x49ce,0xf501,0x736d,0xd3d7,0xcf9c,0x45d9,0x3f81,0xfaca,0x54d5,0x572f,0x4d3b,0x3fe0,0x86cd,0xdf66,0x3496,0x45b4,0x187a,0x7fcd,0xe8d7,0x7ea1,0x5efe,0xe2a9,0xff06,0xd25f,0x99f2,0x4c0d,0x1016,0xa2f4,0x42b9,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1b7f72a,0xf50149ce,0xd3d7736d,0x45d9cf9c,0xfaca3f81,0x572f54d5,0x3fe04d3b,0xdf6686cd,0x45b43496,0x7fcd187a,0x7ea1e8d7,0xe2a95efe,0xd25fff06,0x4c0d99f2,0xa2f41016,0xe42b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf50149cef1b7f72a,0x45d9cf9cd3d7736d,0x572f54d5faca3f81,0xdf6686cd3fe04d3b,0x7fcd187a45b43496,0xe2a95efe7ea1e8d7,0x4c0d99f2d25fff06,0xe42b9a2f41016}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x718a,0xe24a,0xae5,0xa4d6,0xd401,0xf453,0x9f91,0x69ce,0x7d19,0xfa11,0x9273,0x4e63,0xf33a,0xde49,0xe08f,0x746a,0x243d,0x52bb,0x43b6,0xe4c,0x1bdd,0x380d,0xdf64,0x74fe,0x4dfa,0x584f,0xa4d6,0xd71b,0xf067,0xf070,0x717e,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe24a718a,0xa4d60ae5,0xf453d401,0x69ce9f91,0xfa117d19,0x4e639273,0xde49f33a,0x746ae08f,0x52bb243d,0xe4c43b6,0x380d1bdd,0x74fedf64,0x584f4dfa,0xd71ba4d6,0xf070f067,0xf717e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa4d60ae5e24a718a,0x69ce9f91f453d401,0x4e639273fa117d19,0x746ae08fde49f33a,0xe4c43b652bb243d,0x74fedf64380d1bdd,0xd71ba4d6584f4dfa,0xf717ef070f067}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5d93,0x7845,0xd1d0,0xe045,0xfa74,0x6b6,0x9400,0xad36,0x4e68,0xd3f6,0x9b00,0x7ca0,0xab22,0xfac,0x1fb6,0xb42f,0x57db,0xb2e3,0xbc5b,0x2b2d,0x94fa,0xc77e,0x34e2,0x2918,0x6ce9,0xf9dd,0x68cf,0xd4a2,0xbc59,0x6050,0xda60,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x78455d93,0xe045d1d0,0x6b6fa74,0xad369400,0xd3f64e68,0x7ca09b00,0xfacab22,0xb42f1fb6,0xb2e357db,0x2b2dbc5b,0xc77e94fa,0x291834e2,0xf9dd6ce9,0xd4a268cf,0x6050bc59,0x5da60}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe045d1d078455d93,0xad36940006b6fa74,0x7ca09b00d3f64e68,0xb42f1fb60facab22,0x2b2dbc5bb2e357db,0x291834e2c77e94fa,0xd4a268cff9dd6ce9,0x5da606050bc59}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc6dc,0x5d39,0xac2b,0x2d81,0xc9b8,0xf398,0xdab5,0x8e30,0xb3b2,0x1b25,0x7102,0x8cd2,0x952e,0x7c35,0xb4f3,0x52b8,0x5789,0xb877,0x6906,0x8d31,0x98a6,0x8a10,0x2b3,0x1667,0x856,0xa935,0xfc76,0xc8ec,0x6044,0x9148,0x4f02,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5d39c6dc,0x2d81ac2b,0xf398c9b8,0x8e30dab5,0x1b25b3b2,0x8cd27102,0x7c35952e,0x52b8b4f3,0xb8775789,0x8d316906,0x8a1098a6,0x166702b3,0xa9350856,0xc8ecfc76,0x91486044,0xd4f02}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2d81ac2b5d39c6dc,0x8e30dab5f398c9b8,0x8cd271021b25b3b2,0x52b8b4f37c35952e,0x8d316906b8775789,0x166702b38a1098a6,0xc8ecfc76a9350856,0xd4f0291486044}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 31, ._mp_d = (mp_limb_t[]) {0x8e76,0x1db5,0xf51a,0x5b29,0x2bfe,0xbac,0x606e,0x9631,0x82e6,0x5ee,0x6d8c,0xb19c,0xcc5,0x21b6,0x1f70,0x8b95,0xdbc2,0xad44,0xbc49,0xf1b3,0xe422,0xc7f2,0x209b,0x8b01,0xb205,0xa7b0,0x5b29,0x28e4,0xf98,0xf8f,0x8e81}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1db58e76,0x5b29f51a,0xbac2bfe,0x9631606e,0x5ee82e6,0xb19c6d8c,0x21b60cc5,0x8b951f70,0xad44dbc2,0xf1b3bc49,0xc7f2e422,0x8b01209b,0xa7b0b205,0x28e45b29,0xf8f0f98,0x8e81}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5b29f51a1db58e76,0x9631606e0bac2bfe,0xb19c6d8c05ee82e6,0x8b951f7021b60cc5,0xf1b3bc49ad44dbc2,0x8b01209bc7f2e422,0x28e45b29a7b0b205,0x8e810f8f0f98}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0xca6, 0xc89, 0x411, 0x17e9, 0x188d, 0xad5, 0x8de, 0x403, 0x183a, 0x1e0d, 0x28c, 0xfdc, 0xbcc, 0xd0, 0xa3a, 0xb2e, 0x140c, 0x11b4, 0x4bb, 0x10da, 0xb22, 0x1a4c, 0xbfa, 0xbd5, 0xae6, 0xeff, 0x465, 0x8df, 0xcf9, 0x1c4a, 0x1807, 0x1462, 0xead, 0x1c43, 0x12a3, 0x1ec2, 0x1e12, 0xad0, 0x1cd} +#elif RADIX == 32 +{0x1653222c, 0x12411644, 0x15711b7e, 0x1a3795, 0x1e0dc1d1, 0x11fb828c, 0x1d034179, 0xc59728, 0x9771b4a, 0x2c8a1b4, 0x155fd693, 0x1feae65e, 0x37c8cae, 0x1e2533e5, 0x1b462c03, 0x8f886ea, 0x1097b0a5, 0x487} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1b7e9208b22594c8, 0x3707440346f2b571, 0xd0341798fdc14678, 0xa25dc6d2818b2e51, 0xcbd55fd69316450d, 0x99f28df232bbfd5c, 0xf10dd5b462c03f12, 0xeab43c25ec2951} +#else +{0xfd2411644b2991, 0x1440346f2b5711b, 0x1cc7ee0a33c1b83, 0xa062cb94740d05, 0x62c8a1b44bb8da, 0x1bfd5ccbd55fd69, 0x1f894cf946f9195, 0x147c43756d18b00, 0x2568784bd852} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0xb2b, 0xb22, 0x904, 0xdfa, 0xe23, 0x12b5, 0x1a37, 0x1100, 0xe0e, 0x783, 0xa3, 0x3f7, 0x2f3, 0x1034, 0x128e, 0x2cb, 0x503, 0x1c6d, 0x112e, 0x1436, 0x2c8, 0x1693, 0xafe, 0x12f5, 0x1ab9, 0xbbf, 0x1919, 0xa37, 0x133e, 0x1f12, 0x1601, 0xd18, 0x1bab, 0x1f10, 0x14a8, 0x17b0, 0x784, 0xab4, 0x653} +#elif RADIX == 32 +{0x595f7f3, 0x14904591, 0xd5c46df, 0x8068de5, 0x7837074, 0xc7ee0a3, 0x740d05e, 0x103165ca, 0x25dc6d2, 0x18b2286d, 0x1557f5a4, 0x17fab997, 0x8df232b, 0x1f894cf9, 0x16d18b00, 0xa3e21ba, 0x1c25ec29, 0x521} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x46dfa4822c89657d, 0xdc1d100d1bcad5c, 0x740d05e63f70519e, 0x689771b4a062cb94, 0x32f557f5a4c59143, 0xa67ca37c8caeff57, 0x7c43756d18b00fc4, 0x1aaad0f097b0a54} +#else +{0x1bf49045912cafb, 0x1d100d1bcad5c46, 0xf31fb828cf06e0, 0x12818b2e51d0341, 0x98b2286d12ee36, 0xeff5732f557f5a, 0x7e2533e51be465, 0x151f10dd5b462c0, 0x1a55a1e12f614} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x517, 0x18a8, 0x1a92, 0x94f, 0x1bb0, 0xf2c, 0x43, 0x5a8, 0x1463, 0x1b4b, 0x1a1c, 0x1c0e, 0x148a, 0x7f5, 0x6a3, 0x820, 0x1fc7, 0x141c, 0x1c2b, 0xd98, 0x48c, 0x587, 0x1b23, 0x1fb5, 0x4c0, 0x179c, 0x169e, 0x1927, 0x16b8, 0x1beb, 0x6bb, 0x1923, 0x2b7, 0x146d, 0x32b, 0xd85, 0x1a89, 0x1fb0, 0x2be} +#elif RADIX == 32 +{0x28bb412, 0x1fa92c54, 0xb376094, 0xd4010de, 0x1b4ba319, 0xb81da1c, 0x119fd691, 0x1c74101a, 0x185741cf, 0x19231b31, 0x15d91961, 0x1384c0fd, 0x49ed3d7, 0x1df5dae3, 0xf92335d, 0xae8da2b, 0x144b6146, 0xa86} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6094fd4962a0a2ed, 0x2e8c65a8021bcb37, 0x19fd6915c0ed0e6d, 0x8e15d073f8e82035, 0x1fb5d91961c918d9, 0xed71927b4f5e7098, 0xd1b456f92335defa, 0x7ec3512d85195} +#else +{0x129fa92c54145da, 0x65a8021bcb3760, 0x8ae07687369746, 0xfe3a080d467f5a, 0x39231b31c2ba0e, 0x1e70981fb5d9196, 0xf7d76b8c93da7a, 0x5746d15be48cd7, 0xfd86a25b0a3} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x147b, 0x14f1, 0xfdd, 0xb2a, 0xff7, 0x1426, 0xce1, 0x19a8, 0x1bf3, 0xbdd, 0x16dd, 0x1339, 0x10dd, 0x8f4, 0x1d29, 0x1b05, 0x1ee, 0x187b, 0x118a, 0x1e55, 0xcde, 0x1a18, 0x1b1f, 0x1648, 0x1c75, 0x1db8, 0xa2a, 0x1ab6, 0x1fa, 0xb0a, 0x1bdf, 0x1d18, 0x1a98, 0x12d9, 0x13df, 0x6e0, 0xa3c, 0x537, 0x345} +#elif RADIX == 32 +{0x1a3dbe03, 0x14fdda78, 0x99feeb2, 0xd433868, 0xbdddf9e, 0x166736dd, 0x14a3d21b, 0x1eed82f4, 0x31587b0, 0x337bcab, 0x8d8fe86, 0x171c75b2, 0xad9455d, 0x158507eb, 0x11d18def, 0x17e5b3a9, 0x11e1b827, 0x13a} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xeeb2a7eed3c68f6f, 0x777e79a8670d099f, 0x4a3d21bb339b6eaf, 0x58c561ec3ddb05e9, 0xb648d8fe8619bde5, 0x83f5ab651576e38e, 0xcb67531d18defac2, 0xd94dd4786e09ef} +#else +{0x1654fdda78d1edf, 0x79a8670d099fee, 0xdd99cdb757bbbf, 0x10f76c17a528f48, 0xc337bcab18ac3d, 0x16e38eb648d8fe8, 0x1d6141fad5b28ab, 0x1bf2d9d4c74637b, 0x29ba8f0dc13} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0xc4b, 0x1f6e, 0xcba, 0x1a23, 0x8a1, 0x7c3, 0x1a45, 0x1ca3, 0x6a9, 0x643, 0x3b, 0xc83, 0x208, 0x21a, 0xd43, 0x1805, 0x1078, 0x9af, 0x80a, 0x1555, 0x50d, 0x1eb8, 0xa49, 0x161c, 0x1eee, 0xe1b, 0xf4b, 0x9de, 0x117e, 0x14f8, 0xea7, 0xd18, 0x112a, 0x1a38, 0x1cc7, 0x1c36, 0xe5, 0x10fa, 0x411} +#elif RADIX == 32 +{0x625cd26, 0x6cbafb7, 0x10d143a2, 0x51e914f, 0x643354f, 0x190603b, 0x1886841, 0x78c02b5, 0x10149af8, 0x1436aaa, 0x1c524fae, 0x37eeeb0, 0x779e96e, 0x1a7c45f9, 0x14d18753, 0x11f47112, 0x72f0db9, 0x6d0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x43a2365d7db98973, 0xcd53ca3d229f0d1, 0x18868410c8301d99, 0x540526be0f18056a, 0xd61c524fae0a1b55, 0x22fc9de7a5b86fdd, 0xe8e2254d18753d3e, 0x7c3e81cbc36e63} +#else +{0x1446cbafb7312e6, 0x13ca3d229f0d143, 0x864180ecc866a, 0x183c6015a8621a1, 0x1c1436aaa80a4d7, 0x186fddd61c524fa, 0x1e9f117e4ef3d2d, 0x18fa388953461d4, 0xf87d039786dc} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x9d5, 0x0, 0x181d, 0xced, 0x1fe0, 0x267, 0xc65, 0x1a4d, 0x9e3, 0x1f0c, 0x5d, 0xbae, 0x276, 0x1551, 0x1684, 0x1eab, 0x17f0, 0x1b20, 0xae6, 0xbc3, 0x95, 0x17c3, 0xfd8, 0x1359, 0x3f5, 0x12b6, 0x1410, 0x113, 0x1a19, 0x1c1d, 0xd91, 0x1446, 0x1233, 0x170, 0x1c50, 0x13ac, 0x6eb, 0x926, 0x3bf} +#elif RADIX == 32 +{0x4eac70e, 0x1b81d000, 0x19ffc0ce, 0x126b1944, 0x1f0c4f1e, 0x1975c05d, 0x255444e, 0x1f0f55da, 0x15cdb20b, 0x18255786, 0x197ec5f0, 0x16c3f59a, 0x44e8212, 0x1e0ee864, 0x74466c8, 0x1402e123, 0x175ceb38, 0xc31} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xc0cedc0e80013ab1, 0x313c7a4d632899ff, 0x255444ecbae02efc, 0x35736c82fe1eabb4, 0xb3597ec5f0c12abc, 0x7432113a084ad87e, 0x5c24674466c8f07, 0x14a498dd73ace28} +#else +{0x19db81d00027563, 0x7a4d632899ffc0, 0x765d70177e189e, 0xbf87aaed095511, 0x18255786ae6d90, 0xad87eb3597ec5f, 0x783ba19089d042, 0xa0170919d119b2, 0xe4931bae759c} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1997, 0xa5a, 0x4c4, 0x155d, 0x70b, 0x12f, 0xe9d, 0xfe0, 0x147c, 0x9b6, 0x18ea, 0xf41, 0x1636, 0x1707, 0x1a7e, 0x1326, 0x76d, 0xbef, 0x9fe, 0x1bb4, 0xe22, 0x200, 0x1a11, 0x7e6, 0x1709, 0x1be9, 0x1507, 0x1c63, 0xb6f, 0xceb, 0x1b88, 0x1ef6, 0x16b7, 0x20f, 0x1497, 0x1e1c, 0x26e, 0x139d, 0x330} +#elif RADIX == 32 +{0xccbbc7d, 0x1a4c452d, 0xbce1755, 0x1f03a742, 0x9b6a3e3, 0x19e838ea, 0x1f5c1ec6, 0x16d99369, 0x13fcbef3, 0x388b768, 0x6d08880, 0x1d37093f, 0x118ea0fb, 0x675adbf, 0xfef6dc4, 0x5c41f6b, 0x13778729, 0x568} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x1755d262296b32ef, 0xda8f8fe074e84bce, 0xf5c1ec6cf41c7526, 0x44ff2fbcedb326d3, 0x27e6d088801c45bb, 0xd6dfc63a83efa6e1, 0x883ed6fef6dc433a, 0x34e744dde1ca4b} +#else +{0xaba4c452d665de, 0x18fe074e84bce17, 0x367a0e3a936d47, 0x13b6cc9b4fd707b, 0x388b7689fe5f7, 0xfa6e127e6d0888, 0x19d6b6fe31d41f, 0x12e20fb5bfbdb71, 0x69ce89bbc394} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1bf, 0x197b, 0x1b4, 0x1a8a, 0xd22, 0x1cb5, 0x298, 0x76b, 0x16b6, 0x5aa, 0x54b, 0x1b63, 0x1d59, 0x2dc, 0xfe1, 0x1b24, 0x1725, 0x9a8, 0x2dd, 0x150f, 0x12de, 0x9d9, 0x2fd, 0x95f, 0xcc1, 0x1ffd, 0x101b, 0x707, 0x1d9d, 0x464, 0x39e, 0x97b, 0x8cf, 0x4a5, 0xed1, 0x9c3, 0x1b66, 0x1521, 0x112} +#elif RADIX == 32 +{0x10df9458, 0x141b4cbd, 0xd5a45a8, 0x1b58a639, 0x5aab5b1, 0x76c654b, 0x108b73ab, 0x125d923f, 0x5ba9a8b, 0xcb7aa1e, 0x1f17ea76, 0x1facc14a, 0x1c1e037f, 0x2327674, 0x1e97b1cf, 0x14494a8c, 0x1b3270dd, 0x50e} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x45a8a0da65ec37e5, 0xaad6c76b14c72d5a, 0x8b73ab3b632a596, 0xf16ea6a2e4bb247f, 0x295f17ea7665bd50, 0x3b3a70780dfff598, 0x929519e97b1cf119, 0x254876cc9c3768} +#else +{0x15141b4cbd86fca, 0xc76b14c72d5a45, 0x159db1952cb556b, 0xb92ec91fc22dce, 0xccb7aa1e2dd4d4, 0x1ff598295f17ea7, 0x188c9d9d383c06f, 0x1a24a5467a5ec73, 0x4a90ed99386e} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x4f71,0xd850,0x620a,0x55cc,0x31b0,0x4b74,0xab42,0x125c,0xb589,0xa634,0x73b3,0xca64,0x6ed0,0x6c41,0x6022,0x9b4a,0xb03e,0xe0d,0x1e19,0x2925,0x275e,0x42a,0x10dd,0xfc6a,0x7f51,0xb592,0x977e,0xe556,0x10bc,0x873d,0xa68f,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd8504f71,0x55cc620a,0x4b7431b0,0x125cab42,0xa634b589,0xca6473b3,0x6c416ed0,0x9b4a6022,0xe0db03e,0x29251e19,0x42a275e,0xfc6a10dd,0xb5927f51,0xe556977e,0x873d10bc,0x3a68f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x55cc620ad8504f71,0x125cab424b7431b0,0xca6473b3a634b589,0x9b4a60226c416ed0,0x29251e190e0db03e,0xfc6a10dd042a275e,0xe556977eb5927f51,0x3a68f873d10bc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xed2,0x7e79,0xb784,0x90c5,0xe054,0xfc99,0x606e,0x59f4,0xb88f,0xb6ae,0x29bf,0xe3fc,0xa3cf,0x8c88,0xba94,0x4bf9,0xcb60,0xf771,0x31c0,0x7236,0x2401,0xa9e7,0xb9b8,0xfdbf,0x326e,0xb4d5,0x9bd6,0xc810,0xb7f0,0x661,0x1f62,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7e790ed2,0x90c5b784,0xfc99e054,0x59f4606e,0xb6aeb88f,0xe3fc29bf,0x8c88a3cf,0x4bf9ba94,0xf771cb60,0x723631c0,0xa9e72401,0xfdbfb9b8,0xb4d5326e,0xc8109bd6,0x661b7f0,0xf1f62}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x90c5b7847e790ed2,0x59f4606efc99e054,0xe3fc29bfb6aeb88f,0x4bf9ba948c88a3cf,0x723631c0f771cb60,0xfdbfb9b8a9e72401,0xc8109bd6b4d5326e,0xf1f620661b7f0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xb407,0xc1a7,0x6715,0xe1ad,0x31eb,0x15e8,0x1594,0xbd8e,0x3976,0x2bae,0x8f7a,0x1636,0x8d19,0x88d2,0x12ae,0x1627,0xf2b0,0x4868,0xdd78,0xfa51,0xfd6b,0xa1f3,0x7eb3,0x35d9,0xd826,0x2c09,0x12a8,0x54dd,0x87d6,0xc29c,0x5bcd,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc1a7b407,0xe1ad6715,0x15e831eb,0xbd8e1594,0x2bae3976,0x16368f7a,0x88d28d19,0x162712ae,0x4868f2b0,0xfa51dd78,0xa1f3fd6b,0x35d97eb3,0x2c09d826,0x54dd12a8,0xc29c87d6,0x15bcd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe1ad6715c1a7b407,0xbd8e159415e831eb,0x16368f7a2bae3976,0x162712ae88d28d19,0xfa51dd784868f2b0,0x35d97eb3a1f3fd6b,0x54dd12a82c09d826,0x15bcdc29c87d6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xb08f,0x27af,0x9df5,0xaa33,0xce4f,0xb48b,0x54bd,0xeda3,0x4a76,0x59cb,0x8c4c,0x359b,0x912f,0x93be,0x9fdd,0x64b5,0x4fc1,0xf1f2,0xe1e6,0xd6da,0xd8a1,0xfbd5,0xef22,0x395,0x80ae,0x4a6d,0x6881,0x1aa9,0xef43,0x78c2,0x5970,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x27afb08f,0xaa339df5,0xb48bce4f,0xeda354bd,0x59cb4a76,0x359b8c4c,0x93be912f,0x64b59fdd,0xf1f24fc1,0xd6dae1e6,0xfbd5d8a1,0x395ef22,0x4a6d80ae,0x1aa96881,0x78c2ef43,0xc5970}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xaa339df527afb08f,0xeda354bdb48bce4f,0x359b8c4c59cb4a76,0x64b59fdd93be912f,0xd6dae1e6f1f24fc1,0x395ef22fbd5d8a1,0x1aa968814a6d80ae,0xc597078c2ef43}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbdde,0x1bf3,0x7bc0,0xcae7,0x8d2e,0x58a8,0x4b1a,0xbcb8,0xccd9,0x3d98,0xfcf2,0x4881,0x66f8,0x3473,0x2e8a,0x730d,0xabbf,0x4789,0xdce9,0x58ea,0xf54,0x6169,0x58d0,0x3280,0xe1f9,0x5bd0,0x67a0,0x23d2,0x2611,0x18e1,0xd51f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1bf3bdde,0xcae77bc0,0x58a88d2e,0xbcb84b1a,0x3d98ccd9,0x4881fcf2,0x347366f8,0x730d2e8a,0x4789abbf,0x58eadce9,0x61690f54,0x328058d0,0x5bd0e1f9,0x23d267a0,0x18e12611,0x7d51f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcae77bc01bf3bdde,0xbcb84b1a58a88d2e,0x4881fcf23d98ccd9,0x730d2e8a347366f8,0x58eadce94789abbf,0x328058d061690f54,0x23d267a05bd0e1f9,0x7d51f18e12611}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xee54,0xe36f,0x939d,0xea02,0xe6db,0xa7ae,0x9f39,0x8bb3,0x7f02,0xf594,0xa9ab,0xae5e,0x9a76,0x7fc0,0xd9a,0xbecd,0x692d,0x8b68,0x30f4,0xff9a,0xd1ae,0xfd43,0xbdfc,0xc552,0xfe0d,0xa4bf,0x33e5,0x981b,0x202c,0x45e8,0x8573,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe36fee54,0xea02939d,0xa7aee6db,0x8bb39f39,0xf5947f02,0xae5ea9ab,0x7fc09a76,0xbecd0d9a,0x8b68692d,0xff9a30f4,0xfd43d1ae,0xc552bdfc,0xa4bffe0d,0x981b33e5,0x45e8202c,0xc8573}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xea02939de36fee54,0x8bb39f39a7aee6db,0xae5ea9abf5947f02,0xbecd0d9a7fc09a76,0xff9a30f48b68692d,0xc552bdfcfd43d1ae,0x981b33e5a4bffe0d,0xc857345e8202c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xe7eb,0x27c8,0x739b,0x6eaa,0x7a17,0xf593,0xac1c,0x4a84,0x1a27,0x7771,0xe67e,0xea3d,0x4596,0xa34b,0x8edd,0xc51c,0x7c15,0xd1a1,0x2551,0x481b,0x402e,0xfed0,0x8b82,0x1eab,0xc98b,0x20fa,0x7143,0x6abf,0x463a,0x475f,0x510f,0x9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x27c8e7eb,0x6eaa739b,0xf5937a17,0x4a84ac1c,0x77711a27,0xea3de67e,0xa34b4596,0xc51c8edd,0xd1a17c15,0x481b2551,0xfed0402e,0x1eab8b82,0x20fac98b,0x6abf7143,0x475f463a,0x9510f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6eaa739b27c8e7eb,0x4a84ac1cf5937a17,0xea3de67e77711a27,0xc51c8edda34b4596,0x481b2551d1a17c15,0x1eab8b82fed0402e,0x6abf714320fac98b,0x9510f475f463a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9e28,0x9e31,0xdab6,0x138c,0xc3c0,0x5193,0x444d,0xb2b7,0xf371,0x5630,0xb08b,0xc700,0x2404,0x3f08,0xc3f,0xbd7c,0x963b,0xd892,0x7bb2,0x429d,0x19d8,0xf277,0x853d,0x9aac,0x9bfa,0x42cd,0xf5e8,0x9e40,0x8a41,0x15a8,0x9c23,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9e319e28,0x138cdab6,0x5193c3c0,0xb2b7444d,0x5630f371,0xc700b08b,0x3f082404,0xbd7c0c3f,0xd892963b,0x429d7bb2,0xf27719d8,0x9aac853d,0x42cd9bfa,0x9e40f5e8,0x15a88a41,0x69c23}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x138cdab69e319e28,0xb2b7444d5193c3c0,0xc700b08b5630f371,0xbd7c0c3f3f082404,0x429d7bb2d892963b,0x9aac853df27719d8,0x9e40f5e842cd9bfa,0x69c2315a88a41}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x66d1,0x8ee,0x9219,0x9d61,0x13a4,0xfc63,0xc3ee,0xdf2a,0x1353,0x2ef,0xc391,0x8ad8,0x953b,0xb014,0x1029,0xa4b2,0x61a3,0xfc07,0xf3a8,0x199c,0xe6c8,0x6a41,0x6eb7,0xb459,0xa187,0x2f4e,0x9ec3,0x8b4e,0x5321,0x38b,0x5b21,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8ee66d1,0x9d619219,0xfc6313a4,0xdf2ac3ee,0x2ef1353,0x8ad8c391,0xb014953b,0xa4b21029,0xfc0761a3,0x199cf3a8,0x6a41e6c8,0xb4596eb7,0x2f4ea187,0x8b4e9ec3,0x38b5321,0x35b21}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9d61921908ee66d1,0xdf2ac3eefc6313a4,0x8ad8c39102ef1353,0xa4b21029b014953b,0x199cf3a8fc0761a3,0xb4596eb76a41e6c8,0x8b4e9ec32f4ea187,0x35b21038b5321}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1815,0xd837,0x8c64,0x9155,0x85e8,0xa6c,0x53e3,0xb57b,0xe5d8,0x888e,0x1981,0x15c2,0xba69,0x5cb4,0x7122,0x3ae3,0x83ea,0x2e5e,0xdaae,0xb7e4,0xbfd1,0x12f,0x747d,0xe154,0x3674,0xdf05,0x8ebc,0x9540,0xb9c5,0xb8a0,0xaef0,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd8371815,0x91558c64,0xa6c85e8,0xb57b53e3,0x888ee5d8,0x15c21981,0x5cb4ba69,0x3ae37122,0x2e5e83ea,0xb7e4daae,0x12fbfd1,0xe154747d,0xdf053674,0x95408ebc,0xb8a0b9c5,0x6aef0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x91558c64d8371815,0xb57b53e30a6c85e8,0x15c21981888ee5d8,0x3ae371225cb4ba69,0xb7e4daae2e5e83ea,0xe154747d012fbfd1,0x95408ebcdf053674,0x6aef0b8a0b9c5}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x4f71,0xd850,0x620a,0x55cc,0x31b0,0x4b74,0xab42,0x125c,0xb589,0xa634,0x73b3,0xca64,0x6ed0,0x6c41,0x6022,0x9b4a,0xb03e,0xe0d,0x1e19,0x2925,0x275e,0x42a,0x10dd,0xfc6a,0x7f51,0xb592,0x977e,0xe556,0x10bc,0x873d,0xa68f,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd8504f71,0x55cc620a,0x4b7431b0,0x125cab42,0xa634b589,0xca6473b3,0x6c416ed0,0x9b4a6022,0xe0db03e,0x29251e19,0x42a275e,0xfc6a10dd,0xb5927f51,0xe556977e,0x873d10bc,0x3a68f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x55cc620ad8504f71,0x125cab424b7431b0,0xca6473b3a634b589,0x9b4a60226c416ed0,0x29251e190e0db03e,0xfc6a10dd042a275e,0xe556977eb5927f51,0x3a68f873d10bc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xed2,0x7e79,0xb784,0x90c5,0xe054,0xfc99,0x606e,0x59f4,0xb88f,0xb6ae,0x29bf,0xe3fc,0xa3cf,0x8c88,0xba94,0x4bf9,0xcb60,0xf771,0x31c0,0x7236,0x2401,0xa9e7,0xb9b8,0xfdbf,0x326e,0xb4d5,0x9bd6,0xc810,0xb7f0,0x661,0x1f62,0xf}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7e790ed2,0x90c5b784,0xfc99e054,0x59f4606e,0xb6aeb88f,0xe3fc29bf,0x8c88a3cf,0x4bf9ba94,0xf771cb60,0x723631c0,0xa9e72401,0xfdbfb9b8,0xb4d5326e,0xc8109bd6,0x661b7f0,0xf1f62}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x90c5b7847e790ed2,0x59f4606efc99e054,0xe3fc29bfb6aeb88f,0x4bf9ba948c88a3cf,0x723631c0f771cb60,0xfdbfb9b8a9e72401,0xc8109bd6b4d5326e,0xf1f620661b7f0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xb407,0xc1a7,0x6715,0xe1ad,0x31eb,0x15e8,0x1594,0xbd8e,0x3976,0x2bae,0x8f7a,0x1636,0x8d19,0x88d2,0x12ae,0x1627,0xf2b0,0x4868,0xdd78,0xfa51,0xfd6b,0xa1f3,0x7eb3,0x35d9,0xd826,0x2c09,0x12a8,0x54dd,0x87d6,0xc29c,0x5bcd,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc1a7b407,0xe1ad6715,0x15e831eb,0xbd8e1594,0x2bae3976,0x16368f7a,0x88d28d19,0x162712ae,0x4868f2b0,0xfa51dd78,0xa1f3fd6b,0x35d97eb3,0x2c09d826,0x54dd12a8,0xc29c87d6,0x15bcd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe1ad6715c1a7b407,0xbd8e159415e831eb,0x16368f7a2bae3976,0x162712ae88d28d19,0xfa51dd784868f2b0,0x35d97eb3a1f3fd6b,0x54dd12a82c09d826,0x15bcdc29c87d6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xb08f,0x27af,0x9df5,0xaa33,0xce4f,0xb48b,0x54bd,0xeda3,0x4a76,0x59cb,0x8c4c,0x359b,0x912f,0x93be,0x9fdd,0x64b5,0x4fc1,0xf1f2,0xe1e6,0xd6da,0xd8a1,0xfbd5,0xef22,0x395,0x80ae,0x4a6d,0x6881,0x1aa9,0xef43,0x78c2,0x5970,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x27afb08f,0xaa339df5,0xb48bce4f,0xeda354bd,0x59cb4a76,0x359b8c4c,0x93be912f,0x64b59fdd,0xf1f24fc1,0xd6dae1e6,0xfbd5d8a1,0x395ef22,0x4a6d80ae,0x1aa96881,0x78c2ef43,0xc5970}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xaa339df527afb08f,0xeda354bdb48bce4f,0x359b8c4c59cb4a76,0x64b59fdd93be912f,0xd6dae1e6f1f24fc1,0x395ef22fbd5d8a1,0x1aa968814a6d80ae,0xc597078c2ef43}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdeef,0xdf9,0xbde0,0x6573,0x4697,0x2c54,0x258d,0xde5c,0x666c,0x1ecc,0xfe79,0x2440,0xb37c,0x1a39,0x9745,0xb986,0xd5df,0xa3c4,0x6e74,0x2c75,0x87aa,0x30b4,0x2c68,0x9940,0x70fc,0x2de8,0x33d0,0x91e9,0x9308,0x8c70,0xea8f,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf9deef,0x6573bde0,0x2c544697,0xde5c258d,0x1ecc666c,0x2440fe79,0x1a39b37c,0xb9869745,0xa3c4d5df,0x2c756e74,0x30b487aa,0x99402c68,0x2de870fc,0x91e933d0,0x8c709308,0xbea8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6573bde00df9deef,0xde5c258d2c544697,0x2440fe791ecc666c,0xb98697451a39b37c,0x2c756e74a3c4d5df,0x99402c6830b487aa,0x91e933d02de870fc,0xbea8f8c709308}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf72a,0xf1b7,0x49ce,0xf501,0x736d,0xd3d7,0xcf9c,0x45d9,0x3f81,0xfaca,0x54d5,0x572f,0x4d3b,0x3fe0,0x86cd,0xdf66,0x3496,0x45b4,0x187a,0x7fcd,0xe8d7,0x7ea1,0x5efe,0xe2a9,0xff06,0xd25f,0x99f2,0x4c0d,0x1016,0xa2f4,0x42b9,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1b7f72a,0xf50149ce,0xd3d7736d,0x45d9cf9c,0xfaca3f81,0x572f54d5,0x3fe04d3b,0xdf6686cd,0x45b43496,0x7fcd187a,0x7ea1e8d7,0xe2a95efe,0xd25fff06,0x4c0d99f2,0xa2f41016,0xe42b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf50149cef1b7f72a,0x45d9cf9cd3d7736d,0x572f54d5faca3f81,0xdf6686cd3fe04d3b,0x7fcd187a45b43496,0xe2a95efe7ea1e8d7,0x4c0d99f2d25fff06,0xe42b9a2f41016}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xb83a,0x5e7a,0x2c9b,0xd483,0xeff9,0x71e9,0x4a21,0x2eae,0x921,0xbb26,0x6bf2,0xb038,0xeac9,0xc05a,0xd498,0x34fb,0x7ca,0xaae9,0x2674,0x81de,0x471f,0x7dbe,0x88c9,0xa354,0x9f03,0x5301,0x9acc,0x7c82,0xc479,0x732,0xdc7b,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5e7ab83a,0xd4832c9b,0x71e9eff9,0x2eae4a21,0xbb260921,0xb0386bf2,0xc05aeac9,0x34fbd498,0xaae907ca,0x81de2674,0x7dbe471f,0xa35488c9,0x53019f03,0x7c829acc,0x732c479,0x8dc7b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd4832c9b5e7ab83a,0x2eae4a2171e9eff9,0xb0386bf2bb260921,0x34fbd498c05aeac9,0x81de2674aae907ca,0xa35488c97dbe471f,0x7c829acc53019f03,0x8dc7b0732c479}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 31, ._mp_d = (mp_limb_t[]) {0x4733,0xaeba,0xf3d4,0x84bf,0x453a,0xa71a,0xe0fa,0x4604,0xf02b,0x9bc2,0xb114,0x5fc5,0x5f8d,0x1a8d,0x2302,0x175d,0x3655,0x8351,0x51b,0x698c,0xc745,0x8c83,0xdd6a,0xdd4b,0x682f,0x80b7,0xd1fc,0xe320,0xca30,0xc1d3,0xc365}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xaeba4733,0x84bff3d4,0xa71a453a,0x4604e0fa,0x9bc2f02b,0x5fc5b114,0x1a8d5f8d,0x175d2302,0x83513655,0x698c051b,0x8c83c745,0xdd4bdd6a,0x80b7682f,0xe320d1fc,0xc1d3ca30,0xc365}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x84bff3d4aeba4733,0x4604e0faa71a453a,0x5fc5b1149bc2f02b,0x175d23021a8d5f8d,0x698c051b83513655,0xdd4bdd6a8c83c745,0xe320d1fc80b7682f,0xc365c1d3ca30}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xe32c,0x5173,0xdcb0,0xe05d,0x3a7e,0x6e8c,0xfd38,0xbed7,0x5fe0,0xa986,0x26f1,0xedf0,0x8fc7,0x1dbc,0xa48e,0x2e70,0x6648,0xe767,0xe8c3,0xf05b,0x26aa,0x63b6,0xf8f6,0x5304,0x7042,0x7c93,0x54a2,0xe675,0xd3ea,0x2b1,0xb36e,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5173e32c,0xe05ddcb0,0x6e8c3a7e,0xbed7fd38,0xa9865fe0,0xedf026f1,0x1dbc8fc7,0x2e70a48e,0xe7676648,0xf05be8c3,0x63b626aa,0x5304f8f6,0x7c937042,0xe67554a2,0x2b1d3ea,0x8b36e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe05ddcb05173e32c,0xbed7fd386e8c3a7e,0xedf026f1a9865fe0,0x2e70a48e1dbc8fc7,0xf05be8c3e7676648,0x5304f8f663b626aa,0xe67554a27c937042,0x8b36e02b1d3ea}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x47c6,0xa185,0xd364,0x2b7c,0x1006,0x8e16,0xb5de,0xd151,0xf6de,0x44d9,0x940d,0x4fc7,0x1536,0x3fa5,0x2b67,0xcb04,0xf835,0x5516,0xd98b,0x7e21,0xb8e0,0x8241,0x7736,0x5cab,0x60fc,0xacfe,0x6533,0x837d,0x3b86,0xf8cd,0x2384,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa18547c6,0x2b7cd364,0x8e161006,0xd151b5de,0x44d9f6de,0x4fc7940d,0x3fa51536,0xcb042b67,0x5516f835,0x7e21d98b,0x8241b8e0,0x5cab7736,0xacfe60fc,0x837d6533,0xf8cd3b86,0x72384}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2b7cd364a18547c6,0xd151b5de8e161006,0x4fc7940d44d9f6de,0xcb042b673fa51536,0x7e21d98b5516f835,0x5cab77368241b8e0,0x837d6533acfe60fc,0x72384f8cd3b86}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x116d, 0x165f, 0x7d3, 0x488, 0xe08, 0xb12, 0x2e0, 0x18b4, 0xdbb, 0x181e, 0xe50, 0x19b8, 0xc17, 0x1c82, 0x1cf6, 0x7b9, 0xebb, 0x1c0a, 0x183a, 0x1f42, 0x1a3e, 0x176b, 0x19fa, 0x7e4, 0x1646, 0x1dc5, 0x1e9d, 0x4b3, 0x18df, 0xf2d, 0xe2e, 0x2e3, 0x903, 0x19ef, 0x1f94, 0x237, 0x18ef, 0x26c, 0x12f} +#elif RADIX == 32 +{0x18b69673, 0x107d3b2f, 0x49c1048, 0x5a0b816, 0x181e6dde, 0x1f370e50, 0x1b720982, 0xbb3dcf3, 0x1075c0a7, 0x1e8fbe85, 0x4cfd5da, 0x18b6463f, 0x12cfd3bd, 0x796e37c, 0x62e3717, 0x533de90, 0x7788dff, 0x2e6} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x104883e9d97e2da5, 0x79b778b41702c49c, 0xb720982f9b872860, 0x2c1d7029d767b9e7, 0xc7e4cfd5daf47df4, 0x71be4b3f4ef716c8, 0x67bd2062e37173cb, 0x1089b31de237fca} +#else +{0x9107d3b2fc5b4b, 0x178b41702c49c10, 0x17cdc394303cdb, 0x75d9ee79edc826, 0x15e8fbe8583ae05, 0x1716c8c7e4cfd5d, 0x19e5b8df259fa77, 0x1299ef4818b8dc5, 0x613663bc46ff} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1c5d, 0x1d97, 0x1f4, 0x122, 0x1382, 0x2c4, 0xb8, 0x1e2d, 0x136e, 0x607, 0x394, 0x1e6e, 0x1305, 0x1720, 0xf3d, 0x19ee, 0x13ae, 0x1702, 0x160e, 0x17d0, 0x1e8f, 0x15da, 0x67e, 0x11f9, 0xd91, 0xf71, 0x1fa7, 0x192c, 0xe37, 0x13cb, 0x1b8b, 0x18b8, 0x1a40, 0x67b, 0x1fe5, 0x188d, 0x63b, 0x189b, 0x47b} +#elif RADIX == 32 +{0x1e2ed505, 0x41f4ecb, 0x11270412, 0x11682e05, 0x6079b77, 0x17cdc394, 0x1edc8260, 0x1aecf73c, 0xc1d7029, 0x17a3efa1, 0x1933f576, 0xe2d918f, 0x4b3f4ef, 0x19e5b8df, 0x18b8dc5, 0x194cf7a4, 0x11de237f, 0x159} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x41220fa765f8bb5, 0x1e6dde2d05c0b127, 0xedc8260be6e1ca18, 0xb075c0a75d9ee79, 0x31f933f576bd1f7d, 0xdc6f92cfd3bdc5b2, 0x99ef4818b8dc5cf2, 0x6e26cc7788dff2} +#else +{0x2441f4ecbf176a, 0x1de2d05c0b12704, 0x105f370e50c0f36, 0x9d767b9e7b7209, 0xd7a3efa160eb81, 0x1dc5b231f933f57, 0xe796e37c967e9d, 0x1ca67bd2062e371, 0xdc4d98ef11bf} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0x51d, 0x1394, 0xcca, 0x1568, 0x1790, 0x11d6, 0x18aa, 0xe65, 0x1e8e, 0x4fe, 0xab9, 0x1496, 0x167d, 0x1b42, 0x1f85, 0x1d7a, 0x8c4, 0x17ea, 0x1269, 0x16, 0x1fbf, 0x8b5, 0x6f4, 0x1202, 0x17c4, 0x427, 0x1273, 0x14f, 0x49c, 0xfba, 0x1b3b, 0x13cd, 0x10ee, 0x634, 0x10ae, 0x2c4, 0x10b4, 0x1377, 0xfe} +#elif RADIX == 32 +{0x28e92dc, 0x10cca9ca, 0x15af2156, 0x132e2aa3, 0x4fef473, 0x1692cab9, 0x2ed0acf, 0xc4ebd7e, 0x4d37ea4, 0xfefc02d, 0x237a22d, 0x4f7c490, 0x53e4e64, 0x17dd1270, 0x1d3cdd9d, 0xb8c690e, 0x5a0b121, 0x1bc} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x215686654e50a3a4, 0xfbd1ce65c55475af, 0x2ed0acfb49655c93, 0x6934dfa9189d7afc, 0x920237a22d7f7e01, 0x893814f939909ef8, 0x18d21dd3cdd9dbee, 0x134dde1682c4857} +#else +{0xad0cca9ca14749, 0x1ce65c55475af21, 0x7da4b2ae49fde8, 0x46275ebf0bb42b, 0x1afefc02d269bf5, 0x109ef8920237a22, 0xdf7449c0a7c9cc, 0x15c6348774f3767, 0xb9bbc2d05890} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x17ab, 0x1e1a, 0x1bfe, 0x1f73, 0x1eb9, 0xf30, 0x1cca, 0x1aaf, 0xbea, 0xa1b, 0xb73, 0x86d, 0x1c13, 0x1c31, 0x1e6e, 0x1fbf, 0x968, 0x10f0, 0xb53, 0x1418, 0x11c6, 0x65f, 0x188, 0x2c7, 0x79b, 0xa9, 0xa92, 0x12b0, 0x1b53, 0x1564, 0xfa7, 0x1fd7, 0xa5b, 0xb32, 0x1bc8, 0xc90, 0x11ee, 0x1f6, 0x3f2} +#elif RADIX == 32 +{0xbd5cad1, 0x7bfef0d, 0xc3d73f7, 0x157f329e, 0xa1b5f56, 0xd0dab73, 0x1770c782, 0x168fdff9, 0x16a70f04, 0x1c71a830, 0x70c4197, 0x15279b16, 0xac15240, 0x1ab26d4e, 0x17fd77d3, 0x121664a5, 0xf732437, 0xa34} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x73f73dff786af572, 0x6d7d5aafe653cc3d, 0x770c782686d5b9a8, 0x85a9c3c12d1fbff3, 0x62c70c4197e38d41, 0x36a72b054902a4f3, 0x2cc94b7fd77d3d59, 0x1307da3dcc90de4} +#else +{0x1ee7bfef0d5eae5, 0x15aafe653cc3d73, 0x13436adcd436be, 0x4b47effcddc31e, 0xfc71a830b53878, 0x2a4f362c70c419, 0x1eac9b539582a48, 0x190b3252dff5df4, 0xb0fb47b9921b} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x166f, 0x4b7, 0x1268, 0x18f5, 0x10a9, 0x17ea, 0x105e, 0x1090, 0x1c31, 0x624, 0xec6, 0xea1, 0x17d2, 0xf55, 0x10d3, 0x8fb, 0x9ab, 0x1ae2, 0x952, 0xcab, 0x100d, 0x702, 0xc4d, 0x1387, 0x344, 0xdaf, 0x1566, 0xf8c, 0x1e1c, 0x6f1, 0x1af9, 0xf1, 0xd6d, 0xa06, 0xb5c, 0x62c, 0x2e9, 0x1131, 0x683} +#elif RADIX == 32 +{0x1b37fb85, 0xb26825b, 0x1aa1538f, 0x48417af, 0x624e18c, 0x9d42ec6, 0x9bd56fa, 0x1ab47dc3, 0x12a5ae24, 0x14035956, 0x76269c0, 0x15e3449c, 0x1e32accd, 0x1378f871, 0x1a0f1d7c, 0x17140cd6, 0x17498b16, 0x608} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x538f593412decdfe, 0x9386309082f5faa1, 0x9bd56fa4ea176318, 0xb4a96b893568fb86, 0x93876269c0a01aca, 0x7c38f8cab336bc68, 0x2819ada0f1d7c9bc, 0x17c4c45d262c5ae} +#else +{0x11eb26825bd9bfd, 0x309082f5faa153, 0x1d2750bb18c49c3, 0x4d5a3ee1a6f55b, 0x14035956952d71, 0x16bc6893876269c, 0x4de3e1c7c65599, 0xb8a066b683c75f, 0x148988ba4c58b} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x826, 0x1efe, 0xa95, 0x174d, 0x11b5, 0x1184, 0x1d4, 0x1024, 0x1d44, 0x349, 0x83c, 0x665, 0x4a2, 0x1288, 0x473, 0xa16, 0xe54, 0xafc, 0x6e2, 0x13f1, 0x217, 0x11e4, 0x1988, 0xe26, 0xd9a, 0x168f, 0x3d, 0x1436, 0x311, 0x148d, 0x168f, 0x1ad8, 0x1156, 0xb8, 0x193f, 0x1655, 0x279, 0x5cd, 0x65e} +#elif RADIX == 32 +{0x41378c1, 0x1aa95f7f, 0x1236b74, 0x1207523, 0x349ea24, 0x8cca83c, 0x19ca2094, 0x5450b11, 0xdc4afc7, 0x85e7e2, 0x6cc4479, 0x11ed9a71, 0x10d807b6, 0x1a468c46, 0xdad8b47, 0xfc17115, 0x13cd9572, 0xe8} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x6b74d54afbf904de, 0x27a890240ea46123, 0x9ca2094466541e0d, 0x13712bf1ca8a1623, 0x4e26cc4479042f3f, 0x462343601eda3db3, 0x82e22adad8b47d23, 0x517344f3655c9f} +#else +{0xe9aa95f7f209bc, 0x90240ea461236b, 0xa2332a0f0693d4, 0x72a28588e72882, 0x12085e7e26e257e, 0x1a3db34e26cc447, 0x1e91a311a1b00f6, 0x7e0b88ab6b62d1, 0xa2e689e6cab9} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x1aab, 0xe01, 0x1bf3, 0x122d, 0xd71, 0x34e, 0x153b, 0x1444, 0x1d19, 0x1165, 0x1496, 0x568, 0x12d4, 0x105c, 0x1129, 0x2c7, 0x1706, 0x359, 0x1a4f, 0x114, 0x758, 0x1780, 0x1617, 0x1485, 0x1147, 0xa4f, 0x1f77, 0xf13, 0x1547, 0x103c, 0x352, 0x125d, 0xb1e, 0x1526, 0x1708, 0xfb5, 0x17bf, 0x1d55, 0x6bc} +#elif RADIX == 32 +{0x1d55ffc5, 0x1bbf3700, 0x139ae322, 0x2254ec6, 0x1165e8cd, 0x10ad1496, 0x14c1725a, 0x106163c4, 0x149e359b, 0x1d60229, 0x5b0bde0, 0x9f147a4, 0x1c4feeea, 0x81e551d, 0x1d25d1a9, 0x22a4cb1, 0x1dfbed6e, 0x72d} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xe322ddf9b807557f, 0x97a33444a9d8d39a, 0x4c1725a8568a4b45, 0x4d278d66e0c2c789, 0xf485b0bde00eb011, 0x2a8ef13fbba93e28, 0x549963d25d1a940f, 0x197556f7efb5b84} +#else +{0x45bbf3700eaaff, 0x13444a9d8d39ae3, 0xd42b4525a2cbd1, 0x1b830b1e25305c9, 0x1d60229a4f1ac, 0x93e28f485b0bde, 0xa079547789fddd, 0x1152658f49746a, 0x17eaadefdf6b7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x204, 0x9f6, 0x1dba, 0x110e, 0x6ea, 0x112a, 0xa11, 0xd06, 0x15aa, 0x1f0b, 0xeec, 0xef1, 0x1edc, 0x1604, 0x65b, 0x129, 0x39d, 0x8f8, 0x5d5, 0x672, 0x150a, 0x233, 0xc20, 0x12ba, 0x1855, 0x15a6, 0xd50, 0x1c71, 0x15b7, 0xf04, 0x579, 0x16d2, 0xbac, 0x4c9, 0xaf5, 0x514, 0xf27, 0xef, 0x36a} +#elif RADIX == 32 +{0x10240be, 0x1ddba4fb, 0xa8dd510, 0x8328462, 0x1f0bad53, 0x11de2eec, 0xdd813db, 0x19d09499, 0xbaa8f81, 0x1d428ce4, 0x1a61008c, 0x14d85595, 0x11c5aa15, 0x178256df, 0x196d22bc, 0x1d4992ba, 0x19394515, 0x27b} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xd510eedd27d84090, 0x2eb54d06508c4a8d, 0xdd813db8ef17767c, 0x22eaa3e073a12932, 0xb2ba61008cea1467, 0x2b6fc716a8569b0a, 0x93257596d22bcbc1, 0x503bde4e51457a} +#else +{0x21ddba4fb08120, 0x14d06508c4a8dd5, 0xdc778bbb3e175a, 0x1ce84a4cb7604f, 0x19d428ce45d547c, 0x169b0ab2ba61008, 0x5e095b7e38b542, 0x1ea4c95d65b48af, 0xa077bc9ca28a} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2ce5,0xf14f,0xd32e,0x18c2,0x5217,0x2833,0xa7fc,0x4090,0xd9d5,0x4d89,0xe770,0x3801,0xbca0,0x6ac9,0x5432,0x2ee5,0x4356,0x827a,0xdf1a,0x8911,0x4102,0xf05a,0x3e5,0x18b9,0xf66f,0x77ad,0xd99b,0xea2f,0xa030,0x36bb,0xe071,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf14f2ce5,0x18c2d32e,0x28335217,0x4090a7fc,0x4d89d9d5,0x3801e770,0x6ac9bca0,0x2ee55432,0x827a4356,0x8911df1a,0xf05a4102,0x18b903e5,0x77adf66f,0xea2fd99b,0x36bba030,0xde071}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x18c2d32ef14f2ce5,0x4090a7fc28335217,0x3801e7704d89d9d5,0x2ee554326ac9bca0,0x8911df1a827a4356,0x18b903e5f05a4102,0xea2fd99b77adf66f,0xde07136bba030}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x752,0x8c67,0x260,0x14f,0x138a,0x865,0x5e4d,0x4db9,0xca26,0x7a2c,0x4a7e,0x9422,0xb2f6,0xbdc8,0x841d,0x7e33,0x5677,0x38a6,0x9633,0x15fc,0xacce,0xbe04,0xdcef,0xb16c,0xd57b,0x7a5e,0x8395,0x1f8f,0xe4b9,0xe383,0x4be3,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8c670752,0x14f0260,0x865138a,0x4db95e4d,0x7a2cca26,0x94224a7e,0xbdc8b2f6,0x7e33841d,0x38a65677,0x15fc9633,0xbe04acce,0xb16cdcef,0x7a5ed57b,0x1f8f8395,0xe383e4b9,0x64be3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x14f02608c670752,0x4db95e4d0865138a,0x94224a7e7a2cca26,0x7e33841dbdc8b2f6,0x15fc963338a65677,0xb16cdcefbe04acce,0x1f8f83957a5ed57b,0x64be3e383e4b9}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9b63,0x40f2,0x5177,0x535f,0x5098,0x2f26,0x18a2,0x5e1c,0x5d70,0x33e9,0x1db9,0x2397,0xaccc,0xb98b,0xcae6,0x87bf,0xd43f,0xb329,0xf2d0,0x2f67,0x779c,0xd2ab,0x4369,0xc67d,0xd065,0x9550,0xf06b,0x1a2b,0xc6e,0x9b2b,0xbb64,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x40f29b63,0x535f5177,0x2f265098,0x5e1c18a2,0x33e95d70,0x23971db9,0xb98baccc,0x87bfcae6,0xb329d43f,0x2f67f2d0,0xd2ab779c,0xc67d4369,0x9550d065,0x1a2bf06b,0x9b2b0c6e,0x3bb64}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x535f517740f29b63,0x5e1c18a22f265098,0x23971db933e95d70,0x87bfcae6b98baccc,0x2f67f2d0b329d43f,0xc67d4369d2ab779c,0x1a2bf06b9550d065,0x3bb649b2b0c6e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xd31b,0xeb0,0x2cd1,0xe73d,0xade8,0xd7cc,0x5803,0xbf6f,0x262a,0xb276,0x188f,0xc7fe,0x435f,0x9536,0xabcd,0xd11a,0xbca9,0x7d85,0x20e5,0x76ee,0xbefd,0xfa5,0xfc1a,0xe746,0x990,0x8852,0x2664,0x15d0,0x5fcf,0xc944,0x1f8e,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xeb0d31b,0xe73d2cd1,0xd7ccade8,0xbf6f5803,0xb276262a,0xc7fe188f,0x9536435f,0xd11aabcd,0x7d85bca9,0x76ee20e5,0xfa5befd,0xe746fc1a,0x88520990,0x15d02664,0xc9445fcf,0x21f8e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe73d2cd10eb0d31b,0xbf6f5803d7ccade8,0xc7fe188fb276262a,0xd11aabcd9536435f,0x76ee20e57d85bca9,0xe746fc1a0fa5befd,0x15d0266488520990,0x21f8ec9445fcf}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x4222,0xe40c,0x843f,0x3518,0x72d1,0xa757,0xb4e5,0x4347,0x3326,0xc267,0x30d,0xb77e,0x9907,0xcb8c,0xd175,0x8cf2,0x5440,0xb876,0x2316,0xa715,0xf0ab,0x9e96,0xa72f,0xcd7f,0x1e06,0xa42f,0x985f,0xdc2d,0xd9ee,0xe71e,0x2ae0,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe40c4222,0x3518843f,0xa75772d1,0x4347b4e5,0xc2673326,0xb77e030d,0xcb8c9907,0x8cf2d175,0xb8765440,0xa7152316,0x9e96f0ab,0xcd7fa72f,0xa42f1e06,0xdc2d985f,0xe71ed9ee,0x82ae0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3518843fe40c4222,0x4347b4e5a75772d1,0xb77e030dc2673326,0x8cf2d175cb8c9907,0xa7152316b8765440,0xcd7fa72f9e96f0ab,0xdc2d985fa42f1e06,0x82ae0e71ed9ee}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x11ac,0x1c90,0x6c62,0x15fd,0x1924,0x5851,0x60c6,0x744c,0x80fd,0xa6b,0x5654,0x51a1,0x6589,0x803f,0xf265,0x4132,0x96d2,0x7497,0xcf0b,0x65,0x2e51,0x2bc,0x4203,0x3aad,0x1f2,0x5b40,0xcc1a,0x67e4,0xdfd3,0xba17,0x7a8c,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1c9011ac,0x15fd6c62,0x58511924,0x744c60c6,0xa6b80fd,0x51a15654,0x803f6589,0x4132f265,0x749796d2,0x65cf0b,0x2bc2e51,0x3aad4203,0x5b4001f2,0x67e4cc1a,0xba17dfd3,0x37a8c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x15fd6c621c9011ac,0x744c60c658511924,0x51a156540a6b80fd,0x4132f265803f6589,0x65cf0b749796d2,0x3aad420302bc2e51,0x67e4cc1a5b4001f2,0x37a8cba17dfd3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x99f9,0x50f4,0xd750,0xb0a2,0xfdaa,0x6986,0x6b4b,0x34be,0x7bd5,0x3974,0xe05,0x8c18,0x6bb8,0xbb5a,0xcc33,0x63b5,0x943b,0xec49,0xb4ef,0xbdc4,0x5a2a,0x2fc8,0x85ad,0x1291,0xa29f,0x9618,0x721b,0x93f6,0xb40f,0x2e85,0xdfbb,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x50f499f9,0xb0a2d750,0x6986fdaa,0x34be6b4b,0x39747bd5,0x8c180e05,0xbb5a6bb8,0x63b5cc33,0xec49943b,0xbdc4b4ef,0x2fc85a2a,0x129185ad,0x9618a29f,0x93f6721b,0x2e85b40f,0xbdfbb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb0a2d75050f499f9,0x34be6b4b6986fdaa,0x8c180e0539747bd5,0x63b5cc33bb5a6bb8,0xbdc4b4efec49943b,0x129185ad2fc85a2a,0x93f6721b9618a29f,0xbdfbb2e85b40f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf4c0,0x4ff5,0x2aee,0x3e90,0x49,0xb2af,0xf257,0x111c,0xead0,0xc1d5,0xc7d9,0x8a7c,0x9579,0xf62,0xe1f6,0xb43c,0x8f3f,0x14ca,0x1b7b,0xc209,0xac8,0xf5cd,0xdfc0,0x5d39,0x9d8d,0x9c9a,0x2e6e,0xba54,0x79d5,0x4f02,0x1cfc,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4ff5f4c0,0x3e902aee,0xb2af0049,0x111cf257,0xc1d5ead0,0x8a7cc7d9,0xf629579,0xb43ce1f6,0x14ca8f3f,0xc2091b7b,0xf5cd0ac8,0x5d39dfc0,0x9c9a9d8d,0xba542e6e,0x4f0279d5,0x21cfc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3e902aee4ff5f4c0,0x111cf257b2af0049,0x8a7cc7d9c1d5ead0,0xb43ce1f60f629579,0xc2091b7b14ca8f3f,0x5d39dfc0f5cd0ac8,0xba542e6e9c9a9d8d,0x21cfc4f0279d5}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1eb,0x1730,0x3343,0xcef3,0x2add,0x7615,0x353e,0xd52b,0x9951,0xc1,0x2292,0x69d0,0x4a9f,0xc1bd,0xfec7,0xd332,0x72b7,0x67f8,0xaa27,0x61a4,0x33dd,0x8ec0,0xfe1d,0x9a69,0x38ac,0x60f,0x209b,0xbb33,0x55b1,0x13f5,0x5c80,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x173001eb,0xcef33343,0x76152add,0xd52b353e,0xc19951,0x69d02292,0xc1bd4a9f,0xd332fec7,0x67f872b7,0x61a4aa27,0x8ec033dd,0x9a69fe1d,0x60f38ac,0xbb33209b,0x13f555b1,0xc5c80}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcef33343173001eb,0xd52b353e76152add,0x69d0229200c19951,0xd332fec7c1bd4a9f,0x61a4aa2767f872b7,0x9a69fe1d8ec033dd,0xbb33209b060f38ac,0xc5c8013f555b1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x6607,0xaf0b,0x28af,0x4f5d,0x255,0x9679,0x94b4,0xcb41,0x842a,0xc68b,0xf1fa,0x73e7,0x9447,0x44a5,0x33cc,0x9c4a,0x6bc4,0x13b6,0x4b10,0x423b,0xa5d5,0xd037,0x7a52,0xed6e,0x5d60,0x69e7,0x8de4,0x6c09,0x4bf0,0xd17a,0x2044,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xaf0b6607,0x4f5d28af,0x96790255,0xcb4194b4,0xc68b842a,0x73e7f1fa,0x44a59447,0x9c4a33cc,0x13b66bc4,0x423b4b10,0xd037a5d5,0xed6e7a52,0x69e75d60,0x6c098de4,0xd17a4bf0,0x42044}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4f5d28afaf0b6607,0xcb4194b496790255,0x73e7f1fac68b842a,0x9c4a33cc44a59447,0x423b4b1013b66bc4,0xed6e7a52d037a5d5,0x6c098de469e75d60,0x42044d17a4bf0}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2ce5,0xf14f,0xd32e,0x18c2,0x5217,0x2833,0xa7fc,0x4090,0xd9d5,0x4d89,0xe770,0x3801,0xbca0,0x6ac9,0x5432,0x2ee5,0x4356,0x827a,0xdf1a,0x8911,0x4102,0xf05a,0x3e5,0x18b9,0xf66f,0x77ad,0xd99b,0xea2f,0xa030,0x36bb,0xe071,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf14f2ce5,0x18c2d32e,0x28335217,0x4090a7fc,0x4d89d9d5,0x3801e770,0x6ac9bca0,0x2ee55432,0x827a4356,0x8911df1a,0xf05a4102,0x18b903e5,0x77adf66f,0xea2fd99b,0x36bba030,0xde071}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x18c2d32ef14f2ce5,0x4090a7fc28335217,0x3801e7704d89d9d5,0x2ee554326ac9bca0,0x8911df1a827a4356,0x18b903e5f05a4102,0xea2fd99b77adf66f,0xde07136bba030}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x752,0x8c67,0x260,0x14f,0x138a,0x865,0x5e4d,0x4db9,0xca26,0x7a2c,0x4a7e,0x9422,0xb2f6,0xbdc8,0x841d,0x7e33,0x5677,0x38a6,0x9633,0x15fc,0xacce,0xbe04,0xdcef,0xb16c,0xd57b,0x7a5e,0x8395,0x1f8f,0xe4b9,0xe383,0x4be3,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8c670752,0x14f0260,0x865138a,0x4db95e4d,0x7a2cca26,0x94224a7e,0xbdc8b2f6,0x7e33841d,0x38a65677,0x15fc9633,0xbe04acce,0xb16cdcef,0x7a5ed57b,0x1f8f8395,0xe383e4b9,0x64be3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x14f02608c670752,0x4db95e4d0865138a,0x94224a7e7a2cca26,0x7e33841dbdc8b2f6,0x15fc963338a65677,0xb16cdcefbe04acce,0x1f8f83957a5ed57b,0x64be3e383e4b9}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9b63,0x40f2,0x5177,0x535f,0x5098,0x2f26,0x18a2,0x5e1c,0x5d70,0x33e9,0x1db9,0x2397,0xaccc,0xb98b,0xcae6,0x87bf,0xd43f,0xb329,0xf2d0,0x2f67,0x779c,0xd2ab,0x4369,0xc67d,0xd065,0x9550,0xf06b,0x1a2b,0xc6e,0x9b2b,0xbb64,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x40f29b63,0x535f5177,0x2f265098,0x5e1c18a2,0x33e95d70,0x23971db9,0xb98baccc,0x87bfcae6,0xb329d43f,0x2f67f2d0,0xd2ab779c,0xc67d4369,0x9550d065,0x1a2bf06b,0x9b2b0c6e,0x3bb64}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x535f517740f29b63,0x5e1c18a22f265098,0x23971db933e95d70,0x87bfcae6b98baccc,0x2f67f2d0b329d43f,0xc67d4369d2ab779c,0x1a2bf06b9550d065,0x3bb649b2b0c6e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xd31b,0xeb0,0x2cd1,0xe73d,0xade8,0xd7cc,0x5803,0xbf6f,0x262a,0xb276,0x188f,0xc7fe,0x435f,0x9536,0xabcd,0xd11a,0xbca9,0x7d85,0x20e5,0x76ee,0xbefd,0xfa5,0xfc1a,0xe746,0x990,0x8852,0x2664,0x15d0,0x5fcf,0xc944,0x1f8e,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xeb0d31b,0xe73d2cd1,0xd7ccade8,0xbf6f5803,0xb276262a,0xc7fe188f,0x9536435f,0xd11aabcd,0x7d85bca9,0x76ee20e5,0xfa5befd,0xe746fc1a,0x88520990,0x15d02664,0xc9445fcf,0x21f8e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe73d2cd10eb0d31b,0xbf6f5803d7ccade8,0xc7fe188fb276262a,0xd11aabcd9536435f,0x76ee20e57d85bca9,0xe746fc1a0fa5befd,0x15d0266488520990,0x21f8ec9445fcf}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2111,0xf206,0x421f,0x9a8c,0xb968,0xd3ab,0xda72,0x21a3,0x9993,0xe133,0x186,0xdbbf,0x4c83,0xe5c6,0x68ba,0x4679,0x2a20,0x5c3b,0x918b,0xd38a,0x7855,0xcf4b,0xd397,0x66bf,0x8f03,0xd217,0xcc2f,0x6e16,0x6cf7,0x738f,0x1570,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf2062111,0x9a8c421f,0xd3abb968,0x21a3da72,0xe1339993,0xdbbf0186,0xe5c64c83,0x467968ba,0x5c3b2a20,0xd38a918b,0xcf4b7855,0x66bfd397,0xd2178f03,0x6e16cc2f,0x738f6cf7,0x41570}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9a8c421ff2062111,0x21a3da72d3abb968,0xdbbf0186e1339993,0x467968bae5c64c83,0xd38a918b5c3b2a20,0x66bfd397cf4b7855,0x6e16cc2fd2178f03,0x41570738f6cf7}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x8d6,0xe48,0xb631,0xafe,0x8c92,0x2c28,0x3063,0xba26,0xc07e,0x535,0xab2a,0xa8d0,0xb2c4,0xc01f,0x7932,0x2099,0xcb69,0xba4b,0xe785,0x8032,0x1728,0x815e,0xa101,0x1d56,0xf9,0x2da0,0x660d,0xb3f2,0xefe9,0x5d0b,0xbd46,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe4808d6,0xafeb631,0x2c288c92,0xba263063,0x535c07e,0xa8d0ab2a,0xc01fb2c4,0x20997932,0xba4bcb69,0x8032e785,0x815e1728,0x1d56a101,0x2da000f9,0xb3f2660d,0x5d0befe9,0x1bd46}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xafeb6310e4808d6,0xba2630632c288c92,0xa8d0ab2a0535c07e,0x20997932c01fb2c4,0x8032e785ba4bcb69,0x1d56a101815e1728,0xb3f2660d2da000f9,0x1bd465d0befe9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x129d,0xdd4c,0xe2b2,0xca3b,0x6c0b,0x9c8b,0x68f9,0x412,0x51a8,0x7583,0xae25,0xb80d,0x35d5,0x387b,0x4ba1,0x66e1,0x754,0xf6b6,0x3d8c,0x650,0xa955,0x214f,0xc05f,0x16d2,0x9ce4,0x246f,0x123e,0x3ed3,0xa07f,0x2e24,0x8964,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdd4c129d,0xca3be2b2,0x9c8b6c0b,0x41268f9,0x758351a8,0xb80dae25,0x387b35d5,0x66e14ba1,0xf6b60754,0x6503d8c,0x214fa955,0x16d2c05f,0x246f9ce4,0x3ed3123e,0x2e24a07f,0x58964}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xca3be2b2dd4c129d,0x41268f99c8b6c0b,0xb80dae25758351a8,0x66e14ba1387b35d5,0x6503d8cf6b60754,0x16d2c05f214fa955,0x3ed3123e246f9ce4,0x589642e24a07f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9e3f,0xbc60,0xa44c,0x253c,0xa75e,0xa9f9,0x326f,0x9f9f,0x14aa,0xa47f,0x3889,0x5ee3,0x87d,0x933f,0x6cba,0x6222,0xcd43,0xa8c9,0xa815,0x992a,0x643a,0xc1d3,0x4cff,0xf675,0xf30b,0x7e2a,0x5248,0xb9e4,0xa454,0x2c53,0x525b,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbc609e3f,0x253ca44c,0xa9f9a75e,0x9f9f326f,0xa47f14aa,0x5ee33889,0x933f087d,0x62226cba,0xa8c9cd43,0x992aa815,0xc1d3643a,0xf6754cff,0x7e2af30b,0xb9e45248,0x2c53a454,0x3525b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x253ca44cbc609e3f,0x9f9f326fa9f9a75e,0x5ee33889a47f14aa,0x62226cba933f087d,0x992aa815a8c9cd43,0xf6754cffc1d3643a,0xb9e452487e2af30b,0x3525b2c53a454}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x584d,0xa517,0xb681,0x45de,0xc2ea,0x7c58,0x123,0xe0fd,0xfd80,0x6c5b,0xf669,0xddc5,0xb21a,0xcaa9,0xc7a0,0x37ec,0xf8c6,0x12e7,0xe984,0xe812,0xef9f,0x128a,0x9fca,0x41f5,0x118f,0x5c32,0xf1cf,0x78c5,0x9424,0x2ae3,0x60d2,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa517584d,0x45deb681,0x7c58c2ea,0xe0fd0123,0x6c5bfd80,0xddc5f669,0xcaa9b21a,0x37ecc7a0,0x12e7f8c6,0xe812e984,0x128aef9f,0x41f59fca,0x5c32118f,0x78c5f1cf,0x2ae39424,0x260d2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x45deb681a517584d,0xe0fd01237c58c2ea,0xddc5f6696c5bfd80,0x37ecc7a0caa9b21a,0xe812e98412e7f8c6,0x41f59fca128aef9f,0x78c5f1cf5c32118f,0x260d22ae39424}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xed63,0x22b3,0x1d4d,0x35c4,0x93f4,0x6374,0x9706,0xfbed,0xae57,0x8a7c,0x51da,0x47f2,0xca2a,0xc784,0xb45e,0x991e,0xf8ab,0x949,0xc273,0xf9af,0x56aa,0xdeb0,0x3fa0,0xe92d,0x631b,0xdb90,0xedc1,0xc12c,0x5f80,0xd1db,0x769b,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x22b3ed63,0x35c41d4d,0x637493f4,0xfbed9706,0x8a7cae57,0x47f251da,0xc784ca2a,0x991eb45e,0x949f8ab,0xf9afc273,0xdeb056aa,0xe92d3fa0,0xdb90631b,0xc12cedc1,0xd1db5f80,0xa769b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x35c41d4d22b3ed63,0xfbed9706637493f4,0x47f251da8a7cae57,0x991eb45ec784ca2a,0xf9afc2730949f8ab,0xe92d3fa0deb056aa,0xc12cedc1db90631b,0xa769bd1db5f80}}} +#endif +}}}, {{{ +#if 0 +#elif RADIX == 16 +{0x1414, 0x1912, 0xddb, 0xb9, 0x121b, 0x195d, 0x6c5, 0xe75, 0x1d16, 0xcaf, 0x1a05, 0x15cc, 0x1537, 0x1c57, 0x141a, 0x1b9d, 0x5b0, 0x9e7, 0xf10, 0x300, 0x1d5c, 0xc13, 0x245, 0x1b91, 0x352, 0x730, 0xd55, 0x1ca3, 0x1dac, 0x7b0, 0x15b9, 0x1ba6, 0x7d6, 0xba4, 0xc12, 0x649, 0xf1, 0xd51, 0x107} +#elif RADIX == 32 +{0xa0a1383, 0x12ddbc89, 0x1764360b, 0x13a9b172, 0xcafe8b3, 0x1eb99a05, 0xd715ea6, 0x1b0dced0, 0x1e209e72, 0x1f570600, 0x11122b04, 0x60352dc, 0x128daaa7, 0x13d876b3, 0xdba6adc, 0x497487d, 0x7899258, 0x208} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x360b96ede44a8284, 0xbfa2ce75362e5764, 0xd715ea6f5ccd02b2, 0x788279cb61b9da0, 0x5b91122b04fab830, 0x3b59ca36aa9cc06a, 0x2e90fadba6adc9ec, 0x17b5441e2649609} +#else +{0x172ddbc8950509, 0xce75362e576436, 0x137ae6681595fd1, 0x12d86e76835c57a, 0x9f570600f104f3, 0x1cc06a5b91122b0, 0x4f61dace51b554, 0x24ba43eb6e9ab7, 0x146a883c4c92c} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, {{ +#if 0 +#elif RADIX == 16 +{0x1507, 0x1e44, 0xb76, 0x182e, 0xc86, 0xe57, 0x9b1, 0x139d, 0x1f45, 0xb2b, 0x681, 0x1d73, 0x1d4d, 0x1715, 0xd06, 0x6e7, 0x196c, 0x279, 0x3c4, 0xc0, 0x1f57, 0xb04, 0x891, 0x16e4, 0xd4, 0x9cc, 0x1b55, 0x728, 0x76b, 0x9ec, 0x156e, 0x16e9, 0x1f5, 0x12e9, 0xb04, 0x992, 0x83c, 0x1b54, 0x2c1} +#elif RADIX == 32 +{0xa83b449, 0x1cb76f22, 0x15d90d82, 0x1cea6c5c, 0xb2bfa2c, 0x17ae6681, 0x35c57a9, 0x16c373b4, 0x788279c, 0x7d5c180, 0x4448ac1, 0x1980d4b7, 0x1ca36aa9, 0x4f61dac, 0xb6e9ab7, 0x125d21f, 0x1e26496, 0x122} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xd82e5bb7912a0ed, 0xafe8b39d4d8b95d9, 0x35c57a9bd73340ac, 0x1e209e72d86e768, 0x96e4448ac13eae0c, 0xed6728daaa7301a, 0x4ba43eb6e9ab727b, 0x1ed51078992582} +#else +{0x105cb76f22541da, 0xb39d4d8b95d90d, 0x14deb99a05657f4, 0x1cb61b9da0d715e, 0x27d5c1803c413c, 0x7301a96e4448ac, 0x193d876b3946d55, 0x92e90fadba6ad, 0x3daa20f1324b} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, true}, {{{ +#if 0 +#elif RADIX == 16 +{0xa07, 0x1f97, 0x13c4, 0xb69, 0x15ec, 0x161d, 0x194, 0x135c, 0xe18, 0x119a, 0x684, 0x199, 0x1a93, 0x906, 0x62e, 0x1ad4, 0xc99, 0x40b, 0x10df, 0xf12, 0x9ee, 0x93, 0x1837, 0x42d, 0x1ea3, 0x1967, 0x1d41, 0x422, 0x2d5, 0x17d0, 0x1550, 0x1c2d, 0x139a, 0x152b, 0xa57, 0x1072, 0x13bf, 0x1fe7, 0x57a} +#elif RADIX == 32 +{0x1503e7ec, 0x133c4fcb, 0x76bd8b6, 0x1ae0652c, 0x119a70c4, 0xc332684, 0x17241b52, 0x99d6a18, 0x1be40b6, 0x1a7b9e25, 0xdc1b824, 0xcfea321, 0x108ba839, 0xbe80b54, 0x15c2daa8, 0x15ea5739, 0x1dfc1c94, 0xd3c} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xd8b699e27e5d40f9, 0x69c3135c0ca5876b, 0x7241b52619934246, 0x286f902d933ad431, 0x642dc1b824d3dcf1, 0x5aa422ea0e59fd4, 0xd4ae735c2daa85f4, 0x1a7f9e77f07252b} +#else +{0x16d33c4fcba81f3, 0x1135c0ca5876bd8, 0x930cc9a12334e1, 0x164ceb50c5c906d, 0x9a7b9e250df205, 0x59fd4642dc1b82, 0x2fa02d52117507, 0xaf52b9cd70b6aa, 0x19ff3cefe0e4a} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x2, 0x2d8, 0x113e, 0xa74, 0x660, 0x141f, 0x64f, 0x885, 0x46, 0x17b9, 0x94f, 0x1b44, 0x361, 0xbf6, 0x1f17, 0x583, 0x18b3, 0x118e, 0x9ba, 0x49f, 0x1fc3, 0x13eb, 0x11c8, 0xcc8, 0x1b2d, 0x8c, 0x9c6, 0x1d9, 0xf33, 0x53d, 0x129a, 0x1b4a, 0x65, 0x169a, 0xe74, 0x544, 0x17e3, 0x1f0f, 0x2a6} +#elif RADIX == 32 +{0x1324b, 0x913e16c, 0x7ccc0a7, 0x42993e8, 0x17b90232, 0x768894f, 0xbafd86c, 0xb32c1fc, 0x137518ec, 0x1ff0c93e, 0x88e44fa, 0x119b2d66, 0x76538c0, 0x29ebccc, 0xbb4a94d, 0x1d2d3406, 0x1f19511c, 0x3fd} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xc0a7489f0b60004c, 0xe408c885327d07cc, 0xbafd86c3b444a7de, 0xf4dd463b166583f8, 0xacc88e44faff8649, 0x5e661d94e3023365, 0x5a680cbb4a94d14f, 0xf7c3efc654473a} +#else +{0x14e913e16c00099, 0xc885327d07ccc0, 0x161da2253ef7204, 0xc59960fe2ebf61, 0x15ff0c93e9ba8c7, 0x23365acc88e44f, 0x8a7af330eca718, 0xe969a032ed2a53, 0x3f87df8ca88e} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0xe6e, 0xc55, 0xb5a, 0x1be4, 0x10f8, 0x1175, 0x1ada, 0x13de, 0xa0d, 0x1cb, 0x6f3, 0x91f, 0x70c, 0x12ef, 0x1403, 0x115a, 0x1205, 0x1705, 0xb8a, 0x490, 0x681, 0x1a6f, 0xd49, 0x2ca, 0x7e2, 0x1ad8, 0x1aa6, 0x9e8, 0x1f0f, 0x1df, 0xc32, 0xd30, 0x1a34, 0xfc4, 0x1519, 0x1cde, 0x7c9, 0x12da, 0x157} +#elif RADIX == 32 +{0x17371973, 0x8b5a62a, 0x1d61f1be, 0x1ef6b6a2, 0x1cb506c, 0x1123e6f3, 0x1cbbce1, 0x58ad50, 0x17157059, 0x19a04920, 0xa6a4e9b, 0x1b07e216, 0x7a354da, 0xeffc3d, 0x8d30619, 0x65f89a3, 0x1e4f37aa, 0x651} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf1be45ad3155cdc6, 0x2d41b3ded6d45d61, 0x1cbbce1891f37987, 0x5c55c1640b15aa0, 0x42ca6a4e9bcd0249, 0xfe1e9e8d536b60fc, 0xbf13468d30619077, 0x9cb68f93cdea8c} +#else +{0x17c8b5a62ab9b8c, 0x1b3ded6d45d61f1, 0x10c48f9bcc396a0, 0x1902c56a8072ef3, 0x179a04920b8ab82, 0xb60fc42ca6a4e9, 0x83bff0f4f46a9b, 0x32fc4d1a34c186, 0x1396d1f279bd5} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0xc71, 0x167c, 0x1de2, 0x708, 0xb78, 0x1797, 0x16d0, 0xc73, 0x1f29, 0x1014, 0x1753, 0x1dd9, 0x1326, 0xab2, 0x1e6e, 0x51a, 0x32d, 0x7c1, 0x127b, 0x1b08, 0xcd4, 0x5fd, 0x159a, 0xb2c, 0x137d, 0x28f, 0xc4f, 0x121a, 0x16dd, 0x1771, 0xa7b, 0x11b9, 0xe86, 0x199c, 0x1cb5, 0x2db, 0x14b3, 0x1e97, 0x7b} +#elif RADIX == 32 +{0x638892e, 0x11de2b3e, 0x5d6f070, 0x39db42f, 0x1014f94b, 0x1bbb3753, 0x172aca64, 0x12d28d79, 0x4f67c11, 0xb353611, 0xcacd17f, 0x11f37d59, 0x86989e2, 0x1bb8db76, 0xd1b953d, 0xd7338e8, 0x598b6f9, 0x7bd} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xf0708ef159f18e22, 0x53e52c73b685e5d6, 0x72aca64ddd9ba9c0, 0x893d9f0465a51af3, 0xab2cacd17f59a9b0, 0x6dbb21a6278a3e6f, 0xe671d0d1b953dddc, 0x7fa5e9662dbe5a} +#else +{0xe11de2b3e31c44, 0x12c73b685e5d6f0, 0x126eecdd4e029f2, 0x1196946bcdcab29, 0x1eb35361127b3e0, 0xa3e6fab2cacd17, 0xeee36dd90d313c, 0x16b99c74346e54f, 0xff4bd2cc5b7c} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}, {{ +#if 0 +#elif RADIX == 16 +{0x111d, 0x19ac, 0x1a8f, 0xc58, 0xaa, 0xdc, 0x13de, 0x1dc, 0x17a6, 0x1e3d, 0x198a, 0x40a, 0x120b, 0x17ba, 0x91c, 0x1858, 0xee4, 0x33b, 0x18aa, 0x1124, 0x5f8, 0x37d, 0xf3e, 0xa4b, 0x1e1, 0x2bd, 0x1ff2, 0x1a56, 0x1168, 0x739, 0x1fee, 0x190c, 0x13e9, 0xd07, 0x17fd, 0x1b9e, 0x198b, 0x1faa, 0xd2} +#elif RADIX == 32 +{0x88e8fa0, 0x11a8fcd6, 0x170154c5, 0xee4f781, 0x1e3dbd30, 0xc81598a, 0xe5eea41, 0xe4c2c24, 0x115433b7, 0x97e2249, 0xb79f0df, 0x17a1e152, 0x95bfe42, 0x39cc5a3, 0x1390cff7, 0x1f5a0f3e, 0xc5ee7af, 0xd56} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x54c58d47e6b223a3, 0xf6f4c1dc9ef03701, 0xe5eea41640acc578, 0x4c550ceddc985848, 0x2a4b79f0df4bf112, 0x62d1a56ff90af43c, 0xb41e7d390cff71ce, 0x187eab317b9ebfe} +#else +{0x18b1a8fcd644747, 0xc1dc9ef0370154, 0xb205662bc7b7a, 0x177261612397ba9, 0x1e97e22498aa19d, 0xaf43c2a4b79f0d, 0x18e73168d2b7fc8, 0x1fad079f4e433fd, 0x15fd5662f73d7} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x63c, 0x609, 0x89c, 0x1f09, 0x9c9, 0x1e89, 0x1826, 0x1460, 0x15d6, 0xa52, 0xbb2, 0x1b93, 0x1f90, 0xa2f, 0x3b3, 0x1a76, 0x1c29, 0x17fc, 0x864, 0x55a, 0x1a9b, 0x7fa, 0x7ee, 0x75f, 0x1b4b, 0x15e6, 0xd75, 0x1238, 0x847, 0x1711, 0x9e7, 0xa37, 0x4b6, 0x1264, 0x3e1, 0xf87, 0x1c47, 0x706, 0x20b} +#elif RADIX == 32 +{0x131e26c1, 0x1289c304, 0x25393f0, 0x30609bd, 0xa52aeb5, 0x3726bb2, 0x19a8bff2, 0x29d3b0e, 0x10c97fce, 0x16a6cab4, 0x1f3f71fe, 0x1cdb4b3a, 0x8e1aeb5, 0x1b88a11e, 0xca374f3, 0x1864c84b, 0x23be1c7, 0xab7} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x93f0944e1824c789, 0x4abad460c137a253, 0x9a8bff21b935d929, 0xa4325ff3853a761d, 0x675f3f71feb53655, 0x508f2386bad79b69, 0xc99096ca374f3dc4, 0x129c1b88ef871f0} +#else +{0x1e1289c30498f13, 0xd460c137a25393, 0x190dc9aec94a55d, 0xe14e9d8766a2ff, 0x1d6a6cab4864bfe, 0x179b69675f3f71f, 0x1ee2284791c35d6, 0x1c326425b28dd3c, 0xa383711df0e3} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xfe45,0x561e,0xa798,0xc163,0xedaa,0x1fff,0xb3c0,0xda12,0x2588,0x5123,0x2390,0xface,0x6e59,0x651b,0xa21d,0xb190,0xe1b0,0x21b0,0x6030,0xd81,0x6542,0x64b0,0x8cef,0xa91c,0xe0bd,0xd947,0xe27b,0x961a,0x2a3e,0xf20a,0xed0,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x561efe45,0xc163a798,0x1fffedaa,0xda12b3c0,0x51232588,0xface2390,0x651b6e59,0xb190a21d,0x21b0e1b0,0xd816030,0x64b06542,0xa91c8cef,0xd947e0bd,0x961ae27b,0xf20a2a3e,0x50ed0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc163a798561efe45,0xda12b3c01fffedaa,0xface239051232588,0xb190a21d651b6e59,0xd81603021b0e1b0,0xa91c8cef64b06542,0x961ae27bd947e0bd,0x50ed0f20a2a3e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xff6,0x4b77,0xed4e,0x3538,0xc757,0x3304,0xd547,0xc49f,0x801b,0xb2ff,0x4796,0xcad,0x58be,0x969c,0x3e77,0x83e1,0xa371,0x7d43,0x6664,0x3720,0x6c98,0xe4e5,0x74dc,0xebbc,0xaab5,0xc7e0,0x3147,0x5bc9,0x537e,0x7ff5,0xb400,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4b770ff6,0x3538ed4e,0x3304c757,0xc49fd547,0xb2ff801b,0xcad4796,0x969c58be,0x83e13e77,0x7d43a371,0x37206664,0xe4e56c98,0xebbc74dc,0xc7e0aab5,0x5bc93147,0x7ff5537e,0xcb400}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3538ed4e4b770ff6,0xc49fd5473304c757,0xcad4796b2ff801b,0x83e13e77969c58be,0x372066647d43a371,0xebbc74dce4e56c98,0x5bc93147c7e0aab5,0xcb4007ff5537e}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x77eb,0xce58,0xfaa0,0x429c,0xc7dd,0xbe89,0x68a,0xc196,0xd249,0x63ae,0xa04a,0xbc4e,0xbbb5,0x64ad,0xfc2b,0x4738,0x4d4d,0x918a,0x6b55,0x459d,0xf5ab,0x748c,0x208a,0xfe42,0x21d2,0x3785,0x23d7,0x28cc,0xfd9f,0x106a,0x3406,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xce5877eb,0x429cfaa0,0xbe89c7dd,0xc196068a,0x63aed249,0xbc4ea04a,0x64adbbb5,0x4738fc2b,0x918a4d4d,0x459d6b55,0x748cf5ab,0xfe42208a,0x378521d2,0x28cc23d7,0x106afd9f,0xd3406}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x429cfaa0ce5877eb,0xc196068abe89c7dd,0xbc4ea04a63aed249,0x4738fc2b64adbbb5,0x459d6b55918a4d4d,0xfe42208a748cf5ab,0x28cc23d7378521d2,0xd3406106afd9f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1bb,0xa9e1,0x5867,0x3e9c,0x1255,0xe000,0x4c3f,0x25ed,0xda77,0xaedc,0xdc6f,0x531,0x91a6,0x9ae4,0x5de2,0x4e6f,0x1e4f,0xde4f,0x9fcf,0xf27e,0x9abd,0x9b4f,0x7310,0x56e3,0x1f42,0x26b8,0x1d84,0x69e5,0xd5c1,0xdf5,0xf12f,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa9e101bb,0x3e9c5867,0xe0001255,0x25ed4c3f,0xaedcda77,0x531dc6f,0x9ae491a6,0x4e6f5de2,0xde4f1e4f,0xf27e9fcf,0x9b4f9abd,0x56e37310,0x26b81f42,0x69e51d84,0xdf5d5c1,0xaf12f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3e9c5867a9e101bb,0x25ed4c3fe0001255,0x531dc6faedcda77,0x4e6f5de29ae491a6,0xf27e9fcfde4f1e4f,0x56e373109b4f9abd,0x69e51d8426b81f42,0xaf12f0df5d5c1}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf3b3,0x88db,0xd050,0x75f1,0x10dd,0x8cbe,0x97c4,0xe7a2,0xe6ae,0xf1e2,0xd51f,0x8d12,0x55a8,0x6395,0xc98a,0xc097,0x60c3,0x66aa,0x54f3,0x78ce,0x5dce,0x7fb3,0x99a7,0x3e1,0x8753,0x3c9a,0x3339,0x30f3,0x406e,0xc05e,0xc99f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x88dbf3b3,0x75f1d050,0x8cbe10dd,0xe7a297c4,0xf1e2e6ae,0x8d12d51f,0x639555a8,0xc097c98a,0x66aa60c3,0x78ce54f3,0x7fb35dce,0x3e199a7,0x3c9a8753,0x30f33339,0xc05e406e,0x7c99f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x75f1d05088dbf3b3,0xe7a297c48cbe10dd,0x8d12d51ff1e2e6ae,0xc097c98a639555a8,0x78ce54f366aa60c3,0x3e199a77fb35dce,0x30f333393c9a8753,0x7c99fc05e406e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbdde,0x1bf3,0x7bc0,0xcae7,0x8d2e,0x58a8,0x4b1a,0xbcb8,0xccd9,0x3d98,0xfcf2,0x4881,0x66f8,0x3473,0x2e8a,0x730d,0xabbf,0x4789,0xdce9,0x58ea,0xf54,0x6169,0x58d0,0x3280,0xe1f9,0x5bd0,0x67a0,0x23d2,0x2611,0x18e1,0xd51f,0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1bf3bdde,0xcae77bc0,0x58a88d2e,0xbcb84b1a,0x3d98ccd9,0x4881fcf2,0x347366f8,0x730d2e8a,0x4789abbf,0x58eadce9,0x61690f54,0x328058d0,0x5bd0e1f9,0x23d267a0,0x18e12611,0x7d51f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcae77bc01bf3bdde,0xbcb84b1a58a88d2e,0x4881fcf23d98ccd9,0x730d2e8a347366f8,0x58eadce94789abbf,0x328058d061690f54,0x23d267a05bd0e1f9,0x7d51f18e12611}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xee54,0xe36f,0x939d,0xea02,0xe6db,0xa7ae,0x9f39,0x8bb3,0x7f02,0xf594,0xa9ab,0xae5e,0x9a76,0x7fc0,0xd9a,0xbecd,0x692d,0x8b68,0x30f4,0xff9a,0xd1ae,0xfd43,0xbdfc,0xc552,0xfe0d,0xa4bf,0x33e5,0x981b,0x202c,0x45e8,0x8573,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe36fee54,0xea02939d,0xa7aee6db,0x8bb39f39,0xf5947f02,0xae5ea9ab,0x7fc09a76,0xbecd0d9a,0x8b68692d,0xff9a30f4,0xfd43d1ae,0xc552bdfc,0xa4bffe0d,0x981b33e5,0x45e8202c,0xc8573}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xea02939de36fee54,0x8bb39f39a7aee6db,0xae5ea9abf5947f02,0xbecd0d9a7fc09a76,0xff9a30f48b68692d,0xc552bdfcfd43d1ae,0x981b33e5a4bffe0d,0xc857345e8202c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc4d,0x7724,0x2faf,0x8a0e,0xef22,0x7341,0x683b,0x185d,0x1951,0xe1d,0x2ae0,0x72ed,0xaa57,0x9c6a,0x3675,0x3f68,0x9f3c,0x9955,0xab0c,0x8731,0xa231,0x804c,0x6658,0xfc1e,0x78ac,0xc365,0xccc6,0xcf0c,0xbf91,0x3fa1,0x3660,0x8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x77240c4d,0x8a0e2faf,0x7341ef22,0x185d683b,0xe1d1951,0x72ed2ae0,0x9c6aaa57,0x3f683675,0x99559f3c,0x8731ab0c,0x804ca231,0xfc1e6658,0xc36578ac,0xcf0cccc6,0x3fa1bf91,0x83660}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8a0e2faf77240c4d,0x185d683b7341ef22,0x72ed2ae00e1d1951,0x3f6836759c6aaa57,0x8731ab0c99559f3c,0xfc1e6658804ca231,0xcf0cccc6c36578ac,0x836603fa1bf91}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x39f7,0x51a0,0x71ea,0x7557,0x794c,0x6b5e,0x6a81,0x9aa7,0xd8dd,0xab85,0xe387,0x2121,0x1086,0x7989,0xe273,0xf813,0xebd5,0xb13f,0x9ef5,0xc6d5,0x2da2,0x14f8,0xecf3,0x24c4,0xf485,0xc8de,0xb9ef,0xb213,0xbc4d,0xe587,0xd591,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x51a039f7,0x755771ea,0x6b5e794c,0x9aa76a81,0xab85d8dd,0x2121e387,0x79891086,0xf813e273,0xb13febd5,0xc6d59ef5,0x14f82da2,0x24c4ecf3,0xc8def485,0xb213b9ef,0xe587bc4d,0xdd591}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x755771ea51a039f7,0x9aa76a816b5e794c,0x2121e387ab85d8dd,0xf813e27379891086,0xc6d59ef5b13febd5,0x24c4ecf314f82da2,0xb213b9efc8def485,0xdd591e587bc4d}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc5d4,0x133f,0xc116,0x2a9e,0xacf5,0xaedd,0x6173,0xdacf,0x6448,0xa33e,0x6d36,0x5013,0x2093,0x59f6,0xe571,0x906d,0x37c9,0xe4ab,0xb92a,0xbe30,0x1d49,0xde58,0xffc8,0x47ff,0xe0cb,0x6230,0x6128,0x8679,0x731c,0xc5e,0x66c7,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x133fc5d4,0x2a9ec116,0xaeddacf5,0xdacf6173,0xa33e6448,0x50136d36,0x59f62093,0x906de571,0xe4ab37c9,0xbe30b92a,0xde581d49,0x47ffffc8,0x6230e0cb,0x86796128,0xc5e731c,0xd66c7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2a9ec116133fc5d4,0xdacf6173aeddacf5,0x50136d36a33e6448,0x906de57159f62093,0xbe30b92ae4ab37c9,0x47ffffc8de581d49,0x867961286230e0cb,0xd66c70c5e731c}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x55ad,0x2e3e,0xd0dc,0x8dad,0x4e0a,0xe1d0,0x3e27,0x81af,0x1bb4,0xa5fa,0x52f2,0x5bd4,0x2b9b,0xddfe,0x36,0xbdd4,0xf99a,0x3027,0x21d2,0x7b29,0x10ee,0x2146,0x6864,0xec5c,0x6bbd,0x540f,0xbc15,0xe4a1,0xee,0x3d9c,0xdf51,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2e3e55ad,0x8dadd0dc,0xe1d04e0a,0x81af3e27,0xa5fa1bb4,0x5bd452f2,0xddfe2b9b,0xbdd40036,0x3027f99a,0x7b2921d2,0x214610ee,0xec5c6864,0x540f6bbd,0xe4a1bc15,0x3d9c00ee,0x4df51}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8dadd0dc2e3e55ad,0x81af3e27e1d04e0a,0x5bd452f2a5fa1bb4,0xbdd40036ddfe2b9b,0x7b2921d23027f99a,0xec5c6864214610ee,0xe4a1bc15540f6bbd,0x4df513d9c00ee}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xc609,0xae5f,0x8e15,0x8aa8,0x86b3,0x94a1,0x957e,0x6558,0x2722,0x547a,0x1c78,0xdede,0xef79,0x8676,0x1d8c,0x7ec,0x142a,0x4ec0,0x610a,0x392a,0xd25d,0xeb07,0x130c,0xdb3b,0xb7a,0x3721,0x4610,0x4dec,0x43b2,0x1a78,0x2a6e,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xae5fc609,0x8aa88e15,0x94a186b3,0x6558957e,0x547a2722,0xdede1c78,0x8676ef79,0x7ec1d8c,0x4ec0142a,0x392a610a,0xeb07d25d,0xdb3b130c,0x37210b7a,0x4dec4610,0x1a7843b2,0x22a6e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8aa88e15ae5fc609,0x6558957e94a186b3,0xdede1c78547a2722,0x7ec1d8c8676ef79,0x392a610a4ec0142a,0xdb3b130ceb07d25d,0x4dec461037210b7a,0x22a6e1a7843b2}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xfe45,0x561e,0xa798,0xc163,0xedaa,0x1fff,0xb3c0,0xda12,0x2588,0x5123,0x2390,0xface,0x6e59,0x651b,0xa21d,0xb190,0xe1b0,0x21b0,0x6030,0xd81,0x6542,0x64b0,0x8cef,0xa91c,0xe0bd,0xd947,0xe27b,0x961a,0x2a3e,0xf20a,0xed0,0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x561efe45,0xc163a798,0x1fffedaa,0xda12b3c0,0x51232588,0xface2390,0x651b6e59,0xb190a21d,0x21b0e1b0,0xd816030,0x64b06542,0xa91c8cef,0xd947e0bd,0x961ae27b,0xf20a2a3e,0x50ed0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc163a798561efe45,0xda12b3c01fffedaa,0xface239051232588,0xb190a21d651b6e59,0xd81603021b0e1b0,0xa91c8cef64b06542,0x961ae27bd947e0bd,0x50ed0f20a2a3e}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xff6,0x4b77,0xed4e,0x3538,0xc757,0x3304,0xd547,0xc49f,0x801b,0xb2ff,0x4796,0xcad,0x58be,0x969c,0x3e77,0x83e1,0xa371,0x7d43,0x6664,0x3720,0x6c98,0xe4e5,0x74dc,0xebbc,0xaab5,0xc7e0,0x3147,0x5bc9,0x537e,0x7ff5,0xb400,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4b770ff6,0x3538ed4e,0x3304c757,0xc49fd547,0xb2ff801b,0xcad4796,0x969c58be,0x83e13e77,0x7d43a371,0x37206664,0xe4e56c98,0xebbc74dc,0xc7e0aab5,0x5bc93147,0x7ff5537e,0xcb400}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3538ed4e4b770ff6,0xc49fd5473304c757,0xcad4796b2ff801b,0x83e13e77969c58be,0x372066647d43a371,0xebbc74dce4e56c98,0x5bc93147c7e0aab5,0xcb4007ff5537e}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x77eb,0xce58,0xfaa0,0x429c,0xc7dd,0xbe89,0x68a,0xc196,0xd249,0x63ae,0xa04a,0xbc4e,0xbbb5,0x64ad,0xfc2b,0x4738,0x4d4d,0x918a,0x6b55,0x459d,0xf5ab,0x748c,0x208a,0xfe42,0x21d2,0x3785,0x23d7,0x28cc,0xfd9f,0x106a,0x3406,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xce5877eb,0x429cfaa0,0xbe89c7dd,0xc196068a,0x63aed249,0xbc4ea04a,0x64adbbb5,0x4738fc2b,0x918a4d4d,0x459d6b55,0x748cf5ab,0xfe42208a,0x378521d2,0x28cc23d7,0x106afd9f,0xd3406}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x429cfaa0ce5877eb,0xc196068abe89c7dd,0xbc4ea04a63aed249,0x4738fc2b64adbbb5,0x459d6b55918a4d4d,0xfe42208a748cf5ab,0x28cc23d7378521d2,0xd3406106afd9f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1bb,0xa9e1,0x5867,0x3e9c,0x1255,0xe000,0x4c3f,0x25ed,0xda77,0xaedc,0xdc6f,0x531,0x91a6,0x9ae4,0x5de2,0x4e6f,0x1e4f,0xde4f,0x9fcf,0xf27e,0x9abd,0x9b4f,0x7310,0x56e3,0x1f42,0x26b8,0x1d84,0x69e5,0xd5c1,0xdf5,0xf12f,0xa}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa9e101bb,0x3e9c5867,0xe0001255,0x25ed4c3f,0xaedcda77,0x531dc6f,0x9ae491a6,0x4e6f5de2,0xde4f1e4f,0xf27e9fcf,0x9b4f9abd,0x56e37310,0x26b81f42,0x69e51d84,0xdf5d5c1,0xaf12f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3e9c5867a9e101bb,0x25ed4c3fe0001255,0x531dc6faedcda77,0x4e6f5de29ae491a6,0xf27e9fcfde4f1e4f,0x56e373109b4f9abd,0x69e51d8426b81f42,0xaf12f0df5d5c1}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf9da,0x446d,0xe828,0xbaf8,0x86e,0x465f,0x4be2,0x73d1,0x7357,0xf8f1,0x6a8f,0x4689,0xaad4,0x31ca,0xe4c5,0xe04b,0x3061,0xb355,0x2a79,0x3c67,0xaee7,0xbfd9,0xccd3,0x81f0,0x43a9,0x9e4d,0x999c,0x1879,0x2037,0xe02f,0xe4cf,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x446df9da,0xbaf8e828,0x465f086e,0x73d14be2,0xf8f17357,0x46896a8f,0x31caaad4,0xe04be4c5,0xb3553061,0x3c672a79,0xbfd9aee7,0x81f0ccd3,0x9e4d43a9,0x1879999c,0xe02f2037,0xbe4cf}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbaf8e828446df9da,0x73d14be2465f086e,0x46896a8ff8f17357,0xe04be4c531caaad4,0x3c672a79b3553061,0x81f0ccd3bfd9aee7,0x1879999c9e4d43a9,0xbe4cfe02f2037}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xdeef,0xdf9,0xbde0,0x6573,0x4697,0x2c54,0x258d,0xde5c,0x666c,0x1ecc,0xfe79,0x2440,0xb37c,0x1a39,0x9745,0xb986,0xd5df,0xa3c4,0x6e74,0x2c75,0x87aa,0x30b4,0x2c68,0x9940,0x70fc,0x2de8,0x33d0,0x91e9,0x9308,0x8c70,0xea8f,0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf9deef,0x6573bde0,0x2c544697,0xde5c258d,0x1ecc666c,0x2440fe79,0x1a39b37c,0xb9869745,0xa3c4d5df,0x2c756e74,0x30b487aa,0x99402c68,0x2de870fc,0x91e933d0,0x8c709308,0xbea8f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6573bde00df9deef,0xde5c258d2c544697,0x2440fe791ecc666c,0xb98697451a39b37c,0x2c756e74a3c4d5df,0x99402c6830b487aa,0x91e933d02de870fc,0xbea8f8c709308}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf72a,0xf1b7,0x49ce,0xf501,0x736d,0xd3d7,0xcf9c,0x45d9,0x3f81,0xfaca,0x54d5,0x572f,0x4d3b,0x3fe0,0x86cd,0xdf66,0x3496,0x45b4,0x187a,0x7fcd,0xe8d7,0x7ea1,0x5efe,0xe2a9,0xff06,0xd25f,0x99f2,0x4c0d,0x1016,0xa2f4,0x42b9,0xe}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xf1b7f72a,0xf50149ce,0xd3d7736d,0x45d9cf9c,0xfaca3f81,0x572f54d5,0x3fe04d3b,0xdf6686cd,0x45b43496,0x7fcd187a,0x7ea1e8d7,0xe2a95efe,0xd25fff06,0x4c0d99f2,0xa2f41016,0xe42b9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf50149cef1b7f72a,0x45d9cf9cd3d7736d,0x572f54d5faca3f81,0xdf6686cd3fe04d3b,0x7fcd187a45b43496,0xe2a95efe7ea1e8d7,0x4c0d99f2d25fff06,0xe42b9a2f41016}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x627,0xbb92,0x17d7,0x4507,0xf791,0xb9a0,0xb41d,0x8c2e,0x8ca8,0x70e,0x9570,0xb976,0x552b,0xce35,0x1b3a,0x1fb4,0xcf9e,0x4caa,0xd586,0xc398,0x5118,0x4026,0x332c,0x7e0f,0xbc56,0x61b2,0x6663,0xe786,0xdfc8,0x1fd0,0x1b30,0x4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbb920627,0x450717d7,0xb9a0f791,0x8c2eb41d,0x70e8ca8,0xb9769570,0xce35552b,0x1fb41b3a,0x4caacf9e,0xc398d586,0x40265118,0x7e0f332c,0x61b2bc56,0xe7866663,0x1fd0dfc8,0x41b30}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x450717d7bb920627,0x8c2eb41db9a0f791,0xb9769570070e8ca8,0x1fb41b3ace35552b,0xc398d5864caacf9e,0x7e0f332c40265118,0xe786666361b2bc56,0x41b301fd0dfc8}}} +#endif +}}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9e37,0x619b,0xa159,0x8865,0xab15,0x85c2,0xb3b,0x57ce,0x8108,0xa8d6,0xfeb0,0x8cf0,0xef13,0xc7e1,0x6936,0xc3a9,0xd8f2,0x9c5d,0x7c68,0x7ba2,0xf4da,0x4c63,0x845b,0x22eb,0xbedd,0x37a0,0x24f3,0x7019,0x2855,0x6905,0xb81c,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x619b9e37,0x8865a159,0x85c2ab15,0x57ce0b3b,0xa8d68108,0x8cf0feb0,0xc7e1ef13,0xc3a96936,0x9c5dd8f2,0x7ba27c68,0x4c63f4da,0x22eb845b,0x37a0bedd,0x701924f3,0x69052855,0x3b81c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8865a159619b9e37,0x57ce0b3b85c2ab15,0x8cf0feb0a8d68108,0xc3a96936c7e1ef13,0x7ba27c689c5dd8f2,0x22eb845b4c63f4da,0x701924f337a0bedd,0x3b81c69052855}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x92b5,0x1309,0xc1ee,0xadd1,0x165,0x4911,0xaf0c,0x4a4f,0x5374,0xd4b2,0x926f,0xacc0,0xfd2f,0xeb63,0x7c68,0xc188,0x41ce,0x152e,0x6cfe,0x9a22,0xadb,0x933,0x438c,0x5fef,0xe17a,0x82aa,0x7732,0x8c5b,0xfa7b,0x4cd4,0xdcee,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x130992b5,0xadd1c1ee,0x49110165,0x4a4faf0c,0xd4b25374,0xacc0926f,0xeb63fd2f,0xc1887c68,0x152e41ce,0x9a226cfe,0x9330adb,0x5fef438c,0x82aae17a,0x8c5b7732,0x4cd4fa7b,0x6dcee}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xadd1c1ee130992b5,0x4a4faf0c49110165,0xacc0926fd4b25374,0xc1887c68eb63fd2f,0x9a226cfe152e41ce,0x5fef438c09330adb,0x8c5b773282aae17a,0x6dcee4cd4fa7b}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x77b7,0xc00c,0x743e,0x91b3,0xc92c,0x3be,0xc9e8,0x4b6b,0x519c,0xed1b,0x857f,0x2be7,0x2270,0x64a0,0x3a21,0xd5ec,0xd5d1,0x2392,0x175a,0xa58f,0x5c36,0x3908,0x5f46,0x1875,0xee40,0xcd4a,0x7e0b,0x8eda,0x87e0,0xc28c,0x6e24,0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc00c77b7,0x91b3743e,0x3bec92c,0x4b6bc9e8,0xed1b519c,0x2be7857f,0x64a02270,0xd5ec3a21,0x2392d5d1,0xa58f175a,0x39085c36,0x18755f46,0xcd4aee40,0x8eda7e0b,0xc28c87e0,0xd6e24}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x91b3743ec00c77b7,0x4b6bc9e803bec92c,0x2be7857fed1b519c,0xd5ec3a2164a02270,0xa58f175a2392d5d1,0x18755f4639085c36,0x8eda7e0bcd4aee40,0xd6e24c28c87e0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x61c9,0x9e64,0x5ea6,0x779a,0x54ea,0x7a3d,0xf4c4,0xa831,0x7ef7,0x5729,0x14f,0x730f,0x10ec,0x381e,0x96c9,0x3c56,0x270d,0x63a2,0x8397,0x845d,0xb25,0xb39c,0x7ba4,0xdd14,0x4122,0xc85f,0xdb0c,0x8fe6,0xd7aa,0x96fa,0x47e3,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9e6461c9,0x779a5ea6,0x7a3d54ea,0xa831f4c4,0x57297ef7,0x730f014f,0x381e10ec,0x3c5696c9,0x63a2270d,0x845d8397,0xb39c0b25,0xdd147ba4,0xc85f4122,0x8fe6db0c,0x96fad7aa,0xc47e3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x779a5ea69e6461c9,0xa831f4c47a3d54ea,0x730f014f57297ef7,0x3c5696c9381e10ec,0x845d839763a2270d,0xdd147ba4b39c0b25,0x8fe6db0cc85f4122,0xc47e396fad7aa}}} +#endif +}}}}; diff --git a/src/precomp/ref/lvl5/hd_splitting_transforms.c b/src/precomp/ref/lvl5/hd_splitting_transforms.c new file mode 100644 index 0000000..a697ac7 --- /dev/null +++ b/src/precomp/ref/lvl5/hd_splitting_transforms.c @@ -0,0 +1,143 @@ +#include + +#define FP2_ZERO 0 +#define FP2_ONE 1 +#define FP2_I 2 +#define FP2_MINUS_ONE 3 +#define FP2_MINUS_I 4 + +const int EVEN_INDEX[10][2] = {{0, 0}, {0, 1}, {0, 2}, {0, 3}, {1, 0}, {1, 2}, {2, 0}, {2, 1}, {3, 0}, {3, 3}}; +const int CHI_EVAL[4][4] = {{1, 1, 1, 1}, {1, -1, 1, -1}, {1, 1, -1, -1}, {1, -1, -1, 1}}; +const fp2_t FP2_CONSTANTS[5] = {{ +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x500} +#elif RADIX == 32 +{0x25ed0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x130000000000000} +#else +{0x12f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb00000000000} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x1ffb, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1bf} +#elif RADIX == 32 +{0x1ffda12f, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x57f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xffffffffffffff68, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x7fffffffffffff} +#else +{0x1fffffffffffed0, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0xffffffffffff} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +}, { +#if 0 +#elif RADIX == 16 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 32 +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#else +{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} +#endif +#endif +, +#if 0 +#elif RADIX == 16 +{0x1ffb, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1bf} +#elif RADIX == 32 +{0x1ffda12f, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x1fffffff, 0x57f} +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +{0xffffffffffffff68, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x7fffffffffffff} +#else +{0x1fffffffffffed0, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0x1ffffffffffffff, 0xffffffffffff} +#endif +#endif +}}; +const precomp_basis_change_matrix_t SPLITTING_TRANSFORMS[10] = {{{{FP2_ONE, FP2_I, FP2_ONE, FP2_I}, {FP2_ONE, FP2_MINUS_I, FP2_MINUS_ONE, FP2_I}, {FP2_ONE, FP2_I, FP2_MINUS_ONE, FP2_MINUS_I}, {FP2_MINUS_ONE, FP2_I, FP2_MINUS_ONE, FP2_I}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_MINUS_ONE, FP2_ZERO, FP2_ZERO}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_MINUS_ONE, FP2_ZERO}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_ONE, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}}}}; +const precomp_basis_change_matrix_t NORMALIZATION_TRANSFORMS[6] = {{{{FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}}}, {{{FP2_ZERO, FP2_ZERO, FP2_ZERO, FP2_ONE}, {FP2_ZERO, FP2_ZERO, FP2_ONE, FP2_ZERO}, {FP2_ZERO, FP2_ONE, FP2_ZERO, FP2_ZERO}, {FP2_ONE, FP2_ZERO, FP2_ZERO, FP2_ZERO}}}, {{{FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE}, {FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}}}, {{{FP2_ONE, FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_MINUS_ONE, FP2_ONE, FP2_ONE}, {FP2_MINUS_ONE, FP2_ONE, FP2_MINUS_ONE, FP2_ONE}, {FP2_ONE, FP2_ONE, FP2_ONE, FP2_ONE}}}, {{{FP2_MINUS_ONE, FP2_I, FP2_I, FP2_ONE}, {FP2_I, FP2_MINUS_ONE, FP2_ONE, FP2_I}, {FP2_I, FP2_ONE, FP2_MINUS_ONE, FP2_I}, {FP2_ONE, FP2_I, FP2_I, FP2_MINUS_ONE}}}, {{{FP2_ONE, FP2_I, FP2_I, FP2_MINUS_ONE}, {FP2_I, FP2_ONE, FP2_MINUS_ONE, FP2_I}, {FP2_I, FP2_MINUS_ONE, FP2_ONE, FP2_I}, {FP2_MINUS_ONE, FP2_I, FP2_I, FP2_ONE}}}}; diff --git a/src/precomp/ref/lvl5/include/e0_basis.h b/src/precomp/ref/lvl5/include/e0_basis.h new file mode 100644 index 0000000..05cafb8 --- /dev/null +++ b/src/precomp/ref/lvl5/include/e0_basis.h @@ -0,0 +1,3 @@ +#include +extern const fp2_t BASIS_E0_PX; +extern const fp2_t BASIS_E0_QX; diff --git a/src/precomp/ref/lvl5/include/ec_params.h b/src/precomp/ref/lvl5/include/ec_params.h index e55c08c..9f2aca3 100644 --- a/src/precomp/ref/lvl5/include/ec_params.h +++ b/src/precomp/ref/lvl5/include/ec_params.h @@ -1,76 +1,12 @@ #ifndef EC_PARAMS_H #define EC_PARAMS_H -#define POWER_OF_2 145 -#define POWER_OF_3 72 +#include -static digit_t TWOpF[NWORDS_ORDER] = {0x0, 0x0, 0x20000, 0x0, 0x0, 0x0, 0x0, 0x0}; // 2^g -static digit_t TWOpFm1[NWORDS_ORDER] = {0x0, 0x0, 0x10000, 0x0, 0x0, 0x0, 0x0, 0x0}; // 2^(g-1) -static digit_t THREEpE[NWORDS_ORDER] = {0x2153E468B91C6D1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; // 3^e -static digit_t THREEpF[NWORDS_ORDER] = {0x1E679735C929F6A1, 0x000456BC60E76C11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; // 3^f -static digit_t THREEpFdiv2[NWORDS_ORDER] = {0x8F33CB9AE494FB50, 0x00022B5E3073B608, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; // Floor(3^f/2) +#define TORSION_EVEN_POWER 500 -#define scaled 1 // unscaled (0) or scaled (1) remainder tree approach -#define gap 83 +// p+1 divided by the power of 2 +extern const digit_t p_cofactor_for_2f[1]; +#define P_COFACTOR_FOR_2F_BITLENGTH 5 -#define P_LEN 7 -#define M_LEN 27 - -static long p_plus_minus_bitlength[P_LEN + M_LEN] ={ - 2, 4, 6, 7, 7, 9, 10, 3, 3, 5, 6, 6, 7, 7, 8, 10, - 10, 10, 10, 12, 13, 13, 13, 14, 14, 14, 14, 14, - 15, 15, 16, 16, 16, 19 -}; - -static digit_t p_cofactor_for_2f[6] = { - 0xBA674CA63456D371, - 0xF532FD78514D3C0C, - 0x3E80FF1D62C82506, - 0x73C9015EDF319328, - 0x4DE3460AD801B49B, - 0x00000012ACA35443 -}; -#define P_COFACTOR_FOR_2F_BITLENGTH 357 - -static digit_t p_cofactor_for_3g[7] = { - 0x0000000000000000, - 0x0000000000000000, - 0x0F469D6875A20000, - 0x10CAFA623AD43E00, - 0x27F3E11532C58F78, - 0x9BA98880DA1DC006, - 0x0000000000000008 - -}; - -#define P_COFACTOR_FOR_3G_BITLENGTH 388 - - -static digit_t p_cofactor_for_6fg[4] = { - 0x1F0007A34EB43AD1, - 0xC7BC08657D311D6A, - 0xE00313F9F08A9962, - 0x00044DD4C4406D0E -}; -#define P_COFACTOR_FOR_6FG_BITLENGTH 243 - -static int STRATEGY4[71] = { 28, 16, 11, 7, 4, 2, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, 1, 4, 3, 2, 1, 1, 1, 1, 2, 1, 1, 7, 4, 2, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, 1, 12, 7, 4, 2, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, 1, 5, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1}; - -static int sizeI[P_LEN+M_LEN] = { - 0, 3, 3, 4, 6, 11, 14, 1, 1, 2, 3, 4, 4, 6, 6, 13, 14, 14, 18, 26, 32, 38, 48, 54, 60, 62, 62, 64, 72, 92, 118, 126, 130, 310 -}; -static int sizeJ[P_LEN+M_LEN] = { - 0, 1, 3, 4, 4, 10, 14, 1, 1, 2, 3, 3, 4, 5, 6, 12, 13, 13, 14, 24, 32, 33, 37, 49, 56, 60, 62, 62, 64, 63, 102, 125, 126, 256 -}; -static int sizeK[P_LEN+M_LEN] = { - 1, 0, 2, 1, 3, 10, 21, 0, 1, 0, 0, 2, 4, 3, 3, 9, 2, 5, 0, 21, 28, 21, 11, 6, 75, 21, 82, 59, 75, 21, 21, 123, 0, 396 -}; - -#define sI_max 310 -#define sJ_max 256 -#define sK_max 396 - -#define ceil_log_sI_max 9 -#define ceil_log_sJ_max 9 - -#endif \ No newline at end of file +#endif diff --git a/src/precomp/ref/lvl5/include/encoded_sizes.h b/src/precomp/ref/lvl5/include/encoded_sizes.h index 4a20d87..3aafb0d 100644 --- a/src/precomp/ref/lvl5/include/encoded_sizes.h +++ b/src/precomp/ref/lvl5/include/encoded_sizes.h @@ -1,14 +1,11 @@ +#define SECURITY_BITS 256 +#define SQIsign_response_length 253 +#define HASH_ITERATIONS 512 +#define FP_ENCODED_BYTES 64 #define FP2_ENCODED_BYTES 128 #define EC_CURVE_ENCODED_BYTES 128 #define EC_POINT_ENCODED_BYTES 128 #define EC_BASIS_ENCODED_BYTES 384 -#define CHAIN_LENGTH 9 -#define QUAT_ALG_ELEM_ENCODED_BITS 771 -#define QUAT_ALG_ELEM_ENCODED_BYTES 97 -#define ID2ISO_LONG_TWO_ISOG_ENCODED_BYTES 2322 -#define ZIP_CHAIN_LEN 14 -#define ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES 19 -#define ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES 267 -#define SIGNATURE_LEN 335 -#define PUBLICKEY_BYTES 128 -#define SECRETKEY_BYTES 1509 +#define PUBLICKEY_BYTES 129 +#define SECRETKEY_BYTES 701 +#define SIGNATURE_BYTES 292 diff --git a/src/precomp/ref/lvl5/include/endomorphism_action.h b/src/precomp/ref/lvl5/include/endomorphism_action.h index f5397aa..1cc782a 100644 --- a/src/precomp/ref/lvl5/include/endomorphism_action.h +++ b/src/precomp/ref/lvl5/include/endomorphism_action.h @@ -1,19 +1,31 @@ -#include +#ifndef ENDOMORPHISM_ACTION_H +#define ENDOMORPHISM_ACTION_H +#include #include #include -extern const ec_basis_t BASIS_EVEN; -extern const ec_basis_t BASIS_ODD_PLUS; -extern const ec_basis_t BASIS_ODD_MINUS; -extern const ec_basis_t BASIS_COMMITMENT_PLUS; -extern const ec_basis_t BASIS_COMMITMENT_MINUS; -extern const ec_basis_t BASIS_CHALLENGE; -extern const ec_curve_t CURVE_E0; -extern const ec_point_t CURVE_E0_A24; -extern const ibz_mat_2x2_t ACTION_I; -extern const ibz_mat_2x2_t ACTION_J; -extern const ibz_mat_2x2_t ACTION_K; -extern const ibz_mat_2x2_t ACTION_GEN2; -extern const ibz_mat_2x2_t ACTION_GEN3; -extern const ibz_mat_2x2_t ACTION_GEN4; -extern const quat_alg_elem_t COMMITMENT_IDEAL_UNDISTORTED_GEN; -extern const quat_alg_elem_t COMMITMENT_IDEAL_DISTORTION_ENDO; +/** Type for precomputed endomorphism rings applied to precomputed torsion bases. + * + * Precomputed by the precompute scripts. + * + * @typedef curve_with_endomorphism_ring_t + * + * @struct curve_with_endomorphism_ring + **/ +typedef struct curve_with_endomorphism_ring { + ec_curve_t curve; + ec_basis_t basis_even; + ibz_mat_2x2_t action_i, action_j, action_k; + ibz_mat_2x2_t action_gen2, action_gen3, action_gen4; +} curve_with_endomorphism_ring_t; +#define CURVE_E0 (CURVES_WITH_ENDOMORPHISMS->curve) +#define BASIS_EVEN (CURVES_WITH_ENDOMORPHISMS->basis_even) +#define ACTION_I (CURVES_WITH_ENDOMORPHISMS->action_i) +#define ACTION_J (CURVES_WITH_ENDOMORPHISMS->action_j) +#define ACTION_K (CURVES_WITH_ENDOMORPHISMS->action_k) +#define ACTION_GEN2 (CURVES_WITH_ENDOMORPHISMS->action_gen2) +#define ACTION_GEN3 (CURVES_WITH_ENDOMORPHISMS->action_gen3) +#define ACTION_GEN4 (CURVES_WITH_ENDOMORPHISMS->action_gen4) +#define NUM_ALTERNATE_STARTING_CURVES 6 +#define ALTERNATE_STARTING_CURVES (CURVES_WITH_ENDOMORPHISMS+1) +extern const curve_with_endomorphism_ring_t CURVES_WITH_ENDOMORPHISMS[7]; +#endif diff --git a/src/precomp/ref/lvl5/include/fp_constants.h b/src/precomp/ref/lvl5/include/fp_constants.h index 93fee43..094cb4d 100644 --- a/src/precomp/ref/lvl5/include/fp_constants.h +++ b/src/precomp/ref/lvl5/include/fp_constants.h @@ -1,4 +1,17 @@ +#if RADIX == 32 +#if defined(SQISIGN_GF_IMPL_BROADWELL) +#define NWORDS_FIELD 16 +#else +#define NWORDS_FIELD 18 +#endif +#define NWORDS_ORDER 16 +#elif RADIX == 64 +#if defined(SQISIGN_GF_IMPL_BROADWELL) #define NWORDS_FIELD 8 -#define NWORDS_ORDER 8 +#else +#define NWORDS_FIELD 9 +#endif +#define NWORDS_ORDER 8 +#endif #define BITS 512 -#define LOG2P 9 \ No newline at end of file +#define LOG2P 9 diff --git a/src/precomp/ref/lvl5/include/hd_splitting_transforms.h b/src/precomp/ref/lvl5/include/hd_splitting_transforms.h new file mode 100644 index 0000000..b3147a4 --- /dev/null +++ b/src/precomp/ref/lvl5/include/hd_splitting_transforms.h @@ -0,0 +1,18 @@ +#ifndef HD_SPLITTING_H +#define HD_SPLITTING_H + +#include +#include + +typedef struct precomp_basis_change_matrix { + uint8_t m[4][4]; +} precomp_basis_change_matrix_t; + +extern const int EVEN_INDEX[10][2]; +extern const int CHI_EVAL[4][4]; +extern const fp2_t FP2_CONSTANTS[5]; +extern const precomp_basis_change_matrix_t SPLITTING_TRANSFORMS[10]; +extern const precomp_basis_change_matrix_t NORMALIZATION_TRANSFORMS[6]; + +#endif + diff --git a/src/precomp/ref/lvl5/include/klpt_constants.h b/src/precomp/ref/lvl5/include/klpt_constants.h deleted file mode 100644 index 6895c42..0000000 --- a/src/precomp/ref/lvl5/include/klpt_constants.h +++ /dev/null @@ -1,27 +0,0 @@ -#include -#define KLPT_equiv_bound_coeff 7 -#define KLPT_equiv_num_iter 50625 -#define KLPT_primality_num_iter 32 -#define KLPT_signing_klpt_length 2030 -#define KLPT_signing_num_gamma_trial 64 -#define KLPT_gamma_exponent_interval_size 0 -#define KLPT_gamma_exponent_center_shift 15 -#define KLPT_repres_num_gamma_trial 32768 -#define KLPT_signing_number_strong_approx 6784 -#define KLPT_random_prime_attempts 64 -#define KLPT_secret_key_prime_size 126 -#define KLPT_keygen_length 1305 -#define KLPT_keygen_num_gamma_trial 64 -#define KLPT_eichler_smallnorm_bitsize 225 -#define KLPT_keygen_number_strong_approx 5218 -#define KLPT_eichler_number_mu_norm 13 -#define KLPT_eichler_strong_approx_log_margin 2 -#define KLPT_eichler_num_equiv_ideal 51 -#define KLPT_eichler_number_strong_approx 5020 -#define SQISIGN_response_attempts 64 -#define SQISIGN_random_length 0 -#define SQISIGN_signing_total_length 2030 -#define SQISIGN_signing_length 14 -#define SQISIGN_keygen_length 9 -extern const short SMALL_PRIMES_1MOD4[11]; -extern const ibz_t PROD_SMALL_PRIMES_3MOD4; diff --git a/src/precomp/ref/lvl5/include/quaternion_constants.h b/src/precomp/ref/lvl5/include/quaternion_constants.h new file mode 100644 index 0000000..a2f4b52 --- /dev/null +++ b/src/precomp/ref/lvl5/include/quaternion_constants.h @@ -0,0 +1,6 @@ +#include +#define QUAT_primality_num_iter 32 +#define QUAT_repres_bound_input 21 +#define QUAT_equiv_bound_coeff 64 +#define FINDUV_box_size 3 +#define FINDUV_cube_size 2400 diff --git a/src/precomp/ref/lvl5/include/quaternion_data.h b/src/precomp/ref/lvl5/include/quaternion_data.h index c3de3e1..a5eb110 100644 --- a/src/precomp/ref/lvl5/include/quaternion_data.h +++ b/src/precomp/ref/lvl5/include/quaternion_data.h @@ -1,7 +1,12 @@ -#include #include -#define NUM_ALTERNATE_EXTREMAL_ORDERS 7 +#define MAXORD_O0 (EXTREMAL_ORDERS->order) +#define STANDARD_EXTREMAL_ORDER (EXTREMAL_ORDERS[0]) +#define NUM_ALTERNATE_EXTREMAL_ORDERS 6 +#define ALTERNATE_EXTREMAL_ORDERS (EXTREMAL_ORDERS+1) +#define ALTERNATE_CONNECTING_IDEALS (CONNECTING_IDEALS+1) +#define ALTERNATE_CONJUGATING_ELEMENTS (CONJUGATING_ELEMENTS+1) +extern const ibz_t QUAT_prime_cofactor; extern const quat_alg_t QUATALG_PINFTY; -extern const quat_order_t MAXORD_O0; -extern const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER; -extern const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7]; +extern const quat_p_extremal_maximal_order_t EXTREMAL_ORDERS[7]; +extern const quat_left_ideal_t CONNECTING_IDEALS[7]; +extern const quat_alg_elem_t CONJUGATING_ELEMENTS[7]; diff --git a/src/precomp/ref/lvl5/include/torsion_constants.h b/src/precomp/ref/lvl5/include/torsion_constants.h index e479113..363f86e 100644 --- a/src/precomp/ref/lvl5/include/torsion_constants.h +++ b/src/precomp/ref/lvl5/include/torsion_constants.h @@ -1,24 +1,6 @@ -#include -#define TORSION_2POWER_BYTES 19 -#define TORSION_3POWER_BYTES 15 -#define TORSION_23POWER_BYTES 33 -extern const uint64_t TORSION_PLUS_EVEN_POWER; -extern const uint64_t TORSION_ODD_PRIMES[34]; -extern const uint64_t TORSION_ODD_POWERS[34]; -extern const uint64_t TORSION_PLUS_ODD_PRIMES[7]; -extern const size_t TORSION_PLUS_ODD_POWERS[7]; -extern const uint64_t TORSION_MINUS_ODD_PRIMES[27]; -extern const size_t TORSION_MINUS_ODD_POWERS[27]; -extern const size_t DEGREE_COMMITMENT_POWERS[34]; -extern const ibz_t CHARACTERISTIC; -extern const ibz_t TORSION_ODD; -extern const ibz_t TORSION_ODD_PRIMEPOWERS[34]; -extern const ibz_t TORSION_ODD_PLUS; -extern const ibz_t TORSION_ODD_MINUS; +#include +#define TORSION_2POWER_BYTES 63 +extern const ibz_t TWO_TO_SECURITY_BITS; extern const ibz_t TORSION_PLUS_2POWER; -extern const ibz_t TORSION_PLUS_3POWER; -extern const ibz_t TORSION_PLUS_23POWER; -extern const ibz_t DEGREE_COMMITMENT; -extern const ibz_t DEGREE_COMMITMENT_PLUS; -extern const ibz_t DEGREE_COMMITMENT_MINUS; -extern const ibz_t DEGREE_CHALLENGE; +extern const ibz_t SEC_DEGREE; +extern const ibz_t COM_DEGREE; diff --git a/src/precomp/ref/lvl5/klpt_constants.c b/src/precomp/ref/lvl5/klpt_constants.c deleted file mode 100644 index 3358164..0000000 --- a/src/precomp/ref/lvl5/klpt_constants.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include -#if 0 -#elif 8*DIGIT_LEN == 16 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x173b,0x80bd,0xa9d7,0xa185}}}; -#elif 8*DIGIT_LEN == 32 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x80bd173b,0xa185a9d7}}}; -#elif 8*DIGIT_LEN == 64 -const short SMALL_PRIMES_1MOD4[11] = {0x5, 0xd, 0x11, 0x1d, 0x25, 0x29, 0x35, 0x3d, 0x49, 0x59, 0x61}; -const ibz_t PROD_SMALL_PRIMES_3MOD4 = {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xa185a9d780bd173b}}}; -#endif diff --git a/src/precomp/ref/lvl5/quaternion_data.c b/src/precomp/ref/lvl5/quaternion_data.c index 2db9959..98b7924 100644 --- a/src/precomp/ref/lvl5/quaternion_data.c +++ b/src/precomp/ref/lvl5/quaternion_data.c @@ -1,20 +1,3176 @@ #include #include #include +const ibz_t QUAT_prime_cofactor = #if 0 -#elif 8*DIGIT_LEN == 16 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xa6e1,0x68ad,0x994c,0x74ce,0x7819,0xa29a,0xfaf0,0xea65,0x4a0d,0xc590,0xfe3a,0x7d01,0x2650,0xbe63,0x2bd,0xe792,0x6936,0xb003,0x8c15,0x9bc6,0xa886,0x5946,0x25}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xa6e1,0x68ad,0x994c,0x74ce,0x7819,0xa29a,0xfaf0,0xea65,0x4a0d,0xc590,0xfe3a,0x7d01,0x2650,0xbe63,0x2bd,0xe792,0x6936,0xb003,0x8c15,0x9bc6,0xa886,0x5946,0x25}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xa6e1,0x68ad,0x994c,0x74ce,0x7819,0xa29a,0xfaf0,0xea65,0x4a0d,0xc590,0xfe3a,0x7d01,0x2650,0xbe63,0x2bd,0xe792,0x6936,0xb003,0x8c15,0x9bc6,0xa886,0x5946,0x25}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x780,0x54c4,0xe2ea,0x6e86,0xa092,0x7b62,0xeb6f,0x9605,0x30bc,0x6611,0x2837,0xcd8d,0x6686,0xdabf,0x68e4,0x83a}}}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x780,0x54c4,0xe2ea,0x6e86,0xa092,0x7b62,0xeb6f,0x9605,0x30bc,0x6611,0x2837,0xcd8d,0x6686,0xdabf,0x68e4,0x83a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3c0,0x2a62,0x7175,0x3743,0x5049,0xbdb1,0xf5b7,0x4b02,0x985e,0xb308,0x941b,0x66c6,0xb343,0x6d5f,0x3472,0x41d}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3c0,0x2a62,0x7175,0x3743,0x5049,0xbdb1,0xf5b7,0x4b02,0x985e,0xb308,0x941b,0x66c6,0xb343,0x6d5f,0x3472,0x41d}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2000,0xbe1c,0x7883,0x84d6,0x2ae9,0x1722,0x5ace,0xbc6c,0x5342,0x16a,0x1f2e,0xf43f,0x8bbd,0x7982,0x65b,0x671f,0x3c44,0x583c,0x9c8d,0x7183,0x4b9b,0x194f,0xcbb8,0x2934,0x662d,0x1ff1,0x53a9,0x628a,0xe9ba,0x2c,0xd9f1,0x21}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1000,0xdf0e,0x3c41,0xc26b,0x1574,0xb91,0x2d67,0x5e36,0x29a1,0xb5,0x8f97,0xfa1f,0x45de,0xbcc1,0x832d,0x338f,0x1e22,0xac1e,0xce46,0xb8c1,0xa5cd,0xca7,0x65dc,0x949a,0xb316,0x8ff8,0x29d4,0x3145,0x74dd,0x8016,0xecf8,0x10}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3801,0x1391,0x8f27,0xb895,0x4f80,0x6227,0x2267,0xb3c0,0xed3e,0x55f1,0x5e39,0x2853,0x2d84,0xf483,0xec50,0x6374,0x3c44,0x583c,0x9c8d,0x7183,0x4b9b,0x194f,0xcbb8,0x2934,0x662d,0x1ff1,0x53a9,0x628a,0xe9ba,0x2c,0xd9f1,0x21}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3c0,0x2a62,0x7175,0x3743,0x5049,0xbdb1,0xf5b7,0x4b02,0x985e,0xb308,0x941b,0x66c6,0xb343,0x6d5f,0x3472,0x41d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x780,0x54c4,0xe2ea,0x6e86,0xa092,0x7b62,0xeb6f,0x9605,0x30bc,0x6611,0x2837,0xcd8d,0x6686,0xdabf,0x68e4,0x83a}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcffe,0x5515,0xd2b9,0x9881,0xb6d1,0x69f5,0x70cd,0x1158,0xcc08,0x56f0,0x81e9,0x97d7,0xbc73,0x9fe,0x3415,0x754}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x79d8,0xa418,0x41f3,0xf4dc,0x43,0x4f00,0xdcbc,0x38cd,0x4762,0x1b84,0x2da8,0x879c,0x5f56,0xa12d,0x407d,0xe5b}}}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x79d8,0xa418,0x41f3,0xf4dc,0x43,0x4f00,0xdcbc,0x38cd,0x4762,0x1b84,0x2da8,0x879c,0x5f56,0xa12d,0x407d,0xe5b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3cec,0xd20c,0x20f9,0xfa6e,0x21,0x2780,0xee5e,0x1c66,0x23b1,0xdc2,0x16d4,0x43ce,0xafab,0xd096,0xa03e,0x72d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xf320,0xe93e,0x2f41,0x4463,0xd4d,0x88af,0x389a,0x970a,0x2041,0x6587,0x4c38,0xd00c,0xe51f,0xebb9,0x99dc,0x9107,0x91df,0x338d,0xff0a,0xb41c,0x9d14,0x1ae6,0xa7f5,0xa7a3,0x1000,0x6e2f,0xfb25,0x5ce6,0x4d76,0x5398,0xdca,0x67}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x9fe1,0x3429,0x7833,0x9ffd,0x67d7,0xeceb,0x1c64,0x915,0xe876,0x71d9,0xfcf9,0x8499,0xeb89,0xa049,0x6f47,0xd594,0xa0bf,0xae38,0xff9d,0xae71,0xd86e,0x3df5,0xa995,0xa974,0x666,0x5f46,0x6475,0x585c,0x522f,0x54a3,0x38b7,0x29}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3cec,0xd20c,0x20f9,0xfa6e,0x21,0x2780,0xee5e,0x1c66,0x23b1,0xdc2,0x16d4,0x43ce,0xafab,0xd096,0xa03e,0x72d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x79d8,0xa418,0x41f3,0xf4dc,0x43,0x4f00,0xdcbc,0x38cd,0x4762,0x1b84,0x2da8,0x879c,0x5f56,0xa12d,0x407d,0xe5b}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x3925,0x3252,0xfa7c,0x972c,0xec9b,0x8f3a,0x1cc3,0xff55,0x49ca,0x6e33,0x586e,0xf6e9,0xcf6f,0x49fd,0xf8ac,0x9d6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x5}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x5}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x519e,0x3adc,0x1d00,0x1db9,0x2ac3,0x29ff,0xfd89,0xbeaf,0xe910,0xd574,0x1469,0xd70d,0x439,0x81ba,0xefbb,0x3fa6}}}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x519e,0x3adc,0x1d00,0x1db9,0x2ac3,0x29ff,0xfd89,0xbeaf,0xe910,0xd574,0x1469,0xd70d,0x439,0x81ba,0xefbb,0x3fa6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x28cf,0x1d6e,0x8e80,0x8edc,0x9561,0x94ff,0xfec4,0x5f57,0x7488,0xeaba,0x8a34,0xeb86,0x21c,0xc0dd,0x77dd,0x1fd3}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xaec2,0xfcca,0x2f4b,0xdd31,0x1c7a,0x1312,0x9a21,0xbcb7,0xf69e,0xd9e6,0x1c01,0x1382,0x9d48,0x7a41,0x25b,0xc4d3,0xf24b,0x1bb7,0x2dd5,0x9c44,0xbf2,0x4deb,0x8688,0x6bc9,0xab70,0xcc31,0x403c,0x71f,0xb871,0x8c2,0xcb6d,0x7e9}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x5761,0xfe65,0x97a5,0x6e98,0xe3d,0x8989,0xcd10,0x5e5b,0x7b4f,0xecf3,0xe00,0x9c1,0xcea4,0xbd20,0x812d,0xe269,0xf925,0x8ddb,0x16ea,0x4e22,0x85f9,0x26f5,0xc344,0x35e4,0xd5b8,0x6618,0xa01e,0x838f,0x5c38,0x8461,0xe5b6,0x3f4}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x674a,0xd5f0,0xad5b,0x7b20,0x76dd,0x4113,0x9ab1,0xc6be,0xaaac,0xe16,0xbbb7,0xf256,0xeeb,0x3e83,0x7a9c,0x4ef8,0xfb04,0x389f,0x3f36,0x95ea,0xd5cc,0xedc9,0x19a5,0x9b8f,0x2711,0x46f,0x8bb9,0xbcc5,0xceb4,0x6046,0xa710,0x2e0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x28cf,0x1d6e,0x8e80,0x8edc,0x9561,0x94ff,0xfec4,0x5f57,0x7488,0xeaba,0x8a34,0xeb86,0x21c,0xc0dd,0x77dd,0x1fd3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x519e,0x3adc,0x1d00,0x1db9,0x2ac3,0x29ff,0xfd89,0xbeaf,0xe910,0xd574,0x1469,0xd70d,0x439,0x81ba,0xefbb,0x3fa6}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6a4c,0x7c53,0x6b84,0xab45,0x5331,0xff1b,0x7a32,0x2ea4,0xf5e3,0x66ba,0x41ac,0x3763,0x5e06,0x8d36,0x7691,0xa2c2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x16}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xb}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc18c,0xc160,0x3367,0x784a,0x9d9a,0xfb08,0xda65,0x6b9,0x53ab,0xb83a,0x9ed1,0x5144,0xaed8,0xe628,0x7ad7,0x1b6}}}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc18c,0xc160,0x3367,0x784a,0x9d9a,0xfb08,0xda65,0x6b9,0x53ab,0xb83a,0x9ed1,0x5144,0xaed8,0xe628,0x7ad7,0x1b6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x60c6,0xe0b0,0x19b3,0x3c25,0x4ecd,0xfd84,0xed32,0x835c,0x29d5,0xdc1d,0x4f68,0x28a2,0x576c,0xf314,0x3d6b,0xdb}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x3248,0x69aa,0x4787,0x6ffe,0xcb76,0x7f13,0xdde2,0x266d,0x3fad,0xcef1,0x1634,0xcc80,0xec10,0xb929,0x6036,0xdf7f,0xd572,0xd23a,0xbda6,0xd476,0x8db9,0x6fc2,0x43b9,0x2a81,0x43c3,0x95a8,0x8a20,0xbd0f,0x854,0x4add,0x7784,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xd0bf,0xeb19,0xa99e,0xb87e,0x8a04,0xcfcc,0xb5bb,0xc975,0x2ff6,0xd522,0xf88a,0x12ff,0x5118,0xc3fa,0xe212,0xde9b,0xd572,0xd23a,0xbda6,0xd476,0x8db9,0x6fc2,0x43b9,0x2a81,0x43c3,0x95a8,0x8a20,0xbd0f,0x854,0x4add,0x7784,0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x60c6,0xe0b0,0x19b3,0x3c25,0x4ecd,0xfd84,0xed32,0x835c,0x29d5,0xdc1d,0x4f68,0x28a2,0x576c,0xf314,0x3d6b,0xdb}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc18c,0xc160,0x3367,0x784a,0x9d9a,0xfb08,0xda65,0x6b9,0x53ab,0xb83a,0x9ed1,0x5144,0xaed8,0xe628,0x7ad7,0x1b6}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6189,0x7e90,0x9de8,0xb77f,0x4171,0xaf47,0x2826,0x5cf8,0xfb6,0xf9cf,0x1da9,0xb980,0x9af8,0xf52f,0x7e23,0xe3}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd7ac,0xc5b6,0x766e,0x8b8d,0xb9f0,0x36c7,0x9615,0xec1e,0x84f,0xc4d1,0xc224,0x2350,0xc0c2,0xf391,0xfa07,0x1f84}}}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd7ac,0xc5b6,0x766e,0x8b8d,0xb9f0,0x36c7,0x9615,0xec1e,0x84f,0xc4d1,0xc224,0x2350,0xc0c2,0xf391,0xfa07,0x1f84}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6bd6,0x62db,0xbb37,0x45c6,0xdcf8,0x9b63,0x4b0a,0xf60f,0x8427,0x6268,0x6112,0x11a8,0xe061,0xf9c8,0x7d03,0xfc2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2dc8,0xb21,0x692b,0xb60f,0xd128,0x67bb,0x46da,0xd395,0x5f11,0xddc8,0x7b56,0xd919,0xeeed,0xccad,0x720e,0xa545,0x7b10,0xf6c,0x69e2,0x7856,0x3944,0xc307,0xeac2,0xaf86,0x901f,0xa1a5,0xdc68,0xd979,0x17a,0x5cb2,0xbcd0,0x1f0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xbef7,0xe45a,0x5529,0xf902,0xac34,0xf923,0x5e12,0xc46c,0x1275,0xb6aa,0xb793,0x4c62,0x151c,0x5fa,0x31c5,0x85d5,0xc29a,0xb855,0xebbc,0x76aa,0xfe6a,0x974c,0xebf1,0x294c,0xf4bc,0x4426,0x15be,0x8d86,0x69c2,0xf7b1,0xe121,0x74}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6bd6,0x62db,0xbb37,0x45c6,0xdcf8,0x9b63,0x4b0a,0xf60f,0x8427,0x6268,0x6112,0x11a8,0xe061,0xf9c8,0x7d03,0xfc2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd7ac,0xc5b6,0x766e,0x8b8d,0xb9f0,0x36c7,0x9615,0xec1e,0x84f,0xc4d1,0xc224,0x2350,0xc0c2,0xf391,0xfa07,0x1f84}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xf747,0xfd81,0x31b,0xb0ea,0x2ae1,0xec6f,0x23d8,0xbcdd,0xbd8a,0xaa29,0x4373,0xae28,0xab29,0x32e3,0x85da,0x4e12}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x11}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x11}, {{{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x7332,0x9105,0xff5a,0xdd46,0xd4f8,0x2531,0x7e5b,0xde4a,0x6237,0x259e,0xf722,0x6c2,0xe02f,0x4545,0x39fd,0xa9d,0x1}}}, {{{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x7332,0x9105,0xff5a,0xdd46,0xd4f8,0x2531,0x7e5b,0xde4a,0x6237,0x259e,0xf722,0x6c2,0xe02f,0x4545,0x39fd,0xa9d,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb999,0x4882,0x7fad,0x6ea3,0xea7c,0x9298,0x3f2d,0xef25,0x311b,0x12cf,0x7b91,0x8361,0xf017,0xa2a2,0x9cfe,0x854e}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xfae2,0x2be4,0xe3e2,0x3c68,0x22d9,0xc88f,0x4e95,0x6342,0xf7d,0x1931,0xcf98,0x7af,0xf77c,0x9bb4,0x408f,0xad10,0x3647,0x2aab,0x80b3,0x3b27,0x5802,0xa56,0x2d11,0xe11a,0x4b4,0x1e65,0x204c,0xe836,0x7880,0x40df,0x8e89,0x8ad5}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x7d71,0x15f2,0x71f1,0x9e34,0x916c,0xe447,0x274a,0xb1a1,0x87be,0xc98,0xe7cc,0x3d7,0x7bbe,0xcdda,0x2047,0xd688,0x9b23,0x9555,0xc059,0x1d93,0x2c01,0x852b,0x1688,0x708d,0x825a,0xf32,0x1026,0x741b,0xbc40,0xa06f,0xc744,0x456a}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xfb40,0x59f6,0xa101,0x3ff0,0xab0e,0xefe1,0xb19c,0xed0b,0x9380,0x58b5,0x3ab2,0x5d17,0xd404,0x2f25,0xe75b,0x3638,0x681d,0x4205,0x199f,0xf1b3,0x4373,0x6156,0x3751,0xff06,0xca40,0x7f9c,0x676b,0xa904,0x8d3c,0x6dd6,0x5d6d,0x462}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb999,0x4882,0x7fad,0x6ea3,0xea7c,0x9298,0x3f2d,0xef25,0x311b,0x12cf,0x7b91,0x8361,0xf017,0xa2a2,0x9cfe,0x854e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x7332,0x9105,0xff5a,0xdd46,0xd4f8,0x2531,0x7e5b,0xde4a,0x6237,0x259e,0xf722,0x6c2,0xe02f,0x4545,0x39fd,0xa9d,0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x9834,0xbdf0,0x27b3,0xa22,0x237c,0x5622,0xfaf7,0x9b1f,0x1cbf,0x3f9d,0xb2cd,0xe91e,0x8e54,0x57d5,0x324f,0x2fda}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xbe}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x13}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6d66,0xb89b,0x870f,0x16c9,0x2719,0xb8aa,0x7793,0xee59,0xcfbc,0x8d0,0x8885,0x1f3c,0x8151,0x7f6a,0x863,0x899}}}, {{{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6d66,0xb89b,0x870f,0x16c9,0x2719,0xb8aa,0x7793,0xee59,0xcfbc,0x8d0,0x8885,0x1f3c,0x8151,0x7f6a,0x863,0x899}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb6b3,0xdc4d,0xc387,0x8b64,0x138c,0xdc55,0xbbc9,0x772c,0x67de,0x8468,0x4442,0x8f9e,0x40a8,0xbfb5,0x8431,0x44c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x252,0x2422,0x18ca,0x3372,0x513b,0xb36a,0xc000,0x88f5,0xaa17,0xaa18,0xaec9,0x32e9,0x27f7,0x5aa9,0xefe0,0x6c5a,0xd15d,0x6bc8,0xd19a,0xc135,0xb668,0xe43,0xd176,0x69ea,0x2365,0xa335,0x8719,0xc65,0xaa03,0x9f95,0xf600,0x24}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x129,0x1211,0xc65,0x99b9,0x289d,0x59b5,0xe000,0xc47a,0x550b,0xd50c,0xd764,0x9974,0x93fb,0x2d54,0x77f0,0xb62d,0x68ae,0x35e4,0xe8cd,0x609a,0xdb34,0x721,0x68bb,0xb4f5,0x91b2,0xd19a,0xc38c,0x8632,0xd501,0x4fca,0x7b00,0x12}}}, {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xe4a6,0x4a8c,0x6543,0x7d2,0x245a,0x32ba,0x6117,0x9010,0xbcb4,0x38c9,0x8393,0x2457,0xd9ca,0xf93a,0x4c70,0x1efd,0x9b1f,0x23ed,0x45de,0x4067,0xe778,0xaf6b,0xf07c,0xcdf8,0x6121,0x8bbc,0x2d08,0x5977,0xe356,0x3531,0x5200,0xc}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb6b3,0xdc4d,0xc387,0x8b64,0x138c,0xdc55,0xbbc9,0x772c,0x67de,0x8468,0x4442,0x8f9e,0x40a8,0xbfb5,0x8431,0x44c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6d66,0xb89b,0x870f,0x16c9,0x2719,0xb8aa,0x7793,0xee59,0xcfbc,0x8d0,0x8885,0x1f3c,0x8151,0x7f6a,0x863,0x899}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xa8c0,0x88f6,0xd200,0x37f5,0xc85a,0x3677,0x3976,0xb189,0xe7f3,0xff76,0x481f,0x8bc6,0x3531,0xddf1,0x151a,0x1ec6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1f}}; -#elif 8*DIGIT_LEN == 32 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xa6e1ffff,0x994c68ad,0x781974ce,0xfaf0a29a,0x4a0dea65,0xfe3ac590,0x26507d01,0x2bdbe63,0x6936e792,0x8c15b003,0xa8869bc6,0x255946}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xa6e1ffff,0x994c68ad,0x781974ce,0xfaf0a29a,0x4a0dea65,0xfe3ac590,0x26507d01,0x2bdbe63,0x6936e792,0x8c15b003,0xa8869bc6,0x255946}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xa6e1ffff,0x994c68ad,0x781974ce,0xfaf0a29a,0x4a0dea65,0xfe3ac590,0x26507d01,0x2bdbe63,0x6936e792,0x8c15b003,0xa8869bc6,0x255946}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x54c40780,0x6e86e2ea,0x7b62a092,0x9605eb6f,0x661130bc,0xcd8d2837,0xdabf6686,0x83a68e4}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x54c40780,0x6e86e2ea,0x7b62a092,0x9605eb6f,0x661130bc,0xcd8d2837,0xdabf6686,0x83a68e4}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2a6203c0,0x37437175,0xbdb15049,0x4b02f5b7,0xb308985e,0x66c6941b,0x6d5fb343,0x41d3472}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2a6203c0,0x37437175,0xbdb15049,0x4b02f5b7,0xb308985e,0x66c6941b,0x6d5fb343,0x41d3472}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbe1c2000,0x84d67883,0x17222ae9,0xbc6c5ace,0x16a5342,0xf43f1f2e,0x79828bbd,0x671f065b,0x583c3c44,0x71839c8d,0x194f4b9b,0x2934cbb8,0x1ff1662d,0x628a53a9,0x2ce9ba,0x21d9f1}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdf0e1000,0xc26b3c41,0xb911574,0x5e362d67,0xb529a1,0xfa1f8f97,0xbcc145de,0x338f832d,0xac1e1e22,0xb8c1ce46,0xca7a5cd,0x949a65dc,0x8ff8b316,0x314529d4,0x801674dd,0x10ecf8}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x13913801,0xb8958f27,0x62274f80,0xb3c02267,0x55f1ed3e,0x28535e39,0xf4832d84,0x6374ec50,0x583c3c44,0x71839c8d,0x194f4b9b,0x2934cbb8,0x1ff1662d,0x628a53a9,0x2ce9ba,0x21d9f1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2a6203c0,0x37437175,0xbdb15049,0x4b02f5b7,0xb308985e,0x66c6941b,0x6d5fb343,0x41d3472}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x54c40780,0x6e86e2ea,0x7b62a092,0x9605eb6f,0x661130bc,0xcd8d2837,0xdabf6686,0x83a68e4}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5515cffe,0x9881d2b9,0x69f5b6d1,0x115870cd,0x56f0cc08,0x97d781e9,0x9febc73,0x7543415}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa41879d8,0xf4dc41f3,0x4f000043,0x38cddcbc,0x1b844762,0x879c2da8,0xa12d5f56,0xe5b407d}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa41879d8,0xf4dc41f3,0x4f000043,0x38cddcbc,0x1b844762,0x879c2da8,0xa12d5f56,0xe5b407d}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd20c3cec,0xfa6e20f9,0x27800021,0x1c66ee5e,0xdc223b1,0x43ce16d4,0xd096afab,0x72da03e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe93ef320,0x44632f41,0x88af0d4d,0x970a389a,0x65872041,0xd00c4c38,0xebb9e51f,0x910799dc,0x338d91df,0xb41cff0a,0x1ae69d14,0xa7a3a7f5,0x6e2f1000,0x5ce6fb25,0x53984d76,0x670dca}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x34299fe1,0x9ffd7833,0xeceb67d7,0x9151c64,0x71d9e876,0x8499fcf9,0xa049eb89,0xd5946f47,0xae38a0bf,0xae71ff9d,0x3df5d86e,0xa974a995,0x5f460666,0x585c6475,0x54a3522f,0x2938b7}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd20c3cec,0xfa6e20f9,0x27800021,0x1c66ee5e,0xdc223b1,0x43ce16d4,0xd096afab,0x72da03e}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa41879d8,0xf4dc41f3,0x4f000043,0x38cddcbc,0x1b844762,0x879c2da8,0xa12d5f56,0xe5b407d}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x32523925,0x972cfa7c,0x8f3aec9b,0xff551cc3,0x6e3349ca,0xf6e9586e,0x49fdcf6f,0x9d6f8ac}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x5}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x5}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3adc519e,0x1db91d00,0x29ff2ac3,0xbeaffd89,0xd574e910,0xd70d1469,0x81ba0439,0x3fa6efbb}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3adc519e,0x1db91d00,0x29ff2ac3,0xbeaffd89,0xd574e910,0xd70d1469,0x81ba0439,0x3fa6efbb}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1d6e28cf,0x8edc8e80,0x94ff9561,0x5f57fec4,0xeaba7488,0xeb868a34,0xc0dd021c,0x1fd377dd}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfccaaec2,0xdd312f4b,0x13121c7a,0xbcb79a21,0xd9e6f69e,0x13821c01,0x7a419d48,0xc4d3025b,0x1bb7f24b,0x9c442dd5,0x4deb0bf2,0x6bc98688,0xcc31ab70,0x71f403c,0x8c2b871,0x7e9cb6d}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfe655761,0x6e9897a5,0x89890e3d,0x5e5bcd10,0xecf37b4f,0x9c10e00,0xbd20cea4,0xe269812d,0x8ddbf925,0x4e2216ea,0x26f585f9,0x35e4c344,0x6618d5b8,0x838fa01e,0x84615c38,0x3f4e5b6}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd5f0674a,0x7b20ad5b,0x411376dd,0xc6be9ab1,0xe16aaac,0xf256bbb7,0x3e830eeb,0x4ef87a9c,0x389ffb04,0x95ea3f36,0xedc9d5cc,0x9b8f19a5,0x46f2711,0xbcc58bb9,0x6046ceb4,0x2e0a710}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1d6e28cf,0x8edc8e80,0x94ff9561,0x5f57fec4,0xeaba7488,0xeb868a34,0xc0dd021c,0x1fd377dd}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3adc519e,0x1db91d00,0x29ff2ac3,0xbeaffd89,0xd574e910,0xd70d1469,0x81ba0439,0x3fa6efbb}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7c536a4c,0xab456b84,0xff1b5331,0x2ea47a32,0x66baf5e3,0x376341ac,0x8d365e06,0xa2c27691}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x16}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xb}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc160c18c,0x784a3367,0xfb089d9a,0x6b9da65,0xb83a53ab,0x51449ed1,0xe628aed8,0x1b67ad7}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc160c18c,0x784a3367,0xfb089d9a,0x6b9da65,0xb83a53ab,0x51449ed1,0xe628aed8,0x1b67ad7}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe0b060c6,0x3c2519b3,0xfd844ecd,0x835ced32,0xdc1d29d5,0x28a24f68,0xf314576c,0xdb3d6b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x69aa3248,0x6ffe4787,0x7f13cb76,0x266ddde2,0xcef13fad,0xcc801634,0xb929ec10,0xdf7f6036,0xd23ad572,0xd476bda6,0x6fc28db9,0x2a8143b9,0x95a843c3,0xbd0f8a20,0x4add0854,0x17784}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xeb19d0bf,0xb87ea99e,0xcfcc8a04,0xc975b5bb,0xd5222ff6,0x12fff88a,0xc3fa5118,0xde9be212,0xd23ad572,0xd476bda6,0x6fc28db9,0x2a8143b9,0x95a843c3,0xbd0f8a20,0x4add0854,0x17784}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe0b060c6,0x3c2519b3,0xfd844ecd,0x835ced32,0xdc1d29d5,0x28a24f68,0xf314576c,0xdb3d6b}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc160c18c,0x784a3367,0xfb089d9a,0x6b9da65,0xb83a53ab,0x51449ed1,0xe628aed8,0x1b67ad7}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7e906189,0xb77f9de8,0xaf474171,0x5cf82826,0xf9cf0fb6,0xb9801da9,0xf52f9af8,0xe37e23}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc5b6d7ac,0x8b8d766e,0x36c7b9f0,0xec1e9615,0xc4d1084f,0x2350c224,0xf391c0c2,0x1f84fa07}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc5b6d7ac,0x8b8d766e,0x36c7b9f0,0xec1e9615,0xc4d1084f,0x2350c224,0xf391c0c2,0x1f84fa07}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x62db6bd6,0x45c6bb37,0x9b63dcf8,0xf60f4b0a,0x62688427,0x11a86112,0xf9c8e061,0xfc27d03}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb212dc8,0xb60f692b,0x67bbd128,0xd39546da,0xddc85f11,0xd9197b56,0xccadeeed,0xa545720e,0xf6c7b10,0x785669e2,0xc3073944,0xaf86eac2,0xa1a5901f,0xd979dc68,0x5cb2017a,0x1f0bcd0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe45abef7,0xf9025529,0xf923ac34,0xc46c5e12,0xb6aa1275,0x4c62b793,0x5fa151c,0x85d531c5,0xb855c29a,0x76aaebbc,0x974cfe6a,0x294cebf1,0x4426f4bc,0x8d8615be,0xf7b169c2,0x74e121}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x62db6bd6,0x45c6bb37,0x9b63dcf8,0xf60f4b0a,0x62688427,0x11a86112,0xf9c8e061,0xfc27d03}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc5b6d7ac,0x8b8d766e,0x36c7b9f0,0xec1e9615,0xc4d1084f,0x2350c224,0xf391c0c2,0x1f84fa07}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xfd81f747,0xb0ea031b,0xec6f2ae1,0xbcdd23d8,0xaa29bd8a,0xae284373,0x32e3ab29,0x4e1285da}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x11}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x11}, {{{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x91057332,0xdd46ff5a,0x2531d4f8,0xde4a7e5b,0x259e6237,0x6c2f722,0x4545e02f,0xa9d39fd,0x1}}}, {{{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x91057332,0xdd46ff5a,0x2531d4f8,0xde4a7e5b,0x259e6237,0x6c2f722,0x4545e02f,0xa9d39fd,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4882b999,0x6ea37fad,0x9298ea7c,0xef253f2d,0x12cf311b,0x83617b91,0xa2a2f017,0x854e9cfe}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x2be4fae2,0x3c68e3e2,0xc88f22d9,0x63424e95,0x19310f7d,0x7afcf98,0x9bb4f77c,0xad10408f,0x2aab3647,0x3b2780b3,0xa565802,0xe11a2d11,0x1e6504b4,0xe836204c,0x40df7880,0x8ad58e89}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x15f27d71,0x9e3471f1,0xe447916c,0xb1a1274a,0xc9887be,0x3d7e7cc,0xcdda7bbe,0xd6882047,0x95559b23,0x1d93c059,0x852b2c01,0x708d1688,0xf32825a,0x741b1026,0xa06fbc40,0x456ac744}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x59f6fb40,0x3ff0a101,0xefe1ab0e,0xed0bb19c,0x58b59380,0x5d173ab2,0x2f25d404,0x3638e75b,0x4205681d,0xf1b3199f,0x61564373,0xff063751,0x7f9cca40,0xa904676b,0x6dd68d3c,0x4625d6d}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4882b999,0x6ea37fad,0x9298ea7c,0xef253f2d,0x12cf311b,0x83617b91,0xa2a2f017,0x854e9cfe}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x91057332,0xdd46ff5a,0x2531d4f8,0xde4a7e5b,0x259e6237,0x6c2f722,0x4545e02f,0xa9d39fd,0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xbdf09834,0xa2227b3,0x5622237c,0x9b1ffaf7,0x3f9d1cbf,0xe91eb2cd,0x57d58e54,0x2fda324f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xbe}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x13}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb89b6d66,0x16c9870f,0xb8aa2719,0xee597793,0x8d0cfbc,0x1f3c8885,0x7f6a8151,0x8990863}}}, {{{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb89b6d66,0x16c9870f,0xb8aa2719,0xee597793,0x8d0cfbc,0x1f3c8885,0x7f6a8151,0x8990863}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdc4db6b3,0x8b64c387,0xdc55138c,0x772cbbc9,0x846867de,0x8f9e4442,0xbfb540a8,0x44c8431}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x24220252,0x337218ca,0xb36a513b,0x88f5c000,0xaa18aa17,0x32e9aec9,0x5aa927f7,0x6c5aefe0,0x6bc8d15d,0xc135d19a,0xe43b668,0x69ead176,0xa3352365,0xc658719,0x9f95aa03,0x24f600}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x12110129,0x99b90c65,0x59b5289d,0xc47ae000,0xd50c550b,0x9974d764,0x2d5493fb,0xb62d77f0,0x35e468ae,0x609ae8cd,0x721db34,0xb4f568bb,0xd19a91b2,0x8632c38c,0x4fcad501,0x127b00}}}, {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x4a8ce4a6,0x7d26543,0x32ba245a,0x90106117,0x38c9bcb4,0x24578393,0xf93ad9ca,0x1efd4c70,0x23ed9b1f,0x406745de,0xaf6be778,0xcdf8f07c,0x8bbc6121,0x59772d08,0x3531e356,0xc5200}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdc4db6b3,0x8b64c387,0xdc55138c,0x772cbbc9,0x846867de,0x8f9e4442,0xbfb540a8,0x44c8431}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb89b6d66,0x16c9870f,0xb8aa2719,0xee597793,0x8d0cfbc,0x1f3c8885,0x7f6a8151,0x8990863}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x88f6a8c0,0x37f5d200,0x3677c85a,0xb1893976,0xff76e7f3,0x8bc6481f,0xddf13531,0x1ec6151a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1f}}; -#elif 8*DIGIT_LEN == 64 -const quat_alg_t QUATALG_PINFTY = {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0x994c68ada6e1ffff,0xfaf0a29a781974ce,0xfe3ac5904a0dea65,0x2bdbe6326507d01,0x8c15b0036936e792,0x255946a8869bc6}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0x994c68ada6e1ffff,0xfaf0a29a781974ce,0xfe3ac5904a0dea65,0x2bdbe6326507d01,0x8c15b0036936e792,0x255946a8869bc6}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0x994c68ada6e1ffff,0xfaf0a29a781974ce,0xfe3ac5904a0dea65,0x2bdbe6326507d01,0x8c15b0036936e792,0x255946a8869bc6}}}}}}; -const quat_order_t MAXORD_O0 = {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}; -const quat_p_extremal_maximal_order_t STANDARD_EXTREMAL_ORDER = {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1}; -const quat_p_extremal_maximal_order_t ALTERNATE_EXTREMAL_ORDERS[7] = {{{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6e86e2ea54c40780,0x9605eb6f7b62a092,0xcd8d2837661130bc,0x83a68e4dabf6686}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6e86e2ea54c40780,0x9605eb6f7b62a092,0xcd8d2837661130bc,0x83a68e4dabf6686}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x374371752a6203c0,0x4b02f5b7bdb15049,0x66c6941bb308985e,0x41d34726d5fb343}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x374371752a6203c0,0x4b02f5b7bdb15049,0x66c6941bb308985e,0x41d34726d5fb343}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x84d67883be1c2000,0xbc6c5ace17222ae9,0xf43f1f2e016a5342,0x671f065b79828bbd,0x71839c8d583c3c44,0x2934cbb8194f4b9b,0x628a53a91ff1662d,0x21d9f1002ce9ba}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xc26b3c41df0e1000,0x5e362d670b911574,0xfa1f8f9700b529a1,0x338f832dbcc145de,0xb8c1ce46ac1e1e22,0x949a65dc0ca7a5cd,0x314529d48ff8b316,0x10ecf8801674dd}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb8958f2713913801,0xb3c0226762274f80,0x28535e3955f1ed3e,0x6374ec50f4832d84,0x71839c8d583c3c44,0x2934cbb8194f4b9b,0x628a53a91ff1662d,0x21d9f1002ce9ba}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x374371752a6203c0,0x4b02f5b7bdb15049,0x66c6941bb308985e,0x41d34726d5fb343}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6e86e2ea54c40780,0x9605eb6f7b62a092,0xcd8d2837661130bc,0x83a68e4dabf6686}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9881d2b95515cffe,0x115870cd69f5b6d1,0x97d781e956f0cc08,0x754341509febc73}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x3}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf4dc41f3a41879d8,0x38cddcbc4f000043,0x879c2da81b844762,0xe5b407da12d5f56}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf4dc41f3a41879d8,0x38cddcbc4f000043,0x879c2da81b844762,0xe5b407da12d5f56}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xfa6e20f9d20c3cec,0x1c66ee5e27800021,0x43ce16d40dc223b1,0x72da03ed096afab}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x44632f41e93ef320,0x970a389a88af0d4d,0xd00c4c3865872041,0x910799dcebb9e51f,0xb41cff0a338d91df,0xa7a3a7f51ae69d14,0x5ce6fb256e2f1000,0x670dca53984d76}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9ffd783334299fe1,0x9151c64eceb67d7,0x8499fcf971d9e876,0xd5946f47a049eb89,0xae71ff9dae38a0bf,0xa974a9953df5d86e,0x585c64755f460666,0x2938b754a3522f}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xfa6e20f9d20c3cec,0x1c66ee5e27800021,0x43ce16d40dc223b1,0x72da03ed096afab}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf4dc41f3a41879d8,0x38cddcbc4f000043,0x879c2da81b844762,0xe5b407da12d5f56}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x972cfa7c32523925,0xff551cc38f3aec9b,0xf6e9586e6e3349ca,0x9d6f8ac49fdcf6f}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x5}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x5}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1db91d003adc519e,0xbeaffd8929ff2ac3,0xd70d1469d574e910,0x3fa6efbb81ba0439}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1db91d003adc519e,0xbeaffd8929ff2ac3,0xd70d1469d574e910,0x3fa6efbb81ba0439}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8edc8e801d6e28cf,0x5f57fec494ff9561,0xeb868a34eaba7488,0x1fd377ddc0dd021c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdd312f4bfccaaec2,0xbcb79a2113121c7a,0x13821c01d9e6f69e,0xc4d3025b7a419d48,0x9c442dd51bb7f24b,0x6bc986884deb0bf2,0x71f403ccc31ab70,0x7e9cb6d08c2b871}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6e9897a5fe655761,0x5e5bcd1089890e3d,0x9c10e00ecf37b4f,0xe269812dbd20cea4,0x4e2216ea8ddbf925,0x35e4c34426f585f9,0x838fa01e6618d5b8,0x3f4e5b684615c38}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7b20ad5bd5f0674a,0xc6be9ab1411376dd,0xf256bbb70e16aaac,0x4ef87a9c3e830eeb,0x95ea3f36389ffb04,0x9b8f19a5edc9d5cc,0xbcc58bb9046f2711,0x2e0a7106046ceb4}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8edc8e801d6e28cf,0x5f57fec494ff9561,0xeb868a34eaba7488,0x1fd377ddc0dd021c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1db91d003adc519e,0xbeaffd8929ff2ac3,0xd70d1469d574e910,0x3fa6efbb81ba0439}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xab456b847c536a4c,0x2ea47a32ff1b5331,0x376341ac66baf5e3,0xa2c276918d365e06}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x16}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xb}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x784a3367c160c18c,0x6b9da65fb089d9a,0x51449ed1b83a53ab,0x1b67ad7e628aed8}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x784a3367c160c18c,0x6b9da65fb089d9a,0x51449ed1b83a53ab,0x1b67ad7e628aed8}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3c2519b3e0b060c6,0x835ced32fd844ecd,0x28a24f68dc1d29d5,0xdb3d6bf314576c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6ffe478769aa3248,0x266ddde27f13cb76,0xcc801634cef13fad,0xdf7f6036b929ec10,0xd476bda6d23ad572,0x2a8143b96fc28db9,0xbd0f8a2095a843c3,0x177844add0854}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb87ea99eeb19d0bf,0xc975b5bbcfcc8a04,0x12fff88ad5222ff6,0xde9be212c3fa5118,0xd476bda6d23ad572,0x2a8143b96fc28db9,0xbd0f8a2095a843c3,0x177844add0854}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3c2519b3e0b060c6,0x835ced32fd844ecd,0x28a24f68dc1d29d5,0xdb3d6bf314576c}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x784a3367c160c18c,0x6b9da65fb089d9a,0x51449ed1b83a53ab,0x1b67ad7e628aed8}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb77f9de87e906189,0x5cf82826af474171,0xb9801da9f9cf0fb6,0xe37e23f52f9af8}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0xd}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8b8d766ec5b6d7ac,0xec1e961536c7b9f0,0x2350c224c4d1084f,0x1f84fa07f391c0c2}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8b8d766ec5b6d7ac,0xec1e961536c7b9f0,0x2350c224c4d1084f,0x1f84fa07f391c0c2}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x45c6bb3762db6bd6,0xf60f4b0a9b63dcf8,0x11a8611262688427,0xfc27d03f9c8e061}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb60f692b0b212dc8,0xd39546da67bbd128,0xd9197b56ddc85f11,0xa545720eccadeeed,0x785669e20f6c7b10,0xaf86eac2c3073944,0xd979dc68a1a5901f,0x1f0bcd05cb2017a}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf9025529e45abef7,0xc46c5e12f923ac34,0x4c62b793b6aa1275,0x85d531c505fa151c,0x76aaebbcb855c29a,0x294cebf1974cfe6a,0x8d8615be4426f4bc,0x74e121f7b169c2}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x45c6bb3762db6bd6,0xf60f4b0a9b63dcf8,0x11a8611262688427,0xfc27d03f9c8e061}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8b8d766ec5b6d7ac,0xec1e961536c7b9f0,0x2350c224c4d1084f,0x1f84fa07f391c0c2}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xb0ea031bfd81f747,0xbcdd23d8ec6f2ae1,0xae284373aa29bd8a,0x4e1285da32e3ab29}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x11}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x11}, {{{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xdd46ff5a91057332,0xde4a7e5b2531d4f8,0x6c2f722259e6237,0xa9d39fd4545e02f,0x1}}}, {{{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xdd46ff5a91057332,0xde4a7e5b2531d4f8,0x6c2f722259e6237,0xa9d39fd4545e02f,0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6ea37fad4882b999,0xef253f2d9298ea7c,0x83617b9112cf311b,0x854e9cfea2a2f017}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3c68e3e22be4fae2,0x63424e95c88f22d9,0x7afcf9819310f7d,0xad10408f9bb4f77c,0x3b2780b32aab3647,0xe11a2d110a565802,0xe836204c1e6504b4,0x8ad58e8940df7880}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9e3471f115f27d71,0xb1a1274ae447916c,0x3d7e7cc0c9887be,0xd6882047cdda7bbe,0x1d93c05995559b23,0x708d1688852b2c01,0x741b10260f32825a,0x456ac744a06fbc40}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x3ff0a10159f6fb40,0xed0bb19cefe1ab0e,0x5d173ab258b59380,0x3638e75b2f25d404,0xf1b3199f4205681d,0xff06375161564373,0xa904676b7f9cca40,0x4625d6d6dd68d3c}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6ea37fad4882b999,0xef253f2d9298ea7c,0x83617b9112cf311b,0x854e9cfea2a2f017}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xdd46ff5a91057332,0xde4a7e5b2531d4f8,0x6c2f722259e6237,0xa9d39fd4545e02f,0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xa2227b3bdf09834,0x9b1ffaf75622237c,0xe91eb2cd3f9d1cbf,0x2fda324f57d58e54}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xbe}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x13}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x16c9870fb89b6d66,0xee597793b8aa2719,0x1f3c888508d0cfbc,0x89908637f6a8151}}}, {{{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x16c9870fb89b6d66,0xee597793b8aa2719,0x1f3c888508d0cfbc,0x89908637f6a8151}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8b64c387dc4db6b3,0x772cbbc9dc55138c,0x8f9e4442846867de,0x44c8431bfb540a8}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x337218ca24220252,0x88f5c000b36a513b,0x32e9aec9aa18aa17,0x6c5aefe05aa927f7,0xc135d19a6bc8d15d,0x69ead1760e43b668,0xc658719a3352365,0x24f6009f95aa03}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x99b90c6512110129,0xc47ae00059b5289d,0x9974d764d50c550b,0xb62d77f02d5493fb,0x609ae8cd35e468ae,0xb4f568bb0721db34,0x8632c38cd19a91b2,0x127b004fcad501}}}, {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7d265434a8ce4a6,0x9010611732ba245a,0x2457839338c9bcb4,0x1efd4c70f93ad9ca,0x406745de23ed9b1f,0xcdf8f07caf6be778,0x59772d088bbc6121,0xc52003531e356}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8b64c387dc4db6b3,0x772cbbc9dc55138c,0x8f9e4442846867de,0x44c8431bfb540a8}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}}}}, {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x16c9870fb89b6d66,0xee597793b8aa2719,0x1f3c888508d0cfbc,0x89908637f6a8151}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x37f5d20088f6a8c0,0xb18939763677c85a,0x8bc6481fff76e7f3,0x1ec6151addf13531}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x6}}}}}, {{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}}, {{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}}}}, 0x1f}}; +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x200}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x33,0x0,0x0,0x0,0x0,0x0,0x0,0x200000000000000}}} #endif +; +const quat_alg_t QUATALG_PINFTY = { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x1af}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x1afffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0x1afffffffffffff}}} +#endif +}; +const quat_p_extremal_maximal_order_t EXTREMAL_ORDERS[7] = {{{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 1}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc584,0x10dc,0x9924,0xb9c2,0x5a67,0xfbc8,0xbdfb,0xe941,0xc61,0xdee2,0xcd5c,0xc570,0xa2d4,0xb3ff,0x2e51,0x4927}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x10dcc584,0xb9c29924,0xfbc85a67,0xe941bdfb,0xdee20c61,0xc570cd5c,0xb3ffa2d4,0x49272e51}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb9c2992410dcc584,0xe941bdfbfbc85a67,0xc570cd5cdee20c61,0x49272e51b3ffa2d4}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc584,0x10dc,0x9924,0xb9c2,0x5a67,0xfbc8,0xbdfb,0xe941,0xc61,0xdee2,0xcd5c,0xc570,0xa2d4,0xb3ff,0x2e51,0x4927}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x10dcc584,0xb9c29924,0xfbc85a67,0xe941bdfb,0xdee20c61,0xc570cd5c,0xb3ffa2d4,0x49272e51}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb9c2992410dcc584,0xe941bdfbfbc85a67,0xc570cd5cdee20c61,0x49272e51b3ffa2d4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x62c2,0x86e,0x4c92,0xdce1,0x2d33,0xfde4,0xdefd,0xf4a0,0x630,0x6f71,0x66ae,0x62b8,0xd16a,0xd9ff,0x9728,0x2493}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x86e62c2,0xdce14c92,0xfde42d33,0xf4a0defd,0x6f710630,0x62b866ae,0xd9ffd16a,0x24939728}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdce14c92086e62c2,0xf4a0defdfde42d33,0x62b866ae6f710630,0x24939728d9ffd16a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xc93,0xd634,0x4632,0x353f,0x76ba,0x220d,0x5084,0x3187,0xb121,0xfc8,0x6860,0xa3e4,0x1368,0x7388,0x5e0,0x7e52}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xd6340c93,0x353f4632,0x220d76ba,0x31875084,0xfc8b121,0xa3e46860,0x73881368,0x7e5205e0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x353f4632d6340c93,0x31875084220d76ba,0xa3e468600fc8b121,0x7e5205e073881368}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x2f6d,0xbfbd,0x6af0,0xbcd3,0x5c61,0x8f62,0x9b0b,0xd78a,0x3142,0x61aa,0x4716,0x208,0x93c7,0x43bd,0x97d6,0xda1a,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xd7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbfbd2f6d,0xbcd36af0,0x8f625c61,0xd78a9b0b,0x61aa3142,0x2084716,0x43bd93c7,0xda1a97d6,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xd7ffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbcd36af0bfbd2f6d,0xd78a9b0b8f625c61,0x208471661aa3142,0xda1a97d643bd93c7,0xffffffffffffffff,0xffffffffffffffff,0xffffffffffffffff,0xd7ffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x62c2,0x86e,0x4c92,0xdce1,0x2d33,0xfde4,0xdefd,0xf4a0,0x630,0x6f71,0x66ae,0x62b8,0xd16a,0xd9ff,0x9728,0x2493}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x86e62c2,0xdce14c92,0xfde42d33,0xf4a0defd,0x6f710630,0x62b866ae,0xd9ffd16a,0x24939728}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdce14c92086e62c2,0xf4a0defdfde42d33,0x62b866ae6f710630,0x24939728d9ffd16a}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9add,0x156b,0x8705,0x6bb9,0x8bdf,0xd034,0x21a6,0xb827,0x44e9,0x34c7,0x3da3,0xa9fd,0xcebd,0x3ec0,0xcd63,0xca1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x156b9add,0x6bb98705,0xd0348bdf,0xb82721a6,0x34c744e9,0xa9fd3da3,0x3ec0cebd,0xca1cd63}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6bb98705156b9add,0xb82721a6d0348bdf,0xa9fd3da334c744e9,0xca1cd633ec0cebd}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc584,0x10dc,0x9924,0xb9c2,0x5a67,0xfbc8,0xbdfb,0xe941,0xc61,0xdee2,0xcd5c,0xc570,0xa2d4,0xb3ff,0x2e51,0x4927}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x10dcc584,0xb9c29924,0xfbc85a67,0xe941bdfb,0xdee20c61,0xc570cd5c,0xb3ffa2d4,0x49272e51}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb9c2992410dcc584,0xe941bdfbfbc85a67,0xc570cd5cdee20c61,0x49272e51b3ffa2d4}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xc93,0xd634,0x4632,0x353f,0x76ba,0x220d,0x5084,0x3187,0xb121,0xfc8,0x6860,0xa3e4,0x1368,0x7388,0x5e0,0x7e52}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xd6340c93,0x353f4632,0x220d76ba,0x31875084,0xfc8b121,0xa3e46860,0x73881368,0x7e5205e0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x353f4632d6340c93,0x31875084220d76ba,0xa3e468600fc8b121,0x7e5205e073881368}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 5}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x169a,0xd34,0xbfd7,0x4089,0x1be8,0xc17d,0xfefb,0x6efd,0x76e0,0x58ea,0xfedb,0xd204,0x1e3,0x3b9a,0x47d6,0xdf28,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xd34169a,0x4089bfd7,0xc17d1be8,0x6efdfefb,0x58ea76e0,0xd204fedb,0x3b9a01e3,0xdf2847d6,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x4089bfd70d34169a,0x6efdfefbc17d1be8,0xd204fedb58ea76e0,0xdf2847d63b9a01e3,0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x169a,0xd34,0xbfd7,0x4089,0x1be8,0xc17d,0xfefb,0x6efd,0x76e0,0x58ea,0xfedb,0xd204,0x1e3,0x3b9a,0x47d6,0xdf28,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xd34169a,0x4089bfd7,0xc17d1be8,0x6efdfefb,0x58ea76e0,0xd204fedb,0x3b9a01e3,0xdf2847d6,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x4089bfd70d34169a,0x6efdfefbc17d1be8,0xd204fedb58ea76e0,0xdf2847d63b9a01e3,0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xb4d,0x869a,0xdfeb,0x2044,0x8df4,0xe0be,0xff7d,0x377e,0x3b70,0xac75,0x7f6d,0xe902,0xf1,0x1dcd,0x23eb,0x6f94,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x869a0b4d,0x2044dfeb,0xe0be8df4,0x377eff7d,0xac753b70,0xe9027f6d,0x1dcd00f1,0x6f9423eb,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2044dfeb869a0b4d,0x377eff7de0be8df4,0xe9027f6dac753b70,0x6f9423eb1dcd00f1,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -17, ._mp_d = (mp_limb_t[]) {0x2412,0x6ec4,0x4dda,0x2cde,0x281d,0xaaa7,0x3a33,0xc1d6,0x5c26,0x22e3,0x816d,0x13fb,0xac81,0x58e8,0xd1a7,0xadaa,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0x6ec42412,0x2cde4dda,0xaaa7281d,0xc1d63a33,0x22e35c26,0x13fb816d,0x58e8ac81,0xadaad1a7,0xc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0x2cde4dda6ec42412,0xc1d63a33aaa7281d,0x13fb816d22e35c26,0xadaad1a758e8ac81,0xc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x1f45,0x5630,0xd526,0x9cc7,0x1aab,0x114d,0x87b3,0xbb27,0xc6b6,0xe50,0x8bb4,0x813f,0xff7a,0xf810,0xa8d3,0x66ee,0xfffc,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x35f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x56301f45,0x9cc7d526,0x114d1aab,0xbb2787b3,0xe50c6b6,0x813f8bb4,0xf810ff7a,0x66eea8d3,0xfffffffc,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x35fffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9cc7d52656301f45,0xbb2787b3114d1aab,0x813f8bb40e50c6b6,0x66eea8d3f810ff7a,0xfffffffffffffffc,0xffffffffffffffff,0xffffffffffffffff,0x35fffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xb4d,0x869a,0xdfeb,0x2044,0x8df4,0xe0be,0xff7d,0x377e,0x3b70,0xac75,0x7f6d,0xe902,0xf1,0x1dcd,0x23eb,0x6f94,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x869a0b4d,0x2044dfeb,0xe0be8df4,0x377eff7d,0xac753b70,0xe9027f6d,0x1dcd00f1,0x6f9423eb,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2044dfeb869a0b4d,0x377eff7de0be8df4,0xe9027f6dac753b70,0x6f9423eb1dcd00f1,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x94}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x94}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x94}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x233f,0x38d9,0x6fc1,0xa333,0xaeb,0xce6a,0x2a4c,0xa1c1,0x274c,0xa9fc,0xd4c6,0xb0b3,0x555b,0x7a48,0x411a,0x2bdc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x38d9233f,0xa3336fc1,0xce6a0aeb,0xa1c12a4c,0xa9fc274c,0xb0b3d4c6,0x7a48555b,0x2bdc411a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa3336fc138d9233f,0xa1c12a4cce6a0aeb,0xb0b3d4c6a9fc274c,0x2bdc411a7a48555b}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x169a,0xd34,0xbfd7,0x4089,0x1be8,0xc17d,0xfefb,0x6efd,0x76e0,0x58ea,0xfedb,0xd204,0x1e3,0x3b9a,0x47d6,0xdf28,0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xd34169a,0x4089bfd7,0xc17d1be8,0x6efdfefb,0x58ea76e0,0xd204fedb,0x3b9a01e3,0xdf2847d6,0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x4089bfd70d34169a,0x6efdfefbc17d1be8,0xd204fedb58ea76e0,0xdf2847d63b9a01e3,0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -17, ._mp_d = (mp_limb_t[]) {0x2412,0x6ec4,0x4dda,0x2cde,0x281d,0xaaa7,0x3a33,0xc1d6,0x5c26,0x22e3,0x816d,0x13fb,0xac81,0x58e8,0xd1a7,0xadaa,0xc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0x6ec42412,0x2cde4dda,0xaaa7281d,0xc1d63a33,0x22e35c26,0x13fb816d,0x58e8ac81,0xadaad1a7,0xc}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0x2cde4dda6ec42412,0xc1d63a33aaa7281d,0x13fb816d22e35c26,0xadaad1a758e8ac81,0xc}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x94}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x94}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x94}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 37}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xc31e,0x416e,0xe2a5,0x25c2,0xa926,0x45fa,0x578b,0xf395,0x6ac9,0x7901,0xd14d,0xd089,0x9e5c,0xe062,0xbc4,0x583b,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x416ec31e,0x25c2e2a5,0x45faa926,0xf395578b,0x79016ac9,0xd089d14d,0xe0629e5c,0x583b0bc4,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x25c2e2a5416ec31e,0xf395578b45faa926,0xd089d14d79016ac9,0x583b0bc4e0629e5c,0x3}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xc31e,0x416e,0xe2a5,0x25c2,0xa926,0x45fa,0x578b,0xf395,0x6ac9,0x7901,0xd14d,0xd089,0x9e5c,0xe062,0xbc4,0x583b,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x416ec31e,0x25c2e2a5,0x45faa926,0xf395578b,0x79016ac9,0xd089d14d,0xe0629e5c,0x583b0bc4,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x25c2e2a5416ec31e,0xf395578b45faa926,0xd089d14d79016ac9,0x583b0bc4e0629e5c,0x3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x618f,0xa0b7,0x7152,0x12e1,0x5493,0xa2fd,0xabc5,0xf9ca,0xb564,0xbc80,0xe8a6,0x6844,0x4f2e,0x7031,0x85e2,0xac1d,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xa0b7618f,0x12e17152,0xa2fd5493,0xf9caabc5,0xbc80b564,0x6844e8a6,0x70314f2e,0xac1d85e2,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x12e17152a0b7618f,0xf9caabc5a2fd5493,0x6844e8a6bc80b564,0xac1d85e270314f2e,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x4c2,0x1467,0x5829,0xf8ca,0x2d31,0xb661,0xa4a1,0x434a,0x25cb,0xbffa,0xe232,0x8565,0x2305,0xe42,0x3f64,0x710,0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x146704c2,0xf8ca5829,0xb6612d31,0x434aa4a1,0xbffa25cb,0x8565e232,0xe422305,0x7103f64,0x11}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xf8ca5829146704c2,0x434aa4a1b6612d31,0x8565e232bffa25cb,0x7103f640e422305,0x11}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -32, ._mp_d = (mp_limb_t[]) {0x3b03,0xe541,0x6454,0x6f9,0x3808,0xb93,0x7509,0x2b52,0xed1,0xf4fe,0x8961,0x4869,0x4671,0xdd21,0x4c4c,0x70b0,0xfff9,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x35f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xe5413b03,0x6f96454,0xb933808,0x2b527509,0xf4fe0ed1,0x48698961,0xdd214671,0x70b04c4c,0xfffffff9,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x35fffff}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x6f96454e5413b03,0x2b5275090b933808,0x48698961f4fe0ed1,0x70b04c4cdd214671,0xfffffffffffffff9,0xffffffffffffffff,0xffffffffffffffff,0x35fffffffffffff}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x618f,0xa0b7,0x7152,0x12e1,0x5493,0xa2fd,0xabc5,0xf9ca,0xb564,0xbc80,0xe8a6,0x6844,0x4f2e,0x7031,0x85e2,0xac1d,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xa0b7618f,0x12e17152,0xa2fd5493,0xf9caabc5,0xbc80b564,0x6844e8a6,0x70314f2e,0xac1d85e2,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x12e17152a0b7618f,0xf9caabc5a2fd5493,0x6844e8a6bc80b564,0xac1d85e270314f2e,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xf4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xf4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xf4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xe953,0xf5ac,0x2ee2,0xc962,0x459d,0xd9a0,0xd761,0x7c5a,0x8268,0xcf36,0x9b08,0xb7a6,0xbd23,0x7e04,0xe324,0x23ba}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xf5ace953,0xc9622ee2,0xd9a0459d,0x7c5ad761,0xcf368268,0xb7a69b08,0x7e04bd23,0x23bae324}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xc9622ee2f5ace953,0x7c5ad761d9a0459d,0xb7a69b08cf368268,0x23bae3247e04bd23}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xc31e,0x416e,0xe2a5,0x25c2,0xa926,0x45fa,0x578b,0xf395,0x6ac9,0x7901,0xd14d,0xd089,0x9e5c,0xe062,0xbc4,0x583b,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x416ec31e,0x25c2e2a5,0x45faa926,0xf395578b,0x79016ac9,0xd089d14d,0xe0629e5c,0x583b0bc4,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x25c2e2a5416ec31e,0xf395578b45faa926,0xd089d14d79016ac9,0x583b0bc4e0629e5c,0x3}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x4c2,0x1467,0x5829,0xf8ca,0x2d31,0xb661,0xa4a1,0x434a,0x25cb,0xbffa,0xe232,0x8565,0x2305,0xe42,0x3f64,0x710,0x11}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x146704c2,0xf8ca5829,0xb6612d31,0x434aa4a1,0xbffa25cb,0x8565e232,0xe422305,0x7103f64,0x11}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xf8ca5829146704c2,0x434aa4a1b6612d31,0x8565e232bffa25cb,0x7103f640e422305,0x11}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xf4}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xf4}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0xf4}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 61}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xf94,0x28f0,0x8955,0xb7aa,0x538f,0x65b6,0x5a15,0xd3b4,0x9667,0xcba4,0x3554,0x11f8,0x25a9,0x6265,0x196a,0x83d,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x28f00f94,0xb7aa8955,0x65b6538f,0xd3b45a15,0xcba49667,0x11f83554,0x626525a9,0x83d196a,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xb7aa895528f00f94,0xd3b45a1565b6538f,0x11f83554cba49667,0x83d196a626525a9,0x1}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xf94,0x28f0,0x8955,0xb7aa,0x538f,0x65b6,0x5a15,0xd3b4,0x9667,0xcba4,0x3554,0x11f8,0x25a9,0x6265,0x196a,0x83d,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x28f00f94,0xb7aa8955,0x65b6538f,0xd3b45a15,0xcba49667,0x11f83554,0x626525a9,0x83d196a,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xb7aa895528f00f94,0xd3b45a1565b6538f,0x11f83554cba49667,0x83d196a626525a9,0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7ca,0x9478,0x44aa,0xdbd5,0x29c7,0xb2db,0x2d0a,0xe9da,0x4b33,0x65d2,0x1aaa,0x88fc,0x92d4,0x3132,0x8cb5,0x841e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x947807ca,0xdbd544aa,0xb2db29c7,0xe9da2d0a,0x65d24b33,0x88fc1aaa,0x313292d4,0x841e8cb5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdbd544aa947807ca,0xe9da2d0ab2db29c7,0x88fc1aaa65d24b33,0x841e8cb5313292d4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -17, ._mp_d = (mp_limb_t[]) {0x5409,0xed37,0x7339,0xcbe7,0x95ab,0x2582,0x18fa,0xcc9d,0x13ae,0x2543,0xaefd,0xb168,0xfdbc,0x68b,0xc9af,0x6d9d,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0xed375409,0xcbe77339,0x258295ab,0xcc9d18fa,0x254313ae,0xb168aefd,0x68bfdbc,0x6d9dc9af,0x6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0xcbe77339ed375409,0xcc9d18fa258295ab,0xb168aefd254313ae,0x6d9dc9af068bfdbc,0x6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -32, ._mp_d = (mp_limb_t[]) {0x7013,0x423f,0x42b7,0x3f3d,0x82a,0x9883,0x52bf,0xfede,0x8018,0xa449,0xf571,0xb8a,0x3139,0xbe7,0x439d,0x9e1f,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xd8}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x423f7013,0x3f3d42b7,0x9883082a,0xfede52bf,0xa4498018,0xb8af571,0xbe73139,0x9e1f439d,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0xd80000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x3f3d42b7423f7013,0xfede52bf9883082a,0xb8af571a4498018,0x9e1f439d0be73139,0x2,0x0,0x0,0xd8000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7ca,0x9478,0x44aa,0xdbd5,0x29c7,0xb2db,0x2d0a,0xe9da,0x4b33,0x65d2,0x1aaa,0x88fc,0x92d4,0x3132,0x8cb5,0x841e}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x947807ca,0xdbd544aa,0xb2db29c7,0xe9da2d0a,0x65d24b33,0x88fc1aaa,0x313292d4,0x841e8cb5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdbd544aa947807ca,0xe9da2d0ab2db29c7,0x88fc1aaa65d24b33,0x841e8cb5313292d4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xca2d,0x34af,0xea29,0x177b,0x91ed,0x86ca,0x588a,0xe94d,0x55df,0x4621,0xa1e4,0x67d7,0xb617,0x6a1,0x88f5,0x87b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x34afca2d,0x177bea29,0x86ca91ed,0xe94d588a,0x462155df,0x67d7a1e4,0x6a1b617,0x87b88f5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x177bea2934afca2d,0xe94d588a86ca91ed,0x67d7a1e4462155df,0x87b88f506a1b617}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xf94,0x28f0,0x8955,0xb7aa,0x538f,0x65b6,0x5a15,0xd3b4,0x9667,0xcba4,0x3554,0x11f8,0x25a9,0x6265,0x196a,0x83d,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x28f00f94,0xb7aa8955,0x65b6538f,0xd3b45a15,0xcba49667,0x11f83554,0x626525a9,0x83d196a,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0xb7aa895528f00f94,0xd3b45a1565b6538f,0x11f83554cba49667,0x83d196a626525a9,0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -17, ._mp_d = (mp_limb_t[]) {0x5409,0xed37,0x7339,0xcbe7,0x95ab,0x2582,0x18fa,0xcc9d,0x13ae,0x2543,0xaefd,0xb168,0xfdbc,0x68b,0xc9af,0x6d9d,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0xed375409,0xcbe77339,0x258295ab,0xcc9d18fa,0x254313ae,0xb168aefd,0x68bfdbc,0x6d9dc9af,0x6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0xcbe77339ed375409,0xcc9d18fa258295ab,0xb168aefd254313ae,0x6d9dc9af068bfdbc,0x6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x61}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 97}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1e34,0xdf45,0xcfa6,0xa203,0xe18a,0xd8c5,0x1d42,0x7a30,0x86ce,0x7a12,0xf933,0x741d,0x6b48,0xe48e,0xbf65,0x1854}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdf451e34,0xa203cfa6,0xd8c5e18a,0x7a301d42,0x7a1286ce,0x741df933,0xe48e6b48,0x1854bf65}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa203cfa6df451e34,0x7a301d42d8c5e18a,0x741df9337a1286ce,0x1854bf65e48e6b48}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1e34,0xdf45,0xcfa6,0xa203,0xe18a,0xd8c5,0x1d42,0x7a30,0x86ce,0x7a12,0xf933,0x741d,0x6b48,0xe48e,0xbf65,0x1854}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdf451e34,0xa203cfa6,0xd8c5e18a,0x7a301d42,0x7a1286ce,0x741df933,0xe48e6b48,0x1854bf65}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa203cfa6df451e34,0x7a301d42d8c5e18a,0x741df9337a1286ce,0x1854bf65e48e6b48}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8f1a,0x6fa2,0xe7d3,0x5101,0xf0c5,0x6c62,0xea1,0x3d18,0x4367,0xbd09,0xfc99,0x3a0e,0x35a4,0xf247,0x5fb2,0xc2a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6fa28f1a,0x5101e7d3,0x6c62f0c5,0x3d180ea1,0xbd094367,0x3a0efc99,0xf24735a4,0xc2a5fb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5101e7d36fa28f1a,0x3d180ea16c62f0c5,0x3a0efc99bd094367,0xc2a5fb2f24735a4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcf03,0xa322,0x8523,0x93d,0x3bc,0x4b50,0x33ca,0x56b5,0x863f,0x87c8,0x38bf,0x98c6,0x8ce8,0xfab7,0xfc02,0x78ed}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa322cf03,0x93d8523,0x4b5003bc,0x56b533ca,0x87c8863f,0x98c638bf,0xfab78ce8,0x78edfc02}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x93d8523a322cf03,0x56b533ca4b5003bc,0x98c638bf87c8863f,0x78edfc02fab78ce8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x24ed,0x1400,0x74a1,0x1310,0xce8a,0x1c0d,0x512a,0x3500,0x2451,0x6992,0x892c,0x3cdb,0x45d8,0x520,0x420,0xf11f,0x6cb,0xbe4d,0xd06c,0xcbe4,0x4d06,0x6cbe,0xe4d0,0x6cb,0xbe4d,0xd06c,0xcbe4,0x4d06,0x6cbe,0xe4d0,0x6cb,0x15}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x140024ed,0x131074a1,0x1c0dce8a,0x3500512a,0x69922451,0x3cdb892c,0x52045d8,0xf11f0420,0xbe4d06cb,0xcbe4d06c,0x6cbe4d06,0x6cbe4d0,0xd06cbe4d,0x4d06cbe4,0xe4d06cbe,0x1506cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x131074a1140024ed,0x3500512a1c0dce8a,0x3cdb892c69922451,0xf11f0420052045d8,0xcbe4d06cbe4d06cb,0x6cbe4d06cbe4d06,0x4d06cbe4d06cbe4d,0x1506cbe4d06cbe}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8f1a,0x6fa2,0xe7d3,0x5101,0xf0c5,0x6c62,0xea1,0x3d18,0x4367,0xbd09,0xfc99,0x3a0e,0x35a4,0xf247,0x5fb2,0xc2a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x6fa28f1a,0x5101e7d3,0x6c62f0c5,0x3d180ea1,0xbd094367,0x3a0efc99,0xf24735a4,0xc2a5fb2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5101e7d36fa28f1a,0x3d180ea16c62f0c5,0x3a0efc99bd094367,0xc2a5fb2f24735a4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x98b3,0xd2e,0x314c,0x5199,0x7a5a,0xb592,0xbd65,0x1ef7,0x7d32,0x94fd,0x6cfe,0x68e3,0xcda6,0x8d91,0xfb73,0x88}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xd2e98b3,0x5199314c,0xb5927a5a,0x1ef7bd65,0x94fd7d32,0x68e36cfe,0x8d91cda6,0x88fb73}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x5199314c0d2e98b3,0x1ef7bd65b5927a5a,0x68e36cfe94fd7d32,0x88fb738d91cda6}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1e34,0xdf45,0xcfa6,0xa203,0xe18a,0xd8c5,0x1d42,0x7a30,0x86ce,0x7a12,0xf933,0x741d,0x6b48,0xe48e,0xbf65,0x1854}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdf451e34,0xa203cfa6,0xd8c5e18a,0x7a301d42,0x7a1286ce,0x741df933,0xe48e6b48,0x1854bf65}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa203cfa6df451e34,0x7a301d42d8c5e18a,0x741df9337a1286ce,0x1854bf65e48e6b48}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xcf03,0xa322,0x8523,0x93d,0x3bc,0x4b50,0x33ca,0x56b5,0x863f,0x87c8,0x38bf,0x98c6,0x8ce8,0xfab7,0xfc02,0x78ed}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa322cf03,0x93d8523,0x4b5003bc,0x56b533ca,0x87c8863f,0x98c638bf,0xfab78ce8,0x78edfc02}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x93d8523a322cf03,0x56b533ca4b5003bc,0x98c638bf87c8863f,0x78edfc02fab78ce8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xb}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 113}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x779c,0xdc0d,0x3c7f,0x2e51,0x85b9,0xfb7d,0xb29e,0xd38c,0x64bb,0x9ea5,0xa4fa,0x79a3,0xdf70,0xf359,0xca21,0xa977,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xdc0d779c,0x2e513c7f,0xfb7d85b9,0xd38cb29e,0x9ea564bb,0x79a3a4fa,0xf359df70,0xa977ca21,0x6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2e513c7fdc0d779c,0xd38cb29efb7d85b9,0x79a3a4fa9ea564bb,0xa977ca21f359df70,0x6}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x779c,0xdc0d,0x3c7f,0x2e51,0x85b9,0xfb7d,0xb29e,0xd38c,0x64bb,0x9ea5,0xa4fa,0x79a3,0xdf70,0xf359,0xca21,0xa977,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xdc0d779c,0x2e513c7f,0xfb7d85b9,0xd38cb29e,0x9ea564bb,0x79a3a4fa,0xf359df70,0xa977ca21,0x6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2e513c7fdc0d779c,0xd38cb29efb7d85b9,0x79a3a4fa9ea564bb,0xa977ca21f359df70,0x6}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xbbce,0xee06,0x9e3f,0x9728,0xc2dc,0x7dbe,0x594f,0xe9c6,0xb25d,0x4f52,0xd27d,0x3cd1,0xefb8,0xf9ac,0xe510,0x54bb,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xee06bbce,0x97289e3f,0x7dbec2dc,0xe9c6594f,0x4f52b25d,0x3cd1d27d,0xf9acefb8,0x54bbe510,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x97289e3fee06bbce,0xe9c6594f7dbec2dc,0x3cd1d27d4f52b25d,0x54bbe510f9acefb8,0x3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -17, ._mp_d = (mp_limb_t[]) {0x8db1,0xaa9d,0x1944,0x727a,0xc6c3,0xffc0,0x39b4,0x5643,0x2de0,0xb534,0xc0a9,0x5371,0x8e58,0x80df,0xa6c4,0x5a83,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0xaa9d8db1,0x727a1944,0xffc0c6c3,0x564339b4,0xb5342de0,0x5371c0a9,0x80df8e58,0x5a83a6c4,0x36}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0x727a1944aa9d8db1,0x564339b4ffc0c6c3,0x5371c0a9b5342de0,0x5a83a6c480df8e58,0x36}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -32, ._mp_d = (mp_limb_t[]) {0x9c90,0x5de8,0xf815,0x67c5,0x989,0xc9,0x7c9e,0x180b,0x526d,0xdf5a,0x3386,0xea88,0x580a,0x24c5,0x5507,0x3bad,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x438}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x5de89c90,0x67c5f815,0xc90989,0x180b7c9e,0xdf5a526d,0xea883386,0x24c5580a,0x3bad5507,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x4380000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x67c5f8155de89c90,0x180b7c9e00c90989,0xea883386df5a526d,0x3bad550724c5580a,0x10,0x0,0x0,0x438000000000000}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0xbbce,0xee06,0x9e3f,0x9728,0xc2dc,0x7dbe,0x594f,0xe9c6,0xb25d,0x4f52,0xd27d,0x3cd1,0xefb8,0xf9ac,0xe510,0x54bb,0x3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xee06bbce,0x97289e3f,0x7dbec2dc,0xe9c6594f,0x4f52b25d,0x3cd1d27d,0xf9acefb8,0x54bbe510,0x3}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x97289e3fee06bbce,0xe9c6594f7dbec2dc,0x3cd1d27d4f52b25d,0x54bbe510f9acefb8,0x3}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2e9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2e9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2e9}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa1f8,0x1530,0xa6be,0x126c,0xfd3b,0xbdd9,0xb3bc,0x8495,0x5457,0x1985,0xcfae,0xf440,0x4ea6,0x84ba,0x6881,0x2eb1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1530a1f8,0x126ca6be,0xbdd9fd3b,0x8495b3bc,0x19855457,0xf440cfae,0x84ba4ea6,0x2eb16881}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x126ca6be1530a1f8,0x8495b3bcbdd9fd3b,0xf440cfae19855457,0x2eb1688184ba4ea6}}} +#endif +}}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x779c,0xdc0d,0x3c7f,0x2e51,0x85b9,0xfb7d,0xb29e,0xd38c,0x64bb,0x9ea5,0xa4fa,0x79a3,0xdf70,0xf359,0xca21,0xa977,0x6}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xdc0d779c,0x2e513c7f,0xfb7d85b9,0xd38cb29e,0x9ea564bb,0x79a3a4fa,0xf359df70,0xa977ca21,0x6}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x2e513c7fdc0d779c,0xd38cb29efb7d85b9,0x79a3a4fa9ea564bb,0xa977ca21f359df70,0x6}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -17, ._mp_d = (mp_limb_t[]) {0x8db1,0xaa9d,0x1944,0x727a,0xc6c3,0xffc0,0x39b4,0x5643,0x2de0,0xb534,0xc0a9,0x5371,0x8e58,0x80df,0xa6c4,0x5a83,0x36}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -9, ._mp_d = (mp_limb_t[]) {0xaa9d8db1,0x727a1944,0xffc0c6c3,0x564339b4,0xb5342de0,0x5371c0a9,0x80df8e58,0x5a83a6c4,0x36}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -5, ._mp_d = (mp_limb_t[]) {0x727a1944aa9d8db1,0x564339b4ffc0c6c3,0x5371c0a9b5342de0,0x5a83a6c480df8e58,0x36}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2e9}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2e9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2e9}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, 149}}; +const quat_left_ideal_t CONNECTING_IDEALS[7] = {{{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb4ca,0xbe8d,0xcee3,0x9669,0x9cb,0x86eb,0xf6f9,0x374b,0x2e68,0xd1f2,0x3315,0xab5f,0x2208,0xa9c9,0x686e,0x2541}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbe8db4ca,0x9669cee3,0x86eb09cb,0x374bf6f9,0xd1f22e68,0xab5f3315,0xa9c92208,0x2541686e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9669cee3be8db4ca,0x374bf6f986eb09cb,0xab5f3315d1f22e68,0x2541686ea9c92208}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xdb03,0x2777,0xbc36,0x4be5,0x38dd,0xd474,0x83b4,0x41a7,0x5426,0xa361,0x1f00,0xc617,0xe350,0x8cb4,0x2b1c,0xaa2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2777db03,0x4be5bc36,0xd47438dd,0x41a783b4,0xa3615426,0xc6171f00,0x8cb4e350,0xaa22b1c}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4be5bc362777db03,0x41a783b4d47438dd,0xc6171f00a3615426,0xaa22b1c8cb4e350}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb4ca,0xbe8d,0xcee3,0x9669,0x9cb,0x86eb,0xf6f9,0x374b,0x2e68,0xd1f2,0x3315,0xab5f,0x2208,0xa9c9,0x686e,0x2541}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbe8db4ca,0x9669cee3,0x86eb09cb,0x374bf6f9,0xd1f22e68,0xab5f3315,0xa9c92208,0x2541686e}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x9669cee3be8db4ca,0x374bf6f986eb09cb,0xab5f3315d1f22e68,0x2541686ea9c92208}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd9c7,0x9715,0x12ad,0x4a84,0xd0ee,0xb276,0x7344,0xf5a4,0xda41,0x2e90,0x1415,0xe548,0x3eb7,0x1d14,0x3d52,0x1a9f}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x9715d9c7,0x4a8412ad,0xb276d0ee,0xf5a47344,0x2e90da41,0xe5481415,0x1d143eb7,0x1a9f3d52}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x4a8412ad9715d9c7,0xf5a47344b276d0ee,0xe54814152e90da41,0x1a9f3d521d143eb7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xda65,0xdf46,0xe771,0xcb34,0x84e5,0xc375,0xfb7c,0x1ba5,0x1734,0xe8f9,0x998a,0x55af,0x9104,0x54e4,0xb437,0x12a0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xdf46da65,0xcb34e771,0xc37584e5,0x1ba5fb7c,0xe8f91734,0x55af998a,0x54e49104,0x12a0b437}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xcb34e771df46da65,0x1ba5fb7cc37584e5,0x55af998ae8f91734,0x12a0b43754e49104}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8412,0x5a4d,0xe982,0x7e48,0x619e,0x6d03,0x297c,0x2598,0x6aff,0x24ff,0xc89e,0x51c8,0x6f8,0x6965,0x7e7b,0x13de}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5a4d8412,0x7e48e982,0x6d03619e,0x2598297c,0x24ff6aff,0x51c8c89e,0x696506f8,0x13de7e7b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7e48e9825a4d8412,0x2598297c6d03619e,0x51c8c89e24ff6aff,0x13de7e7b696506f8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x6e7d,0xd8b2,0x8be,0xf2e3,0x7c3e,0x1572,0x7609,0xf4ae,0x8366,0xb93e,0x53ec,0x9b03,0x6573,0xae18,0x41b0,0x707}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xd8b26e7d,0xf2e308be,0x15727c3e,0xf4ae7609,0xb93e8366,0x9b0353ec,0xae186573,0x70741b0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf2e308bed8b26e7d,0xf4ae760915727c3e,0x9b0353ecb93e8366,0x70741b0ae186573}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8412,0x5a4d,0xe982,0x7e48,0x619e,0x6d03,0x297c,0x2598,0x6aff,0x24ff,0xc89e,0x51c8,0x6f8,0x6965,0x7e7b,0x13de}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x5a4d8412,0x7e48e982,0x6d03619e,0x2598297c,0x24ff6aff,0x51c8c89e,0x696506f8,0x13de7e7b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7e48e9825a4d8412,0x2598297c6d03619e,0x51c8c89e24ff6aff,0x13de7e7b696506f8}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1595,0x819b,0xe0c3,0x8b65,0xe55f,0x5790,0xb373,0x30e9,0xe798,0x6bc0,0x74b1,0xb6c5,0xa184,0xbb4c,0x3cca,0xcd7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x819b1595,0x8b65e0c3,0x5790e55f,0x30e9b373,0x6bc0e798,0xb6c574b1,0xbb4ca184,0xcd73cca}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x8b65e0c3819b1595,0x30e9b3735790e55f,0xb6c574b16bc0e798,0xcd73ccabb4ca184}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc209,0x2d26,0x74c1,0x3f24,0xb0cf,0x3681,0x14be,0x92cc,0xb57f,0x127f,0x644f,0x28e4,0x837c,0xb4b2,0x3f3d,0x9ef}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x2d26c209,0x3f2474c1,0x3681b0cf,0x92cc14be,0x127fb57f,0x28e4644f,0xb4b2837c,0x9ef3f3d}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x3f2474c12d26c209,0x92cc14be3681b0cf,0x28e4644f127fb57f,0x9ef3f3db4b2837c}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb376,0x7694,0x643d,0xf407,0xf5c,0x6e43,0xd345,0x5c1f,0xecc4,0x777d,0x1005,0x24fe,0x88e4,0x536a,0x5c85,0xe09}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7694b376,0xf407643d,0x6e430f5c,0x5c1fd345,0x777decc4,0x24fe1005,0x536a88e4,0xe095c85}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf407643d7694b376,0x5c1fd3456e430f5c,0x24fe1005777decc4,0xe095c85536a88e4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9427,0xa69c,0xda24,0xb3a7,0x4f9a,0x22fc,0xa39a,0xcb05,0xd93e,0x923d,0xb97d,0xad95,0x3374,0x96bd,0xbdeb,0x51}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa69c9427,0xb3a7da24,0x22fc4f9a,0xcb05a39a,0x923dd93e,0xad95b97d,0x96bd3374,0x51bdeb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb3a7da24a69c9427,0xcb05a39a22fc4f9a,0xad95b97d923dd93e,0x51bdeb96bd3374}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xb376,0x7694,0x643d,0xf407,0xf5c,0x6e43,0xd345,0x5c1f,0xecc4,0x777d,0x1005,0x24fe,0x88e4,0x536a,0x5c85,0xe09}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7694b376,0xf407643d,0x6e430f5c,0x5c1fd345,0x777decc4,0x24fe1005,0x536a88e4,0xe095c85}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xf407643d7694b376,0x5c1fd3456e430f5c,0x24fe1005777decc4,0xe095c85536a88e4}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x1f4f,0xcff8,0x8a18,0x405f,0xbfc2,0x4b46,0x2fab,0x911a,0x1385,0xe540,0x5687,0x7768,0x556f,0xbcad,0x9e99,0xdb7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcff81f4f,0x405f8a18,0x4b46bfc2,0x911a2fab,0xe5401385,0x77685687,0xbcad556f,0xdb79e99}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x405f8a18cff81f4f,0x911a2fab4b46bfc2,0x77685687e5401385,0xdb79e99bcad556f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x59bb,0xbb4a,0xb21e,0x7a03,0x87ae,0xb721,0xe9a2,0x2e0f,0xf662,0xbbbe,0x802,0x127f,0x4472,0xa9b5,0xae42,0x704}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbb4a59bb,0x7a03b21e,0xb72187ae,0x2e0fe9a2,0xbbbef662,0x127f0802,0xa9b54472,0x704ae42}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x7a03b21ebb4a59bb,0x2e0fe9a2b72187ae,0x127f0802bbbef662,0x704ae42a9b54472}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7a2a,0xcc34,0x1fb9,0x5b4e,0x6acf,0x4f0f,0xbb68,0x211d,0xa57b,0xae74,0x782,0xa512,0xd75c,0xb576,0x5af5,0xa035}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcc347a2a,0x5b4e1fb9,0x4f0f6acf,0x211dbb68,0xae74a57b,0xa5120782,0xb576d75c,0xa0355af5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5b4e1fb9cc347a2a,0x211dbb684f0f6acf,0xa5120782ae74a57b,0xa0355af5b576d75c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xa3e3,0x12fb,0x32f3,0xb40f,0x4bbe,0x537d,0xbefc,0xdda9,0x8954,0xaca9,0xaaf3,0xc020,0x17da,0xf48f,0x88fd,0x21a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x12fba3e3,0xb40f32f3,0x537d4bbe,0xdda9befc,0xaca98954,0xc020aaf3,0xf48f17da,0x21a88fd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xb40f32f312fba3e3,0xdda9befc537d4bbe,0xc020aaf3aca98954,0x21a88fdf48f17da}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x7a2a,0xcc34,0x1fb9,0x5b4e,0x6acf,0x4f0f,0xbb68,0x211d,0xa57b,0xae74,0x782,0xa512,0xd75c,0xb576,0x5af5,0xa035}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xcc347a2a,0x5b4e1fb9,0x4f0f6acf,0x211dbb68,0xae74a57b,0xa5120782,0xb576d75c,0xa0355af5}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x5b4e1fb9cc347a2a,0x211dbb684f0f6acf,0xa5120782ae74a57b,0xa0355af5b576d75c}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xd647,0xb938,0xecc6,0xa73e,0x1f10,0xfb92,0xfc6b,0x4373,0x1c26,0x1cb,0x5c8f,0xe4f1,0xbf81,0xc0e7,0xd1f7,0x9e1a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xb938d647,0xa73eecc6,0xfb921f10,0x4373fc6b,0x1cb1c26,0xe4f15c8f,0xc0e7bf81,0x9e1ad1f7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa73eecc6b938d647,0x4373fc6bfb921f10,0xe4f15c8f01cb1c26,0x9e1ad1f7c0e7bf81}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3d15,0xe61a,0xfdc,0xada7,0xb567,0x2787,0xddb4,0x908e,0x52bd,0x573a,0x3c1,0x5289,0x6bae,0xdabb,0xad7a,0x501a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe61a3d15,0xada70fdc,0x2787b567,0x908eddb4,0x573a52bd,0x528903c1,0xdabb6bae,0x501aad7a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xada70fdce61a3d15,0x908eddb42787b567,0x528903c1573a52bd,0x501aad7adabb6bae}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x81d6,0x1f29,0xf1a,0x365e,0x8f4a,0x95c8,0x38b1,0x87f1,0xb9ff,0x9cca,0x8239,0x1cb1,0x70f,0x8fde,0x5f3f,0x25be}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1f2981d6,0x365e0f1a,0x95c88f4a,0x87f138b1,0x9ccab9ff,0x1cb18239,0x8fde070f,0x25be5f3f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x365e0f1a1f2981d6,0x87f138b195c88f4a,0x1cb182399ccab9ff,0x25be5f3f8fde070f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xbe61,0x7c4c,0xa49c,0x48f9,0x3fb4,0xb80a,0xf823,0xd427,0x593e,0x9ec7,0x3a56,0xda06,0x551e,0x2875,0xc2cb,0xfb0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x7c4cbe61,0x48f9a49c,0xb80a3fb4,0xd427f823,0x9ec7593e,0xda063a56,0x2875551e,0xfb0c2cb}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x48f9a49c7c4cbe61,0xd427f823b80a3fb4,0xda063a569ec7593e,0xfb0c2cb2875551e}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x81d6,0x1f29,0xf1a,0x365e,0x8f4a,0x95c8,0x38b1,0x87f1,0xb9ff,0x9cca,0x8239,0x1cb1,0x70f,0x8fde,0x5f3f,0x25be}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x1f2981d6,0x365e0f1a,0x95c88f4a,0x87f138b1,0x9ccab9ff,0x1cb18239,0x8fde070f,0x25be5f3f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x365e0f1a1f2981d6,0x87f138b195c88f4a,0x1cb182399ccab9ff,0x25be5f3f8fde070f}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc375,0xa2dc,0x6a7d,0xed64,0x4f95,0xddbe,0x408d,0xb3c9,0x60c0,0xfe03,0x47e2,0x42ab,0xb1f0,0x6768,0x9c74,0x160d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xa2dcc375,0xed646a7d,0xddbe4f95,0xb3c9408d,0xfe0360c0,0x42ab47e2,0x6768b1f0,0x160d9c74}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xed646a7da2dcc375,0xb3c9408dddbe4f95,0x42ab47e2fe0360c0,0x160d9c746768b1f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc0eb,0xf94,0x78d,0x1b2f,0x47a5,0xcae4,0x9c58,0xc3f8,0x5cff,0xce65,0xc11c,0x8e58,0x387,0xc7ef,0x2f9f,0x12df}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf94c0eb,0x1b2f078d,0xcae447a5,0xc3f89c58,0xce655cff,0x8e58c11c,0xc7ef0387,0x12df2f9f}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1b2f078d0f94c0eb,0xc3f89c58cae447a5,0x8e58c11cce655cff,0x12df2f9fc7ef0387}}} +#endif +, &MAXORD_O0}, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5a86,0x1729,0x8ced,0x8280,0xd48f,0x1e0f,0x5e39,0x24b3,0x74ba,0xa294,0xd9f3,0x4e2e,0x8cc1,0xee6b,0xdd2,0x3079}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x17295a86,0x82808ced,0x1e0fd48f,0x24b35e39,0xa29474ba,0x4e2ed9f3,0xee6b8cc1,0x30790dd2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x82808ced17295a86,0x24b35e391e0fd48f,0x4e2ed9f3a29474ba,0x30790dd2ee6b8cc1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x9203,0x57ee,0x3867,0xdf50,0xd8ad,0xbe9c,0x9e30,0x7a77,0xcd0f,0x77d9,0xbb7f,0x65f1,0x1b16,0xbbf5,0xe5c0,0x2563}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x57ee9203,0xdf503867,0xbe9cd8ad,0x7a779e30,0x77d9cd0f,0x65f1bb7f,0xbbf51b16,0x2563e5c0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xdf50386757ee9203,0x7a779e30be9cd8ad,0x65f1bb7f77d9cd0f,0x2563e5c0bbf51b16}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x5a86,0x1729,0x8ced,0x8280,0xd48f,0x1e0f,0x5e39,0x24b3,0x74ba,0xa294,0xd9f3,0x4e2e,0x8cc1,0xee6b,0xdd2,0x3079}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x17295a86,0x82808ced,0x1e0fd48f,0x24b35e39,0xa29474ba,0x4e2ed9f3,0xee6b8cc1,0x30790dd2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x82808ced17295a86,0x24b35e391e0fd48f,0x4e2ed9f3a29474ba,0x30790dd2ee6b8cc1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xc883,0xbf3a,0x5485,0xa330,0xfbe1,0x5f72,0xc008,0xaa3b,0xa7aa,0x2aba,0x1e74,0xe83d,0x71aa,0x3276,0x2812,0xb15}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xbf3ac883,0xa3305485,0x5f72fbe1,0xaa3bc008,0x2abaa7aa,0xe83d1e74,0x327671aa,0xb152812}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa3305485bf3ac883,0xaa3bc0085f72fbe1,0xe83d1e742abaa7aa,0xb152812327671aa}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}}, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xad43,0x8b94,0x4676,0xc140,0xea47,0x8f07,0xaf1c,0x1259,0x3a5d,0xd14a,0x6cf9,0xa717,0xc660,0x7735,0x86e9,0x183c}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x8b94ad43,0xc1404676,0x8f07ea47,0x1259af1c,0xd14a3a5d,0xa7176cf9,0x7735c660,0x183c86e9}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc14046768b94ad43,0x1259af1c8f07ea47,0xa7176cf9d14a3a5d,0x183c86e97735c660}}} +#endif +, &MAXORD_O0}}; +const quat_alg_elem_t CONJUGATING_ELEMENTS[7] = {{ +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 0, ._mp_d = (mp_limb_t[]) {0x0}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x8fcd,0xe605,0x8b19,0xe24f,0x42a8,0x5b5f,0x7aae,0x78f3,0x828e,0x7553,0x5216,0x7176,0x559,0x367e,0x938b,0x2fe3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xe6058fcd,0xe24f8b19,0x5b5f42a8,0x78f37aae,0x7553828e,0x71765216,0x367e0559,0x2fe3938b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xe24f8b19e6058fcd,0x78f37aae5b5f42a8,0x717652167553828e,0x2fe3938b367e0559}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x8fcd,0xe605,0x8b19,0xe24f,0x42a8,0x5b5f,0x7aae,0x78f3,0x828e,0x7553,0x5216,0x7176,0x559,0x367e,0x938b,0x2fe3}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xe6058fcd,0xe24f8b19,0x5b5f42a8,0x78f37aae,0x7553828e,0x71765216,0x367e0559,0x2fe3938b}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xe24f8b19e6058fcd,0x78f37aae5b5f42a8,0x717652167553828e,0x2fe3938b367e0559}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x2315,0x38d9,0x6fc1,0xa333,0xaeb,0xce6a,0x2a4c,0xa1c1,0x274c,0xa9fc,0xd4c6,0xb0b3,0x555b,0x7a48,0x411a,0x2bdc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x38d92315,0xa3336fc1,0xce6a0aeb,0xa1c12a4c,0xa9fc274c,0xb0b3d4c6,0x7a48555b,0x2bdc411a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xa3336fc138d92315,0xa1c12a4cce6a0aeb,0xb0b3d4c6a9fc274c,0x2bdc411a7a48555b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x2315,0x38d9,0x6fc1,0xa333,0xaeb,0xce6a,0x2a4c,0xa1c1,0x274c,0xa9fc,0xd4c6,0xb0b3,0x555b,0x7a48,0x411a,0x2bdc}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x38d92315,0xa3336fc1,0xce6a0aeb,0xa1c12a4c,0xa9fc274c,0xb0b3d4c6,0x7a48555b,0x2bdc411a}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xa3336fc138d92315,0xa1c12a4cce6a0aeb,0xb0b3d4c6a9fc274c,0x2bdc411a7a48555b}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe8f5,0xf5ac,0x2ee2,0xc962,0x459d,0xd9a0,0xd761,0x7c5a,0x8268,0xcf36,0x9b08,0xb7a6,0xbd23,0x7e04,0xe324,0x23ba}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf5ace8f5,0xc9622ee2,0xd9a0459d,0x7c5ad761,0xcf368268,0xb7a69b08,0x7e04bd23,0x23bae324}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc9622ee2f5ace8f5,0x7c5ad761d9a0459d,0xb7a69b08cf368268,0x23bae3247e04bd23}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xe8f5,0xf5ac,0x2ee2,0xc962,0x459d,0xd9a0,0xd761,0x7c5a,0x8268,0xcf36,0x9b08,0xb7a6,0xbd23,0x7e04,0xe324,0x23ba}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf5ace8f5,0xc9622ee2,0xd9a0459d,0x7c5ad761,0xcf368268,0xb7a69b08,0x7e04bd23,0x23bae324}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc9622ee2f5ace8f5,0x7c5ad761d9a0459d,0xb7a69b08cf368268,0x23bae3247e04bd23}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xfef5,0x4752,0xbb14,0x6ee3,0x5898,0x6a2,0x8282,0x1179,0xe429,0xf5d1,0x5ad8,0x642d,0x3061,0x58d,0x9c04,0x917b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4752fef5,0x6ee3bb14,0x6a25898,0x11798282,0xf5d1e429,0x642d5ad8,0x58d3061,0x917b9c04}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6ee3bb144752fef5,0x1179828206a25898,0x642d5ad8f5d1e429,0x917b9c04058d3061}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xfef5,0x4752,0xbb14,0x6ee3,0x5898,0x6a2,0x8282,0x1179,0xe429,0xf5d1,0x5ad8,0x642d,0x3061,0x58d,0x9c04,0x917b}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0x4752fef5,0x6ee3bb14,0x6a25898,0x11798282,0xf5d1e429,0x642d5ad8,0x58d3061,0x917b9c04}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x6ee3bb144752fef5,0x1179828206a25898,0x642d5ad8f5d1e429,0x917b9c04058d3061}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x7}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xc375,0xa2dc,0x6a7d,0xed64,0x4f95,0xddbe,0x408d,0xb3c9,0x60c0,0xfe03,0x47e2,0x42ab,0xb1f0,0x6768,0x9c74,0x160d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xa2dcc375,0xed646a7d,0xddbe4f95,0xb3c9408d,0xfe0360c0,0x42ab47e2,0x6768b1f0,0x160d9c74}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xed646a7da2dcc375,0xb3c9408dddbe4f95,0x42ab47e2fe0360c0,0x160d9c746768b1f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0xc375,0xa2dc,0x6a7d,0xed64,0x4f95,0xddbe,0x408d,0xb3c9,0x60c0,0xfe03,0x47e2,0x42ab,0xb1f0,0x6768,0x9c74,0x160d}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xa2dcc375,0xed646a7d,0xddbe4f95,0xb3c9408d,0xfe0360c0,0x42ab47e2,0x6768b1f0,0x160d9c74}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0xed646a7da2dcc375,0xb3c9408dddbe4f95,0x42ab47e2fe0360c0,0x160d9c746768b1f0}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -1, ._mp_d = (mp_limb_t[]) {0x1}}} +#endif +}}, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2}}} +#endif +, { +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x95f7,0xbdd2,0x75d6,0x430e,0x5c58,0xbd78,0x16b0,0x1278,0xc3f8,0x16b,0xb5dc,0xbbcf,0xfa18,0x1815,0x3c32,0x624a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xbdd295f7,0x430e75d6,0xbd785c58,0x127816b0,0x16bc3f8,0xbbcfb5dc,0x1815fa18,0x624a3c32}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x430e75d6bdd295f7,0x127816b0bd785c58,0xbbcfb5dc016bc3f8,0x624a3c321815fa18}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = -16, ._mp_d = (mp_limb_t[]) {0x95f7,0xbdd2,0x75d6,0x430e,0x5c58,0xbd78,0x16b0,0x1278,0xc3f8,0x16b,0xb5dc,0xbbcf,0xfa18,0x1815,0x3c32,0x624a}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = -8, ._mp_d = (mp_limb_t[]) {0xbdd295f7,0x430e75d6,0xbd785c58,0x127816b0,0x16bc3f8,0xbbcfb5dc,0x1815fa18,0x624a3c32}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = -4, ._mp_d = (mp_limb_t[]) {0x430e75d6bdd295f7,0x127816b0bd785c58,0xbbcfb5dc016bc3f8,0x624a3c321815fa18}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}} +#endif +, +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xd}}} +#endif +}}}; diff --git a/src/precomp/ref/lvl5/sqisign_parameters.txt b/src/precomp/ref/lvl5/sqisign_parameters.txt index 5ae4c99..947af4b 100644 --- a/src/precomp/ref/lvl5/sqisign_parameters.txt +++ b/src/precomp/ref/lvl5/sqisign_parameters.txt @@ -1,3 +1,3 @@ lvl = 5 -p = 0x255946a8869bc68c15b0036936e79202bdbe6326507d01fe3ac5904a0dea65faf0a29a781974ce994c68ada6e1ffffffffffffffffffffffffffffffffffff -B = 320000 +p = 0x1afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +num_orders = 7 diff --git a/src/precomp/ref/lvl5/torsion_constants.c b/src/precomp/ref/lvl5/torsion_constants.c index 6b536af..6fb2f97 100644 --- a/src/precomp/ref/lvl5/torsion_constants.c +++ b/src/precomp/ref/lvl5/torsion_constants.c @@ -1,68 +1,43 @@ #include #include #include +const ibz_t TWO_TO_SECURITY_BITS = #if 0 -#elif 8*DIGIT_LEN == 16 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x91; -const uint64_t TORSION_ODD_PRIMES[34] = {0x3, 0xd, 0x29, 0x43, 0x67, 0x1cd, 0x33b, 0x5, 0x7, 0x11, 0x25, 0x35, 0x49, 0x7f, 0x97, 0x283, 0x2dd, 0x2e3, 0x3f1, 0x9eb, 0x1039, 0x13c3, 0x1bd7, 0x2965, 0x3517, 0x3a4b, 0x3cb5, 0x3e77, 0x4897, 0x5abb, 0xbc3b, 0xf70f, 0xfff1, 0x4db19}; -const uint64_t TORSION_ODD_POWERS[34] = {0x48, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[7] = {0x3, 0xd, 0x29, 0x43, 0x67, 0x1cd, 0x33b}; -const size_t TORSION_PLUS_ODD_POWERS[7] = {0x48, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6}; -const uint64_t TORSION_MINUS_ODD_PRIMES[27] = {0x5, 0x7, 0x11, 0x25, 0x35, 0x49, 0x7f, 0x97, 0x283, 0x2dd, 0x2e3, 0x3f1, 0x9eb, 0x1039, 0x13c3, 0x1bd7, 0x2965, 0x3517, 0x3a4b, 0x3cb5, 0x3e77, 0x4897, 0x5abb, 0xbc3b, 0xf70f, 0xfff1, 0x4db19}; -const size_t TORSION_MINUS_ODD_POWERS[27] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[34] = {0x0, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xa6e1,0x68ad,0x994c,0x74ce,0x7819,0xa29a,0xfaf0,0xea65,0x4a0d,0xc590,0xfe3a,0x7d01,0x2650,0xbe63,0x2bd,0xe792,0x6936,0xb003,0x8c15,0x9bc6,0xa886,0x5946,0x25}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 41, ._mp_d = (mp_limb_t[]) {0x6443,0x4509,0x1585,0x113b,0x6c1d,0xac5,0x133e,0xbacd,0xbe1d,0xc40e,0x6dbd,0x1dab,0x7f88,0x84f7,0x9a8a,0xa77f,0xc9a3,0x9952,0x1850,0xa5c9,0x61d3,0xead,0x4f3e,0x684b,0x56d7,0x8f3d,0x6e0b,0x5c5b,0xed75,0x2a69,0xb601,0x6fb3,0x773f,0x44fa,0xc95c,0x5720,0x1ac,0x6b82,0xf6d9,0xf93,0x78}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[34] = {{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf6a1,0xc929,0x9735,0x1e67,0x6c11,0x60e7,0x56bc,0x4}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xa6b9,0x49}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0xd6b1,0x1b20,0x1}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x5f59,0xfbd,0x15}}}, {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x1f51,0x310,0x116}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x6739,0x2acb,0x19d4,0x22}}}, {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xa389,0x2c91,0x8ff6,0x470}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x49}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x97}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x283}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2dd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3f1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9eb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1039}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x13c3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1bd7}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2965}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3517}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3a4b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3cb5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3e77}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4897}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5abb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xbc3b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xf70f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xfff1}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xdb19,0x4}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 23, ._mp_d = (mp_limb_t[]) {0xd371,0x3456,0x4ca6,0xba67,0x3c0c,0x514d,0xfd78,0xf532,0x2506,0x62c8,0xff1d,0x3e80,0x9328,0xdf31,0x15e,0x73c9,0xb49b,0xd801,0x460a,0x4de3,0x5443,0xaca3,0x12}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xb0f3,0xa6d1,0x9048,0x1def,0x2075,0x4e99,0xa926,0xc786,0x4dda,0xdcb1,0xa4b,0x6123,0xe306,0x599e,0xfd2a,0x844f,0xae9c,0x6dde,0x6}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xf6a1,0xc929,0x9735,0x1e67,0x6c11,0x60e7,0x56bc,0x4}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xed42,0x9253,0x2e6b,0x3ccf,0xd822,0xc1ce,0xad78,0x8}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 34, ._mp_d = (mp_limb_t[]) {0x8463,0x2824,0xc02f,0xad88,0x1daa,0x1fe6,0x44e3,0x41c4,0xd324,0x8315,0xd382,0x1f79,0xf852,0x980a,0x9bf7,0x3bf8,0xe38f,0x4576,0xb36,0x7082,0x9fe4,0x3c,0x63db,0x611f,0x3261,0x345,0x3575,0xfefa,0xf00e,0x8537,0x712c,0x9f1c,0xabde,0x1b}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x3ad1,0x4eb4,0x7a3,0x1f00,0x1d6a,0x7d31,0x865,0xc7bc,0x9962,0xf08a,0x13f9,0xe003,0x6d0e,0xc440,0x4dd4,0x4}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 19, ._mp_d = (mp_limb_t[]) {0xb0f3,0xa6d1,0x9048,0x1def,0x2075,0x4e99,0xa926,0xc786,0x4dda,0xdcb1,0xa4b,0x6123,0xe306,0x599e,0xfd2a,0x844f,0xae9c,0x6dde,0x6}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xed42,0x9253,0x2e6b,0x3ccf,0xd822,0xc1ce,0xad78,0x8}}}; -#elif 8*DIGIT_LEN == 32 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x91; -const uint64_t TORSION_ODD_PRIMES[34] = {0x3, 0xd, 0x29, 0x43, 0x67, 0x1cd, 0x33b, 0x5, 0x7, 0x11, 0x25, 0x35, 0x49, 0x7f, 0x97, 0x283, 0x2dd, 0x2e3, 0x3f1, 0x9eb, 0x1039, 0x13c3, 0x1bd7, 0x2965, 0x3517, 0x3a4b, 0x3cb5, 0x3e77, 0x4897, 0x5abb, 0xbc3b, 0xf70f, 0xfff1, 0x4db19}; -const uint64_t TORSION_ODD_POWERS[34] = {0x48, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[7] = {0x3, 0xd, 0x29, 0x43, 0x67, 0x1cd, 0x33b}; -const size_t TORSION_PLUS_ODD_POWERS[7] = {0x48, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6}; -const uint64_t TORSION_MINUS_ODD_PRIMES[27] = {0x5, 0x7, 0x11, 0x25, 0x35, 0x49, 0x7f, 0x97, 0x283, 0x2dd, 0x2e3, 0x3f1, 0x9eb, 0x1039, 0x13c3, 0x1bd7, 0x2965, 0x3517, 0x3a4b, 0x3cb5, 0x3e77, 0x4897, 0x5abb, 0xbc3b, 0xf70f, 0xfff1, 0x4db19}; -const size_t TORSION_MINUS_ODD_POWERS[27] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[34] = {0x0, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xa6e1ffff,0x994c68ad,0x781974ce,0xfaf0a29a,0x4a0dea65,0xfe3ac590,0x26507d01,0x2bdbe63,0x6936e792,0x8c15b003,0xa8869bc6,0x255946}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 21, ._mp_d = (mp_limb_t[]) {0x45096443,0x113b1585,0xac56c1d,0xbacd133e,0xc40ebe1d,0x1dab6dbd,0x84f77f88,0xa77f9a8a,0x9952c9a3,0xa5c91850,0xead61d3,0x684b4f3e,0x8f3d56d7,0x5c5b6e0b,0x2a69ed75,0x6fb3b601,0x44fa773f,0x5720c95c,0x6b8201ac,0xf93f6d9,0x78}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[34] = {{{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc929f6a1,0x1e679735,0x60e76c11,0x456bc}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x49a6b9}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1b20d6b1,0x1}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0xfbd5f59,0x15}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x3101f51,0x116}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2acb6739,0x2219d4}}}, {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x2c91a389,0x4708ff6}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x49}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x97}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x283}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2dd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3f1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9eb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1039}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x13c3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1bd7}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2965}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3517}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3a4b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3cb5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3e77}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4897}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5abb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xbc3b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xf70f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xfff1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4db19}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 12, ._mp_d = (mp_limb_t[]) {0x3456d371,0xba674ca6,0x514d3c0c,0xf532fd78,0x62c82506,0x3e80ff1d,0xdf319328,0x73c9015e,0xd801b49b,0x4de3460a,0xaca35443,0x12}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xa6d1b0f3,0x1def9048,0x4e992075,0xc786a926,0xdcb14dda,0x61230a4b,0x599ee306,0x844ffd2a,0x6ddeae9c,0x6}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x20000}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0xc929f6a1,0x1e679735,0x60e76c11,0x456bc}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0xed420000,0x2e6b9253,0xd8223ccf,0xad78c1ce,0x8}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x28248463,0xad88c02f,0x1fe61daa,0x41c444e3,0x8315d324,0x1f79d382,0x980af852,0x3bf89bf7,0x4576e38f,0x70820b36,0x3c9fe4,0x611f63db,0x3453261,0xfefa3575,0x8537f00e,0x9f1c712c,0x1babde}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x4eb43ad1,0x1f0007a3,0x7d311d6a,0xc7bc0865,0xf08a9962,0xe00313f9,0xc4406d0e,0x44dd4}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 10, ._mp_d = (mp_limb_t[]) {0xa6d1b0f3,0x1def9048,0x4e992075,0xc786a926,0xdcb14dda,0x61230a4b,0x599ee306,0x844ffd2a,0x6ddeae9c,0x6}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0xed420000,0x2e6b9253,0xd8223ccf,0xad78c1ce,0x8}}}; -#elif 8*DIGIT_LEN == 64 -const uint64_t TORSION_PLUS_EVEN_POWER = 0x91; -const uint64_t TORSION_ODD_PRIMES[34] = {0x3, 0xd, 0x29, 0x43, 0x67, 0x1cd, 0x33b, 0x5, 0x7, 0x11, 0x25, 0x35, 0x49, 0x7f, 0x97, 0x283, 0x2dd, 0x2e3, 0x3f1, 0x9eb, 0x1039, 0x13c3, 0x1bd7, 0x2965, 0x3517, 0x3a4b, 0x3cb5, 0x3e77, 0x4897, 0x5abb, 0xbc3b, 0xf70f, 0xfff1, 0x4db19}; -const uint64_t TORSION_ODD_POWERS[34] = {0x48, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const uint64_t TORSION_PLUS_ODD_PRIMES[7] = {0x3, 0xd, 0x29, 0x43, 0x67, 0x1cd, 0x33b}; -const size_t TORSION_PLUS_ODD_POWERS[7] = {0x48, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6}; -const uint64_t TORSION_MINUS_ODD_PRIMES[27] = {0x5, 0x7, 0x11, 0x25, 0x35, 0x49, 0x7f, 0x97, 0x283, 0x2dd, 0x2e3, 0x3f1, 0x9eb, 0x1039, 0x13c3, 0x1bd7, 0x2965, 0x3517, 0x3a4b, 0x3cb5, 0x3e77, 0x4897, 0x5abb, 0xbc3b, 0xf70f, 0xfff1, 0x4db19}; -const size_t TORSION_MINUS_ODD_POWERS[27] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const size_t DEGREE_COMMITMENT_POWERS[34] = {0x0, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}; -const ibz_t CHARACTERISTIC = {{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0xffffffffffffffff,0xffffffffffffffff,0x994c68ada6e1ffff,0xfaf0a29a781974ce,0xfe3ac5904a0dea65,0x2bdbe6326507d01,0x8c15b0036936e792,0x255946a8869bc6}}}; -const ibz_t TORSION_ODD = {{._mp_alloc = 0, ._mp_size = 11, ._mp_d = (mp_limb_t[]) {0x113b158545096443,0xbacd133e0ac56c1d,0x1dab6dbdc40ebe1d,0xa77f9a8a84f77f88,0xa5c918509952c9a3,0x684b4f3e0ead61d3,0x5c5b6e0b8f3d56d7,0x6fb3b6012a69ed75,0x5720c95c44fa773f,0xf93f6d96b8201ac,0x78}}}; -const ibz_t TORSION_ODD_PRIMEPOWERS[34] = {{{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1e679735c929f6a1,0x456bc60e76c11}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x49a6b9}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11b20d6b1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x150fbd5f59}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11603101f51}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2219d42acb6739}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4708ff62c91a389}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x11}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x25}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x35}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x49}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x7f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x97}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x283}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2dd}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2e3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3f1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x9eb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1039}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x13c3}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x1bd7}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x2965}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3517}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3a4b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3cb5}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x3e77}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4897}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x5abb}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xbc3b}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xf70f}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0xfff1}}}, {{._mp_alloc = 0, ._mp_size = 1, ._mp_d = (mp_limb_t[]) {0x4db19}}}}; -const ibz_t TORSION_ODD_PLUS = {{._mp_alloc = 0, ._mp_size = 6, ._mp_d = (mp_limb_t[]) {0xba674ca63456d371,0xf532fd78514d3c0c,0x3e80ff1d62c82506,0x73c9015edf319328,0x4de3460ad801b49b,0x12aca35443}}}; -const ibz_t TORSION_ODD_MINUS = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x1def9048a6d1b0f3,0xc786a9264e992075,0x61230a4bdcb14dda,0x844ffd2a599ee306,0x66ddeae9c}}}; -const ibz_t TORSION_PLUS_2POWER = {{._mp_alloc = 0, ._mp_size = 3, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x20000}}}; -const ibz_t TORSION_PLUS_3POWER = {{._mp_alloc = 0, ._mp_size = 2, ._mp_d = (mp_limb_t[]) {0x1e679735c929f6a1,0x456bc60e76c11}}}; -const ibz_t TORSION_PLUS_23POWER = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x2e6b9253ed420000,0xad78c1ced8223ccf,0x8}}}; -const ibz_t DEGREE_COMMITMENT = {{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0xad88c02f28248463,0x41c444e31fe61daa,0x1f79d3828315d324,0x3bf89bf7980af852,0x70820b364576e38f,0x611f63db003c9fe4,0xfefa357503453261,0x9f1c712c8537f00e,0x1babde}}}; -const ibz_t DEGREE_COMMITMENT_PLUS = {{._mp_alloc = 0, ._mp_size = 4, ._mp_d = (mp_limb_t[]) {0x1f0007a34eb43ad1,0xc7bc08657d311d6a,0xe00313f9f08a9962,0x44dd4c4406d0e}}}; -const ibz_t DEGREE_COMMITMENT_MINUS = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x1def9048a6d1b0f3,0xc786a9264e992075,0x61230a4bdcb14dda,0x844ffd2a599ee306,0x66ddeae9c}}}; -const ibz_t DEGREE_CHALLENGE = {{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x2e6b9253ed420000,0xad78c1ced8223ccf,0x8}}}; +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 9, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 5, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x1}}} #endif +; +const ibz_t TORSION_PLUS_2POWER = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 32, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 16, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100000}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 8, ._mp_d = (mp_limb_t[]) {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000000000000}}} +#endif +; +const ibz_t SEC_DEGREE = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 65, ._mp_d = (mp_limb_t[]) {0x283,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 33, ._mp_d = (mp_limb_t[]) {0x283,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x283,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#endif +; +const ibz_t COM_DEGREE = +#if 0 +#elif GMP_LIMB_BITS == 16 +{{._mp_alloc = 0, ._mp_size = 65, ._mp_d = (mp_limb_t[]) {0x283,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 32 +{{._mp_alloc = 0, ._mp_size = 33, ._mp_d = (mp_limb_t[]) {0x283,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#elif GMP_LIMB_BITS == 64 +{{._mp_alloc = 0, ._mp_size = 17, ._mp_d = (mp_limb_t[]) {0x283,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1}}} +#endif +; diff --git a/src/precomp/ref/lvlx.cmake b/src/precomp/ref/lvlx.cmake new file mode 100644 index 0000000..7e93c5d --- /dev/null +++ b/src/precomp/ref/lvlx.cmake @@ -0,0 +1,40 @@ +set(SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF + ec_params.c + e0_basis.c + hd_splitting_transforms.c +) + +if(ENABLE_SIGN) + set(SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF + ${SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF} + torsion_constants.c + quaternion_data.c + endomorphism_action.c + ) +endif() + +add_library(${LIB_PRECOMP_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_PRECOMP_${SVARIANT_UPPER}_REF}) +target_link_libraries(${LIB_PRECOMP_${SVARIANT_UPPER}} $<$:GMP>) +target_include_directories(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE ${INC_QUATERNION} ${PROJECT_SOURCE_DIR}/quaternion/ref/generic/include ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/hd/ref/include ${PROJECT_SOURCE_DIR}/src/ec/ref/include ${PROJECT_SOURCE_DIR}/src/ec/ref/${SVARIANT_LOWER}/include ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_COMMON}) +target_compile_options(${LIB_PRECOMP_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_compile_definitions(${LIB_PRECOMP_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + +find_program(SAGEMATH sage) +add_custom_target(precomp_${SVARIANT_LOWER} + DEPENDS "./sqisign_parameters.txt" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_torsion_constants.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_quaternion_constants.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_sizes.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_quaternion_data.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_endomorphism_action.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/ec_params.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_hd_splitting.sage" + COMMAND "${SAGEMATH}" "${PROJECT_SOURCE_DIR}/scripts/precomp/precompute_E0_basis.sage" + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" +) + +set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM true) +set_target_properties(precomp_${SVARIANT_LOWER} PROPERTIES EXCLUDE_FROM_ALL TRUE) + +add_dependencies(precomp precomp_${SVARIANT_LOWER}) diff --git a/src/protocols/ref/CMakeLists.txt b/src/protocols/ref/CMakeLists.txt deleted file mode 100644 index aa7ec53..0000000 --- a/src/protocols/ref/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -set(PROTOCOLSX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/protocolsx) - -include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/protocols/ref/include/protocols.h b/src/protocols/ref/include/protocols.h deleted file mode 100644 index ab2991d..0000000 --- a/src/protocols/ref/include/protocols.h +++ /dev/null @@ -1,269 +0,0 @@ -/** @file - * - * @authors Antonin Leroux - * - * @brief The protocols - */ - -#ifndef PROTOCOLS_H -#define PROTOCOLS_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -/** @defgroup protocols_protocols SQIsign protocols - * @{ -*/ -/** @defgroup protocols_t Types for sqisign protocols - * @{ -*/ - -/** @brief Type for the signature - * - * @typedef signature_t - * - * @struct signature - * -*/ - - -typedef struct signature { - id2iso_compressed_long_two_isog_t zip; /// the compressed isogeny - digit_t r[NWORDS_FIELD]; /// first scalar encoding the challenge - struct { - unsigned char select23; // this&1 is bit2, this&2 is bit3 - digit_t scalar2[NWORDS_FIELD]; - digit_t scalar3[NWORDS_FIELD]; - } s; /// second scalar encoding the challenge -} signature_t; - -/** @brief Type for the public keys - * - * @typedef public_key_t - * - * @struct public_key - * -*/ -typedef struct public_key { - ec_curve_t E; /// the normalized A coefficient of the Montgomery curve -} public_key_t; - -/** @brief Type for the secret keys - * - * @typedef secret_key_t - * - * @struct secret_key - * -*/ -typedef struct secret_key { - ec_curve_t curve; /// the j-invariant - quat_left_ideal_t lideal_small; /// ideal of prime norm - quat_left_ideal_t lideal_two; /// ideal of norm a power of 2 - quat_alg_elem_t gen_two; /// generator of lideal_two - ec_point_t kernel_dual; /// kernel of the dual of the last step of the phi_two - ec_basis_t basis_plus; /// basis pushed through phi_two - ec_basis_t basis_minus; /// basis pushed through phi_two -} secret_key_t; - - -/** @} -*/ - - -/*************************** Functions *****************************/ - - -void secret_key_init(secret_key_t *sk); -void secret_key_finalize(secret_key_t *sk); - -void signature_init(signature_t *sig); -void signature_finalize(signature_t *sig); - -/** @defgroup signature The signature protocol - * @{ -*/ - -/** - * @brief Computing a key pair - * - * @param pk : Output the public key - * @param sk : Output the secret key - * @returns a bit indicating if the computation succeeded - */ -int protocols_keygen(public_key_t *pk, secret_key_t *sk); - - -/** - * @brief Computing a commitment isogeny from the starting curve - * - * @param ideal Output: the left O0-ideal defining the commitment isogeny - * @param E1 Output: the codomain curve, normalized à la ec_curve_normalize() - * @param basis Input and output: a basis on E0 which will be pushed through the commitment i -sogeny - */ -void protocols_commit(quat_left_ideal_t *ideal, ec_curve_t *E1, ec_basis_t *basis); - -/** - * @brief Hashing a commitment curve and a message to a challenge - * - * @param scalars Output: scalars defining the challenge kernel in terms of a deterministic t -orsion basis of the commitment curve - * @param curve: the commitment curve - * @param message: byte string to be signed - * @param length: length of the message - */ -void hash_to_challenge(ibz_vec_2_t *scalars, const ec_curve_t *curve, const unsigned char *message, size_t length); - - -/** - * @brief Computing a challenge isogeny from a commitment curve - * - * @param ideal Output: the left O0-ideal defining the challenge isogeny (pulled back through - the commitment) - * @param sig Output: signature structure in which the members r and s will be filled by this - function - * @param E1: commitment curve - * @param pushedbasis6: image of the precomputed fixed torsion basis #BASIS_CHALLENGE under t -he commitment isogeny - * @param hash: message hash according to hash_to_challenge() - * @param out_E2: optional output (can be NULL) to store the value of the challenge curve for - testing and debugging - */ -void protocols_challenge(quat_left_ideal_t *ideal, signature_t *sig, const ec_curve_t *E1, const ec_basis_t *pushedbasis6, const ibz_vec_2_t *hash, ec_curve_t *out_E2); - - -/** - * @brief Computing a signature - * - * @param sig Output: the signature - * @param pk the public key - * @param sk the secret key - * @param m the message - * @param l the message length - * @returns a bit indicating if the computation succeeded - */ -int protocols_sign(signature_t *sig,const public_key_t *pk, const secret_key_t *sk,const unsigned char* m, size_t l); - - -/** @} -*/ - - -/** @defgroup verification The verification protocol - * @{ -*/ - - -/** - * @brief Recovering the challenge curve from a signature - * - * @param E2 Output: the challenge curve, will be normalized à la ec_curve_normalize() - * @param dual Output: point defining the first step of the dual of the response isogeny - * @param sig the signature - * @param pk the public key - */ -void protocols_verif_unpack_chall(ec_curve_t *E2, ec_point_t *dual, const signature_t *sig, const public_key_t *pk); - -/** - * @brief Verifying the challenge from a signature - * - * @param sig the signature - * @param E2 the challenge curve - * @param dual point defining the first step of the dual of the response isogeny - * @param m the message - * @param l the message length - * @returns a single bit indicating whether the given data forms correct signature data - */ -int protocols_verif_from_chall(const signature_t *sig, ec_curve_t const *E2, const ec_point_t *dual, const unsigned char* m, size_t l); - - -/** - * @brief Verifying a signature - * - * @param sig: the signature - * @param pk the public key - * @param m the message - * @param l length of the message - * @returns a bit indicating if the verification succeeded - */ -int protocols_verif(const signature_t *sig,const public_key_t *pk,const unsigned char* m, size_t l); - - -/** @} -*/ - - -/*************************** Encoding *****************************/ - - -/** @defgroup encoding Encoding and decoding functions - * @{ -*/ - -/** - * @brief Encodes a public key as a byte array - * - * @param enc : Output the encoded public key - * @param pk : public key - */ -void public_key_encode(unsigned char *enc, const public_key_t* pk); - -/** - * @brief Encodes a secret key as a byte array - * - * @param enc : Output the encoded secret key (including public key) - * @param sk : secret key - * @param pk : public key - */ -void secret_key_encode(unsigned char *enc, const secret_key_t* sk, const public_key_t* pk); - -/** - * @brief Encodes a signature as a byte array - * - * @param enc : Output the encoded signature - * @param sig : signature - */ -void signature_encode(unsigned char* enc, const signature_t* sig); - -/** - * @brief Encodes a public key as a byte array - * - * @param pk : Output the decoded public key - * @param enc : encoded public key - */ -void public_key_decode(public_key_t* pk, const unsigned char *enc); - -/** - * @brief Encodes a secret key (and public key) as a byte array - * - * @param sk : Output the decoded secret key - * @param pk : Output the decoded public key contained in enc - * @param enc : encoded secret key - */ -void secret_key_decode(secret_key_t* sk, public_key_t* pk, const unsigned char *enc); - -/** - * @brief Encodes a signature as a byte array - * - * @param sig : Output the decoded signature - * @param enc : encoded signature - */ -void signature_decode(signature_t* sig, const unsigned char* enc); - -/** @} -*/ -/** @} -*/ - -#endif diff --git a/src/protocols/ref/lvl1/CMakeLists.txt b/src/protocols/ref/lvl1/CMakeLists.txt deleted file mode 100644 index 5ec15cc..0000000 --- a/src/protocols/ref/lvl1/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ - -set(SOURCE_FILES_PROTOCOLS_GENERIC_REF - ${PROTOCOLSX_DIR}/sign.c - ${PROTOCOLSX_DIR}/verif.c - ${PROTOCOLSX_DIR}/keygen.c - ${PROTOCOLSX_DIR}/encode.c -) - -add_library(${LIB_PROTOCOLS_${SVARIANT_UPPER}} ${SOURCE_FILES_PROTOCOLS_GENERIC_REF}) -target_include_directories(${LIB_PROTOCOLS_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_ID2ISO} ${INC_PROTOCOLS} ${INC_COMMON}) -target_compile_options(${LIB_PROTOCOLS_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/protocols/ref/lvl1/test/CMakeLists.txt b/src/protocols/ref/lvl1/test/CMakeLists.txt deleted file mode 100644 index 8ca34dc..0000000 --- a/src/protocols/ref/lvl1/test/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -set(SOURCE_FILES_PROTOCOLS_GENERIC_REF_TESTS - ${PROTOCOLSX_DIR}/test/commitment.c - ${PROTOCOLSX_DIR}/test/challenge.c - ${PROTOCOLSX_DIR}/test/verif.c - ${PROTOCOLSX_DIR}/test/keygen.c - ${PROTOCOLSX_DIR}/test/encode.c - ${PROTOCOLSX_DIR}/test/test_protocols.c -) -add_executable(sqisign_test_protocols_${SVARIANT_LOWER} ${SOURCE_FILES_PROTOCOLS_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_protocols_${SVARIANT_LOWER} ${LIB_PROTOCOLS_${SVARIANT_UPPER}} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_EC} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_protocols_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_COMMON} ${INC_ID2ISO} ${INC_PROTOCOLS} ./include/) - -add_test(sqisign_test_protocols_${SVARIANT_LOWER} sqisign_test_protocols_${SVARIANT_LOWER}) diff --git a/src/protocols/ref/lvl3/CMakeLists.txt b/src/protocols/ref/lvl3/CMakeLists.txt deleted file mode 100644 index 5ec15cc..0000000 --- a/src/protocols/ref/lvl3/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ - -set(SOURCE_FILES_PROTOCOLS_GENERIC_REF - ${PROTOCOLSX_DIR}/sign.c - ${PROTOCOLSX_DIR}/verif.c - ${PROTOCOLSX_DIR}/keygen.c - ${PROTOCOLSX_DIR}/encode.c -) - -add_library(${LIB_PROTOCOLS_${SVARIANT_UPPER}} ${SOURCE_FILES_PROTOCOLS_GENERIC_REF}) -target_include_directories(${LIB_PROTOCOLS_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_ID2ISO} ${INC_PROTOCOLS} ${INC_COMMON}) -target_compile_options(${LIB_PROTOCOLS_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/protocols/ref/lvl3/test/CMakeLists.txt b/src/protocols/ref/lvl3/test/CMakeLists.txt deleted file mode 100644 index 8ca34dc..0000000 --- a/src/protocols/ref/lvl3/test/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -set(SOURCE_FILES_PROTOCOLS_GENERIC_REF_TESTS - ${PROTOCOLSX_DIR}/test/commitment.c - ${PROTOCOLSX_DIR}/test/challenge.c - ${PROTOCOLSX_DIR}/test/verif.c - ${PROTOCOLSX_DIR}/test/keygen.c - ${PROTOCOLSX_DIR}/test/encode.c - ${PROTOCOLSX_DIR}/test/test_protocols.c -) -add_executable(sqisign_test_protocols_${SVARIANT_LOWER} ${SOURCE_FILES_PROTOCOLS_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_protocols_${SVARIANT_LOWER} ${LIB_PROTOCOLS_${SVARIANT_UPPER}} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_EC} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_protocols_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_COMMON} ${INC_ID2ISO} ${INC_PROTOCOLS} ./include/) - -add_test(sqisign_test_protocols_${SVARIANT_LOWER} sqisign_test_protocols_${SVARIANT_LOWER}) diff --git a/src/protocols/ref/lvl5/CMakeLists.txt b/src/protocols/ref/lvl5/CMakeLists.txt deleted file mode 100644 index 5ec15cc..0000000 --- a/src/protocols/ref/lvl5/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ - -set(SOURCE_FILES_PROTOCOLS_GENERIC_REF - ${PROTOCOLSX_DIR}/sign.c - ${PROTOCOLSX_DIR}/verif.c - ${PROTOCOLSX_DIR}/keygen.c - ${PROTOCOLSX_DIR}/encode.c -) - -add_library(${LIB_PROTOCOLS_${SVARIANT_UPPER}} ${SOURCE_FILES_PROTOCOLS_GENERIC_REF}) -target_include_directories(${LIB_PROTOCOLS_${SVARIANT_UPPER}} PRIVATE common ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_ID2ISO} ${INC_PROTOCOLS} ${INC_COMMON}) -target_compile_options(${LIB_PROTOCOLS_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) - -add_subdirectory(test) diff --git a/src/protocols/ref/lvl5/test/CMakeLists.txt b/src/protocols/ref/lvl5/test/CMakeLists.txt deleted file mode 100644 index 8ca34dc..0000000 --- a/src/protocols/ref/lvl5/test/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -set(SOURCE_FILES_PROTOCOLS_GENERIC_REF_TESTS - ${PROTOCOLSX_DIR}/test/commitment.c - ${PROTOCOLSX_DIR}/test/challenge.c - ${PROTOCOLSX_DIR}/test/verif.c - ${PROTOCOLSX_DIR}/test/keygen.c - ${PROTOCOLSX_DIR}/test/encode.c - ${PROTOCOLSX_DIR}/test/test_protocols.c -) -add_executable(sqisign_test_protocols_${SVARIANT_LOWER} ${SOURCE_FILES_PROTOCOLS_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_protocols_${SVARIANT_LOWER} ${LIB_PROTOCOLS_${SVARIANT_UPPER}} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_EC} ${LIB_KLPT_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_INTBIG} ${LIB_PUBLIC} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_protocols_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_COMMON} ${INC_ID2ISO} ${INC_PROTOCOLS} ./include/) - -add_test(sqisign_test_protocols_${SVARIANT_LOWER} sqisign_test_protocols_${SVARIANT_LOWER}) diff --git a/src/protocols/ref/protocolsx/encode.c b/src/protocols/ref/protocolsx/encode.c deleted file mode 100644 index 64eea28..0000000 --- a/src/protocols/ref/protocolsx/encode.c +++ /dev/null @@ -1,467 +0,0 @@ -#include -#include -#include -#include - - -// digits - -static void encode_digits(unsigned char* enc, const digit_t* x, size_t nbytes) -{ -#ifdef TARGET_BIG_ENDIAN - const size_t ndigits = nbytes / sizeof(digit_t); - const size_t rem = nbytes % sizeof(digit_t); - - for (size_t i = 0; i < ndigits; i++) - ((digit_t*)enc)[i] = BSWAP_DIGIT(x[i]); - if (rem) { - digit_t ld = BSWAP_DIGIT(x[ndigits]); - memcpy(enc + ndigits*sizeof(digit_t), (unsigned char*)&ld, rem); - } -#else - memcpy(enc, (const unsigned char*)x, nbytes); -#endif -} - -static void decode_digits(digit_t* dec, const unsigned char* x, size_t nbytes, size_t ndigits) -{ - assert(nbytes <= ndigits*sizeof(digit_t)); - memcpy((unsigned char*)dec, x, nbytes); - memset((unsigned char*)dec + nbytes, 0, ndigits*sizeof(*dec)-nbytes); - -#ifdef TARGET_BIG_ENDIAN - for (size_t i = 0; i < ndigits; i++) - dec[i] = BSWAP_DIGIT(dec[i]); -#endif -} - - -// ibz_t - -static void ibz_encode(unsigned char *enc, const ibz_t *x, size_t nbytes) -{ -#ifndef NDEBUG -{ - // make sure there is enough space - ibz_t abs, bnd; - ibz_init(&bnd); - ibz_init(&abs); - ibz_pow(&bnd, &ibz_const_two, 8*nbytes-1); - ibz_abs(&abs, x); - assert(ibz_cmp(&abs, &bnd) < 0); - ibz_finalize(&bnd); - ibz_finalize(&abs); -} -#endif - const size_t digits = (nbytes + sizeof(digit_t) - 1) / sizeof(digit_t); - digit_t d[digits]; - memset(d, 0, sizeof(d)); - if (ibz_cmp(x, &ibz_const_zero) >= 0) { - // non-negative, straightforward. - ibz_to_digits(d, x); - } - else { - // negative; use two's complement. - ibz_t tmp; - ibz_init(&tmp); - ibz_neg(&tmp, x); - ibz_sub(&tmp, &tmp, &ibz_const_one); - ibz_to_digits(d, &tmp); - for (size_t i = 0; i < digits; ++i) - d[i] = ~d[i]; -#ifndef NDEBUG -{ - // make sure the result is correct - ibz_t chk; - ibz_init(&chk); - ibz_copy_digit_array(&tmp, d); - ibz_sub(&tmp, &tmp, x); - ibz_pow(&chk, &ibz_const_two, 8*sizeof(d)); - assert(!ibz_cmp(&tmp, &chk)); - ibz_finalize(&chk); -} -#endif - ibz_finalize(&tmp); - } - encode_digits(enc, d, nbytes); -} - -static void ibz_decode(ibz_t* dec, const unsigned char *x, size_t nbytes) -{ - assert(nbytes > 0); - const size_t ndigits = (nbytes + sizeof(digit_t) - 1) / sizeof(digit_t); - assert(ndigits > 0); - digit_t d[ndigits]; - memset(d, 0, sizeof(d)); - decode_digits(d, x, nbytes, ndigits); - if (x[nbytes-1] >> 7) { - // negative, decode two's complement - const size_t s = sizeof(digit_t)-1 - (sizeof(d) - nbytes); - assert(s < sizeof(digit_t)); - d[ndigits-1] |= ((digit_t) -1) >> 8*s << 8*s; - for (size_t i = 0; i < ndigits; ++i) - d[i] = ~d[i]; - ibz_copy_digits(dec, d, ndigits); - ibz_add(dec, dec, &ibz_const_one); - ibz_neg(dec, dec); - } - else { - // non-negative - ibz_copy_digits(dec, d, ndigits); - } -} - - -// fp2_t - -static void fp2_encode(const fp2_t* x, unsigned char *enc) -{ - fp2_t y; - fp2_frommont(&y, x); - encode_digits(enc, y.re, FP2_ENCODED_BYTES / 2); - encode_digits(enc + FP2_ENCODED_BYTES / 2, y.im, FP2_ENCODED_BYTES / 2); -} - -void fp2_decode(const unsigned char *x, fp2_t *dec) -{ - decode_digits(dec->re, x, FP2_ENCODED_BYTES / 2, NWORDS_FIELD); - decode_digits(dec->im, x + FP2_ENCODED_BYTES / 2, FP2_ENCODED_BYTES / 2, NWORDS_FIELD); - fp2_tomont(dec, dec); -} - - -// curves and points - -static void proj_encode(fp2_t const *x, fp2_t const *z, unsigned char *enc) -{ - assert(!fp2_is_zero(z)); - fp2_t tmp = *z; - fp2_inv(&tmp); -#ifndef NDEBUG -{ -fp2_t chk; -fp2_mul(&chk, z, &tmp); -fp2_t one = {0}; -fp_mont_setone(one.re); -assert(fp2_is_equal(&chk, &one)); -} -#endif - fp2_mul(&tmp, x, &tmp); - fp2_encode(&tmp, enc); -} - -static void proj_decode(const unsigned char *enc, fp2_t *x, fp2_t *z) -{ - fp2_decode(enc, x); - fp_mont_setone(z->re); - memset(z->im, 0, sizeof(z->im)); -} - -static void ec_curve_encode(const ec_curve_t* curve, unsigned char *enc) -{ - proj_encode(&curve->A, &curve->C, enc); -} - -static void ec_curve_decode(const unsigned char *enc, ec_curve_t* curve) -{ - proj_decode(enc, &curve->A, &curve->C); -} - -static void ec_point_encode(unsigned char *enc, const ec_point_t* point) -{ - proj_encode(&point->x, &point->z, enc); -} - -static void ec_point_decode(ec_point_t* point, const unsigned char *enc) -{ - proj_decode(enc, &point->x, &point->z); -} - -static void ec_basis_encode(unsigned char *enc, const ec_basis_t* basis) -{ - ec_point_encode(enc, &basis->P); - enc += EC_POINT_ENCODED_BYTES; - ec_point_encode(enc, &basis->Q); - enc += EC_POINT_ENCODED_BYTES; - ec_point_encode(enc, &basis->PmQ); -} - -static void ec_basis_decode(ec_basis_t* basis, const unsigned char *enc) -{ - ec_point_decode(&basis->P, enc); - enc += EC_POINT_ENCODED_BYTES; - ec_point_decode(&basis->Q, enc); - enc += EC_POINT_ENCODED_BYTES; - ec_point_decode(&basis->PmQ, enc); -} - - -// quat_alg_elem_t - -static void quat_alg_elem_encode(unsigned char *enc, const quat_alg_elem_t* elt) -{ - ibz_encode(enc, &elt->denom, QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_encode(enc, &elt->coord[0], QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_encode(enc, &elt->coord[1], QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_encode(enc, &elt->coord[2], QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_encode(enc, &elt->coord[3], QUAT_ALG_ELEM_ENCODED_BYTES); -} - -static void quat_alg_elem_decode(quat_alg_elem_t* elt, const unsigned char *enc) -{ - ibz_decode(&elt->denom, enc, QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_decode(&elt->coord[0], enc, QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_decode(&elt->coord[1], enc, QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_decode(&elt->coord[2], enc, QUAT_ALG_ELEM_ENCODED_BYTES); - enc += QUAT_ALG_ELEM_ENCODED_BYTES; - ibz_decode(&elt->coord[3], enc, QUAT_ALG_ELEM_ENCODED_BYTES); -} - - -// compressed isogeny chains - -static void id2iso_compressed_long_two_isog_encode(const id2iso_compressed_long_two_isog_t* isog, unsigned char *enc) -{ -unsigned char *const start = enc; - assert(isog->length == ZIP_CHAIN_LEN); - for (int i = 0; i < ZIP_CHAIN_LEN; ++i) { - ibz_encode(enc, &isog->zip_chain[i], ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES); - enc += ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES; - } - *enc++ = isog->bit_first_step; -assert(enc - start == ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES); -} - -static void id2iso_compressed_long_two_isog_decode(const unsigned char *enc, id2iso_compressed_long_two_isog_t* isog) -{ -const unsigned char *const start = enc; - for (int i = 0; i < ZIP_CHAIN_LEN; ++i) { - ibz_decode(&isog->zip_chain[i], enc, ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES); - enc += ID2ISO_COMPRESSED_LONG_TWO_ISOG_ZIP_CHAIN_BYTES; - } - isog->bit_first_step = *enc++; -assert(enc - start == ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES); -} - - -// public API - - -/** - * @brief Encodes a public key to a byte array - * - * @param enc Output: encoded public key - * @param pk: the public key - */ -void public_key_encode(unsigned char *enc, const public_key_t* pk) -{ - ec_curve_encode(&pk->E, enc); -} - -/** - * @brief Decodes a public key from a byte array - * - * @param pk Output: the decoded public key - * @param enc: encoded public key - */ -void public_key_decode(public_key_t* pk, const unsigned char *enc) -{ - ec_curve_decode(enc, &pk->E); -} - - -/** - * @brief Encodes a secret key to a byte array - * - * @param enc Output: encoded secret key - * @param sk: the secret key - * @param pk: the associated public key - */ -void secret_key_encode(unsigned char *enc, const secret_key_t* sk, const public_key_t* pk) -{ -unsigned char *const start = enc; -#ifndef NDEBUG -{ -fp2_t lhs, rhs; -fp2_mul(&lhs, &sk->curve.A, &pk->E.C); -fp2_mul(&rhs, &sk->curve.C, &pk->E.A); -assert(fp2_is_equal(&lhs, &rhs)); -} -#endif - ec_curve_encode(&sk->curve, enc); - enc += EC_CURVE_ENCODED_BYTES; - quat_alg_elem_encode(enc, &sk->gen_two); - enc += 5*QUAT_ALG_ELEM_ENCODED_BYTES; - ec_point_encode(enc, &sk->kernel_dual); - enc += EC_POINT_ENCODED_BYTES; - ec_basis_encode(enc, &sk->basis_plus); - enc += EC_BASIS_ENCODED_BYTES; - ec_basis_encode(enc, &sk->basis_minus); - enc += EC_BASIS_ENCODED_BYTES; -assert(enc - start == SECRETKEY_BYTES); -} - -static void secret_key_populate_full(secret_key_t* sk); - -/** - * @brief Decodes a secret key from a byte array - * - * @param sk Output: the decoded secret key - * @param pk Output: the associated public key - * @param enc: encoded secret key - */ -void secret_key_decode(secret_key_t* sk, public_key_t* pk, const unsigned char *enc) -{ -const unsigned char *const start = enc; - ec_curve_decode(enc, &sk->curve); - enc += EC_CURVE_ENCODED_BYTES; - quat_alg_elem_decode(&sk->gen_two, enc); - enc += 5*QUAT_ALG_ELEM_ENCODED_BYTES; - ec_point_decode(&sk->kernel_dual, enc); - enc += EC_POINT_ENCODED_BYTES; - ec_basis_decode(&sk->basis_plus, enc); - enc += EC_BASIS_ENCODED_BYTES; - ec_basis_decode(&sk->basis_minus, enc); - enc += EC_BASIS_ENCODED_BYTES; - pk->E = sk->curve; -assert(enc - start == SECRETKEY_BYTES); - - secret_key_populate_full(sk); -} - -/** - * Fully populates the decoded key - */ -static void secret_key_populate_full(secret_key_t* sk) -{ - // have: curve, gen_two, kernel_dual, basis_plus, basis_minus - // want: order, lideal_small, lideal_two - - ibz_t norm_two, norm_small; - ibz_init(&norm_two); - ibz_init(&norm_small); - - ibz_pow(&norm_two, &ibz_const_two, KLPT_keygen_length); - { - ibq_t norm; - ibq_init(&norm); - ibz_t tmp; - ibz_init(&tmp); - quat_alg_norm(&norm, &sk->gen_two, &QUATALG_PINFTY); - int r = ibq_to_ibz(&tmp, &norm); - assert(r); - ibz_div(&norm_small, &tmp, &tmp, &norm_two); - assert(ibz_is_zero(&tmp)); - ibq_finalize(&norm); - ibz_finalize(&tmp); - } - - quat_lideal_make_primitive_then_create(&sk->lideal_two, &sk->gen_two, &norm_two, &STANDARD_EXTREMAL_ORDER.order, &QUATALG_PINFTY); - - quat_alg_elem_t conj; - quat_alg_elem_init(&conj); - quat_alg_conj(&conj, &sk->gen_two); - quat_lideal_make_primitive_then_create(&sk->lideal_small, &conj, &norm_small, &STANDARD_EXTREMAL_ORDER.order, &QUATALG_PINFTY); - quat_alg_elem_finalize(&conj); - - ibz_finalize(&norm_small); - ibz_finalize(&norm_two); -} - - -/** - * @brief Encodes a signature to a byte array - * - * @param enc Output: encoded signature - * @param sig: the signature - */ -void signature_encode(unsigned char* enc, const signature_t* sig) -{ -unsigned char *const start = enc; - id2iso_compressed_long_two_isog_encode(&sig->zip, enc); - enc += ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES; - encode_digits(enc, sig->r, TORSION_23POWER_BYTES); - enc += TORSION_23POWER_BYTES; - *enc++ = sig->s.select23; - encode_digits(enc, sig->s.scalar2, TORSION_2POWER_BYTES); - enc += TORSION_2POWER_BYTES; - encode_digits(enc, sig->s.scalar3, TORSION_3POWER_BYTES); - enc += TORSION_3POWER_BYTES; -assert(enc - start == SIGNATURE_LEN); -} - -/** - * @brief Decodes a signature from a byte array - * - * @param sig Output: the decoded signature - * @param enc: encoded signature - */ -void signature_decode(signature_t* sig, const unsigned char* enc) -{ -const unsigned char *const start = enc; - id2iso_compressed_long_two_isog_decode(enc, &sig->zip); - enc += ID2ISO_COMPRESSED_LONG_TWO_ISOG_BYTES; - memset(&sig->r, 0, sizeof(sig->r)); - decode_digits(sig->r, enc, TORSION_23POWER_BYTES, sizeof(sig->r)/sizeof(*sig->r)); - enc += TORSION_23POWER_BYTES; - memset(&sig->s, 0, sizeof(sig->s)); - sig->s.select23 = *enc++; - decode_digits(sig->s.scalar2, enc, TORSION_2POWER_BYTES, sizeof(sig->s.scalar2)/sizeof(*sig->s.scalar2)); - enc += TORSION_2POWER_BYTES; - decode_digits(sig->s.scalar3, enc, TORSION_3POWER_BYTES, sizeof(sig->s.scalar3)/sizeof(*sig->s.scalar3)); - enc += TORSION_3POWER_BYTES; -assert(enc - start == SIGNATURE_LEN); -} - - - -#include - -void hash_to_challenge(ibz_vec_2_t *scalars, const ec_curve_t *curve, const unsigned char *message, size_t length) -{ - unsigned char *buf = malloc(FP2_ENCODED_BYTES + length); - { - fp2_t j; - ec_j_inv(&j, curve); - fp2_encode(&j, buf); - memcpy(buf + FP2_ENCODED_BYTES, message, length); - } - - //FIXME omits some vectors, notably (a,1) with gcd(a,6)!=1 but also things like (2,3). - { - digit_t digits[NWORDS_FIELD]; - - //FIXME should use SHAKE128 for smaller parameter sets? - SHAKE256((void *) digits, sizeof(digits), buf, FP2_ENCODED_BYTES + length); - -#ifdef TARGET_BIG_ENDIAN - for (size_t i = 0; i < NWORDS_FIELD; i++) - digits[i] = BSWAP_DIGIT(digits[i]); -#endif - - ibz_set(&(*scalars)[0], 1); //FIXME - ibz_copy_digit_array(&(*scalars)[1], digits); - } - -#ifndef NDEBUG -{ -ibz_t gcd; -ibz_init(&gcd); -ibz_set(&gcd, 6); -ibz_gcd(&gcd, &gcd, &(*scalars)[0]); -ibz_gcd(&gcd, &gcd, &(*scalars)[1]); -assert(ibz_is_one(&gcd)); -ibz_finalize(&gcd); -} -#endif - - free(buf); -} - diff --git a/src/protocols/ref/protocolsx/keygen.c b/src/protocols/ref/protocolsx/keygen.c deleted file mode 100644 index b793f97..0000000 --- a/src/protocols/ref/protocolsx/keygen.c +++ /dev/null @@ -1,238 +0,0 @@ -#include - - -void secret_key_init(secret_key_t *sk) { - quat_left_ideal_init(&sk->lideal_small); - quat_left_ideal_init(&sk->lideal_two); - quat_alg_elem_init(&sk->gen_two); -} - -void secret_key_finalize(secret_key_t *sk) { - quat_left_ideal_finalize(&sk->lideal_small); - quat_left_ideal_finalize(&sk->lideal_two); - quat_alg_elem_finalize(&sk->gen_two); -} - - -/** - * @brief Computing a key pair - * - * @param pk : Output the public key - * @param sk : Output the secret key - * @returns a bit indicating if the computation succeeded - * assumes that sk and pk have been initialized - */ -int protocols_keygen(public_key_t *pk, secret_key_t *sk) { - - // var dec - int found = 1; - ibz_t temp,remainder; - ibq_t ibq_norm; - quat_alg_elem_t gen,gen_two; - quat_alg_elem_t quat_temp; - - quat_left_ideal_t lideal_two_one,lideal_small_one; - quat_order_t right_order; - id2iso_compressed_long_two_isog_t zip; - quat_alg_coord_t coeffs; - ibz_mat_4x4_t reduced,gram; - - ec_basis_t basis_plus,basis_minus; - ec_basis_t odd_basis[2]; - ec_curve_t curve = {0}; - ec_point_t kernel_dual = {0}; - ec_basis_t even_basis = {0}; - ec_isog_even_t isog_two_one; - - - // var init - ibq_init(&ibq_norm); - ibz_init(&temp);ibz_init(&remainder); - quat_alg_elem_init(&gen);quat_alg_elem_init(&quat_temp); - quat_alg_elem_init(&gen_two); - quat_left_ideal_init(&lideal_two_one); - quat_left_ideal_init(&lideal_small_one); - quat_order_init(&right_order); - quat_alg_coord_init(&coeffs); - ibz_mat_4x4_init(&reduced);ibz_mat_4x4_init(&gram); - - // computing the length of the walk - int length = KLPT_keygen_length/TORSION_PLUS_EVEN_POWER; - assert(KLPT_keygen_length==TORSION_PLUS_EVEN_POWER*length); - - found = 0; - int cnt = 0; - while (!found && cnt < SQISIGN_response_attempts) { - cnt ++; - - // computation of lideal_small - found = klpt_keygen_random_ideal(&sk->lideal_small,&STANDARD_EXTREMAL_ORDER,&QUATALG_PINFTY); - if (!found) { - continue; - } - - - // application of keygen_klpt to compute a generator of lideal_two - found = found && klpt_keygen_klpt(&gen,&sk->lideal_small,&QUATALG_PINFTY); - quat_alg_normalize(&gen); - assert(quat_lattice_contains(&coeffs,&sk->lideal_small.lattice,&gen,&QUATALG_PINFTY)); - #ifndef NDEBUG - quat_left_ideal_t ideal_test; - quat_left_ideal_init(&ideal_test); - quat_lideal_make_primitive_then_create(&ideal_test,&gen,&sk->lideal_small.norm,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - assert(quat_lideal_equals(&ideal_test,&sk->lideal_small,&QUATALG_PINFTY)); - quat_left_ideal_finalize(&ideal_test); - #endif - - // gen = conjugate(gen) - quat_alg_conj(&gen,&gen); - - // sk.gen_two = gen - quat_alg_elem_copy(&sk->gen_two,&gen); - - - - // computation of the norm of lideal_two - quat_alg_norm(&ibq_norm,&gen,&QUATALG_PINFTY); - ibq_to_ibz(&temp,&ibq_norm); - ibz_div(&temp,&remainder,&temp,&sk->lideal_small.norm); - assert(0==ibz_cmp(&remainder,&ibz_const_zero)); - - // computation of lideal_two - quat_lideal_make_primitive_then_create(&sk->lideal_two,&gen,&temp,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - // for debug we check that the two ideals are equivalent - assert(quat_lideal_isom(&quat_temp,&sk->lideal_two,&sk->lideal_small,&QUATALG_PINFTY)); - - // we compute a better generator to make the translation - // for this, we look for a generator with odd trace - int find_gen = 0; - while (!find_gen) { - ibz_rand_interval_minm_m(&coeffs[0],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[1],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[2],KLPT_equiv_bound_coeff); - ibz_rand_interval_minm_m(&coeffs[3],KLPT_equiv_bound_coeff); - ibz_mat_4x4_eval(&gen.coord,&sk->lideal_two.lattice.basis,&coeffs); - ibz_copy(&gen.denom,&sk->lideal_two.lattice.denom); - - quat_alg_trace(&ibq_norm,&gen); - ibq_to_ibz(&temp,&ibq_norm); - find_gen = (0!=ibz_get(&temp)%2); - } - - // computing the ideal of the first step as lideal_two_one = O0 < gen,2^f > - ibz_pow(&remainder,&ibz_const_two,TORSION_PLUS_EVEN_POWER); - quat_lideal_create_from_primitive(&lideal_two_one,&gen,&remainder,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - - // computing the right_order - quat_lideal_right_order(&right_order,&lideal_two_one,&QUATALG_PINFTY); - - // for debug checking that gen is indeed contained in right_order - assert(quat_lattice_contains(&coeffs,&right_order,&gen,&QUATALG_PINFTY)); - - // computing an ideal equivalent to lideal_two_one - quat_lideal_reduce_basis(&reduced,&gram,&lideal_two_one,&QUATALG_PINFTY); - found = found && klpt_lideal_equiv(&gen_two,&temp,&reduced,&gram,&lideal_two_one.norm,&lideal_two_one.lattice.denom,&QUATALG_PINFTY); - if (!found) { - continue; - } - - // lideal_small = O0 < gen_two , temp> - quat_lideal_create_from_primitive(&lideal_small_one,&gen_two,&temp,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - quat_alg_conj(&gen_two,&gen_two); - assert(quat_lattice_contains(&coeffs,&lideal_two_one.lattice,&gen_two,&QUATALG_PINFTY)); - assert(quat_lideal_isom(&quat_temp,&lideal_two_one,&lideal_small_one,&QUATALG_PINFTY)); - - // casting gen into the right order of lideal_small_one - // gen = gen_two * gen * gen_two^ {-1} - quat_alg_elem_copy(&quat_temp,&gen_two); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal_two_one.norm); - ibz_mul(&quat_temp.denom,&quat_temp.denom,&lideal_small_one.norm); - quat_alg_mul(&gen,&quat_temp,&gen,&QUATALG_PINFTY); - quat_alg_conj(&quat_temp,&gen_two); - quat_alg_mul(&gen,&gen,&quat_temp,&QUATALG_PINFTY); - - - #ifndef NDEBUG - quat_left_ideal_init(&ideal_test); - quat_lideal_right_order(&right_order,&lideal_small_one,&QUATALG_PINFTY); - assert(quat_lattice_contains(&coeffs,&right_order,&gen,&QUATALG_PINFTY)); - int lideal_generator_ok = quat_lideal_generator_coprime(&quat_temp,&lideal_small_one,&ibz_const_two,&QUATALG_PINFTY,0); - assert(lideal_generator_ok); - quat_alg_mul(&quat_temp,&quat_temp,&gen,&QUATALG_PINFTY); - ibz_pow(&temp,&ibz_const_two,TORSION_PLUS_EVEN_POWER*(length -1) ); - ibz_mul(&temp,&temp,&lideal_small_one.norm); - quat_lideal_create_from_primitive(&ideal_test,&quat_temp,&temp,&STANDARD_EXTREMAL_ORDER.order,&QUATALG_PINFTY); - assert(quat_lideal_isom(&quat_temp,&ideal_test,&sk->lideal_small,&QUATALG_PINFTY)); - quat_left_ideal_finalize(&ideal_test); - #endif - - - // copying the precomputed basis - basis_plus = BASIS_ODD_PLUS; - basis_minus = BASIS_ODD_MINUS; - odd_basis[0] = basis_minus; - odd_basis[1] = basis_plus; - - // copying the starting curve - curve = CURVE_E0; - - // Computing the first isogeny - id2iso_ideal_to_isogeny_even(&isog_two_one,&lideal_two_one); - - // computation of the deterministic second point as the kernel dual - ec_complete_basis_2(&even_basis,&curve,&isog_two_one.kernel); - kernel_dual = even_basis.Q; - - // evaluation through the first isogeny - ec_eval_even_basis(&curve,&isog_two_one,odd_basis,2); - basis_minus = odd_basis[0]; basis_plus=odd_basis[1]; - ec_curve_t E = CURVE_E0; - ec_eval_even(&E,&isog_two_one,&kernel_dual,1); - - // init of the zip - id2iso_compressed_long_two_isog_init(&zip, length-1); - - - // Computing the rest of the chain - found = found && id2iso_ideal_to_isogeny_two_long_power_of_2(&zip,&curve,&basis_minus,&basis_plus,&kernel_dual,&gen,length-1,&lideal_small_one,&lideal_two_one,&gen_two,&QUATALG_PINFTY); - if (!found) { - continue; - } - } - - sk->curve = curve; - sk->kernel_dual = kernel_dual; - sk->basis_minus = basis_minus; - sk->basis_plus = basis_plus; - - // normalizing the curve - ec_isom_t isom; - ec_curve_normalize(&sk->curve,&isom,&sk->curve); - ec_iso_eval(&sk->kernel_dual,&isom); - ec_iso_eval(&sk->basis_minus.P,&isom); - ec_iso_eval(&sk->basis_minus.Q,&isom); - ec_iso_eval(&sk->basis_minus.PmQ,&isom); - ec_iso_eval(&sk->basis_plus.P,&isom); - ec_iso_eval(&sk->basis_plus.Q,&isom); - ec_iso_eval(&sk->basis_plus.PmQ,&isom); - - // setting the public key - pk->E = sk->curve; - - - // var finalize - ibq_finalize(&ibq_norm); - ibz_finalize(&temp);ibz_finalize(&remainder); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&gen_two); - quat_left_ideal_finalize(&lideal_two_one); - quat_left_ideal_finalize(&lideal_small_one); - quat_order_finalize(&right_order); - quat_alg_coord_finalize(&coeffs); - ibz_mat_4x4_finalize(&reduced);ibz_mat_4x4_finalize(&gram); - quat_alg_elem_finalize(&quat_temp); - id2iso_compressed_long_two_isog_finalize(&zip); - - - return found; -} diff --git a/src/protocols/ref/protocolsx/sign.c b/src/protocols/ref/protocolsx/sign.c deleted file mode 100644 index 1e531ba..0000000 --- a/src/protocols/ref/protocolsx/sign.c +++ /dev/null @@ -1,762 +0,0 @@ -#include - - -void signature_init(signature_t *sig) -{ - id2iso_compressed_long_two_isog_init(&sig->zip, SQISIGN_signing_length); -} - -void signature_finalize(signature_t *sig) -{ - id2iso_compressed_long_two_isog_finalize(&sig->zip); -} - - -void protocols_commit(quat_left_ideal_t *ideal, ec_curve_t *E1, ec_basis_t *basis) -{ - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - ibz_t tmp; - ibz_init(&tmp); - - // sample the random scalars - do { - ibz_rand_interval(&vec[0], &ibz_const_one, &DEGREE_COMMITMENT); - ibz_rand_interval(&vec[1], &ibz_const_one, &DEGREE_COMMITMENT); - ibz_gcd(&tmp, &vec[0], &vec[1]); - ibz_gcd(&tmp, &tmp, &DEGREE_COMMITMENT); - } while (!ibz_is_one(&tmp)); - - // deduce the commitment ideal - { - quat_alg_elem_t gen; - quat_alg_elem_init(&gen); - - ibz_set(&gen.denom, 1); - for (unsigned i = 0; i < 4; ++i) { - ibz_mul(&gen.coord[i], &COMMITMENT_IDEAL_DISTORTION_ENDO.coord[i], &vec[1]); - if (i) - ibz_neg(&gen.coord[i], &gen.coord[i]); // conjugate - } - ibz_add(&gen.coord[0], &gen.coord[0], &vec[0]); - // now gen = a + b*dual(theta) where vec=(a,b) and theta is the distortion map - - quat_alg_mul(&gen, &COMMITMENT_IDEAL_UNDISTORTED_GEN, &gen, &QUATALG_PINFTY); - - #ifndef NDEBUG - quat_alg_coord_t coeffs; - ibz_t temp,remainder; - quat_alg_coord_init(&coeffs); - ibz_init(&temp);ibz_init(&remainder); - quat_alg_make_primitive(&coeffs,&temp,&gen,&MAXORD_O0,&QUATALG_PINFTY); - ibz_mul(&gen.denom,&gen.denom,&temp); - quat_alg_normalize(&gen); - assert(quat_alg_is_primitive(&gen,&MAXORD_O0,&QUATALG_PINFTY)); - ibq_t ibq_norm; - ibq_init(&ibq_norm); - quat_alg_norm(&ibq_norm,&gen,&QUATALG_PINFTY); - assert(ibq_to_ibz(&temp,&ibq_norm)); - ibq_finalize(&ibq_norm); - ibz_gcd(&temp,&temp,&DEGREE_COMMITMENT); - ibz_div(&temp,&remainder,&temp,&DEGREE_COMMITMENT); - assert(0==ibz_cmp(&remainder,&ibz_const_zero)); - ibz_finalize(&temp);ibz_finalize(&remainder); - quat_alg_coord_finalize(&coeffs); - #endif - - - quat_lideal_make_primitive_then_create(ideal, &gen, &DEGREE_COMMITMENT, &MAXORD_O0, &QUATALG_PINFTY); - assert(!ibz_cmp(&ideal->norm, &DEGREE_COMMITMENT)); - - quat_alg_elem_finalize(&gen); - } - - // deduce the commitment isogeny - ec_isog_odd_t isogeny; - { - isogeny.curve = CURVE_E0; - for (size_t i = 0; i < sizeof(TORSION_ODD_PRIMES)/sizeof(*TORSION_ODD_PRIMES); ++i) - isogeny.degree[i] = DEGREE_COMMITMENT_POWERS[i]; - - digit_t scalars_plus[2][NWORDS_FIELD], scalars_minus[2][NWORDS_FIELD]; - ibz_mod(&tmp, &vec[0], &DEGREE_COMMITMENT_PLUS); - ibz_to_digit_array(scalars_plus[0], &tmp); - ibz_mod(&tmp, &vec[1], &DEGREE_COMMITMENT_PLUS); - ibz_to_digit_array(scalars_plus[1], &tmp); - ibz_mod(&tmp, &vec[0], &DEGREE_COMMITMENT_MINUS); - ibz_to_digit_array(scalars_minus[0], &tmp); - ibz_mod(&tmp, &vec[1], &DEGREE_COMMITMENT_MINUS); - ibz_to_digit_array(scalars_minus[1], &tmp); - - ec_biscalar_mul(&isogeny.ker_plus, &CURVE_E0, scalars_plus[0], scalars_plus[1], &BASIS_COMMITMENT_PLUS); - ec_biscalar_mul(&isogeny.ker_minus, &CURVE_E0, scalars_minus[0], scalars_minus[1], &BASIS_COMMITMENT_MINUS); - } - - ec_curve_t E1comp; - ec_eval_odd_basis(&E1comp, &isogeny, basis, 1); - - // normalize E1 with the pushed basis - { - ec_isom_t isom; - ec_curve_normalize(E1, &isom, &E1comp); - ec_iso_eval(&basis->P, &isom); - ec_iso_eval(&basis->Q, &isom); - ec_iso_eval(&basis->PmQ, &isom); - } - - ibz_finalize(&tmp); - ibz_vec_2_finalize(&vec); -} - -void protocols_challenge(quat_left_ideal_t *ideal, signature_t *sig, const ec_curve_t *E1, const ec_basis_t *pushedbasis6, const ibz_vec_2_t *hash, ec_curve_t *out_E2) -{ - // compute deterministic and pushed 2*3*-torsion bases on E1 - ec_basis_t E1basis6, E1basis2, E1basis3; - ec_basis_t pushedbasis2, pushedbasis3; - ec_curve_to_basis_6(&E1basis6, E1); - { - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &TORSION_PLUS_3POWER); - ec_mul(&E1basis2.P, E1, scalar, &E1basis6.P); - ec_mul(&E1basis2.Q, E1, scalar, &E1basis6.Q); - ec_mul(&E1basis2.PmQ, E1, scalar, &E1basis6.PmQ); - ec_mul(&pushedbasis2.P, E1, scalar, &pushedbasis6->P); - ec_mul(&pushedbasis2.Q, E1, scalar, &pushedbasis6->Q); - ec_mul(&pushedbasis2.PmQ, E1, scalar, &pushedbasis6->PmQ); - ibz_to_digit_array(scalar, &TORSION_PLUS_2POWER); - ec_mul(&E1basis3.P, E1, scalar, &E1basis6.P); - ec_mul(&E1basis3.Q, E1, scalar, &E1basis6.Q); - ec_mul(&E1basis3.PmQ, E1, scalar, &E1basis6.PmQ); - ec_mul(&pushedbasis3.P, E1, scalar, &pushedbasis6->P); - ec_mul(&pushedbasis3.Q, E1, scalar, &pushedbasis6->Q); - ec_mul(&pushedbasis3.PmQ, E1, scalar, &pushedbasis6->PmQ); - } - - // compute the kernel of the challenge isogeny - ec_point_t ker; - { - digit_t scalars[2][NWORDS_FIELD]; - ibz_to_digit_array(scalars[0], &(*hash)[0]); - ibz_to_digit_array(scalars[1], &(*hash)[1]); - ec_biscalar_mul(&ker, E1, scalars[0], scalars[1], &E1basis6); - } - ec_point_t ker2, ker3; - { - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &TORSION_PLUS_3POWER); - ec_mul(&ker2, E1, scalar, &ker); - ibz_to_digit_array(scalar, &TORSION_PLUS_2POWER); - ec_mul(&ker3, E1, scalar, &ker); - } - - // compute ideal corresponding to the challenge isogeny, pulled back to O0 - { - // compute the logarithm of the kernel with respect to the pushed basis - ibz_vec_2_t vec2, vec3; - ibz_vec_2_init(&vec2); - ibz_vec_2_init(&vec3); - digit_t log[2][NWORDS_FIELD]; - - ec_dlog_2(log[0], log[1], &pushedbasis2, &ker2, E1); - - ibz_copy_digit_array(&vec2[0], log[0]); - ibz_copy_digit_array(&vec2[1], log[1]); - - ec_dlog_3(log[0], log[1], &pushedbasis3, &ker3, E1); - - ibz_copy_digit_array(&vec3[0], log[0]); - ibz_copy_digit_array(&vec3[1], log[1]); - - // now compute the ideal - id2iso_kernel_dlogs_to_ideal(ideal, &vec2, &vec3); - - ibz_vec_2_finalize(&vec2); - ibz_vec_2_finalize(&vec3); - assert(!ibz_cmp(&ideal->norm, &DEGREE_CHALLENGE)); - } - - // compute the isogeny, evaluate at suitable point to find kernel of dual - ec_curve_t Emid, E2comp, E2; - ec_point_t pts[2]; - ec_isom_t E2isom; - { - ec_isog_even_t isog2 = {.curve = *E1, .length = TORSION_PLUS_EVEN_POWER, .kernel = ker2}; - - // find a point independent to the kernel to push it through - { - bool const bit2 = !ibz_divides(&(*hash)[0], &ibz_const_two); - bool const bit3 = !ibz_divides(&(*hash)[0], &ibz_const_three); - if (bit2 == bit3) { - pts[0] = bit2 ? E1basis6.Q : E1basis6.P; - } - else { - digit_t scalars[2][NWORDS_FIELD]; - ibz_to_digit_array(scalars[bit3], &TORSION_PLUS_2POWER); - ibz_to_digit_array(scalars[bit2], &TORSION_PLUS_3POWER); - ec_biscalar_mul(&pts[0], E1, scalars[0], scalars[1], &E1basis6); - } - } - pts[1] = ker; - - ec_eval_even(&Emid, &isog2, pts, 2); - assert(!fp2_is_zero(&Emid.C)); - - assert(TORSION_ODD_PRIMES[0] == 3); - ec_isog_odd_t isog3 = {.curve = Emid, .degree = {TORSION_ODD_POWERS[0]}, .ker_plus = pts[1]}; - - ec_eval_odd(&E2comp, &isog3, pts, 1); - assert(!fp2_is_zero(&E2comp.C)); - - ec_curve_normalize(&E2, &E2isom, &E2comp); - if (out_E2) *out_E2 = E2; - - ec_iso_eval(&pts[0], &E2isom); - } - // now the kernel of the dual is in pts[0] - - // decompose kernel of dual over deterministic 2*3*-torsion basis on E2 - ibz_vec_2_t vec2, vec3; - ibz_vec_2_init(&vec2); - ibz_vec_2_init(&vec3); - ec_basis_t E2basis6; - { - ec_basis_t E2basis2, E2basis3; - ec_curve_to_basis_6(&E2basis6, &E2); - - // set up the 2-power and 3-power bases as images of the 2*3*-torsion one - { - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &TORSION_PLUS_3POWER); - ec_mul(&E2basis2.P, &E2, scalar, &E2basis6.P); - ec_mul(&E2basis2.Q, &E2, scalar, &E2basis6.Q); - ec_mul(&E2basis2.PmQ, &E2, scalar, &E2basis6.PmQ); - ibz_to_digit_array(scalar, &TORSION_PLUS_2POWER); - ec_mul(&E2basis3.P, &E2, scalar, &E2basis6.P); - ec_mul(&E2basis3.Q, &E2, scalar, &E2basis6.Q); - ec_mul(&E2basis3.PmQ, &E2, scalar, &E2basis6.PmQ); - } - - // compute the 2-power and 3-power parts of the kernel of the dual - { - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &TORSION_PLUS_2POWER); - ec_mul(&pts[1], &E2, scalar, &pts[0]); - ibz_to_digit_array(scalar, &TORSION_PLUS_3POWER); - ec_mul(&pts[0], &E2, scalar, &pts[0]); - } - - // now compute the logarithms - { - digit_t scalars[2][NWORDS_FIELD]; - - ec_dlog_2(scalars[0], scalars[1], &E2basis2, &pts[0], &E2); - ibz_copy_digit_array(&vec2[0], scalars[0]); - ibz_copy_digit_array(&vec2[1], scalars[1]); -//ibz_vec_2_print(&vec2); -#ifndef NDEBUG -{ - ec_point_t tmp; - ec_biscalar_mul(&tmp, &E2, scalars[0], scalars[1], &E2basis2); - assert(ec_is_equal(&tmp, &pts[0])); -} -#endif - - ec_dlog_3(scalars[0], scalars[1], &E2basis3, &pts[1], &E2); - ibz_copy_digit_array(&vec3[0], scalars[0]); - ibz_copy_digit_array(&vec3[1], scalars[1]); -//ibz_vec_2_print(&vec3); -#ifndef NDEBUG -{ - ec_point_t tmp; - ec_biscalar_mul(&tmp, &E2, scalars[0], scalars[1], &E2basis3); - assert(ec_is_equal(&tmp, &pts[1])); -} -#endif - } - } - - // encode this projective vector in the signature field s - bool const bit2 = !ibz_divides(&vec2[0], &ibz_const_two); - bool const bit3 = !ibz_divides(&vec3[0], &ibz_const_three); - { - assert(!ibz_divides(&vec2[!bit2], &ibz_const_two)); - assert(!ibz_divides(&vec3[!bit3], &ibz_const_three)); - - { - ibz_t inv; - ibz_init(&inv); - - ibz_invmod(&inv, &vec2[!bit2], &TORSION_PLUS_2POWER); - ibz_mul(&vec2[bit2], &vec2[bit2], &inv); - ibz_mod(&vec2[bit2], &vec2[bit2], &TORSION_PLUS_2POWER); - ibz_set(&vec2[!bit2], 1); - - ibz_invmod(&inv, &vec3[!bit3], &TORSION_PLUS_3POWER); - ibz_mul(&vec3[bit3], &vec3[bit3], &inv); - ibz_mod(&vec3[bit3], &vec3[bit3], &TORSION_PLUS_3POWER); - ibz_set(&vec3[!bit3], 1); - - ibz_finalize(&inv); - } -//printf("bit2=%u bit3=%u\n", (unsigned) bit2, (unsigned) bit3); -//ibz_vec_2_print(&vec2); -//ibz_vec_2_print(&vec3); - - sig->s.select23 = bit2 | ((unsigned) bit3 << 1); - ibz_to_digit_array(sig->s.scalar2, &vec2[bit2]); - ibz_to_digit_array(sig->s.scalar3, &vec3[bit3]); - } - - // find another independent point R deterministically - ec_point_t R; - if (bit2 == bit3) { - R = bit2 ? E2basis6.Q : E2basis6.P; - } - else { - digit_t scalars[2][NWORDS_FIELD]; - ibz_to_digit_array(scalars[bit3], &TORSION_PLUS_2POWER); - ibz_to_digit_array(scalars[bit2], &TORSION_PLUS_3POWER); - ec_biscalar_mul(&R, &E2, scalars[0], scalars[1], &E2basis6); - } - - // evaluate the dual of the challenge isogeny - { - { - ec_isom_t E2isom_inv = E2isom; - ec_iso_inv(&E2isom_inv); - ec_iso_eval(&pts[0], &E2isom_inv); - ec_iso_eval(&pts[1], &E2isom_inv); - ec_iso_eval(&R, &E2isom_inv); - } - - assert(TORSION_ODD_PRIMES[0] == 3); - ec_isog_odd_t isog3dual = {.curve = E2comp, .degree = {TORSION_ODD_POWERS[0]}, .ker_plus = pts[1]}; - ec_curve_t Emidcomp; - pts[1] = R; - ec_eval_odd(&Emidcomp, &isog3dual, pts, 2); - assert(!fp2_is_zero(&Emidcomp.C)); -#ifndef NDEBUG -{ - fp2_t j1, j2; - ec_j_inv(&j1, &Emid); - ec_j_inv(&j2, &Emidcomp); - assert(fp2_is_equal(&j1, &j2)); -} -#endif - - R = pts[1]; - - ec_isog_even_t isog2dual = {.curve = Emidcomp, .length = TORSION_PLUS_EVEN_POWER, .kernel = pts[0]}; - ec_curve_t E1comp; - ec_eval_even(&E1comp, &isog2dual, &R, 1); - assert(!fp2_is_zero(&E1comp.C)); -#ifndef NDEBUG -{ - fp2_t j1, j2; - ec_j_inv(&j1, E1); - ec_j_inv(&j2, &E1comp); - assert(fp2_is_equal(&j1, &j2)); -} -#endif - - { - ec_isom_t E1isom; - ec_isomorphism(&E1isom, &E1comp, E1); - ec_iso_eval(&R, &E1isom); - } - } - - ibz_t r; - ibz_init(&r); - //TODO this should just be a 1-dimensional logarithm in the 2*3*-torsion - { - ec_point_t R2, R3; - { - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &TORSION_PLUS_3POWER); - ec_mul(&R2, E1, scalar, &R); - ibz_to_digit_array(scalar, &TORSION_PLUS_2POWER); - ec_mul(&R3, E1, scalar, &R); - } - - ibz_vec_2_t log2, log3; - ibz_vec_2_init(&log2); - ibz_vec_2_init(&log3); - { - digit_t scalars[2][NWORDS_FIELD] = {0}; - ec_dlog_2(scalars[0], scalars[1], &E1basis2, &R2, E1); -#ifndef NDEBUG -{ - ec_point_t tmp; - ec_biscalar_mul(&tmp, E1, scalars[0], scalars[1], &E1basis2); - assert(ec_is_equal(&tmp, &R2)); -} -#endif - ibz_copy_digit_array(&log2[0], scalars[0]); - ibz_copy_digit_array(&log2[1], scalars[1]); - memset(scalars, 0, sizeof(scalars)); - ec_dlog_3(scalars[0], scalars[1], &E1basis3, &R3, E1); -#ifndef NDEBUG -{ - ec_point_t tmp; - ec_biscalar_mul(&tmp, E1, scalars[0], scalars[1], &E1basis3); - assert(ec_is_equal(&tmp, &R3)); -} -#endif - ibz_copy_digit_array(&log3[0], scalars[0]); - ibz_copy_digit_array(&log3[1], scalars[1]); -#ifndef NDEBUG -{ -ibz_t lhs, rhs; -ibz_init(&lhs); -ibz_init(&rhs); -// check log2 is a multiple of hash modulo 2* -ibz_mul(&lhs, &log2[0], &(*hash)[1]); -ibz_mul(&rhs, &log2[1], &(*hash)[0]); -ibz_mod(&lhs, &lhs, &TORSION_PLUS_2POWER); -ibz_mod(&rhs, &rhs, &TORSION_PLUS_2POWER); -assert(!ibz_cmp(&lhs, &rhs)); -// check log3 is a multiple of hash modulo 3* -ibz_mul(&lhs, &log3[0], &(*hash)[1]); -ibz_mul(&rhs, &log3[1], &(*hash)[0]); -ibz_mod(&lhs, &lhs, &TORSION_PLUS_3POWER); -ibz_mod(&rhs, &rhs, &TORSION_PLUS_3POWER); -assert(!ibz_cmp(&lhs, &rhs)); -ibz_finalize(&lhs); -ibz_finalize(&rhs); -} -#endif - - { - ibz_t r2, r3; - ibz_init(&r2); - ibz_init(&r3); - bool bit = ibz_divides(&log2[0], &ibz_const_two); - assert(!ibz_divides(&log2[bit], &ibz_const_two)); - ibz_invmod(&r2, &log2[bit], &TORSION_PLUS_2POWER); - ibz_mul(&r2, &(*hash)[bit], &r2); - ibz_mod(&r2, &r2, &TORSION_PLUS_2POWER); -//ibz_printf("r2 = %#Zx\n", &r2); -#ifndef NDEBUG -{ - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &r2); - ec_point_t T1, T2; - ec_mul(&T1, E1, scalar, &R); - ibz_to_digit_array(scalar, &TORSION_PLUS_3POWER); - ec_mul(&T1, E1, scalar, &T1); - ec_mul(&T2, E1, scalar, &ker); - assert(ec_is_equal(&T1, &T2)); -} -#endif - bit = ibz_divides(&log3[0], &ibz_const_three); - assert(!ibz_divides(&log3[bit], &ibz_const_three)); - ibz_invmod(&r3, &log3[bit], &TORSION_PLUS_3POWER); - ibz_mul(&r3, &(*hash)[bit], &r3); - ibz_mod(&r3, &r3, &TORSION_PLUS_3POWER); -//ibz_printf("r3 = %#Zx\n", &r3); -#ifndef NDEBUG -{ - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &r3); - ec_point_t T1, T2; - ec_mul(&T1, E1, scalar, &R); - ibz_to_digit_array(scalar, &TORSION_PLUS_2POWER); - ec_mul(&T1, E1, scalar, &T1); - ec_mul(&T2, E1, scalar, &ker); - assert(ec_is_equal(&T1, &T2)); -} -#endif - ibz_crt(&r, &r2, &r3, &TORSION_PLUS_2POWER, &TORSION_PLUS_3POWER); - // check if we mixed up the signs and correct it in that case - { - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &r); - ec_point_t T; - ec_mul(&T, E1, scalar, &R); - if (!ec_is_equal(&T, &ker)) { - ibz_sub(&r3, &TORSION_PLUS_3POWER, &r3); - ibz_crt(&r, &r2, &r3, &TORSION_PLUS_2POWER, &TORSION_PLUS_3POWER); - } - } - ibz_finalize(&r2); - ibz_finalize(&r3); - } - } - - ibz_vec_2_finalize(&log2); - ibz_vec_2_finalize(&log3); - ibz_vec_2_finalize(&vec2); - ibz_vec_2_finalize(&vec3); - } -#ifndef NDEBUG -{ - digit_t scalar[NWORDS_FIELD]; - ibz_to_digit_array(scalar, &r); - ec_point_t T; - ec_mul(&T, E1, scalar, &R); - assert(ec_is_equal(&T, &ker)); -assert(!ibz_divides(&r, &ibz_const_two)); -assert(!ibz_divides(&r, &ibz_const_three)); -} -#endif - - ibz_to_digit_array(sig->r, &r); - - ibz_finalize(&r); -} - - - -int protocols_sign(signature_t *sig,const public_key_t *pk, const secret_key_t *sk, const unsigned char* m, size_t l) { - - // var dec - quat_order_t right_order_key; - quat_left_ideal_t ideal_commit,ideal_challenge; - quat_alg_elem_t gen,gen_small,gen_answer,delta; - ibq_t ibq_norm; - ibz_t norm,temp,remainder; - ibz_mat_4x4_t reduced,gram; - quat_alg_coord_t coeffs; - - quat_left_ideal_t ideal_comchall,ideal_seccomchall; - quat_left_ideal_t ideal_eichler_rand; - quat_left_ideal_t ideal_pullback,ideal_input_klpt; - quat_alg_elem_t gen_challenge; - - - // var init - ibq_init(&ibq_norm); - ibz_init(&norm);ibz_init(&temp); - ibz_init(&remainder); - quat_order_init(&right_order_key); - quat_left_ideal_init(&ideal_commit); - quat_left_ideal_init(&ideal_challenge); - quat_alg_elem_init(&gen); - quat_alg_elem_init(&gen_small); - quat_alg_elem_init(&delta); - ibz_mat_4x4_init(&reduced); - ibz_mat_4x4_init(&gram); - quat_alg_coord_init(&coeffs); - quat_left_ideal_init(&ideal_comchall); - quat_left_ideal_init(&ideal_seccomchall); - quat_left_ideal_init(&ideal_eichler_rand); - quat_left_ideal_init(&ideal_pullback); - quat_left_ideal_init(&ideal_input_klpt); - quat_alg_elem_init(&gen_challenge); - - - ec_curve_t curve = sk->curve; - ec_basis_t basis_plus = sk->basis_plus; - ec_basis_t basis_minus = sk->basis_minus; - ec_point_t kernel_dual = sk->kernel_dual; - - // Commitment (computes ideal_commit and pushes the 2*3*-torsion basis) - ec_curve_t E1; - ec_basis_t E1basis = BASIS_CHALLENGE; - { - protocols_commit(&ideal_commit, &E1, &E1basis); - - assert(!fp2_is_zero(&E1.C)); - assert(!fp2_is_zero(&E1basis.P.z) && !fp2_is_zero(&E1basis.Q.z) && !fp2_is_zero(&E1basis.PmQ.z)); - } - - - // Challenge (computes ideal_challenge and sig->r, sig->s) - ec_curve_t E2_for_testing; //XXX - { - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - hash_to_challenge(&vec, &E1, m, l); - - protocols_challenge(&ideal_challenge, sig, &E1, &E1basis, &vec, &E2_for_testing); - - ibz_vec_2_finalize(&vec); - } - assert(ibz_get(&ideal_commit.norm)%2!=0); - - // ideal_comchall is the intersectin of ideal_commit and ideal_challenge - quat_lideal_inter(&ideal_comchall,&ideal_challenge,&ideal_commit,&QUATALG_PINFTY); - - #ifndef NDEBUG - // debug the norm - ibz_mul(&temp,&ideal_commit.norm,&ideal_challenge.norm); - assert(0==ibz_cmp(&temp,&ideal_comchall.norm)); - #endif - - int lideal_generator_ok = quat_lideal_generator(&gen,&ideal_comchall,&QUATALG_PINFTY,0); - assert(lideal_generator_ok); - // computing the generator of ideal seccomchall as gen = sk.gen_two * gen - quat_alg_elem_copy(&gen_challenge,&gen); - quat_alg_norm(&ibq_norm,&gen_challenge,&QUATALG_PINFTY); - ibq_to_ibz(&norm,&ibq_norm); - - // computing a good norm element for sk.lideal_small - lideal_generator_ok = quat_lideal_generator_coprime(&gen_small,&sk->lideal_small,&norm,&QUATALG_PINFTY,0); - assert(lideal_generator_ok); - quat_alg_conj(&gen_small,&gen_small); - quat_alg_normalize(&gen_small); - - // gen = gen_small * gen_challenge - quat_alg_mul(&gen,&gen_small,&gen_challenge,&QUATALG_PINFTY); - ibz_mul(&temp,&ideal_comchall.norm,&sk->lideal_small.norm); - quat_alg_normalize(&gen); - - // computing of the right order of lideal_small - quat_lideal_right_order(&right_order_key,&sk->lideal_small,&QUATALG_PINFTY); - assert(quat_lattice_contains(&coeffs,&right_order_key,&gen,&QUATALG_PINFTY)); - - // creation of ideal_seccomchall - quat_lideal_make_primitive_then_create(&ideal_seccomchall,&gen,&temp,&right_order_key,&QUATALG_PINFTY); - - // copying a generator for later - quat_alg_elem_copy(&gen_challenge,&gen); - - - #ifndef NDEBUG - // debug the norm - ibz_mul(&temp,&ideal_comchall.norm,&sk->lideal_small.norm); - assert(0==ibz_cmp(&temp,&ideal_seccomchall.norm)); - #endif - - int found = 0; - - for (unsigned attempt = 0; !found && attempt < SQISIGN_response_attempts; ++attempt) { - // TODUPDATE add a random ideal of norm 2^SQISIGN_random_length (right now SQISIGN_random_length ) - - // now we are computing a small ideal equivalent to ideal_seccomchall - //TODUPDATE replace with another randomization to ensure a good distribution in the eichler order class set - quat_lideal_reduce_basis(&reduced,&gram,&ideal_seccomchall,&QUATALG_PINFTY); - found = klpt_lideal_equiv(&gen,&temp,&reduced,&gram,&ideal_seccomchall.norm,&ideal_seccomchall.lattice.denom,&QUATALG_PINFTY); - if (!found) { - continue; - } - // quat_alg_elem_copy(&gen_challenge,&gen); - quat_alg_conj(&gen_challenge,&gen); - - // computing ideal_eichler_rand = right_order_key < gen, temp > - quat_lideal_create_from_primitive(&ideal_eichler_rand,&gen,&temp,&right_order_key,&QUATALG_PINFTY); - - assert(quat_lideal_isom(&delta,&ideal_eichler_rand,&ideal_seccomchall,&QUATALG_PINFTY)); - - // computing the pullback through sk->lideal_small - quat_alg_mul(&gen,&gen_small,&gen,&QUATALG_PINFTY); - quat_alg_normalize(&gen); - quat_lideal_create_from_primitive(&ideal_pullback,&gen,&ideal_eichler_rand.norm,&MAXORD_O0,&QUATALG_PINFTY); - - // computing the final input ideal as equivalent to ideal_pullback - quat_lideal_reduce_basis(&reduced,&gram,&ideal_pullback,&QUATALG_PINFTY); - found = found && klpt_lideal_equiv(&gen,&temp,&reduced,&gram,&ideal_pullback.norm,&ideal_pullback.lattice.denom,&QUATALG_PINFTY); - // ruling out failure, or extreme values of gen - if (!found || 0==ibz_cmp(&gen.coord[0],&ibz_const_zero) || 0==ibz_cmp(&gen.coord[1],&ibz_const_zero)) { - found = 0; - continue; - - } - - // creating this ideal - quat_lideal_create_from_primitive(&ideal_input_klpt,&gen,&temp,&MAXORD_O0,&QUATALG_PINFTY); - assert(quat_lideal_isom(&delta,&ideal_input_klpt,&ideal_pullback,&QUATALG_PINFTY)); - - // applying klpt - quat_alg_conj(&delta,&gen); - #ifndef NDEBUG - assert(quat_lattice_contains(&coeffs,&ideal_pullback.lattice,&delta,&QUATALG_PINFTY)); - #endif - - - // applying signing klpt - found = klpt_signing_klpt(&gen,&ideal_input_klpt,&sk->lideal_small,&delta,&QUATALG_PINFTY); - if (!found) { - continue; - - } - assert(quat_lattice_contains(&coeffs,&ideal_input_klpt.lattice,&gen,&QUATALG_PINFTY)); - - // gen = gen *delta /norm(ideal_input_klpt) - quat_alg_mul(&gen,&gen,&delta,&QUATALG_PINFTY); - ibz_mul(&gen.denom,&gen.denom,&ideal_input_klpt.norm); - quat_alg_normalize(&gen); - - // for debug we check that gen is contained in the right order and ideal - assert(quat_lattice_contains(&coeffs,&ideal_pullback.lattice,&gen,&QUATALG_PINFTY)); - assert(quat_lattice_contains(&coeffs,&right_order_key,&gen,&QUATALG_PINFTY)); - - // gen = conjugate(gen) - // gen should be the generator of the ideal to be translated - quat_alg_conj(&gen,&gen); - - - #ifndef NDEBUG - quat_left_ideal_t ideal_signing_test; - quat_left_ideal_init(&ideal_signing_test); - ibz_pow(&temp,&ibz_const_two,KLPT_signing_klpt_length); - quat_lideal_create_from_primitive(&ideal_signing_test,&gen,&temp,&right_order_key,&QUATALG_PINFTY); - assert(quat_lideal_isom(&delta,&ideal_signing_test,&ideal_seccomchall,&QUATALG_PINFTY)); - assert(quat_lideal_isom(&delta,&ideal_eichler_rand,&ideal_seccomchall,&QUATALG_PINFTY)); - assert(quat_lideal_isom(&delta,&ideal_eichler_rand,&ideal_seccomchall,&QUATALG_PINFTY)); - assert(0==ibz_cmp(&temp,&ideal_signing_test.norm)); - quat_alg_conj(&delta,&gen); - quat_lideal_create_from_primitive(&ideal_signing_test,&delta,&ideal_eichler_rand.norm,&right_order_key,&QUATALG_PINFTY); - assert(quat_lideal_equals(&ideal_signing_test,&ideal_eichler_rand,&QUATALG_PINFTY)); - quat_left_ideal_finalize(&ideal_signing_test); - #endif - - // checking cyclicity - quat_alg_conj(&delta,&gen); - assert(quat_lattice_contains(&coeffs,&ideal_eichler_rand.lattice,&delta,&QUATALG_PINFTY)); - // quat_alg_elem_copy(&delta,&gen); - quat_alg_mul(&delta,&delta,&gen_challenge,&QUATALG_PINFTY); - ibz_mul(&delta.denom,&delta.denom,&ideal_eichler_rand.norm); - quat_alg_normalize(&delta); - assert(quat_lattice_contains(&coeffs,&right_order_key,&delta,&QUATALG_PINFTY)); - found = found && quat_alg_is_primitive(&delta,&right_order_key,&QUATALG_PINFTY); - if (!found) { - continue; - } - - assert(SQISIGN_signing_length == KLPT_signing_klpt_length/TORSION_PLUS_EVEN_POWER); - - found = found && id2iso_ideal_to_isogeny_two_long_power_of_2(&sig->zip,&curve,&basis_minus,&basis_plus,&kernel_dual,&gen,SQISIGN_signing_length,&sk->lideal_small,&sk->lideal_two,&sk->gen_two,&QUATALG_PINFTY); - } - - // if (!found) - // return found; - - // quick check to see if we got the correct curve in the end -#ifndef NDEBUG - if (found) { - fp2_t jchall, jresp; - ec_j_inv(&jchall, &E2_for_testing); - ec_j_inv(&jresp, &curve); - assert(fp2_is_equal(&jchall, &jresp)); - } else { - printf("signature failed \n"); - } -#endif - - // var finalize - ibq_finalize(&ibq_norm); - ibz_finalize(&norm);ibz_finalize(&temp); - ibz_finalize(&remainder); - quat_order_finalize(&right_order_key); - quat_left_ideal_finalize(&ideal_commit); - quat_left_ideal_finalize(&ideal_challenge); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&gen_small); - quat_alg_elem_finalize(&delta); - ibz_mat_4x4_finalize(&reduced); - ibz_mat_4x4_finalize(&gram); - quat_alg_coord_finalize(&coeffs); - quat_left_ideal_finalize(&ideal_comchall); - quat_left_ideal_finalize(&ideal_seccomchall); - quat_left_ideal_finalize(&ideal_eichler_rand); - quat_left_ideal_finalize(&ideal_pullback); - quat_left_ideal_finalize(&ideal_input_klpt); - quat_alg_elem_finalize(&gen_challenge); - - return found; -} - diff --git a/src/protocols/ref/protocolsx/test/challenge.c b/src/protocols/ref/protocolsx/test/challenge.c deleted file mode 100644 index 3ae8d74..0000000 --- a/src/protocols/ref/protocolsx/test/challenge.c +++ /dev/null @@ -1,83 +0,0 @@ - -#include - -#include -#include -#include -#include -#include "test_protocols.h" - -static void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -static void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} - - -int test_challenge() -{ - int res = 1; - - quat_left_ideal_t ideal_comm, ideal_chall; - quat_left_ideal_init(&ideal_comm); - quat_left_ideal_init(&ideal_chall); - - // commitment - ec_curve_t E1; - ec_basis_t E1basis = BASIS_CHALLENGE; - protocols_commit(&ideal_comm, &E1, &E1basis); -// curve_print("E1", E1); - - signature_t sig = {{0}, {0xcafecafecafecafe}, {0xcc, {0xdeadbeef}, {0xdeadbeef}}}; - { - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - char msg[] = "Hello, world!"; - hash_to_challenge(&vec, &E1, (unsigned char *) msg, strlen(msg)); -// ibz_vec_2_print(&vec); - - protocols_challenge(&ideal_chall, &sig, &E1, &E1basis, &vec, NULL); -// quat_left_ideal_print(&ideal_chall); -{ -// printf("r = 0x"); -if (0) { -for (ssize_t i = sizeof(sig.r)/sizeof(*sig.r)-1; i >= 0; --i) - printf("%016" PRIx64, sig.r[i]); -printf("\n"); -printf("s.bit2 = %u\n", !!(sig.s.select23 & 1)); -printf("s.bit3 = %u\n", !!(sig.s.select23 & 2)); -printf("s.scalar2 = 0x"); -for (ssize_t i = sizeof(sig.s.scalar2)/sizeof(*sig.s.scalar2)-1; i >= 0; --i) - printf("%016" PRIx64, sig.s.scalar2[i]); -printf("\n"); -printf("s.scalar3 = 0x"); -for (ssize_t i = sizeof(sig.s.scalar3)/sizeof(*sig.s.scalar3)-1; i >= 0; --i) - printf("%016" PRIx64, sig.s.scalar3[i]); -printf("\n"); -} -} - ibz_vec_2_finalize(&vec); - } - - quat_left_ideal_finalize(&ideal_comm); - quat_left_ideal_finalize(&ideal_chall); - - return res; -} - diff --git a/src/protocols/ref/protocolsx/test/commitment.c b/src/protocols/ref/protocolsx/test/commitment.c deleted file mode 100644 index 02717d1..0000000 --- a/src/protocols/ref/protocolsx/test/commitment.c +++ /dev/null @@ -1,56 +0,0 @@ - -#include -#include -#include -#include -#include "test_protocols.h" - - -static void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -static void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} - -bool curve_is_canonical(ec_curve_t const *E); // test_protocols.c - -int test_commitment() -{ - int res = 1; - - quat_left_ideal_t ideal; - quat_left_ideal_init(&ideal); - - ec_curve_t E1; - ec_basis_t E1basis = BASIS_CHALLENGE; - - protocols_commit(&ideal, &E1, &E1basis); - - res &= !ibz_cmp(&ideal.norm, &DEGREE_COMMITMENT); - - res &= curve_is_canonical(&E1); - -// quat_left_ideal_print(&ideal); - res &= !fp2_is_zero(&E1.C); -// curve_print("E1", E1); - - quat_left_ideal_finalize(&ideal); - - return res; -} - diff --git a/src/protocols/ref/protocolsx/test/encode.c b/src/protocols/ref/protocolsx/test/encode.c deleted file mode 100644 index 1d9e340..0000000 --- a/src/protocols/ref/protocolsx/test/encode.c +++ /dev/null @@ -1,104 +0,0 @@ -#include - -#include -#include -#include -#include "test_protocols.h" - -#include "../encode.c" - - -static int test_ibz_encdec() { - int res = 1; - ibz_t nm, nm_rec; - ibz_init(&nm_rec); - - { - ibz_set_from_str(&nm, "8892374823748723894723847892374897234897238478923748237", 16); - int nm_bits = ibz_bitsize(&nm); - int nm_bytes = (nm_bits + 7) / 8; - unsigned char *enc = malloc(nm_bytes); - - ibz_encode(enc, &nm, nm_bytes); - - ibz_decode(&nm_rec, enc, nm_bytes); - - res &= (ibz_cmp(&nm, &nm_rec) == 0); - - free(enc); - ibz_finalize(&nm); - } - - { - ibz_set_from_str(&nm, "-123", 16); - int nm_bits = 23; - int nm_bytes = (nm_bits + 7) / 8; - unsigned char *enc = malloc(nm_bytes); - - ibz_encode(enc, &nm, nm_bytes); - - ibz_decode(&nm_rec, enc, nm_bytes); - - res &= (ibz_cmp(&nm, &nm_rec) == 0); - - free(enc); - ibz_finalize(&nm); - } - - ibz_finalize(&nm_rec); - return res; -} - - -static void print_fp2(const fp2_t d, int len) { - printf("re: "); - for (int i = 0; i < len; ++i) { - printf("%016" PRIx64 " ", d.re[i]); - } printf("\n"); - printf("im: "); - for (int i = 0; i < len; ++i) { - printf("%016" PRIx64 " ", d.im[i]); - } printf("\n"); -} -static void print_pk(const public_key_t *pk) { - print_fp2(pk->E.A, NWORDS_FIELD); - print_fp2(pk->E.C, NWORDS_FIELD); -} - -static int test_with_key(public_key_t *pk, secret_key_t *sk) { - printf("Encoded bytes: %d\n", PUBLICKEY_BYTES); - printf("pkenc\n"); - print_pk(pk); - unsigned char *pkEnc = malloc(PUBLICKEY_BYTES); - unsigned char *pkEnc2 = malloc(PUBLICKEY_BYTES); - - public_key_t pkdec = { 0 }; - - public_key_encode(pkEnc, pk); - - public_key_decode(&pkdec, pkEnc); - printf("pkdec\n"); - print_pk(&pkdec); - - public_key_encode(pkEnc2, &pkdec); - - int res = !memcmp(pkEnc, pkEnc2, PUBLICKEY_BYTES); - - free(pkEnc); - free(pkEnc2); - return res; -} - -int test_encode() { - int res = 1; - - public_key_t pk; - secret_key_t sk; - secret_key_init(&sk); - - res= res & protocols_keygen(&pk,&sk); - res = res & test_with_key(&pk, &sk); - - secret_key_finalize(&sk); - return res; -} diff --git a/src/protocols/ref/protocolsx/test/keygen.c b/src/protocols/ref/protocolsx/test/keygen.c deleted file mode 100644 index 8ea403a..0000000 --- a/src/protocols/ref/protocolsx/test/keygen.c +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include -#include "test_protocols.h" - -bool curve_is_canonical(ec_curve_t const *E); // test_protocols.c - -int test_inner_keygen() { - - int res = 1; - public_key_t pk; - secret_key_t sk; - secret_key_init(&sk); - - res &= protocols_keygen(&pk, &sk); - res &= curve_is_canonical(&sk.curve); - res &= curve_is_canonical(&pk.E); - - secret_key_finalize(&sk); - return res; -} - -int test_keygen() { - - int res = 1; - - for (int i = 0; i<1; i++) { - res &= test_inner_keygen(); - } - - return 1; -} diff --git a/src/protocols/ref/protocolsx/test/test_protocols.c b/src/protocols/ref/protocolsx/test/test_protocols.c deleted file mode 100644 index 600a457..0000000 --- a/src/protocols/ref/protocolsx/test/test_protocols.c +++ /dev/null @@ -1,88 +0,0 @@ -#include -#include -#include -#include - -#include "test_protocols.h" - - - - -//XXX FIXME stolen from src/ec/opt/generic/test/isog-test.c -void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -void point_print(char *name, ec_point_t P){ - fp2_t a; - if(fp2_is_zero(&P.z)){ - printf("%s = INF\n", name); - } - else{ - fp2_copy(&a, &P.z); - fp2_inv(&a); - fp2_mul(&a, &a, &P.x); - fp2_print(name, a); - } -} - -void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} -//XXX - - -bool curve_is_canonical(ec_curve_t const *E) -{ - ec_curve_t EE; - ec_isom_t isom; - ec_curve_normalize(&EE, &isom, E); - - fp2_t lhs, rhs; - fp2_mul(&lhs, &E->A, &EE.C); - fp2_mul(&rhs, &E->C, &EE.A); - return fp2_is_equal(&lhs, &rhs); -} - - -// run all tests in module -int main(){ - int res = 1; - - randombytes_init((unsigned char *) "some", (unsigned char *) "string", 128); - - // printf("\nRunning encoding tests\n"); - // res &= test_encode(); - - printf("\nRunning protocols module unit tests\n \n"); - - printf("\nRunning keygen tests\n \n"); - res &= test_keygen(); - - printf("\nRunning signature tests\n \n"); - res &= test_commitment(); - res &= test_challenge(); - res &= test_sign_verif(); - - - if(!res){ - printf("\nSome tests failed!\n"); - } - else { - printf("All tests passed!\n"); - } - return(!res); -} diff --git a/src/protocols/ref/protocolsx/test/test_protocols.h b/src/protocols/ref/protocolsx/test/test_protocols.h deleted file mode 100644 index 6236a58..0000000 --- a/src/protocols/ref/protocolsx/test/test_protocols.h +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -/** @internal - * @ingroup protocols_protocols - * @defgroup protocols_tests Test functions for proocols - * @{ - */ -int test_commitment(); -int test_challenge(); -int test_sign_verif(); -int test_keygen(); -int test_sign(); -int test_encode(); -/** @} - */ \ No newline at end of file diff --git a/src/protocols/ref/protocolsx/test/verif.c b/src/protocols/ref/protocolsx/test/verif.c deleted file mode 100644 index 19bd654..0000000 --- a/src/protocols/ref/protocolsx/test/verif.c +++ /dev/null @@ -1,153 +0,0 @@ - -#include -#include - -#include -#include -#include -#include -#include "test_protocols.h" -#include - -static __inline__ uint64_t rdtsc(void) -{ - return (uint64_t) cpucycles(); -} - -static void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -static void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} - -int test_full_verif() { - int res = 1; - public_key_t pk; - secret_key_t sk; - secret_key_init(&sk); - -setlocale(LC_NUMERIC, ""); -uint64_t t0, t1; - - -t0 = rdtsc(); - res= res & protocols_keygen(&pk,&sk); - if (!res) { - printf("keygen failed \n"); - } -t1 = rdtsc(); -// printf("\x1b[34mkeygen took %'" PRIu64 " cycles\x1b[0m\n", t1-t0); - - // printf(" \n\n keygen done \n\n"); - - // init the sig - signature_t sig; - signature_init(&sig); -t0 = rdtsc(); - res = res & protocols_sign(&sig,&pk,&sk,(unsigned char*)"test",4); - if (!res) { - printf("sign failed \n"); - } - - -t1 = rdtsc(); -// printf("\x1b[34msigning took %'" PRIu64 " cycles\x1b[0m\n", t1-t0); - - assert(res); - // printf(" \n signing done \n"); - - - // printf(" \n starting verification \n "); - -// t0 = rdtsc(); - res = res & protocols_verif(&sig,&pk,(unsigned char*)"test",4); -// t1 = rdtsc(); -// printf("\x1b[34mverifying took %'" PRIu64 " cycles\x1b[0m\n", t1-t0); - - printf(" \x1b[35mfull\x1b[0m signature was: %s\n\n", res ? "\x1b[32mvalid\x1b[0m" : "\x1b[31minvalid\x1b[0m"); - - - signature_finalize(&sig); - secret_key_finalize(&sk); - - return res; -} - -bool curve_is_canonical(ec_curve_t const *E); // test_protocols.c - -int test_verif_from_chall() -{ - int res = 1; - - quat_left_ideal_t ideal_comm, ideal_chall; - quat_left_ideal_init(&ideal_comm); - quat_left_ideal_init(&ideal_chall); - - // commitment - ec_curve_t E1; - ec_basis_t E1basis = BASIS_CHALLENGE; - protocols_commit(&ideal_comm, &E1, &E1basis); - - // challenge - char const msg[] = "Hello, world!"; - signature_t sig = {{0}, {0xcafecafecafecafe}, {0xcc, {0xdeadbeef}, {0xdeadbeef}}}; - ec_curve_t E2; - { - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - - hash_to_challenge(&vec, &E1, (unsigned char *) msg, strlen(msg)); -//ibz_vec_2_print(&vec); - - protocols_challenge(&ideal_chall, &sig, &E1, &E1basis, &vec, &E2); - - ibz_vec_2_finalize(&vec); - } - - ec_point_t dual; - // now let's check it - int valid = protocols_verif_from_chall(&sig, &E2, &dual, (unsigned char *) msg, strlen(msg)); - printf("\n\x1b[35mchallenge\x1b[0m signature was: %s\n\n", valid ? "\x1b[32mvalid\x1b[0m" : "\x1b[31minvalid\x1b[0m"); - res &= valid; - - res &= curve_is_canonical(&E1); - res &= curve_is_canonical(&E2); - - quat_left_ideal_finalize(&ideal_comm); - quat_left_ideal_finalize(&ideal_chall); - - return res; -} - -int test_sign_verif() -{ - int res = 1; - - for (int i =0;i<2;i++) { - printf("#%d ",i); - res &= test_full_verif(); - } - - if (!res) { - printf("\n Keygen + Sign + Verif failed ! \n"); - } - // res &= test_verif_from_chall(); - - - return res; -} diff --git a/src/protocols/ref/protocolsx/verif.c b/src/protocols/ref/protocolsx/verif.c deleted file mode 100644 index 33a73c7..0000000 --- a/src/protocols/ref/protocolsx/verif.c +++ /dev/null @@ -1,236 +0,0 @@ -#include -#include - -static inline void copy_point(ec_point_t* A, const ec_point_t* B){ - fp2_copy(&A->x, &B->x); - fp2_copy(&A->z, &B->z); -} - -//XXX FIXME stolen from src/ec/opt/generic/test/isog-test.c -static void fp2_print(char *name, fp2_t const a){ - fp2_t b; - fp2_set(&b, 1); - fp2_mul(&b, &b, &a); - printf("%s = 0x", name); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.re[i]); - printf(" + i*0x"); - for(int i = NWORDS_FIELD - 1; i >=0; i--) - printf("%016" PRIx64, b.im[i]); - printf("\n"); -} - -static void curve_print(char *name, ec_curve_t E){ - fp2_t a; - fp2_copy(&a, &E.C); - fp2_inv(&a); - fp2_mul(&a, &a, &E.A); - fp2_print(name, a); -} -//XXX - -static void point_print(char *name, ec_point_t P){ - fp2_t a; - if(fp2_is_zero(&P.z)){ - printf("%s = INF\n", name); - } - else{ - fp2_copy(&a, &P.z); - fp2_inv(&a); - fp2_mul(&a, &a, &P.x); - fp2_print(name, a); - } -} - - -void protocols_verif_unpack_chall(ec_curve_t *E2, ec_point_t *dual, const signature_t *sig, const public_key_t *pk) -{ - // Generate 2^f-basis - ec_basis_t B2; - ec_curve_to_basis_2(&B2, &pk->E); - if(sig->zip.bit_first_step){ - // Swap P and Q - ec_point_t tmp; - copy_point(&tmp, &B2.P); - copy_point(&B2.P, &B2.Q); - copy_point(&B2.Q, &tmp); - } - - // 2^f-isogeny chains - ec_point_t K; - digit_t scalar[NWORDS_FIELD]; - ec_curve_t E; - ec_isog_even_t isog2; - fp2_copy(&E.A, &pk->E.A); - fp2_copy(&E.C, &pk->E.C); - isog2.length = POWER_OF_2; - for(size_t i = 0; i < sig->zip.length-1; i++){ - ibz_to_digit_array(scalar, &sig->zip.zip_chain[i]); - ec_ladder3pt(&K, scalar, &B2.Q, &B2.P, &B2.PmQ, &E); - copy_point(&isog2.kernel, &K); - fp2_copy(&isog2.curve.A, &E.A); - fp2_copy(&isog2.curve.C, &E.C); - ec_eval_even(&E, &isog2, &B2.P, 1); - ec_complete_basis_2(&B2, &E, &B2.P); - } - ibz_to_digit_array(scalar, &sig->zip.zip_chain[sig->zip.length-1]); - ec_ladder3pt(&K, scalar, &B2.Q, &B2.P, &B2.PmQ, &E); - copy_point(&isog2.kernel, &K); - fp2_copy(&isog2.curve.A, &E.A); - fp2_copy(&isog2.curve.C, &E.C); - ec_eval_even(&E, &isog2, &B2.P, 1); - - copy_point(dual,&B2.P); - // Normalize curve - ec_isom_t isom; - ec_curve_normalize(E2, &isom, &E); - ec_iso_eval(dual,&isom); - -} - -int protocols_verif_from_chall(const signature_t *sig, ec_curve_t const *E2, const ec_point_t *dual, const unsigned char* m, size_t l) -{ - - // Generate 2^f and 3^g bases - ec_basis_t B2, B3, B6; - ec_curve_to_basis_6(&B6, E2); - copy_point(&B3.P, &B6.P); - copy_point(&B3.Q, &B6.Q); - copy_point(&B3.PmQ, &B6.PmQ); - for(size_t i = 0; i < POWER_OF_2; i++){ - ec_dbl(&B3.P, E2, &B3.P); - ec_dbl(&B3.Q, E2, &B3.Q); - ec_dbl(&B3.PmQ, E2, &B3.PmQ); - } - copy_point(&B2.P, &B6.P); - copy_point(&B2.Q, &B6.Q); - copy_point(&B2.PmQ, &B6.PmQ); - for(size_t i = 0; i < POWER_OF_3; i++){ - ec_point_t tmp; - ec_dbl(&tmp, E2, &B2.P); - ec_add(&B2.P, &tmp, &B2.P, &B2.P); - ec_dbl(&tmp, E2, &B2.Q); - ec_add(&B2.Q, &tmp, &B2.Q, &B2.Q); - ec_dbl(&tmp, E2, &B2.PmQ); - ec_add(&B2.PmQ, &tmp, &B2.PmQ, &B2.PmQ); - } - - bool const bit2 = sig->s.select23 & 1; - bool const bit3 = sig->s.select23 & 2; - - if(!bit2){ - // Swap P2 and Q2 - ec_point_t tmp; - copy_point(&tmp, &B2.P); - copy_point(&B2.P, &B2.Q); - copy_point(&B2.Q, &tmp); - } - if(!bit3){ - // Swap P3 and Q3 - ec_point_t tmp; - copy_point(&tmp, &B3.P); - copy_point(&B3.P, &B3.Q); - copy_point(&B3.Q, &tmp); - } - - // Kernels for the dual of the challenge isogeny - ec_point_t K2, K3; - ec_ladder3pt(&K2, sig->s.scalar2, &B2.P, &B2.Q, &B2.PmQ, E2); - ec_ladder3pt(&K3, sig->s.scalar3, &B3.P, &B3.Q, &B3.PmQ, E2); - - // Evaluating the dual isogeny - ec_isog_odd_t isog3={0}; - ec_point_t push_points[2]; - if (bit2 == bit3) { - push_points[0] = bit2 ? B6.Q : B6.P; - } - else { - digit_t scalars[2][NWORDS_FIELD]; - ibz_to_digit_array(scalars[bit3], &TORSION_PLUS_2POWER); - ibz_to_digit_array(scalars[bit2], &TORSION_PLUS_3POWER); - ec_biscalar_mul(&push_points[0], E2, scalars[0], scalars[1], &B6); - } - copy_point(&push_points[1], &K3); - ec_isog_even_t isog2; - isog2.length = POWER_OF_2; - copy_point(&isog2.kernel, &K2); - - - // entering the cyclicity test zone - ec_point_t test1,test2; - test1 = *dual; - test2 = K2; - for (int i =0 ; i < TORSION_PLUS_EVEN_POWER-1; i++) { - ec_dbl(&test1,E2,&test1); - ec_dbl(&test2,E2,&test2); - } - assert(!fp2_is_zero(&test1.z)); - assert(!fp2_is_zero(&test2.z)); - if (ec_is_equal(&test1,&test2)) { - return 0; - } - - fp2_copy(&isog2.curve.A, &E2->A); - fp2_copy(&isog2.curve.C, &E2->C); - ec_curve_t E; - ec_eval_even(&E, &isog2, push_points, 2); - isog3.degree[0] = POWER_OF_3; - copy_point(&isog3.ker_plus, &push_points[1]); - fp2_copy(&isog3.curve.A, &E.A); - fp2_copy(&isog3.curve.C, &E.C); - ec_eval_odd(&E, &isog3, push_points, 1); -assert(!fp2_is_zero(&E.C)); - - // Normalize curve - ec_curve_t E1; - ec_isom_t isom; - ec_curve_normalize(&E1, &isom, &E); - ec_iso_eval(&push_points[0], &isom); -assert(!fp2_is_zero(&E1.C)); - - // Generate 2^f*3^g basis - ec_curve_to_basis_6(&B6, &E1); - - // Recover original challenge kernel point from the hash - ec_point_t K; - ibz_vec_2_t vec; - ibz_vec_2_init(&vec); - hash_to_challenge(&vec, &E1, m, l); - digit_t scalars[2][NWORDS_FIELD]; - ibz_to_digit_array(scalars[0], &vec[0]); - ibz_to_digit_array(scalars[1], &vec[1]); - ec_biscalar_mul(&K, &E1, scalars[0], scalars[1], &B6); - ibz_vec_2_finalize(&vec); -assert(!fp2_is_zero(&K.z)); - - // Multiply Q by r - ec_mul(&push_points[0], &E1, sig->r, &push_points[0]); -assert(!fp2_is_zero(&push_points[0].z)); - - return ec_is_equal(&K, &push_points[0]); -} - - -/** @defgroup verification The verification protocol - * @{ -*/ - -/** - * @brief Verifying a signature - * - * @param sig: the signature - * @param pk the public key - * @param m the message - * @returns a bit indicating if the verification succeeded - */ -int protocols_verif(const signature_t *sig, const public_key_t *pk, const unsigned char* m, size_t l) -{ - //TODO general input checks? - - ec_curve_t E2; - ec_point_t dual; - protocols_verif_unpack_chall(&E2, &dual, sig, pk); - - return protocols_verif_from_chall(sig, &E2, &dual, m, l); -} - diff --git a/src/quaternion/ref/generic/CMakeLists.txt b/src/quaternion/ref/generic/CMakeLists.txt index a7272b8..0578882 100644 --- a/src/quaternion/ref/generic/CMakeLists.txt +++ b/src/quaternion/ref/generic/CMakeLists.txt @@ -1,18 +1,29 @@ set(SOURCE_FILES_QUATERNION_GENERIC_REF + intbig.c algebra.c ideal.c dim4.c dim2.c integers.c lattice.c + lat_ball.c finit.c printer.c - lll.c - matkermod.c + lll/rationals.c + lll/l2.c + lll/lll_verification.c + lll/lll_applications.c + lll/rationals.c + normeq.c + hnf/ibz_division.c + hnf/hnf_internal.c + hnf/hnf.c + test/random_input_generation.c ) -add_library(${LIB_QUATERNION} ${SOURCE_FILES_QUATERNION_GENERIC_REF}) -target_include_directories(${LIB_QUATERNION} PRIVATE common ${INC_PUBLIC} ${INC_COMMON} ${INC_INTBIG} ${INC_QUATERNION}) +add_library(${LIB_QUATERNION} STATIC ${SOURCE_FILES_QUATERNION_GENERIC_REF}) +target_link_libraries(${LIB_QUATERNION} GMP m) +target_include_directories(${LIB_QUATERNION} PRIVATE common ${INC_PUBLIC} ${INC_COMMON} ${INC_QUATERNION} internal_quaternion_headers) target_compile_options(${LIB_QUATERNION} PRIVATE ${C_OPT_FLAGS}) add_subdirectory(test) diff --git a/src/quaternion/ref/generic/algebra.c b/src/quaternion/ref/generic/algebra.c index 7a52fb8..50629f9 100644 --- a/src/quaternion/ref/generic/algebra.c +++ b/src/quaternion/ref/generic/algebra.c @@ -1,287 +1,280 @@ #include #include "internal.h" -//Internal helper functions +// Internal helper functions -//in internal.h: -//static inline void quat_alg_init_set_ui(quat_alg_t *alg, unsigned int p) { -// ibz_t bp; -// ibz_init(&bp); -// ibz_set(&bp, p); -// quat_alg_init_set(alg, &bp); -// ibz_finalize(&bp); -//} - -void quat_alg_coord_add(quat_alg_coord_t *res, const quat_alg_coord_t *a, const quat_alg_coord_t *b){ - ibz_add(&((*res)[0]),&((*a)[0]),&((*b)[0])); - ibz_add(&((*res)[1]),&((*a)[1]),&((*b)[1])); - ibz_add(&((*res)[2]),&((*a)[2]),&((*b)[2])); - ibz_add(&((*res)[3]),&((*a)[3]),&((*b)[3])); +void +quat_alg_init_set_ui(quat_alg_t *alg, unsigned int p) +{ + ibz_t bp; + ibz_init(&bp); + ibz_set(&bp, p); + quat_alg_init_set(alg, &bp); + ibz_finalize(&bp); } -void quat_alg_coord_sub(quat_alg_coord_t *res, const quat_alg_coord_t *a, const quat_alg_coord_t *b){ - ibz_sub(&((*res)[0]),&((*a)[0]),&((*b)[0])); - ibz_sub(&((*res)[1]),&((*a)[1]),&((*b)[1])); - ibz_sub(&((*res)[2]),&((*a)[2]),&((*b)[2])); - ibz_sub(&((*res)[3]),&((*a)[3]),&((*b)[3])); +void +quat_alg_coord_mul(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b, const quat_alg_t *alg) +{ + ibz_t prod; + ibz_vec_4_t sum; + ibz_init(&prod); + ibz_vec_4_init(&sum); + + ibz_set(&(sum[0]), 0); + ibz_set(&(sum[1]), 0); + ibz_set(&(sum[2]), 0); + ibz_set(&(sum[3]), 0); + + // compute 1 coordinate + ibz_mul(&prod, &((*a)[2]), &((*b)[2])); + ibz_sub(&(sum[0]), &(sum[0]), &prod); + ibz_mul(&prod, &((*a)[3]), &((*b)[3])); + ibz_sub(&(sum[0]), &(sum[0]), &prod); + ibz_mul(&(sum[0]), &(sum[0]), &(alg->p)); + ibz_mul(&prod, &((*a)[0]), &((*b)[0])); + ibz_add(&(sum[0]), &(sum[0]), &prod); + ibz_mul(&prod, &((*a)[1]), &((*b)[1])); + ibz_sub(&(sum[0]), &(sum[0]), &prod); + // compute i coordiante + ibz_mul(&prod, &((*a)[2]), &((*b)[3])); + ibz_add(&(sum[1]), &(sum[1]), &prod); + ibz_mul(&prod, &((*a)[3]), &((*b)[2])); + ibz_sub(&(sum[1]), &(sum[1]), &prod); + ibz_mul(&(sum[1]), &(sum[1]), &(alg->p)); + ibz_mul(&prod, &((*a)[0]), &((*b)[1])); + ibz_add(&(sum[1]), &(sum[1]), &prod); + ibz_mul(&prod, &((*a)[1]), &((*b)[0])); + ibz_add(&(sum[1]), &(sum[1]), &prod); + // compute j coordiante + ibz_mul(&prod, &((*a)[0]), &((*b)[2])); + ibz_add(&(sum[2]), &(sum[2]), &prod); + ibz_mul(&prod, &((*a)[2]), &((*b)[0])); + ibz_add(&(sum[2]), &(sum[2]), &prod); + ibz_mul(&prod, &((*a)[1]), &((*b)[3])); + ibz_sub(&(sum[2]), &(sum[2]), &prod); + ibz_mul(&prod, &((*a)[3]), &((*b)[1])); + ibz_add(&(sum[2]), &(sum[2]), &prod); + // compute ij coordiante + ibz_mul(&prod, &((*a)[0]), &((*b)[3])); + ibz_add(&(sum[3]), &(sum[3]), &prod); + ibz_mul(&prod, &((*a)[3]), &((*b)[0])); + ibz_add(&(sum[3]), &(sum[3]), &prod); + ibz_mul(&prod, &((*a)[2]), &((*b)[1])); + ibz_sub(&(sum[3]), &(sum[3]), &prod); + ibz_mul(&prod, &((*a)[1]), &((*b)[2])); + ibz_add(&(sum[3]), &(sum[3]), &prod); + + ibz_copy(&((*res)[0]), &(sum[0])); + ibz_copy(&((*res)[1]), &(sum[1])); + ibz_copy(&((*res)[2]), &(sum[2])); + ibz_copy(&((*res)[3]), &(sum[3])); + + ibz_finalize(&prod); + ibz_vec_4_finalize(&sum); } -void quat_alg_equal_denom(quat_alg_elem_t *res_a, quat_alg_elem_t *res_b, const quat_alg_elem_t *a, const quat_alg_elem_t *b){ - ibz_t gcd, r; - ibz_init(&gcd); - ibz_init(&r); - ibz_gcd(&gcd, &(a->denom), &(b->denom)); - //temporarily set res_a.denom to a.denom/gcd, and res_b.denom to b.denom/gcd - ibz_div(&(res_a->denom), &r, &(a->denom), &gcd); - ibz_div(&(res_b->denom), &r, &(b->denom), &gcd); - for (int i = 0; i<4;i++){ - //multiply coordiates by reduced denominators from the other element - ibz_mul(&(res_a->coord[i]), &(a->coord[i]), &(res_b->denom)); - ibz_mul(&(res_b->coord[i]), &(b->coord[i]), &(res_a->denom)); - } - // multiply both reduced denominators - ibz_mul(&(res_a->denom), &(res_a->denom), &(res_b->denom)); - // multiply them by the gcd to get the new common denominator - ibz_mul(&(res_b->denom), &(res_a->denom), &gcd); - ibz_mul(&(res_a->denom), &(res_a->denom), &gcd); - ibz_finalize(&gcd); - ibz_finalize(&r); -} - -//Public Functions - -void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b){ - quat_alg_elem_t res_a, res_b; - quat_alg_elem_init(&res_a); - quat_alg_elem_init(&res_b); - // put both on the same denominator - quat_alg_equal_denom(&res_a,&res_b,a,b); - //then add - ibz_copy(&(res->denom), &(res_a.denom)); - quat_alg_coord_add(&(res->coord),&(res_a.coord),&(res_b.coord)); - quat_alg_elem_finalize(&res_a); - quat_alg_elem_finalize(&res_b); -} - -void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b){ - quat_alg_elem_t res_a, res_b; - quat_alg_elem_init(&res_a); - quat_alg_elem_init(&res_b); - // put both on the same denominator - quat_alg_equal_denom(&res_a,&res_b,a,b); - //then substract - ibz_copy(&res->denom, &res_a.denom); - quat_alg_coord_sub(&res->coord,&res_a.coord,&res_b.coord); - quat_alg_elem_finalize(&res_a); - quat_alg_elem_finalize(&res_b); -} - -void quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const quat_alg_t *alg){ - ibz_t prod; - quat_alg_coord_t sum; - ibz_init(&prod); - quat_alg_coord_init(&sum); - - ibz_set(&(sum[0]), 0); - ibz_set(&(sum[1]), 0); - ibz_set(&(sum[2]), 0); - ibz_set(&(sum[3]), 0); - - //denominator: product of denominators - ibz_mul(&(res->denom), &(a->denom),&(b->denom)); - -// compute 1 coordinate - ibz_mul(&prod, &(a->coord[2]),&(b->coord[2])); - ibz_sub(&(sum[0]),&(sum[0]),&prod); - ibz_mul(&prod, &(a->coord[3]),&(b->coord[3])); - ibz_sub(&(sum[0]),&(sum[0]),&prod); - ibz_mul(&(sum[0]), &(sum[0]),&(alg->p)); - ibz_mul(&prod, &(a->coord[0]),&(b->coord[0])); - ibz_add(&(sum[0]),&(sum[0]),&prod); - ibz_mul(&prod, &(a->coord[1]),&(b->coord[1])); - ibz_sub(&(sum[0]),&(sum[0]),&prod); -// compute i coordiante - ibz_mul(&prod, &(a->coord[2]),&(b->coord[3])); - ibz_add(&(sum[1]),&(sum[1]),&prod); - ibz_mul(&prod, &(a->coord[3]),&(b->coord[2])); - ibz_sub(&(sum[1]),&(sum[1]),&prod); - ibz_mul(&(sum[1]), &(sum[1]),&(alg->p)); - ibz_mul(&prod, &(a->coord[0]),&(b->coord[1])); - ibz_add(&(sum[1]),&(sum[1]),&prod); - ibz_mul(&prod, &(a->coord[1]),&(b->coord[0])); - ibz_add(&(sum[1]),&(sum[1]),&prod); -// compute j coordiante - ibz_mul(&prod, &(a->coord[0]),&(b->coord[2])); - ibz_add(&(sum[2]),&(sum[2]),&prod); - ibz_mul(&prod, &(a->coord[2]),&(b->coord[0])); - ibz_add(&(sum[2]),&(sum[2]),&prod); - ibz_mul(&prod, &(a->coord[1]),&(b->coord[3])); - ibz_sub(&(sum[2]),&(sum[2]),&prod); - ibz_mul(&prod, &(a->coord[3]),&(b->coord[1])); - ibz_add(&(sum[2]),&(sum[2]),&prod); -// compute ij coordiante - ibz_mul(&prod, &(a->coord[0]),&(b->coord[3])); - ibz_add(&(sum[3]),&(sum[3]),&prod); - ibz_mul(&prod, &(a->coord[3]),&(b->coord[0])); - ibz_add(&(sum[3]),&(sum[3]),&prod); - ibz_mul(&prod, &(a->coord[2]),&(b->coord[1])); - ibz_sub(&(sum[3]),&(sum[3]),&prod); - ibz_mul(&prod, &(a->coord[1]),&(b->coord[2])); - ibz_add(&(sum[3]),&(sum[3]),&prod); - - ibz_copy(&(res->coord[0]),&(sum[0])); - ibz_copy(&(res->coord[1]),&(sum[1])); - ibz_copy(&(res->coord[2]),&(sum[2])); - ibz_copy(&(res->coord[3]),&(sum[3])); - - ibz_finalize(&prod); - quat_alg_coord_finalize(&sum); -} - -void quat_alg_rightmul_mat(ibz_mat_4x4_t *mulmat, const quat_alg_elem_t *a, const quat_alg_t *alg) { - quat_alg_elem_t e, res; - quat_alg_elem_init(&e); - quat_alg_elem_init(&res); +void +quat_alg_equal_denom(quat_alg_elem_t *res_a, quat_alg_elem_t *res_b, const quat_alg_elem_t *a, const quat_alg_elem_t *b) +{ + ibz_t gcd, r; + ibz_init(&gcd); + ibz_init(&r); + ibz_gcd(&gcd, &(a->denom), &(b->denom)); + // temporarily set res_a.denom to a.denom/gcd, and res_b.denom to b.denom/gcd + ibz_div(&(res_a->denom), &r, &(a->denom), &gcd); + ibz_div(&(res_b->denom), &r, &(b->denom), &gcd); for (int i = 0; i < 4; i++) { - // i-th standard basis vector - if (i) - ibz_set(&e.coord[i-1], 0); - ibz_set(&e.coord[i], 1); - quat_alg_mul(&res, &e, a, alg); - for (int j = 0; j < 4; j++) - ibz_copy(&(*mulmat)[j][i], &res.coord[j]); + // multiply coordiates by reduced denominators from the other element + ibz_mul(&(res_a->coord[i]), &(a->coord[i]), &(res_b->denom)); + ibz_mul(&(res_b->coord[i]), &(b->coord[i]), &(res_a->denom)); } - quat_alg_elem_finalize(&e); - quat_alg_elem_finalize(&res); + // multiply both reduced denominators + ibz_mul(&(res_a->denom), &(res_a->denom), &(res_b->denom)); + // multiply them by the gcd to get the new common denominator + ibz_mul(&(res_b->denom), &(res_a->denom), &gcd); + ibz_mul(&(res_a->denom), &(res_a->denom), &gcd); + ibz_finalize(&gcd); + ibz_finalize(&r); } -void quat_alg_norm(ibq_t *res, const quat_alg_elem_t *a, const quat_alg_t *alg){ - quat_alg_elem_t conj, norm; - quat_alg_elem_init(&conj); - quat_alg_elem_init(&norm); - - quat_alg_conj(&conj,a); - quat_alg_mul(&norm,a,&conj,alg); - ibq_set(res,&(norm.coord[0]),&(norm.denom)); +// Public Functions - quat_alg_elem_finalize(&conj); - quat_alg_elem_finalize(&norm); +void +quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b) +{ + quat_alg_elem_t res_a, res_b; + quat_alg_elem_init(&res_a); + quat_alg_elem_init(&res_b); + // put both on the same denominator + quat_alg_equal_denom(&res_a, &res_b, a, b); + // then add + ibz_copy(&(res->denom), &(res_a.denom)); + ibz_vec_4_add(&(res->coord), &(res_a.coord), &(res_b.coord)); + quat_alg_elem_finalize(&res_a); + quat_alg_elem_finalize(&res_b); } -void quat_alg_trace(ibq_t *res, const quat_alg_elem_t *a){ - quat_alg_elem_t trace; - quat_alg_elem_init(&trace); - - ibz_copy(&(trace.denom), &(a->denom)); - ibz_add(&(trace.coord[0]),&(a->coord[0]),&(a->coord[0])); - ibz_sub(&(trace.coord[1]),&(a->coord[1]),&(a->coord[1])); - ibz_sub(&(trace.coord[2]),&(a->coord[2]),&(a->coord[2])); - ibz_sub(&(trace.coord[3]),&(a->coord[3]),&(a->coord[3])); - ibq_set(res,&(trace.coord[0]),&(trace.denom)); - - quat_alg_elem_finalize(&trace); +void +quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b) +{ + quat_alg_elem_t res_a, res_b; + quat_alg_elem_init(&res_a); + quat_alg_elem_init(&res_b); + // put both on the same denominator + quat_alg_equal_denom(&res_a, &res_b, a, b); + // then substract + ibz_copy(&res->denom, &res_a.denom); + ibz_vec_4_sub(&res->coord, &res_a.coord, &res_b.coord); + quat_alg_elem_finalize(&res_a); + quat_alg_elem_finalize(&res_b); } -void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator){ - ibz_copy(&(elem->denom),denominator); - ibz_copy(&(elem->coord[0]),numerator); - ibz_set(&(elem->coord[1]),0); - ibz_set(&(elem->coord[2]),0); - ibz_set(&(elem->coord[3]),0); +void +quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const quat_alg_t *alg) +{ + // denominator: product of denominators + ibz_mul(&(res->denom), &(a->denom), &(b->denom)); + quat_alg_coord_mul(&(res->coord), &(a->coord), &(b->coord), alg); } -void quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x){ - ibz_copy(&(conj->denom), &(x->denom)); - ibz_copy(&(conj->coord[0]),&(x->coord[0])); - ibz_neg(&(conj->coord[1]),&(x->coord[1])); - ibz_neg(&(conj->coord[2]),&(x->coord[2])); - ibz_neg(&(conj->coord[3]),&(x->coord[3])); +void +quat_alg_norm(ibz_t *res_num, ibz_t *res_denom, const quat_alg_elem_t *a, const quat_alg_t *alg) +{ + ibz_t r, g; + quat_alg_elem_t norm; + ibz_init(&r); + ibz_init(&g); + quat_alg_elem_init(&norm); + + quat_alg_conj(&norm, a); + quat_alg_mul(&norm, a, &norm, alg); + ibz_gcd(&g, &(norm.coord[0]), &(norm.denom)); + ibz_div(res_num, &r, &(norm.coord[0]), &g); + ibz_div(res_denom, &r, &(norm.denom), &g); + ibz_abs(res_denom, res_denom); + ibz_abs(res_num, res_num); + assert(ibz_cmp(res_denom, &ibz_const_zero) > 0); + + quat_alg_elem_finalize(&norm); + ibz_finalize(&r); + ibz_finalize(&g); } -//defined in header -//int quat_alg_is_primitive(const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg) { -// quat_alg_coord_t *coord; -// quat_alg_coord_init(coord); -// int ok = quat_lattice_contains(coord, order, x); - //assert(ok); - //unused(ok); -// ibz_t *cnt; -// ibz_init(cnt); -// ibz_content(cnt, coord); -// ok = ibz_is_one(cnt); -// ibz_finalize(cnt); -// quat_alg_coord_finalize(coord); -// return ok; -//} -// -//static inline void quat_alg_make_primitive(quat_alg_coord_t *primitive_x, ibz_t *content, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg){ -// int ok = quat_lattice_contains(primitive_x, order, x); - //assert(ok); - //unused(ok); -// ibz_content(content, primitive_x); -// for(int i = 0; i <4; i++){ -// ibz_div(primitive_x[i], NULL, primitive_x[i], content); -// } -//} +void +quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator) +{ + ibz_copy(&(elem->denom), denominator); + ibz_copy(&(elem->coord[0]), numerator); + ibz_set(&(elem->coord[1]), 0); + ibz_set(&(elem->coord[2]), 0); + ibz_set(&(elem->coord[3]), 0); +} -void quat_alg_normalize(quat_alg_elem_t *x){ - ibz_t gcd,r, zero; - ibz_init(&gcd); - ibz_init(&r); - ibz_init(&zero); - ibz_content(&gcd,&(x->coord)); - ibz_gcd(&gcd,&gcd,&(x->denom)); - ibz_div(&(x->denom),&r,&(x->denom),&gcd); - for (int i = 0; i < 4; i++){ - ibz_div(&(x->coord[i]),&r,&(x->coord[i]),&gcd); - } - ibz_set(&zero,0); - if (0denom))){ - for (int i = 0; i < 4; i++){ - ibz_neg(&(x->coord[i]),&(x->coord[i])); +void +quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x) +{ + ibz_copy(&(conj->denom), &(x->denom)); + ibz_copy(&(conj->coord[0]), &(x->coord[0])); + ibz_neg(&(conj->coord[1]), &(x->coord[1])); + ibz_neg(&(conj->coord[2]), &(x->coord[2])); + ibz_neg(&(conj->coord[3]), &(x->coord[3])); +} + +void +quat_alg_make_primitive(ibz_vec_4_t *primitive_x, ibz_t *content, const quat_alg_elem_t *x, const quat_lattice_t *order) +{ + int ok UNUSED = quat_lattice_contains(primitive_x, order, x); + assert(ok); + ibz_vec_4_content(content, primitive_x); + ibz_t r; + ibz_init(&r); + for (int i = 0; i < 4; i++) { + ibz_div(*primitive_x + i, &r, *primitive_x + i, content); } - ibz_neg(&(x->denom),&(x->denom)); - } - ibz_finalize(&gcd); - ibz_finalize(&r); - ibz_finalize(&zero); + ibz_finalize(&r); } -int quat_alg_elem_is_zero(const quat_alg_elem_t *x){ - int res = quat_alg_coord_is_zero(&(x->coord)); - return(res); +void +quat_alg_normalize(quat_alg_elem_t *x) +{ + ibz_t gcd, sign, r; + ibz_init(&gcd); + ibz_init(&sign); + ibz_init(&r); + ibz_vec_4_content(&gcd, &(x->coord)); + ibz_gcd(&gcd, &gcd, &(x->denom)); + ibz_div(&(x->denom), &r, &(x->denom), &gcd); + ibz_vec_4_scalar_div(&(x->coord), &gcd, &(x->coord)); + ibz_set(&sign, 2 * (0 > ibz_cmp(&ibz_const_zero, &(x->denom))) - 1); + ibz_vec_4_scalar_mul(&(x->coord), &sign, &(x->coord)); + ibz_mul(&(x->denom), &sign, &(x->denom)); + ibz_finalize(&gcd); + ibz_finalize(&sign); + ibz_finalize(&r); } -int quat_alg_coord_is_zero(const quat_alg_coord_t *x){ - int res = 1; - for (int i = 0; i < 4; i++){ - res &= ibz_is_zero(&((*x)[i])); - } - return(res); +int +quat_alg_elem_equal(const quat_alg_elem_t *a, const quat_alg_elem_t *b) +{ + quat_alg_elem_t diff; + quat_alg_elem_init(&diff); + quat_alg_sub(&diff, a, b); + int res = quat_alg_elem_is_zero(&diff); + quat_alg_elem_finalize(&diff); + return (res); } -// helper functions for lattices -void quat_alg_elem_copy_ibz(quat_alg_elem_t *elem, const ibz_t *denom, const ibz_t *coord0,const ibz_t *coord1,const ibz_t *coord2,const ibz_t *coord3){ - ibz_copy(&(elem->coord[0]), coord0); - ibz_copy(&(elem->coord[1]), coord1); - ibz_copy(&(elem->coord[2]), coord2); - ibz_copy(&(elem->coord[3]), coord3); - - ibz_copy(&(elem->denom),denom); +int +quat_alg_elem_is_zero(const quat_alg_elem_t *x) +{ + int res = ibz_vec_4_is_zero(&(x->coord)); + return (res); } -void quat_alg_elem_set(quat_alg_elem_t *elem, int64_t denom, int64_t coord0, int64_t coord1, int64_t coord2, int64_t coord3){ +void +quat_alg_elem_set(quat_alg_elem_t *elem, int32_t denom, int32_t coord0, int32_t coord1, int32_t coord2, int32_t coord3) +{ ibz_set(&(elem->coord[0]), coord0); ibz_set(&(elem->coord[1]), coord1); ibz_set(&(elem->coord[2]), coord2); ibz_set(&(elem->coord[3]), coord3); - ibz_set(&(elem->denom),denom); + ibz_set(&(elem->denom), denom); } -void quat_alg_elem_mul_by_scalar(quat_alg_elem_t *res, const ibz_t *scalar, const quat_alg_elem_t *elem){ - for(int i = 0; i < 4; i++){ - ibz_mul(&(res->coord[i]), &(elem->coord[i]),scalar); - } - ibz_copy(&(res->denom),&(elem->denom)); +void +quat_alg_elem_copy(quat_alg_elem_t *copy, const quat_alg_elem_t *copied) +{ + ibz_copy(©->denom, &copied->denom); + ibz_copy(©->coord[0], &copied->coord[0]); + ibz_copy(©->coord[1], &copied->coord[1]); + ibz_copy(©->coord[2], &copied->coord[2]); + ibz_copy(©->coord[3], &copied->coord[3]); +} + +// helper functions for lattices +void +quat_alg_elem_copy_ibz(quat_alg_elem_t *elem, + const ibz_t *denom, + const ibz_t *coord0, + const ibz_t *coord1, + const ibz_t *coord2, + const ibz_t *coord3) +{ + ibz_copy(&(elem->coord[0]), coord0); + ibz_copy(&(elem->coord[1]), coord1); + ibz_copy(&(elem->coord[2]), coord2); + ibz_copy(&(elem->coord[3]), coord3); + + ibz_copy(&(elem->denom), denom); +} + +void +quat_alg_elem_mul_by_scalar(quat_alg_elem_t *res, const ibz_t *scalar, const quat_alg_elem_t *elem) +{ + for (int i = 0; i < 4; i++) { + ibz_mul(&(res->coord[i]), &(elem->coord[i]), scalar); + } + ibz_copy(&(res->denom), &(elem->denom)); } diff --git a/src/quaternion/ref/generic/dim2.c b/src/quaternion/ref/generic/dim2.c index ff46caf..b31ae77 100644 --- a/src/quaternion/ref/generic/dim2.c +++ b/src/quaternion/ref/generic/dim2.c @@ -1,40 +1,66 @@ #include #include "internal.h" -//internal helpers, also for other files -void ibz_vec_2_set(ibz_vec_2_t *vec, int a0, int a1){ - ibz_set(&((*vec)[0]),a0); - ibz_set(&((*vec)[1]),a1); +// internal helpers, also for other files +void +ibz_vec_2_set(ibz_vec_2_t *vec, int a0, int a1) +{ + ibz_set(&((*vec)[0]), a0); + ibz_set(&((*vec)[1]), a1); } -void ibz_mat_2x2_set(ibz_mat_2x2_t *mat, int a00, int a01, int a10, int a11){ - ibz_set(&((*mat)[0][0]),a00); - ibz_set(&((*mat)[0][1]),a01); - ibz_set(&((*mat)[1][0]),a10); - ibz_set(&((*mat)[1][1]),a11); +void +ibz_mat_2x2_set(ibz_mat_2x2_t *mat, int a00, int a01, int a10, int a11) +{ + ibz_set(&((*mat)[0][0]), a00); + ibz_set(&((*mat)[0][1]), a01); + ibz_set(&((*mat)[1][0]), a10); + ibz_set(&((*mat)[1][1]), a11); } -void ibz_mat_2x2_det_from_ibz(ibz_t *det, const ibz_t *a11, const ibz_t *a12, const ibz_t *a21, const ibz_t *a22){ +void +ibz_mat_2x2_copy(ibz_mat_2x2_t *copy, const ibz_mat_2x2_t *copied) +{ + ibz_copy(&((*copy)[0][0]), &((*copied)[0][0])); + ibz_copy(&((*copy)[0][1]), &((*copied)[0][1])); + ibz_copy(&((*copy)[1][0]), &((*copied)[1][0])); + ibz_copy(&((*copy)[1][1]), &((*copied)[1][1])); +} + +void +ibz_mat_2x2_add(ibz_mat_2x2_t *sum, const ibz_mat_2x2_t *a, const ibz_mat_2x2_t *b) +{ + ibz_add(&((*sum)[0][0]), &((*a)[0][0]), &((*b)[0][0])); + ibz_add(&((*sum)[0][1]), &((*a)[0][1]), &((*b)[0][1])); + ibz_add(&((*sum)[1][0]), &((*a)[1][0]), &((*b)[1][0])); + ibz_add(&((*sum)[1][1]), &((*a)[1][1]), &((*b)[1][1])); +} + +void +ibz_mat_2x2_det_from_ibz(ibz_t *det, const ibz_t *a11, const ibz_t *a12, const ibz_t *a21, const ibz_t *a22) +{ ibz_t prod; ibz_init(&prod); - ibz_mul(&prod,a12,a21); - ibz_mul(det,a11,a22); - ibz_sub(det,det,&prod); + ibz_mul(&prod, a12, a21); + ibz_mul(det, a11, a22); + ibz_sub(det, det, &prod); ibz_finalize(&prod); } -void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec){ +void +ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec) +{ ibz_t prod; ibz_vec_2_t matvec; ibz_init(&prod); ibz_vec_2_init(&matvec); - ibz_mul(&prod,&((*mat)[0][0]),&((*vec)[0])); + ibz_mul(&prod, &((*mat)[0][0]), &((*vec)[0])); ibz_copy(&(matvec[0]), &prod); - ibz_mul(&prod,&((*mat)[0][1]),&((*vec)[1])); - ibz_add(&(matvec[0]),&(matvec[0]), &prod); - ibz_mul(&prod,&((*mat)[1][0]),&((*vec)[0])); + ibz_mul(&prod, &((*mat)[0][1]), &((*vec)[1])); + ibz_add(&(matvec[0]), &(matvec[0]), &prod); + ibz_mul(&prod, &((*mat)[1][0]), &((*vec)[0])); ibz_copy(&(matvec[1]), &prod); - ibz_mul(&prod,&((*mat)[1][1]),&((*vec)[1])); - ibz_add(&(matvec[1]),&(matvec[1]), &prod); + ibz_mul(&prod, &((*mat)[1][1]), &((*vec)[1])); + ibz_add(&(matvec[1]), &(matvec[1]), &prod); ibz_copy(&((*res)[0]), &(matvec[0])); ibz_copy(&((*res)[1]), &(matvec[1])); ibz_finalize(&prod); @@ -43,511 +69,64 @@ void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_ // modular 2x2 operations -void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, const ibz_t *m){ +void +ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, const ibz_t *m) +{ ibz_t mul; ibz_mat_2x2_t sums; ibz_init(&mul); ibz_mat_2x2_init(&sums); - for(int i = 0; i < 2; i++){ - for(int j = 0; j < 2; j++){ - ibz_set(&(sums[i][j]),0); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + ibz_set(&(sums[i][j]), 0); } } - for(int i = 0; i < 2; i++){ - for(int j = 0; j < 2; j++){ - for(int k = 0; k < 2; k++){ - ibz_mul(&mul,&((*mat_a)[i][k]), &((*mat_b)[k][j])); - ibz_add(&(sums[i][j]),&(sums[i][j]), &mul); - ibz_mod(&(sums[i][j]),&(sums[i][j]), m); - } + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + for (int k = 0; k < 2; k++) { + ibz_mul(&mul, &((*mat_a)[i][k]), &((*mat_b)[k][j])); + ibz_add(&(sums[i][j]), &(sums[i][j]), &mul); + ibz_mod(&(sums[i][j]), &(sums[i][j]), m); + } } } - for(int i = 0; i < 2; i++){ - for(int j = 0; j < 2; j++){ - ibz_copy(&((*prod)[i][j]),&(sums[i][j])); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + ibz_copy(&((*prod)[i][j]), &(sums[i][j])); } } ibz_finalize(&mul); ibz_mat_2x2_finalize(&sums); } -int ibz_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m){ - ibz_t det, prod; +int +ibz_mat_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m) +{ + ibz_t det, prod; ibz_init(&det); ibz_init(&prod); - ibz_mul(&det,&((*mat)[0][0]),&((*mat)[1][1])); - ibz_mod(&det,&det,m); - ibz_mul(&prod,&((*mat)[0][1]),&((*mat)[1][0])); - ibz_sub(&det,&det,&prod); - ibz_mod(&det,&det,m); - int res = ibz_invmod(&det,&det,m); - if(res){ - ibz_copy(&prod,&((*mat)[0][0])); - ibz_copy(&((*inv)[0][0]), &((*mat)[1][1])); - ibz_copy(&((*inv)[1][1]), &prod); - ibz_neg(&((*inv)[1][0]), &((*mat)[1][0])); - ibz_neg(&((*inv)[0][1]), &((*mat)[0][1])); - for(int i = 0; i<2;i++){ - for(int j = 0; j<2;j++){ - ibz_mul(&((*inv)[i][j]),&((*inv)[i][j]),&det); - ibz_mod(&((*inv)[i][j]),&((*inv)[i][j]),m); - } + ibz_mul(&det, &((*mat)[0][0]), &((*mat)[1][1])); + ibz_mod(&det, &det, m); + ibz_mul(&prod, &((*mat)[0][1]), &((*mat)[1][0])); + ibz_sub(&det, &det, &prod); + ibz_mod(&det, &det, m); + int res = ibz_invmod(&det, &det, m); + // return 0 matrix if non invertible determinant + ibz_set(&prod, res); + ibz_mul(&det, &det, &prod); + // compute inverse + ibz_copy(&prod, &((*mat)[0][0])); + ibz_copy(&((*inv)[0][0]), &((*mat)[1][1])); + ibz_copy(&((*inv)[1][1]), &prod); + ibz_neg(&((*inv)[1][0]), &((*mat)[1][0])); + ibz_neg(&((*inv)[0][1]), &((*mat)[0][1])); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + ibz_mul(&((*inv)[i][j]), &((*inv)[i][j]), &det); + ibz_mod(&((*inv)[i][j]), &((*inv)[i][j]), m); } } ibz_finalize(&det); ibz_finalize(&prod); - return(res); -} - -//helper for cvp -int quat_dim2_lattice_contains(ibz_mat_2x2_t *basis, ibz_t *coord1, ibz_t *coord2){ - int res = 1; - ibz_t prod, sum, det, r; - ibz_init(&det); - ibz_init(&r); - ibz_init(&sum); - ibz_init(&prod); - // compute det, then both coordinates (inverse*det)*vec, where vec is (coord1, coord2) and check wthether det divides both results - ibz_mat_2x2_det_from_ibz(&det, &((*basis)[0][0]), &((*basis)[0][1]), &((*basis)[1][0]), &((*basis)[1][1])); - ibz_mul(&sum,coord1,&((*basis)[1][1])); - ibz_mul(&prod,coord2,&((*basis)[0][1])); - ibz_sub(&sum,&sum,&prod); - ibz_div(&prod,&r,&sum,&det); - res = res && ibz_is_zero(&r); - ibz_mul(&sum,coord2,&((*basis)[0][0])); - ibz_mul(&prod,coord1,&((*basis)[1][0])); - ibz_sub(&sum,&sum,&prod); - ibz_div(&prod,&r,&sum,&det); - res = res && ibz_is_zero(&r); - ibz_finalize(&det); - ibz_finalize(&r); - ibz_finalize(&sum); - ibz_finalize(&prod); - return(res); -} - -void quat_dim2_lattice_norm(ibz_t *norm, const ibz_t *coord1, const ibz_t *coord2, const ibz_t *norm_q){ - ibz_t prod, sum; - ibz_init(&prod); - ibz_init(&sum); - ibz_mul(&sum,coord1,coord1); - ibz_mul(&prod,coord2,coord2); - ibz_mul(&prod,&prod,norm_q); - ibz_add(norm,&sum,&prod); - ibz_finalize(&prod); - ibz_finalize(&sum); -} - -void quat_dim2_lattice_bilinear(ibz_t *res, const ibz_t *v11, const ibz_t *v12,const ibz_t *v21, const ibz_t *v22, const ibz_t *norm_q){ - ibz_t prod, sum; - ibz_init(&prod); - ibz_init(&sum); - ibz_mul(&sum,v11,v21); - ibz_mul(&prod,v12,v22); - ibz_mul(&prod,&prod,norm_q); - ibz_add(res,&sum,&prod); - ibz_finalize(&prod); - ibz_finalize(&sum); -} - -// algo 3.1.14 Cohen (exact solution for shortest vector in dimension 2, than take a second, orthogonal vector) -void quat_dim2_lattice_short_basis(ibz_mat_2x2_t *reduced, const ibz_mat_2x2_t *basis, const ibz_t *norm_q){ - ibz_vec_2_t a,b,t; - ibz_t prod,sum, norm_a, norm_b, r, norm_t, n; - ibz_vec_2_init(&a); - ibz_vec_2_init(&b); - ibz_vec_2_init(&t); - ibz_init(&prod); - ibz_init(&sum); - ibz_init(&r); - ibz_init(&n); - ibz_init(&norm_t); - ibz_init(&norm_a); - ibz_init(&norm_b); - // init a,b - ibz_copy(&(a[0]),&((*basis)[0][0])); - ibz_copy(&(a[1]),&((*basis)[1][0])); - ibz_copy(&(b[0]),&((*basis)[0][1])); - ibz_copy(&(b[1]),&((*basis)[1][1])); - // compute initial norms - quat_dim2_lattice_norm(&norm_a,&(a[0]),&(a[1]), norm_q); - quat_dim2_lattice_norm(&norm_b,&(b[0]),&(b[1]), norm_q); - // exchange if needed - if(ibz_cmp(&norm_a,&norm_b)<0){ - ibz_copy(&sum,&(a[0])); - ibz_copy(&(a[0]),&(b[0])); - ibz_copy(&(b[0]),&sum); - ibz_copy(&sum,&(a[1])); - ibz_copy(&(a[1]),&(b[1])); - ibz_copy(&(b[1]),&sum); - ibz_copy(&sum,&norm_a); - ibz_copy(&norm_a,&norm_b); - ibz_copy(&norm_b,&sum); - } - int test = 1; - while(test){ - //compute n - quat_dim2_lattice_bilinear(&n,&(a[0]),&(a[1]),&(b[0]),&(b[1]),norm_q); - // set r - ibz_rounded_div(&r,&n,&norm_b); - // compute t_norm - ibz_set(&prod,2); - ibz_mul(&prod,&prod,&n); - ibz_mul(&prod,&prod,&r); - ibz_sub(&sum,&norm_a,&prod); - ibz_mul(&prod,&r,&r); - ibz_mul(&prod,&prod,&norm_b); - ibz_add(&norm_t,&sum,&prod); - // test: - if(ibz_cmp(&norm_b,&norm_t)>0){ - // compute t, a, b - ibz_copy(&norm_a,&norm_b); - ibz_copy(&norm_b,&norm_t); - // t is a -rb, a is b, b is t - ibz_mul(&prod,&r,&(b[0])); - ibz_sub(&(t[0]),&(a[0]),&prod); - ibz_mul(&prod,&r,&(b[1])); - ibz_sub(&(t[1]),&(a[1]),&prod); - ibz_copy(&(a[0]),&(b[0])); - ibz_copy(&(a[1]),&(b[1])); - ibz_copy(&(b[0]),&(t[0])); - ibz_copy(&(b[1]),&(t[1])); - } else { - test = 0; - } - } - // output : now b is short: need to get 2nd short vector: idea: take shortest among t and a - if(ibz_cmp(&norm_t,&norm_a)<0){ - ibz_mul(&prod,&r,&(b[0])); - ibz_sub(&(a[0]),&(a[0]),&prod); - ibz_mul(&prod,&r,&(b[1])); - ibz_sub(&(a[1]),&(a[1]),&prod); - } - ibz_copy(&((*reduced)[0][0]),&(b[0])); - ibz_copy(&((*reduced)[1][0]),&(b[1])); - ibz_copy(&((*reduced)[0][1]),&(a[0])); - ibz_copy(&((*reduced)[1][1]),&(a[1])); - - ibz_finalize(&prod); - ibz_finalize(&sum); - ibz_finalize(&norm_a); - ibz_finalize(&norm_b); - ibz_finalize(&norm_t); - ibz_vec_2_finalize(&a); - ibz_vec_2_finalize(&b); - ibz_vec_2_finalize(&t); - ibz_finalize(&r); - ibz_finalize(&n); -} - -// compute the rounded value of /, where a* is a orthogonalised with respect to b -void quat_dim2_lattice_get_coefficient_with_orthogonalisation(ibz_t *res, const ibz_t *a0,const ibz_t *a1,const ibz_t *b0,const ibz_t *b1,const ibz_t *t0,const ibz_t *t1,const ibz_t *norm_q){ - ibz_t norm_b, bilinear, astar1,astar0, prod, norm_astar; - ibz_init(&norm_b); - ibz_init(&norm_astar); - ibz_init(&bilinear); - ibz_init(&prod); - ibz_init(&astar0); - ibz_init(&astar1); - quat_dim2_lattice_norm(&norm_b,b0,b1,norm_q); - quat_dim2_lattice_bilinear(&bilinear,a0,a1,b0,b1,norm_q); - ibz_mul(&astar0,a0,&norm_b); - ibz_mul(&prod,b0,&bilinear); - ibz_sub(&astar0,&astar0,&prod); - ibz_mul(&astar1,a1,&norm_b); - ibz_mul(&prod,b1,&bilinear); - ibz_sub(&astar1,&astar1,&prod); - quat_dim2_lattice_norm(&norm_astar,&astar0,&astar1,norm_q); - quat_dim2_lattice_bilinear(&bilinear,&astar0,&astar1,t0,t1,norm_q); - ibz_mul(&bilinear,&bilinear,&norm_b); - ibz_rounded_div(res,&bilinear,&norm_astar); - ibz_finalize(&norm_b); - ibz_finalize(&norm_astar); - ibz_finalize(&bilinear); - ibz_finalize(&prod); - ibz_finalize(&astar0); - ibz_finalize(&astar1); -} - -// find a closest vector to target in lattice, using a reduced basis given as argument basis. -//nearest plane algo as in https://cims.nyu.edu/~regev/teaching/lattices_fall_2004/ln/cvp.pdf, but without basis: basicallly just a projection -void quat_dim2_lattice_closest_vector(ibz_vec_2_t *target_minus_closest, ibz_vec_2_t *closest_coords_in_basis, const ibz_mat_2x2_t *reduced_basis, const ibz_vec_2_t *target, const ibz_t *norm_q){ - ibz_vec_2_t coords, work; - ibz_t prod, sum, norm_a, norm_b, r; - ibz_vec_2_init(&coords); - ibz_vec_2_init(&work); - ibz_init(&prod); - ibz_init(&sum); - ibz_init(&norm_a); - ibz_init(&norm_b); - ibz_init(&r); - // init work - ibz_copy(&(work[0]),&((*target)[0])); - ibz_copy(&(work[1]),&((*target)[1])); - // norm a,b - quat_dim2_lattice_norm(&norm_a,&((*reduced_basis)[0][0]),&((*reduced_basis)[1][0]), norm_q); - quat_dim2_lattice_norm(&norm_b,&((*reduced_basis)[0][1]),&((*reduced_basis)[1][1]), norm_q); - // use 2nd basis vector (the larger one), and orthogonalise it with respect to the first one - quat_dim2_lattice_get_coefficient_with_orthogonalisation(&(coords[1]),&((*reduced_basis)[0][1]),&((*reduced_basis)[1][1]), &((*reduced_basis)[0][0]),&((*reduced_basis)[1][0]),&(work[0]),&(work[1]),norm_q); - // sustract projection from vector - ibz_mul(&prod,&((*reduced_basis)[0][1]),&(coords[1])); - ibz_sub(&(work[0]),&(work[0]),&prod); - ibz_mul(&prod,&((*reduced_basis)[1][1]),&(coords[1])); - ibz_sub(&(work[1]),&(work[1]),&prod ); - // use 1st basis vector (the smaller one) - quat_dim2_lattice_bilinear(&(coords[0]),&(work[0]),&(work[1]),&((*reduced_basis)[0][0]),&((*reduced_basis)[1][0]),norm_q); - ibz_rounded_div(&(coords[0]),&(coords[0]),&norm_a); - // substract projection from vector - ibz_mul(&prod,&((*reduced_basis)[0][0]),&(coords[0])); - ibz_sub(&(work[0]),&(work[0]),&prod); - ibz_mul(&prod,&((*reduced_basis)[1][0]),&(coords[0])); - ibz_sub(&(work[1]),&(work[1]),&prod ); - // copy results to output - ibz_copy(&((*target_minus_closest)[0]),&(work[0])); - ibz_copy(&((*target_minus_closest)[1]),&(work[1])); - ibz_copy(&((*closest_coords_in_basis)[0]),&(coords[0])); - ibz_copy(&((*closest_coords_in_basis)[1]),&(coords[1])); - - ibz_vec_2_finalize(&coords); - ibz_vec_2_finalize(&work); - ibz_finalize(&prod); - ibz_finalize(&sum); - ibz_finalize(&norm_a); - ibz_finalize(&norm_b); - ibz_finalize(&r); -} - -// give a,b,c such that ax^2 + bxy + cy^2 = N(Bz), where B is the basis, z the vector x,y and N the quadratic form (coord1^2 + q coord2^2) -void quat_dim2_lattice_get_qf_on_lattice(ibz_t *qf_a, ibz_t *qf_b,ibz_t *qf_c, const ibz_mat_2x2_t *basis ,const ibz_t *norm_q){ - ibz_t a, b, c; - ibz_init(&a); - ibz_init(&b); - ibz_init(&c); - quat_dim2_lattice_bilinear(&b,&((*basis)[0][0]), &((*basis)[1][0]), &((*basis)[0][1]), &((*basis)[1][1]),norm_q); - ibz_set(&a,2); - ibz_mul(&b,&b,&a); - quat_dim2_lattice_norm(&a,&((*basis)[0][0]), &((*basis)[1][0]),norm_q); - quat_dim2_lattice_norm(&c, &((*basis)[0][1]), &((*basis)[1][1]),norm_q); - ibz_copy(qf_a,&a); - ibz_copy(qf_b,&b); - ibz_copy(qf_c,&c); - ibz_finalize(&a); - ibz_finalize(&b); - ibz_finalize(&c); -} - -int quat_dim2_lattice_test_cvp_condition(quat_alg_elem_t* elem, const ibz_vec_2_t* vec, const void* params){ - ibz_t *p = ((ibz_t *) params); - ibz_t sum, two; - ibz_init(&sum); - ibz_init(&two); - ibz_set(&two,2); - ibz_add(&sum,&((*vec)[0]),&((*vec)[1])); - ibz_mod(&sum,&sum,p); - int res = (0 ==ibz_cmp(&sum,&two)); - if(res){ - quat_alg_elem_copy_ibz(elem,&two,&((*vec)[0]),&((*vec)[1]),&((*vec)[0]),&((*vec)[1])); - } - ibz_finalize(&sum); - ibz_finalize(&two); - return(res); -} - -int quat_dim2_lattice_bound_and_condition(quat_alg_elem_t *res, const ibz_t *x, const ibz_t *y, int (*condition)(quat_alg_elem_t* , const ibz_vec_2_t*, const void*), const void* params, const ibz_vec_2_t* target_minus_closest, const ibz_mat_2x2_t *lat_basis, const ibz_t* norm_q, const ibz_t* norm_bound){ - ibz_vec_2_t sum, proposal; - ibz_t norm; - int ok = 0; - ibz_init(&norm); - ibz_vec_2_init(&sum); - ibz_vec_2_init(&proposal); - // put x,y from lattice basis in canonical basis - ibz_copy(&(proposal[0]), x); - ibz_copy(&(proposal[1]), y); - ibz_mat_2x2_eval(&proposal,lat_basis,&proposal); - //compute norm of target -closest-proposal - ibz_sub(&(sum[0]),&((*target_minus_closest)[0]),&((proposal)[0])); - ibz_sub(&(sum[1]),&((*target_minus_closest)[1]),&((proposal)[1])); - quat_dim2_lattice_norm(&norm,&(sum[0]),&(sum[1]),norm_q); - // test - if( ibz_cmp(&norm,norm_bound) <= 0){ - ok = condition(res,&sum,params); - } - ibz_finalize(&norm); - ibz_vec_2_finalize(&sum); - ibz_vec_2_finalize(&proposal); - return(ok); -} - -int quat_dim2_lattice_qf_value_bound_generation(ibz_t *res, const ibz_t *num_a, const ibz_t *denom_a, const ibz_t *num_b, const ibz_t *denom_b){ - int ok = 1; - ibz_t sqrt_num, sqrt_denom, one, zero, common_denom, r; - ibz_init(&sqrt_num); - ibz_init(&sqrt_denom); - ibz_init(&one); - ibz_init(&zero); - ibz_init(&common_denom); - ibz_init(&r); - ibz_set(&zero,0); - ibz_set(&one,1); - ibz_mul(&r,num_a,denom_a); - if((ibz_cmp(denom_a,&zero)<0)||ibz_is_zero(denom_a)||ibz_is_zero(denom_b)){ - ok = 0; - } - if(ok){ - ibz_sqrt_floor(&sqrt_num,num_a); - ibz_add(&sqrt_num,&sqrt_num, &one); - ibz_sqrt_floor(&sqrt_denom,denom_a); - - ibz_mul(&common_denom,denom_b,&sqrt_denom); - ibz_mul(&sqrt_num,&sqrt_num,denom_b); - ibz_mul(&r,&sqrt_denom,num_b); - ibz_add(&sqrt_num,&sqrt_num,&r); - ibz_div(res,&r,&sqrt_num,&common_denom); - ibz_add(res,res,&one); - - } - ibz_finalize(&sqrt_num); - ibz_finalize(&sqrt_denom); - ibz_finalize(&one); - ibz_finalize(&zero); - ibz_finalize(&common_denom); - ibz_finalize(&r); - return(ok); -} - -//Uses algorithm 2.7.5 (Fincke-Pohst) from Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 -//Slightly adapted to work without rational numbers and their square roots -//Therefore needing a test to make sure the bounds are respected -int quat_dim2_lattice_qf_enumerate_short_vec(quat_alg_elem_t *res,int (*condition)(quat_alg_elem_t*, const ibz_vec_2_t*, const void*), const void *params, const ibz_vec_2_t *target_minus_closest, const ibz_mat_2x2_t *lat_basis, const ibz_t *norm_q,const ibz_t *norm_bound, const int max_tries){ - int ok = 1; - int found = 0; - int tries = 0; - int stop = 0; - ibz_t bound_y, bound_x, x, y, disc, prod, var, one, four_a2, four_a2_norm_bound, four_a2_c_minus_b2, four_a3,two_a, zero, y2, qf_a, qf_b, qf_c, norm_bound_for_enumeration; - ibz_init(&bound_y); - ibz_init(&bound_x); - ibz_init(&y); - ibz_init(&y2); - ibz_init(&x); - ibz_init(&qf_a); - ibz_init(&qf_b); - ibz_init(&qf_c); - ibz_init(&var); - ibz_init(&one); - ibz_init(&zero); - ibz_init(&disc); - ibz_init(&prod); - ibz_init(&four_a2); - ibz_init(&two_a); - ibz_init(&norm_bound_for_enumeration); - ibz_init(&four_a2_norm_bound); - ibz_init(&four_a2_c_minus_b2); - ibz_init(&four_a3); - ibz_set(&one,1); - ibz_set(&zero,0); - // substract norm of distance from bound to not enumerate too large vectors at beginning - // this is an heuristic which can fail, so in case it is really bad, we do not do it - quat_dim2_lattice_norm(&norm_bound_for_enumeration,&((*target_minus_closest)[0]),&((*target_minus_closest)[1]),norm_q); - ibz_sub(&norm_bound_for_enumeration,norm_bound,&norm_bound_for_enumeration); - if(ibz_cmp(&norm_bound_for_enumeration,&zero)<=0){ - ibz_copy(&norm_bound_for_enumeration, norm_bound); - } - //Set qf_a, qf_b, qf_c such that for x,y, a vector represented in lat_basis, ax^2 + bxy + cy^2 is the norm defined by norm_q - quat_dim2_lattice_get_qf_on_lattice(&qf_a,&qf_b,&qf_c,lat_basis,norm_q); - //discriminant computation - ibz_mul(&disc,&qf_a,&qf_c); - ibz_set(&var,4); - ibz_mul(&disc,&disc,&var); - ibz_mul(&prod,&qf_b,&qf_b); - ibz_sub(&disc,&disc,&prod); - // only continue if disc is not zero nor negative - if (ibz_cmp(&disc,&zero)<=0){ - ok = 0; - } - if(ok){ - // precomputations - ibz_set(&var,2); - ibz_mul(&two_a,&var,&qf_a);//2a init - ibz_mul(&four_a2,&two_a,&two_a);//4a^2 init - ibz_mul(&four_a2_norm_bound,&four_a2,&norm_bound_for_enumeration);//4a^2*norm_bound init - ibz_mul(&four_a3,&four_a2,&qf_a);//4a^3 init - ibz_copy(&four_a2_c_minus_b2,&prod);//equals b^2 now, since prod was not reused since - ibz_mul(&prod,&four_a2,&qf_c); - ibz_sub(&four_a2_c_minus_b2,&prod,&four_a2_c_minus_b2);//now has correct value - // y bound generation - quat_dim2_lattice_qf_value_bound_generation(&bound_y,&four_a2_norm_bound,&four_a2_c_minus_b2,&zero,&one); - ibz_neg(&y,&bound_y); - ibz_sub(&y,&y,&one); // y is set - while((!found) && (!stop) && (ibz_cmp(&y,&bound_y)<0) && (tries #include "internal.h" -//internal helper functions -void ibz_mat_4x4_mul(ibz_mat_4x4_t *res, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b){ +// internal helper functions +void +ibz_mat_4x4_mul(ibz_mat_4x4_t *res, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b) +{ ibz_mat_4x4_t mat; ibz_t prod; ibz_init(&prod); ibz_mat_4x4_init(&mat); - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ - ibz_set(&(mat[i][j]),0); - for (int k = 0; k <4; k++){ - ibz_mul(&prod,&((*a)[i][k]), &((*b)[k][j])); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), 0); + for (int k = 0; k < 4; k++) { + ibz_mul(&prod, &((*a)[i][k]), &((*b)[k][j])); ibz_add(&(mat[i][j]), &(mat[i][j]), &prod); } } } - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ - ibz_copy(&((*res)[i][j]),&(mat[i][j])); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(&((*res)[i][j]), &(mat[i][j])); } } ibz_mat_4x4_finalize(&mat); ibz_finalize(&prod); } -//helper functions for lattices -void ibz_vec_4_set(ibz_vec_4_t *vec, int64_t coord0, int64_t coord1, int64_t coord2, int64_t coord3){ - ibz_set(&((*vec)[0]),coord0); - ibz_set(&((*vec)[1]),coord1); - ibz_set(&((*vec)[2]),coord2); - ibz_set(&((*vec)[3]),coord3); +// helper functions for lattices +void +ibz_vec_4_set(ibz_vec_4_t *vec, int32_t coord0, int32_t coord1, int32_t coord2, int32_t coord3) +{ + ibz_set(&((*vec)[0]), coord0); + ibz_set(&((*vec)[1]), coord1); + ibz_set(&((*vec)[2]), coord2); + ibz_set(&((*vec)[3]), coord3); } -void ibz_vec_4_copy(ibz_vec_4_t *new, const ibz_vec_4_t *vec){ - for (int i = 0; i <4; i++){ - ibz_copy(&((*new)[i]),&((*vec)[i])); +void +ibz_vec_4_copy(ibz_vec_4_t *new, const ibz_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibz_copy(&((*new)[i]), &((*vec)[i])); } } -void ibz_vec_4_negate(ibz_vec_4_t *neg, const ibz_vec_4_t *vec){ - for (int i = 0; i <4; i++){ - ibz_neg(&((*neg)[i]),&((*vec)[i])); +void +ibz_vec_4_copy_ibz(ibz_vec_4_t *res, const ibz_t *coord0, const ibz_t *coord1, const ibz_t *coord2, const ibz_t *coord3) +{ + ibz_copy(&((*res)[0]), coord0); + ibz_copy(&((*res)[1]), coord1); + ibz_copy(&((*res)[2]), coord2); + ibz_copy(&((*res)[3]), coord3); +} + +void +ibz_vec_4_content(ibz_t *content, const ibz_vec_4_t *v) +{ + ibz_gcd(content, &((*v)[0]), &((*v)[1])); + ibz_gcd(content, &((*v)[2]), content); + ibz_gcd(content, &((*v)[3]), content); +} + +void +ibz_vec_4_negate(ibz_vec_4_t *neg, const ibz_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibz_neg(&((*neg)[i]), &((*vec)[i])); } } -void ibz_vec_4_linear_combination(ibz_vec_4_t *lc, const ibz_t *coeff_a, const ibz_vec_4_t *vec_a, const ibz_t *coeff_b, const ibz_vec_4_t *vec_b){ +void +ibz_vec_4_add(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b) +{ + ibz_add(&((*res)[0]), &((*a)[0]), &((*b)[0])); + ibz_add(&((*res)[1]), &((*a)[1]), &((*b)[1])); + ibz_add(&((*res)[2]), &((*a)[2]), &((*b)[2])); + ibz_add(&((*res)[3]), &((*a)[3]), &((*b)[3])); +} + +void +ibz_vec_4_sub(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b) +{ + ibz_sub(&((*res)[0]), &((*a)[0]), &((*b)[0])); + ibz_sub(&((*res)[1]), &((*a)[1]), &((*b)[1])); + ibz_sub(&((*res)[2]), &((*a)[2]), &((*b)[2])); + ibz_sub(&((*res)[3]), &((*a)[3]), &((*b)[3])); +} + +int +ibz_vec_4_is_zero(const ibz_vec_4_t *x) +{ + int res = 1; + for (int i = 0; i < 4; i++) { + res &= ibz_is_zero(&((*x)[i])); + } + return (res); +} + +void +ibz_vec_4_linear_combination(ibz_vec_4_t *lc, + const ibz_t *coeff_a, + const ibz_vec_4_t *vec_a, + const ibz_t *coeff_b, + const ibz_vec_4_t *vec_b) +{ ibz_t prod; ibz_vec_4_t sums; ibz_vec_4_init(&sums); ibz_init(&prod); - for (int i = 0; i <4; i++){ - ibz_mul(&(sums[i]),coeff_a,&((*vec_a)[i])); - ibz_mul(&prod,coeff_b,&((*vec_b)[i])); - ibz_add(&(sums[i]),&(sums[i]),&prod); + for (int i = 0; i < 4; i++) { + ibz_mul(&(sums[i]), coeff_a, &((*vec_a)[i])); + ibz_mul(&prod, coeff_b, &((*vec_b)[i])); + ibz_add(&(sums[i]), &(sums[i]), &prod); } - for (int i = 0; i <4; i++){ - ibz_copy(&((*lc)[i]),&(sums[i])); + for (int i = 0; i < 4; i++) { + ibz_copy(&((*lc)[i]), &(sums[i])); } ibz_finalize(&prod); ibz_vec_4_finalize(&sums); } -int ibz_vec_4_scalar_div(ibz_vec_4_t *quot, const ibz_t *scalar, const ibz_vec_4_t *vec){ +void +ibz_vec_4_scalar_mul(ibz_vec_4_t *prod, const ibz_t *scalar, const ibz_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibz_mul(&((*prod)[i]), &((*vec)[i]), scalar); + } +} + +int +ibz_vec_4_scalar_div(ibz_vec_4_t *quot, const ibz_t *scalar, const ibz_vec_4_t *vec) +{ int res = 1; ibz_t r; ibz_init(&r); - for(int i = 0; i < 4; i++){ - ibz_div(&((*quot)[i]),&r,&((*vec)[i]),scalar); + for (int i = 0; i < 4; i++) { + ibz_div(&((*quot)[i]), &r, &((*vec)[i]), scalar); res = res && ibz_is_zero(&r); } ibz_finalize(&r); - return(res); + return (res); } -void ibz_mat_4x4_copy(ibz_mat_4x4_t *new, const ibz_mat_4x4_t *mat){ - for(int i = 0; i <4; i++){ - for(int j = 0; j<4; j++){ - ibz_copy(&((*new)[i][j]),&((*mat)[i][j])); +void +ibz_mat_4x4_copy(ibz_mat_4x4_t *new, const ibz_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(&((*new)[i][j]), &((*mat)[i][j])); } } } -void ibz_mat_4x4_negate(ibz_mat_4x4_t *neg, const ibz_mat_4x4_t *mat){ - for(int i = 0; i <4; i++){ - for(int j = 0; j<4; j++){ - ibz_neg(&((*neg)[i][j]),&((*mat)[i][j])); +void +ibz_mat_4x4_negate(ibz_mat_4x4_t *neg, const ibz_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_neg(&((*neg)[i][j]), &((*mat)[i][j])); } } } -void ibz_mat_4x4_transpose(ibz_mat_4x4_t *transposed, const ibz_mat_4x4_t *mat){ +void +ibz_mat_4x4_transpose(ibz_mat_4x4_t *transposed, const ibz_mat_4x4_t *mat) +{ ibz_mat_4x4_t work; ibz_mat_4x4_init(&work); - for(int i = 0; i < 4; i ++){ - for(int j = 0; j < 4; j ++){ - ibz_copy(&(work[i][j]),&((*mat)[j][i])); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(&(work[i][j]), &((*mat)[j][i])); } } - ibz_mat_4x4_copy(transposed,&work); + ibz_mat_4x4_copy(transposed, &work); ibz_mat_4x4_finalize(&work); } -void ibz_mat_4x4_zero(ibz_mat_4x4_t *zero){ - for(int i = 0; i <4; i++){ - for(int j = 0; j<4; j++){ - ibz_set(&((*zero)[i][j]),0); +void +ibz_mat_4x4_zero(ibz_mat_4x4_t *zero) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&((*zero)[i][j]), 0); } } } -void ibz_mat_4x4_identity(ibz_mat_4x4_t *id){ - for(int i = 0; i <4; i++){ - for(int j = 0; j<4; j++){ - ibz_set(&((*id)[i][j]),0); +void +ibz_mat_4x4_identity(ibz_mat_4x4_t *id) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&((*id)[i][j]), 0); } - ibz_set(&((*id)[i][i]),1); + ibz_set(&((*id)[i][i]), 1); } } -int ibz_mat_4x4_is_identity(const ibz_mat_4x4_t *mat){ +int +ibz_mat_4x4_is_identity(const ibz_mat_4x4_t *mat) +{ int res = 1; - for(int i = 0; i <4; i++){ - for(int j = 0; j<4; j++){ - res = res && (ibz_get(&((*mat)[i][j])) == (i==j)); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res && ibz_is_one(&((*mat)[i][j])) == (i == j); } } - return(res); + return (res); } -int ibz_mat_4x4_equal(const ibz_mat_4x4_t *mat1, const ibz_mat_4x4_t *mat2){ +int +ibz_mat_4x4_equal(const ibz_mat_4x4_t *mat1, const ibz_mat_4x4_t *mat2) +{ int res = 0; - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - res = res || ibz_cmp(&((*mat1)[i][j]),&((*mat2)[i][j])); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res | ibz_cmp(&((*mat1)[i][j]), &((*mat2)[i][j])); } } - return(!res); + return (!res); } -void ibz_mat_4x4_scalar_mul(ibz_mat_4x4_t *prod, const ibz_t *scalar, const ibz_mat_4x4_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_mul(&((*prod)[i][j]),&((*mat)[i][j]),scalar); +void +ibz_mat_4x4_scalar_mul(ibz_mat_4x4_t *prod, const ibz_t *scalar, const ibz_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_mul(&((*prod)[i][j]), &((*mat)[i][j]), scalar); } } } -void ibz_mat_4x4_gcd(ibz_t *gcd, const ibz_mat_4x4_t *mat){ +void +ibz_mat_4x4_gcd(ibz_t *gcd, const ibz_mat_4x4_t *mat) +{ ibz_t d; ibz_init(&d); ibz_copy(&d, &((*mat)[0][0])); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_gcd(&d,&d,&((*mat)[i][j])); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_gcd(&d, &d, &((*mat)[i][j])); } } - ibz_copy(gcd,&d); + ibz_copy(gcd, &d); ibz_finalize(&d); } -int ibz_mat_4x4_scalar_div(ibz_mat_4x4_t *quot, const ibz_t *scalar, const ibz_mat_4x4_t *mat){ +int +ibz_mat_4x4_scalar_div(ibz_mat_4x4_t *quot, const ibz_t *scalar, const ibz_mat_4x4_t *mat) +{ int res = 1; ibz_t r; ibz_init(&r); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_div(&((*quot)[i][j]),&r,&((*mat)[i][j]),scalar); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_div(&((*quot)[i][j]), &r, &((*mat)[i][j]), scalar); res = res && ibz_is_zero(&r); } } ibz_finalize(&r); - return(res); + return (res); } - -int ibz_mat_4x4_is_hnf(const ibz_mat_4x4_t *mat){ - int res = 1; - int found = 0; - int ind = 0; - ibz_t zero; - ibz_init(&zero); - // upper triangular - for (int i = 0; i < 4; i++){ - // upper triangular - for (int j = 0; j < i; j++){ - res = res && ibz_is_zero(&((*mat)[i][j])); - } - // find first non 0 element of line - found = 0; - for (int j = i; j < 4; j++){ - if(found){ - // all values are positive, and first non-0 is the largest of that line - res = res && (ibz_cmp(&((*mat)[i][j]),&zero)>=0); - res = res && (ibz_cmp(&((*mat)[i][ind]),&((*mat)[i][j]))>0); - } else { - if(!ibz_is_zero(&((*mat)[i][j]))){ - found = 1; - ind = j; - // mustbe non-negative - res = res && (ibz_cmp(&((*mat)[i][j]),&zero)>0); - } - } - } - } - // check that first nom-zero elements ndex per column is strictly increasing - int linestart = -1; - int i = 0; - for(int j = 0; j<4; j++){ - while((i < 4) &&(ibz_is_zero(&((*mat)[i][j])))){ - i = i+1; - } if (i != 4) { - res = res && (linestart < i); - } - i = 0; - } - ibz_finalize(&zero); - return res; -} - -//Algorithm used is the one at number 2.4.5 in Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 -// assumes ibz_xgcd outputs u,v which are small in absolute value (as described in the book)void ibz_mat_4x8_hnf_core(ibz_mat_4x4_t *hnf, const ibz_mat_4x8_t *generators) -void ibz_mat_4x8_hnf_core(ibz_mat_4x4_t *hnf, const ibz_mat_4x8_t *generators) +// 4x4 inversion helper functions +void +ibz_inv_dim4_make_coeff_pmp(ibz_t *coeff, + const ibz_t *a1, + const ibz_t *a2, + const ibz_t *b1, + const ibz_t *b2, + const ibz_t *c1, + const ibz_t *c2) { - int i = 3; - int j = 7; - int k = 7; - ibz_t b, u, v, d, zero, coeff_1, coeff_2, r; - ibz_vec_4_t c; - ibz_vec_4_t a[8]; - ibz_init(&b); - ibz_init(&d); - ibz_init(&u); - ibz_init(&v); - ibz_init(&r); - ibz_init(&coeff_1); - ibz_init(&coeff_2); - ibz_init(&zero); - ibz_set(&zero,0); - ibz_vec_4_init(&c); - for (int h = 0; h < 8; h++){ - ibz_vec_4_init(&(a[h])); - ibz_copy(&(a[h][0]), &((*generators)[0][h])); - ibz_copy(&(a[h][1]), &((*generators)[1][h])); - ibz_copy(&(a[h][2]), &((*generators)[2][h])); - ibz_copy(&(a[h][3]), &((*generators)[3][h])); - } - while (i != -1){ - while (j != 0){ - j = j - 1; - if (!ibz_is_zero(&(a[j][i]))){ - // assumtion that ibz_xgcd outputs u,v which are small in absolute value is needed here - ibz_xgcd(&d,&u,&v,&(a[k][i]),&(a[j][i])); - // also, needs u non 0, but v can be 0 if needed - if(ibz_is_zero(&u)){ - ibz_div(&v,&r,&(a[k][i]),&(a[j][i])); - ibz_set(&u,1); - ibz_sub(&v,&u,&v); - } - ibz_vec_4_linear_combination(&c,&u,&(a[k]),&v,&(a[j])); - ibz_div(&coeff_1,&r, &(a[k][i]),&d); - ibz_div(&coeff_2,&r, &(a[j][i]),&d); - ibz_neg(&coeff_2, &coeff_2); - ibz_vec_4_linear_combination(&(a[j]),&coeff_1,&(a[j]),&coeff_2,&(a[k])); - ibz_vec_4_copy(&(a[k]),&c); - } - } - ibz_copy(&b,&(a[k][i])); - if (ibz_cmp(&b, &zero) < 0){ - ibz_vec_4_negate(&(a[k]),&(a[k])); - ibz_neg(&b, &b); - } - if (ibz_is_zero(&b)){ - k = k + 1; - } else { - for(j = k+1; j < 8; j++) { - ibz_div(&d,&r,&(a[j][i]),&b); - if(ibz_cmp(&r,&zero) < 0){ - ibz_set(&r,1); - ibz_sub(&d,&d,&r); - } - ibz_set(&r,1); - ibz_neg(&d,&d); - ibz_vec_4_linear_combination(&(a[j]),&r,&(a[j]),&d ,&(a[k])); - } - } - if (i != 0) { - k = k - 1; - j = k; - } - i = i - 1; - } - for (j = 4; j < 8; j++) { - for(i = 0; i < 4; i++){ - ibz_copy(&((*hnf)[i][j-4]),&(a[j][i])); - } - } - - ibz_finalize(&b); - ibz_finalize(&d); - ibz_finalize(&u); - ibz_finalize(&v); - ibz_finalize(&r); - ibz_finalize(&coeff_1); - ibz_finalize(&coeff_2); - ibz_finalize(&zero); - ibz_vec_4_finalize(&c); - for (int h = 0; h < 8; h++) - { - ibz_vec_4_finalize(&(a[h])); - } -} - -void ibz_mat_4x4_hnf_mod(ibz_mat_4x4_t *hnf, const ibz_mat_4x4_t *mat, const ibz_t *mod){ - ibz_mat_4x8_t input; - ibz_mat_4x8_init(&input); - for(int i = 0; i <4; i++){ - for(int j = 0; j <4; j++){ - ibz_copy(&(input[i][j]),&((*mat)[i][j])); - ibz_set(&(input[i][j+4]),0); - } - ibz_copy(&(input[i][i+4]),mod); - } - ibz_mat_4x8_hnf_core(hnf,&input); - ibz_mat_4x8_finalize(&input); -} - - -// functions to verify lll -void ibq_vec_4_copy_ibz(ibq_t (*vec)[4], const ibz_t *coeff0, const ibz_t *coeff1,const ibz_t *coeff2,const ibz_t *coeff3){ - ibz_t one; - ibz_init(&one); - ibz_set(&one,1); - ibq_set(&((*vec)[0]),coeff0,&one); - ibq_set(&((*vec)[1]),coeff1,&one); - ibq_set(&((*vec)[2]),coeff2,&one); - ibq_set(&((*vec)[3]),coeff3,&one); - ibz_finalize(&one); -} - - -void quat_dim4_lll_bilinear(ibq_t *b, const ibq_t (*vec0)[4], const ibq_t (*vec1)[4], const ibz_t *q){ - ibq_t sum, prod,norm_q; - ibz_t one; - ibz_init(&one); - ibz_set(&one,1); - ibq_init(&sum); - ibq_init(&prod); - ibq_init(&norm_q); - ibq_set(&norm_q,q,&one); - - ibq_mul(&sum,&((*vec0)[0]),&((*vec1)[0])); - ibq_mul(&prod,&((*vec0)[1]),&((*vec1)[1])); - ibq_add(&sum,&sum,&prod); - ibq_mul(&prod,&((*vec0)[2]),&((*vec1)[2])); - ibq_mul(&prod,&prod,&norm_q); - ibq_add(&sum,&sum,&prod); - ibq_mul(&prod,&((*vec0)[3]),&((*vec1)[3])); - ibq_mul(&prod,&prod,&norm_q); - ibq_add(b,&sum,&prod); - - ibz_finalize(&one); - ibq_finalize(&sum); - ibq_finalize(&prod); - ibq_finalize(&norm_q); -} - -void quat_dim4_gram_schmidt_transposed_with_ibq(ibq_t (*orthogonalised_transposed)[4][4], const ibz_mat_4x4_t *mat, const ibz_t *q){ - ibq_t work[4][4]; - ibq_t vec[4]; - ibq_t norm, b, coeff, prod; - ibq_init(&norm); - ibq_init(&coeff); - ibq_init(&prod); - ibq_init(&b); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_init(&(work[i][j])); - } - ibq_init(&(vec[i])); - } - // transpose the input matrix to be able to work on vectors - for(int i = 0; i < 4; i++){ - ibq_vec_4_copy_ibz(&(work[i]),&((*mat)[0][i]),&((*mat)[1][i]),&((*mat)[2][i]),&((*mat)[3][i])); - } - - for(int i = 0; i < 4; i++){ - quat_dim4_lll_bilinear(&norm,&(work[i]),&(work[i]),q); - ibq_inv(&norm,&norm); - for(int j = i+1; j < 4; j++){ - ibq_vec_4_copy_ibz(&vec, &((*mat)[0][j]),&((*mat)[1][j]),&((*mat)[2][j]),&((*mat)[3][j])); - quat_dim4_lll_bilinear(&b,&(work[i]),&vec,q); - ibq_mul(&coeff,&norm,&b); - for(int k = 0; k < 4; k++){ - ibq_mul(&prod,&coeff,&(work[i][k])); - ibq_sub(&(work[j][k]),&(work[j][k]),&prod); - } - } - } - - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_copy(&((*orthogonalised_transposed)[i][j]),&(work[i][j])); - } - } - - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_finalize(&(work[i][j])); - } - ibq_finalize(&(vec[i])); - } - ibq_finalize(&norm); - ibq_finalize(&coeff); - ibq_finalize(&prod); - ibq_finalize(&b); -} - -int quat_dim4_lll_verify(const ibz_mat_4x4_t *mat, const ibq_t *coeff, const ibz_t *q){ - int res = 1; - ibq_t orthogonalised_transposed[4][4]; - ibq_t tmp_vec[4]; - ibq_t div,tmp,mu,two, norm, b; - ibz_t mu2_floored,num,denom; - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_init(&(orthogonalised_transposed[i][j])); - } - ibq_init(&(tmp_vec[i])); - } - ibq_init(&div); - ibq_init(&tmp); - ibq_init(&norm); - ibq_init(&b); - ibq_init(&mu); - ibq_init(&two); - ibz_init(&mu2_floored); - ibz_init(&num); - ibz_init(&denom); - ibz_set(&num,2); - ibz_set(&denom,1); - ibq_set(&two,&num,&denom); - - quat_dim4_gram_schmidt_transposed_with_ibq(&orthogonalised_transposed, mat,q); - // check small bilinear products/norms - for(int i = 0; i < 4; i++){ - for(int j = 0; j < i; j++){ - ibq_vec_4_copy_ibz(&tmp_vec, &((*mat)[0][i]),&((*mat)[1][i]),&((*mat)[2][i]),&((*mat)[3][i])); - quat_dim4_lll_bilinear(&b, &(orthogonalised_transposed[j]),&tmp_vec,q); - quat_dim4_lll_bilinear(&norm, &(orthogonalised_transposed[j]),&(orthogonalised_transposed[j]),q); - ibq_inv(&tmp,&norm); - ibq_mul(&mu,&b,&tmp); - //mu contains 2mu from now on - ibq_mul(&tmp,&mu,&two); - ibq_num(&num,&tmp); - ibq_denom(&denom,&tmp); - //assume rounding to 0 - ibz_div(&mu2_floored,&denom,&num,&denom); - // 2*mu floores is 0 or mu is exactly 1/2, so (2mu)^2 is exactly 1 - ibq_mul(&tmp,&tmp,&tmp); - res = res && (ibz_is_zero(&mu2_floored) || ibq_is_one(&tmp)); - } - } - for(int i = 1; i < 4; i++){ - ibq_vec_4_copy_ibz(&tmp_vec, &((*mat)[0][i]),&((*mat)[1][i]),&((*mat)[2][i]),&((*mat)[3][i])); - quat_dim4_lll_bilinear(&b, &(orthogonalised_transposed[i-1]),&tmp_vec,q); - quat_dim4_lll_bilinear(&norm, &(orthogonalised_transposed[i-1]),&(orthogonalised_transposed[i-1]),q); - ibq_inv(&tmp,&norm); - ibq_mul(&mu,&b,&tmp); - // tmp is mu^2 - ibq_mul(&tmp,&mu,&mu); - // mu is coeff-mu^2 - ibq_sub(&mu,coeff,&tmp); - quat_dim4_lll_bilinear(&tmp, &(orthogonalised_transposed[i]),&(orthogonalised_transposed[i]),q); - //get (3/4-mu^2)norm(i-1) - ibq_mul(&div,&norm,&mu); - res = res && (ibq_cmp(&tmp,&div) >= 0); - } - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_finalize(&(orthogonalised_transposed[i][j])); - } - ibq_finalize(&(tmp_vec[i])); - } - ibq_finalize(&div); - ibq_finalize(&norm); - ibq_finalize(&b); - ibq_finalize(&tmp); - ibq_finalize(&mu); - ibq_finalize(&two); - ibz_finalize(&mu2_floored); - ibz_finalize(&num); - ibz_finalize(&denom); - return(res); -} - -//4x4 inversion helper functions -void ibz_inv_dim4_make_coeff_pmp(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, const ibz_t *b2, const ibz_t *c1, const ibz_t *c2){ ibz_t prod, sum; ibz_init(&prod); ibz_init(&sum); - ibz_mul(&sum,a1,a2); - ibz_mul(&prod,b1,b2); - ibz_sub(&sum,&sum,&prod); - ibz_mul(&prod,c1,c2); - ibz_add(coeff,&sum,&prod); + ibz_mul(&sum, a1, a2); + ibz_mul(&prod, b1, b2); + ibz_sub(&sum, &sum, &prod); + ibz_mul(&prod, c1, c2); + ibz_add(coeff, &sum, &prod); ibz_finalize(&prod); ibz_finalize(&sum); } -void ibz_inv_dim4_make_coeff_mpm(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, const ibz_t *b2, const ibz_t *c1, const ibz_t *c2){ +void +ibz_inv_dim4_make_coeff_mpm(ibz_t *coeff, + const ibz_t *a1, + const ibz_t *a2, + const ibz_t *b1, + const ibz_t *b2, + const ibz_t *c1, + const ibz_t *c2) +{ ibz_t prod, sum; ibz_init(&prod); ibz_init(&sum); - ibz_mul(&sum,b1,b2); - ibz_mul(&prod,a1,a2); - ibz_sub(&sum,&sum,&prod); - ibz_mul(&prod,c1,c2); - ibz_sub(coeff,&sum,&prod); + ibz_mul(&sum, b1, b2); + ibz_mul(&prod, a1, a2); + ibz_sub(&sum, &sum, &prod); + ibz_mul(&prod, c1, c2); + ibz_sub(coeff, &sum, &prod); ibz_finalize(&prod); ibz_finalize(&sum); } -//Method from https://www.geometrictools.com/Documentation/LaplaceExpansionTheorem.pdf 3rd of May 2023, 16h15 CEST -int ibz_mat_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t *mat){ - ibz_t prod,work_det; +// Method from https://www.geometrictools.com/Documentation/LaplaceExpansionTheorem.pdf 3rd of May +// 2023, 16h15 CEST +int +ibz_mat_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t *mat) +{ + ibz_t prod, work_det; ibz_mat_4x4_t work; ibz_t s[6]; ibz_t c[6]; - for (int i = 0; i < 6; i++){ + for (int i = 0; i < 6; i++) { ibz_init(&(s[i])); ibz_init(&(c[i])); } @@ -536,307 +323,148 @@ int ibz_mat_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_ ibz_init(&prod); ibz_init(&work_det); - //compute some 2x2 minors, store them in s and c - for (int i = 0; i < 3; i++){ - ibz_mat_2x2_det_from_ibz(&(s[i]),&((*mat)[0][0]),&((*mat)[0][i+1]),&((*mat)[1][0]),&((*mat)[1][i+1])); - ibz_mat_2x2_det_from_ibz(&(c[i]),&((*mat)[2][0]),&((*mat)[2][i+1]),&((*mat)[3][0]),&((*mat)[3][i+1])); + // compute some 2x2 minors, store them in s and c + for (int i = 0; i < 3; i++) { + ibz_mat_2x2_det_from_ibz(&(s[i]), &((*mat)[0][0]), &((*mat)[0][i + 1]), &((*mat)[1][0]), &((*mat)[1][i + 1])); + ibz_mat_2x2_det_from_ibz(&(c[i]), &((*mat)[2][0]), &((*mat)[2][i + 1]), &((*mat)[3][0]), &((*mat)[3][i + 1])); } - for (int i = 0; i < 2; i++){ - ibz_mat_2x2_det_from_ibz(&(s[3+i]),&((*mat)[0][1]),&((*mat)[0][2+i]),&((*mat)[1][1]),&((*mat)[1][2+i])); - ibz_mat_2x2_det_from_ibz(&(c[3+i]),&((*mat)[2][1]),&((*mat)[2][2+i]),&((*mat)[3][1]),&((*mat)[3][2+i])); + for (int i = 0; i < 2; i++) { + ibz_mat_2x2_det_from_ibz( + &(s[3 + i]), &((*mat)[0][1]), &((*mat)[0][2 + i]), &((*mat)[1][1]), &((*mat)[1][2 + i])); + ibz_mat_2x2_det_from_ibz( + &(c[3 + i]), &((*mat)[2][1]), &((*mat)[2][2 + i]), &((*mat)[3][1]), &((*mat)[3][2 + i])); } - ibz_mat_2x2_det_from_ibz(&(s[5]),&((*mat)[0][2]),&((*mat)[0][3]),&((*mat)[1][2]),&((*mat)[1][3])); - ibz_mat_2x2_det_from_ibz(&(c[5]),&((*mat)[2][2]),&((*mat)[2][3]),&((*mat)[3][2]),&((*mat)[3][3])); + ibz_mat_2x2_det_from_ibz(&(s[5]), &((*mat)[0][2]), &((*mat)[0][3]), &((*mat)[1][2]), &((*mat)[1][3])); + ibz_mat_2x2_det_from_ibz(&(c[5]), &((*mat)[2][2]), &((*mat)[2][3]), &((*mat)[3][2]), &((*mat)[3][3])); - //compute det - ibz_set(&work_det,0); - for (int i = 0; i < 6; i++){ - ibz_mul(&prod,&(s[i]),&(c[5-i])); - if ((i != 1) && (i != 4)){ - ibz_add(&work_det,&work_det,&prod); + // compute det + ibz_set(&work_det, 0); + for (int i = 0; i < 6; i++) { + ibz_mul(&prod, &(s[i]), &(c[5 - i])); + if ((i != 1) && (i != 4)) { + ibz_add(&work_det, &work_det, &prod); } else { - ibz_sub(&work_det,&work_det,&prod); + ibz_sub(&work_det, &work_det, &prod); } } - if (!ibz_is_zero(&work_det)){ - //compute transposed adjugate - for (int j = 0; j < 4; j++){ - for (int k = 0; k < 2; k++){ - if ((k + j + 1) % 2 == 1){ - ibz_inv_dim4_make_coeff_pmp(&(work[j][k]), &((*mat)[1-k][(j==0)]), &(c[6-j-(j==0)]), &((*mat)[1-k][2-(j>1)]), &(c[4-j-(j==1)]), &((*mat)[1-k][3-(j==3)]), &(c[3-j-(j==1)-(j==2)])); - } else { - ibz_inv_dim4_make_coeff_mpm(&(work[j][k]), &((*mat)[1-k][(j==0)]), &(c[6-j-(j==0)]), &((*mat)[1-k][2-(j>1)]), &(c[4-j-(j==1)]), &((*mat)[1-k][3-(j==3)]), &(c[3-j-(j==1)-(j==2)])); - } - } - for (int k = 2; k < 4; k++){ - if ((k + j + 1) % 2 == 1){ - ibz_inv_dim4_make_coeff_pmp(&(work[j][k]), &((*mat)[3-(k==3)][(j==0)]), &(s[6-j-(j==0)]),&((*mat)[3-(k==3)][2-(j>1)]), &(s[4-j-(j==1)]),&((*mat)[3-(k==3)][3-(j==3)]), &(s[3-j-(j==1)-(j==2)])); - } else { - ibz_inv_dim4_make_coeff_mpm(&(work[j][k]), &((*mat)[3-(k==3)][(j==0)]), &(s[6-j-(j==0)]),&((*mat)[3-(k==3)][2-(j>1)]), &(s[4-j-(j==1)]),&((*mat)[3-(k==3)][3-(j==3)]), &(s[3-j-(j==1)-(j==2)])); - } + // compute transposed adjugate + for (int j = 0; j < 4; j++) { + for (int k = 0; k < 2; k++) { + if ((k + j + 1) % 2 == 1) { + ibz_inv_dim4_make_coeff_pmp(&(work[j][k]), + &((*mat)[1 - k][(j == 0)]), + &(c[6 - j - (j == 0)]), + &((*mat)[1 - k][2 - (j > 1)]), + &(c[4 - j - (j == 1)]), + &((*mat)[1 - k][3 - (j == 3)]), + &(c[3 - j - (j == 1) - (j == 2)])); + } else { + ibz_inv_dim4_make_coeff_mpm(&(work[j][k]), + &((*mat)[1 - k][(j == 0)]), + &(c[6 - j - (j == 0)]), + &((*mat)[1 - k][2 - (j > 1)]), + &(c[4 - j - (j == 1)]), + &((*mat)[1 - k][3 - (j == 3)]), + &(c[3 - j - (j == 1) - (j == 2)])); + } + } + for (int k = 2; k < 4; k++) { + if ((k + j + 1) % 2 == 1) { + ibz_inv_dim4_make_coeff_pmp(&(work[j][k]), + &((*mat)[3 - (k == 3)][(j == 0)]), + &(s[6 - j - (j == 0)]), + &((*mat)[3 - (k == 3)][2 - (j > 1)]), + &(s[4 - j - (j == 1)]), + &((*mat)[3 - (k == 3)][3 - (j == 3)]), + &(s[3 - j - (j == 1) - (j == 2)])); + } else { + ibz_inv_dim4_make_coeff_mpm(&(work[j][k]), + &((*mat)[3 - (k == 3)][(j == 0)]), + &(s[6 - j - (j == 0)]), + &((*mat)[3 - (k == 3)][2 - (j > 1)]), + &(s[4 - j - (j == 1)]), + &((*mat)[3 - (k == 3)][3 - (j == 3)]), + &(s[3 - j - (j == 1) - (j == 2)])); } } - // put transposed adjugate in result - if(inv != NULL) - ibz_mat_4x4_copy(inv,&work); } - //output det in any case - if(det != NULL) - ibz_copy(det,&work_det); - for (int i = 0; i < 6; i++){ + if (inv != NULL) { + // put transposed adjugate in result, or 0 if no inverse + ibz_set(&prod, !ibz_is_zero(&work_det)); + ibz_mat_4x4_scalar_mul(inv, &prod, &work); + } + // output det + if (det != NULL) + ibz_copy(det, &work_det); + for (int i = 0; i < 6; i++) { ibz_finalize(&s[i]); ibz_finalize(&c[i]); } ibz_mat_4x4_finalize(&work); ibz_finalize(&work_det); ibz_finalize(&prod); - return(!ibz_is_zero(det)); -} - -// larger matrix modular kernel - -//Algorithm used is the one at number 2.3.1 in Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 -//most notations also are from there, except their r becoming kernel_dimension here and prod being used instaed of d as temporary variable. -int ibz_4x5_right_ker_mod_prime(ibz_vec_5_t *ker, const ibz_mat_4x5_t *mat, const ibz_t *p){ - int k, i, j, kernel_dim, columns, rows; - int c[4] ={0,0,0,0}; - int d[5]; - ibz_mat_4x5_t work_mat; - ibz_t prod, var; - ibz_init(&prod); - ibz_init(&var); - k = 0; - columns = 5; - rows = 4; - j = 0; - kernel_dim = 0; - ibz_mat_4x5_init(&work_mat); - for(int s = 0; s < rows; s++){ - for(int t = 0; t < columns; t++){ - ibz_mod(&(work_mat[s][t]),&((*mat)[s][t]),p); - } - } - while(k 0){ - ibz_mod(&((*ker)[s]),&(work_mat[d[s]-1][k]),p); - } - } - } - } - } - ibz_finalize(&prod); - ibz_finalize(&var); - ibz_mat_4x5_finalize(&work_mat); - return(kernel_dim==1); -} - -//same algo as ibz_4x5_right_ker_mod_prime, same notations, just the column number changes -int ibz_4x4_right_ker_mod_prime(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, const ibz_t *p){ - int k, i, j, kernel_dim, columns, rows; - int c[4] ={0,0,0,0}; - int d[4]; - ibz_mat_4x4_t work_mat; - ibz_t prod, var; - ibz_init(&prod); - ibz_init(&var); - k = 0; - columns = 4; - rows = 4; - j = 0; - kernel_dim = 0; - ibz_mat_4x4_init(&work_mat); - for(int s = 0; s < rows; s++){ - for(int t = 0; t < columns; t++){ - ibz_mod(&(work_mat[s][t]),&((*mat)[s][t]),p); - } - } - while(k 0){ - ibz_mod(&((*ker)[s]),&(work_mat[d[s]-1][k]),p); - } - } - } - } - } - ibz_finalize(&prod); - ibz_finalize(&var); - ibz_mat_4x4_finalize(&work_mat); - return(kernel_dim==1); -} - -int ibz_4x4_right_ker_mod_power_of_2(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, unsigned short exp) -{ - ibz_mat_4x4_t full_ker; - ibz_mat_4x5_t howell; - ibz_t pow2; - ibz_mat_4x4_init(&full_ker); - ibz_mat_4x5_init(&howell); - ibz_init(&pow2); - - // 2^exp - ibz_set(&pow2, 1); - ibz_mul_2exp(&pow2, &pow2, exp); - - ibz_mat_right_ker_mod(4, 4, full_ker, *mat, &pow2); - int zeros = ibz_mat_howell(4, 4, howell, NULL, full_ker, &pow2); - - int dim = 0; - for (int j = zeros; j < 5; j++) { - int primitive = 0; - for (int i = 0; i < 4; i++) - primitive |= !ibz_is_even(&howell[i][j]); - if (primitive) { - for (int i = 0; i < 4; i++) - ibz_copy(&(*ker)[i], &howell[i][j]); - dim++; - } - } - - ibz_mat_4x4_finalize(&full_ker); - ibz_mat_4x5_finalize(&howell); - ibz_finalize(&pow2); - - return dim == 1; + return (!ibz_is_zero(det)); } // matrix evaluation -void ibz_mat_4x4_eval(quat_alg_coord_t *res, const ibz_mat_4x4_t *mat, const quat_alg_coord_t *vec){ - quat_alg_coord_t sum; +void +ibz_mat_4x4_eval(ibz_vec_4_t *res, const ibz_mat_4x4_t *mat, const ibz_vec_4_t *vec) +{ + ibz_vec_4_t sum; ibz_t prod; ibz_init(&prod); - quat_alg_coord_init(&sum); - for (int i = 0; i <4; i++){ - ibz_set(&(sum[i]),0); - } - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ + ibz_vec_4_init(&sum); + // assume initialization to 0 + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { ibz_mul(&prod, &(*mat)[i][j], &(*vec)[j]); - ibz_add(&(sum[i]),&(sum[i]), &prod); + ibz_add(&(sum[i]), &(sum[i]), &prod); } } - for (int i = 0; i <4; i++){ - ibz_copy(&(*res)[i],&(sum[i])); - } + ibz_vec_4_copy(res, &sum); ibz_finalize(&prod); - quat_alg_coord_finalize(&sum); + ibz_vec_4_finalize(&sum); +} + +void +ibz_mat_4x4_eval_t(ibz_vec_4_t *res, const ibz_vec_4_t *vec, const ibz_mat_4x4_t *mat) +{ + ibz_vec_4_t sum; + ibz_t prod; + ibz_init(&prod); + ibz_vec_4_init(&sum); + // assume initialization to 0 + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_mul(&prod, &(*mat)[j][i], &(*vec)[j]); + ibz_add(&(sum[i]), &(sum[i]), &prod); + } + } + ibz_vec_4_copy(res, &sum); + ibz_finalize(&prod); + ibz_vec_4_finalize(&sum); } // quadratic forms -void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const quat_alg_coord_t *coord){ - quat_alg_coord_t sum; +void +quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const ibz_vec_4_t *coord) +{ + ibz_vec_4_t sum; ibz_t prod; ibz_init(&prod); - quat_alg_coord_init(&sum); + ibz_vec_4_init(&sum); ibz_mat_4x4_eval(&sum, qf, coord); - for (int i = 0; i <4; i++){ - ibz_mul(&prod,&(sum[i]), &(*coord)[i]); - if (i>0){ - ibz_add(&(sum[0]),&(sum[0]), &prod); + for (int i = 0; i < 4; i++) { + ibz_mul(&prod, &(sum[i]), &(*coord)[i]); + if (i > 0) { + ibz_add(&(sum[0]), &(sum[0]), &prod); } else { - ibz_copy(&sum[0],&prod); + ibz_copy(&sum[0], &prod); } } - ibz_copy(res,&sum[0]); + ibz_copy(res, &sum[0]); ibz_finalize(&prod); - quat_alg_coord_finalize(&sum); + ibz_vec_4_finalize(&sum); } - - -//Defined in headerfile -//static void ibz_content(ibz_t *content, const quat_alg_coord_t *v) { -// ibz_gcd(content, v[0], v[1]); -// ibz_gcd(content, v[2], content); -// ibz_gcd(content, v[3], content); -//} diff --git a/src/quaternion/ref/generic/finit.c b/src/quaternion/ref/generic/finit.c index 2754a9e..b3808ed 100644 --- a/src/quaternion/ref/generic/finit.c +++ b/src/quaternion/ref/generic/finit.c @@ -1,158 +1,122 @@ -#include +#include "internal.h" - -void quat_alg_init_set(quat_alg_t *alg, const ibz_t *p){ +void +quat_alg_init_set(quat_alg_t *alg, const ibz_t *p) +{ ibz_init(&(*alg).p); - ibz_mat_4x4_init(&(*alg).gram); ibz_copy(&(*alg).p, p); - ibz_set(&(*alg).gram[0][0], 1); - ibz_set(&(*alg).gram[1][1], 1); - ibz_copy(&(*alg).gram[2][2], p); - ibz_copy(&(*alg).gram[3][3], p); } -void quat_alg_finalize(quat_alg_t *alg){ +void +quat_alg_finalize(quat_alg_t *alg) +{ ibz_finalize(&(*alg).p); - ibz_mat_4x4_finalize(&(*alg).gram); } -void quat_alg_elem_init(quat_alg_elem_t *elem){ - quat_alg_coord_init(&(*elem).coord); +void +quat_alg_elem_init(quat_alg_elem_t *elem) +{ + ibz_vec_4_init(&(*elem).coord); ibz_init(&(*elem).denom); ibz_set(&(*elem).denom, 1); } -void quat_alg_elem_finalize(quat_alg_elem_t *elem){ - quat_alg_coord_finalize(&(*elem).coord); +void +quat_alg_elem_finalize(quat_alg_elem_t *elem) +{ + ibz_vec_4_finalize(&(*elem).coord); ibz_finalize(&(*elem).denom); } -void quat_alg_coord_init(quat_alg_coord_t *coord){ - for(int i = 0; i < 4; i++){ - ibz_init(&(*coord)[i]); +void +ibz_vec_2_init(ibz_vec_2_t *vec) +{ + ibz_init(&((*vec)[0])); + ibz_init(&((*vec)[1])); +} + +void +ibz_vec_2_finalize(ibz_vec_2_t *vec) +{ + ibz_finalize(&((*vec)[0])); + ibz_finalize(&((*vec)[1])); +} + +void +ibz_vec_4_init(ibz_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibz_init(&(*vec)[i]); } } -void quat_alg_coord_finalize(quat_alg_coord_t *coord){ - for(int i = 0; i < 4; i++){ - ibz_finalize(&(*coord)[i]); +void +ibz_vec_4_finalize(ibz_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibz_finalize(&(*vec)[i]); } } -void ibz_vec_4_init(ibz_vec_4_t *vec){ - for(int i = 0; i < 4; i++){ - ibz_init(&(*vec)[i]); - } -} -void ibz_vec_4_finalize(ibz_vec_4_t *vec){ - for(int i = 0; i < 4; i++){ - ibz_finalize(&(*vec)[i]); - } -} - -void ibz_vec_5_init(ibz_vec_5_t *vec){ - for(int i = 0; i < 5; i++){ - ibz_init(&(*vec)[i]); - } -} -void ibz_vec_5_finalize(ibz_vec_5_t *vec){ - for(int i = 0; i < 5; i++){ - ibz_finalize(&(*vec)[i]); - } -} - -void ibz_mat_2x2_init(ibz_mat_2x2_t *mat){ - for(int i = 0; i < 2; i++){ - for(int j = 0; j < 2; j++){ +void +ibz_mat_2x2_init(ibz_mat_2x2_t *mat) +{ + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { ibz_init(&(*mat)[i][j]); } } } -void ibz_mat_2x2_finalize(ibz_mat_2x2_t *mat){ - for(int i = 0; i < 2; i++){ - for(int j = 0; j < 2; j++){ +void +ibz_mat_2x2_finalize(ibz_mat_2x2_t *mat) +{ + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { ibz_finalize(&(*mat)[i][j]); } } } -void ibz_mat_4x4_init(ibz_mat_4x4_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ +void +ibz_mat_4x4_init(ibz_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { ibz_init(&(*mat)[i][j]); } } } -void ibz_mat_4x4_finalize(ibz_mat_4x4_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ +void +ibz_mat_4x4_finalize(ibz_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { ibz_finalize(&(*mat)[i][j]); } } } -void ibz_mat_4x5_init(ibz_mat_4x5_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 5; j++){ - ibz_init(&(*mat)[i][j]); - } - } -} -void ibz_mat_4x5_finalize(ibz_mat_4x5_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 5; j++){ - ibz_finalize(&(*mat)[i][j]); - } - } -} - -void ibz_mat_4x8_init(ibz_mat_4x8_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 8; j++){ - ibz_init(&(*mat)[i][j]); - } - } -} -void ibz_mat_4x8_finalize(ibz_mat_4x8_t *mat){ - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 8; j++){ - ibz_finalize(&(*mat)[i][j]); - } - } -} - -void ibz_mat_init(int rows, int cols, ibz_t mat[rows][cols]) { - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - ibz_init(&mat[i][j]); -} - -void ibz_mat_finalize(int rows, int cols, ibz_t mat[rows][cols]) { - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - ibz_finalize(&mat[i][j]); -} - -void quat_lattice_init(quat_lattice_t *lat){ +void +quat_lattice_init(quat_lattice_t *lat) +{ ibz_mat_4x4_init(&(*lat).basis); ibz_init(&(*lat).denom); ibz_set(&(*lat).denom, 1); } -void quat_lattice_finalize(quat_lattice_t *lat){ +void +quat_lattice_finalize(quat_lattice_t *lat) +{ ibz_finalize(&(*lat).denom); ibz_mat_4x4_finalize(&(*lat).basis); } -void quat_order_init(quat_order_t *order){ - quat_lattice_init(order); -} -void quat_order_finalize(quat_order_t *order){ - quat_lattice_finalize(order); -} - -void quat_left_ideal_init(quat_left_ideal_t *lideal){ +void +quat_left_ideal_init(quat_left_ideal_t *lideal) +{ quat_lattice_init(&(*lideal).lattice); ibz_init(&(*lideal).norm); - (*lideal).parent_order=NULL; + (*lideal).parent_order = NULL; } -void quat_left_ideal_finalize(quat_left_ideal_t *lideal){ +void +quat_left_ideal_finalize(quat_left_ideal_t *lideal) +{ ibz_finalize(&(*lideal).norm); quat_lattice_finalize(&(*lideal).lattice); } diff --git a/src/quaternion/ref/generic/hnf/hnf.c b/src/quaternion/ref/generic/hnf/hnf.c new file mode 100644 index 0000000..1fb4c0f --- /dev/null +++ b/src/quaternion/ref/generic/hnf/hnf.c @@ -0,0 +1,210 @@ +#include "hnf_internal.h" +#include "internal.h" + +// HNF test function +int +ibz_mat_4x4_is_hnf(const ibz_mat_4x4_t *mat) +{ + int res = 1; + int found; + int ind = 0; + ibz_t zero; + ibz_init(&zero); + // upper triangular + for (int i = 0; i < 4; i++) { + // upper triangular + for (int j = 0; j < i; j++) { + res = res && ibz_is_zero(&((*mat)[i][j])); + } + // find first non 0 element of line + found = 0; + for (int j = i; j < 4; j++) { + if (found) { + // all values are positive, and first non-0 is the largest of that line + res = res && (ibz_cmp(&((*mat)[i][j]), &zero) >= 0); + res = res && (ibz_cmp(&((*mat)[i][ind]), &((*mat)[i][j])) > 0); + } else { + if (!ibz_is_zero(&((*mat)[i][j]))) { + found = 1; + ind = j; + // mustbe non-negative + res = res && (ibz_cmp(&((*mat)[i][j]), &zero) > 0); + } + } + } + } + // check that first nom-zero elements ndex per column is strictly increasing + int linestart = -1; + int i = 0; + for (int j = 0; j < 4; j++) { + while ((i < 4) && (ibz_is_zero(&((*mat)[i][j])))) { + i = i + 1; + } + if (i != 4) { + res = res && (linestart < i); + } + i = 0; + } + ibz_finalize(&zero); + return res; +} + +// Untested HNF helpers +// centered mod +void +ibz_vec_4_linear_combination_mod(ibz_vec_4_t *lc, + const ibz_t *coeff_a, + const ibz_vec_4_t *vec_a, + const ibz_t *coeff_b, + const ibz_vec_4_t *vec_b, + const ibz_t *mod) +{ + ibz_t prod, m; + ibz_vec_4_t sums; + ibz_vec_4_init(&sums); + ibz_init(&prod); + ibz_init(&m); + ibz_copy(&m, mod); + for (int i = 0; i < 4; i++) { + ibz_mul(&(sums[i]), coeff_a, &((*vec_a)[i])); + ibz_mul(&prod, coeff_b, &((*vec_b)[i])); + ibz_add(&(sums[i]), &(sums[i]), &prod); + ibz_centered_mod(&(sums[i]), &(sums[i]), &m); + } + for (int i = 0; i < 4; i++) { + ibz_copy(&((*lc)[i]), &(sums[i])); + } + ibz_finalize(&prod); + ibz_finalize(&m); + ibz_vec_4_finalize(&sums); +} + +void +ibz_vec_4_copy_mod(ibz_vec_4_t *res, const ibz_vec_4_t *vec, const ibz_t *mod) +{ + ibz_t m; + ibz_init(&m); + ibz_copy(&m, mod); + for (int i = 0; i < 4; i++) { + ibz_centered_mod(&((*res)[i]), &((*vec)[i]), &m); + } + ibz_finalize(&m); +} + +// no need to center this, and not 0 +void +ibz_vec_4_scalar_mul_mod(ibz_vec_4_t *prod, const ibz_t *scalar, const ibz_vec_4_t *vec, const ibz_t *mod) +{ + ibz_t m, s; + ibz_init(&m); + ibz_init(&s); + ibz_copy(&s, scalar); + ibz_copy(&m, mod); + for (int i = 0; i < 4; i++) { + ibz_mul(&((*prod)[i]), &((*vec)[i]), &s); + ibz_mod(&((*prod)[i]), &((*prod)[i]), &m); + } + ibz_finalize(&m); + ibz_finalize(&s); +} + +// Algorithm used is the one at number 2.4.8 in Henri Cohen's "A Course in Computational Algebraic +// Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 +// assumes ibz_xgcd outputs u,v which are small in absolute value (as described in the +// book) +void +ibz_mat_4xn_hnf_mod_core(ibz_mat_4x4_t *hnf, int generator_number, const ibz_vec_4_t *generators, const ibz_t *mod) +{ + int i = 3; + assert(generator_number > 3); + int n = generator_number; + int j = n - 1; + int k = n - 1; + ibz_t b, u, v, d, q, m, coeff_1, coeff_2, r; + ibz_vec_4_t c; + ibz_vec_4_t a[generator_number]; + ibz_vec_4_t w[4]; + ibz_init(&b); + ibz_init(&d); + ibz_init(&u); + ibz_init(&v); + ibz_init(&r); + ibz_init(&m); + ibz_init(&q); + ibz_init(&coeff_1); + ibz_init(&coeff_2); + ibz_vec_4_init(&c); + for (int h = 0; h < n; h++) { + if (h < 4) + ibz_vec_4_init(&(w[h])); + ibz_vec_4_init(&(a[h])); + ibz_copy(&(a[h][0]), &(generators[h][0])); + ibz_copy(&(a[h][1]), &(generators[h][1])); + ibz_copy(&(a[h][2]), &(generators[h][2])); + ibz_copy(&(a[h][3]), &(generators[h][3])); + } + assert(ibz_cmp(mod, &ibz_const_zero) > 0); + ibz_copy(&m, mod); + while (i != -1) { + while (j != 0) { + j = j - 1; + if (!ibz_is_zero(&(a[j][i]))) { + // assumtion that ibz_xgcd outputs u,v which are small in absolute + // value is needed here also, needs u non 0, but v can be 0 if needed + ibz_xgcd_with_u_not_0(&d, &u, &v, &(a[k][i]), &(a[j][i])); + ibz_vec_4_linear_combination(&c, &u, &(a[k]), &v, &(a[j])); + ibz_div(&coeff_1, &r, &(a[k][i]), &d); + ibz_div(&coeff_2, &r, &(a[j][i]), &d); + ibz_neg(&coeff_2, &coeff_2); + ibz_vec_4_linear_combination_mod( + &(a[j]), &coeff_1, &(a[j]), &coeff_2, &(a[k]), &m); // do lin comb mod m + ibz_vec_4_copy_mod(&(a[k]), &c, &m); // mod m in copy + } + } + ibz_xgcd_with_u_not_0(&d, &u, &v, &(a[k][i]), &m); + ibz_vec_4_scalar_mul_mod(&(w[i]), &u, &(a[k]), &m); // mod m in scalar mult + if (ibz_is_zero(&(w[i][i]))) { + ibz_copy(&(w[i][i]), &m); + } + for (int h = i + 1; h < 4; h++) { + ibz_div_floor(&q, &r, &(w[h][i]), &(w[i][i])); + ibz_neg(&q, &q); + ibz_vec_4_linear_combination(&(w[h]), &ibz_const_one, &(w[h]), &q, &(w[i])); + } + ibz_div(&m, &r, &m, &d); + assert(ibz_is_zero(&r)); + if (i != 0) { + k = k - 1; + i = i - 1; + j = k; + if (ibz_is_zero(&(a[k][i]))) + ibz_copy(&(a[k][i]), &m); + + } else { + k = k - 1; + i = i - 1; + j = k; + } + } + for (j = 0; j < 4; j++) { + for (i = 0; i < 4; i++) { + ibz_copy(&((*hnf)[i][j]), &(w[j][i])); + } + } + + ibz_finalize(&b); + ibz_finalize(&d); + ibz_finalize(&u); + ibz_finalize(&v); + ibz_finalize(&r); + ibz_finalize(&q); + ibz_finalize(&coeff_1); + ibz_finalize(&coeff_2); + ibz_finalize(&m); + ibz_vec_4_finalize(&c); + for (int h = 0; h < n; h++) { + if (h < 4) + ibz_vec_4_finalize(&(w[h])); + ibz_vec_4_finalize(&(a[h])); + } +} \ No newline at end of file diff --git a/src/quaternion/ref/generic/hnf/hnf_internal.c b/src/quaternion/ref/generic/hnf/hnf_internal.c new file mode 100644 index 0000000..b2db5b5 --- /dev/null +++ b/src/quaternion/ref/generic/hnf/hnf_internal.c @@ -0,0 +1,182 @@ +#include "hnf_internal.h" +#include "internal.h" + +// Small helper for integers +void +ibz_mod_not_zero(ibz_t *res, const ibz_t *x, const ibz_t *mod) +{ + ibz_t m, t; + ibz_init(&m); + ibz_init(&t); + ibz_mod(&m, x, mod); + ibz_set(&t, ibz_is_zero(&m)); + ibz_mul(&t, &t, mod); + ibz_add(res, &m, &t); + ibz_finalize(&m); + ibz_finalize(&t); +} + +// centered and rather positive then negative +void +ibz_centered_mod(ibz_t *remainder, const ibz_t *a, const ibz_t *mod) +{ + assert(ibz_cmp(mod, &ibz_const_zero) > 0); + ibz_t tmp, d, t; + ibz_init(&tmp); + ibz_init(&d); + ibz_init(&t); + ibz_div_floor(&d, &tmp, mod, &ibz_const_two); + ibz_mod_not_zero(&tmp, a, mod); + ibz_set(&t, ibz_cmp(&tmp, &d) > 0); + ibz_mul(&t, &t, mod); + ibz_sub(remainder, &tmp, &t); + ibz_finalize(&tmp); + ibz_finalize(&d); + ibz_finalize(&t); +} + +// if c, res = x, else res = y +void +ibz_conditional_assign(ibz_t *res, const ibz_t *x, const ibz_t *y, int c) +{ + ibz_t s, t, r; + ibz_init(&r); + ibz_init(&s); + ibz_init(&t); + ibz_set(&s, c != 0); + ibz_sub(&t, &ibz_const_one, &s); + ibz_mul(&r, &s, x); + ibz_mul(res, &t, y); + ibz_add(res, &r, res); + ibz_finalize(&r); + ibz_finalize(&s); + ibz_finalize(&t); +} + +// mpz_gcdext specification specifies unique outputs used here +void +ibz_xgcd_with_u_not_0(ibz_t *d, ibz_t *u, ibz_t *v, const ibz_t *x, const ibz_t *y) +{ + if (ibz_is_zero(x) & ibz_is_zero(y)) { + ibz_set(d, 1); + ibz_set(u, 1); + ibz_set(v, 0); + return; + } + ibz_t q, r, x1, y1; + ibz_init(&q); + ibz_init(&r); + ibz_init(&x1); + ibz_init(&y1); + ibz_copy(&x1, x); + ibz_copy(&y1, y); + + // xgcd + ibz_xgcd(d, u, v, &x1, &y1); + + // make sure u!=0 (v can be 0 if needed) + // following GMP specification, u == 0 implies y|x + if (ibz_is_zero(u)) { + if (!ibz_is_zero(&x1)) { + if (ibz_is_zero(&y1)) { + ibz_set(&y1, 1); + } + ibz_div(&q, &r, &x1, &y1); + assert(ibz_is_zero(&r)); + ibz_sub(v, v, &q); + } + ibz_set(u, 1); + } + if (!ibz_is_zero(&x1)) { + // Make sure ux > 0 (and as small as possible) + assert(ibz_cmp(d, &ibz_const_zero) > 0); + ibz_mul(&r, &x1, &y1); + int neg = ibz_cmp(&r, &ibz_const_zero) < 0; + ibz_mul(&q, &x1, u); + while (ibz_cmp(&q, &ibz_const_zero) <= 0) { + ibz_div(&q, &r, &y1, d); + assert(ibz_is_zero(&r)); + if (neg) { + ibz_neg(&q, &q); + } + ibz_add(u, u, &q); + ibz_div(&q, &r, &x1, d); + assert(ibz_is_zero(&r)); + if (neg) { + ibz_neg(&q, &q); + } + ibz_sub(v, v, &q); + + ibz_mul(&q, &x1, u); + } + } + +#ifndef NDEBUG + int res = 0; + ibz_t sum, prod, test, cmp; + ibz_init(&sum); + ibz_init(&prod); + ibz_init(&cmp); + ibz_init(&test); + // sign correct + res = res | !(ibz_cmp(d, &ibz_const_zero) >= 0); + if (ibz_is_zero(&x1) && ibz_is_zero(&y1)) { + res = res | !(ibz_is_zero(v) && ibz_is_one(u) && ibz_is_one(d)); + } else { + if (!ibz_is_zero(&x1) && !ibz_is_zero(&y1)) { + // GCD divides x + ibz_div(&sum, &prod, &x1, d); + res = res | !ibz_is_zero(&prod); + // Small enough + ibz_mul(&prod, &x1, u); + res = res | !(ibz_cmp(&prod, &ibz_const_zero) > 0); + ibz_mul(&sum, &sum, &y1); + ibz_abs(&sum, &sum); + res = res | !(ibz_cmp(&prod, &sum) <= 0); + + // GCD divides y + ibz_div(&sum, &prod, &y1, d); + res = res | !ibz_is_zero(&prod); + // Small enough + ibz_mul(&prod, &y1, v); + res = res | !(ibz_cmp(&prod, &ibz_const_zero) <= 0); + ibz_mul(&sum, &sum, &x1); + ibz_abs(&sum, &sum); + res = res | !(ibz_cmp(&prod, &sum) < 0); + } else { + // GCD divides x + ibz_div(&sum, &prod, &x1, d); + res = res | !ibz_is_zero(&prod); + // GCD divides y + ibz_div(&sum, &prod, &y1, d); + res = res | !ibz_is_zero(&prod); + if (ibz_is_zero(&x1) && !ibz_is_zero(&y1)) { + ibz_abs(&prod, v); + res = res | !(ibz_is_one(&prod)); + res = res | !(ibz_is_one(u)); + } else { + ibz_abs(&prod, u); + res = res | !(ibz_is_one(&prod)); + res = res | !(ibz_is_zero(v)); + } + } + + // Bezout coeffs + ibz_mul(&sum, &x1, u); + ibz_mul(&prod, &y1, v); + ibz_add(&sum, &sum, &prod); + res = res | !(ibz_cmp(&sum, d) == 0); + } + assert(!res); + ibz_finalize(&sum); + ibz_finalize(&prod); + ibz_finalize(&cmp); + ibz_finalize(&test); + +#endif + + ibz_finalize(&x1); + ibz_finalize(&y1); + ibz_finalize(&q); + ibz_finalize(&r); +} diff --git a/src/quaternion/ref/generic/hnf/hnf_tests.c b/src/quaternion/ref/generic/hnf/hnf_tests.c new file mode 100644 index 0000000..b278151 --- /dev/null +++ b/src/quaternion/ref/generic/hnf/hnf_tests.c @@ -0,0 +1,1019 @@ + +#include "hnf_internal.h" +#include "quaternion_tests.h" +#include + +// test helper for xgcd_not_0 + +// round a/b to closest integer +void +ibz_rounded_div(ibz_t *q, const ibz_t *a, const ibz_t *b) +{ + ibz_t r, sign_q, abs_b; + ibz_init(&r); + ibz_init(&sign_q); + ibz_init(&abs_b); + + // assumed to round towards 0 + ibz_abs(&abs_b, b); + // q is of same sign as a*b (and 0 if a is 0) + ibz_mul(&sign_q, a, b); + ibz_div(q, &r, a, b); + ibz_abs(&r, &r); + ibz_add(&r, &r, &r); + ibz_set(&sign_q, (1 - 2 * (ibz_cmp(&sign_q, &ibz_const_zero) < 0)) * (ibz_cmp(&r, &abs_b) > 0)); + ibz_add(q, q, &sign_q); + ibz_finalize(&r); + ibz_finalize(&sign_q); + ibz_finalize(&abs_b); +} + +// old HNF version, used only in tests of the new HNF +// Algorithm used is the one at number 2.4.5 in Henri Cohen's "A Course in Computational Algebraic +// Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 +// assumes ibz_xgcd outputs u,v which are small in absolute value (as described in the +// book) +void +ibz_mat_4xn_hnf_core(ibz_mat_4x4_t *hnf, int generator_number, const ibz_vec_4_t *generators) +{ + assert(generator_number > 3); + int n = generator_number; + int i = 3; + int j = n - 1; + int k = n - 1; + ibz_t b, u, v, d, zero, coeff_1, coeff_2, r; + ibz_vec_4_t c; + ibz_vec_4_t a[n]; + ibz_init(&b); + ibz_init(&d); + ibz_init(&u); + ibz_init(&v); + ibz_init(&r); + ibz_init(&coeff_1); + ibz_init(&coeff_2); + ibz_init(&zero); + ibz_set(&zero, 0); + ibz_vec_4_init(&c); + for (int h = 0; h < n; h++) { + ibz_vec_4_init(&(a[h])); + ibz_copy(&(a[h][0]), &(generators[h][0])); + ibz_copy(&(a[h][1]), &(generators[h][1])); + ibz_copy(&(a[h][2]), &(generators[h][2])); + ibz_copy(&(a[h][3]), &(generators[h][3])); + } + while (i != -1) { + while (j != 0) { + j = j - 1; + if (!ibz_is_zero(&(a[j][i]))) { + // assumtion that ibz_xgcd outputs u,v which are small in absolute + // value is needed here + ibz_xgcd(&d, &u, &v, &(a[k][i]), &(a[j][i])); + // also, needs u non 0, but v can be 0 if needed + if (ibz_is_zero(&u)) { + ibz_div(&v, &r, &(a[k][i]), &(a[j][i])); + ibz_set(&u, 1); + ibz_sub(&v, &u, &v); + } + ibz_vec_4_linear_combination(&c, &u, &(a[k]), &v, &(a[j])); + ibz_div(&coeff_1, &r, &(a[k][i]), &d); + ibz_div(&coeff_2, &r, &(a[j][i]), &d); + ibz_neg(&coeff_2, &coeff_2); + ibz_vec_4_linear_combination(&(a[j]), &coeff_1, &(a[j]), &coeff_2, &(a[k])); + ibz_vec_4_copy(&(a[k]), &c); + } + } + ibz_copy(&b, &(a[k][i])); + if (ibz_cmp(&b, &zero) < 0) { + ibz_vec_4_negate(&(a[k]), &(a[k])); + ibz_neg(&b, &b); + } + if (ibz_is_zero(&b)) { + k = k + 1; + } else { + for (j = k + 1; j < n; j++) { + ibz_div(&d, &r, &(a[j][i]), &b); + if (ibz_cmp(&r, &zero) < 0) { + ibz_set(&r, 1); + ibz_sub(&d, &d, &r); + } + ibz_set(&r, 1); + ibz_neg(&d, &d); + ibz_vec_4_linear_combination(&(a[j]), &r, &(a[j]), &d, &(a[k])); + } + } + if (i != 0) { + k = k - 1; + j = k; + } + i = i - 1; + } + for (j = 0; j < 4; j++) { + for (i = 0; i < 4; i++) { + ibz_copy(&((*hnf)[i][j]), &(a[n - 4 + j][i])); + } + } + + ibz_finalize(&b); + ibz_finalize(&d); + ibz_finalize(&u); + ibz_finalize(&v); + ibz_finalize(&r); + ibz_finalize(&coeff_1); + ibz_finalize(&coeff_2); + ibz_finalize(&zero); + ibz_vec_4_finalize(&c); + for (int h = 0; h < n; h++) { + ibz_vec_4_finalize(&(a[h])); + } +} + +// integer hnf helpers + +// void ibz_mod_not_zero(ibz_t *res, const ibz_t *x, const ibz_t *mod); +int +quat_test_ibz_mod_not_zero(void) +{ + int res = 0; + ibz_t m, a, r, d; + int s, x; + ibz_init(&m); + ibz_init(&a); + ibz_init(&r); + ibz_init(&d); + s = 5; + ibz_set(&m, s); + for (x = -20; x < 20; x++) { + ibz_set(&a, x); + ibz_mod_not_zero(&r, &a, &m); + ibz_sub(&d, &r, &a); + res = res || !ibz_divides(&d, &m); + res = res || !(ibz_cmp(&r, &m) <= 0); + res = res || !(ibz_cmp(&ibz_const_one, &r) <= 0); + ibz_mod_not_zero(&a, &a, &m); + res = res || !(ibz_cmp(&a, &r) == 0); + res = res || !(ibz_cmp(&r, &m) <= 0); + res = res || !(ibz_cmp(&ibz_const_one, &r) <= 0); + } + + if (res != 0) { + printf("Quaternion unit test ibz_mod_not_zero failed\n"); + } + ibz_finalize(&m); + ibz_finalize(&a); + ibz_finalize(&r); + ibz_finalize(&d); + return (res); +} + +// void ibz_centered_mod(ibz_t *remainder, const ibz_t *a, const ibz_t *mod); +int +quat_test_ibz_centered_mod(void) +{ + int res = 0; + ibz_t m, a, r, d, h; + int s, x; + ibz_init(&m); + ibz_init(&a); + ibz_init(&r); + ibz_init(&d); + ibz_init(&h); + s = 5; + ibz_set(&m, s); + for (x = -20; x < 20; x++) { + ibz_set(&a, x); + ibz_centered_mod(&r, &a, &m); + ibz_sub(&d, &r, &a); + res = res || !ibz_divides(&d, &m); + ibz_mul(&h, &r, &ibz_const_two); + res = res || !(ibz_cmp(&h, &m) <= 0); + ibz_neg(&h, &h); + res = res || !(ibz_cmp(&h, &m) < 0); + ibz_centered_mod(&a, &a, &m); + res = res || !(ibz_cmp(&a, &r) == 0); + } + + if (res != 0) { + printf("Quaternion unit test ibz_centered_mod failed\n"); + } + ibz_finalize(&m); + ibz_finalize(&a); + ibz_finalize(&r); + ibz_finalize(&d); + ibz_finalize(&h); + return (res); +} + +// void ibz_conditional_assign(ibz_t *res, const ibz_t *x, const ibz_t *y, int c); +int +quat_test_ibz_conditional_assign(void) +{ + int res = 0; + ibz_t x, y, r; + ibz_init(&x); + ibz_init(&y); + ibz_init(&r); + ibz_set(&x, 5); + ibz_set(&y, -9); + ibz_conditional_assign(&r, &x, &y, 1); + res = res || !(ibz_cmp(&x, &r) == 0); + ibz_conditional_assign(&r, &x, &y, 0); + res = res || !(ibz_cmp(&y, &r) == 0); + ibz_conditional_assign(&x, &x, &y, 0); + res = res || !(ibz_cmp(&y, &x) == 0); + ibz_set(&x, -5); + ibz_set(&y, -0); + ibz_conditional_assign(&y, &x, &y, 1); + res = res || !(ibz_cmp(&y, &x) == 0); + + if (res != 0) { + printf("Quaternion unit test ibz_conditional_assign failed\n"); + } + ibz_finalize(&x); + ibz_finalize(&y); + ibz_finalize(&r); + return (res); +} + +// This tests that our xgcd_with_u_non_0 respects all criteria required by our HNF +int +quat_test_helper_ibz_xgcd_with_u_not_0(const ibz_t *gcd, const ibz_t *u, const ibz_t *v, const ibz_t *x, const ibz_t *y) +{ + int res = 0; + ibz_t sum, prod, test, cmp; + ibz_init(&sum); + ibz_init(&prod); + ibz_init(&cmp); + ibz_init(&test); + // sign correct + res = res | !(ibz_cmp(gcd, &ibz_const_zero) >= 0); + if (ibz_is_zero(x) && ibz_is_zero(y)) { + res = res | !(ibz_is_zero(v) && ibz_is_one(u) && ibz_is_one(gcd)); + } else { + if (!ibz_is_zero(x) && !ibz_is_zero(y)) { + // GCD divides x + ibz_div(&sum, &prod, x, gcd); + res = res | !ibz_is_zero(&prod); + // Small enough + ibz_mul(&prod, x, u); + res = res | !(ibz_cmp(&prod, &ibz_const_zero) > 0); + ibz_mul(&sum, &sum, y); + ibz_abs(&sum, &sum); + res = res | !(ibz_cmp(&prod, &sum) <= 0); + + // GCD divides y + ibz_div(&sum, &prod, y, gcd); + res = res | !ibz_is_zero(&prod); + // Small enough + ibz_mul(&prod, y, v); + res = res | !(ibz_cmp(&prod, &ibz_const_zero) <= 0); + ibz_mul(&sum, &sum, x); + ibz_abs(&sum, &sum); + res = res | !(ibz_cmp(&prod, &sum) < 0); + } else { + // GCD divides x + ibz_div(&sum, &prod, x, gcd); + res = res | !ibz_is_zero(&prod); + // GCD divides y + ibz_div(&sum, &prod, y, gcd); + res = res | !ibz_is_zero(&prod); + if (ibz_is_zero(x) && !ibz_is_zero(y)) { + ibz_abs(&prod, v); + res = res | !(ibz_is_one(&prod)); + res = res | !(ibz_is_one(u)); + } else { + ibz_abs(&prod, u); + res = res | !(ibz_is_one(&prod)); + res = res | !(ibz_is_zero(v)); + } + } + // Bezout coeffs + ibz_mul(&sum, x, u); + ibz_mul(&prod, y, v); + ibz_add(&sum, &sum, &prod); + res = res | !(ibz_cmp(&sum, gcd) == 0); + } + assert(!res); + ibz_finalize(&sum); + ibz_finalize(&prod); + ibz_finalize(&cmp); + ibz_finalize(&test); + + return (res); +} +// void ibz_xgcd_with_u_not_0(ibz_t *d, ibz_t *u, ibz_t *v, const ibz_t *x, const ibz_t +// *y); +int +quat_test_ibz_xgcd_with_u_not_0(void) +{ + int res = 0; + ibz_t x, y, u, v, d, s, p; + ibz_init(&x); + ibz_init(&y); + ibz_init(&u); + ibz_init(&v); + ibz_init(&d); + ibz_init(&s); + ibz_init(&p); + + ibz_set(&x, 75); + ibz_set(&y, 50); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 25) != 0); + + ibz_set(&x, -75); + ibz_set(&y, 50); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 25) != 0); + + ibz_set(&x, -75); + ibz_set(&y, -50); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 25) != 0); + + ibz_set(&x, 75); + ibz_set(&y, -50); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 25) != 0); + + ibz_set(&x, 50); + ibz_set(&y, 50); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 50) != 0); + + ibz_set(&x, 0); + ibz_set(&y, -50); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 50) != 0); + + ibz_set(&x, -50); + ibz_set(&y, 0); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | (ibz_cmp_int32(&d, 50) != 0); + + ibz_set(&x, 0); + ibz_set(&y, 0); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + + for (int i = -20; i <= 20; i++) { + for (int j = -20; j <= 20; j++) { + ibz_set(&x, i); + ibz_set(&y, j); + ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + res = res | quat_test_helper_ibz_xgcd_with_u_not_0(&d, &u, &v, &x, &y); + } + } + + if (res != 0) { + printf("Quaternion unit test ibz_xgcd_with_u_not_0 failed\n"); + } + ibz_finalize(&x); + ibz_finalize(&y); + ibz_finalize(&u); + ibz_finalize(&v); + ibz_finalize(&d); + ibz_finalize(&s); + ibz_finalize(&p); + return (res); +} + +// void ibz_rounded_div(ibz_t *q, const ibz_t *a, const ibz_t *b); +int +quat_test_ibz_rounded_div(void) +{ + int res = 0; + ibz_t q, a, b; + ibz_init(&a); + ibz_init(&b); + ibz_init(&q); + + // basic tests + ibz_set(&a, 15); + ibz_set(&b, 3); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 5) == 0); + ibz_set(&a, 16); + ibz_set(&b, 3); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 5) == 0); + ibz_set(&a, 17); + ibz_set(&b, 3); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 6) == 0); + ibz_set(&a, 37); + ibz_set(&b, 5); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 7) == 0); + // test sign combination + ibz_set(&a, 149); + ibz_set(&b, 12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 12) == 0); + ibz_set(&a, 149); + ibz_set(&b, -12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -12) == 0); + ibz_set(&a, -149); + ibz_set(&b, -12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 12) == 0); + ibz_set(&a, -149); + ibz_set(&b, 12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -12) == 0); + ibz_set(&a, 151); + ibz_set(&b, 12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 13) == 0); + ibz_set(&a, -151); + ibz_set(&b, -12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 13) == 0); + ibz_set(&a, 151); + ibz_set(&b, -12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -13) == 0); + ibz_set(&a, -151); + ibz_set(&b, 12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -13) == 0); + // divisibles with sign + ibz_set(&a, 144); + ibz_set(&b, 12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 12) == 0); + ibz_set(&a, -144); + ibz_set(&b, -12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 12) == 0); + ibz_set(&a, 144); + ibz_set(&b, -12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -12) == 0); + ibz_set(&a, -144); + ibz_set(&b, 12); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -12) == 0); + // tests close to 0 + ibz_set(&a, -12); + ibz_set(&b, -25); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 0) == 0); + ibz_set(&a, 12); + ibz_set(&b, 25); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 0) == 0); + ibz_set(&a, -12); + ibz_set(&b, 25); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 0) == 0); + ibz_set(&a, 12); + ibz_set(&b, -25); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 0) == 0); + ibz_set(&a, -12); + ibz_set(&b, -23); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 1) == 0); + ibz_set(&a, 12); + ibz_set(&b, 23); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, 1) == 0); + ibz_set(&a, -12); + ibz_set(&b, 23); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -1) == 0); + ibz_set(&a, 12); + ibz_set(&b, -23); + ibz_rounded_div(&q, &a, &b); + res = res || !(ibz_cmp_int32(&q, -1) == 0); + // test output equal input + ibz_set(&a, -151); + ibz_set(&b, 12); + ibz_rounded_div(&a, &a, &b); + res = res || !(ibz_cmp_int32(&a, -13) == 0); + ibz_set(&a, -151); + ibz_set(&b, 12); + ibz_rounded_div(&b, &a, &b); + res = res || !(ibz_cmp_int32(&b, -13) == 0); + // test for cmp not returning 1 or -1 or 0 + ibz_set(&a, 2046874253); + ibz_set(&b, 412308266); + ibz_rounded_div(&b, &a, &b); + res = res || !(ibz_cmp_int32(&b, 5) == 0); + + if (res != 0) { + printf("Quaternion unit test ibz_rounded_div failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&q); + return (res); +} + +// int ibz_mat_4x4_is_hnf(const ibz_mat_4x4_t *mat); +int +quat_test_ibz_mat_4x4_is_hnf(void) +{ + int res = 0; + ibz_mat_4x4_t mat; + ibz_mat_4x4_init(&mat); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), 0); + } + } + res = res || (!ibz_mat_4x4_is_hnf(&mat)); + ibz_set(&(mat[0][0]), 7); + ibz_set(&(mat[0][1]), 6); + ibz_set(&(mat[0][2]), 5); + ibz_set(&(mat[0][3]), 4); + ibz_set(&(mat[1][1]), 6); + ibz_set(&(mat[1][2]), 5); + ibz_set(&(mat[1][3]), 4); + ibz_set(&(mat[2][2]), 5); + ibz_set(&(mat[2][3]), 4); + ibz_set(&(mat[3][3]), 4); + res = res || (!ibz_mat_4x4_is_hnf(&mat)); + + ibz_set(&(mat[0][0]), 7); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 5); + ibz_set(&(mat[0][3]), 4); + ibz_set(&(mat[1][1]), 0); + ibz_set(&(mat[1][2]), 0); + ibz_set(&(mat[1][3]), 0); + ibz_set(&(mat[2][2]), 5); + ibz_set(&(mat[2][3]), 4); + ibz_set(&(mat[3][3]), 4); + res = res || (!ibz_mat_4x4_is_hnf(&mat)); + + // negative tests + ibz_set(&(mat[0][0]), 7); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 5); + ibz_set(&(mat[0][3]), 4); + ibz_set(&(mat[1][1]), 1); + ibz_set(&(mat[1][2]), 5); + ibz_set(&(mat[1][3]), 9); + ibz_set(&(mat[2][2]), 5); + ibz_set(&(mat[2][3]), 4); + ibz_set(&(mat[3][3]), 4); + res = res || (ibz_mat_4x4_is_hnf(&mat)); + + ibz_set(&(mat[0][0]), 7); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 5); + ibz_set(&(mat[0][3]), 4); + ibz_set(&(mat[1][1]), 1); + ibz_set(&(mat[1][2]), -5); + ibz_set(&(mat[1][3]), 1); + ibz_set(&(mat[2][2]), 5); + ibz_set(&(mat[2][3]), 4); + ibz_set(&(mat[3][3]), 4); + res = res || (ibz_mat_4x4_is_hnf(&mat)); + + ibz_set(&(mat[0][0]), 7); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 5); + ibz_set(&(mat[0][3]), 4); + ibz_set(&(mat[1][0]), 2); + ibz_set(&(mat[1][1]), 3); + ibz_set(&(mat[1][2]), 1); + ibz_set(&(mat[1][3]), 1); + ibz_set(&(mat[2][2]), 5); + ibz_set(&(mat[2][3]), 4); + ibz_set(&(mat[3][3]), 4); + res = res || (ibz_mat_4x4_is_hnf(&mat)); + + ibz_set(&(mat[0][0]), 7); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 5); + ibz_set(&(mat[0][3]), 4); + ibz_set(&(mat[1][0]), 2); + ibz_set(&(mat[1][1]), 3); + ibz_set(&(mat[1][2]), -1); + ibz_set(&(mat[1][3]), 7); + ibz_set(&(mat[2][2]), 0); + ibz_set(&(mat[2][3]), 0); + ibz_set(&(mat[3][3]), 4); + res = res || (ibz_mat_4x4_is_hnf(&mat)); + + if (res != 0) { + printf("Quaternion unit test hnf_ibz_mat_4x4_is_hnf failed\n"); + } + ibz_mat_4x4_finalize(&mat); + return (res); +} + +// void ibz_mat_4xn_hnf_core(ibz_mat_4x4_t *hnf, int generator_number, const +// ibz_vec_4_t +// (*generators)[generator_number]); +int +quat_test_ibz_mat_4xn_hnf_core(void) +{ + int res = 0; + ibz_vec_4_t generators[8]; + ibz_mat_4x4_t hnf, cmp; + for (int i = 0; i < 8; i++) + ibz_vec_4_init(&(generators[i])); + ibz_mat_4x4_init(&hnf); + ibz_mat_4x4_init(&cmp); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), 0); + } + } + ibz_mat_4xn_hnf_core(&hnf, 8, generators); + res = res || (!ibz_mat_4x4_is_hnf(&hnf)); + // also should test that they generate the same lattice. Since HNF is unique, copute the HNF for + // test vectors might be ok + + ibz_set(&(generators[2][0]), 2); + ibz_set(&(generators[3][1]), 3); + ibz_set(&(generators[4][0]), 4); + ibz_set(&(generators[2][3]), 5); + ibz_set(&(generators[7][3]), 6); + ibz_set(&(generators[7][1]), 7); + ibz_set(&(generators[3][1]), 8); + ibz_set(&(generators[1][1]), 9); + ibz_set(&(generators[6][0]), 10); + ibz_set(&(generators[5][0]), 11); + ibz_set(&(generators[0][0]), 12); + ibz_mat_4xn_hnf_core(&hnf, 8, generators); + res = res || (!ibz_mat_4x4_is_hnf(&hnf)); + + ibz_set(&(generators[5][2]), 1); + ibz_set(&(generators[0][2]), 2); + ibz_mat_4xn_hnf_core(&hnf, 8, generators); + res = res || (!ibz_mat_4x4_is_hnf(&hnf)); + + // test equality of result to a known hnf + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), 0); + } + } + ibz_set(&(generators[0][0]), 4); + ibz_set(&(generators[2][0]), 3); + ibz_set(&(generators[4][0]), 1); + ibz_set(&(generators[7][0]), -1); + ibz_set(&(generators[1][1]), 5); + ibz_set(&(generators[5][1]), -2); + ibz_set(&(generators[2][2]), 3); + ibz_set(&(generators[6][2]), 1); + ibz_set(&(generators[5][2]), 1); + ibz_set(&(generators[3][3]), 7); + ibz_set(&(generators[7][3]), -3); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp[i][j]), 0); + } + ibz_set(&(cmp[i][i]), 1); + } + ibz_mat_4xn_hnf_core(&hnf, 8, generators); + res = res || (!ibz_mat_4x4_equal(&cmp, &hnf)); + + // test known hnf encountered in + // https://github.com/SQISign/sqisign-nist/issues/38#issuecomment-1554585079 + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), 0); + } + } + ibz_set(&(generators[4][0]), 438); + ibz_set(&(generators[4][1]), 400); + ibz_set(&(generators[4][2]), 156); + ibz_set(&(generators[4][3]), -2); + ibz_set(&(generators[5][0]), -400); + ibz_set(&(generators[5][1]), 438); + ibz_set(&(generators[5][2]), 2); + ibz_set(&(generators[5][3]), 156); + ibz_set(&(generators[6][0]), -28826); + ibz_set(&(generators[6][1]), -148); + ibz_set(&(generators[6][2]), 220); + ibz_set(&(generators[6][3]), -122); + ibz_set(&(generators[7][0]), 586); + ibz_set(&(generators[7][1]), -28426); + ibz_set(&(generators[7][2]), 278); + ibz_set(&(generators[7][3]), 218); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp[i][j]), 0); + } + } + ibz_set(&(cmp[0][0]), 2321156); + ibz_set(&(cmp[1][1]), 2321156); + ibz_set(&(cmp[0][2]), 620252); + ibz_set(&(cmp[1][2]), 365058); + ibz_set(&(cmp[2][2]), 2); + ibz_set(&(cmp[0][3]), 1956098); + ibz_set(&(cmp[1][3]), 620252); + ibz_set(&(cmp[3][3]), 2); + ibz_mat_4xn_hnf_core(&hnf, 8, generators); + res = res || (!ibz_mat_4x4_equal(&cmp, &hnf)); + + if (res != 0) { + printf("Quaternion unit test dim4_ibz_mat_4xn_hnf_core failed\n"); + } + for (int i = 0; i < 8; i++) + ibz_vec_4_finalize(&(generators[i])); + ibz_mat_4x4_finalize(&hnf); + ibz_mat_4x4_finalize(&cmp); + return (res); +} + +// void ibz_mat_4xn_hnf_mod_core(ibz_mat_4x4_t *hnf, int generator_number, const ibz_vec_4_t +// (*generators)[generator_number], const ibz_t *mod); +int +quat_test_ibz_mat_4xn_hnf_mod_core(void) +{ + int res = 0; + ibz_t det; + ibz_vec_4_t generators[8]; + ibz_mat_4x4_t hnf, cmp; + ibz_init(&det); + ibz_mat_4x4_init(&hnf); + ibz_mat_4x4_init(&cmp); + for (int i = 0; i < 8; i++) + ibz_vec_4_init(&(generators[i])); + + ibz_set(&(generators[2][0]), 2); + ibz_set(&(generators[3][1]), 3); + ibz_set(&(generators[4][0]), 4); + ibz_set(&(generators[2][3]), 5); + ibz_set(&(generators[7][3]), 6); + ibz_set(&(generators[7][1]), 7); + ibz_set(&(generators[3][1]), 8); + ibz_set(&(generators[1][1]), 9); + ibz_set(&(generators[6][0]), 10); + ibz_set(&(generators[5][0]), 11); + ibz_set(&(generators[0][0]), 12); + ibz_set(&(generators[5][2]), 1); + ibz_set(&(generators[0][2]), 2); + ibz_set(&det, 4); + ibz_mat_4xn_hnf_mod_core(&hnf, 8, generators, &det); + res = res || (!ibz_mat_4x4_is_hnf(&hnf)); + + // test equality of result to a known hnf + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), 0); + } + } + ibz_set(&(generators[0][0]), 4); + ibz_set(&(generators[2][0]), 3); + ibz_set(&(generators[4][0]), 1); + ibz_set(&(generators[7][0]), -1); + ibz_set(&(generators[1][1]), 5); + ibz_set(&(generators[5][1]), -2); + ibz_set(&(generators[2][2]), 3); + ibz_set(&(generators[6][2]), 1); + ibz_set(&(generators[5][2]), 1); + ibz_set(&(generators[3][3]), 7); + ibz_set(&(generators[7][3]), -3); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp[i][j]), 0); + } + ibz_set(&(cmp[i][i]), 1); + } + ibz_set(&det, 1); + ibz_mat_4xn_hnf_mod_core(&hnf, 8, generators, &det); + res = res || (!ibz_mat_4x4_equal(&cmp, &hnf)); + + // test known hnf encountered in + // https://github.com/SQISign/sqisign-nist/issues/38#issuecomment-1554585079 + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), 0); + } + } + ibz_set(&(generators[4][0]), 438); + ibz_set(&(generators[4][1]), 400); + ibz_set(&(generators[4][2]), 156); + ibz_set(&(generators[4][3]), -2); + ibz_set(&(generators[5][0]), -400); + ibz_set(&(generators[5][1]), 438); + ibz_set(&(generators[5][2]), 2); + ibz_set(&(generators[5][3]), 156); + ibz_set(&(generators[6][0]), -28826); + ibz_set(&(generators[6][1]), -148); + ibz_set(&(generators[6][2]), 220); + ibz_set(&(generators[6][3]), -122); + ibz_set(&(generators[7][0]), 586); + ibz_set(&(generators[7][1]), -28426); + ibz_set(&(generators[7][2]), 278); + ibz_set(&(generators[7][3]), 218); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp[i][j]), 0); + } + } + ibz_set(&(cmp[0][0]), 2321156); + ibz_set(&(cmp[1][1]), 2321156); + ibz_set(&(cmp[0][2]), 620252); + ibz_set(&(cmp[1][2]), 365058); + ibz_set(&(cmp[2][2]), 2); + ibz_set(&(cmp[0][3]), 1956098); + ibz_set(&(cmp[1][3]), 620252); + ibz_set(&(cmp[3][3]), 2); + ibz_set_from_str(&det, "21551060705344", 10); + ibz_mat_4xn_hnf_mod_core(&hnf, 8, generators, &det); + res = res || (!ibz_mat_4x4_equal(&cmp, &hnf)); + + // use non-modular hnf version to test + ibz_set(&(generators[4][0]), 438); + ibz_set(&(generators[4][0]), 438); + ibz_set(&(generators[4][1]), 400); + ibz_set(&(generators[4][2]), 156); + ibz_set(&(generators[5][3]), -2); + ibz_set(&(generators[5][0]), -40); + ibz_set(&(generators[5][1]), 438); + ibz_set(&(generators[5][2]), 20); + ibz_set(&(generators[5][3]), 156); + ibz_set(&(generators[6][0]), -28826); + ibz_set(&(generators[6][1]), -148); + ibz_set(&(generators[6][2]), 220); + ibz_set(&(generators[6][3]), -122); + ibz_set(&(generators[7][0]), 586); + ibz_set(&(generators[7][1]), -28426); + ibz_set(&(generators[7][2]), 278); + ibz_set(&(generators[7][3]), 218); + ibz_mat_4xn_hnf_core(&cmp, 8, generators); + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &cmp); + ibz_abs(&det, &det); + ibz_mat_4xn_hnf_mod_core(&hnf, 8, generators, &det); + res = res || (!ibz_mat_4x4_equal(&cmp, &hnf)); + + if (res != 0) { + printf("Quaternion unit test dim4_ibz_mat_4x8_hnf_mod_core failed\n"); + } + ibz_mat_4x4_finalize(&hnf); + ibz_mat_4x4_finalize(&cmp); + ibz_finalize(&det); + for (int i = 0; i < 8; i++) + ibz_vec_4_finalize(&(generators[i])); + return (res); +} + +// void ibz_mat_4xn_hnf_core(ibz_mat_4x4_t *hnf, int generator_number, const +// ibz_vec_4_t +// (*generators)[generator_number]); +int +quat_test_ibz_mat_4xn_hnf_core_randomized(void) +{ + // only partial test, since lattice equality cannot be tested without hnf, so only one inclusion + // is checked + int res = 0; + ibz_vec_4_t generators[8]; + quat_alg_elem_t vec; + quat_lattice_t lat; + ibz_mat_4x4_t hnf, cmp; + for (int i = 0; i < 8; i++) + ibz_vec_4_init(&(generators[i])); + quat_lattice_init(&lat); + quat_alg_elem_init(&vec); + ibz_mat_4x4_init(&hnf); + ibz_mat_4x4_init(&cmp); + int32_t rand[8][4]; + int det_non_0; + + for (int iter = 0; iter < 10; iter++) { + int randret = randombytes((unsigned char *)rand, sizeof(rand)); + if (randret != 0) + return 1; + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), rand[j][i]); + } + } + ibz_mat_4xn_hnf_core(&hnf, 8, generators); + res = res || (!ibz_mat_4x4_is_hnf(&hnf)); + // also should test that they generate the same lattice. However, can only check one + // inclusion efficiently (and this only if full rank), so do so + det_non_0 = 1; + for (int i = 0; i < 4; i++) { + det_non_0 = det_non_0 && ibz_is_zero(&(hnf[i][i])); + } + if (det_non_0) { + ibz_mat_4x4_copy(&(lat.basis), &hnf); + ibz_set(&(lat.denom), 1); + ibz_set(&(vec.denom), 1); + for (int i = 0; i < 8; i++) { + ibz_vec_4_copy(&(vec.coord), &(generators[i])); + res = res || !quat_lattice_contains(NULL, &lat, &vec); + } + } + } + + if (res != 0) { + printf("Quaternion unit test with randomization for ibz_mat_4xn_hnf_core " + "failed\n"); + } + quat_lattice_finalize(&lat); + quat_alg_elem_finalize(&vec); + ibz_mat_4x4_finalize(&hnf); + ibz_mat_4x4_finalize(&cmp); + for (int i = 0; i < 8; i++) + ibz_vec_4_finalize(&(generators[i])); + return (res); +} + +// void ibz_mat_4xn_hnf_mod_core(ibz_mat_4x4_t *hnf, int generator_number, const ibz_vec_4_t +// (*generators)[generator_number],const ibz_t *mod); +int +quat_test_ibz_mat_4xn_hnf_mod_core_randomized(void) +{ + // only partial test, since lattice equality cannot be tested without hnf, so only one inclusion + // is checked + int res = 0; + int32_t rand[8][4]; + int32_t rand_m; + int randret; + quat_alg_elem_t vec; + quat_lattice_t lat; + ibz_vec_4_t generators[8]; + ibz_t det, m; + ibz_mat_4x4_t hnf, cmp; + ibz_init(&det); + ibz_init(&m); + quat_lattice_init(&lat); + quat_alg_elem_init(&vec); + ibz_mat_4x4_init(&hnf); + ibz_mat_4x4_init(&cmp); + for (int i = 0; i < 8; i++) + ibz_vec_4_init(&(generators[i])); + + for (int iter = 0; iter < 10; iter++) { + randret = randombytes((unsigned char *)rand, sizeof(rand)); + if (randret != 0) { + res = 1; + goto end; + } + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 8; j++) { + ibz_set(&(generators[j][i]), rand[j][i]); + } + } + rand_m = 0; + while (rand_m <= 0) { + randret = randombytes((unsigned char *)&rand_m, sizeof(int32_t)); + if (randret != 0) { + res = 1; + goto end; + } + } + ibz_set(&m, rand_m); + + ibz_mat_4xn_hnf_core(&cmp, 8, generators); + res = res || (!ibz_mat_4x4_is_hnf(&cmp)); + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &cmp); + if (!ibz_is_zero(&det)) { + ibz_mul(&det, &det, &m); + ibz_mat_4xn_hnf_mod_core(&hnf, 8, generators, &det); + res = res || (!ibz_mat_4x4_equal(&hnf, &cmp)); + } + } + +end:; + if (res != 0) { + printf("Quaternion unit test with randomization for ibz_mat_4xn_hnf_mod_core failed\n"); + } + quat_lattice_finalize(&lat); + quat_alg_elem_finalize(&vec); + ibz_mat_4x4_finalize(&hnf); + ibz_mat_4x4_finalize(&cmp); + ibz_finalize(&det); + ibz_finalize(&m); + for (int i = 0; i < 8; i++) + ibz_vec_4_finalize(&(generators[i])); + return (res); +} + +// run all previous tests +int +quat_test_hnf(void) +{ + int res = 0; + printf("\nRunning quaternion tests of matrices, vectors and quadratic forms in dimension 4\n"); + res = res | quat_test_ibz_mod_not_zero(); + res = res | quat_test_ibz_centered_mod(); + res = res | quat_test_ibz_conditional_assign(); + res = res | quat_test_ibz_xgcd_with_u_not_0(); + res = res | quat_test_ibz_rounded_div(); + res = res | quat_test_ibz_mat_4x4_is_hnf(); + res = res | quat_test_ibz_mat_4xn_hnf_core(); + res = res | quat_test_ibz_mat_4xn_hnf_mod_core(); + res = res | quat_test_ibz_mat_4xn_hnf_core_randomized(); + res = res | quat_test_ibz_mat_4xn_hnf_mod_core_randomized(); + return (res); +} diff --git a/src/quaternion/ref/generic/hnf/ibz_division.c b/src/quaternion/ref/generic/hnf/ibz_division.c new file mode 100644 index 0000000..622361d --- /dev/null +++ b/src/quaternion/ref/generic/hnf/ibz_division.c @@ -0,0 +1,12 @@ +#include "hnf_internal.h" +#if defined(MINI_GMP) +#include +#else +#include +#endif + +void +ibz_xgcd(ibz_t *gcd, ibz_t *u, ibz_t *v, const ibz_t *a, const ibz_t *b) +{ + mpz_gcdext(*gcd, *u, *v, *a, *b); +} \ No newline at end of file diff --git a/src/quaternion/ref/generic/ideal.c b/src/quaternion/ref/generic/ideal.c index 5e10c4c..9cf863a 100644 --- a/src/quaternion/ref/generic/ideal.c +++ b/src/quaternion/ref/generic/ideal.c @@ -2,370 +2,322 @@ #include #include "internal.h" -void quat_lideal_create_principal(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg) { - ibz_mat_4x4_t mulmat; - ibq_t norm; - ibz_mat_4x4_init(&mulmat); - ibq_init(&norm); - - // Multiply order basis on the right by x - quat_alg_rightmul_mat(&mulmat, x, alg); - ibz_mat_4x4_mul(&lideal->lattice.basis, &mulmat, &order->basis); - - // Adjust denominators - ibz_mul(&lideal->lattice.denom, &x->denom, &order->denom); - quat_lattice_reduce_denom(&lideal->lattice, &lideal->lattice); - - // Compute HNF - quat_lattice_hnf(&lideal->lattice); - - // Compute norm and check it's integral - quat_alg_norm(&norm, x, alg); - assert(ibq_is_ibz(&norm)); - ibq_to_ibz(&lideal->norm, &norm); - - // Set order - lideal->parent_order = order; - - ibq_finalize(&norm); - ibz_mat_4x4_finalize(&mulmat); +// assumes parent order and lattice correctly set, computes and sets the norm +void +quat_lideal_norm(quat_left_ideal_t *lideal) +{ + quat_lattice_index(&(lideal->norm), &(lideal->lattice), (lideal->parent_order)); + int ok UNUSED = ibz_sqrt(&(lideal->norm), &(lideal->norm)); + assert(ok); } -void quat_lideal_create_from_primitive(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg) { +// assumes parent order and lattice correctly set, recomputes and verifies its norm +static int +quat_lideal_norm_verify(const quat_left_ideal_t *lideal) +{ + int res; + ibz_t index; + ibz_init(&index); + quat_lattice_index(&index, &(lideal->lattice), (lideal->parent_order)); + ibz_sqrt(&index, &index); + res = (ibz_cmp(&(lideal->norm), &index) == 0); + ibz_finalize(&index); + return (res); +} + +void +quat_lideal_copy(quat_left_ideal_t *copy, const quat_left_ideal_t *copied) +{ + copy->parent_order = copied->parent_order; + ibz_copy(©->norm, &copied->norm); + ibz_copy(©->lattice.denom, &copied->lattice.denom); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(©->lattice.basis[i][j], &copied->lattice.basis[i][j]); + } + } +} + +void +quat_lideal_create_principal(quat_left_ideal_t *lideal, + const quat_alg_elem_t *x, + const quat_lattice_t *order, + const quat_alg_t *alg) +{ + assert(quat_order_is_maximal(order, alg)); + assert(quat_lattice_contains(NULL, order, x)); + ibz_t norm_n, norm_d; + ibz_init(&norm_n); + ibz_init(&norm_d); + + // Multiply order on the right by x + quat_lattice_alg_elem_mul(&(lideal->lattice), order, x, alg); + + // Reduce denominator. This conserves HNF + quat_lattice_reduce_denom(&lideal->lattice, &lideal->lattice); + + // Compute norm and check it's integral + quat_alg_norm(&norm_n, &norm_d, x, alg); + assert(ibz_is_one(&norm_d)); + ibz_copy(&lideal->norm, &norm_n); + + // Set order + lideal->parent_order = order; + ibz_finalize(&norm_n); + ibz_finalize(&norm_d); +} + +void +quat_lideal_create(quat_left_ideal_t *lideal, + const quat_alg_elem_t *x, + const ibz_t *N, + const quat_lattice_t *order, + const quat_alg_t *alg) +{ + assert(quat_order_is_maximal(order, alg)); + assert(!quat_alg_elem_is_zero(x)); + quat_lattice_t ON; quat_lattice_init(&ON); - + // Compute ideal generated by x quat_lideal_create_principal(lideal, x, order, alg); - // Compute norm - ibz_gcd(&lideal->norm, &lideal->norm, N); - // Compute ideal generated by N (without reducing denominator) ibz_mat_4x4_scalar_mul(&ON.basis, N, &order->basis); ibz_copy(&ON.denom, &order->denom); - + // Add lattices (reduces denominators) quat_lattice_add(&lideal->lattice, &lideal->lattice, &ON); - -#ifndef NDEBUG - // verify norm - ibz_t tmp; - ibz_init(&tmp); - quat_lattice_index(&tmp,&(lideal->lattice),(lideal->parent_order)); - int ok = ibz_sqrt(&tmp,&tmp); - assert(ok); - ok = (0==ibz_cmp(&tmp,&(lideal->norm))); - assert(ok); - ibz_finalize(&tmp); -#endif - // Set order lideal->parent_order = order; + // Compute norm + quat_lideal_norm(lideal); quat_lattice_finalize(&ON); } -void quat_lideal_make_primitive_then_create(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg) { - quat_alg_elem_t prim; - ibz_t imprim, n1; - quat_alg_elem_init(&prim); - ibz_init(&imprim); - ibz_init(&n1); - - // Store the primitive part of x in elem - quat_alg_make_primitive(&prim.coord, &imprim, x, order, alg); - ibz_mat_4x4_eval(&prim.coord, &order->basis, &prim.coord); - ibz_copy(&prim.denom, &order->denom); - - // imprim = gcd(imprimitive part of x, N) - // n1 = N / imprim - ibz_gcd(&imprim, &imprim, N); - ibz_div(&n1, &imprim, N, &imprim); - - // Generate the ideal (elem, n1) - quat_lideal_create_from_primitive(lideal, &prim, &n1, order, alg); - - quat_alg_elem_finalize(&prim); - ibz_finalize(&imprim); - ibz_finalize(&n1); -} - -int quat_lideal_random_2e(quat_left_ideal_t *lideal, const quat_order_t *order, const quat_alg_t *alg, int64_t e, unsigned char n) { - ibq_t norm; - ibz_t norm_num; - ibq_init(&norm); - ibz_init(&norm_num); - - quat_alg_elem_t gen; - quat_alg_elem_init(&gen); - ibz_set(&gen.coord[0], 1); - - // Start with the trivial left ideal of O - quat_lideal_create_principal(lideal, &gen, order, alg); - - // Create the lattice 2·O - quat_lattice_t O2; - quat_lattice_init(&O2); - if (ibz_get(&order->denom) % 2 == 0) { - ibz_mat_4x4_copy(&O2.basis, &order->basis); - ibz_div_2exp(&O2.denom, &order->denom, 1); - } else { - ibz_mat_4x4_scalar_mul(&O2.basis, &ibz_const_two, &order->basis); - ibz_copy(&O2.denom, &order->denom); - } - - for (int i = 0; i < e; ++i) { - // Take random gen ∈ lideal until one is found such that - // val₂(N(gen)) > i and gen ∉ 2·O - do { - if (!quat_lattice_random_elem(&gen, &lideal->lattice, n)) - return 0; - - quat_alg_norm(&norm, &gen, alg); - int ok = ibq_to_ibz(&norm_num, &norm); - assert(ok); - // N(gen)/N(I) - ibz_div_2exp(&norm_num, &norm_num, i); - } - // Check that 2-norm has increased, do not backtrack - while ((ibz_get(&norm_num) % 2 != 0) || - quat_lattice_contains(NULL, &O2, &gen, alg)); - - // Redefine lideal as (gen, 2^(i+1)) - ibz_mul(&norm_num, &lideal->norm, &ibz_const_two); - quat_lideal_create_from_primitive(lideal, &gen, &norm_num, order, alg); - assert(ibz_cmp(&lideal->norm, &norm_num) == 0); - } - - quat_lattice_finalize(&O2); - ibq_finalize(&norm); - ibz_finalize(&norm_num); - quat_alg_elem_finalize(&gen); - return 1; -} - -int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *alg, int bound) { - return(quat_lideal_generator_coprime(gen, lideal, &ibz_const_one, alg,bound)); -} - -int quat_lideal_generator_coprime(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const ibz_t *n, const quat_alg_t *alg, int bound) { - ibq_t norm; - ibz_t norm_int, norm_n,gcd, r, q, n2, gcd_ref; +int +quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *alg) +{ + ibz_t norm_int, norm_n, gcd, r, q, norm_denom; ibz_vec_4_t vec; ibz_vec_4_init(&vec); - ibq_init(&norm); + ibz_init(&norm_denom); ibz_init(&norm_int); ibz_init(&norm_n); - ibz_init(&gcd_ref); - ibz_init(&n2); ibz_init(&r); ibz_init(&q); ibz_init(&gcd); - ibz_mul(&norm_n, &lideal->norm, n); - ibz_mul(&n2, n, n); - ibz_gcd(&gcd_ref,n,&(lideal->norm)); - int a, b, c, d, int_norm; - int used_bound = QUATERNION_lideal_generator_search_bound; - if(bound != 0) - used_bound = bound; - assert(used_bound > 0); + int a, b, c, d; int found = 0; - for (int_norm = 1; int_norm < used_bound; int_norm++){ - for (a = -int_norm; a <= int_norm; a++){ - for (b = -int_norm + abs(a); b <= int_norm - abs(a); b++){ - for (c = -int_norm + abs(a) + abs(b); c <= int_norm - abs(a) - abs(b); c++){ + int int_norm = 0; + while (1) { + int_norm++; + for (a = -int_norm; a <= int_norm; a++) { + for (b = -int_norm + abs(a); b <= int_norm - abs(a); b++) { + for (c = -int_norm + abs(a) + abs(b); c <= int_norm - abs(a) - abs(b); c++) { d = int_norm - abs(a) - abs(b) - abs(c); - ibz_vec_4_set(&vec,a,b,c,d); - ibz_content(&gcd, &vec); - if(ibz_is_one(&gcd)){ - ibz_mat_4x4_eval(&(gen->coord),&(lideal->lattice.basis),&vec); - ibz_copy(&(gen->denom),&(lideal->lattice.denom)); - quat_alg_norm(&norm, gen, alg); - found = ibq_to_ibz(&norm_int, &norm); - if(found){ - ibz_div(&q,&r,&norm_int,&(lideal->norm)); - found = ibz_is_zero(&r); - if(found){ - ibz_gcd(&gcd, &norm_n, &q); - found = (0==ibz_cmp(&gcd, &ibz_const_one)); - if(found){ - ibz_gcd(&gcd, &n2, &norm_int); - found = (0==ibz_cmp(&gcd, &gcd_ref)); - } - } - } - if(found) + ibz_vec_4_set(&vec, a, b, c, d); + ibz_vec_4_content(&gcd, &vec); + if (ibz_is_one(&gcd)) { + ibz_mat_4x4_eval(&(gen->coord), &(lideal->lattice.basis), &vec); + ibz_copy(&(gen->denom), &(lideal->lattice.denom)); + quat_alg_norm(&norm_int, &norm_denom, gen, alg); + assert(ibz_is_one(&norm_denom)); + ibz_div(&q, &r, &norm_int, &(lideal->norm)); + assert(ibz_is_zero(&r)); + ibz_gcd(&gcd, &(lideal->norm), &q); + found = (0 == ibz_cmp(&gcd, &ibz_const_one)); + if (found) goto fin; } } } } } - fin:; +fin:; ibz_finalize(&r); ibz_finalize(&q); - ibq_finalize(&norm); + ibz_finalize(&norm_denom); ibz_finalize(&norm_int); ibz_finalize(&norm_n); - ibz_finalize(&gcd_ref); - ibz_finalize(&n2); ibz_vec_4_finalize(&vec); ibz_finalize(&gcd); - return(found); + return (found); } -int quat_lideal_mul(quat_left_ideal_t *product, const quat_left_ideal_t *lideal, const quat_alg_elem_t *alpha, const quat_alg_t *alg, int bound) { - ibq_t norm, norm_lideal; - ibz_t norm_int, num, denom; - quat_alg_elem_t gen; - ibq_init(&norm); - ibq_init(&norm_lideal); - ibz_init(&norm_int); - ibz_init(&num); - ibz_init(&denom); - quat_alg_elem_init(&gen); - - quat_alg_norm(&norm, alpha, alg); - ibq_num(&num,&norm); - ibq_denom(&denom,&norm); - ibz_gcd(&denom,&denom,&num); - ibz_div(&norm_int,&denom,&num,&denom); - // Find a random generator gen of norm coprime to N(alpha) - // Warning: hardcoded the default constant, and this call can fail! - int found = quat_lideal_generator_coprime(&gen, lideal, &norm_int, alg,0); - if(found){ - // Define the ideal (gen·α, N(lideal)·N(α)) - quat_alg_mul(&gen, &gen, alpha, alg); - ibz_copy(&num,&(lideal->norm)); - ibz_set(&denom,1); - ibq_set(&norm_lideal,&num,&denom); - ibq_mul(&norm, &norm, &norm_lideal); - int ok = ibq_to_ibz(&norm_int, &norm); - assert(ok); - quat_lideal_create_from_primitive(product, &gen, &norm_int, lideal->parent_order, alg); - } - - ibq_finalize(&norm); - ibz_finalize(&norm_int); - ibq_finalize(&norm_lideal); - ibz_finalize(&num); - ibz_finalize(&denom); - quat_alg_elem_finalize(&gen); - return(found); -} - -void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg) { - assert(I1->parent_order == I2->parent_order); - quat_lattice_add(&sum->lattice, &I1->lattice, &I2->lattice); - quat_lattice_index(&sum->norm, &sum->lattice, I1->parent_order); - int ok = ibz_sqrt(&sum->norm, &sum->norm); - assert(ok); - sum->parent_order = I1->parent_order; -} - -void quat_lideal_inter(quat_left_ideal_t *inter, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg) { - assert(I1->parent_order == I2->parent_order); - quat_lattice_intersect(&inter->lattice, &I1->lattice, &I2->lattice); - quat_lattice_index(&inter->norm, &inter->lattice, I1->parent_order); - int ok = ibz_sqrt(&inter->norm, &inter->norm); - assert(ok); - inter->parent_order = I1->parent_order; -} - -int quat_lideal_equals(const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg) { - return I1->parent_order == I2->parent_order - && ibz_cmp(&I1->norm, &I2->norm) == 0 - && quat_lattice_equal(&I1->lattice, &I2->lattice); -} - -int quat_lideal_isom(quat_alg_elem_t *iso, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg){ - // Only accept strict equality of parent orders - if (I1->parent_order != I2->parent_order) - return 0; - - quat_lattice_t trans; - ibz_mat_4x4_t lll; - ibq_t norm, norm_bound; - quat_lattice_init(&trans); - ibz_mat_4x4_init(&lll); - ibq_init(&norm_bound); ibq_init(&norm); - - quat_lattice_right_transporter(&trans, &I1->lattice, &I2->lattice, alg); - - int err = quat_lattice_lll(&lll, &trans, &alg->p, 0); - assert(!err); - // The shortest vector found by lll is a candidate - for (int i = 0; i < 4; i++) - ibz_copy(&iso->coord[i], &lll[i][0]); - ibz_copy(&iso->denom, &trans.denom); - - // bound on the smallest vector in transporter: N₂ / N₁ - ibq_set(&norm_bound, &I2->norm, &I1->norm); - quat_alg_norm(&norm, iso, alg); - - int isom = ibq_cmp(&norm, &norm_bound) <= 0; - - quat_lattice_finalize(&trans); - ibz_mat_4x4_finalize(&lll); - ibq_finalize(&norm_bound); ibq_finalize(&norm); - - return isom; -} - -void quat_lideal_right_order(quat_order_t *order, const quat_left_ideal_t *lideal, const quat_alg_t *alg){ - quat_lattice_right_transporter(order, &lideal->lattice, &lideal->lattice, alg); -} - -void quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, ibz_mat_4x4_t *gram, const quat_left_ideal_t *lideal, const quat_alg_t *alg){ - ibz_mat_4x4_t prod; - ibz_mat_4x4_init(&prod); - quat_lattice_lll(reduced,&(lideal ->lattice),&(alg->p),0); - ibz_mat_4x4_transpose(&prod,reduced); - ibz_mat_4x4_mul(&prod,&prod,&(alg ->gram)); - ibz_mat_4x4_mul(gram,&prod,reduced); - ibz_mat_4x4_finalize(&prod); -} - -/***************************** Function from quaternion_tools.c ***************************************/ - -void quat_connecting_ideal(quat_left_ideal_t *connecting_ideal, const quat_order_t *O1, const quat_order_t *O2, const quat_alg_t *alg){ - quat_lattice_t inter; - ibz_t norm,one; - ibz_mat_4x4_t gens; - quat_alg_elem_t gen; - quat_left_ideal_t I[4]; +void +quat_lideal_mul(quat_left_ideal_t *product, + const quat_left_ideal_t *lideal, + const quat_alg_elem_t *alpha, + const quat_alg_t *alg) +{ + assert(quat_order_is_maximal((lideal->parent_order), alg)); + ibz_t norm, norm_d; ibz_init(&norm); - ibz_init(&one); - quat_lattice_init(&inter); - ibz_mat_4x4_init(&gens); - quat_alg_elem_init(&gen); - for (int i = 0; i < 4; i++) { - quat_left_ideal_init(I + i); - } - ibz_set(&one,1); - - quat_lattice_intersect(&inter,O1,O2); - quat_lattice_index(&norm,&inter,O1); - ibz_mat_4x4_scalar_mul(&gens,&norm,&(O2->basis)); - quat_alg_scalar(&gen,&norm,&one); - quat_lideal_create_principal(connecting_ideal, &gen, O1, alg); - for (int i = 0; i < 4; i++) {; - quat_alg_elem_copy_ibz(&gen,&(O2->denom),&(gens[0][i]),&(gens[1][i]),&(gens[2][i]),&(gens[3][i])); - quat_lideal_create_principal(I + i, &gen, O1, alg); - } - - quat_lideal_add(connecting_ideal, connecting_ideal, I+0, alg); - quat_lideal_add(connecting_ideal, connecting_ideal, I+1, alg); - quat_lideal_add(connecting_ideal, connecting_ideal, I+2, alg); - quat_lideal_add(connecting_ideal, connecting_ideal, I+3, alg); - + ibz_init(&norm_d); + quat_lattice_alg_elem_mul(&(product->lattice), &(lideal->lattice), alpha, alg); + product->parent_order = lideal->parent_order; + quat_alg_norm(&norm, &norm_d, alpha, alg); + ibz_mul(&(product->norm), &(lideal->norm), &norm); + assert(ibz_divides(&(product->norm), &norm_d)); + ibz_div(&(product->norm), &norm, &(product->norm), &norm_d); + assert(quat_lideal_norm_verify(lideal)); + ibz_finalize(&norm_d); ibz_finalize(&norm); - ibz_finalize(&one); - quat_lattice_finalize(&inter); - ibz_mat_4x4_finalize(&gens); - quat_alg_elem_finalize(&gen); - for (int i = 0; i < 4; i++) { - quat_left_ideal_finalize(I + i); - } +} + +void +quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg) +{ + assert(I1->parent_order == I2->parent_order); + assert(quat_order_is_maximal((I2->parent_order), alg)); + quat_lattice_add(&sum->lattice, &I1->lattice, &I2->lattice); + sum->parent_order = I1->parent_order; + quat_lideal_norm(sum); +} + +void +quat_lideal_inter(quat_left_ideal_t *inter, + const quat_left_ideal_t *I1, + const quat_left_ideal_t *I2, + const quat_alg_t *alg) +{ + assert(I1->parent_order == I2->parent_order); + assert(quat_order_is_maximal((I2->parent_order), alg)); + quat_lattice_intersect(&inter->lattice, &I1->lattice, &I2->lattice); + inter->parent_order = I1->parent_order; + quat_lideal_norm(inter); +} + +int +quat_lideal_equals(const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg) +{ + assert(quat_order_is_maximal((I2->parent_order), alg)); + assert(quat_order_is_maximal((I1->parent_order), alg)); + return (I1->parent_order == I2->parent_order) & (ibz_cmp(&I1->norm, &I2->norm) == 0) & + quat_lattice_equal(&I1->lattice, &I2->lattice); +} + +void +quat_lideal_inverse_lattice_without_hnf(quat_lattice_t *inv, const quat_left_ideal_t *lideal, const quat_alg_t *alg) +{ + assert(quat_order_is_maximal((lideal->parent_order), alg)); + quat_lattice_conjugate_without_hnf(inv, &(lideal->lattice)); + ibz_mul(&(inv->denom), &(inv->denom), &(lideal->norm)); +} + +// following the implementation of ideal isomorphisms in the code of LearningToSQI's sage +// implementation of SQIsign +void +quat_lideal_right_transporter(quat_lattice_t *trans, + const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg) +{ + assert(quat_order_is_maximal((lideal1->parent_order), alg)); + assert(quat_order_is_maximal((lideal2->parent_order), alg)); + assert(lideal1->parent_order == lideal2->parent_order); + quat_lattice_t inv; + quat_lattice_init(&inv); + quat_lideal_inverse_lattice_without_hnf(&inv, lideal1, alg); + quat_lattice_mul(trans, &inv, &(lideal2->lattice), alg); + quat_lattice_finalize(&inv); +} + +void +quat_lideal_right_order(quat_lattice_t *order, const quat_left_ideal_t *lideal, const quat_alg_t *alg) +{ + assert(quat_order_is_maximal((lideal->parent_order), alg)); + quat_lideal_right_transporter(order, lideal, lideal, alg); +} + +void +quat_lideal_class_gram(ibz_mat_4x4_t *G, const quat_left_ideal_t *lideal, const quat_alg_t *alg) +{ + quat_lattice_gram(G, &(lideal->lattice), alg); + + // divide by norm · denominator² + ibz_t divisor, rmd; + ibz_init(&divisor); + ibz_init(&rmd); + + ibz_mul(&divisor, &(lideal->lattice.denom), &(lideal->lattice.denom)); + ibz_mul(&divisor, &divisor, &(lideal->norm)); + + for (int i = 0; i < 4; i++) { + for (int j = 0; j <= i; j++) { + ibz_div(&(*G)[i][j], &rmd, &(*G)[i][j], &divisor); + assert(ibz_is_zero(&rmd)); + } + } + for (int i = 0; i < 4; i++) { + for (int j = 0; j <= i - 1; j++) { + ibz_copy(&(*G)[j][i], &(*G)[i][j]); + } + } + + ibz_finalize(&rmd); + ibz_finalize(&divisor); +} + +void +quat_lideal_conjugate_without_hnf(quat_left_ideal_t *conj, + quat_lattice_t *new_parent_order, + const quat_left_ideal_t *lideal, + const quat_alg_t *alg) +{ + quat_lideal_right_order(new_parent_order, lideal, alg); + quat_lattice_conjugate_without_hnf(&(conj->lattice), &(lideal->lattice)); + conj->parent_order = new_parent_order; + ibz_copy(&(conj->norm), &(lideal->norm)); +} + +int +quat_order_discriminant(ibz_t *disc, const quat_lattice_t *order, const quat_alg_t *alg) +{ + int ok = 0; + ibz_t det, sqr, div; + ibz_mat_4x4_t transposed, norm, prod; + ibz_init(&det); + ibz_init(&sqr); + ibz_init(&div); + ibz_mat_4x4_init(&transposed); + ibz_mat_4x4_init(&norm); + ibz_mat_4x4_init(&prod); + ibz_mat_4x4_transpose(&transposed, &(order->basis)); + // multiply gram matrix by 2 because of reduced trace + ibz_mat_4x4_identity(&norm); + ibz_copy(&(norm[2][2]), &(alg->p)); + ibz_copy(&(norm[3][3]), &(alg->p)); + ibz_mat_4x4_scalar_mul(&norm, &ibz_const_two, &norm); + ibz_mat_4x4_mul(&prod, &transposed, &norm); + ibz_mat_4x4_mul(&prod, &prod, &(order->basis)); + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &prod); + ibz_mul(&div, &(order->denom), &(order->denom)); + ibz_mul(&div, &div, &div); + ibz_mul(&div, &div, &div); + ibz_div(&sqr, &div, &det, &div); + ok = ibz_is_zero(&div); + ok = ok & ibz_sqrt(disc, &sqr); + ibz_finalize(&det); + ibz_finalize(&div); + ibz_finalize(&sqr); + ibz_mat_4x4_finalize(&transposed); + ibz_mat_4x4_finalize(&norm); + ibz_mat_4x4_finalize(&prod); + return (ok); +} + +int +quat_order_is_maximal(const quat_lattice_t *order, const quat_alg_t *alg) +{ + int res; + ibz_t disc; + ibz_init(&disc); + quat_order_discriminant(&disc, order, alg); + res = (ibz_cmp(&disc, &(alg->p)) == 0); + ibz_finalize(&disc); + return (res); } diff --git a/src/quaternion/ref/generic/include/intbig.h b/src/quaternion/ref/generic/include/intbig.h new file mode 100644 index 0000000..a0c2c02 --- /dev/null +++ b/src/quaternion/ref/generic/include/intbig.h @@ -0,0 +1,303 @@ +/** @file + * + * @authors Luca De Feo, Sina Schaeffler + * + * @brief Declarations for big integers in the reference implementation + */ + +#ifndef INTBIG_H +#define INTBIG_H + +#include +#if defined(MINI_GMP) +#include +#include +#else +#include +#endif +#include +#include + +/** @ingroup quat_quat + * @defgroup ibz_all Signed big integers (gmp-based) + * @{ + */ + +/** @defgroup ibz_t Precise number types + * @{ + */ + +/** @brief Type for signed long integers + * + * @typedef ibz_t + * + * For integers of arbitrary size, used by intbig module, using gmp + */ +typedef mpz_t ibz_t; + +/** @} + */ + +/** @defgroup ibz_c Constants + * @{ + */ + +/** + * Constant zero + */ +extern const ibz_t ibz_const_zero; + +/** + * Constant one + */ +extern const ibz_t ibz_const_one; + +/** + * Constant two + */ +extern const ibz_t ibz_const_two; + +/** + * Constant three + */ +extern const ibz_t ibz_const_three; + +/** @} + */ + +/** @defgroup ibz_finit Constructors and Destructors + * @{ + */ + +void ibz_init(ibz_t *x); +void ibz_finalize(ibz_t *x); + +/** @} + */ + +/** @defgroup ibz_za Basic integer arithmetic + * @{ + */ + +/** @brief sum=a+b + */ +void ibz_add(ibz_t *sum, const ibz_t *a, const ibz_t *b); + +/** @brief diff=a-b + */ +void ibz_sub(ibz_t *diff, const ibz_t *a, const ibz_t *b); + +/** @brief prod=a*b + */ +void ibz_mul(ibz_t *prod, const ibz_t *a, const ibz_t *b); + +/** @brief neg=-a + */ +void ibz_neg(ibz_t *neg, const ibz_t *a); + +/** @brief abs=|a| + */ +void ibz_abs(ibz_t *abs, const ibz_t *a); + +/** @brief Euclidean division of a by b + * + * Computes quotient, remainder so that remainder+quotient*b = a where 0<=|remainder|<|b| + * The quotient is rounded towards zero. + */ +void ibz_div(ibz_t *quotient, ibz_t *remainder, const ibz_t *a, const ibz_t *b); + +/** @brief Euclidean division of a by 2^exp + * + * Computes a right shift of abs(a) by exp bits, then sets sign(quotient) to sign(a). + * + * Division and rounding is as in ibz_div. + */ +void ibz_div_2exp(ibz_t *quotient, const ibz_t *a, uint32_t exp); + +/** @brief Two adic valuation computation + * + * Computes the position of the first 1 in the binary representation of the integer given in input + * + * When this number is a power of two this gives the two adic valuation of the integer + */ +int ibz_two_adic(ibz_t *pow); + +/** @brief r = a mod b + * + * Assumes valid inputs + * The sign of the divisor is ignored, the result is always non-negative + */ +void ibz_mod(ibz_t *r, const ibz_t *a, const ibz_t *b); + +unsigned long int ibz_mod_ui(const mpz_t *n, unsigned long int d); + +/** @brief Test if a = 0 mod b + */ +int ibz_divides(const ibz_t *a, const ibz_t *b); + +/** @brief pow=x^e + * + * Assumes valid inputs, The case 0^0 yields 1. + */ +void ibz_pow(ibz_t *pow, const ibz_t *x, uint32_t e); + +/** @brief pow=(x^e) mod m + * + * Assumes valid inputs + */ +void ibz_pow_mod(ibz_t *pow, const ibz_t *x, const ibz_t *e, const ibz_t *m); + +/** @brief Compare a and b + * + * @returns a positive value if a > b, zero if a = b, and a negative value if a < b + */ +int ibz_cmp(const ibz_t *a, const ibz_t *b); + +/** @brief Test if x is 0 + * + * @returns 1 if x=0, 0 otherwise + */ +int ibz_is_zero(const ibz_t *x); + +/** @brief Test if x is 1 + * + * @returns 1 if x=1, 0 otherwise + */ +int ibz_is_one(const ibz_t *x); + +/** @brief Compare x to y + * + * @returns 0 if x=y, positive if x>y, negative if x= 0 and target must hold sufficient elements to hold ibz + * + * @param target Target digit_t array + * @param ibz ibz source ibz_t element + */ +void ibz_to_digits(digit_t *target, const ibz_t *ibz); +#define ibz_to_digit_array(T, I) \ + do { \ + memset((T), 0, sizeof(T)); \ + ibz_to_digits((T), (I)); \ + } while (0) + +/** @brief get int32_t equal to the lowest bits of i + * + * Should not be used to get the value of i if its bitsize is close to 32 bit + * It can however be used on any i to get an int32_t of the same parity as i (and same value modulo + * 4) + * + * @param i Input integer + */ +int32_t ibz_get(const ibz_t *i); + +/** @brief generate random value in [a, b] + * assumed that a >= 0 and b >= 0 and a < b + * @returns 1 on success, 0 on failiure + */ +int ibz_rand_interval(ibz_t *rand, const ibz_t *a, const ibz_t *b); + +/** @brief generate random value in [-m, m] + * assumed that m > 0 and bitlength of m < 32 bit + * @returns 1 on success, 0 on failiure + */ +int ibz_rand_interval_minm_m(ibz_t *rand, int32_t m); + +/** @brief Bitsize of a. + * + * @returns Bitsize of a. + * + */ +int ibz_bitsize(const ibz_t *a); + +/** @brief Size of a in given base. + * + * @returns Size of a in given base. + * + */ +int ibz_size_in_base(const ibz_t *a, int base); + +/** @} + */ + +/** @defgroup ibz_n Number theory functions + * @{ + */ + +/** + * @brief Greatest common divisor + * + * @param gcd Output: Set to the gcd of a and b + * @param a + * @param b + */ +void ibz_gcd(ibz_t *gcd, const ibz_t *a, const ibz_t *b); + +/** + * @brief Modular inverse + * + * @param inv Output: Set to the integer in [0,mod[ such that a*inv = 1 mod (mod) if it exists + * @param a + * @param mod + * @returns 1 if inverse exists and was computed, 0 otherwise + */ +int ibz_invmod(ibz_t *inv, const ibz_t *a, const ibz_t *mod); + +/** + * @brief Floor of Integer square root + * + * @param sqrt Output: Set to the floor of an integer square root + * @param a number of which a floor of an integer square root is searched + */ +void ibz_sqrt_floor(ibz_t *sqrt, const ibz_t *a); + +/** @} + */ + +// end of ibz_all +/** @} + */ +#endif diff --git a/src/quaternion/ref/generic/include/quaternion.h b/src/quaternion/ref/generic/include/quaternion.h index 34d164e..a567657 100644 --- a/src/quaternion/ref/generic/include/quaternion.h +++ b/src/quaternion/ref/generic/include/quaternion.h @@ -1,164 +1,133 @@ /** @file - * + * * @authors Luca De Feo, Sina Schaeffler - * + * * @brief Declarations for quaternion algebra operations -*/ + */ #ifndef QUATERNION_H #define QUATERNION_H -//#include -#include +// #include +#include +#include "intbig.h" #include - -#define QUATERNION_lideal_generator_search_bound 1024 - /** @defgroup quat_quat Quaternion algebra * @{ -*/ + */ /** @defgroup quat_vec_t Types for integer vectors and matrices * @{ -*/ + */ + +/** @brief Type for vector of 2 big integers + * + * @typedef ibz_vec_2_t + */ +typedef ibz_t ibz_vec_2_t[2]; /** @brief Type for vectors of 4 integers - * + * * @typedef ibz_vec_4_t - * + * * Represented as a vector of 4 ibz_t (big integer) elements -*/ + */ typedef ibz_t ibz_vec_4_t[4]; -/** @brief Type for vectors of 5 integers - * - * @typedef ibz_vec_5_t - * - * Represented as a vector of 5 ibz_t (big integer) elements -*/ -typedef ibz_t ibz_vec_5_t[5]; - /** @brief Type for 2 by 2 matrices of integers - * + * * @typedef ibz_mat_2x2_t - * + * * Represented as a matrix of 2 vectors of 2 ibz_t (big integer) elements -*/ + */ typedef ibz_t ibz_mat_2x2_t[2][2]; /** @brief Type for 4 by 4 matrices of integers - * + * * @typedef ibz_mat_4x4_t - * + * * Represented as a matrix of 4 vectors of 4 ibz_t (big integer) elements -*/ + */ typedef ibz_t ibz_mat_4x4_t[4][4]; - -/** @brief Type for 4 by 5 matrices of integers - * - * @typedef ibz_mat_4x5_t - * - * Represented as a matrix of 4 vectors of 5 ibz_t (big integer) elements -*/ -typedef ibz_t ibz_mat_4x5_t[4][5]; - -/** @brief Type for 4 by 8 matrices of integers - * - * @typedef ibz_mat_4x8_t - * - * Consists in and 4 by 8 matrix of ibz_t (big integers) -*/ -typedef ibz_t ibz_mat_4x8_t[4][8]; /** * @} -*/ + */ /** @defgroup quat_quat_t Types for quaternion algebras * @{ -*/ + */ /** @brief Type for quaternion algebras - * + * * @typedef quat_alg_t * * @struct quat_alg - * + * * The quaternion algebra ramified at p = 3 mod 4 and ∞. -*/ -typedef struct quat_alg { + */ +typedef struct quat_alg +{ ibz_t p; ///< Prime number, must be = 3 mod 4. - ibz_mat_4x4_t gram; ///< Gram matrix of the norm form } quat_alg_t; -/** @brief Type for integer coordinates in a basis - * - * @typedef quat_alg_coord_t - * - * Represented as a vector of 4 ibz_t (big integer) elements -*/ -typedef ibz_vec_4_t quat_alg_coord_t; - /** @brief Type for quaternion algebra elements - * + * * @typedef quat_alg_elem_t - * + * * @struct quat_alg_elem - * + * * Represented as a array *coord* of 4 ibz_t integers and a common ibz_t denominator *denom*. - * - * The representation is not necessarily normalized, that is, gcd(denom, content(coord)) might not be 1. - * For getting a normalized representation, use the quat_alg_normalize function - * - * The elements are always represented in basis (1,i,j,ij) of the quaternion algebra, with i^2=-1 and j^2 = -p -*/ -typedef struct quat_alg_elem { - ibz_t denom; ///< Denominator by which all coordinates are divided (big integer, must not be 0) - quat_alg_coord_t coord; ///< Numerators of the 4 coordinates of the quaternion algebra element in basis (1,i,j,ij) + * + * The representation is not necessarily normalized, that is, gcd(denom, content(coord)) might not + * be 1. For getting a normalized representation, use the quat_alg_normalize function + * + * The elements are always represented in basis (1,i,j,ij) of the quaternion algebra, with i^2=-1 + * and j^2 = -p + */ +typedef struct quat_alg_elem +{ + ibz_t denom; ///< Denominator by which all coordinates are divided (big integer, must not be 0) + ibz_vec_4_t coord; ///< Numerators of the 4 coordinates of the quaternion algebra element in basis (1,i,j,ij) } quat_alg_elem_t; /** @brief Type for lattices in dimension 4 - * + * * @typedef quat_lattice_t - * + * * @struct quat_lattice - * + * * Represented as a rational (`frac`) times an integreal lattice (`basis`) - * - * The basis is in hermite normal form, and its columns divided by its denominator are elements of the quaternion algebra, represented in basis (1,i,j,ij) where i^2 = -1, j^2 = -p. - * + * + * The basis is such that its columns divided by its denominator are elements of + * the quaternion algebra, represented in basis (1,i,j,ij) where i^2 = -1, j^2 = -p. + * * All lattices must have full rank (4) -*/ -typedef struct quat_lattice { - ibz_t denom; ///< Denominator by which the basis is divided (big integer, must not be 0) - ibz_mat_4x4_t basis; ///< Integer basis of the lattice in hermite normal form (its columns divided by denom are algebra elements in the usual basis) + */ +typedef struct quat_lattice +{ + ibz_t denom; ///< Denominator by which the basis is divided (big integer, must not be 0) + ibz_mat_4x4_t basis; ///< Integer basis of the lattice (its columns divided by denom are + ///< algebra elements in the usual basis) } quat_lattice_t; -/** @brief Type for quaternion orders - * - * @typedef quat_order_t - * - * Internally represented as a quat_lattice_t. - * - * That means that the basis is in hermite normal form, and its columns divided by its denominator are elements of the quaternion algebra, represented in basis (1,i,j,ij) where i^2 = -1, j^2 = -p. -*/ -typedef quat_lattice_t quat_order_t; - -/** @brief Type for left ideals in quaternion algebras - * +/** @brief Type for left ideals of maximal orders in quaternion algebras + * * @typedef quat_left_ideal_t - * + * * @struct quat_left_ideal - * - * The basis of the lattice representing it is in hermite normal form, and its columns divided by its denominator are elements of the quaternion algebra, represented in basis (1,i,j,ij) where i^2 = -1, j^2 = -p. -*/ -typedef struct quat_left_ideal { - quat_lattice_t lattice; ///< lattice representing the ideal - ibz_t norm; ///< norm of the lattice - const quat_order_t* parent_order; ///< should be a maximal ideal + * + * The basis of the lattice representing it is such that its columns divided by its denominator are + * elements of the quaternion algebra, represented in basis (1,i,j,ij) where i^2 = -1, j^2 = -p. + */ +typedef struct quat_left_ideal +{ + quat_lattice_t lattice; ///< lattice representing the ideal + ibz_t norm; ///< norm of the lattice + const quat_lattice_t *parent_order; ///< should be a maximal order } quat_left_ideal_t; /** @} -*/ + */ /** @brief Type for extremal maximal orders * @@ -167,116 +136,92 @@ typedef struct quat_left_ideal { * @struct quat_p_extremal_maximal_order * * The basis of the order representing it is in hermite normal form, and its columns divid -ed by its denominator are elements of the quaternion algebra, represented in basis (1,i,j, -ij) where i^2 = -q, j^2 = -p. +ed by its denominator are elements of the quaternion algebra, represented in basis (1,z,t, +tz) where z^2 = -q, t^2 = -p. */ -typedef struct quat_p_extremal_maximal_order { - quat_order_t order; ///< the order represented as a lattice - quat_alg_elem_t i; ///< the element of small discriminant - quat_alg_elem_t j; ///< the element of norm p orthogonal to i - int64_t q; ///< the absolute value of sqrt of i +typedef struct quat_p_extremal_maximal_order +{ + quat_lattice_t order; ///< the order represented as a lattice + quat_alg_elem_t z; ///< the element of small discriminant + quat_alg_elem_t t; ///< the element of norm p orthogonal to z + uint32_t q; ///< the absolute value of the square of z } quat_p_extremal_maximal_order_t; +/** @brief Type for represent integer parameters + * + * @typedef quat_p_extremal_maximal_order_t + * + * @struct quat_p_extremal_maximal_order + * + */ +typedef struct quat_represent_integer_params +{ + int primality_test_iterations; ///< Primality test iterations + const quat_p_extremal_maximal_order_t *order; ///< The standard extremal maximal order + const quat_alg_t *algebra; ///< The quaternion algebra +} quat_represent_integer_params_t; + /*************************** Functions *****************************/ - /** @defgroup quat_c Constructors and Destructors * @{ -*/ + */ void quat_alg_init_set(quat_alg_t *alg, const ibz_t *p); void quat_alg_finalize(quat_alg_t *alg); void quat_alg_elem_init(quat_alg_elem_t *elem); void quat_alg_elem_finalize(quat_alg_elem_t *elem); -void quat_alg_coord_init(quat_alg_coord_t *coord); -void quat_alg_coord_finalize(quat_alg_coord_t *coord); +void ibz_vec_2_init(ibz_vec_2_t *vec); +void ibz_vec_2_finalize(ibz_vec_2_t *vec); void ibz_vec_4_init(ibz_vec_4_t *vec); void ibz_vec_4_finalize(ibz_vec_4_t *vec); -void ibz_vec_5_init(ibz_vec_5_t *vec); -void ibz_vec_5_finalize(ibz_vec_5_t *vec); - void ibz_mat_2x2_init(ibz_mat_2x2_t *mat); void ibz_mat_2x2_finalize(ibz_mat_2x2_t *mat); void ibz_mat_4x4_init(ibz_mat_4x4_t *mat); void ibz_mat_4x4_finalize(ibz_mat_4x4_t *mat); -void ibz_mat_4x5_init(ibz_mat_4x5_t *mat); -void ibz_mat_4x5_finalize(ibz_mat_4x5_t *mat); - -void ibz_mat_4x8_init(ibz_mat_4x8_t *mat); -void ibz_mat_4x8_finalize(ibz_mat_4x8_t *mat); - -/** @brief initiazlize matrix with arbitrary dimensions - */ -void ibz_mat_init(int rows, int cols, ibz_t mat[rows][cols]); -/** @brief finalize matrix with arbitrary dimensions - */ -void ibz_mat_finalize(int rows, int cols, ibz_t mat[rows][cols]); - void quat_lattice_init(quat_lattice_t *lat); void quat_lattice_finalize(quat_lattice_t *lat); -void quat_order_init(quat_order_t *order); -void quat_order_finalize(quat_order_t *order); - void quat_left_ideal_init(quat_left_ideal_t *lideal); void quat_left_ideal_finalize(quat_left_ideal_t *lideal); /** @} -*/ - + */ /** @defgroup quat_printers Print functions for types from the quaternion module * @{ -*/ + */ void ibz_mat_2x2_print(const ibz_mat_2x2_t *mat); void ibz_mat_4x4_print(const ibz_mat_4x4_t *mat); -void ibz_mat_4x5_print(const ibz_mat_4x5_t *mat); -void ibz_mat_4x8_print(const ibz_mat_4x8_t *mat); -void ibz_mat_print(int rows, int cols, const ibz_t mat[rows][cols]); void ibz_vec_2_print(const ibz_vec_2_t *vec); void ibz_vec_4_print(const ibz_vec_4_t *vec); -void ibz_vec_5_print(const ibz_vec_5_t *vec); - void quat_lattice_print(const quat_lattice_t *lat); void quat_alg_print(const quat_alg_t *alg); void quat_alg_elem_print(const quat_alg_elem_t *elem); -void quat_alg_coord_print(const quat_alg_coord_t *coord); -void quat_order_print(const quat_order_t *order); void quat_left_ideal_print(const quat_left_ideal_t *lideal); /** @} -*/ + */ /** @defgroup quat_int Integer functions for quaternion algebra * @{ -*/ + */ /** @defgroup quat_int_mat Integer matrix and vector functions * @{ -*/ - -/** @brief mat*vec in dimension 2 for integers - * - * @param res Output vector - * @param mat Input vector - * @param vec Input vector */ -void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec); -/** - * @brief a*b for 2x2 integer matrices modulo m +/** @brief Copy matrix * - * @param prod Output matrix - * @param mat_a Input matrix - * @param mat_b Input matrix - * @param m Integer modulo + * @param copy Output: Matrix into which copied will be copied + * @param copied */ -void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, const ibz_t *m); +void ibz_mat_2x2_copy(ibz_mat_2x2_t *copy, const ibz_mat_2x2_t *copied); /** * @brief Inverse of 2x2 integer matrices modulo m @@ -286,78 +231,95 @@ void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_ * @param m Integer modulo * @return 1 if inverse exists 0 otherwise */ -int ibz_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); +int ibz_mat_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); + +/** @brief mat*vec in dimension 2 for integers + * + * @param res Output vector + * @param mat Input vector + * @param vec Input vector + */ +void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec); + +/** @brief Copies all values from a 4x4 integer matrix to another one + * + * @param new Output: matrix which will have its entries set to mat's entries + * @param mat Input matrix + */ +void ibz_mat_4x4_copy(ibz_mat_4x4_t *new, + const ibz_mat_4x4_t *mat); // dim4, lattice, test/dim4, ideal + +/** @brief transpose a 4x4 integer matrix + * + * @param transposed Output: is set to the transposition of mat + * @param mat Input matrix + */ +void ibz_mat_4x4_transpose(ibz_mat_4x4_t *transposed, const ibz_mat_4x4_t *mat); + +/** @brief a*b for a,b integer 4x4 matrices + * + * Naive implementation + * + * @param res Output: A 4x4 integer matrix + * @param a + * @param b + */ +void ibz_mat_4x4_mul(ibz_mat_4x4_t *res, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b); + +/** @brief divides all values in matrix by same scalar + * + * @returns 1 if scalar divided all values in mat, 0 otherwise (division is performed in both cases) + * @param quot Output + * @param scalar + * @param mat + */ +int ibz_mat_4x4_scalar_div(ibz_mat_4x4_t *quot, const ibz_t *scalar, const ibz_mat_4x4_t *mat); /** * @brief mat*vec - * - * + * + * * @param res Output: coordinate vector * @param mat Integer 4x4 matrix * @param vec Integer vector (coordinate vector) * - * Multiplies 4x4 integer matrix mat by a 4-integers vector vec + * Multiplies 4x4 integer matrix mat by a 4-integers column vector vec */ -void ibz_mat_4x4_eval(ibz_vec_4_t *res, const ibz_mat_4x4_t *mat, const ibz_vec_4_t *vec); +void ibz_mat_4x4_eval(ibz_vec_4_t *res, const ibz_mat_4x4_t *mat, const ibz_vec_4_t *vec); /** - * @brief Computes modulo p the left kernel of mat where p is prime - * - * Algorithm used is the one at number 2.3.1 in Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 + * @brief vec*mat * - * @param ker Output: a vector in kernel which is not 0 modulo p if exists, otherwise 0 - * @param mat A 4×5 matrix - * @param p Integer modulo which the kernel computation is done, must be prime - * @return 1 if a unique such vector was found, 0 otherwise - * + * + * @param res Output: coordinate vector. + * @param vec Integer vector (coordinate vector) + * @param mat Integer 4x4 matrix + * + * Multiplies 4x4 integer matrix mat by a 4-integers row vector vec (on the left) */ -int ibz_4x5_right_ker_mod_prime(ibz_vec_5_t *ker, const ibz_mat_4x5_t *mat, const ibz_t *p); - -/** - * @brief Computes modulo p the left kernel of mat where p is prime - * - * Algorithm used is the one at number 2.3.1 in Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 - * - * @param ker Output: a vector in kernel which is not 0 modulo p if exists, otherwise 0 - * @param mat A 4×4 matrix - * @param p Integer modulo which the kernel computation is done, must be prime - * @return 1 if a unique such vector was found, 0 otherwise - * - */ -int ibz_4x4_right_ker_mod_prime(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, const ibz_t *p); - -/** - * @brief Computes the right kernel of mat modulo 2^exp - * - * @param ker Output: a vector in kernel which is not 0 modulo 2, if it exists, otherwise 0 - * @param mat A 4×4 matrix - * @param exp exponent defining the modulus - * @return 1 if a unique such vector was found, 0 otherwise - * - */ -int ibz_4x4_right_ker_mod_power_of_2(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, unsigned short exp); - -/** - * @brief content of a 4-vector of integers - * - * The content is the GCD of all entries. - * - * @param v A 4-vector of integers - * @param content Output: the resulting gcd - */ -static inline void ibz_content(ibz_t *content, const ibz_vec_4_t *v) { - ibz_gcd(content, &((*v)[0]), &((*v)[1])); - ibz_gcd(content, &((*v)[2]), content); - ibz_gcd(content, &((*v)[3]), content); -} +void ibz_mat_4x4_eval_t(ibz_vec_4_t *res, const ibz_vec_4_t *vec, const ibz_mat_4x4_t *mat); /** @} -*/ + */ - -/** @defgroup quat_integer Integer functions for quaternion algebra +/** @defgroup quat_integer Higher-level integer functions for quaternion algebra * @{ -*/ + */ + +/** + * @brief Generates a random prime + * + * A number is accepted as prime if it passes a 30-round Miller-Rabin test. + * This function is fairly inefficient and mostly meant for tests. + * + * @returns 1 if a prime is found, 0 otherwise + * @param p Output: The prime (if found) + * @param is3mod4 If 1, the prime is required to be 3 mod 4, if 0 no congruence condition is imposed + * @param bitsize Maximal size of output prime + * @param probability_test_iterations Miller-Rabin iteartions for probabilistic primality testing in + * rejection sampling + */ +int ibz_generate_random_prime(ibz_t *p, int is3mod4, int bitsize, int probability_test_iterations); /** * @brief Find integers x and y such that x^2 + n*y^2 = p @@ -370,211 +332,64 @@ static inline void ibz_content(ibz_t *content, const ibz_vec_4_t *v) { * @param p seond parameter defining the equation, must be prime * @return 1 if success, 0 otherwise */ -int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n , const ibz_t *p); - -/** - * @brief Solving cornacchia to find x² + n y³ = 2^exp_adjust * p in the special case of n=3 mod 4 - * - * This function sometimes fails to find a solution even if one exists and all parameters are as specified. - * - * @param x Output: an integer - * @param y Output: an integer - * @param n an integer - * @param p a prime integer - * @param exp_adjust an exponent, must be > 0 - * @returns 1 if success, 0 if failure to find a solution - */ -int ibz_cornacchia_special_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p, const int exp_adjust); - -/** - * @brief Find x and y such that x^2 + y^2 = n - * - * Uses "extended" version of Cornacchia's algorithm which also allows to solve x^2 + y^2 = n for some composite numbers. - * This uses a prime factor decomposition of n via trial division for primes in the list, computes solutions for n's prime factors - * and then uses complex multiplication. Since (x+iz)(x-iy) = x^2 + y^2, - * so a solution xp,yp for p and xq,yq for q give a solution for pq by computing (xp+iyp)*(xq+iyq). - * - * @param x Output - * @param y Output - * @param n parameter defining the equation. To get an output if one exists, only 1 of its prime factors can exceed the largest prime in prime_list - * @param prime_list list of consecutive primes starting from 2 - * @param prime_list_length number of elements of prime_list. Cans be smaller than that number, in which case only the beginning of the list is used. - * @param primality_test_iterations number of Miller-Rabin iterations to verify primality before trying to compute a square root of 1 modulo the remaining number once all small primes were factored out - * @param bad_primes_prod Assumed to be a product of small primes which are 3 mod 4. Used only to accelerate failure in case its gcd with n is not 1. Can be NULL - * @return 1 if success, 0 otherwise - */ -int ibz_cornacchia_extended(ibz_t *x, ibz_t *y, const ibz_t *n, const short *prime_list, const int prime_list_length, short primality_test_iterations, const ibz_t *bad_primes_prod); +int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p); /** @} -*/ - + */ /** @defgroup quat_qf Quadratic form functions * @{ -*/ + */ /** * @brief Quadratic form evaluation - * + * * qf and coord must be represented in the same basis. * * @param res Output: coordinate vector * @param qf Quadratic form (4x4 integer matrix) * @param coord Integer vector (coordinate vector) */ -void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const quat_alg_coord_t *coord); +void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const ibz_vec_4_t *coord); /** @} -*/ - -/** @defgroup quat_lat_2x2 Functions for lattices in dimension 2 - * @{ -*/ - -/** - * @brief Find a lattice vector close to a target vector satisfying extra conditions. - * - * Given a target vector `target` = (x₀,y₀), enumerate vectors `v` = (x,y) in lattice `lat` with distance - * (x₀ - x)² + `qf` (y₀ - y)² < 2^`dist_bound`. On each vector `condition(res, target - v, params)` is called: if it returns a - * non-zero value, processing stops and the same value is returned; if it returns 0 processing continues - * until `max_tries` vectors have been tried. - * - * The implementation will first reduce the basis by finding a short vector with algorithm 1.3.14 (Gauss) from Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993. - * Then a second one is added to this basis after reduction by projection on the first one. - * A close vector is found using 2 projection as in https://cims.nyu.edu/~regev/teaching/lattices_fall_2004/ln/cvp.pdf (15.5.2023,16h15CEST) using the already reduced matrix - * Finally, short vectors are enumerated below an enumeration bound set to (2 ^ dist_bound - (distance of target to close vector)). - * Each short vector is added to the close vector, and then the distance to the target is measured. If it is below 2^dist_bound, it is tested for condition. - * If coundition returns 1, the algorithm terminates and returns 1, otherwise it returns 0 when max_tries vectors have been tried - * - * The enumeration bound is an heuristic to avoid starting the search with vectors which will be too far from the target, since enumeration starts at the largest vectors. - * It can in some cases lead to failures even though solutions do exist, an in other cases be insufficient to get a valid result in reasonable time. - * - * Enumeration uses algorithm 2.7.5 (Fincke-Pohst) from Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 - * Slightly adapted to work without rational numbers and their square roots - * Therefore needing a test to make sure the bounds are respected, which is integrated in quat_dim2_lattice_bound_and_condition - * - * @param res Output: quaternion element returned by `condition` - * @param lat_basis basis of an integral 2-dimensional lattice - * @param target target vector for CVP - * @param qf Small integer defining a quadratic form x² + qf y² - * @param dist_bound Log of the maximum distance between `target` and the enumerated vectors - * @param condition Filter the vectors of `lat` by passing them to `condition`. When it returns a non-zero value, the result is put into `res` and the processing stops. - * @param params Extra parameters passed to `condition`. May be NULL. - * @param max_tries Try at most `max_tries` vectors close to `target` - * @return 1 if an element was found, 0 otherwise */ -int quat_2x2_lattice_enumerate_cvp_filter(quat_alg_elem_t *res, - const ibz_mat_2x2_t *lat_basis, const ibz_vec_2_t *target, - unsigned int qf, unsigned int dist_bound, - int (*condition)(quat_alg_elem_t* , const ibz_vec_2_t*, const void*), const void* params, - unsigned int max_tries); /** @} -*/ -/** @} -*/ + */ /** @defgroup quat_quat_f Quaternion algebra functions * @{ -*/ -void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); -void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); + */ +/** + * @brief Copies an algebra element + * + * @param copy Output: The element into which another one is copied + * @param copied Source element copied into copy + */ +void quat_alg_elem_copy(quat_alg_elem_t *copy, const quat_alg_elem_t *copied); + void quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const quat_alg_t *alg); /** @brief reduced norm of alg_elem x - * - * @param res Output: rational which will contain the reduced norm of a + * + * @param res_num Output: rational which will contain the numerator of the reduced norm of a + * @param res_denom Output: rational which will contain the denominator of the reduced norm of a (it + * is 1 if the norm is integer) * @param x Algebra element whose norm is computed * @param alg The quaternion algebra -*/ -void quat_alg_norm(ibq_t *res, const quat_alg_elem_t *x, const quat_alg_t *alg); - -/** @brief reduced trace of alg_elem x - * - * @param res Output: rational which will contain the reduced trace of a - * @param x Algebra element whose trace will be computed -*/ -void quat_alg_trace(ibq_t *res, const quat_alg_elem_t *x); - + */ +void quat_alg_norm(ibz_t *res_num, ibz_t *res_denom, const quat_alg_elem_t *x, const quat_alg_t *alg); /** @brief Normalize representation of alg_elem x - * + * * @param x Algebra element whose representation will be normalized - * + * * Modification of x. * Sets coord and denom of x so that gcd(denom, content(coord))=1 * without changing the value of x = (coord0/denom, coord1/denom, coord2/denom, coord3/denom). -*/ + */ void quat_alg_normalize(quat_alg_elem_t *x); -/** @brief Test if x is 0 - * - * @returns 1 if x=0, 0 otherwise - * - * x is 0 iff all coordinates in x->coord are 0 -*/ -int quat_alg_elem_is_zero(const quat_alg_elem_t *x); - -/** @brief Test if x is 0 - * - * @returns 1 if x=0, 0 otherwise - * - * x is 0 iff all coordinates in x are 0 -*/ -int quat_alg_coord_is_zero(const quat_alg_coord_t *x); - - -// end quat_quat_f -/** @} -*/ - -/** @defgroup quat_lat_f Lattice functions - * @{ -*/ - -void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); -void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); -void quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg); - -/** - * @brief Modifies a lattice to put it in hermite normal form - * - * In-place modification of the lattice. - * - * @param lat input lattice - * - * On a correct lattice this function changes nothing (since it is already in HNF), but it can be used to put a handmade one in correct form in order to use the other lattice functions. - */ -void quat_lattice_hnf(quat_lattice_t *lat); - -/** - * @brief Test whether x ∈ lat. If so, compute its coordinates in lat's basis. - * - * @param coord Output: Set to the coordinates of x in lat. May be NULL. - * @param lat The lattice - * @param x An element of the quaternion algebra - * @param alg The quaternion algebra - * @return true if x ∈ lat - */ -int quat_lattice_contains(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x, const quat_alg_t *alg); - - -/********************************* Functions from ideal.c ************************************/ - -/** @addtogroup quat_quat_f - * @{ -*/ - -/** - * @brief Creates algebra element from scalar - * - * Resulting element has 1-coordinate equal to numerator/denominator - * - * @param elem Output: algebra element with numerator/denominator as first coordiante (1-coordinate), 0 elsewhere (i,j,ij coordinates) - * @param numerator - * @param denominator Assumed non zero - */ -void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator); - /** * @brief Standard involution in a quaternion algebra * @@ -592,116 +407,111 @@ void quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x); * * @param primitive_x Output: coordinates of a primitive element of `order` (in `order`'s basis) * @param content Output: content of `x`'s coordinate vector in order's basis - * @param alg the quaternion algebra * @param order order of `alg` * @param x element of order, must be in `order` */ -static inline void quat_alg_make_primitive(quat_alg_coord_t *primitive_x, ibz_t *content, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg) { - int ok = quat_lattice_contains(primitive_x, order, x, alg); - assert(ok); - ibz_content(content, primitive_x); - ibz_t r; - ibz_init(&r); - for(int i = 0; i < 4; i++) { - ibz_div(*primitive_x + i, &r, *primitive_x + i, content); - } - ibz_finalize(&r); -} +void quat_alg_make_primitive(ibz_vec_4_t *primitive_x, + ibz_t *content, + const quat_alg_elem_t *x, + const quat_lattice_t *order); + +// end quat_quat_f +/** @} + */ + +/** @defgroup quat_lat_f Lattice functions + * @{ + */ + +void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); /** - * @brief Tests if x ∈ order is primitive + * @brief Test whether x ∈ lat. If so, compute its coordinates in lat's basis. * - * @param alg quaternion algebra - * @param order quaternion order - * @param x element of the order (fails if x ∉ order) - * - * @returns 1 if x is primitive, 0 otherwise + * @param coord Output: Set to the coordinates of x in lat. May be NULL. + * @param lat The lattice, not necessarily in HNF but full rank + * @param x An element of the quaternion algebra + * @return true if x ∈ lat */ -static inline int quat_alg_is_primitive(const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg) { - quat_alg_coord_t coord; - ibz_t cnt; - quat_alg_coord_init(&coord); - ibz_init(&cnt); +int quat_lattice_contains(ibz_vec_4_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x); - quat_alg_make_primitive(&coord,&cnt,x,order,alg); - int ok = ibz_is_one(&cnt); +/** + * @brief Conjugate of a lattice with basis not in HNF + * + * @param conj Output: The lattice conjugate to lat. ATTENTION: is not under HNF + * @param lat Input lattice + */ +void quat_lattice_conjugate_without_hnf(quat_lattice_t *conj, const quat_lattice_t *lat); - ibz_finalize(&cnt); - quat_alg_coord_finalize(&coord); - return ok; -} +/** + * @brief Multiply a lattice and an algebra element + * + * The element is multiplied to the right of the lattice + * + * @param prod Output: Lattice lat*elem + * @param lat Input lattice + * @param elem Algebra element + * @param alg The quaternion algebra + */ +void quat_lattice_alg_elem_mul(quat_lattice_t *prod, + const quat_lattice_t *lat, + const quat_alg_elem_t *elem, + const quat_alg_t *alg); // ideal -//end quat_quat_f +/** + * @brief Sample from the intersection of a lattice with a ball + * + * Sample a uniform non-zero vector of norm ≤ `radius` from the lattice. + * + * @param res Output: sampled quaternion from the lattice + * @param lattice Input lattice + * @param alg The quaternion algebra + * @param radius The ball radius (quaternion norm) + * @return 0 if an error occurred (ball too small or RNG error), 1 otherwise + */ +int quat_lattice_sample_from_ball(quat_alg_elem_t *res, + const quat_lattice_t *lattice, + const quat_alg_t *alg, + const ibz_t *radius); + +// end quat_lat_f /** @} -*/ + */ /** @defgroup quat_lideal_f Functions for left ideals * @{ -*/ + */ /** @defgroup quat_lideal_c Creating left ideals * @{ -*/ + */ /** - * @brief Left principal ideal of order, generated by x + * @brief Left ideal of order, generated by x and N as order*x+order*N * * @param lideal Output: left ideal - * @param alg quaternion algebra + * @param alg quaternion algebra * @param order maximal order of alg whose left ideal is searched - * @param x generating element - * - * Creates the left ideal in 'order' generated by the element 'x' - */ -void quat_lideal_create_principal(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg); - -/** - * @brief Left ideal of order, generated by primitive x and N - * - * @param lideal Output: left ideal - * @param alg quaternion algebra - * @param order maximal order of alg whose left ideal is searched - * @param x generating element, must be a primitive element of order + * @param x generating element. Must be non-zero * @param N generating integer - * - * Creates the left ideal in order generated by the element x and the integer N - * - */ -void quat_lideal_create_from_primitive(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg); - -/** - * @brief Make x primitive, remove content from N, then generate ideal * - * @param lideal Output: left ideal - * @param alg quaternion algebra - * @param order maximal order of alg whose left ideal is searched - * @param x generating element, a primitive element of order obtained from it will be used for generation - * @param N generating integer - * - * Given `x` = n·y ∈ order` with `y` primitive, given an integer `N`, create the ideal - * generated by `y` and `N / gcd(n, N)`. - * - */ -void quat_lideal_make_primitive_then_create(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg); - -/** - * @brief Random left ideal of norm 2^e + * Creates the left ideal in order generated by the element x and the integer N. + * If x is not divisible (inside the order) by any integer divisor n>1 of N, + * then the norm of the output ideal is N. * - * @param lideal Output: random left ideal (of parents alg and order) with norm 2^e - * @param alg parent algebra for which an ideal is chosen. Is a quaterion algebra - * @param order parent order for which an ideal is chosen. Must be maximal - * @param e int64_t determining the norm of the resulting ideal - * @param n Parameter controlling the amount of randomness used by the algorithm - * @return 0 if PRNG failed, 1 otherwise. */ -int quat_lideal_random_2e(quat_left_ideal_t *lideal, const quat_order_t *order, const quat_alg_t *alg, int64_t e, unsigned char n); +void quat_lideal_create(quat_left_ideal_t *lideal, + const quat_alg_elem_t *x, + const ibz_t *N, + const quat_lattice_t *order, + const quat_alg_t *alg); /** @} -*/ + */ /** @defgroup quat_lideal_gen Generators of left ideals * @{ -*/ + */ /** * @brief Generator of 'lideal' @@ -710,66 +520,41 @@ int quat_lideal_random_2e(quat_left_ideal_t *lideal, const quat_order_t *order, * @param gen Output: non scalar generator of lideal * @param lideal left ideal * @param alg the quaternion algebra - * @param bound Bound used for enumeration of elements. Must be non-negative. If 0, a default value is used. - * - * Ideal is generated by gen and the ideal's norm - * - * Bound has as default value QUATERNION_lideal_generator_search_bound - */ -int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *alg, int bound); - -/** - * @brief Primitive generator of a left ideal of norm coprime to a given integer * - * @returns 1 if such a generator was found, 0 otherwise - * @param gen Output: generator of lideal, coprime to n - * @param lideal left ideal - * @param n value to which the generator norm should be coprime. (assumes gcd(n, norm(lideal)) = 1). If this is not fulfilled, the returned element is a generator such that gcd(n^2,norm(gen)) = gcd(n,norm(lideal)) - * @param alg the quaternion algebra - * @param bound Bound used for enumeration of elements. Must be non-negative. If 0, a default value 0 is used. - * - * Finds a primitive generator of 'lideal' of norm coprime with n (assumes gcd(n, norm(lideal)) = 1) - * - * gen is such that lideal is generated by gen and the ideal's norm - * + * Ideal is generated by gen and the ideal's norm + * * Bound has as default value QUATERNION_lideal_generator_search_bound */ -int quat_lideal_generator_coprime(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const ibz_t *n, const quat_alg_t *alg, int bound); - +int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *alg); /** @} -*/ + */ /** @defgroup quat_lideal_op Operations on left ideals * @{ -*/ + */ /** - * @brief Left ideal product of left ideal I and element alpha + * @brief Copies an ideal * - * @returns 1 if a product could be computed, 0 otherwise (in the later case, one might retry with a higher bound) - * @param product Output: lideal I*alpha, must have integer norm - * @param lideal left ideal - * @param alpha element multiplied to lideal to get the product ideal - * @param alg the quaternion algebra - * @param bound used for internal ideal_generator search. Must be positive. Setting it to 0 uses the default value. - * - * I*alpha where I is a left-ideal and alpha an element of the algebra - * - * The resulting ideal must have an integer norm - * - * Bound has as default value QUATERNION_lideal_generator_search_bound + * @param copy Output: The ideal into which another one is copied + * @param copied Source ideal copied into copy. The parent order is not copied (only the pointer). */ -int quat_lideal_mul(quat_left_ideal_t *product, const quat_left_ideal_t *lideal, const quat_alg_elem_t *alpha, const quat_alg_t *alg, int bound); +void quat_lideal_copy(quat_left_ideal_t *copy, const quat_left_ideal_t *copied); /** - * @brief Sum of two left ideals + * @brief Conjugate of a left ideal (not in HNF) * - * @param sum Output: Left ideal which is the sum of the 2 inputs - * @param lideal1 left ideal - * @param lideal2 left ideal + * @param conj Output: Ideal conjugate to lideal, with norm and parent order correctly set, but its + * lattice not in HNF + * @param new_parent_order Output: Will be set to the right order of lideal, and serve as parent + * order for conj (so must have at least the lifetime of conj) + * @param lideal input left ideal (of which conj will be the conjugate) * @param alg the quaternion algebra */ -void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *lideal1, const quat_left_ideal_t *lideal2, const quat_alg_t *alg); +void quat_lideal_conjugate_without_hnf(quat_left_ideal_t *conj, + quat_lattice_t *new_parent_order, + const quat_left_ideal_t *lideal, + const quat_alg_t *alg); /** * @brief Intersection of two left ideals @@ -779,98 +564,145 @@ void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *lideal1, c * @param lideal2 left ideal * @param alg the quaternion algebra */ -void quat_lideal_inter(quat_left_ideal_t *intersection, const quat_left_ideal_t *lideal1, const quat_left_ideal_t *lideal2, const quat_alg_t *alg); +void quat_lideal_inter(quat_left_ideal_t *intersection, + const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg); /** - * @brief Equality test for left ideals + * @brief L2-reduce the basis of the left ideal, without considering its denominator * - * @returns 1 if both left ideals are equal, 0 otherwise - * @param lideal1 left ideal - * @param lideal2 left ideal + * This function reduce the basis of the lattice of the ideal, but it does completely ignore its + * denominator. So the outputs of this function must still e divided by the appropriate power of + * lideal.lattice.denom. + * + * Implements the L2 Algorithm of Nguyen-Stehlé, also known as fplll: + * https://iacr.org/archive/eurocrypt2005/34940217/34940217.pdf + * + * Parameters are in lll/lll_internals.h + * + * @param reduced Output: Lattice defining the ideal, which has its basis in a lll-reduced form. + * Must be divided by lideal.lattice.denom before usage + * @param gram Output: Matrix of the quadratic form given by the norm on the basis of the reduced + * ideal, divided by the norm of the ideal + * @param lideal ideal whose basis will be reduced * @param alg the quaternion algebra */ -int quat_lideal_equals(const quat_left_ideal_t *lideal1, const quat_left_ideal_t *lideal2, const quat_alg_t *alg); +void quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, + ibz_mat_4x4_t *gram, + const quat_left_ideal_t *lideal, + const quat_alg_t *alg); // replaces lideal_lll /** - * @brief Element representing an isomorphism between I1 and I2 + * @brief Multplies two ideals and L2-reduces the lattice of the result * - * @returns 1 if isomorphic, 0 otherwise - * @param iso Output: algebra element such that I1*iso = I2. - * @param lideal1 left ideal - * @param lideal2 left ideal - * @param alg the quaternion algebra - * - * If I1 and I2 are isomorphic, set `iso` to an element of `alg` such that I1*iso = I2, - * and return 1. Otherwise return 0. + * Implements the L2 Algorithm of Nguyen-Stehlé, also known as fplll: + * https://iacr.org/archive/eurocrypt2005/34940217/34940217.pdf * - * I1 and I2 must have the same parent order (where "same" means they - * point to the same object), in order to be considered isomorphic. + * Parameters are in lll/lll_internals.h + * + * @param prod Output: The product ideal with its lattice basis being L2-reduced + * @param gram Output: Gram matrix of the reduced norm (as quadratic but not bilinear form) on the + * basis of prod, divided by the norm of prod + * @param lideal1 Ideal at left in the product + * @param lideal2 Ideal at right in the product + * @param alg The quaternion algebra */ -int quat_lideal_isom(quat_alg_elem_t *iso, const quat_left_ideal_t *lideal1, const quat_left_ideal_t *lideal2, const quat_alg_t *alg); +void quat_lideal_lideal_mul_reduced(quat_left_ideal_t *prod, + ibz_mat_4x4_t *gram, + const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg); /** - * @brief Right order of a left ideal + * @brief Replaces an ideal by a smaller equivalent one of prime norm * - * @param order Output: right order of the given ideal - * @param lideal left ideal - * @param alg the quaternion algebra + * @returns 1 if the computation succeeded and 0 otherwise + * @param lideal In- and Output: Ideal to be replaced + * @param alg The quaternion algebra + * @param primality_num_iter number of repetition for primality testing + * @param equiv_bound_coeff bound on the coefficients for the candidates */ -void quat_lideal_right_order(quat_order_t *order, const quat_left_ideal_t *lideal, const quat_alg_t *alg); - - -/** - * @brief LLL-reduce the basis of the left ideal, without considering its denominator - * - * This function reduce the basis of the lattice of the ideal, but it does completely ignore its denominator. - * So the outputs of this function must still e divided by the appropriate power of lideal.lattice.denom. - * - * @param reduced Output: Lattice defining the ideal, which has its basis in a lll-reduced form. Must be divided by lideal.lattice.denom before usage - * @param gram Output: gram matrix of the reduced basis. Must be divided by (lideal.lattice.denom)^2 before usage - * @param lideal Ideal whose basis will be reduced - * @param alg the quaternion algebra - */ -void quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, ibz_mat_4x4_t *gram, const quat_left_ideal_t *lideal, const quat_alg_t *alg); //replaces lideal_lll +int quat_lideal_prime_norm_reduced_equivalent(quat_left_ideal_t *lideal, + const quat_alg_t *alg, + const int primality_num_iter, + const int equiv_bound_coeff); /** @} -*/ + */ // end quat_lideal_f /** @} -*/ + */ - - -/***************************** Functions from quaternion_tools.c ***************************************/ - -/** @defgroup quat_order_op Operations on orders +/** @defgroup quat_normeq Functions specific to special extremal maximal orders * @{ -*/ + */ /** - * @brief Connecting ideal of 2 orders in the same algebra + * @brief Representing an integer by the quadratic norm form of a maximal extremal order * - * @param connecting_ideal Output: ideal which is a right ideal of O1 and a left ideal of O2 - * @param alg quaternion algebra - * @param order1 maximal order left of the searched ideal - * @param order2 order right of the searched ideal + * @returns 1 if the computation succeeded + * @param gamma Output: a quaternion element + * @param n_gamma Target norm of gamma. n_gamma must be odd. If n_gamma/(p*params.order->q) < + * 2^QUAT_repres_bound_input failure is likely + * @param non_diag If set to 1 (instead of 0) and the order is O0, an additional property is ensured + * @param params Represent integer parameters specifying the algebra, the special extremal order, + * the number of trials for finding gamma and the number of iterations of the primality test. + * Special requirements apply if non-diag is set to 1 + * + * This algorithm finds a primitive quaternion element gamma of n_gamma inside any maximal extremal + * order. Failure is possible. Most efficient for the standard order. + * + * If non-diag is set to 1,this algorithm finds a primitive quaternion element gamma with some + * special properties used in fixed degree isogeny of n_gamma inside any maximal extremal order such + * that params->order->q=1 mod 4. Failure is possible. Most efficient for the standard order. The + * most important property is to avoid diagonal isogenies, meaning that the gamma returned by the + * algorithm must not be contained inside ZZ + 2 O where O is the maximal order params->order When O + * is the special order O0 corresponding to j=1728, we further need to avoid endomorphisms of E0xE0 + * and there is another requirement + * + * If non-diag is set to 1, the number of trials for finding gamma (in params), the number of + * iterations of the primality test and the value of params->order->q is required to be 1 mod 4 */ -void quat_connecting_ideal(quat_left_ideal_t *connecting_ideal, const quat_order_t *order1, const quat_order_t *order2, const quat_alg_t *alg); +int quat_represent_integer(quat_alg_elem_t *gamma, + const ibz_t *n_gamma, + int non_diag, + const quat_represent_integer_params_t *params); + +/** @brief Basis change to (1,i,(i+j)/2,(1+ij)/2) for elements of O0 + * + * Change the basis in which an element is give from 1,i,j,ij to (1,i,(i+j)/2,(1+ij)/2) the ususal + * basis of the special maximal order O0 Only for elements of O0 + * + * @param vec Output: Coordinates of el in basis (1,i,(i+j)/2,(1+ij)/2) + * @param el Imput: An algebra element in O0 + */ +void quat_change_to_O0_basis(ibz_vec_4_t *vec, const quat_alg_elem_t *el); /** - * @brief LLL reduction on 4-dimensional lattice, coefficient is 0.99 + * @brief Random O0-ideal of given norm * - * @param red Output: LLL reduced basis - * @param lattice lattice with 4-dimensional basis - * @param q parameter q for non-standard basis - * @param precision floating-point precision for LLL algorithm, if 0 is provided a default precision is taken + * Much faster if norm is prime and is_prime is set to 1 + * + * @param lideal Output: O0-ideal of norm norm + * @param norm Norm of the ideal to be found + * @param is_prime Indicates if norm is prime: 1 if it is, 0 otherwise + * @param params Represent Integer parameters from the level-dependent constants + * @param prime_cofactor Prime distinct from the prime p defining the algebra but of similar size + * and coprime to norm. If is_prime is 1, it might be NULL. + * @returns 1 if success, 0 if no ideal found or randomness failed */ -int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const ibz_t *q, int precision); - +int quat_sampling_random_ideal_O0_given_norm(quat_left_ideal_t *lideal, + const ibz_t *norm, + int is_prime, + const quat_represent_integer_params_t *params, + const ibz_t *prime_cofactor); +// end quat_normeq /** @} -*/ - + */ // end quat_quat /** @} -*/ + */ #endif diff --git a/src/quaternion/ref/generic/intbig.c b/src/quaternion/ref/generic/intbig.c new file mode 100644 index 0000000..b0462dc --- /dev/null +++ b/src/quaternion/ref/generic/intbig.c @@ -0,0 +1,791 @@ +#include "intbig_internal.h" +#include +#include +#include +#include +#include +#include + +// #define DEBUG_VERBOSE + +#ifdef DEBUG_VERBOSE +#define DEBUG_STR_PRINTF(x) printf("%s\n", (x)); + +static void +DEBUG_STR_FUN_INT_MP(const char *op, int arg1, const ibz_t *arg2) +{ + int arg2_size = ibz_size_in_base(arg2, 16); + char arg2_str[arg2_size + 2]; + ibz_convert_to_str(arg2, arg2_str, 16); + + printf("%s,%x,%s\n", op, arg1, arg2_str); +} + +static void +DEBUG_STR_FUN_3(const char *op, const ibz_t *arg1, const ibz_t *arg2, const ibz_t *arg3) +{ + int arg1_size = ibz_size_in_base(arg1, 16); + char arg1_str[arg1_size + 2]; + ibz_convert_to_str(arg1, arg1_str, 16); + + int arg2_size = ibz_size_in_base(arg2, 16); + char arg2_str[arg2_size + 2]; + ibz_convert_to_str(arg2, arg2_str, 16); + + int arg3_size = ibz_size_in_base(arg3, 16); + char arg3_str[arg3_size + 2]; + ibz_convert_to_str(arg3, arg3_str, 16); + + printf("%s,%s,%s,%s\n", op, arg1_str, arg2_str, arg3_str); +} + +static void +DEBUG_STR_FUN_MP2_INT(const char *op, const ibz_t *arg1, const ibz_t *arg2, int arg3) +{ + int arg1_size = ibz_size_in_base(arg1, 16); + char arg1_str[arg1_size + 2]; + ibz_convert_to_str(arg1, arg1_str, 16); + + int arg2_size = ibz_size_in_base(arg2, 16); + char arg2_str[arg2_size + 2]; + ibz_convert_to_str(arg2, arg2_str, 16); + + printf("%s,%s,%s,%x\n", op, arg1_str, arg2_str, arg3); +} + +static void +DEBUG_STR_FUN_INT_MP2(const char *op, int arg1, const ibz_t *arg2, const ibz_t *arg3) +{ + int arg2_size = ibz_size_in_base(arg2, 16); + char arg2_str[arg2_size + 2]; + ibz_convert_to_str(arg2, arg2_str, 16); + + int arg3_size = ibz_size_in_base(arg3, 16); + char arg3_str[arg3_size + 2]; + ibz_convert_to_str(arg3, arg3_str, 16); + + if (arg1 >= 0) + printf("%s,%x,%s,%s\n", op, arg1, arg2_str, arg3_str); + else + printf("%s,-%x,%s,%s\n", op, -arg1, arg2_str, arg3_str); +} + +static void +DEBUG_STR_FUN_INT_MP_INT(const char *op, int arg1, const ibz_t *arg2, int arg3) +{ + int arg2_size = ibz_size_in_base(arg2, 16); + char arg2_str[arg2_size + 2]; + ibz_convert_to_str(arg2, arg2_str, 16); + + printf("%s,%x,%s,%x\n", op, arg1, arg2_str, arg3); +} + +static void +DEBUG_STR_FUN_4(const char *op, const ibz_t *arg1, const ibz_t *arg2, const ibz_t *arg3, const ibz_t *arg4) +{ + int arg1_size = ibz_size_in_base(arg1, 16); + char arg1_str[arg1_size + 2]; + ibz_convert_to_str(arg1, arg1_str, 16); + + int arg2_size = ibz_size_in_base(arg2, 16); + char arg2_str[arg2_size + 2]; + ibz_convert_to_str(arg2, arg2_str, 16); + + int arg3_size = ibz_size_in_base(arg3, 16); + char arg3_str[arg3_size + 2]; + ibz_convert_to_str(arg3, arg3_str, 16); + + int arg4_size = ibz_size_in_base(arg4, 16); + char arg4_str[arg4_size + 2]; + ibz_convert_to_str(arg4, arg4_str, 16); + + printf("%s,%s,%s,%s,%s\n", op, arg1_str, arg2_str, arg3_str, arg4_str); +} +#else +#define DEBUG_STR_PRINTF(x) +#define DEBUG_STR_FUN_INT_MP(op, arg1, arg2) +#define DEBUG_STR_FUN_3(op, arg1, arg2, arg3) +#define DEBUG_STR_FUN_INT_MP2(op, arg1, arg2, arg3) +#define DEBUG_STR_FUN_INT_MP_INT(op, arg1, arg2, arg3) +#define DEBUG_STR_FUN_4(op, arg1, arg2, arg3, arg4) +#endif + +/** @defgroup ibz_t Constants + * @{ + */ + +const __mpz_struct ibz_const_zero[1] = { + { + ._mp_alloc = 0, + ._mp_size = 0, + ._mp_d = (mp_limb_t[]){ 0 }, + } +}; + +const __mpz_struct ibz_const_one[1] = { + { + ._mp_alloc = 0, + ._mp_size = 1, + ._mp_d = (mp_limb_t[]){ 1 }, + } +}; + +const __mpz_struct ibz_const_two[1] = { + { + ._mp_alloc = 0, + ._mp_size = 1, + ._mp_d = (mp_limb_t[]){ 2 }, + } +}; + +const __mpz_struct ibz_const_three[1] = { + { + ._mp_alloc = 0, + ._mp_size = 1, + ._mp_d = (mp_limb_t[]){ 3 }, + } +}; + +void +ibz_init(ibz_t *x) +{ + mpz_init(*x); +} + +void +ibz_finalize(ibz_t *x) +{ + mpz_clear(*x); +} + +void +ibz_add(ibz_t *sum, const ibz_t *a, const ibz_t *b) +{ +#ifdef DEBUG_VERBOSE + ibz_t a_cp, b_cp; + ibz_init(&a_cp); + ibz_init(&b_cp); + ibz_copy(&a_cp, a); + ibz_copy(&b_cp, b); +#endif + mpz_add(*sum, *a, *b); +#ifdef DEBUG_VERBOSE + DEBUG_STR_FUN_3("ibz_add", sum, &a_cp, &b_cp); + ibz_finalize(&a_cp); + ibz_finalize(&b_cp); +#endif +} + +void +ibz_sub(ibz_t *diff, const ibz_t *a, const ibz_t *b) +{ +#ifdef DEBUG_VERBOSE + ibz_t a_cp, b_cp; + ibz_init(&a_cp); + ibz_init(&b_cp); + ibz_copy(&a_cp, a); + ibz_copy(&b_cp, b); +#endif + mpz_sub(*diff, *a, *b); + +#ifdef DEBUG_VERBOSE + DEBUG_STR_FUN_3("ibz_sub", diff, &a_cp, &b_cp); + ibz_finalize(&a_cp); + ibz_finalize(&b_cp); +#endif +} + +void +ibz_mul(ibz_t *prod, const ibz_t *a, const ibz_t *b) +{ +#ifdef DEBUG_VERBOSE + ibz_t a_cp, b_cp; + ibz_init(&a_cp); + ibz_init(&b_cp); + ibz_copy(&a_cp, a); + ibz_copy(&b_cp, b); +#endif + mpz_mul(*prod, *a, *b); +#ifdef DEBUG_VERBOSE + DEBUG_STR_FUN_3("ibz_mul", prod, &a_cp, &b_cp); + ibz_finalize(&a_cp); + ibz_finalize(&b_cp); +#endif +} + +void +ibz_neg(ibz_t *neg, const ibz_t *a) +{ + mpz_neg(*neg, *a); +} + +void +ibz_abs(ibz_t *abs, const ibz_t *a) +{ + mpz_abs(*abs, *a); +} + +void +ibz_div(ibz_t *quotient, ibz_t *remainder, const ibz_t *a, const ibz_t *b) +{ +#ifdef DEBUG_VERBOSE + ibz_t a_cp, b_cp; + ibz_init(&a_cp); + ibz_init(&b_cp); + ibz_copy(&a_cp, a); + ibz_copy(&b_cp, b); +#endif + mpz_tdiv_qr(*quotient, *remainder, *a, *b); +#ifdef DEBUG_VERBOSE + DEBUG_STR_FUN_4("ibz_div", quotient, remainder, &a_cp, &b_cp); + ibz_finalize(&a_cp); + ibz_finalize(&b_cp); +#endif +} + +void +ibz_div_2exp(ibz_t *quotient, const ibz_t *a, uint32_t exp) +{ +#ifdef DEBUG_VERBOSE + ibz_t a_cp; + ibz_init(&a_cp); + ibz_copy(&a_cp, a); +#endif + mpz_tdiv_q_2exp(*quotient, *a, exp); +#ifdef DEBUG_VERBOSE + DEBUG_STR_FUN_MP2_INT("ibz_div_2exp,%Zx,%Zx,%x\n", quotient, &a_cp, exp); + ibz_finalize(&a_cp); +#endif +} + +void +ibz_div_floor(ibz_t *q, ibz_t *r, const ibz_t *n, const ibz_t *d) +{ + mpz_fdiv_qr(*q, *r, *n, *d); +} + +void +ibz_mod(ibz_t *r, const ibz_t *a, const ibz_t *b) +{ + mpz_mod(*r, *a, *b); +} + +unsigned long int +ibz_mod_ui(const mpz_t *n, unsigned long int d) +{ + return mpz_fdiv_ui(*n, d); +} + +int +ibz_divides(const ibz_t *a, const ibz_t *b) +{ + return mpz_divisible_p(*a, *b); +} + +void +ibz_pow(ibz_t *pow, const ibz_t *x, uint32_t e) +{ + mpz_pow_ui(*pow, *x, e); +} + +void +ibz_pow_mod(ibz_t *pow, const ibz_t *x, const ibz_t *e, const ibz_t *m) +{ + mpz_powm(*pow, *x, *e, *m); + DEBUG_STR_FUN_4("ibz_pow_mod", pow, x, e, m); +} + +int +ibz_two_adic(ibz_t *pow) +{ + return mpz_scan1(*pow, 0); +} + +int +ibz_cmp(const ibz_t *a, const ibz_t *b) +{ + int ret = mpz_cmp(*a, *b); + DEBUG_STR_FUN_INT_MP2("ibz_cmp", ret, a, b); + return ret; +} + +int +ibz_is_zero(const ibz_t *x) +{ + int ret = !mpz_cmp_ui(*x, 0); + DEBUG_STR_FUN_INT_MP("ibz_is_zero", ret, x); + return ret; +} + +int +ibz_is_one(const ibz_t *x) +{ + int ret = !mpz_cmp_ui(*x, 1); + DEBUG_STR_FUN_INT_MP("ibz_is_one", ret, x); + return ret; +} + +int +ibz_cmp_int32(const ibz_t *x, int32_t y) +{ + int ret = mpz_cmp_si(*x, (signed long int)y); + DEBUG_STR_FUN_INT_MP_INT("ibz_cmp_int32", ret, x, y); + return ret; +} + +int +ibz_is_even(const ibz_t *x) +{ + int ret = !mpz_tstbit(*x, 0); + DEBUG_STR_FUN_INT_MP("ibz_is_even", ret, x); + return ret; +} + +int +ibz_is_odd(const ibz_t *x) +{ + int ret = mpz_tstbit(*x, 0); + DEBUG_STR_FUN_INT_MP("ibz_is_odd", ret, x); + return ret; +} + +void +ibz_set(ibz_t *i, int32_t x) +{ + mpz_set_si(*i, x); +} + +int +ibz_convert_to_str(const ibz_t *i, char *str, int base) +{ + if (!str || (base != 10 && base != 16)) + return 0; + + mpz_get_str(str, base, *i); + + return 1; +} + +void +ibz_print(const ibz_t *num, int base) +{ + assert(base == 10 || base == 16); + + int num_size = ibz_size_in_base(num, base); + char num_str[num_size + 2]; + ibz_convert_to_str(num, num_str, base); + printf("%s", num_str); +} + +int +ibz_set_from_str(ibz_t *i, const char *str, int base) +{ + return (1 + mpz_set_str(*i, str, base)); +} + +void +ibz_copy(ibz_t *target, const ibz_t *value) +{ + mpz_set(*target, *value); +} + +void +ibz_swap(ibz_t *a, ibz_t *b) +{ + mpz_swap(*a, *b); +} + +int32_t +ibz_get(const ibz_t *i) +{ +#if LONG_MAX == INT32_MAX + return (int32_t)mpz_get_si(*i); +#elif LONG_MAX > INT32_MAX + // Extracts the sign bit and the 31 least significant bits + signed long int t = mpz_get_si(*i); + return (int32_t)((t >> (sizeof(signed long int) * 8 - 32)) & INT32_C(0x80000000)) | (t & INT32_C(0x7FFFFFFF)); +#else +#error Unsupported configuration: LONG_MAX must be >= INT32_MAX +#endif +} + +int +ibz_rand_interval(ibz_t *rand, const ibz_t *a, const ibz_t *b) +{ + int randret; + int ret = 1; + mpz_t tmp; + mpz_t bmina; + mpz_init(bmina); + mpz_sub(bmina, *b, *a); + + if (mpz_sgn(bmina) == 0) { + mpz_set(*rand, *a); + mpz_clear(bmina); + return 1; + } + + size_t len_bits = mpz_sizeinbase(bmina, 2); + size_t len_bytes = (len_bits + 7) / 8; + size_t sizeof_limb = sizeof(mp_limb_t); + size_t sizeof_limb_bits = sizeof_limb * 8; + size_t len_limbs = (len_bytes + sizeof_limb - 1) / sizeof_limb; + + mp_limb_t mask = ((mp_limb_t)-1) >> (sizeof_limb_bits - len_bits) % sizeof_limb_bits; + mp_limb_t r[len_limbs]; + +#ifndef NDEBUG + { + for (size_t i = 0; i < len_limbs; ++i) + r[i] = (mp_limb_t)-1; + r[len_limbs - 1] = mask; + mpz_t check; + mpz_roinit_n(check, r, len_limbs); + assert(mpz_cmp(check, bmina) >= 0); // max sampled value >= b - a + mpz_t bmina2; + mpz_init(bmina2); + mpz_add(bmina2, bmina, bmina); + assert(mpz_cmp(check, bmina2) < 0); // max sampled value < 2 * (b - a) + mpz_clear(bmina2); + } +#endif + + do { + randret = randombytes((unsigned char *)r, len_bytes); + if (randret != 0) { + ret = 0; + goto err; + } +#ifdef TARGET_BIG_ENDIAN + for (size_t i = 0; i < len_limbs; ++i) + r[i] = BSWAP_DIGIT(r[i]); +#endif + r[len_limbs - 1] &= mask; + mpz_roinit_n(tmp, r, len_limbs); + if (mpz_cmp(tmp, bmina) <= 0) + break; + } while (1); + + mpz_add(*rand, tmp, *a); +err: + mpz_clear(bmina); + return ret; +} + +int +ibz_rand_interval_i(ibz_t *rand, int32_t a, int32_t b) +{ + uint32_t diff, mask; + int32_t rand32; + + if (!(a >= 0 && b >= 0 && b > a)) { + printf("a = %d b = %d\n", a, b); + } + assert(a >= 0 && b >= 0 && b > a); + + diff = b - a; + + // Create a mask with 1 + ceil(log2(diff)) least significant bits set +#if (defined(__GNUC__) || defined(__clang__)) && INT_MAX == INT32_MAX + mask = (1 << (32 - __builtin_clz((uint32_t)diff))) - 1; +#else + uint32_t diff2 = diff, tmp; + + mask = (diff2 > 0xFFFF) << 4; + diff2 >>= mask; + + tmp = (diff2 > 0xFF) << 3; + diff2 >>= tmp; + mask |= tmp; + + tmp = (diff2 > 0xF) << 2; + diff2 >>= tmp; + mask |= tmp; + + tmp = (diff2 > 0x3) << 1; + diff2 >>= tmp; + mask |= tmp; + + mask |= diff2 >> 1; + + mask = (1 << (mask + 1)) - 1; +#endif + + assert(mask >= diff && mask < 2 * diff); + + // Rejection sampling + do { + randombytes((unsigned char *)&rand32, sizeof(rand32)); + +#ifdef TARGET_BIG_ENDIAN + rand32 = BSWAP32(rand32); +#endif + + rand32 &= mask; + } while (rand32 > (int32_t)diff); + + rand32 += a; + ibz_set(rand, rand32); + + return 1; +} + +int +ibz_rand_interval_minm_m(ibz_t *rand, int32_t m) +{ + int ret = 1; + mpz_t m_big; + + // m_big = 2 * m + mpz_init_set_si(m_big, m); + mpz_add(m_big, m_big, m_big); + + // Sample in [0, 2*m] + ret = ibz_rand_interval(rand, &ibz_const_zero, &m_big); + + // Adjust to range [-m, m] + mpz_sub_ui(*rand, *rand, m); + + mpz_clear(m_big); + + return ret; +} + +int +ibz_rand_interval_bits(ibz_t *rand, uint32_t m) +{ + int ret = 1; + mpz_t tmp; + mpz_t low; + mpz_init_set_ui(tmp, 1); + mpz_mul_2exp(tmp, tmp, m); + mpz_init(low); + mpz_neg(low, tmp); + ret = ibz_rand_interval(rand, &low, &tmp); + mpz_clear(tmp); + mpz_clear(low); + if (ret != 1) + goto err; + mpz_sub_ui(*rand, *rand, (unsigned long int)m); + return ret; +err: + mpz_clear(tmp); + mpz_clear(low); + return ret; +} + +int +ibz_bitsize(const ibz_t *a) +{ + return (int)mpz_sizeinbase(*a, 2); +} + +int +ibz_size_in_base(const ibz_t *a, int base) +{ + return (int)mpz_sizeinbase(*a, base); +} + +void +ibz_copy_digits(ibz_t *target, const digit_t *dig, int dig_len) +{ + mpz_import(*target, dig_len, -1, sizeof(digit_t), 0, 0, dig); +} + +void +ibz_to_digits(digit_t *target, const ibz_t *ibz) +{ + // From the GMP documentation: + // "If op is zero then the count returned will be zero and nothing written to rop." + // The next line ensures zero is written to the first limb of target if ibz is zero; + // target is then overwritten by the actual value if it is not. + target[0] = 0; + mpz_export(target, NULL, -1, sizeof(digit_t), 0, 0, *ibz); +} + +int +ibz_probab_prime(const ibz_t *n, int reps) +{ + int ret = mpz_probab_prime_p(*n, reps); + DEBUG_STR_FUN_INT_MP_INT("ibz_probab_prime", ret, n, reps); + return ret; +} + +void +ibz_gcd(ibz_t *gcd, const ibz_t *a, const ibz_t *b) +{ + mpz_gcd(*gcd, *a, *b); +} + +int +ibz_invmod(ibz_t *inv, const ibz_t *a, const ibz_t *mod) +{ + return (mpz_invert(*inv, *a, *mod) ? 1 : 0); +} + +int +ibz_legendre(const ibz_t *a, const ibz_t *p) +{ + return mpz_legendre(*a, *p); +} + +int +ibz_sqrt(ibz_t *sqrt, const ibz_t *a) +{ + if (mpz_perfect_square_p(*a)) { + mpz_sqrt(*sqrt, *a); + return 1; + } else { + return 0; + } +} + +void +ibz_sqrt_floor(ibz_t *sqrt, const ibz_t *a) +{ + mpz_sqrt(*sqrt, *a); +} + +int +ibz_sqrt_mod_p(ibz_t *sqrt, const ibz_t *a, const ibz_t *p) +{ +#ifndef NDEBUG + assert(ibz_probab_prime(p, 100)); +#endif + // Case a = 0 + { + ibz_t test; + ibz_init(&test); + ibz_mod(&test, a, p); + if (ibz_is_zero(&test)) { + ibz_set(sqrt, 0); + } + ibz_finalize(&test); + } +#ifdef DEBUG_VERBOSE + ibz_t a_cp, p_cp; + ibz_init(&a_cp); + ibz_init(&p_cp); + ibz_copy(&a_cp, a); + ibz_copy(&p_cp, p); +#endif + + mpz_t amod, tmp, exp, a4, a2, q, z, qnr, x, y, b, pm1; + mpz_init(amod); + mpz_init(tmp); + mpz_init(exp); + mpz_init(a4); + mpz_init(a2); + mpz_init(q); + mpz_init(z); + mpz_init(qnr); + mpz_init(x); + mpz_init(y); + mpz_init(b); + mpz_init(pm1); + + int ret = 1; + + mpz_mod(amod, *a, *p); + if (mpz_cmp_ui(amod, 0) < 0) { + mpz_add(amod, *p, amod); + } + + if (mpz_legendre(amod, *p) != 1) { + ret = 0; + goto end; + } + + mpz_sub_ui(pm1, *p, 1); + + if (mpz_mod_ui(tmp, *p, 4) == 3) { + // p % 4 == 3 + mpz_add_ui(tmp, *p, 1); + mpz_fdiv_q_2exp(tmp, tmp, 2); + mpz_powm(*sqrt, amod, tmp, *p); + } else if (mpz_mod_ui(tmp, *p, 8) == 5) { + // p % 8 == 5 + mpz_sub_ui(tmp, *p, 1); + mpz_fdiv_q_2exp(tmp, tmp, 2); + mpz_powm(tmp, amod, tmp, *p); // a^{(p-1)/4} mod p + if (!mpz_cmp_ui(tmp, 1)) { + mpz_add_ui(tmp, *p, 3); + mpz_fdiv_q_2exp(tmp, tmp, 3); + mpz_powm(*sqrt, amod, tmp, *p); // a^{(p+3)/8} mod p + } else { + mpz_sub_ui(tmp, *p, 5); + mpz_fdiv_q_2exp(tmp, tmp, 3); // (p - 5) / 8 + mpz_mul_2exp(a4, amod, 2); // 4*a + mpz_powm(tmp, a4, tmp, *p); + + mpz_mul_2exp(a2, amod, 1); + mpz_mul(tmp, a2, tmp); + mpz_mod(*sqrt, tmp, *p); + } + } else { + // p % 8 == 1 -> Shanks-Tonelli + int e = 0; + mpz_sub_ui(q, *p, 1); + while (mpz_tstbit(q, e) == 0) + e++; + mpz_fdiv_q_2exp(q, q, e); + + // 1. find generator - non-quadratic residue + mpz_set_ui(qnr, 2); + while (mpz_legendre(qnr, *p) != -1) + mpz_add_ui(qnr, qnr, 1); + mpz_powm(z, qnr, q, *p); + + // 2. Initialize + mpz_set(y, z); + mpz_powm(y, amod, q, *p); // y = a^q mod p + + mpz_add_ui(tmp, q, 1); // tmp = (q + 1) / 2 + mpz_fdiv_q_2exp(tmp, tmp, 1); + + mpz_powm(x, amod, tmp, *p); // x = a^(q + 1)/2 mod p + + mpz_set_ui(exp, 1); + mpz_mul_2exp(exp, exp, e - 2); + + for (int i = 0; i < e; ++i) { + mpz_powm(b, y, exp, *p); + + if (!mpz_cmp(b, pm1)) { + mpz_mul(x, x, z); + mpz_mod(x, x, *p); + + mpz_mul(y, y, z); + mpz_mul(y, y, z); + mpz_mod(y, y, *p); + } + + mpz_powm_ui(z, z, 2, *p); + mpz_fdiv_q_2exp(exp, exp, 1); + } + + mpz_set(*sqrt, x); + } + +#ifdef DEBUG_VERBOSE + DEBUG_STR_FUN_3("ibz_sqrt_mod_p", sqrt, &a_cp, &p_cp); + ibz_finalize(&a_cp); + ibz_finalize(&p_cp); +#endif + +end: + mpz_clear(amod); + mpz_clear(tmp); + mpz_clear(exp); + mpz_clear(a4); + mpz_clear(a2); + mpz_clear(q); + mpz_clear(z); + mpz_clear(qnr); + mpz_clear(x); + mpz_clear(y); + mpz_clear(b); + mpz_clear(pm1); + + return ret; +} diff --git a/src/quaternion/ref/generic/integers.c b/src/quaternion/ref/generic/integers.c index db91a83..ec7cda0 100644 --- a/src/quaternion/ref/generic/integers.c +++ b/src/quaternion/ref/generic/integers.c @@ -1,319 +1,116 @@ #include #include "internal.h" #include +#include +#include -//Small helper for integers -void ibz_rounded_div(ibz_t *q, const ibz_t *a, const ibz_t *b){ - ibz_t r,sign_q, abs_b; - ibz_init(&r); - ibz_init(&sign_q); - ibz_init(&abs_b); +// Random prime generation for tests +int +ibz_generate_random_prime(ibz_t *p, int is3mod4, int bitsize, int probability_test_iterations) +{ + assert(bitsize != 0); + int found = 0; + ibz_t two_pow, two_powp; - //assumed to round towards 0 - ibz_abs(&abs_b,b); - // q is of same sign as a*b (and 0 if a is 0) - ibz_mul(&sign_q,a,b); - ibz_div(q,&r,a,b); - ibz_abs(&r,&r); - ibz_add(&r,&r,&r); - if(ibz_cmp(&r,&abs_b)>0){ - ibz_set(&r,0); - if(ibz_cmp(&sign_q,&r)<0){ - ibz_set(&sign_q,-1); - } else { - ibz_set(&sign_q,1); + ibz_init(&two_pow); + ibz_init(&two_powp); + ibz_pow(&two_pow, &ibz_const_two, (bitsize - 1) - (0 != is3mod4)); + ibz_pow(&two_powp, &ibz_const_two, bitsize - (0 != is3mod4)); + + int cnt = 0; + while (!found) { + cnt++; + if (cnt % 100000 == 0) { + printf("Random prime generation is still running after %d attempts, this is not " + "normal! The expected number of attempts is %d \n", + cnt, + bitsize); } - ibz_add(q,q,&sign_q); - } - ibz_finalize(&r); - ibz_finalize(&sign_q); - ibz_finalize(&abs_b); + ibz_rand_interval(p, &two_pow, &two_powp); + ibz_add(p, p, p); + if (is3mod4) { + ibz_add(p, p, p); + ibz_add(p, &ibz_const_two, p); + } + ibz_add(p, &ibz_const_one, p); + + found = ibz_probab_prime(p, probability_test_iterations); + } + ibz_finalize(&two_pow); + ibz_finalize(&two_powp); + return found; } - -// this function assumes that there is a sqrt of -1 mod p and p is prime -//algorithm read at http://www.lix.polytechnique.fr/Labo/Francois.Morain/Articles/cornac.pdf, on 2nd of may 2023, 14h45 CEST -int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p){ - int res = 1; - ibz_t two, r0, r1, r2, a, x0, prod; +// solves x^2 + n y^2 == p for positive integers x, y +// assumes that p is prime and -n mod p is a square +int +ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p) +{ + ibz_t r0, r1, r2, a, prod; ibz_init(&r0); ibz_init(&r1); ibz_init(&r2); ibz_init(&a); ibz_init(&prod); - ibz_init(&two); + + int res = 0; // manage case p = 2 separately - ibz_set(&two,2); - int test = ibz_cmp(p,&two); - if(test==0){ - if (ibz_is_one(n)){ - ibz_set(x,1); - ibz_set(y,1); + if (!ibz_cmp(p, &ibz_const_two)) { + if (ibz_is_one(n)) { + ibz_set(x, 1); + ibz_set(y, 1); res = 1; - } else { - res = 0; } + goto done; + } + // manage case p = n separately + if (!ibz_cmp(p, n)) { + ibz_set(x, 0); + ibz_set(y, 1); + res = 1; + goto done; } - - //test coprimality (should always be ok in our cases) - ibz_gcd(&r2,p,n); - if (ibz_is_one(&r2) && (test != 0)){ - // get sqrt of -n mod p - ibz_set(&r2,0); - ibz_sub(&r2,&r2,n); - res = res && ibz_sqrt_mod_p(&r2,&r2,p); - if (res){ - // run loop - ibz_copy(&prod,p); - ibz_copy(&r1,p); - while(ibz_cmp(&prod,p)>=0){ - ibz_div(&a,&r0,&r2,&r1); - ibz_mul(&prod,&r0,&r0); - ibz_copy(&r2,&r1); - ibz_copy(&r1,&r0); - } - // test if result is solution - ibz_sub(&a,p,&prod); - ibz_div(&a,&r2,&a,n); - res = res && (ibz_is_zero(&r2)); - res = res && ibz_sqrt(y,&a); - if (res){ - ibz_copy(x,&r0); - ibz_mul(&a,y,y); - ibz_mul(&a,&a,n); - ibz_add(&prod,&prod,&a); - res = res && (0==ibz_cmp(&prod,p)); - } - } + // test coprimality (should always be ok in our cases) + ibz_gcd(&r2, p, n); + if (!ibz_is_one(&r2)) + goto done; + + // get sqrt of -n mod p + ibz_neg(&r2, n); + if (!ibz_sqrt_mod_p(&r2, &r2, p)) + goto done; + + // run loop + ibz_copy(&prod, p); + ibz_copy(&r1, p); + ibz_copy(&r0, p); + while (ibz_cmp(&prod, p) >= 0) { + ibz_div(&a, &r0, &r2, &r1); + ibz_mul(&prod, &r0, &r0); + ibz_copy(&r2, &r1); + ibz_copy(&r1, &r0); } + // test if result is solution + ibz_sub(&a, p, &prod); + ibz_div(&a, &r2, &a, n); + if (!ibz_is_zero(&r2)) + goto done; + if (!ibz_sqrt(y, &a)) + goto done; + + ibz_copy(x, &r0); + ibz_mul(&a, y, y); + ibz_mul(&a, &a, n); + ibz_add(&prod, &prod, &a); + res = !ibz_cmp(&prod, p); + +done: ibz_finalize(&r0); ibz_finalize(&r1); ibz_finalize(&r2); ibz_finalize(&a); ibz_finalize(&prod); - ibz_finalize(&two); - return(res); -} - -int ibz_cornacchia_special_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p, const int exp_adjust){ - int res = 1; - ibz_t two, r0, r1, r2, a, x0, prod; - ibz_t p4; - ibz_t test_square; - ibz_init(&test_square); - ibz_init(&r0); - ibz_init(&r1); - ibz_init(&r2); - ibz_init(&a); - ibz_init(&prod); - ibz_init(&two); - ibz_init(&p4); - ibz_set(&two,2); - ibz_pow(&p4,&two,exp_adjust); - ibz_mul(&p4,p,&p4); - - assert(exp_adjust>0); - -#ifndef NDEBUG - ibz_set(&r0,3); - ibz_set(&r1,4); - ibz_mod(&r2,n,&r1); - assert((ibz_cmp(&r2,&r0)==0)); - ibz_set(&r0,0); - ibz_set(&r1,0); - ibz_set(&r2,0); -#endif - - // manage case p = 2 separately - int test = ibz_cmp(p,&two); - if(test==0){ - if (ibz_is_one(n)){ - ibz_set(x,1); - ibz_set(y,1); - res = 1; - } else { - res = 0; - } - } - - //test coprimality (should always be ok in our cases) - ibz_gcd(&r2,p,n); - if (ibz_is_one(&r2) && (test != 0)){ - - // get sqrt of -n mod p - ibz_set(&r2,0); - ibz_sub(&r2,&r2,n); - res = res && ibz_sqrt_mod_p(&r2,&r2,p); - res = res && (ibz_get(&r2)%2 != 0); - - - ibz_mul(&test_square,&r2,&r2); - ibz_add(&test_square,&test_square,n); - ibz_mod(&test_square,&test_square,&p4); - res = res && ibz_is_zero(&test_square); - if (res){ - // run loop - ibz_copy(&prod,&p4); - ibz_copy(&r1,&p4); - while(ibz_cmp(&prod,&p4)>=0){ - ibz_div(&a,&r0,&r2,&r1); - ibz_mul(&prod,&r0,&r0); - ibz_copy(&r2,&r1); - ibz_copy(&r1,&r0); - } - // test if result is solution - ibz_sub(&a,&p4,&prod); - ibz_div(&a,&r2,&a,n); - res = res && ibz_is_zero(&r2); - res = res && ibz_sqrt(y,&a); - if (res){ - ibz_copy(x,&r0); - ibz_mul(&a,y,y); - ibz_mul(&a,&a,n); - ibz_add(&prod,&prod,&a); - res = res && (0==ibz_cmp(&prod,&p4)); - } - } - } - ibz_finalize(&r0); - ibz_finalize(&r1); - ibz_finalize(&r2); - ibz_finalize(&a); - ibz_finalize(&prod); - ibz_finalize(&two); - ibz_finalize(&p4); - ibz_finalize(&test_square); - return(res); -} - -//returns complex product of a and b -void ibz_complex_mul(ibz_t *re_res, ibz_t *im_res, const ibz_t *re_a, const ibz_t *im_a, const ibz_t *re_b, const ibz_t *im_b){ - ibz_t prod, re, im; - ibz_init(&prod); - ibz_init(&re); - ibz_init(&im); - ibz_mul(&re, re_a,re_b); - ibz_mul(&prod, im_a, im_b); - ibz_sub(&re,&re,&prod); - ibz_mul(&im, re_a,im_b); - ibz_mul(&prod, im_a, re_b); - ibz_add(&im,&im,&prod); - ibz_copy(im_res,&im); - ibz_copy(re_res,&re); - ibz_finalize(&prod); - ibz_finalize(&re); - ibz_finalize(&im); -} - -//multiplies res by a^e with res and a integer complex numbers -void ibz_complex_mul_by_complex_power(ibz_t *re_res, ibz_t *im_res, const ibz_t *re_a, const ibz_t *im_a, int64_t exp){ - ibz_t re_x,im_x; - ibz_init(&re_x); - ibz_init(&im_x); - ibz_set(&re_x,1); - ibz_set(&im_x,0); - for (int i = 0; i < 64; i++){ - ibz_complex_mul(&re_x,&im_x,&re_x,&im_x,&re_x,&im_x); - if((exp>>(63-i)) & 1){ - ibz_complex_mul(&re_x,&im_x,&re_x,&im_x,re_a,im_a); - } - } - ibz_complex_mul(re_res,im_res,re_res,im_res,&re_x,&im_x); - ibz_finalize(&re_x); - ibz_finalize(&im_x); -} - -//multiplies to res the result of the solutions of cornacchia for prime depending on valuation val (prime-adic valuation) -int ibz_cornacchia_extended_prime_loop(ibz_t *re_res, ibz_t *im_res, int64_t prime, int64_t val){ - ibz_t re, im, p, n; - ibz_init(&re); - ibz_init(&im); - ibz_init(&p); - ibz_init(&n); - ibz_set(&n,1); - ibz_set(&p, prime); - int res = ibz_cornacchia_prime(&re,&im,&n,&p); - if(res){ - ibz_complex_mul_by_complex_power(re_res, im_res, &re, &im, val); - } - ibz_finalize(&re); - ibz_finalize(&im); - ibz_finalize(&p); - ibz_finalize(&n); - return(res); -} - -int ibz_cornacchia_extended(ibz_t *x, ibz_t *y, const ibz_t *n, const short *prime_list, const int prime_list_length, short primality_test_iterations, const ibz_t *bad_primes_prod){ - int res = 1; - ibz_t four, one, nodd, q, r, p; - ibz_init(&four); - ibz_init(&one); - ibz_init(&nodd); - ibz_init(&r); - ibz_init(&q); - ibz_init(&p); - int64_t *valuations = malloc(prime_list_length*sizeof(int64_t)); - ibz_set(&four,4); - ibz_set(&one,1); - - // if a prime which is 3 mod 4 divides n, extended Cornacchia can't solve the equation - if(bad_primes_prod != NULL){ - ibz_gcd(&q,n,bad_primes_prod); - if(!ibz_is_one(&q)){ - res = 0; - } - } - - if(res){ - // get the valuations and the unfactored part by attempting division by all given primes - ibz_copy(&nodd,n); - for (int i = 0; i < prime_list_length; i++){ - valuations[i] = 0; - if (((*(prime_list + i) % 4) == 1) || (i == 0)){ - ibz_set(&r, 0); - ibz_set(&p, *(prime_list + i)); - ibz_copy(&q,&nodd); - while(ibz_is_zero(&r)){ - valuations[i] +=1; - ibz_copy(&nodd,&q); - ibz_div(&q,&r,&nodd,&p); - } - valuations[i] -=1; - } - } - - // compute the remainder mod 4 - ibz_mod(&r,&nodd,&four); - if (ibz_is_one(&r)){ // we hope the 'unfactored' part is a prime 1 mod 4 - if (ibz_probab_prime(&nodd, primality_test_iterations) || ibz_is_one(&nodd)){ - if (ibz_is_one(&nodd)){ // the unfactored part is 1 - ibz_set(x,1); - ibz_set(y,0); - } else { // the 'unfactored' part is prime, can use Cornacchia - res = res && ibz_cornacchia_prime(x,y,&one, &nodd); - } - if (res == 1){ // no need to continue if failure here - for (int i = 0; i < prime_list_length; i++){ - if (valuations[i] != 0){ - res = res && ibz_cornacchia_extended_prime_loop(x, y, prime_list[i], valuations[i]); - } - } - } - } else { - res = 0; - } - } else { - res = 0; - } - } - free(valuations); - ibz_finalize(&four); - ibz_finalize(&one); - ibz_finalize(&nodd); - ibz_finalize(&r); - ibz_finalize(&q); - ibz_finalize(&p); - return(res); + return res; } diff --git a/src/quaternion/ref/generic/internal.h b/src/quaternion/ref/generic/internal.h deleted file mode 100644 index da3fc00..0000000 --- a/src/quaternion/ref/generic/internal.h +++ /dev/null @@ -1,740 +0,0 @@ -/** @file - * - * @authors Sina Schaeffler - * - * @brief Declarations for helper functions for quaternion algebra implementation - */ - -#ifndef QUAT_HELPER_H -#define QUAT_HELPER_H - -#include - -/** @internal - * @ingroup quat_quat - * @defgroup quat_helpers Quaternion module internal functions - * @{ - */ - - -/** @internal - * @defgroup quat_alg_helpers Helper functions for the alg library - * @{ - */ - -/** @internal - * @brief helper function for initializing small quaternion algebras. - */ -static inline void quat_alg_init_set_ui(quat_alg_t *alg, unsigned int p) { - ibz_t bp; - ibz_init(&bp); - ibz_set(&bp, p); - quat_alg_init_set(alg, &bp); - ibz_finalize(&bp); -} - -/** @brief a+b - * - * Add two integer 4-vectors - * - * @param res Output: Will contain sum - * @param a - * @param b - */ -void quat_alg_coord_add(quat_alg_coord_t *res, const quat_alg_coord_t *a, const quat_alg_coord_t *b); - -/** @brief a-b - * - * Substract two integer 4-vectors - * - * @param res Output: Will contain difference - * @param a - * @param b - */ -void quat_alg_coord_sub(quat_alg_coord_t *res, const quat_alg_coord_t *a, const quat_alg_coord_t *b); - -/** @brief Compute same denominator form of two quaternion algebra elements - * - * res_a=a and res_b=b (representing the same element) and res_a.denom = res_b.denom - * - * @param res_a - * @param res_b - * @param a - * @param b - */ -void quat_alg_equal_denom(quat_alg_elem_t *res_a, quat_alg_elem_t *res_b, const quat_alg_elem_t *a, const quat_alg_elem_t *b); - -/** @brief Copies the given values into an algebra element, without normalizing it - * - * @param elem Output: algebra element of coordinates [coord0,coord1,coord2,coord3] and denominator denom - * @param denom Denominator, must be non zero - * @param coord0 Coordinate on 1 (0th vector of standard algebra basis) - * @param coord1 Coordinate on i (1st vector of standard algebra basis) - * @param coord2 Coordinate on j (2nd vector of standard algebra basis) - * @param coord3 Coordinate on ij (3rd vector of standard algebra basis) - */ -void quat_alg_elem_copy_ibz(quat_alg_elem_t *elem, const ibz_t *denom, const ibz_t *coord0, const ibz_t *coord1, const ibz_t *coord2, const ibz_t *coord3); - -/** @brief Sets an algebra element to the given integer values, without normalizing it - * - * @param elem Output: algebra element of coordinates [coord0,coord1,coord2,coord3] and denominator denom - * @param denom Denominator, must be non zero - * @param coord0 Coordinate on 1 (0th vector of standard algebra basis) - * @param coord1 Coordinate on i (1st vector of standard algebra basis) - * @param coord2 Coordinate on j (2nd vector of standard algebra basis) - * @param coord3 Coordinate on ij (3rd vector of standard algebra basis) - */ -void quat_alg_elem_set(quat_alg_elem_t *elem, int64_t denom, int64_t coord0, int64_t coord1, int64_t coord2, int64_t coord3); - -/** @brief Multiplies algebra element by integer scalar, without normalizing it - * - * @param res Output - * @param scalar Integer - * @param elem Algebra element - */ -void quat_alg_elem_mul_by_scalar(quat_alg_elem_t *res, const ibz_t *scalar, const quat_alg_elem_t *elem); - -/** @brief Compute the right multiplication table of a quaternion (without denominator) - * - * @param mulmat Output - * @param a Quaternion - * @param alg The algebra - */ -void quat_alg_rightmul_mat(ibz_mat_4x4_t *mulmat, const quat_alg_elem_t *a, const quat_alg_t *alg); -/** @} - */ - -/** @internal - * @defgroup quat_int_helpers Helper functions for integer functions - * @{ - */ - -/** @internal - * @defgroup quat_int_small_helpers Small integer functions - * @{ - */ - -/** @brief round a/b to closest integer q - */ -void ibz_rounded_div(ibz_t *q, const ibz_t *a, const ibz_t *b); - -/** @brief Compare ibz_t with long - */ -static int ibz_cmp_si(ibz_t *x, int64_t y) { - ibz_t Y; - ibz_init(&Y); - ibz_set(&Y, y); - int res = ibz_cmp(x, &Y); - ibz_finalize(&Y); - return res; -} -/** @} - */ - -/** @internal - * @defgroup quat_cornacchia_helpers Helper functions for the cornacchia function - * @{ - */ - -/** @brief Complex product of a and b - * - * re_res + i*im_res = (re_a+i*im_a)*(re_b+i*im_b) where i a usual complex 4th root of unity - * - * @param re_res Output: real part of the result - * @param im_res Output: imaginary part of the result - * @param re_a Real part of a - * @param im_a Imaginary part of a - * @param re_b Real part of b - * @param im_b Imaginary part of b - */ -void ibz_complex_mul(ibz_t *re_res, ibz_t *im_res, const ibz_t *re_a, const ibz_t *im_a, const ibz_t *re_b, const ibz_t *im_b); - -/** @brief Multiplies res by a^e with res and a integer complex numbers - * - * re_res + i*im_res = (re_res+i*im_res)*((re_a+i*im_a)^exp) where i a usual complex 4th root of unity - * - * @param re_res Output: real part of the result. Also used as input. - * @param im_res Output: imaginary part of the result. Also used as input. - * @param re_a Real part of a - * @param im_a Imaginary part of a - * @param exp res*(a^exp) will be computed, exp should be a positive integer or 0 - */ -void ibz_complex_mul_by_complex_power(ibz_t *re_res, ibz_t *im_res, const ibz_t *re_a, const ibz_t *im_a, int64_t exp); - -/** @brief Multiplies to res the result of the solutions of cornacchia for prime depending on valuation val (prime-adic valuation) - * - * re_res + i*im_res = (re_res+i*im_res)*((x+i*y)^val) where i a usual complex 4th root of unity, and x,y an integer sulotion to x^2 + y^2 = prime - * - * @param re_res Output: real part of the result. Also used as input. - * @param im_res Output: imaginary part of the result. Also used as input. - * @param prime a prime factor of n on which extended Cornacchia was called - * @param val prime-adic valuation of the n on which extended Cornacchia was called - * @returns 1 if an integer solution x,y to x^2 + y^2 = prime was found by Cornacchia_prime, 0 otherwise - */ -int ibz_cornacchia_extended_prime_loop(ibz_t *re_res, ibz_t *im_res, int64_t prime, int64_t val); -/** @} - */ -/** @} - */ - -/** @internal - * @defgroup quat_dim4_helpers Helper functions for functions for matrices or vectors in dimension 4 - * @{ - */ - -/** @internal - * @defgroup quat_inv_helpers Helper functions for the integer matrix inversion function - * @{ - */ - -/** @brief a1a2+b1b2+c1c2 - * - * @param coeff Output: The coefficien which was computed as a1a2+b1b2-c1c2 - * @param a1 - * @param a2 - * @param b1 - * @param b2 - * @param c1 - * @param c2 - */ -void ibz_inv_dim4_make_coeff_pmp(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, const ibz_t *b2, const ibz_t *c1, const ibz_t *c2); - -/** @brief -a1a2+b1b2-c1c2 - * - * @param coeff Output: The coefficien which was computed as -a1a2+b1b2-c1c2 - * @param a1 - * @param a2 - * @param b1 - * @param b2 - * @param c1 - * @param c2 - */ -void ibz_inv_dim4_make_coeff_mpm(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, const ibz_t *b2, const ibz_t *c1, const ibz_t *c2); - -/** @brief Matrix determinant and a matrix inv such that inv/det is the inverse matrix of the input - * - * Implemented following the methof of 2x2 minors explained at Method from https://www.geometrictools.com/Documentation/LaplaceExpansionTheorem.pdf (visited on 3rd of May 2023, 16h15 CEST) - * - * @returns 1 if the determinant of mat is not 0 and an inverse was computed, 0 otherwise - * @param inv Output: Will contain an integer matrix which, dividet by det, will yield the rational inverse of the matrix if it exists, can be NULL - * @param det Output: Will contain the determinant of the input matrix, can be NULL - * @param mat Matrix of which the inverse will be computed - */ -int ibz_mat_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t *mat); - -/** @brief a*b for a,b integer 4x4 matrices - * - * Naive implementation - * - * @param res Output: A 4x4 integer matrix - * @param a - * @param b - */ -void ibz_mat_4x4_mul(ibz_mat_4x4_t *res, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b); -/** @} - */ - -/** @internal - * @defgroup quat_lll_verify_helpers Helper functions for lll verification in dimension 4 - * @{ - */ - -/** @brief Set an ibq vector to 4 given integer coefficients - */ -void ibq_vec_4_copy_ibz(ibq_t (*vec)[4], const ibz_t *coeff0, const ibz_t *coeff1,const ibz_t *coeff2,const ibz_t *coeff3); - -/** @brief Bilinear form vec00*vec10+vec01*vec11+q*vec02*vec12+q*vec03*vec13 for ibz_q - */ -void quat_dim4_lll_bilinear(ibq_t *b, const ibq_t (*vec0)[4], const ibq_t (*vec1)[4], const ibz_t *q); - -/** @brief Outputs the transposition of the orthogonalised matrix of mat (as fractions) - * - * For the bilinear form vec00*vec10+vec01*vec11+q*vec02*vec12+q*vec03*vec13 - */ -void quat_dim4_gram_schmidt_transposed_with_ibq(ibq_t (*orthogonalised_transposed)[4][4], const ibz_mat_4x4_t *mat, const ibz_t *q); - -/** @brief Verifies if mat is lll-reduced for parameter coeff and norm defined by q - * - * For the bilinear form vec00*vec10+vec01*vec11+q*vec02*vec12+q*vec03*vec13 - */ -int quat_dim4_lll_verify(const ibz_mat_4x4_t *mat, const ibq_t *coeff, const ibz_t *q); -/** @} - */ - -/** @internal - * @defgroup quat_dim4_lat_helpers Helper functions on vectors and matrices used mainly for lattices - * @{ - */ - -/** @brief Set a vector of 4 integers to given values - * - * @param vec Output: is set to given coordinates - * @param coord0 - * @param coord1 - * @param coord2 - * @param coord3 - */ -void ibz_vec_4_set(ibz_vec_4_t *vec, int64_t coord0, int64_t coord1, int64_t coord2, int64_t coord3); - -/** @brief Copy all values from one vector to another - * - * @param new Output: is set to same values as vec - * @param vec - */ -void ibz_vec_4_copy(ibz_vec_4_t *new, const ibz_vec_4_t *vec); - -/** @brief Compute the linear combination lc = coeff_a vec_a + coeff_b vec_b - * - * @param lc Output: linear combination lc = coeff_a vec_a + coeff_b vec_b - * @param coeff_a Scalar multiplied to vec_a - * @param vec_a - * @param coeff_b Scalar multiplied to vec_b - * @param vec_b - */ -void ibz_vec_4_linear_combination(ibz_vec_4_t *lc, const ibz_t *coeff_a, const ibz_vec_4_t *vec_a, const ibz_t *coeff_b, const ibz_vec_4_t *vec_b); - -/** @brief divides all values in vector by same scalar - * - * @returns 1 if scalar divided all values in mat, 0 otherwise (division is performed in both cases) - * @param quot Output - * @param scalar - * @param vec - */ -int ibz_vec_4_scalar_div(ibz_vec_4_t *quot, const ibz_t *scalar, const ibz_vec_4_t *vec); - -/** @brief Negation for vectors of 4 integers - * - * @param neg Output: is set to -vec - * @param vec - */ -void ibz_vec_4_negate(ibz_vec_4_t *neg, const ibz_vec_4_t *vec); - -/** @brief Copies all values from a 4x4 integer matrix to another one - * - * @param new Output: matrix which will have its entries set to mat's entries - * @param mat Input matrix - */ -void ibz_mat_4x4_copy(ibz_mat_4x4_t *new, const ibz_mat_4x4_t *mat); - -/** @brief -mat for mat a 4x4 integer matrix - * - * @param neg Output: is set to -mat - * @param mat Input matrix - */ -void ibz_mat_4x4_negate(ibz_mat_4x4_t *neg, const ibz_mat_4x4_t *mat); - -/** @brief transpose a 4x4 integer matrix - * - * @param transposed Output: is set to the transposition of mat - * @param mat Input matrix - */ -void ibz_mat_4x4_transpose(ibz_mat_4x4_t *transposed, const ibz_mat_4x4_t *mat); - -/** @brief Set all coefficients of a matrix to zero for 4x4 integer matrices - * - * @param zero - */ -void ibz_mat_4x4_zero(ibz_mat_4x4_t *zero); - -/** @brief Set a matrix to the identity for 4x4 integer matrices - * - * @param id - */ -void ibz_mat_4x4_identity(ibz_mat_4x4_t *id); - -/** @brief Test equality to identity for 4x4 integer matrices - * - * @returns 1 if mat is the identity matrix, 0 otherwise - * @param mat - */ -int ibz_mat_4x4_is_identity(const ibz_mat_4x4_t *mat); - -/** @brief Equality test for 4x4 integer matrices - * - * @returns 1 if equal, 0 otherwise - * @param mat1 - * @param mat2 - */ -int ibz_mat_4x4_equal(const ibz_mat_4x4_t *mat1, const ibz_mat_4x4_t *mat2); - -/** @brief Matrix by integer multiplication - * - * @param prod Output - * @param scalar - * @param mat - */ -void ibz_mat_4x4_scalar_mul(ibz_mat_4x4_t *prod, const ibz_t *scalar, const ibz_mat_4x4_t *mat); - -/** @brief gcd of all values in matrix - * - * @param gcd Output - * @param mat - */ -void ibz_mat_4x4_gcd(ibz_t *gcd, const ibz_mat_4x4_t *mat); - -/** @brief divides all values in matrix by same scalar - * - * @returns 1 if scalar divided all values in mat, 0 otherwise (division is performed in both cases) - * @param quot Output - * @param scalar - * @param mat - */ -int ibz_mat_4x4_scalar_div(ibz_mat_4x4_t *quot, const ibz_t *scalar, const ibz_mat_4x4_t *mat); - -/** @brief Modular matrix multiplication of aribitrarily sized matrices - * - * res = A * B (mod) - * - * @param from - * @param through - * @param to - * @param res Output: a from × to matrix. Cannot point to the same memory as A or B. - * @param A a from × through matrix - * @param B a through × to matrix - * @param mod modulo - */ -void ibz_mat_mulmod(int from, int through, int to, ibz_t res[from][to], const ibz_t A[from][through], const ibz_t B[through][to], const ibz_t *mod); - -/** @brief Compute the Howell form of a matrix modulo an integer - * - * Source: https://link.springer.com/chapter/10.1007/3-540-68530-8_12 - * Adapted from PARI/GP - * - * @param rows The number of rows of the input - * @param cols The number of columns of the input, must be <= rows - * @param howell Output: the Howell form H of mat - * @param trans Output: the transformation matrix U s.t. mat·U = H. May be NULL. - * @param mat The matrix - * @param mod The integer modulus - * @return the number of zero-columns to the lef of `howell`. - */ -int ibz_mat_howell(int rows, int cols, ibz_t howell[rows][rows+1], ibz_t trans[rows+1][rows+1], const ibz_t mat[rows][cols], ibz_t *mod); - -/** @brief Compute the right kernel of a matrix modulo an integer - * - * Computes the Howell normal form of the kernel. - * - * Source: https://link.springer.com/chapter/10.1007/3-540-68530-8_12 - * Adapted from PARI/GP - * - * @param rows The number of rows of the input - * @param cols The number of columns of the input, must be <= rows - * @param ker Output: the kernel - * @param mat The matrix - * @param mod The integer modulus - */ -void ibz_mat_right_ker_mod(int rows, int cols, ibz_t ker[cols][cols], const ibz_t mat[rows][cols], ibz_t *mod); - - -/** @brief Verifies whether the 4x4 input matrix is in Hermite Normal Form - * - * @returns 1 if mat is in HNF, 0 otherwise - * @param mat Matrix to be tested - */ -int ibz_mat_4x4_is_hnf(const ibz_mat_4x4_t *mat); - -/** @brief Hermite Normal Form of a matrix of 8 integer vectors - * - * Algorithm used is the one at number 2.4.5 in Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 - * - * @param hnf Output: Matrix in Hermite Normal Form generating the same lattice as generators - * @param generators matrix whose colums generate the same lattice than the output - */ -void ibz_mat_4x8_hnf_core(ibz_mat_4x4_t *hnf, const ibz_mat_4x8_t *generators); - -/** @brief Hermite Normal Form of a matrix concatenated with mod*Id - * - * @param hnf Output: Matrix in Hermite Normal Form generating the same lattice as generators - * @param mat matrix whose colums and mod*Id generate the same lattice than the output - * @param mod mod*Id is appended to the matrix. A hnf of this concatenation is then output - */ -void ibz_mat_4x4_hnf_mod(ibz_mat_4x4_t *hnf, const ibz_mat_4x4_t *mat, const ibz_t *mod); - -/** @} - */ -/** @} - */ - -/** @internal - * @defgroup quat_dim2_helpers Helper functions for dimension 2 - * @{ - */ - -/** @internal - * @defgroup quat_dim2_other_helpers Set and other small helper functions for dimension 2 matrix and vector - * @{ - */ - -/** @brief Set vector coefficients to the given integers - * - * @param vec Output: Vector - * @param a0 - * @param a1 - */ -void ibz_vec_2_set(ibz_vec_2_t *vec, int a0, int a1); - -/** @brief Set matrix coefficients to the given integers - * - * @param mat Output: Matrix - * @param a00 - * @param a01 - * @param a10 - * @param a11 - */ -void ibz_mat_2x2_set(ibz_mat_2x2_t *mat, int a00, int a01, int a10, int a11); - -/** @brief Determinant of a 2x2 integer matrix given as 4 integers - * - * @param det Output: Determinant of the matrix - * @param a11 matrix coefficient (upper left corner) - * @param a12 matrix coefficient (upper right corner) - * @param a21 matrix coefficient (lower left corner) - * @param a22 matrix coefficient (lower right corner) - */ -void ibz_mat_2x2_det_from_ibz(ibz_t *det, const ibz_t *a11, const ibz_t *a12, const ibz_t *a21, const ibz_t *a22); -/** @} - */ - -/** @internal - * @defgroup quat_cvp_helpers Helper functions for 2x2 cvp - * @{ - */ - -/** @brief Checks if the vector (coord1,coord2) has integer coordinates in basis - * - * @param basis Rank 2 matrix - * @param coord1 - * @param coord2 - * @returns 1 if the vector (coord1,coord2) has integer coordinates in basis, 0 otherwise - */ -int quat_dim2_lattice_contains(ibz_mat_2x2_t *basis, ibz_t *coord1, ibz_t *coord2); - - -/** @brief coord1^2 + norm_q*coord2^2 - * - * This defines a quadratic form in dimension 2 where coord1 is the first and coord2 the second coordinate of the vector on which it is evaluated - * - * @param norm Output: coord1^2 + norm_q*coord2^2 - * @param coord1 - * @param coord2 - * @param norm_q Positive integer - */ -void quat_dim2_lattice_norm(ibz_t *norm, const ibz_t *coord1, const ibz_t *coord2, const ibz_t *norm_q); - -/** @brief v11*v21 + norm_q*v12*v22 - * - * This defines a bilinear form in dimension 2 where v11,v12 are coordinates of the first vector, v21,v22 of the second vector - * - * @param res Output: v11*v21+q*v12*v22 - * @param v11 - * @param v12 - * @param v21 - * @param v22 - * @param norm_q Positive integer - */ -void quat_dim2_lattice_bilinear(ibz_t *res, const ibz_t *v11, const ibz_t *v12, const ibz_t *v21, const ibz_t *v22, const ibz_t *norm_q); - -/** @brief Basis of the integral lattice represented by basis, which is small for the norm x^2 + qy^2 (in standard basis) - * - * Additionally, the first vector in the basis has a smaller norm than the second one. - * - * Algorithm 1.3.14 from Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 - * which finds a shortest vector in the lattice. - * - * @param reduced Output: Matrix of 2 column vectors of small norm x^2 + qy^2 which are a basis of the lattice the basis argument represents - * @param basis Basis of a rank 2 lattice in dimension 2 - * @param norm_q Positive integer defining a quadratic form x^2 + qy^2 (x,y coordinates of a vector in the standard basis of R^2) for which the reduced output basis shound be small - */ -void quat_dim2_lattice_short_basis(ibz_mat_2x2_t *reduced, const ibz_mat_2x2_t *basis, const ibz_t *norm_q); - -/** @brief Uses a and b to compute a* orthogonal to b, then computes the projection res of t on a* (uses the norm associated to norm_q) - * - * Helper for quat_dim2_lattice_closest_vector, implicitly computes an orthogonalised basis (b,a*) from (b,a) and a projection f the target t on its second vector - * - * Uses the norm associated to norm_q by x^2 + qy^2, for x,y coordinates of a vector - * - * @param res Output: The coefficient (projection of t on a* orthogonal to b) which was computed - * @param a0 will be the 1st coeff of a, the second vector of the input basis - * @param a1 will be the 2nd coeff of a, the second vector of the input basis - * @param b0 will be the 1st coeff of b, the first vector of the input basis - * @param b1 will be the 2nd coeff of b, the first vector of the input basis - * @param t0 will be the 1st coeff of the target vector, which one wnat to project on the orthogonalised basis' second vector - * @param t1 will be the 2nd coeff of the target vector, which one wnat to project on the orthogonalised basis' second vector - * @param norm_q Positive integer defining a quadratic form x^2 + qy^2 - */ -void quat_dim2_lattice_get_coefficient_with_orthogonalisation(ibz_t *res, const ibz_t *a0,const ibz_t *a1,const ibz_t *b0,const ibz_t *b1,const ibz_t *t0,const ibz_t *t1,const ibz_t *norm_q); - -/** @brief Finds a vector close to the given target in a lattice of which a reduced basis is given - * - * Nearest plane algo as in https://cims.nyu.edu/~regev/teaching/lattices_fall_2004/ln/cvp.pdf (15.5.23,16h10), but without basis reduction: - * Basically just two projections - * - * @param target_minus_closest Output: Vector in standard basis corresponding to target minus the close vector in the lattice which is output in closest_coords_in_basis - * @param closest_coords_in_basis Output: Represents a vector in the lattice close to target, represented by its coordinates in the given absis of the lattice - * @param reduced_basis Reduced basis of the lattice, reduction should be done using lll or an exact shortest vector algorithm - * @param target vector to which the solution should be close - * @param norm_q Positive integer defining a quadratic form x^2 + qy^2 (x,y coordinates of a vector in the standard basis of R^2) for which the reduced output basis shound be small - */ -void quat_dim2_lattice_closest_vector(ibz_vec_2_t *target_minus_closest, ibz_vec_2_t *closest_coords_in_basis, const ibz_mat_2x2_t *reduced_basis, const ibz_vec_2_t *target, const ibz_t *norm_q); - -/** @brief give a,b,c such that ax^2 + bxy + cy^2 = N(Bz), where B is the basis, z the vector x,y and N the quadratic form (coord1^2 + q coord2^2) - * - * @param qf_a Output: b in the formula - * @param qf_b Output: b in the formula - * @param qf_c Output: c in the formula - * @param basis Basis of the lattice - * @param norm_q Positive integer defining a quadratic form x^2 + qy^2 (x,y coordinates of a vector in the standard basis of R^2) for which the reduced output basis shound be small - */ -void quat_dim2_lattice_get_qf_on_lattice(ibz_t *qf_a, ibz_t *qf_b, ibz_t *qf_c, const ibz_mat_2x2_t *basis, const ibz_t *norm_q); - -/** @brief Test version of the condition argument in the cvp enumeration algorithms. - * - * Sets elem[0] and elem[2] to vec[0], elem[1] and elem[3] to vec[1] if vec[0] + vec[1] mod p is 2, where p is the ibz_t to which params points - * - * This defines a quadratic form in dimension 2 where coord1 is the first and coord2 the second coordinate of the vector on which it is evaluated - * - * @param elem Output as described below - * @param vec - * @param params void* which must point to an ibz_t - */ -int quat_dim2_lattice_test_cvp_condition(quat_alg_elem_t* elem, const ibz_vec_2_t* vec, const void* params); - -/** - * @brief Find vector of small norm in a positive definite quadratic form, satisfying extra conditions. - * - * @param res Output: The quat_alg_elem (dimension 4, with denominator) which the condition sets when it is fulfilled - * @param x first coordinate in the lattice basis lat_basis of a short vector (for the norm written coeff1^2 + q coeff2 ^2 in the standard basis) - * @param y first coordinate in the lattice basis lat_basis of a short vector (for the norm written coeff1^2 + q coeff2 ^2 in the standard basis) - * @param condition a filter function returning whether res is set to a valid output or not. The algorithm stops when it succeeds (outputs 1) - * @param params extra parameters passed to `condition`. May be NULL. - * @param target_minus_closest vector which will be added to the enumerated short vectors before checking the bound - * @param lat_basis reduced basis of the lattice, in which a short vector is searched for - * @param norm_q defines the quadratic form coord1^2+norm_q*coord2^2 (in standard basis) used as norm - * @param norm_bound only vectors with norm smaller than this bound are tested for condition - * @return 1 if vector was found, 0 otherwise - */ -int quat_dim2_lattice_bound_and_condition(quat_alg_elem_t *res, const ibz_t *x, const ibz_t *y, int (*condition)(quat_alg_elem_t *, const ibz_vec_2_t *, const void *), const void *params, const ibz_vec_2_t *target_minus_closest, const ibz_mat_2x2_t *lat_basis, const ibz_t *norm_q, const ibz_t *norm_bound); - -/** @brief Computes an integer slightly larger than sqrt(num_a/denom_a)+num_b/denom_b. - * - * More precisely, if denoting sqrt_ the integer part of the square root, and _ the integer part of a rational, - * res = 1+_((sqrt_(num_a)+1)/sqrt_(denom_a) + num_b/denom_b) - * - * @param res upper approximation of sqrt(num_a/denom_a)+num_b/denom_b - * @param num_a must be of same sign as denom_a - * @param denom_a must be non 0 and of same sign as num_a - * @param num_b - * @param denom_b must be non 0 - */ -int quat_dim2_lattice_qf_value_bound_generation(ibz_t *res, const ibz_t *num_a, const ibz_t *denom_a, const ibz_t *num_b, const ibz_t *denom_b); - -/** - * @brief Find vector of small norm in a positive definite quadratic form, satisfying extra conditions. - * - * Enumerates up to `max_tries` vectors `(x,y)` such that `qfa x² + qfb xy + qfc y² < norm_bound`; the first - * vector such that `quat_dim2_lattice_bound_and_condition(res,x,y,condition,params,target_minus_closest,lat_basis, norm_q,norm_bound) == 1` is returned. - * The vector enumeration starts by vectors close to the bound - * - * Uses algorithm 2.7.5 (Fincke-Pohst) from Henri Cohen's "A Course in Computational Algebraic Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 - * Slightly adapted to work without rational numbers and their square roots - * Therefore needing a test to make sure the bounds are respected, which is integrated in quat_dim2_lattice_bound_and_condition - * Also the norm bound is initialised a bit lower that the bound received, to leave space for the added target_minus_closest - * - * @param res Output: selected vector (x,y) - * @param condition a filter function returning whether a vector should be output or not - * @param params extra parameters passed to `condition`. May be NULL. - * @param target_minus_closest vector which will be added to the enumerated short vectors before checking the bound - * @param lat_basis reduced basis of the lattice, in which a short vector is searched for - * @param norm_q defines the quadratic form coord1^2+norm_q*coord2^2 (in standard basis) used as norm - * @param norm_bound only vectors with norm smaller than this bound are tested for condition and output - * @param max_tries maximum number of calls to filter - * @return 1 if vector was found, 0 otherwise - */ -int quat_dim2_lattice_qf_enumerate_short_vec(quat_alg_elem_t *res, int (*condition)(quat_alg_elem_t *, const ibz_vec_2_t *, const void *), const void *params, const ibz_vec_2_t *target_minus_closest, const ibz_mat_2x2_t *lat_basis, const ibz_t *norm_q, const ibz_t *norm_bound, const int max_tries); -/** @} - */ -/** @} - */ - -/** @internal - * @defgroup quat_lattice_helper Helper functions for the lattice library (dimension 4) - * @{ - */ - -/** - * @brief Lattice equality - * - * Lattice bases are assumed to be under HNF, but denominators are free. - * - * @returns 1 if both lattices are equal, 0 otherwise -*/ -int quat_lattice_equal(const quat_lattice_t *lat1, const quat_lattice_t *lat2); - -/** @brief Divides basis and denominator of a lattice by their gcd - * - * @param reduced Output - * @param lat Lattice - */ -void quat_lattice_reduce_denom(quat_lattice_t *reduced, const quat_lattice_t *lat); - -/** - * @brief Computes the dual lattice of lat, without putting its basis in HNF - * - * This function returns a lattice not under HNF. For careful internal use only. - * - * Coputation method described in https://cseweb.ucsd.edu/classes/sp14/cse206A-a/lec4.pdf consulted on 19 of May 2023, 12h40 CEST - * - * @param dual Output: The dual lattice of lat. ATTENTION: is not under HNF. hnf computation must be applied before using lattice functions on it - * @param lat lattice, the dual of it will be computed - */ -void quat_lattice_dual_without_hnf(quat_lattice_t *dual, const quat_lattice_t *lat); - -/** - * @brief Test whether x ∈ lat. If so, compute its coordinates in lat's basis. - * - * Lattice assumed of full rank and under HNF, none of both is tested so far. - * - * @param coord Output: Set to the coordinates of x in lat - * @param lat The lattice - * @param x An element of the quaternion algebra, in same basis as the lattice lat - * @return true if x ∈ lat - */ -int quat_lattice_contains_without_alg(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x); - -/** @brief The index of sublat into overlat - * - * Assumes inputs are in HNF. - * - * @param index Output - * @param sublat A lattice in HNF, must be sublattice of overlat - * @param overlat A lattice in HNF, must be overlattice of sublat - */ -void quat_lattice_index(ibz_t *index, const quat_lattice_t *sublat, const quat_lattice_t *overlat); - -/** @brief Random lattice element from a small parallelogram - * - * Sample a random element in `lattice` by taking a random linear - * combination of the basis with uniform coefficients in - * [-2^(n-1),2^(n-1)-1]. - * - * @param elem Output element - * @param lattice Whence the element is sampled - * @param n Number of random bits for the coefficients. Must be <= 64. - * @return 0 if PRNG failed (in this case elem is set to 0), 1 otherwise - */ -int quat_lattice_random_elem(quat_alg_elem_t *elem, const quat_lattice_t *lattice, unsigned char n); - -/** @brief Compute the right transporter from lat1 to lat2 - * - * The ideal of those x such that lat1·x ⊂ lat2 - */ -void quat_lattice_right_transporter(quat_lattice_t *trans, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg); - -/** @} - */ -/** @} - */ -/** @} - */ - -#endif diff --git a/src/quaternion/ref/generic/internal_quaternion_headers/dpe.h b/src/quaternion/ref/generic/internal_quaternion_headers/dpe.h new file mode 100644 index 0000000..b9a7a35 --- /dev/null +++ b/src/quaternion/ref/generic/internal_quaternion_headers/dpe.h @@ -0,0 +1,743 @@ +/* Copyright (C) 2004-2024 Patrick Pelissier, Paul Zimmermann, LORIA/INRIA. + +This file is part of the DPE Library. + +The DPE Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The DPE Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the DPE Library; see the file COPYING.LIB. +If not, see . */ + +#ifndef __DPE +#define __DPE + +#include /* For abort */ +#include /* For fprintf */ +#include /* for round, floor, ceil */ +#include + +/* if you change the version, please change it in Makefile too */ +#define DPE_VERSION_MAJOR 1 +#define DPE_VERSION_MINOR 7 + +#if defined(__GNUC__) && (__GNUC__ >= 3) +# define DPE_LIKELY(x) (__builtin_expect(!!(x),1)) +# define DPE_UNLIKELY(x) (__builtin_expect((x),0)) +# define DPE_UNUSED_ATTR __attribute__((unused)) +#else +# define DPE_LIKELY(x) (x) +# define DPE_UNLIKELY(x) (x) +# define DPE_UNUSED_ATTR +#endif + +/* If no user defined mode, define it to double */ +#if !defined(DPE_USE_DOUBLE) && !defined(DPE_USE_LONGDOUBLE) && !defined(DPE_USE_FLOAT128) +# define DPE_USE_DOUBLE +#endif + +#if defined(DPE_USE_DOUBLE) && defined(DPE_USE_LONGDOUBLE) +# error "Either DPE_USE_DOUBLE or DPE_USE_LONGDOUBLE shall be defined." +#elif defined(DPE_USE_DOUBLE) && defined(DPE_USE_USE_FLOAT128) +# error "Either DPE_USE_DOUBLE or DPE_USE_FLOAT128 shall be defined." +#elif defined(DPE_USE_LONG_DOUBLE) && defined(DPE_USE_USE_FLOAT128) +# error "Either DPE_USE_LONG_DOUBLE or DPE_USE_FLOAT128 shall be defined." +#endif + +#if (defined(__i386) || defined (__x86_64)) && !defined(DPE_LITTLEENDIAN32) && defined(DPE_USE_DOUBLE) +# define DPE_LITTLEENDIAN32 +#endif + +#if (defined(__STDC_VERSION__) && (__STDC_VERSION__>=199901L)) || defined (__GLIBC__) +# define DPE_DEFINE_ROUND_TRUNC +#endif + +#if defined(__GNUC__) && (__GNUC__ *10 + __GNUC_MINOR__) >= 43 +# define DPE_ISFINITE __builtin_isfinite +#elif defined(isfinite) +# define DPE_ISFINITE isfinite /* new C99 function */ +#else +# define DPE_ISFINITE finite /* obsolete BSD function */ +#endif + +/* DPE_LDEXP(DPE_DOUBLE m, DPEEXP e) return x = m * 2^e */ +/* DPE_FREXP(DPE_DOUBLE x, DPEEXP *e) returns m, e such that x = m * 2^e with + 1/2 <= m < 1 */ +/* DPE_ROUND(DPE_DOUBLE x) returns the nearest integer to x */ +#if defined(DPE_USE_DOUBLE) +# define DPE_DOUBLE double /* mantissa type */ +# define DPE_BITSIZE 53 /* bitsize of DPE_DOUBLE */ +# define DPE_2_POW_BITSIZE 0x1P53 +# if defined(__GNUC__) && (__GNUC__ *10 + __GNUC_MINOR__) >= 40 +# define DPE_LDEXP __builtin_ldexp +# define DPE_FREXP __builtin_frexp +# define DPE_FLOOR __builtin_floor +# define DPE_CEIL __builtin_ceil +# ifdef DPE_DEFINE_ROUND_TRUNC +# define DPE_ROUND __builtin_round +# define DPE_TRUNC __builtin_trunc +# endif +# else +# define DPE_LDEXP ldexp +# define DPE_FREXP frexp +# define DPE_FLOOR floor +# define DPE_CEIL ceil +# ifdef DPE_DEFINE_ROUND_TRUNC +# define DPE_ROUND round +# define DPE_TRUNC trunc +# endif +# endif + +#elif defined(DPE_USE_LONGDOUBLE) +# define DPE_DOUBLE long double +# define DPE_BITSIZE 64 +# define DPE_2_POW_BITSIZE 0x1P64 +# define DPE_LDEXP ldexpl +# define DPE_FREXP frexpl +# define DPE_FLOOR floorl +# define DPE_CEIL ceill +# ifdef DPE_DEFINE_ROUND_TRUNC +# define DPE_ROUND roundl +# define DPE_TRUNC truncl +# endif + +#elif defined(DPE_USE_FLOAT128) +# include "quadmath.h" +# define DPE_DOUBLE __float128 +# define DPE_BITSIZE 113 +# define DPE_2_POW_BITSIZE 0x1P113 +# define DPE_LDEXP ldexpq +# define DPE_FLOOR floorq +# define DPE_CEIL ceilq +# define DPE_FREXP frexpq +# ifdef DPE_DEFINE_ROUND_TRUNC +# define DPE_ROUND roundq +# define DPE_TRUNC truncq +# endif + +#else +# error "neither DPE_USE_DOUBLE, nor DPE_USE_LONGDOUBLE, nor DPE_USE_FLOAT128 is defined" +#endif + +/* If no C99, do what we can */ +#ifndef DPE_DEFINE_ROUND_TRUNC +# define DPE_ROUND(x) ((DPE_DOUBLE) ((long long) ((x) + ((x) >= 0.0 ? 0.5 : -0.5)))) +# define DPE_TRUNC(x) ((DPE_DOUBLE) ((long long) ((x) + 0.0))) +#endif + +#if defined(DPE_USE_LONG) +# define DPE_EXP_T long /* exponent type */ +# define DPE_EXPMIN LONG_MIN /* smallest possible exponent */ +#elif defined(DPE_USE_LONGLONG) +# define DPE_EXP_T long long +# define DPE_EXPMIN LLONG_MIN +#else +# define DPE_EXP_T int /* exponent type */ +# define DPE_EXPMIN INT_MIN /* smallest possible exponent */ +#endif + +#ifdef DPE_LITTLEENDIAN32 +typedef union +{ + double d; +#if INT_MAX == 0x7FFFFFFFL + int i[2]; +#elif LONG_MAX == 0x7FFFFFFFL + long i[2]; +#elif SHRT_MAX == 0x7FFFFFFFL + short i[2]; +#else +# error Cannot find a 32 bits integer type. +#endif +} dpe_double_words; +#endif + +typedef struct +{ + DPE_DOUBLE d; /* significand */ + DPE_EXP_T exp; /* exponent */ +} dpe_struct; + +typedef dpe_struct dpe_t[1]; + +#define DPE_MANT(x) ((x)->d) +#define DPE_EXP(x) ((x)->exp) +#define DPE_SIGN(x) ((DPE_MANT(x) < 0.0) ? -1 : (DPE_MANT(x) > 0.0)) + +#define DPE_INLINE static inline + +/* initialize */ +DPE_INLINE void +dpe_init (dpe_t x DPE_UNUSED_ATTR) +{ +} + +/* clear */ +DPE_INLINE void +dpe_clear (dpe_t x DPE_UNUSED_ATTR) +{ +} + +/* set x to y */ +DPE_INLINE void +dpe_set (dpe_t x, dpe_t y) +{ + DPE_MANT(x) = DPE_MANT(y); + DPE_EXP(x) = DPE_EXP(y); +} + +/* set x to -y */ +DPE_INLINE void +dpe_neg (dpe_t x, dpe_t y) +{ + DPE_MANT(x) = -DPE_MANT(y); + DPE_EXP(x) = DPE_EXP(y); +} + +/* set x to |y| */ +DPE_INLINE void +dpe_abs (dpe_t x, dpe_t y) +{ + DPE_MANT(x) = (DPE_MANT(y) >= 0) ? DPE_MANT(y) : -DPE_MANT(y); + DPE_EXP(x) = DPE_EXP(y); +} + +/* set mantissa in [1/2, 1), except for 0 which has minimum exponent */ +/* FIXME: don't inline this function yet ? */ +static void +dpe_normalize (dpe_t x) +{ + if (DPE_UNLIKELY (DPE_MANT(x) == 0.0 || DPE_ISFINITE (DPE_MANT(x)) == 0)) + { + if (DPE_MANT(x) == 0.0) + DPE_EXP(x) = DPE_EXPMIN; + /* otherwise let the exponent of NaN, Inf unchanged */ + } + else + { + DPE_EXP_T e; +#ifdef DPE_LITTLEENDIAN32 /* 32-bit little endian */ + dpe_double_words dw; + dw.d = DPE_MANT(x); + e = (dw.i[1] >> 20) & 0x7FF; /* unbiased exponent, 1022 for m=1/2 */ + DPE_EXP(x) += e - 1022; + dw.i[1] = (dw.i[1] & 0x800FFFFF) | 0x3FE00000; + DPE_MANT(x) = dw.d; +#else /* portable code */ + double m = DPE_MANT(x); + DPE_MANT(x) = DPE_FREXP (m, &e); + DPE_EXP(x) += e; +#endif + } +} + +#if defined(DPE_USE_DOUBLE) +static const double dpe_scale_tab[54] = { + 0x1P0, 0x1P-1, 0x1P-2, 0x1P-3, 0x1P-4, 0x1P-5, 0x1P-6, 0x1P-7, 0x1P-8, + 0x1P-9, 0x1P-10, 0x1P-11, 0x1P-12, 0x1P-13, 0x1P-14, 0x1P-15, 0x1P-16, + 0x1P-17, 0x1P-18, 0x1P-19, 0x1P-20, 0x1P-21, 0x1P-22, 0x1P-23, 0x1P-24, + 0x1P-25, 0x1P-26, 0x1P-27, 0x1P-28, 0x1P-29, 0x1P-30, 0x1P-31, 0x1P-32, + 0x1P-33, 0x1P-34, 0x1P-35, 0x1P-36, 0x1P-37, 0x1P-38, 0x1P-39, 0x1P-40, + 0x1P-41, 0x1P-42, 0x1P-43, 0x1P-44, 0x1P-45, 0x1P-46, 0x1P-47, 0x1P-48, + 0x1P-49, 0x1P-50, 0x1P-51, 0x1P-52, 0x1P-53}; +#endif + +DPE_INLINE DPE_DOUBLE +dpe_scale (DPE_DOUBLE d, int s) +{ + /* -DPE_BITSIZE < s <= 0 and 1/2 <= d < 1 */ +#if defined(DPE_USE_DOUBLE) + return d * dpe_scale_tab [-s]; +#else /* portable code */ + return DPE_LDEXP (d, s); +#endif +} + +/* set x to y */ +DPE_INLINE void +dpe_set_d (dpe_t x, double y) +{ + DPE_MANT(x) = (DPE_DOUBLE) y; + DPE_EXP(x) = 0; + dpe_normalize (x); +} + +/* set x to y */ +DPE_INLINE void +dpe_set_ld (dpe_t x, long double y) +{ + DPE_MANT(x) = (DPE_DOUBLE) y; + DPE_EXP(x) = 0; + dpe_normalize (x); +} + +/* set x to y */ +DPE_INLINE void +dpe_set_ui (dpe_t x, unsigned long y) +{ + DPE_MANT(x) = (DPE_DOUBLE) y; + DPE_EXP(x) = 0; + dpe_normalize (x); +} + +/* set x to y */ +DPE_INLINE void +dpe_set_si (dpe_t x, long y) +{ + DPE_MANT(x) = (DPE_DOUBLE) y; + DPE_EXP(x) = 0; + dpe_normalize (x); +} + +DPE_INLINE long +dpe_get_si (dpe_t x) +{ + DPE_DOUBLE d = DPE_LDEXP (DPE_MANT (x), DPE_EXP (x)); + return (long) d; +} + +DPE_INLINE unsigned long +dpe_get_ui (dpe_t x) +{ + DPE_DOUBLE d = DPE_LDEXP (DPE_MANT (x), DPE_EXP (x)); + return (d < 0.0) ? 0 : (unsigned long) d; +} + +DPE_INLINE double +dpe_get_d (dpe_t x) +{ + return DPE_LDEXP (DPE_MANT (x), DPE_EXP (x)); +} + +DPE_INLINE long double +dpe_get_ld (dpe_t x) +{ + return DPE_LDEXP (DPE_MANT (x), DPE_EXP (x)); +} + +#if defined(__GMP_H__) || defined(__MINI_GMP_H__) +/* set x to y */ +DPE_INLINE void +dpe_set_z (dpe_t x, mpz_t y) +{ + long e; + DPE_MANT(x) = mpz_get_d_2exp (&e, y); + DPE_EXP(x) = (DPE_EXP_T) e; +} + +/* set x to y, rounded to nearest */ +DPE_INLINE void +dpe_get_z (mpz_t x, dpe_t y) +{ + DPE_EXP_T ey = DPE_EXP(y); + if (ey >= DPE_BITSIZE) /* y is an integer */ + { + DPE_DOUBLE d = DPE_MANT(y) * DPE_2_POW_BITSIZE; /* d is an integer */ + mpz_set_d (x, d); /* should be exact */ + mpz_mul_2exp (x, x, (unsigned long) ey - DPE_BITSIZE); + } + else /* DPE_EXP(y) < DPE_BITSIZE */ + { + if (DPE_UNLIKELY (ey < 0)) /* |y| < 1/2 */ + mpz_set_ui (x, 0); + else + { + DPE_DOUBLE d = DPE_LDEXP(DPE_MANT(y), ey); + mpz_set_d (x, (double) DPE_ROUND(d)); + } + } +} + +/* return e and x such that y = x*2^e */ +DPE_INLINE mp_exp_t +dpe_get_z_exp (mpz_t x, dpe_t y) +{ + mpz_set_d (x, DPE_MANT (y) * DPE_2_POW_BITSIZE); + return DPE_EXP(y) - DPE_BITSIZE; +} +#endif + +/* x <- y + z, assuming y and z are normalized, returns x normalized */ +DPE_INLINE void +dpe_add (dpe_t x, dpe_t y, dpe_t z) +{ + if (DPE_UNLIKELY (DPE_EXP(y) > DPE_EXP(z) + DPE_BITSIZE)) + /* |z| < 1/2*ulp(y), thus o(y+z) = y */ + dpe_set (x, y); + else if (DPE_UNLIKELY (DPE_EXP(z) > DPE_EXP(y) + DPE_BITSIZE)) + dpe_set (x, z); + else + { + DPE_EXP_T d = DPE_EXP(y) - DPE_EXP(z); /* |d| <= DPE_BITSIZE */ + + if (d >= 0) + { + DPE_MANT(x) = DPE_MANT(y) + dpe_scale (DPE_MANT(z), -d); + DPE_EXP(x) = DPE_EXP(y); + } + else + { + DPE_MANT(x) = DPE_MANT(z) + dpe_scale (DPE_MANT(y), d); + DPE_EXP(x) = DPE_EXP(z); + } + dpe_normalize (x); + } +} + +/* x <- y - z, assuming y and z are normalized, returns x normalized */ +DPE_INLINE void +dpe_sub (dpe_t x, dpe_t y, dpe_t z) +{ + if (DPE_UNLIKELY (DPE_EXP(y) > DPE_EXP(z) + DPE_BITSIZE)) + /* |z| < 1/2*ulp(y), thus o(y-z) = y */ + dpe_set (x, y); + else if (DPE_UNLIKELY (DPE_EXP(z) > DPE_EXP(y) + DPE_BITSIZE)) + dpe_neg (x, z); + else + { + DPE_EXP_T d = DPE_EXP(y) - DPE_EXP(z); /* |d| <= DPE_BITSIZE */ + + if (d >= 0) + { + DPE_MANT(x) = DPE_MANT(y) - dpe_scale (DPE_MANT(z), -d); + DPE_EXP(x) = DPE_EXP(y); + } + else + { + DPE_MANT(x) = dpe_scale (DPE_MANT(y), d) - DPE_MANT(z); + DPE_EXP(x) = DPE_EXP(z); + } + dpe_normalize (x); + } +} + +/* x <- y * z, assuming y and z are normalized, returns x normalized */ +DPE_INLINE void +dpe_mul (dpe_t x, dpe_t y, dpe_t z) +{ + DPE_MANT(x) = DPE_MANT(y) * DPE_MANT(z); + DPE_EXP(x) = DPE_EXP(y) + DPE_EXP(z); + dpe_normalize (x); +} + +/* x <- sqrt(y), assuming y is normalized, returns x normalized */ +DPE_INLINE void +dpe_sqrt (dpe_t x, dpe_t y) +{ + DPE_EXP_T ey = DPE_EXP(y); + if (ey % 2) + { + /* since 1/2 <= my < 1, 1/4 <= my/2 < 1 */ + DPE_MANT(x) = sqrt (0.5 * DPE_MANT(y)); + DPE_EXP(x) = (ey + 1) / 2; + } + else + { + DPE_MANT(x) = sqrt (DPE_MANT(y)); + DPE_EXP(x) = ey / 2; + } +} + +/* x <- y / z, assuming y and z are normalized, returns x normalized. + Assumes z is not zero. */ +DPE_INLINE void +dpe_div (dpe_t x, dpe_t y, dpe_t z) +{ + DPE_MANT(x) = DPE_MANT(y) / DPE_MANT(z); + DPE_EXP(x) = DPE_EXP(y) - DPE_EXP(z); + dpe_normalize (x); +} + +/* x <- y * z, assuming y normalized, returns x normalized */ +DPE_INLINE void +dpe_mul_ui (dpe_t x, dpe_t y, unsigned long z) +{ + DPE_MANT(x) = DPE_MANT(y) * (DPE_DOUBLE) z; + DPE_EXP(x) = DPE_EXP(y); + dpe_normalize (x); +} + +/* x <- y / z, assuming y normalized, z non-zero, returns x normalized */ +DPE_INLINE void +dpe_div_ui (dpe_t x, dpe_t y, unsigned long z) +{ + DPE_MANT(x) = DPE_MANT(y) / (DPE_DOUBLE) z; + DPE_EXP(x) = DPE_EXP(y); + dpe_normalize (x); +} + +/* x <- y * 2^e */ +DPE_INLINE void +dpe_mul_2exp (dpe_t x, dpe_t y, unsigned long e) +{ + DPE_MANT(x) = DPE_MANT(y); + DPE_EXP(x) = DPE_EXP(y) + (DPE_EXP_T) e; +} + +/* x <- y / 2^e */ +DPE_INLINE void +dpe_div_2exp (dpe_t x, dpe_t y, unsigned long e) +{ + DPE_MANT(x) = DPE_MANT(y); + DPE_EXP(x) = DPE_EXP(y) - (DPE_EXP_T) e; +} + +/* return e and x such that y = x*2^e (equality is not guaranteed if the 'long' + type has fewer bits than the significand in dpe_t) */ +DPE_INLINE DPE_EXP_T +dpe_get_si_exp (long *x, dpe_t y) +{ + if (sizeof(long) == 4) /* 32-bit word: long has 31 bits */ + { + *x = (long) (DPE_MANT(y) * 2147483648.0); + return DPE_EXP(y) - 31; + } + else if (sizeof(long) == 8) /* 64-bit word: long has 63 bits */ + { + *x = (long) (DPE_MANT (y) * 9223372036854775808.0); + return DPE_EXP(y) - 63; + } + else + { + fprintf (stderr, "Error, neither 32-bit nor 64-bit word\n"); + exit (1); + } +} + +static DPE_UNUSED_ATTR int dpe_str_prec = 16; +static int dpe_out_str (FILE *s, int base, dpe_t x) DPE_UNUSED_ATTR; + +static int +dpe_out_str (FILE *s, int base, dpe_t x) +{ + DPE_DOUBLE d = DPE_MANT(x); + DPE_EXP_T e2 = DPE_EXP(x); + int e10 = 0; + char sign = ' '; + if (DPE_UNLIKELY (base != 10)) + { + fprintf (stderr, "Error in dpe_out_str, only base 10 allowed\n"); + exit (1); + } + if (d == 0.0) +#ifdef DPE_USE_DOUBLE + return fprintf (s, "%1.*f", dpe_str_prec, d); +#else + return fprintf (s, "%1.*Lf", dpe_str_prec, (long double) d); +#endif + if (d < 0) + { + d = -d; + sign = '-'; + } + if (e2 > 0) + { + while (e2 > 0) + { + e2 --; + d *= 2.0; + if (d >= 10.0) + { + d /= 10.0; + e10 ++; + } + } + } + else /* e2 <= 0 */ + { + while (e2 < 0) + { + e2 ++; + d /= 2.0; + if (d < 1.0) + { + d *= 10.0; + e10 --; + } + } + } +#ifdef DPE_USE_DOUBLE + return fprintf (s, "%c%1.*f*10^%d", sign, dpe_str_prec, d, e10); +#else + return fprintf (s, "%c%1.*Lf*10^%d", sign, dpe_str_prec, (long double) d, e10); +#endif +} + +static size_t dpe_inp_str (dpe_t x, FILE *s, int base) DPE_UNUSED_ATTR; + +static size_t +dpe_inp_str (dpe_t x, FILE *s, int base) +{ + size_t res; + DPE_DOUBLE d; + if (DPE_UNLIKELY (base != 10)) + { + fprintf (stderr, "Error in dpe_out_str, only base 10 allowed\n"); + exit (1); + } +#ifdef DPE_USE_DOUBLE + res = fscanf (s, "%lf", &d); +#elif defined(DPE_USE_LONGDOUBLE) + res = fscanf (s, "%Lf", &d); +#else + { + long double d_ld; + res = fscanf (s, "%Lf", &d_ld); + d = d_ld; + } +#endif + dpe_set_d (x, d); + return res; +} + +DPE_INLINE void +dpe_dump (dpe_t x) +{ + dpe_out_str (stdout, 10, x); + putchar ('\n'); +} + +DPE_INLINE int +dpe_zero_p (dpe_t x) +{ + return DPE_MANT (x) == 0; +} + +/* return a positive value if x > y + a negative value if x < y + and 0 otherwise (x=y). */ +DPE_INLINE int +dpe_cmp (dpe_t x, dpe_t y) +{ + int sx = DPE_SIGN(x); + int d = sx - DPE_SIGN(y); + + if (d != 0) + return d; + else if (DPE_EXP(x) > DPE_EXP(y)) + return (sx > 0) ? 1 : -1; + else if (DPE_EXP(y) > DPE_EXP(x)) + return (sx > 0) ? -1 : 1; + else /* DPE_EXP(x) = DPE_EXP(y) */ + return (DPE_MANT(x) < DPE_MANT(y)) ? -1 : (DPE_MANT(x) > DPE_MANT(y)); +} + +DPE_INLINE int +dpe_cmp_d (dpe_t x, double d) +{ + dpe_t y; + dpe_set_d (y, d); + return dpe_cmp (x, y); +} + +DPE_INLINE int +dpe_cmp_ui (dpe_t x, unsigned long d) +{ + dpe_t y; + dpe_set_ui (y, d); + return dpe_cmp (x, y); +} + +DPE_INLINE int +dpe_cmp_si (dpe_t x, long d) +{ + dpe_t y; + dpe_set_si (y, d); + return dpe_cmp (x, y); +} + +/* set x to integer nearest to y */ +DPE_INLINE void +dpe_round (dpe_t x, dpe_t y) +{ + if (DPE_EXP(y) < 0) /* |y| < 1/2 */ + dpe_set_ui (x, 0); + else if (DPE_EXP(y) >= DPE_BITSIZE) /* y is an integer */ + dpe_set (x, y); + else + { + DPE_DOUBLE d; + d = DPE_LDEXP(DPE_MANT(y), DPE_EXP(y)); + dpe_set_d (x, DPE_ROUND(d)); + } +} + +/* set x to the fractional part of y, defined as y - trunc(y), thus the + fractional part has absolute value in [0, 1), and same sign as y */ +DPE_INLINE void +dpe_frac (dpe_t x, dpe_t y) +{ + /* If |y| is smaller than 1, keep it */ + if (DPE_EXP(y) <= 0) + dpe_set (x, y); + else if (DPE_EXP(y) >= DPE_BITSIZE) /* y is an integer */ + dpe_set_ui (x, 0); + else + { + DPE_DOUBLE d; + d = DPE_LDEXP(DPE_MANT(y), DPE_EXP(y)); + dpe_set_d (x, d - DPE_TRUNC(d)); + } +} + +/* set x to largest integer <= y */ +DPE_INLINE void +dpe_floor (dpe_t x, dpe_t y) +{ + if (DPE_EXP(y) <= 0) /* |y| < 1 */ + { + if (DPE_SIGN(y) >= 0) /* 0 <= y < 1 */ + dpe_set_ui (x, 0); + else /* -1 < y < 0 */ + dpe_set_si (x, -1); + } + else if (DPE_EXP(y) >= DPE_BITSIZE) /* y is an integer */ + dpe_set (x, y); + else + { + DPE_DOUBLE d; + d = DPE_LDEXP(DPE_MANT(y), DPE_EXP(y)); + dpe_set_d (x, DPE_FLOOR(d)); + } +} + +/* set x to smallest integer >= y */ +DPE_INLINE void +dpe_ceil (dpe_t x, dpe_t y) +{ + if (DPE_EXP(y) <= 0) /* |y| < 1 */ + { + if (DPE_SIGN(y) > 0) /* 0 < y < 1 */ + dpe_set_ui (x, 1); + else /* -1 < y <= 0 */ + dpe_set_si (x, 0); + } + else if (DPE_EXP(y) >= DPE_BITSIZE) /* y is an integer */ + dpe_set (x, y); + else + { + DPE_DOUBLE d; + d = DPE_LDEXP(DPE_MANT(y), DPE_EXP(y)); + dpe_set_d (x, DPE_CEIL(d)); + } +} + +DPE_INLINE void +dpe_swap (dpe_t x, dpe_t y) +{ + DPE_EXP_T i = DPE_EXP (x); + DPE_DOUBLE d = DPE_MANT (x); + DPE_EXP (x) = DPE_EXP (y); + DPE_MANT (x) = DPE_MANT (y); + DPE_EXP (y) = i; + DPE_MANT (y) = d; +} + +#endif /* __DPE */ diff --git a/src/quaternion/ref/generic/internal_quaternion_headers/hnf_internal.h b/src/quaternion/ref/generic/internal_quaternion_headers/hnf_internal.h new file mode 100644 index 0000000..5ecc871 --- /dev/null +++ b/src/quaternion/ref/generic/internal_quaternion_headers/hnf_internal.h @@ -0,0 +1,94 @@ +/** @file + * + * @authors Sina Schaeffler + * + * @brief Declarations for functions internal to the HNF computation and its tests + */ + +#ifndef QUAT_HNF_HELPERS_H +#define QUAT_HNF_HELPERS_H + +#include + +/** @internal + * @ingroup quat_helpers + * @defgroup quat_hnf_helpers Internal functions for the HNF computation and tests + */ + +/** @internal + * @ingroup quat_hnf_helpers + * @defgroup quat_hnf_helpers_ibz Internal renamed GMP functions for the HNF computation + */ + +/** + * @brief GCD and Bézout coefficients u, v such that ua + bv = gcd + * + * @param gcd Output: Set to the gcd of a and b + * @param u Output: integer such that ua+bv=gcd + * @param v Output: Integer such that ua+bv=gcd + * @param a + * @param b + */ +void ibz_xgcd(ibz_t *gcd, + ibz_t *u, + ibz_t *v, + const ibz_t *a, + const ibz_t *b); // integers, dim4, test/integers, test/dim4 + +/** @} + */ + +/** @internal + * @ingroup quat_hnf_helpers + * @defgroup quat_hnf_integer_helpers Integer functions internal to the HNF computation and tests + * @{ + */ + +/** @brief x mod mod, with x in [1,mod] + * + * @param res Output: res = x [mod] and 0 0 + */ +void ibz_mod_not_zero(ibz_t *res, const ibz_t *x, const ibz_t *mod); + +/** @brief x mod mod, with x in ]-mod/2,mod/2] + * + * Centered and rather positive then negative. + * + * @param remainder Output: remainder = x [mod] and -mod/2 0 + */ +void ibz_centered_mod(ibz_t *remainder, const ibz_t *a, const ibz_t *mod); + +/** @brief if c then x else y + * + * @param res Output: if c, res = x, else res = y + * @param x + * @param y + * @param c condition: must be 0 or 1 + */ +void ibz_conditional_assign(ibz_t *res, const ibz_t *x, const ibz_t *y, int c); + +/** @brief d = gcd(x,y)>0 and d = ux+vy and u!= 0 and d>0 and u, v of small absolute value, u not 0 + * + * More precisely: + * If x and y are both non 0, -|xy|/d= 0, b >= 0 and a < b + * @returns 1 on success, 0 on failiure + */ +int ibz_rand_interval_i(ibz_t *rand, int32_t a, int32_t b); + +/** @brief generate random value in [-2^m, 2^m] + * assumed that m > 0 and bitlength of m < 32 bit + * @returns 1 on success, 0 on failiure + */ +int ibz_rand_interval_bits(ibz_t *rand, uint32_t m); + +/** @brief set str to a string containing the representation of i in base + * + * Base should be 10 or 16 + * + * str should be an array of length enough to store the representation of in + * in base, which can be obtained by ibz_sizeinbase(i, base) + 2, where the 2 + * is for the sign and the null terminator + * + * Case for base 16 does not matter + * + * @returns 1 if the integer could be converted to a string, 0 otherwise + */ +int ibz_convert_to_str(const ibz_t *i, char *str, int base); + +/** @brief print num in base to stdout + * + * Base should be 10 or 16 + */ +void ibz_print(const ibz_t *num, int base); + +/** @brief set i to integer contained in string when read as number in base + * + * Base should be 10 or 16, and the number should be written without ponctuation or whitespaces + * + * Case for base 16 does not matter + * + * @returns 1 if the string could be converted to an integer, 0 otherwise + */ +int ibz_set_from_str(ibz_t *i, const char *str, int base); + +/** + * @brief Probabilistic primality test + * + * @param n The number to test + * @param reps Number of Miller-Rabin repetitions. The more, the slower and the less likely are + * false positives + * @return 1 if probably prime, 0 if certainly not prime, 2 if certainly prime + * + * Using GMP's implementation: + * + * From GMP's documentation: "This function performs some trial divisions, a Baillie-PSW probable + * prime test, then reps-24 Miller-Rabin probabilistic primality tests." + */ +int ibz_probab_prime(const ibz_t *n, int reps); + +/** + * @brief Square root modulo a prime + * + * @returns 1 if square root of a mod p exists and was computed, 0 otherwise + * @param sqrt Output: Set to a square root of a mod p if any exist + * @param a number of which a square root mod p is searched + * @param p assumed prime + */ +int ibz_sqrt_mod_p(ibz_t *sqrt, const ibz_t *a, const ibz_t *p); + +/** + * @brief Integer square root of a perfect square + * + * @returns 1 if an integer square root of a exists and was computed, 0 otherwise + * @param sqrt Output: Set to a integer square root of a if any exist + * @param a number of which an integer square root is searched + */ +int ibz_sqrt(ibz_t *sqrt, const ibz_t *a); + +/** + * @brief Legendre symbol of a mod p + * + * @returns Legendre symbol of a mod p + * @param a + * @param p assumed prime + * + * Uses GMP's implementation + * + * If output is 1, a is a square mod p, if -1, not. If 0, it is divisible by p + */ +int ibz_legendre(const ibz_t *a, const ibz_t *p); + +/** @} + */ + +// end of ibz_all +/** @} + */ +#endif diff --git a/src/quaternion/ref/generic/internal_quaternion_headers/internal.h b/src/quaternion/ref/generic/internal_quaternion_headers/internal.h new file mode 100644 index 0000000..edbba34 --- /dev/null +++ b/src/quaternion/ref/generic/internal_quaternion_headers/internal.h @@ -0,0 +1,812 @@ +/** @file + * + * @authors Sina Schaeffler + * + * @brief Declarations for helper functions for quaternion algebra implementation + */ + +#ifndef QUAT_HELPER_H +#define QUAT_HELPER_H + +#include +#include +#include "intbig_internal.h" + +/** @internal + * @ingroup quat_quat + * @defgroup quat_helpers Quaternion module internal functions + * @{ + */ + +/** @internal + * @defgroup quat_alg_helpers Helper functions for the alg library + * @{ + */ + +/** @internal + * @brief helper function for initializing small quaternion algebras. + */ +void quat_alg_init_set_ui(quat_alg_t *alg, + unsigned int p); // test/lattice, test/ideal, test/algebra + +/** @brief a*b + * + * Multiply two coordinate vectors as elements of the algebra in basis (1,i,j,ij) with i^2 = -1, j^2 + * = -p + * + * @param res Output: Will contain product + * @param a + * @param b + * @param alg The quaternion algebra + */ +void quat_alg_coord_mul(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b, const quat_alg_t *alg); + +/** @brief a=b + * + * Test if a and b represent the same quaternion algebra element + * + * @param a + * @param b + * @returns 1 if a=b, 0 otherwise + */ +int quat_alg_elem_equal(const quat_alg_elem_t *a, const quat_alg_elem_t *b); + +/** @brief Test if x is 0 + * + * @returns 1 if x=0, 0 otherwise + * + * x is 0 iff all coordinates in x->coord are 0 + */ +int quat_alg_elem_is_zero(const quat_alg_elem_t *x); + +/** @brief Compute same denominator form of two quaternion algebra elements + * + * res_a=a and res_b=b (representing the same element) and res_a.denom = res_b.denom + * + * @param res_a + * @param res_b + * @param a + * @param b + */ +void quat_alg_equal_denom(quat_alg_elem_t *res_a, + quat_alg_elem_t *res_b, + const quat_alg_elem_t *a, + const quat_alg_elem_t *b); + +/** @brief Copies the given values into an algebra element, without normalizing it + * + * @param elem Output: algebra element of coordinates [coord0,coord1,coord2,coord3] and denominator + * denom + * @param denom Denominator, must be non zero + * @param coord0 Coordinate on 1 (0th vector of standard algebra basis) + * @param coord1 Coordinate on i (1st vector of standard algebra basis) + * @param coord2 Coordinate on j (2nd vector of standard algebra basis) + * @param coord3 Coordinate on ij (3rd vector of standard algebra basis) + */ +void quat_alg_elem_copy_ibz(quat_alg_elem_t *elem, + const ibz_t *denom, + const ibz_t *coord0, + const ibz_t *coord1, + const ibz_t *coord2, + const ibz_t *coord3); + +/** @brief Sets an algebra element to the given integer values, without normalizing it + * + * @param elem Output: algebra element of coordinates [coord0,coord1,coord2,coord3] and denominator + * denom + * @param denom Denominator, must be non zero + * @param coord0 Coordinate on 1 (0th vector of standard algebra basis) + * @param coord1 Coordinate on i (1st vector of standard algebra basis) + * @param coord2 Coordinate on j (2nd vector of standard algebra basis) + * @param coord3 Coordinate on ij (3rd vector of standard algebra basis) + */ +void quat_alg_elem_set(quat_alg_elem_t *elem, + int32_t denom, + int32_t coord0, + int32_t coord1, + int32_t coord2, + int32_t coord3); + +/** + * @brief Creates algebra element from scalar + * + * Resulting element has 1-coordinate equal to numerator/denominator + * + * @param elem Output: algebra element with numerator/denominator as first coordiante + * (1-coordinate), 0 elsewhere (i,j,ij coordinates) + * @param numerator + * @param denominator Assumed non zero + */ +void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator); + +/** @brief a+b for algebra elements + * + * @param res Output + * @param a Algebra element + * @param b Algebra element + */ +void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); + +/** @brief a-b for algebra elements + * + * @param res Output + * @param a Algebra element + * @param b Algebra element + */ +void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); + +/** @brief Multiplies algebra element by integer scalar, without normalizing it + * + * @param res Output + * @param scalar Integer + * @param elem Algebra element + */ +void quat_alg_elem_mul_by_scalar(quat_alg_elem_t *res, const ibz_t *scalar, const quat_alg_elem_t *elem); + +/** @} + */ + +/** @internal + * @defgroup quat_dim4_helpers Helper functions for functions for matrices or vectors in dimension 4 + * @{ + */ + +/** @internal + * @defgroup quat_inv_helpers Helper functions for the integer matrix inversion function + * @{ + */ + +/** @brief a1a2+b1b2+c1c2 + * + * @param coeff Output: The coefficien which was computed as a1a2+b1b2-c1c2 + * @param a1 + * @param a2 + * @param b1 + * @param b2 + * @param c1 + * @param c2 + */ +void ibz_inv_dim4_make_coeff_pmp(ibz_t *coeff, + const ibz_t *a1, + const ibz_t *a2, + const ibz_t *b1, + const ibz_t *b2, + const ibz_t *c1, + const ibz_t *c2); + +/** @brief -a1a2+b1b2-c1c2 + * + * @param coeff Output: The coefficien which was computed as -a1a2+b1b2-c1c2 + * @param a1 + * @param a2 + * @param b1 + * @param b2 + * @param c1 + * @param c2 + */ +void ibz_inv_dim4_make_coeff_mpm(ibz_t *coeff, + const ibz_t *a1, + const ibz_t *a2, + const ibz_t *b1, + const ibz_t *b2, + const ibz_t *c1, + const ibz_t *c2); + +/** @brief Matrix determinant and a matrix inv such that inv/det is the inverse matrix of the input + * + * Implemented following the methof of 2x2 minors explained at Method from + * https://www.geometrictools.com/Documentation/LaplaceExpansionTheorem.pdf (visited on 3rd of May + * 2023, 16h15 CEST) + * + * @returns 1 if the determinant of mat is not 0 and an inverse was computed, 0 otherwise + * @param inv Output: Will contain an integer matrix which, dividet by det, will yield the rational + * inverse of the matrix if it exists, can be NULL + * @param det Output: Will contain the determinant of the input matrix, can be NULL + * @param mat Matrix of which the inverse will be computed + */ +int ibz_mat_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t *mat); + +/** @} + */ + +/** @internal + * @defgroup quat_dim4_lat_helpers Helper functions on vectors and matrices used mainly for lattices + * @{ + */ + +/** @brief Copy all values from one vector to another + * + * @param new Output: is set to same values as vec + * @param vec + */ +void ibz_vec_4_copy(ibz_vec_4_t *new, const ibz_vec_4_t *vec); + +/** @brief set res to values coord0,coord1,coord2,coord3 + * + * @param res Output: Will contain vector (coord0,coord1,coord2,coord3) + * @param coord0 + * @param coord1 + * @param coord2 + * @param coord3 + */ +void ibz_vec_4_copy_ibz(ibz_vec_4_t *res, + const ibz_t *coord0, + const ibz_t *coord1, + const ibz_t *coord2, + const ibz_t *coord3); + +/** @brief Set a vector of 4 integers to given values + * + * @param vec Output: is set to given coordinates + * @param coord0 + * @param coord1 + * @param coord2 + * @param coord3 + */ +void ibz_vec_4_set(ibz_vec_4_t *vec, int32_t coord0, int32_t coord1, int32_t coord2, int32_t coord3); + +/** @brief a+b + * + * Add two integer 4-vectors + * + * @param res Output: Will contain sum + * @param a + * @param b + */ +void ibz_vec_4_add(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b); + +/** @brief a-b + * + * Substract two integer 4-vectors + * + * @param res Output: Will contain difference + * @param a + * @param b + */ +void ibz_vec_4_sub(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b); + +/** @brief x=0 + * + * Test if a vector x has only zero coordinates + * + * @returns 0 if x has at least one non-zero coordinates, 1 otherwise + * @param x + */ +int ibz_vec_4_is_zero(const ibz_vec_4_t *x); + +/** @brief Compute the linear combination lc = coeff_a vec_a + coeff_b vec_b + * + * @param lc Output: linear combination lc = coeff_a vec_a + coeff_b vec_b + * @param coeff_a Scalar multiplied to vec_a + * @param vec_a + * @param coeff_b Scalar multiplied to vec_b + * @param vec_b + */ +void ibz_vec_4_linear_combination(ibz_vec_4_t *lc, + const ibz_t *coeff_a, + const ibz_vec_4_t *vec_a, + const ibz_t *coeff_b, + const ibz_vec_4_t *vec_b); + +/** @brief multiplies all values in vector by same scalar + * + * @param prod Output + * @param scalar + * @param vec + */ +void ibz_vec_4_scalar_mul(ibz_vec_4_t *prod, const ibz_t *scalar, const ibz_vec_4_t *vec); + +/** @brief divides all values in vector by same scalar + * + * @returns 1 if scalar divided all values in mat, 0 otherwise (division is performed in both cases) + * @param quot Output + * @param scalar + * @param vec + */ +int ibz_vec_4_scalar_div(ibz_vec_4_t *quot, const ibz_t *scalar, const ibz_vec_4_t *vec); + +/** @brief Negation for vectors of 4 integers + * + * @param neg Output: is set to -vec + * @param vec + */ +void ibz_vec_4_negate(ibz_vec_4_t *neg, const ibz_vec_4_t *vec); + +/** + * @brief content of a 4-vector of integers + * + * The content is the GCD of all entries. + * + * @param v A 4-vector of integers + * @param content Output: the resulting gcd + */ +void ibz_vec_4_content(ibz_t *content, const ibz_vec_4_t *v); + +/** @brief -mat for mat a 4x4 integer matrix + * + * @param neg Output: is set to -mat + * @param mat Input matrix + */ +void ibz_mat_4x4_negate(ibz_mat_4x4_t *neg, const ibz_mat_4x4_t *mat); + +/** @brief Set all coefficients of a matrix to zero for 4x4 integer matrices + * + * @param zero + */ +void ibz_mat_4x4_zero(ibz_mat_4x4_t *zero); + +/** @brief Set a matrix to the identity for 4x4 integer matrices + * + * @param id + */ +void ibz_mat_4x4_identity(ibz_mat_4x4_t *id); + +/** @brief Test equality to identity for 4x4 integer matrices + * + * @returns 1 if mat is the identity matrix, 0 otherwise + * @param mat + */ +int ibz_mat_4x4_is_identity(const ibz_mat_4x4_t *mat); + +/** @brief Equality test for 4x4 integer matrices + * + * @returns 1 if equal, 0 otherwise + * @param mat1 + * @param mat2 + */ +int ibz_mat_4x4_equal(const ibz_mat_4x4_t *mat1, const ibz_mat_4x4_t *mat2); + +/** @brief Copies all values from a 4x4 integer matrix to another one + * + * @param new Output: matrix which will have its entries set to mat's entries + * @param mat Input matrix + */ +void ibz_mat_4x4_copy(ibz_mat_4x4_t *new, const ibz_mat_4x4_t *mat); + +/** @brief Matrix by integer multiplication + * + * @param prod Output + * @param scalar + * @param mat + */ +void ibz_mat_4x4_scalar_mul(ibz_mat_4x4_t *prod, const ibz_t *scalar, const ibz_mat_4x4_t *mat); + +/** @brief gcd of all values in matrix + * + * @param gcd Output + * @param mat + */ +void ibz_mat_4x4_gcd(ibz_t *gcd, const ibz_mat_4x4_t *mat); + +/** @brief Verifies whether the 4x4 input matrix is in Hermite Normal Form + * + * @returns 1 if mat is in HNF, 0 otherwise + * @param mat Matrix to be tested + */ +int ibz_mat_4x4_is_hnf(const ibz_mat_4x4_t *mat); + +/** @brief Hermite Normal Form of a matrix of 8 integer vectors, computed using a multiple of its + * determinant as modulo + * + * Algorithm used is the one at number 2.4.8 in Henri Cohen's "A Course in Computational Algebraic + * Number Theory" (Springer Verlag, in series "Graduate texts in Mathematics") from 1993 + * + * @param hnf Output: Matrix in Hermite Normal Form generating the same lattice as generators + * @param generators matrix whose colums generate the same lattice than the output + * @param generator_number number of generators given + * @param mod integer, must be a multiple of the volume of the lattice generated by the columns of + * generators + */ +void ibz_mat_4xn_hnf_mod_core(ibz_mat_4x4_t *hnf, + int generator_number, + const ibz_vec_4_t *generators, + const ibz_t *mod); + +/** @} + */ +/** @} + */ + +/** @internal + * @defgroup quat_dim2_helpers Helper functions for dimension 2 + * @{ + */ + +/** @brief Set vector coefficients to the given integers + * + * @param vec Output: Vector + * @param a0 + * @param a1 + */ +void ibz_vec_2_set(ibz_vec_2_t *vec, int a0, int a1); // test/dim2 + +/** @brief Set matrix coefficients to the given integers + * + * @param mat Output: Matrix + * @param a00 + * @param a01 + * @param a10 + * @param a11 + */ +void ibz_mat_2x2_set(ibz_mat_2x2_t *mat, int a00, int a01, int a10, int a11); // test/dim2 + +void ibz_mat_2x2_add(ibz_mat_2x2_t *sum, const ibz_mat_2x2_t *a, + const ibz_mat_2x2_t *b); // unused + +/** @brief Determinant of a 2x2 integer matrix given as 4 integers + * + * @param det Output: Determinant of the matrix + * @param a11 matrix coefficient (upper left corner) + * @param a12 matrix coefficient (upper right corner) + * @param a21 matrix coefficient (lower left corner) + * @param a22 matrix coefficient (lower right corner) + */ +void ibz_mat_2x2_det_from_ibz(ibz_t *det, + const ibz_t *a11, + const ibz_t *a12, + const ibz_t *a21, + const ibz_t *a22); // dim4 + +/** + * @brief a*b for 2x2 integer matrices modulo m + * + * @param prod Output matrix + * @param mat_a Input matrix + * @param mat_b Input matrix + * @param m Integer modulo + */ +void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, + const ibz_mat_2x2_t *mat_a, + const ibz_mat_2x2_t *mat_b, + const ibz_t *m); // test/dim2 +/** @} + */ + +/** @internal + * @defgroup quat_lattice_helper Helper functions for the lattice library (dimension 4) + * @{ + */ + +/** + * @brief Modifies a lattice to put it in hermite normal form + * + * In-place modification of the lattice. + * + * @param lat input lattice + * + * On a correct lattice this function changes nothing (since it is already in HNF), but it can be + * used to put a handmade one in correct form in order to use the other lattice functions. + */ +void quat_lattice_hnf(quat_lattice_t *lat); // lattice, test/lattice, test/algebra, + +/** + * @brief Lattice equality + * + * Lattice bases are assumed to be under HNF, but denominators are free. + * + * @returns 1 if both lattices are equal, 0 otherwise + * @param lat1 + * @param lat2 + */ +int quat_lattice_equal(const quat_lattice_t *lat1, + const quat_lattice_t *lat2); // ideal, lattice, test/lattice, test/ideal + +/** + * @brief Lattice inclusion test + * + * Lattice bases are assumed to be under HNF, but denominators are free. + * + * @returns 1 if sublat is included in overlat, 0 otherwise + * @param sublat Lattice whose inclusion in overlat will be testes + * @param overlat + */ +int quat_lattice_inclusion(const quat_lattice_t *sublat, + const quat_lattice_t *overlat); // test/lattice, test/ideal + +/** @brief Divides basis and denominator of a lattice by their gcd + * + * @param reduced Output + * @param lat Lattice + */ +void quat_lattice_reduce_denom(quat_lattice_t *reduced, + const quat_lattice_t *lat); // lattice, ideal, + +/** @brief a+b for lattices + * + * @param res Output + * @param lat1 Lattice + * @param lat2 Lattice + */ +void quat_lattice_add(quat_lattice_t *res, + const quat_lattice_t *lat1, + const quat_lattice_t *lat2); // ideal, lattice, test/lattice + +/** @brief a*b for lattices + * + * @param res Output + * @param lat1 Lattice + * @param lat2 Lattice + * @param alg The quaternion algebra + */ +void quat_lattice_mul(quat_lattice_t *res, + const quat_lattice_t *lat1, + const quat_lattice_t *lat2, + const quat_alg_t *alg); // ideal, lattie, test/ideal, test/lattice + +/** + * @brief Computes the dual lattice of lat, without putting its basis in HNF + * + * This function returns a lattice not under HNF. For careful internal use only. + * + * Computation method described in https://cseweb.ucsd.edu/classes/sp14/cse206A-a/lec4.pdf consulted + * on 19 of May 2023, 12h40 CEST + * + * @param dual Output: The dual lattice of lat. ATTENTION: is not under HNF. hnf computation must be + * applied before using lattice functions on it + * @param lat lattice, the dual of it will be computed + */ +void quat_lattice_dual_without_hnf(quat_lattice_t *dual, + const quat_lattice_t *lat); // lattice, ideal + +/** + * @brief Multiply all columns of lat with coord (as algebra elements) + * + * The columns and coord are seen as algebra elements in basis 1,i,j,ij, i^2 = -1, j^2 = -p). Coord + * is multiplied to the right of lat. + * + * The output matrix is not under HNF. + * + * @param prod Output: Matrix not under HND whose columns represent the algebra elements obtained as + * L*coord for L column of lat. + * @param lat Matrix whose columns are algebra elements in basis (1,i,j,ij) + * @param coord Integer coordinate algebra element in basis (1,i,j,ij) + * @param alg The quaternion algebra + */ +void quat_lattice_mat_alg_coord_mul_without_hnf(ibz_mat_4x4_t *prod, + const ibz_mat_4x4_t *lat, + const ibz_vec_4_t *coord, + const quat_alg_t *alg); // lattice + +/** @brief The index of sublat into overlat + * + * Assumes inputs are in HNF. + * + * @param index Output + * @param sublat A lattice in HNF, must be sublattice of overlat + * @param overlat A lattice in HNF, must be overlattice of sublat + */ +void quat_lattice_index(ibz_t *index, const quat_lattice_t *sublat, + const quat_lattice_t *overlat); // ideal + +/** @brief Compute the Gram matrix of the quaternion trace bilinear form + * + * Given a lattice of the quaternion algebra, computes the Gram matrix + * of the bilinear form + * + * 〈a,b〉 := [lattice->denom^2] Tr(a·conj(b)) + * + * multiplied by the square of the denominator of the lattice. + * + * This matrix always has integer entries. + * + * @param G Output: Gram matrix of the trace bilinear form on the lattice, multiplied by the square + * of the denominator of the lattice + * @param lattice A lattice + * @param alg The quaternion algebra + */ +void quat_lattice_gram(ibz_mat_4x4_t *G, const quat_lattice_t *lattice, const quat_alg_t *alg); + +/** + * @brief Compute an integer parallelogram containing the ball of + * given radius for the positive definite quadratic form defined by + * the Gram matrix G. + * + * The computed parallelogram is defined by the vectors + * + * (x₁ x₂ x₃ x₄) · U + * + * with x_i ∈ [ -box[i], box[i] ]. + * + * @param box Output: bounds of the parallelogram + * @param U Output: Unimodular transformation defining the parallelogram + * @param G Gram matrix of the quadratic form, must be full rank + * @param radius Radius of the ball, must be non-negative + * @returns 0 if the box only contains the origin, 1 otherwise + */ +int quat_lattice_bound_parallelogram(ibz_vec_4_t *box, ibz_mat_4x4_t *U, const ibz_mat_4x4_t *G, const ibz_t *radius); + +/** @} + */ + +/** @internal + * @defgroup quat_lideal_helper Helper functions for ideals and orders + * @{ + */ +/** @brief Set norm of an ideal given its lattice and parent order + * + * @param lideal In/Output: Ideal which has lattice and parent_order correctly set, but not + * necessarily the norm. Will have norm correctly set too. + */ +void quat_lideal_norm(quat_left_ideal_t *lideal); // ideal + +/** + * @brief Left principal ideal of order, generated by x + * + * @param lideal Output: left ideal + * @param alg quaternion algebra + * @param order maximal order of alg whose left ideal is searched + * @param x generating element + * + * Creates the left ideal in 'order' generated by the element 'x' + */ +void quat_lideal_create_principal(quat_left_ideal_t *lideal, + const quat_alg_elem_t *x, + const quat_lattice_t *order, + const quat_alg_t *alg); // ideal, test/ideal + +/** + * @brief Equality test for left ideals + * + * @returns 1 if both left ideals are equal, 0 otherwise + * @param lideal1 left ideal + * @param lideal2 left ideal + * @param alg the quaternion algebra + */ +int quat_lideal_equals(const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg); // test/ideal + +/** + * @brief Sum of two left ideals + * + * @param sum Output: Left ideal which is the sum of the 2 inputs + * @param lideal1 left ideal + * @param lideal2 left ideal + * @param alg the quaternion algebra + */ +void quat_lideal_add(quat_left_ideal_t *sum, + const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg); // Not used outside + +/** + * @brief Left ideal product of left ideal I and element alpha + * + * @param product Output: lideal I*alpha, must have integer norm + * @param lideal left ideal + * @param alpha element multiplied to lideal to get the product ideal + * @param alg the quaternion algebra + * + * I*alpha where I is a left-ideal and alpha an element of the algebra + * + * The resulting ideal must have an integer norm + * + */ +void quat_lideal_mul(quat_left_ideal_t *product, + const quat_left_ideal_t *lideal, + const quat_alg_elem_t *alpha, + const quat_alg_t *alg); // test/ideal + +/** @brief Computes the inverse ideal (for a left ideal of a maximal order) without putting it under + * HNF + * + * This function returns a lattice not under HNF. For careful internal use only + * + * Computes the inverse ideal for lideal as conjugate(lideal)/norm(lideal) + * + * @param inv Output: lattice which is lattice representation of the inverse ideal of lideal + * ATTENTION: is not under HNF. hnf computation must be applied before using lattice functions on it + * @param lideal Left ideal of a maximal order in alg + * @param alg The quaternion algebra + */ +void quat_lideal_inverse_lattice_without_hnf(quat_lattice_t *inv, + const quat_left_ideal_t *lideal, + const quat_alg_t *alg); // ideal + +/** @brief Computes the right transporter of two left ideals of the same maximal order + * + * Following the implementation of ideal isomorphisms in the code of LearningToSQI's sage + * implementation of SQIsign. Computes the right transporter of (J:I) as inverse(I)J. + * + * @param trans Output: lattice which is right transporter from lideal1 to lideal2 (lideal2:lideal1) + * @param lideal1 Left ideal of the same maximal order than lideal1 in alg + * @param lideal2 Left ideal of the same maximal order than lideal1 in alg + * @param alg The quaternion algebra + */ +void quat_lideal_right_transporter(quat_lattice_t *trans, + const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg); + +/** + * @brief Right order of a left ideal + * + * @param order Output: right order of the given ideal + * @param lideal left ideal + * @param alg the quaternion algebra + */ +void quat_lideal_right_order(quat_lattice_t *order, const quat_left_ideal_t *lideal, + const quat_alg_t *alg); // ideal + +/** + * @brief Gram matrix of the trace map of the ideal class + * + * Compute the Gram matrix of the bilinear form + * + * 〈a, b〉 := Tr(a·conj(b)) / norm(lideal) + * + * on the basis of the ideal. This matrix has integer entries and its + * integer congruence class only depends on the ideal class. + * + * @param G Output: Gram matrix of the trace map + * @param lideal left ideal + * @param alg the quaternion algebra + */ +void quat_lideal_class_gram(ibz_mat_4x4_t *G, const quat_left_ideal_t *lideal, const quat_alg_t *alg); + +/** @brief Test if order is maximal + * + * Checks if the discriminant of the order equals the prime p defining the quaternion algebra. + * + * It is not verified whether the order is really an order. The output 1 only means that if it is an + * order, then it is maximal. + * + * @returns 1 if order is maximal (assuming it is an order), 0 otherwise + * @param order An order of the quaternion algebra (assumes to be an order, this is not tested) + * @param alg The quaternion algebra + */ +int quat_order_is_maximal(const quat_lattice_t *order, + const quat_alg_t *alg); // ideal (only in asserts) + +/** @brief Compute the discriminant of an order as sqrt(det(gram(reduced_norm))) + * + * @param disc: Output: The discriminant sqrt(det(gram(reduced_norm))) + * @param order An order of the quaternion algebra + * @param alg The quaternion algebra + */ +int quat_order_discriminant(ibz_t *disc, const quat_lattice_t *order, + const quat_alg_t *alg); // ideal + +/** @} + */ + +/** @internal + * @ingroup quat_normeq + * @{ + */ + +/** @brief Set lattice to O0 + * + * @param O0 Lattice to be set to (1,i,(i+j)/2,(1+ij)/2) + */ +void quat_lattice_O0_set(quat_lattice_t *O0); + +/** @brief Set p-extremal maximal order to O0 + * + * @param O0 p-extremal order to be set to (1,i,(i+j)/2,(1+ij)/2) + */ +void quat_lattice_O0_set_extremal(quat_p_extremal_maximal_order_t *O0); + +/** + * @brief Create an element of a extremal maximal order from its coefficients + * + * @param elem Output: the quaternion element + * @param order the order + * @param coeffs the vector of 4 ibz coefficients + * @param Bpoo quaternion algebra + * + * elem = x + z*y + z*u + t*z*v + * where coeffs = [x,y,u,v] and t = order.t z = order.z + * + */ +void quat_order_elem_create(quat_alg_elem_t *elem, + const quat_p_extremal_maximal_order_t *order, + const ibz_vec_4_t *coeffs, + const quat_alg_t *Bpoo); // normeq, untested + +/** @} + */ +/** @} + */ + +#endif diff --git a/src/quaternion/ref/generic/internal_quaternion_headers/lll_internals.h b/src/quaternion/ref/generic/internal_quaternion_headers/lll_internals.h new file mode 100644 index 0000000..e8d9014 --- /dev/null +++ b/src/quaternion/ref/generic/internal_quaternion_headers/lll_internals.h @@ -0,0 +1,238 @@ +#ifndef LLL_INTERNALS_H +#define LLL_INTERNALS_H + +/** @file + * + * @authors Sina Schaeffler + * + * @brief Declarations of functions only used for the LLL tets + */ + +#include + +/** @internal + * @ingroup quat_helpers + * @defgroup lll_internal Functions only used for LLL or its tests + * @{ + */ + +/** @internal + * @ingroup lll_internal + * @defgroup lll_params Parameters used by the L2 implementation (floats) and its tests (ints) + * @{ + */ + +#define DELTABAR 0.995 +#define DELTA_NUM 99 +#define DELTA_DENOM 100 + +#define ETABAR 0.505 +#define EPSILON_NUM 1 +#define EPSILON_DENOM 100 + +#define PREC 64 +/** + * @} + */ + +/** @internal + * @ingroup lll_internal + * @defgroup ibq_t Types for rationals + * @{ + */ + +/** @brief Type for fractions of integers + * + * @typedef ibq_t + * + * For fractions of integers of arbitrary size, used by intbig module, using gmp + */ +typedef ibz_t ibq_t[2]; +typedef ibq_t ibq_vec_4_t[4]; +typedef ibq_t ibq_mat_4x4_t[4][4]; + +/**@} + */ + +/** @internal + * @ingroup lll_internal + * @defgroup lll_ibq_c Constructors and Destructors and Printers + * @{ + */ + +void ibq_init(ibq_t *x); +void ibq_finalize(ibq_t *x); + +void ibq_mat_4x4_init(ibq_mat_4x4_t *mat); +void ibq_mat_4x4_finalize(ibq_mat_4x4_t *mat); + +void ibq_vec_4_init(ibq_vec_4_t *vec); +void ibq_vec_4_finalize(ibq_vec_4_t *vec); + +void ibq_mat_4x4_print(const ibq_mat_4x4_t *mat); +void ibq_vec_4_print(const ibq_vec_4_t *vec); + +/** @} + */ + +/** @internal + * @ingroup lll_internal + * @defgroup lll_qa Basic fraction arithmetic + * @{ + */ + +/** @brief sum=a+b + */ +void ibq_add(ibq_t *sum, const ibq_t *a, const ibq_t *b); + +/** @brief diff=a-b + */ +void ibq_sub(ibq_t *diff, const ibq_t *a, const ibq_t *b); + +/** @brief neg=-x + */ +void ibq_neg(ibq_t *neg, const ibq_t *x); + +/** @brief abs=|x| + */ +void ibq_abs(ibq_t *abs, const ibq_t *x); + +/** @brief prod=a*b + */ +void ibq_mul(ibq_t *prod, const ibq_t *a, const ibq_t *b); + +/** @brief inv=1/x + * + * @returns 0 if x is 0, 1 if inverse exists and was computed + */ +int ibq_inv(ibq_t *inv, const ibq_t *x); + +/** @brief Compare a and b + * + * @returns a positive value if a > b, zero if a = b, and a negative value if a < b + */ +int ibq_cmp(const ibq_t *a, const ibq_t *b); + +/** @brief Test if x is 0 + * + * @returns 1 if x=0, 0 otherwise + */ +int ibq_is_zero(const ibq_t *x); + +/** @brief Test if x is 1 + * + * @returns 1 if x=1, 0 otherwise + */ +int ibq_is_one(const ibq_t *x); + +/** @brief Set q to a/b if b not 0 + * + * @returns 1 if b not 0 and q is set, 0 otherwise + */ +int ibq_set(ibq_t *q, const ibz_t *a, const ibz_t *b); + +/** @brief Copy value into target + */ +void ibq_copy(ibq_t *target, const ibq_t *value); + +/** @brief Checks if q is an integer + * + * @returns 1 if yes, 0 if not + */ +int ibq_is_ibz(const ibq_t *q); + +/** + * @brief Converts a fraction q to an integer y, if q is an integer. + * + * @returns 1 if z is an integer, 0 if not + */ +int ibq_to_ibz(ibz_t *z, const ibq_t *q); +/** @} + */ + +/** @internal + * @ingroup lll_internal + * @defgroup quat_lll_verify_helpers Helper functions for lll verification in dimension 4 + * @{ + */ + +/** @brief Set ibq to parameters delta and eta = 1/2 + epsilon using L2 constants + */ +void quat_lll_set_ibq_parameters(ibq_t *delta, ibq_t *eta); + +/** @brief Set an ibq vector to 4 given integer coefficients + */ +void ibq_vec_4_copy_ibz(ibq_vec_4_t *vec, + const ibz_t *coeff0, + const ibz_t *coeff1, + const ibz_t *coeff2, + const ibz_t *coeff3); // dim4, test/dim4 + +/** @brief Bilinear form vec00*vec10+vec01*vec11+q*vec02*vec12+q*vec03*vec13 for ibz_q + */ +void quat_lll_bilinear(ibq_t *b, const ibq_vec_4_t *vec0, const ibq_vec_4_t *vec1, + const ibz_t *q); // dim4, test/dim4 + +/** @brief Outputs the transposition of the orthogonalised matrix of mat (as fractions) + * + * For the bilinear form vec00*vec10+vec01*vec11+q*vec02*vec12+q*vec03*vec13 + */ +void quat_lll_gram_schmidt_transposed_with_ibq(ibq_mat_4x4_t *orthogonalised_transposed, + const ibz_mat_4x4_t *mat, + const ibz_t *q); // dim4 + +/** @brief Verifies if mat is lll-reduced for parameter coeff and norm defined by q + * + * For the bilinear form vec00*vec10+vec01*vec11+q*vec02*vec12+q*vec03*vec13 + */ +int quat_lll_verify(const ibz_mat_4x4_t *mat, + const ibq_t *delta, + const ibq_t *eta, + const quat_alg_t *alg); // test/lattice, test/dim4 + /** @} + */ + +/** @internal + * @ingroup lll_internal + * @defgroup lll_internal_gram Internal LLL function + * @{ + */ + +/** @brief In-place L2 reduction core function + * + * Given a lattice basis represented by the columns of a 4x4 matrix + * and the Gram matrix of its bilinear form, L2-reduces the basis + * in-place and updates the Gram matrix accordingly. + * + * Implements the L2 Algorithm of Nguyen-Stehlé, also known as fplll: + * https://iacr.org/archive/eurocrypt2005/34940217/34940217.pdf + * + * Parameters are in lll/lll_internals.h + * + * @param G In/Output: Gram matrix of the lattice basis + * @param basis In/Output: lattice basis + */ +void quat_lll_core(ibz_mat_4x4_t *G, ibz_mat_4x4_t *basis); + +/** + * @brief LLL reduction on 4-dimensional lattice + * + * Implements the L2 Algorithm of Nguyen-Stehlé, also known as fplll: + * https://iacr.org/archive/eurocrypt2005/34940217/34940217.pdf + * + * Parameters are in lll/lll_internals.h + * + * @param red Output: LLL reduced basis + * @param lattice In/Output: lattice with 4-dimensional basis + * @param alg The quaternion algebra + */ +int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const quat_alg_t *alg); + +/** + * @} + */ + +// end of lll_internal +/** @} + */ +#endif diff --git a/src/quaternion/ref/generic/internal_quaternion_headers/quaternion_tests.h b/src/quaternion/ref/generic/internal_quaternion_headers/quaternion_tests.h new file mode 100644 index 0000000..ba67135 --- /dev/null +++ b/src/quaternion/ref/generic/internal_quaternion_headers/quaternion_tests.h @@ -0,0 +1,349 @@ +/** @file + * + * @authors Sina Schaeffler + * + * @brief Declarations of tests of quaternion algebra operations + */ + +#ifndef QUATERNION_TESTS_H +#define QUATERNION_TESTS_H + +#include +#include +#include "internal.h" + +/** @internal + * @ingroup quat_helpers + * @defgroup quat_tests Quaternion module test functions + * @{ + */ + +/** @internal + * @ingroup quat_tests + * @defgroup quat_test_inputs Quaternion module random test input generation + * @{ + */ + +/** + * @brief Generates list of random ideals of a special extremal order + * + * @param ideals Output: Array of iterations left ideals of the given special extremal order and of + * norms of size norm_bitsize + * @param norm_bitsize Bitsize of the norms of the outut ideals + * @param iterations Number of ideals to sample. Most be smaller than ideals is long + * @param params quat_represent_integer_params_t parameters for the left order of the ideals to be + * sampled. + * @return 0 if success, 1 if failure + */ +int quat_test_input_random_ideal_generation(quat_left_ideal_t *ideals, + int norm_bitsize, + int iterations, + const quat_represent_integer_params_t *params); + +/** + * @brief Generates list of random ideals of a special extremal order + * + * @param lattices Output: Array of iterations left ideals of the given special extremal order and + * of norms of size norm_bitsize, given only by their lattices + * @param norms Output: Array which will contain the norms of the sampled ideals, in the same order + * as their lattices are. Can be NULL, in which case no norm is output. Otherwise, it must be an + * array of length at least iterations + * @param norm_bitsize Bitsize of the norms of the outut ideals + * @param iterations Number of ideals to sample. Most be smaller than lattices is long + * @param params quat_represent_integer_params_t parameters for the left order of the ideals to be + * sampled. + * @return 0 if success, 1 if failure + */ +int quat_test_input_random_ideal_lattice_generation(quat_lattice_t *lattices, + ibz_t *norms, + int norm_bitsize, + int iterations, + const quat_represent_integer_params_t *params); + +/** + * @brief Generates list of random lattices + * + * @param lattices Output: Array of iterations lattices + * @param bitsize Bitsize of the coefficients of a random basis of the lattices + * @param iterations Number of lattices to sample.Most be smaller than lattices is long + * @param in_hnf If not 0, the lattices are put in HNF before being outputs. Their coefficients in + * this basis might be larger than bitsize. + * @return 0 if success, 1 if failure + */ +int quat_test_input_random_lattice_generation(quat_lattice_t *lattices, int bitsize, int iterations, int in_hnf); +/** + * @} + */ + +/** @brief Test for integer functions + * + * void ibz_init(ibz_t *x); + * + * void ibz_finalize(ibz_t *x); + * + * void ibz_add(ibz_t *sum, const ibz_t *a, const ibz_t *b); + * + * void ibz_sub(ibz_t *diff, const ibz_t *a, const ibz_t *b); + * + * void ibz_mul(ibz_t *prod, const ibz_t *a, const ibz_t *b); + * + * void ibz_neg(ibz_t *neg, const ibz_t *a); + * + * void ibz_abs(ibz_t *abs, const ibz_t *a); + * + * void ibz_div(ibz_t *quotient, ibz_t *remainder, const ibz_t *a, const ibz_t *b); + * + * void ibz_div_2exp(ibz_t *quotient, const ibz_t *a, uint32_t exp); + * + * void ibz_mod(ibz_t *r, const ibz_t *a, const ibz_t *b); + * + * unsigned long int ibz_mod_ui(const mpz_t *n, unsigned long int d); + * + * int ibz_divides(const ibz_t *a, const ibz_t *b); + * + * void ibz_pow(ibz_t *pow, const ibz_t *x, uint32_t e); + * + * void ibz_pow_mod(ibz_t *pow, const ibz_t *x, const ibz_t *e, const ibz_t *m); + * + * int ibz_cmp(const ibz_t *a, const ibz_t *b); + * + * int ibz_is_zero(const ibz_t *x); + * + * int ibz_is_one(const ibz_t *x); + * + * int ibz_cmp_int32(const ibz_t *x, int32_t y); + * + * int ibz_is_even(const ibz_t *x); + * + * int ibz_is_odd(const ibz_t *x); + * + * void ibz_set(ibz_t *i, int32_t x); + * + * void ibz_copy(ibz_t *target, const ibz_t *value); + * + * void ibz_swap(ibz_t *a, ibz_t *b); + * + * void ibz_copy_digits(ibz_t *target, const digit_t *dig, int dig_len); + * + * void ibz_to_digits(digit_t *target, const ibz_t *ibz); + * + * int32_t ibz_get(const ibz_t *i); + * + * int ibz_rand_interval(ibz_t *rand, const ibz_t *a, const ibz_t *b); + * + * int ibz_rand_interval_minm_m(ibz_t *rand, int32_t m); + * + * int ibz_bitsize(const ibz_t *a); + * + * void ibz_gcd(ibz_t *gcd, const ibz_t *a, const ibz_t *b); + * + * int ibz_invmod(ibz_t *inv, const ibz_t *a, const ibz_t *mod); + * + * void ibz_sqrt_floor(ibz_t *sqrt, const ibz_t *a); + */ +int ibz_test_intbig(void); + +/** @brief Test for implementations of GMP functions missing from the mini-GMP API + * + * int mpz_legendre(const mpz_t a, const mpz_t p); + * + * double mpz_get_d_2exp(signed long int *exp, const mpz_t op); + */ +int mini_gmp_test(void); + +/** @brief Test initializers and finalizers for quaternion algebra types + * + * Test initializers and finalizers for the following types: + * + * quat_alg_t + * + * quat_alg_elem_t + * + * quat_alg_coord_t + * + * ibz_vec_2_t + * + * ibz_vec_4_t + * + * ibz_mat_2x2_t + * + * ibz_mat_4x4_t + * + * quat_lattice_t + * + * quat_lattice_t + * + * quat_left_ideal_t + */ +int quat_test_finit(void); + +/** @brief Test integer, quadratic form and matrix functions for dimension 4 from the quaternion + * module + * + * Runs unit tests for the following functions + * + * void ibz_mat_4x4_eval(quat_alg_coord_t *res, const ibz_mat_4x4_t *mat, const quat_alg_coord_t + * *vec); + * + * void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const quat_alg_coord_t *coord); + * + * void ibz_vec_4_content(ibz_t *content, const quat_alg_coord_t *v); + */ +int quat_test_dim4(void); + +/** @brief Test integer, lattice and matrix functions for dimension 2 from the quaternion module + * + * Runs unit tests for the following functions + * + * void ibz_mat_2x2_copy(ibz_vec_2_t *copy, const ibz_mat_2x2_t *copied); + * + * void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec); + * + * void ibz_mat_4x4_eval_t(ibz_vec_4_t *res, const ibz_vec_4_t *vec, const ibz_mat_4x4_t *mat); + * + * void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, + * const ibz_t *m); + * + * int ibz_mat_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); + */ +int quat_test_dim2(void); + +/** @brief Test integer functions + * + * Runs unit tests for the following functions + * + * int ibz_generate_random_prime(ibz_t *p, int is3mod4, int bitsize); + * + * int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p); + */ +int quat_test_integers(void); + +/** @brief Test operations on quaternion algebra elements + * + * Runs unit tests for the following functions + * + * void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); + * + * void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); + * + * void quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const + * quat_alg_t *alg); + * + * void quat_alg_norm(ibz_t *res_num, ibz_t *res_denom, const quat_alg_elem_t *a, const quat_alg_t + * *alg); + * + * void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator); + * + * void quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x); + * + * void quat_alg_make_primitive(quat_alg_coord_t *primitive_x, ibz_t *content, const quat_alg_elem_t + * *x, const quat_lattice_t *order, const quat_alg_t *alg){ + * + * void quat_alg_normalize(quat_alg_elem_t *x); + * + * int quat_alg_elem_is_zero(const quat_alg_elem_t *x); + * + * int quat_alg_coord_is_zero(const quat_alg_coord_t *x); + * + * void quat_alg_elem_copy(quat_alg_elem_t *copy, const quat_alg_elem_t *copied); + */ +int quat_test_algebra(void); + +/** @brief Test operations on lattices + * + * Runs unit tests for the following functions + * + * void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t + * *lat2); + * + * void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t + * *lat2); + * + * void quat_lattice_conjugate_without_hnf(quat_lattice_t *conj, const quat_lattice_t *lat); + * + * void quat_lattice_alg_elem_mul(quat_lattice_t *prod, const quat_lattice_t *lat, const + * quat_alg_elem_t *elem, const quat_alg_t *alg); + * + * void quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t + * *lat2, const quat_alg_t *alg); + * + * int quat_lattice_contains(quat_alg_coord_t *coord, const quat_lattice_t *lat, const + * quat_alg_elem_t *x, const quat_alg_t *alg); + * + * void quat_lattice_hnf(quat_lattice_t *lat); + */ +int quat_test_lattice(void); + +/** @brief Test for lattice reduction and functions based on it + * + * int quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, ibz_mat_4x4_t *gram, const quat_left_ideal_t + * *lideal, const quat_alg_t *alg); + * + * int quat_lideal_lideal_mul_reduced(quat_left_ideal_t *prod, ibz_mat_4x4_t *gram, const + * quat_left_ideal_t *lideal1,const quat_left_ideal_t *lideal2, const quat_alg_t *alg); + * + * int quat_lideal_prime_norm_reduced_equivalent(quat_left_ideal_t *lideal, const quat_alg_t *alg, + * const int primality_num_iter, const int equiv_bound_coeff); + */ +int quat_test_lll(void); + +/** @brief Test operations on left ideals and their creation + * + * Runs unit tests for the following functions + * + * void quat_lideal_copy(quat_left_ideal_t *copy, const quat_left_ideal_t *copied) + * + * void quat_lideal_create_principal(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const + * quat_lattice_t *order, const quat_alg_t *alg); + * + * void quat_lideal_create(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const + * ibz_t *N, const quat_lattice_t *order, const quat_alg_t *alg); + * + * int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const + * quat_alg_t); + * + * void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *I1, const quat_left_ideal_t + * *I2, const quat_alg_t *alg); + * + * void quat_lideal_inter(quat_left_ideal_t *intersection, const quat_left_ideal_t *I1, const + * quat_left_ideal_t *I2, const quat_alg_t *alg); + * + * int quat_lideal_equals(const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t + * *alg); + * + */ +int quat_test_lideal(void); + +/** @brief Test operations on represent integer + * + * int quat_sampling_random_ideal_O0_given_norm(quat_left_ideal_t *lideal,const ibz_t *norm,int + * is_prime,const quat_represent_integer_params_t *params,int prime_sampling_attempts); + * + * void quat_change_to_O0_basis(ibz_vec_4_t *vec, const quat_alg_elem_t *el); + * + * int quat_represent_integer(quat_alg_elem_t *gamma, const ibz_t *n_gamma, int non_diag, const + * quat_represent_integer_params_t *params); + */ +int quat_test_normeq(void); + +/** @brief Test functions for sampling lattice points of bounded norm + * + * int quat_lattice_sample_from_ball(ibz_vec_4_t *x, const quat_lattice_t *lattice, const quat_alg_t + * *alg, const ibz_t *radius); + */ +int quat_test_lat_ball(void); + +/** @brief Test for hnf core and verification + * + */ +int quat_test_hnf(void); + +/** @brief Test with randomization for complex functions where this is possible + * + */ +int quat_test_with_randomization(void); + +/** @} + */ + +#endif diff --git a/src/quaternion/ref/generic/lat_ball.c b/src/quaternion/ref/generic/lat_ball.c new file mode 100644 index 0000000..c7bbb96 --- /dev/null +++ b/src/quaternion/ref/generic/lat_ball.c @@ -0,0 +1,139 @@ +#include +#include +#include +#include "internal.h" +#include "lll_internals.h" + +int +quat_lattice_bound_parallelogram(ibz_vec_4_t *box, ibz_mat_4x4_t *U, const ibz_mat_4x4_t *G, const ibz_t *radius) +{ + ibz_t denom, rem; + ibz_init(&denom); + ibz_init(&rem); + ibz_mat_4x4_t dualG; + ibz_mat_4x4_init(&dualG); + +// Compute the Gram matrix of the dual lattice +#ifndef NDEBUG + int inv_check = ibz_mat_4x4_inv_with_det_as_denom(&dualG, &denom, G); + assert(inv_check); +#else + (void)ibz_mat_4x4_inv_with_det_as_denom(&dualG, &denom, G); +#endif + // Initialize the dual lattice basis to the identity matrix + ibz_mat_4x4_identity(U); + // Reduce the dual lattice + quat_lll_core(&dualG, U); + + // Compute the parallelogram's bounds + int trivial = 1; + for (int i = 0; i < 4; i++) { + ibz_mul(&(*box)[i], &dualG[i][i], radius); + ibz_div(&(*box)[i], &rem, &(*box)[i], &denom); + ibz_sqrt_floor(&(*box)[i], &(*box)[i]); + trivial &= ibz_is_zero(&(*box)[i]); + } + + // Compute the transpose transformation matrix +#ifndef NDEBUG + int inv = ibz_mat_4x4_inv_with_det_as_denom(U, &denom, U); +#else + (void)ibz_mat_4x4_inv_with_det_as_denom(U, &denom, U); +#endif + // U is unitary, det(U) = ± 1 + ibz_mat_4x4_scalar_mul(U, &denom, U); +#ifndef NDEBUG + assert(inv); + ibz_abs(&denom, &denom); + assert(ibz_is_one(&denom)); +#endif + + ibz_mat_4x4_finalize(&dualG); + ibz_finalize(&denom); + ibz_finalize(&rem); + return !trivial; +} + +int +quat_lattice_sample_from_ball(quat_alg_elem_t *res, + const quat_lattice_t *lattice, + const quat_alg_t *alg, + const ibz_t *radius) +{ + assert(ibz_cmp(radius, &ibz_const_zero) > 0); + + ibz_vec_4_t box; + ibz_vec_4_init(&box); + ibz_mat_4x4_t U, G; + ibz_mat_4x4_init(&U); + ibz_mat_4x4_init(&G); + ibz_vec_4_t x; + ibz_vec_4_init(&x); + ibz_t rad, tmp; + ibz_init(&rad); + ibz_init(&tmp); + + // Compute the Gram matrix of the lattice + quat_lattice_gram(&G, lattice, alg); + + // Correct ball radius by the denominator + ibz_mul(&rad, radius, &lattice->denom); + ibz_mul(&rad, &rad, &lattice->denom); + // Correct by 2 (Gram matrix corresponds to twice the norm) + ibz_mul(&rad, &rad, &ibz_const_two); + + // Compute a bounding parallelogram for the ball, stop if it only + // contains the origin + int ok = quat_lattice_bound_parallelogram(&box, &U, &G, &rad); + if (!ok) + goto err; + + // Rejection sampling from the parallelogram +#ifndef NDEBUG + int cnt = 0; +#endif + do { + // Sample vector + for (int i = 0; i < 4; i++) { + if (ibz_is_zero(&box[i])) { + ibz_copy(&x[i], &ibz_const_zero); + } else { + ibz_add(&tmp, &box[i], &box[i]); + ok &= ibz_rand_interval(&x[i], &ibz_const_zero, &tmp); + ibz_sub(&x[i], &x[i], &box[i]); + if (!ok) + goto err; + } + } + // Map to parallelogram + ibz_mat_4x4_eval_t(&x, &x, &U); + // Evaluate quadratic form + quat_qf_eval(&tmp, &G, &x); +#ifndef NDEBUG + cnt++; + if (cnt % 100 == 0) + printf("Lattice sampling rejected %d times", cnt - 1); +#endif + } while (ibz_is_zero(&tmp) || (ibz_cmp(&tmp, &rad) > 0)); + + // Evaluate linear combination + ibz_mat_4x4_eval(&(res->coord), &(lattice->basis), &x); + ibz_copy(&(res->denom), &(lattice->denom)); + quat_alg_normalize(res); + +#ifndef NDEBUG + // Check norm is smaller than radius + quat_alg_norm(&tmp, &rad, res, alg); + ibz_mul(&rad, &rad, radius); + assert(ibz_cmp(&tmp, &rad) <= 0); +#endif + +err: + ibz_finalize(&rad); + ibz_finalize(&tmp); + ibz_vec_4_finalize(&x); + ibz_mat_4x4_finalize(&U); + ibz_mat_4x4_finalize(&G); + ibz_vec_4_finalize(&box); + return ok; +} diff --git a/src/quaternion/ref/generic/lattice.c b/src/quaternion/ref/generic/lattice.c index b1f3802..c98bae9 100644 --- a/src/quaternion/ref/generic/lattice.c +++ b/src/quaternion/ref/generic/lattice.c @@ -2,468 +2,327 @@ #include #include "internal.h" -//helper functions -int quat_lattice_equal(const quat_lattice_t *lat1, const quat_lattice_t *lat2){ - int equal; - ibz_t abs_denom1, abs_denom2; - ibz_mat_4x4_t m1,m2; - ibz_init(&abs_denom1); - ibz_init(&abs_denom2); - ibz_mat_4x4_init(&m1); - ibz_mat_4x4_init(&m2); - // test if both are in HNF as needed - assert(ibz_mat_4x4_is_hnf(&(lat1->basis))); - assert(ibz_mat_4x4_is_hnf(&(lat2->basis))); - // get absolute values of denominators - ibz_neg(&abs_denom1,&(lat1->denom)); - if(ibz_cmp(&abs_denom1,&(lat1->denom)) <0 ){ - ibz_neg(&abs_denom1,&abs_denom1); - } - ibz_neg(&abs_denom2,&(lat2->denom)); - if(ibz_cmp(&abs_denom2,&(lat2->denom)) <0 ){ - ibz_neg(&abs_denom2,&abs_denom2); - } - // cross-multiply by denomiators to get both basis on same denominators - ibz_mat_4x4_scalar_mul(&m1,&abs_denom2,&(lat1->basis)); - ibz_mat_4x4_scalar_mul(&m2,&abs_denom1,&(lat2->basis)); - // baoth are still HNF, so simply test for equality - equal = ibz_mat_4x4_equal(&m1,&m2); - ibz_finalize(&abs_denom1); - ibz_finalize(&abs_denom2); - ibz_mat_4x4_finalize(&m1); - ibz_mat_4x4_finalize(&m2); - return(equal); +// helper functions +int +quat_lattice_equal(const quat_lattice_t *lat1, const quat_lattice_t *lat2) +{ + int equal = 1; + quat_lattice_t a, b; + quat_lattice_init(&a); + quat_lattice_init(&b); + quat_lattice_reduce_denom(&a, lat1); + quat_lattice_reduce_denom(&b, lat2); + ibz_abs(&(a.denom), &(a.denom)); + ibz_abs(&(b.denom), &(b.denom)); + quat_lattice_hnf(&a); + quat_lattice_hnf(&b); + equal = equal && (ibz_cmp(&(a.denom), &(b.denom)) == 0); + equal = equal && ibz_mat_4x4_equal(&(a.basis), &(b.basis)); + quat_lattice_finalize(&a); + quat_lattice_finalize(&b); + return (equal); } -void quat_lattice_reduce_denom(quat_lattice_t *reduced, const quat_lattice_t *lat){ +// sublattice test +int +quat_lattice_inclusion(const quat_lattice_t *sublat, const quat_lattice_t *overlat) +{ + int res; + quat_lattice_t sum; + quat_lattice_init(&sum); + quat_lattice_add(&sum, overlat, sublat); + res = quat_lattice_equal(&sum, overlat); + quat_lattice_finalize(&sum); + return (res); +} + +void +quat_lattice_reduce_denom(quat_lattice_t *reduced, const quat_lattice_t *lat) +{ ibz_t gcd; ibz_init(&gcd); - ibz_mat_4x4_gcd(&gcd,&(lat->basis)); - ibz_gcd(&gcd,&gcd,&(lat->denom)); - ibz_mat_4x4_scalar_div(&(reduced->basis),&gcd,&(lat->basis)); - ibz_div(&(reduced->denom),&gcd,&(lat->denom),&gcd); + ibz_mat_4x4_gcd(&gcd, &(lat->basis)); + ibz_gcd(&gcd, &gcd, &(lat->denom)); + ibz_mat_4x4_scalar_div(&(reduced->basis), &gcd, &(lat->basis)); + ibz_div(&(reduced->denom), &gcd, &(lat->denom), &gcd); + ibz_abs(&(reduced->denom), &(reduced->denom)); ibz_finalize(&gcd); } -// This function returns a lattice not under HNF. For careful internal use only -// method described in https://cseweb.ucsd.edu/classes/sp14/cse206A-a/lec4.pdf consulted on 19 of May 2023, 12h40 CEST -void quat_lattice_dual_without_hnf(quat_lattice_t *dual, const quat_lattice_t *lat){ +void +quat_lattice_conjugate_without_hnf(quat_lattice_t *conj, const quat_lattice_t *lat) +{ + ibz_mat_4x4_copy(&(conj->basis), &(lat->basis)); + ibz_copy(&(conj->denom), &(lat->denom)); + + for (int row = 1; row < 4; ++row) { + for (int col = 0; col < 4; ++col) { + ibz_neg(&(conj->basis[row][col]), &(conj->basis[row][col])); + } + } +} + +// Method described in https://cseweb.ucsd.edu/classes/sp14/cse206A-a/lec4.pdf consulted on 19 of +// May 2023, 12h40 CEST +void +quat_lattice_dual_without_hnf(quat_lattice_t *dual, const quat_lattice_t *lat) +{ ibz_mat_4x4_t inv; ibz_t det; ibz_init(&det); ibz_mat_4x4_init(&inv); - ibz_mat_4x4_transpose(&inv,&(lat->basis)); - ibz_mat_4x4_inv_with_det_as_denom(&inv,&det,&inv); + ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &(lat->basis)); + ibz_mat_4x4_transpose(&inv, &inv); // dual_denom = det/lat_denom - ibz_mat_4x4_scalar_mul(&(dual->basis),&(lat->denom),&inv); - ibz_copy(&(dual-> denom),&det); - + ibz_mat_4x4_scalar_mul(&(dual->basis), &(lat->denom), &inv); + ibz_copy(&(dual->denom), &det); + ibz_finalize(&det); ibz_mat_4x4_finalize(&inv); } -void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2){ - ibz_mat_4x8_t hnf_input; +void +quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2) +{ + ibz_vec_4_t generators[8]; ibz_mat_4x4_t tmp; + ibz_t det1, det2, detprod; + ibz_init(&det1); + ibz_init(&det2); + ibz_init(&detprod); + for (int i = 0; i < 8; i++) + ibz_vec_4_init(&(generators[i])); ibz_mat_4x4_init(&tmp); - ibz_mat_4x8_init(&hnf_input); - ibz_mat_4x4_scalar_mul(&tmp,&(lat1->denom),&(lat2->basis)); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_copy(&(hnf_input[i][j]),&(tmp[i][j])); + ibz_mat_4x4_scalar_mul(&tmp, &(lat1->denom), &(lat2->basis)); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(&(generators[j][i]), &(tmp[i][j])); } } - ibz_mat_4x4_scalar_mul(&tmp,&(lat2->denom),&(lat1->basis)); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_copy(&(hnf_input[i][4+j]),&(tmp[i][j])); + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det1, &tmp); + ibz_mat_4x4_scalar_mul(&tmp, &(lat2->denom), &(lat1->basis)); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(&(generators[4 + j][i]), &(tmp[i][j])); } } - ibz_mat_4x8_hnf_core(&(res->basis),&hnf_input); - ibz_mul(&(res->denom),&(lat1->denom), &(lat2->denom)); - quat_lattice_reduce_denom(res,res); - ibz_mat_4x8_finalize(&hnf_input); + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det2, &tmp); + assert(!ibz_is_zero(&det1)); + assert(!ibz_is_zero(&det2)); + ibz_gcd(&detprod, &det1, &det2); + ibz_mat_4xn_hnf_mod_core(&(res->basis), 8, generators, &detprod); + ibz_mul(&(res->denom), &(lat1->denom), &(lat2->denom)); + quat_lattice_reduce_denom(res, res); ibz_mat_4x4_finalize(&tmp); + ibz_finalize(&det1); + ibz_finalize(&det2); + ibz_finalize(&detprod); + for (int i = 0; i < 8; i++) + ibz_vec_4_finalize(&(generators[i])); } -// method described in https://cseweb.ucsd.edu/classes/sp14/cse206A-a/lec4.pdf consulted on 19 of May 2023, 12h40 CEST -void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2){ +// method described in https://cseweb.ucsd.edu/classes/sp14/cse206A-a/lec4.pdf consulted on 19 of +// May 2023, 12h40 CEST +void +quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2) +{ quat_lattice_t dual1, dual2, dual_res; quat_lattice_init(&dual1); quat_lattice_init(&dual2); quat_lattice_init(&dual_res); - quat_lattice_dual_without_hnf(&dual1,lat1); - - quat_lattice_dual_without_hnf(&dual2,lat2); - quat_lattice_add(&dual_res,&dual1,&dual2); - quat_lattice_dual_without_hnf(res,&dual_res); - quat_lattice_hnf(res); + quat_lattice_dual_without_hnf(&dual1, lat1); + + quat_lattice_dual_without_hnf(&dual2, lat2); + quat_lattice_add(&dual_res, &dual1, &dual2); + quat_lattice_dual_without_hnf(res, &dual_res); + quat_lattice_hnf(res); // could be removed if we do not expect HNF any more quat_lattice_finalize(&dual1); quat_lattice_finalize(&dual2); quat_lattice_finalize(&dual_res); } -void quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg){ - ibz_t denom, d, r; - ibz_mat_4x8_t hnf_input; - ibz_mat_4x4_t tmp1,tmp2; - quat_alg_elem_t elem1,elem2,elem_res; - quat_lattice_t lat_res; - ibz_init(&denom); - ibz_init(&d); - ibz_init(&r); - quat_lattice_init(&lat_res); - ibz_mat_4x4_init(&tmp1); - ibz_mat_4x4_init(&tmp2); - quat_alg_elem_init(&elem1); - quat_alg_elem_init(&elem2); - quat_alg_elem_init(&elem_res); - ibz_mat_4x8_init(&hnf_input); - ibz_mul(&denom,&(lat1->denom),&(lat2->denom)); - for(int k = 0; k < 2; k++){ - quat_alg_elem_copy_ibz(&elem1,&(lat1->denom),&(lat1->basis[0][k]),&(lat1->basis[1][k]),&(lat1->basis[2][k]),&(lat1->basis[3][k])); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_copy(&(elem2.coord[j]),&(lat2->basis[i][j])); - } - quat_alg_elem_copy_ibz(&elem2,&(lat2->denom),&(lat2->basis[0][i]),&(lat2->basis[1][i]),&(lat2->basis[2][i]),&(lat2->basis[3][i])); - quat_alg_mul(&elem_res,&elem1,&elem2,alg); - //should check that denom is as expected (product of both), otherwise set it to that to avoid issues - if(0!=ibz_cmp(&denom,&(elem_res.denom))){ - ibz_div(&d,&r,&denom,&(elem_res.denom)); - quat_alg_elem_mul_by_scalar(&elem_res,&d,&elem_res); - } - for(int j = 0; j < 4; j++){ - ibz_copy(&(hnf_input[j][4*k+i]),&(elem_res.coord[j])); - } - } - } - ibz_mat_4x8_hnf_core(&tmp1,&hnf_input); - - for(int k = 0; k < 2; k++){ - quat_alg_elem_copy_ibz(&elem1,&(lat1->denom),&(lat1->basis[0][2+k]),&(lat1->basis[1][2+k]),&(lat1->basis[2][2+k]),&(lat1->basis[3][2+k])); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_copy(&(elem2.coord[j]),&(lat2->basis[i][j])); - } - quat_alg_elem_copy_ibz(&elem2,&(lat2->denom),&(lat2->basis[0][i]),&(lat2->basis[1][i]),&(lat2->basis[2][i]),&(lat2->basis[3][i])); - quat_alg_mul(&elem_res,&elem1,&elem2,alg); - //should check that denom is as expected (product of both), otherwise set it to that to avoid issues - if(0!=ibz_cmp(&denom,&(elem_res.denom))){ - ibz_div(&d,&r,&denom,&(elem_res.denom)); - quat_alg_elem_mul_by_scalar(&elem_res,&d,&elem_res); - } - for(int j = 0; j < 4; j++){ - ibz_copy(&(hnf_input[j][4*k+i]),&(elem_res.coord[j])); - } - } - } - ibz_mat_4x8_hnf_core(&tmp2,&hnf_input); - - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_copy(&(hnf_input[i][j]),&(tmp1[i][j])); - ibz_copy(&(hnf_input[i][4+j]),&(tmp2[i][j])); - } - } - ibz_mat_4x8_hnf_core(&(res->basis),&hnf_input); - - ibz_copy(&(res->denom),&denom); - quat_lattice_reduce_denom(res,res); - - ibz_mat_4x8_finalize(&hnf_input); - ibz_mat_4x4_finalize(&tmp1); - ibz_mat_4x4_finalize(&tmp2); - quat_alg_elem_finalize(&elem1); - quat_alg_elem_finalize(&elem2); - quat_alg_elem_finalize(&elem_res); - quat_lattice_finalize(&lat_res); - ibz_finalize(&denom); - ibz_finalize(&d); - ibz_finalize(&r); -} - -// lattice assumed of full rank and under HNF, none of both is tested so far -int quat_lattice_contains_without_alg(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x){ - int res = 1; - ibz_vec_4_t work_coord, work_x, column; - ibz_t r, prod, one; - ibz_init(&r); - ibz_init(&prod); - ibz_init(&one); - ibz_vec_4_init(&work_coord); - ibz_vec_4_init(&work_x); - ibz_vec_4_init(&column); - // test if rank 4 lattice under HNF - assert(ibz_mat_4x4_is_hnf(&(lat->basis))); - for(int i = 0; i < 4; i++){ - assert(!ibz_is_zero(&(lat->basis[i][i]))); - } - ibz_set(&one,1); - for(int i = 0; i < 4;i++){ - // put on same denominator, 1st part - ibz_mul(&(work_x[i]), &(x->coord[i]),&(lat->denom)); - } - for(int i = 0; i < 4;i++){ - if(res){ - // put on same denominator, 2nd part - ibz_mul(&prod,&(x->denom), &(lat->basis[3-i][3-i])); - ibz_div(&(work_coord[3-i]), &r,&(work_x[3-i]), &prod); - if(ibz_is_zero(&r)){ - for (int j = 0; j < 4;j++){ - // put on same denominator here also - ibz_mul(&(column[j]),&(lat->basis[j][3-i]),&(x->denom)); - } - // negate quotient - ibz_neg(&r,&(work_coord[3-i])); - ibz_vec_4_linear_combination(&work_x, &one, &work_x, &r,&column); - } else { - res = 0; - } - } - } - //final test - for(int i = 0; i < 4;i++){ - // now x should be 0 if it is in lattice - res = res && ibz_is_zero(&(work_x[i])); - } - - //copy result - if(res && (coord != NULL)){ - for(int i = 0; i < 4;i++){ - ibz_copy(&((*coord)[i]),&(work_coord[i])); - } - } - ibz_finalize(&r); - ibz_finalize(&prod); - ibz_finalize(&one); - ibz_vec_4_finalize(&work_coord); - ibz_vec_4_finalize(&work_x); - ibz_vec_4_finalize(&column); - return(res); -} - -// lattice assumed of full rank and under HNF, none of both is tested so far -int quat_lattice_contains(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x, const quat_alg_t *alg){ - return(quat_lattice_contains_without_alg(coord,lat,x)); -} - -void quat_lattice_index(ibz_t *index, const quat_lattice_t *sublat, const quat_lattice_t *overlat) { - ibz_t tmp; - ibz_init(&tmp); - - // index = (overlat->denom)⁴ - ibz_mul(index, &overlat->denom, &overlat->denom); - ibz_mul(index, index, index); - // index = (overlat->denom)⁴ · det(sublat->basis) +void +quat_lattice_mat_alg_coord_mul_without_hnf(ibz_mat_4x4_t *prod, + const ibz_mat_4x4_t *lat, + const ibz_vec_4_t *coord, + const quat_alg_t *alg) +{ + ibz_vec_4_t p, a; + ibz_vec_4_init(&p); + ibz_vec_4_init(&a); for (int i = 0; i < 4; i++) { - ibz_mul(index, index, &sublat->basis[i][i]); + ibz_vec_4_copy_ibz(&a, &((*lat)[0][i]), &((*lat)[1][i]), &((*lat)[2][i]), &((*lat)[3][i])); + quat_alg_coord_mul(&p, &a, coord, alg); + ibz_copy(&((*prod)[0][i]), &(p[0])); + ibz_copy(&((*prod)[1][i]), &(p[1])); + ibz_copy(&((*prod)[2][i]), &(p[2])); + ibz_copy(&((*prod)[3][i]), &(p[3])); } + ibz_vec_4_finalize(&p); + ibz_vec_4_finalize(&a); +} + +void +quat_lattice_alg_elem_mul(quat_lattice_t *prod, + const quat_lattice_t *lat, + const quat_alg_elem_t *elem, + const quat_alg_t *alg) +{ + quat_lattice_mat_alg_coord_mul_without_hnf(&(prod->basis), &(lat->basis), &(elem->coord), alg); + ibz_mul(&(prod->denom), &(lat->denom), &(elem->denom)); + quat_lattice_hnf(prod); +} + +void +quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg) +{ + ibz_vec_4_t elem1, elem2, elem_res; + ibz_vec_4_t generators[16]; + ibz_mat_4x4_t detmat; + ibz_t det; + quat_lattice_t lat_res; + ibz_init(&det); + ibz_mat_4x4_init(&detmat); + quat_lattice_init(&lat_res); + ibz_vec_4_init(&elem1); + ibz_vec_4_init(&elem2); + ibz_vec_4_init(&elem_res); + for (int i = 0; i < 16; i++) + ibz_vec_4_init(&(generators[i])); + for (int k = 0; k < 4; k++) { + ibz_vec_4_copy_ibz( + &elem1, &(lat1->basis[0][k]), &(lat1->basis[1][k]), &(lat1->basis[2][k]), &(lat1->basis[3][k])); + for (int i = 0; i < 4; i++) { + ibz_vec_4_copy_ibz( + &elem2, &(lat2->basis[0][i]), &(lat2->basis[1][i]), &(lat2->basis[2][i]), &(lat2->basis[3][i])); + quat_alg_coord_mul(&elem_res, &elem1, &elem2, alg); + for (int j = 0; j < 4; j++) { + if (k == 0) + ibz_copy(&(detmat[i][j]), &(elem_res[j])); + ibz_copy(&(generators[4 * k + i][j]), &(elem_res[j])); + } + } + } + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &detmat); + ibz_abs(&det, &det); + ibz_mat_4xn_hnf_mod_core(&(res->basis), 16, generators, &det); + ibz_mul(&(res->denom), &(lat1->denom), &(lat2->denom)); + quat_lattice_reduce_denom(res, res); + ibz_vec_4_finalize(&elem1); + ibz_vec_4_finalize(&elem2); + ibz_vec_4_finalize(&elem_res); + quat_lattice_finalize(&lat_res); + ibz_finalize(&det); + ibz_mat_4x4_finalize(&(detmat)); + for (int i = 0; i < 16; i++) + ibz_vec_4_finalize(&(generators[i])); +} + +// lattice assumed of full rank +int +quat_lattice_contains(ibz_vec_4_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x) +{ + int divisible = 0; + ibz_vec_4_t work_coord; + ibz_mat_4x4_t inv; + ibz_t det, prod; + ibz_init(&prod); + ibz_init(&det); + ibz_vec_4_init(&work_coord); + ibz_mat_4x4_init(&inv); + ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &(lat->basis)); + assert(!ibz_is_zero(&det)); + ibz_mat_4x4_eval(&work_coord, &inv, &(x->coord)); + ibz_vec_4_scalar_mul(&(work_coord), &(lat->denom), &work_coord); + ibz_mul(&prod, &(x->denom), &det); + divisible = ibz_vec_4_scalar_div(&work_coord, &prod, &work_coord); + // copy result + if (divisible && (coord != NULL)) { + for (int i = 0; i < 4; i++) { + ibz_copy(&((*coord)[i]), &(work_coord[i])); + } + } + ibz_finalize(&prod); + ibz_finalize(&det); + ibz_mat_4x4_finalize(&inv); + ibz_vec_4_finalize(&work_coord); + return (divisible); +} + +void +quat_lattice_index(ibz_t *index, const quat_lattice_t *sublat, const quat_lattice_t *overlat) +{ + ibz_t tmp, det; + ibz_init(&tmp); + ibz_init(&det); + + // det = det(sublat->basis) + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &sublat->basis); + // tmp = (overlat->denom)⁴ + ibz_mul(&tmp, &overlat->denom, &overlat->denom); + ibz_mul(&tmp, &tmp, &tmp); + // index = (overlat->denom)⁴ · det(sublat->basis) + ibz_mul(index, &det, &tmp); // tmp = (sublat->denom)⁴ ibz_mul(&tmp, &sublat->denom, &sublat->denom); ibz_mul(&tmp, &tmp, &tmp); + // det = det(overlat->basis) + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &overlat->basis); // tmp = (sublat->denom)⁴ · det(overlat->basis) - for (int i = 0; i < 4; i++) { - ibz_mul(&tmp, &tmp, &overlat->basis[i][i]); - } + ibz_mul(&tmp, &tmp, &det); // index = index / tmp ibz_div(index, &tmp, index, &tmp); assert(ibz_is_zero(&tmp)); // index = |index| ibz_abs(index, index); - + ibz_finalize(&tmp); + ibz_finalize(&det); } -void quat_lattice_hnf(quat_lattice_t *lat){ - ibz_mat_4x8_t hnf_input; - ibz_mat_4x8_init(&hnf_input); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(hnf_input[i][j]),0); - } - } - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_copy(&(hnf_input[i][4+j]),&(lat->basis[i][j])); - } - } - ibz_mat_4x8_hnf_core(&(lat->basis),&hnf_input); - quat_lattice_reduce_denom(lat,lat); - ibz_mat_4x8_finalize(&hnf_input); -} - -int quat_lattice_random_elem(quat_alg_elem_t *elem, const quat_lattice_t *lattice, unsigned char n) { - assert(n <= 64); - - // Set elem to 0 - for (int i = 0; i < 4; i++) - ibz_set(&elem->coord[i], 0); - ibz_set(&elem->denom, 1); - - // Take random coefficients - int64_t rand[4]; - int randret = randombytes((unsigned char*)rand, 4*sizeof(uint64_t)); - if (randret != 0) - return 0; - - // Make the linear combination - quat_alg_elem_t tmp; - quat_alg_elem_init(&tmp); - for (int j = 0; j < 4; j++) { - rand[j] >>= (64-n); - for (int i = 0; i < 4; i++) { - ibz_set(&tmp.coord[i], rand[j]); - ibz_mul(&tmp.coord[i], &tmp.coord[i], &lattice->basis[i][j]); - } - quat_alg_add(elem, elem, &tmp); - } - quat_alg_elem_finalize(&tmp); - - // Set the denominator - ibz_copy(&elem->denom, &lattice->denom); - - return 1; -} - -/** Right transporter **/ - -/** @brief to[to_row] = (-1)^neg · c · from[from_row] - * - * c may be NULL, in which case c = 1 - */ -static inline void copy_row(ibz_mat_4x4_t to, int to_row, int neg, const ibz_t *c, const ibz_mat_4x4_t from, int from_row) { - for (int j = 0; j < 4; j++) { - if (c) - ibz_mul(&to[to_row][j], c, &from[from_row][j]); - else - ibz_copy(&to[to_row][j], &from[from_row][j]); - if (neg) - ibz_neg(&to[to_row][j], &to[to_row][j]); - } -} - -/** @brief copy matrix into columns of cols - */ -static inline void mat_to_col_16x4(ibz_t (*cols)[16][4], int col, const ibz_mat_4x4_t *mat) { - for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) - ibz_copy(&((*cols)[j+4*i][col]), &((*mat)[i][j])); -} - -/** @brief take the gcd of content with all entries - */ -static inline void mat_16x4_content(ibz_t *content, const ibz_t (*mat)[16][4]){ - for(int i = 0; i < 16; i++) - for(int j = 0; j < 4; j++) - ibz_gcd(content, content, &((*mat)[i][j])); -} - -/** @brief take the gcd of content with all entries - */ -static inline void mat_16x4_mul_by_scalar(ibz_t (*prod)[16][4], const ibz_t (*mat)[16][4],const ibz_t *scalar){ - for(int i = 0; i < 16; i++) - for(int j = 0; j < 4; j++) - ibz_mul(&((*prod)[i][j]), scalar, &((*mat)[i][j])); -} - -/** @brief take the gcd of content with all entries - */ -static inline int mat_16x4_div_by_scalar(ibz_t (*quot)[16][4], const ibz_t (*mat)[16][4],const ibz_t *scalar){ - int ok = 1; - ibz_t r; - ibz_init(&r); - for(int i = 0; i < 16; i++) - for(int j = 0; j < 4; j++) - ibz_div(&((*quot)[i][j]),&r,&((*mat)[i][j]),scalar); - ok = ok && (ibz_is_zero(&r)); - ibz_finalize(&r); - return(ok); -} - -void quat_lattice_right_transporter(quat_lattice_t *trans, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg) +void +quat_lattice_hnf(quat_lattice_t *lat) { - ibz_t det1, det2, tmp, thrash, content; - ibz_mat_4x4_t lat2_inv, tmpmat; - ibz_t work[16][4]; - ibz_init(&det1); - ibz_init(&det2); - ibz_init(&tmp); - ibz_init(&thrash); - ibz_init(&content); - ibz_mat_4x4_init(&lat2_inv); - ibz_mat_4x4_init(&tmpmat); - ibz_mat_init(16,4,work); - - // Compute the dual lattice Λ₂* of Λ₂ = num(lat2) - // Could be optimized, given it's triangular - // M₂ = Λ₂*/det₂ - int invertible = ibz_mat_4x4_inv_with_det_as_denom(&lat2_inv, &det2, &lat2->basis); - assert(invertible); - - // WARNING: hard-cording right multiplication table of "standard" basis - // Prone to breakage if the basis changes - // - // M = d₂/(d₁ det₂) · table - // - // Λ₂* Id Λ₁ - ibz_mat_4x4_mul(&tmpmat, &lat2_inv, &lat1->basis); - mat_to_col_16x4(&work, 0, &tmpmat); - // Λ₂* [0 -1 0 0 ; 1 0 0 0 ; 0 0 0 1 ; 0 0 -1 0] Λ₁ - copy_row(tmpmat, 0, 1, NULL, lat1->basis, 1); - copy_row(tmpmat, 1, 0, NULL, lat1->basis, 0); - copy_row(tmpmat, 2, 0, NULL, lat1->basis, 3); - copy_row(tmpmat, 3, 1, NULL, lat1->basis, 2); - ibz_mat_4x4_mul(&tmpmat, &lat2_inv, &tmpmat); - mat_to_col_16x4(&work, 1, &tmpmat); - // Λ₂* [0 0 -p 0 ; 0 0 0 -p ; 1 0 0 0 ; 0 1 0 0] Λ₁ - copy_row(tmpmat, 0, 1, &alg->p, lat1->basis, 2); - copy_row(tmpmat, 1, 1, &alg->p, lat1->basis, 3); - copy_row(tmpmat, 2, 0, NULL, lat1->basis, 0); - copy_row(tmpmat, 3, 0, NULL, lat1->basis, 1); - ibz_mat_4x4_mul(&tmpmat, &lat2_inv, &tmpmat); - mat_to_col_16x4(&work, 2, &tmpmat); - // Λ₂*[0 0 0 -p ; 0 0 p 0 ; 0 -1 0 0 ; 1 0 0 0] Λ₁ - copy_row(tmpmat, 0, 1, &alg->p, lat1->basis, 3); - copy_row(tmpmat, 1, 0, &alg->p, lat1->basis, 2); - copy_row(tmpmat, 2, 1, NULL, lat1->basis, 1); - copy_row(tmpmat, 3, 0, NULL, lat1->basis, 0); - ibz_mat_4x4_mul(&tmpmat, &lat2_inv, &tmpmat); - mat_to_col_16x4(&work, 3, &tmpmat); - - ibz_mul(&det1, &lat1->basis[0][0], &lat1->basis[1][1]); - ibz_mul(&tmp, &lat1->basis[2][2], &lat1->basis[3][3]); - ibz_mul(&det1, &det1, &tmp); - ibz_mul(&det1, &det1, &lat2->denom); - ibz_gcd(&tmp, &det1, &lat1->denom); - ibz_div(&det1, &thrash, &det1, &tmp); - - { - int ok = 1; - mat_16x4_content(&content,&work); - ok &= mat_16x4_div_by_scalar(&work,&work,&content); - assert(ok); - - ibz_mul(&content, &content, &lat2->denom); - ibz_mul(&det2, &det2, &lat1->denom); - ibz_gcd(&tmp, &det2, &content); - ibz_div(&det2, &thrash, &det2, &tmp); - ibz_div(&content, &thrash, &content, &tmp); - mat_16x4_mul_by_scalar(&work,&work,&content); - ibz_mul(&det2, &det2, &det1); - - ibz_mat_right_ker_mod(16, 4, trans->basis, work, &det2); - ibz_mat_4x4_hnf_mod(&trans->basis, &trans->basis, &det2); - ibz_copy(&trans->denom, &det1); - quat_lattice_reduce_denom(trans, trans); + ibz_t mod; + ibz_vec_4_t generators[4]; + ibz_init(&mod); + ibz_mat_4x4_inv_with_det_as_denom(NULL, &mod, &(lat->basis)); + ibz_abs(&mod, &mod); + for (int i = 0; i < 4; i++) + ibz_vec_4_init(&(generators[i])); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_copy(&(generators[j][i]), &(lat->basis[i][j])); + } } - - ibz_mat_finalize(16,4,work); - ibz_finalize(&det1); - ibz_finalize(&det2); - ibz_finalize(&tmp); - ibz_finalize(&thrash); - ibz_finalize(&content); - ibz_mat_4x4_finalize(&lat2_inv); - ibz_mat_4x4_finalize(&tmpmat); + ibz_mat_4xn_hnf_mod_core(&(lat->basis), 4, generators, &mod); + quat_lattice_reduce_denom(lat, lat); + ibz_finalize(&mod); + for (int i = 0; i < 4; i++) + ibz_vec_4_finalize(&(generators[i])); +} + +void +quat_lattice_gram(ibz_mat_4x4_t *G, const quat_lattice_t *lattice, const quat_alg_t *alg) +{ + ibz_t tmp; + ibz_init(&tmp); + for (int i = 0; i < 4; i++) { + for (int j = 0; j <= i; j++) { + ibz_set(&(*G)[i][j], 0); + for (int k = 0; k < 4; k++) { + ibz_mul(&tmp, &(lattice->basis)[k][i], &(lattice->basis)[k][j]); + if (k >= 2) + ibz_mul(&tmp, &tmp, &alg->p); + ibz_add(&(*G)[i][j], &(*G)[i][j], &tmp); + } + ibz_mul(&(*G)[i][j], &(*G)[i][j], &ibz_const_two); + } + } + for (int i = 0; i < 4; i++) { + for (int j = i + 1; j < 4; j++) { + ibz_copy(&(*G)[i][j], &(*G)[j][i]); + } + } + ibz_finalize(&tmp); } diff --git a/src/quaternion/ref/generic/lll.c b/src/quaternion/ref/generic/lll.c deleted file mode 100644 index 9391578..0000000 --- a/src/quaternion/ref/generic/lll.c +++ /dev/null @@ -1,366 +0,0 @@ -#include -#include "internal.h" - -// RED(k,l) sub-algorithm -static void RED(ibz_mat_4x4_t *basis, ibq_t (*u)[4][4], ibz_t (*H)[4][4], int k, int l) { - ibq_t tmp, tmp2; - ibz_t q, tibz, num, den, r; - ibq_init(&tmp); - ibq_init(&tmp2); - ibz_init(&q); - ibz_init(&tibz); - ibz_init(&num); - ibz_init(&den); - ibz_init(&r); - ibz_set(&num,1); - ibz_set(&den,2); - ibq_set(&tmp,&num,&den); - ibz_set(&num,0); - ibz_set(&den,0); - - // if |u_{k,l}| <= 0.5, terminate - ibq_abs(&tmp2, &((*u)[k][l])); - if (ibq_cmp(&tmp2, &tmp) <= 0) - goto end; - - // q <- floor(0.5 + u_{k,l}) - ibq_add(&tmp, &tmp, &((*u)[k][l])); - - ibq_num(&num, &tmp); - ibq_denom(&den, &tmp); - //FDIV was used, needs reeimplementation - ibz_div_floor(&q,&r, &num, &den); - //ibq_floor(tmp, tmp); - //ibz_set_f(q, tmp); - - // b_k = b_k - q*b_l - for (int i = 0; i < 4; ++i) { - ibz_mul(&tibz, &q, &((*basis)[l][i])); - ibz_sub(&((*basis)[k][i]), &((*basis)[k][i]), &tibz); - } - - // H_k = H_k - q*H_l - for (int i = 0; i < 4; ++i) { - ibz_mul(&tibz, &q, &((*H)[l][i])); - ibz_sub(&((*H)[k][i]), &((*H)[k][i]), &tibz); - } - - // u_{k,j} = u_{k,l}-q - ibq_set(&tmp2, &q,&ibz_const_one); - ibq_sub(&((*u)[k][l]), &((*u)[k][l]), &tmp2); - - // forall_i \in 1..l-1: u_{k,i} = u_{k,i} - q*u_{l,i} - for (int i = 0; i <= l-1; ++i) { - ibq_mul(&tmp, &tmp2, &((*u)[l][i])); - ibq_sub(&((*u)[k][i]), &((*u)[k][i]), &tmp); - } - -end: - ibq_finalize(&tmp); - ibq_finalize(&tmp2); - ibz_finalize(&q); - ibz_finalize(&tibz); - ibz_finalize(&num); - ibz_finalize(&den); - ibz_finalize(&r); -} - -// SWAP(k) sub-algorithm -static void SWAP(ibz_mat_4x4_t *basis, ibq_t (*u)[4][4], ibz_t (*H)[4][4], ibq_t (*B)[4], ibq_t (*bStar)[4][4], int k, int kmax) { - ibq_t tmp, tmp2, tmp3, u_tmp, B_tmp, b[4]; - ibq_init(&tmp); - ibq_init(&tmp2); - ibq_init(&tmp3); - ibq_init(&u_tmp); - ibq_init(&B_tmp); - - for (int i = 0; i < 4; ++i) { - ibq_init(&(b[i])); - } - - // swap b_k and b_{k-1} - for (int i = 0; i < 4; ++i) { - ibz_swap(&((*basis)[k][i]), &((*basis)[k-1][i])); - } - - // swap H_k and H_{k-1} - for (int i = 0; i < 4; ++i) { - ibz_swap(&((*H)[k][i]), &((*H)[k-1][i])); - } - - if (k > 1) { - // swap u_{k,j} and u_{k-1,j} - for (int j = 0; j <= k - 2; ++j) { - ibq_swap(&((*u)[k][j]), &((*u)[k-1][j])); - } - } - - // u = u_{k,k-1} - ibq_copy(&u_tmp, &((*u)[k][k - 1])); - - // B = B_k + u^2*B_{k-1} - ibq_mul(&B_tmp, &u_tmp, &u_tmp); - ibq_mul(&B_tmp, &B_tmp, &((*B)[k-1])); - ibq_add(&B_tmp, &((*B)[k]), &B_tmp); - - // u_{k,k-1} = u*B_{k-1} / B - ibq_mul(&tmp, &u_tmp, &((*B)[k-1])); - ibq_div(&((*u)[k][k-1]), &tmp, &B_tmp); - - // b = bSTAR_{k-1} - for (int i = 0; i < 4; ++i) { - ibq_copy(&(b[i]), &((*bStar)[k-1][i])); - } - // bSTAR_{k-1}=bSTAR_k+u*b - for (int i = 0; i < 4; ++i) { - ibq_mul(&tmp, &u_tmp, &(b[i])); - ibq_add(&((*bStar)[k-1][i]), &((*bStar)[k][i]), &tmp); - } - // bSTAR_k = -u_{k,k-1}*bSTAR_k+(B_k/B)*b - ibq_div(&tmp2, &((*B)[k]), &B_tmp); // B_k/B - ibq_neg(&tmp, &((*u)[k][k-1])); - for (int i = 0; i < 4; ++i) { - ibq_mul(&((*bStar)[k][i]), &tmp, &((*bStar)[k][i])); - ibq_mul(&tmp3, &tmp2, &(b[i])); - ibq_add(&((*bStar)[k][i]), &((*bStar)[k][i]), &tmp3); - } - - // B_k = B_{k-1}*B_k/B - ibq_mul(&((*B)[k]), &((*B)[k-1]), &((*B)[k])); - ibq_div(&((*B)[k]), &((*B)[k]), &B_tmp); - - // B_{k-1} = B - ibq_copy(&((*B)[k-1]), &B_tmp); - - for (int i = k+1; i <= kmax; ++i) { - // t = u_{i,k} - ibq_copy(&tmp, &((*u)[i][k])); - - // u_{i,k} = u_{i,k-1} - u*t - ibq_mul(&((*u)[i][k]), &u_tmp, &tmp); - ibq_sub(&((*u)[i][k]), &((*u)[i][k-1]), &((*u)[i][k])); - - // u_{i,k-1} = t + u_{k,k-1}*u_{i,k} - ibq_mul(&tmp2, &((*u)[k][k-1]), &((*u)[i][k])); - ibq_add(&((*u)[i][k-1]), &tmp, &tmp2); - } - - ibq_finalize(&tmp); - ibq_finalize(&tmp2); - ibq_finalize(&tmp3); - ibq_finalize(&u_tmp); - ibq_finalize(&B_tmp); - for (int i = 0; i < 4; ++i) { - ibq_finalize(&(b[i])); - } - -} - -// m1[0]*m2[0] + m1[1]*m2[1] + q*(m1[2]*m2[2] + m1[3]*m2[3]) -static void dotproduct_row(ibz_t *mul, const ibz_mat_4x4_t *m1, const ibz_mat_4x4_t *m2, const ibz_t *q, int m1j, int m2j) { - ibz_set(mul, 0); - ibz_t tmp1, tmp2; - ibz_init(&tmp1); - ibz_init(&tmp2); - for (int i = 0; i < 2; ++i) { - ibz_mul(&tmp1, &((*m1)[m1j][i]), &((*m2)[m2j][i])); - ibz_add(mul, mul, &tmp1); - } - for (int i = 2; i < 4; ++i) { - ibz_mul(&tmp1, &((*m1)[m1j][i]), &((*m2)[m2j][i])); - ibz_add(&tmp2, &tmp2, &tmp1); - } - ibz_mul(&tmp2, &tmp2, q); - ibz_add(mul, mul, &tmp2); - - ibz_finalize(&tmp1); - ibz_finalize(&tmp2); -} - -static void dotproduct_zr_row(ibq_t *mul, const ibz_mat_4x4_t *m1, const ibq_t (*m2)[4][4], const ibz_t *q, int m1j, int m2j) { - ibq_set(mul, &ibz_const_zero, &ibz_const_one); - ibq_t tmp1, tmp2; - ibq_init(&tmp1); - ibq_init(&tmp2); - for (int i = 0; i < 2; ++i) { - ibq_set(&tmp1, &((*m1)[m1j][i]), &ibz_const_one); - ibq_mul(&tmp1, &tmp1, &((*m2)[m2j][i])); - ibq_add(mul, mul, &tmp1); - } - for (int i = 2; i < 4; ++i) { - ibq_set(&tmp1, &((*m1)[m1j][i]), &ibz_const_one); - ibq_mul(&tmp1, &tmp1, &((*m2)[m2j][i])); - ibq_add(&tmp2, &tmp2, &tmp1); - } - ibq_set(&tmp1, q, &ibz_const_one); - ibq_mul(&tmp2, &tmp2, &tmp1); - ibq_add(mul, mul, &tmp2); - - ibq_finalize(&tmp1); - ibq_finalize(&tmp2); -} - -static void dotproduct_rr_row(ibq_t *mul, const ibq_t (*m1)[4][4], const ibq_t (*m2)[4][4], const ibz_t *q, int m1j, int m2j) { - //ibq_set(mul, 0); - ibq_set(mul, &ibz_const_zero, &ibz_const_one); - ibq_t tmp1, tmp2; - ibq_init(&tmp1); - ibq_init(&tmp2); - for (int i = 0; i < 2; ++i) { - ibq_mul(&tmp1, &((*m1)[m1j][i]), &((*m2)[m2j][i])); - ibq_add(mul, mul, &tmp1); - } - for (int i = 2; i < 4; ++i) { - ibq_mul(&tmp1, &((*m1)[m1j][i]), &((*m2)[m2j][i])); - ibq_add(&tmp2, &tmp2, &tmp1); - } - ibq_set(&tmp1, q, &ibz_const_one); - ibq_mul(&tmp2, &tmp2, &tmp1); - ibq_add(mul, mul, &tmp2); - - ibq_finalize(&tmp1); - ibq_finalize(&tmp2); -} - -static void mul_row(ibq_t (*mul)[4][4], const ibq_t *a, const ibq_t (*m)[4][4], int j) { - for (int i = 0; i < 4; ++i) { - ibq_mul(&((*mul)[j][i]), a, &((*m)[j][i])); - } -} - -static void add_row(ibz_mat_4x4_t *add, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b, int j, int aj, int bj) { - for (int i = 0; i < 4; ++i) { - ibz_add(&((*add)[j][i]), &((*a)[aj][i]), &((*b)[bj][i])); - } -} - -static void sub_row(ibq_t (*add)[4][4], const ibq_t (*a)[4][4], const ibq_t (*b)[4][4], int j, int aj, int bj) { - for (int i = 0; i < 4; ++i) { - ibq_sub(&((*add)[j][i]), &((*a)[aj][i]), &((*b)[bj][i])); - } -} - -/// @brief LLL reduction on 4-dimensional lattice -/// Implements Algorithm 2.6.3 from Henri Cohen's "A Course in Computational Algebraic Number Theory" -/// @param red -/// @param lattice -/// @return -int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const ibz_t *q, int precision) { - (void) precision; - int ret = 0; - ibz_mat_4x4_t basis; - ibq_t bStar[4][4]; - ibq_t bStar_tmp[4][4]; - ibq_t tmp; - ibz_t tmp_z; - ibz_t den; - ibz_t num; - ibq_t cnst; - ibq_t u[4][4]; - ibz_t H[4][4]; // -> I_4 - ibq_t B[4]; - ibq_init(&tmp); - ibz_init(&tmp_z); - ibz_init(&den); - ibz_init(&num); - ibq_init(&cnst); - for (int i = 0; i < 4; ++i) - ibq_init(&(B[i])); - - ibz_mat_4x4_init(&basis); - ibz_mat_4x4_transpose(&basis, &(lattice->basis)); - - // Step 1: Initialize: ... - for (int i = 0; i < 4; ++i) { - for (int j = 0; j < 4; ++j) { - ibq_init(&(u[i][j])); - ibq_init(&(bStar[i][j])); - ibq_init(&(bStar_tmp[i][j])); - // bSTAR_1 = b_1 (we copy all) - if (i == j){ - ibz_init(&(H[i][j])); - ibz_set(&(H[i][j]), 1); - } - else { - ibz_init(&(H[i][j])); - } - } - } - int k = 1, kmax = 0; - // bStar_1 = b_1 - for (int i = 0; i < 4; ++i) - ibq_set(&(bStar[0][i]), &(basis[0][i]), &ibz_const_one); - // B_1 = b_1 * b_1 - dotproduct_row(&tmp_z, &basis, &basis, q, 0, 0); - ibq_set(&(B[0]), &tmp_z, &ibz_const_one); - ibz_set(&num,99); - ibz_set(&den,100); - ibq_set(&cnst,&num,&den); - - while (k < 4) { - // Step 2: Incremental Gram-Schmidt - // if (k <= kmax) -> we can omit.. - if (k > kmax) { - kmax = k; - for (int i = 0; i < 4; ++i) { - ibq_set(&(bStar[k][i]), &(basis[k][i]), &ibz_const_one); - } - for (int j = 0; j <= k-1; ++j) { - // bStar_k = b_k -> already done initially - // nop - // u_{k,j} = b_k*bSTAR_j/B_j - dotproduct_zr_row(&tmp, &basis, &bStar, q, k, j); - ibq_div(&(u[k][j]), &tmp, &(B[j])); - // bStar_k = bStar_k - u_{k,j}*bStar_j - mul_row(&bStar_tmp, &(u[k][j]), &bStar, j); - sub_row(&bStar, &bStar, &bStar_tmp, k, k, j); - } - // B_k = bStar_k*bStar_k - dotproduct_rr_row(&(B[k]), &bStar, &bStar, q, k, k); - if (ibq_is_zero(&(B[k]))) { - // b_i did not form a basis, terminate with error - ret = -1; - goto err; - } - } - - while(1) { - // Step 3: Test LLL condition - RED(&basis, &u, &H, k, k - 1); - // If B_k < (0.75 - u_{k,k-1}^2)*B_{k-1} - ibq_mul(&tmp, &(u[k][k-1]), &(u[k][k-1])); - ibq_sub(&tmp, &cnst, &tmp); - ibq_mul(&tmp, &tmp, &(B[k-1])); - if (ibq_cmp(&(B[k]), &tmp) < 0) { - SWAP(&basis, &u, &H, &B, &bStar, k, kmax); - k = (k - 1 > 1 ? k - 1 : 1); - } else { - for (int l = k - 2; l >= 0; --l) { - RED(&basis, &u, &H, k, l); - } - k++; - break; - } - } - } - ibz_mat_4x4_transpose(red, &basis); - -err: - ibq_finalize(&tmp); - ibz_finalize(&tmp_z); - ibz_finalize(&num); - ibz_finalize(&den); - ibq_finalize(&cnst); - for (int i = 0; i < 4; ++i) { - for (int j = 0; j < 4; ++j) { - ibq_finalize(&(u[i][j])); - ibz_finalize(&(H[i][j])); - ibq_finalize(&(bStar[i][j])); - ibq_finalize(&(bStar_tmp[i][j])); - } - } - for (int i = 0; i < 4; ++i) - ibq_finalize(&(B[i])); - ibz_mat_4x4_finalize(&basis); - return ret; -} diff --git a/src/quaternion/ref/generic/lll/l2.c b/src/quaternion/ref/generic/lll/l2.c new file mode 100644 index 0000000..8c49b21 --- /dev/null +++ b/src/quaternion/ref/generic/lll/l2.c @@ -0,0 +1,190 @@ +#include +#include "lll_internals.h" +#include "internal.h" + +#include "dpe.h" + +// Access entry of symmetric matrix +#define SYM(M, i, j) (i < j ? &M[j][i] : &M[i][j]) + +void +quat_lll_core(ibz_mat_4x4_t *G, ibz_mat_4x4_t *basis) +{ + dpe_t dpe_const_one, dpe_const_DELTABAR; + + dpe_init(dpe_const_one); + dpe_set_ui(dpe_const_one, 1); + + dpe_init(dpe_const_DELTABAR); + dpe_set_d(dpe_const_DELTABAR, DELTABAR); + + // fp variables for Gram-Schmidt orthogonalization and Lovasz' conditions + dpe_t r[4][4], u[4][4], lovasz[4]; + for (int i = 0; i < 4; i++) { + dpe_init(lovasz[i]); + for (int j = 0; j <= i; j++) { + dpe_init(r[i][j]); + dpe_init(u[i][j]); + } + } + + // threshold for swaps + dpe_t delta_bar; + dpe_init(delta_bar); + dpe_set_d(delta_bar, DELTABAR); + + // Other work variables + dpe_t Xf, tmpF; + dpe_init(Xf); + dpe_init(tmpF); + ibz_t X, tmpI; + ibz_init(&X); + ibz_init(&tmpI); + + // Main L² loop + dpe_set_z(r[0][0], (*G)[0][0]); + int kappa = 1; + while (kappa < 4) { + // size reduce b_κ + int done = 0; + while (!done) { + // Recompute the κ-th row of the Choleski Factorisation + // Loop invariant: + // r[κ][j] ≈ u[κ][j] ‖b_j*‖² ≈ 〈b_κ, b_j*〉 + for (int j = 0; j <= kappa; j++) { + dpe_set_z(r[kappa][j], (*G)[kappa][j]); + for (int k = 0; k < j; k++) { + dpe_mul(tmpF, r[kappa][k], u[j][k]); + dpe_sub(r[kappa][j], r[kappa][j], tmpF); + } + if (j < kappa) + dpe_div(u[kappa][j], r[kappa][j], r[j][j]); + } + + done = 1; + // size reduce + for (int i = kappa - 1; i >= 0; i--) { + if (dpe_cmp_d(u[kappa][i], ETABAR) > 0 || dpe_cmp_d(u[kappa][i], -ETABAR) < 0) { + done = 0; + dpe_set(Xf, u[kappa][i]); + dpe_round(Xf, Xf); + dpe_get_z(X, Xf); + // Update basis: b_κ ← b_κ - X·b_i + for (int j = 0; j < 4; j++) { + ibz_mul(&tmpI, &X, &(*basis)[j][i]); + ibz_sub(&(*basis)[j][kappa], &(*basis)[j][kappa], &tmpI); + } + // Update lower half of the Gram matrix + // = - 2X + X² = + // - X - X( - X·) + //// 〈b_κ, b_κ〉 ← 〈b_κ, b_κ〉 - X·〈b_κ, b_i〉 + ibz_mul(&tmpI, &X, &(*G)[kappa][i]); + ibz_sub(&(*G)[kappa][kappa], &(*G)[kappa][kappa], &tmpI); + for (int j = 0; j < 4; j++) { // works because i < κ + // 〈b_κ, b_j〉 ← 〈b_κ, b_j〉 - X·〈b_i, b_j〉 + ibz_mul(&tmpI, &X, SYM((*G), i, j)); + ibz_sub(SYM((*G), kappa, j), SYM((*G), kappa, j), &tmpI); + } + // After the loop: + //// 〈b_κ,b_κ〉 ← 〈b_κ,b_κ〉 - X·〈b_κ,b_i〉 - X·(〈b_κ,b_i〉 - X·〈b_i, + /// b_i〉) = 〈b_κ - X·b_i, b_κ - X·b_i〉 + // + // Update u[kappa][j] + for (int j = 0; j < i; j++) { + dpe_mul(tmpF, Xf, u[i][j]); + dpe_sub(u[kappa][j], u[kappa][j], tmpF); + } + } + } + } + + // Check Lovasz' conditions + // lovasz[0] = ‖b_κ‖² + dpe_set_z(lovasz[0], (*G)[kappa][kappa]); + // lovasz[i] = lovasz[i-1] - u[κ][i-1]·r[κ][i-1] + for (int i = 1; i < kappa; i++) { + dpe_mul(tmpF, u[kappa][i - 1], r[kappa][i - 1]); + dpe_sub(lovasz[i], lovasz[i - 1], tmpF); + } + int swap; + for (swap = kappa; swap > 0; swap--) { + dpe_mul(tmpF, delta_bar, r[swap - 1][swap - 1]); + if (dpe_cmp(tmpF, lovasz[swap - 1]) < 0) + break; + } + + // Insert b_κ before b_swap + if (kappa != swap) { + // Insert b_κ before b_swap in the basis and in the lower half Gram matrix + for (int j = kappa; j > swap; j--) { + for (int i = 0; i < 4; i++) { + ibz_swap(&(*basis)[i][j], &(*basis)[i][j - 1]); + if (i == j - 1) + ibz_swap(&(*G)[i][i], &(*G)[j][j]); + else if (i != j) + ibz_swap(SYM((*G), i, j), SYM((*G), i, j - 1)); + } + } + // Copy row u[κ] and r[κ] in swap position, ignore what follows + for (int i = 0; i < swap; i++) { + dpe_set(u[swap][i], u[kappa][i]); + dpe_set(r[swap][i], r[kappa][i]); + } + dpe_set(r[swap][swap], lovasz[swap]); + // swap complete + kappa = swap; + } + + kappa += 1; + } + +#ifndef NDEBUG + // Check size-reducedness + for (int i = 0; i < 4; i++) + for (int j = 0; j < i; j++) { + dpe_abs(u[i][j], u[i][j]); + assert(dpe_cmp_d(u[i][j], ETABAR) <= 0); + } + // Check Lovasz' conditions + for (int i = 1; i < 4; i++) { + dpe_mul(tmpF, u[i][i - 1], u[i][i - 1]); + dpe_sub(tmpF, dpe_const_DELTABAR, tmpF); + dpe_mul(tmpF, tmpF, r[i - 1][i - 1]); + assert(dpe_cmp(tmpF, r[i][i]) <= 0); + } +#endif + + // Fill in the upper half of the Gram matrix + for (int i = 0; i < 4; i++) { + for (int j = i + 1; j < 4; j++) + ibz_copy(&(*G)[i][j], &(*G)[j][i]); + } + + // Clearinghouse + ibz_finalize(&X); + ibz_finalize(&tmpI); + dpe_clear(dpe_const_one); + dpe_clear(dpe_const_DELTABAR); + dpe_clear(Xf); + dpe_clear(tmpF); + dpe_clear(delta_bar); + for (int i = 0; i < 4; i++) { + dpe_clear(lovasz[i]); + for (int j = 0; j <= i; j++) { + dpe_clear(r[i][j]); + dpe_clear(u[i][j]); + } + } +} + +int +quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const quat_alg_t *alg) +{ + ibz_mat_4x4_t G; // Gram Matrix + ibz_mat_4x4_init(&G); + quat_lattice_gram(&G, lattice, alg); + ibz_mat_4x4_copy(red, &lattice->basis); + quat_lll_core(&G, red); + ibz_mat_4x4_finalize(&G); + return 0; +} diff --git a/src/quaternion/ref/generic/lll/lll_applications.c b/src/quaternion/ref/generic/lll/lll_applications.c new file mode 100644 index 0000000..6c763b8 --- /dev/null +++ b/src/quaternion/ref/generic/lll/lll_applications.c @@ -0,0 +1,127 @@ +#include +#include +#include "lll_internals.h" + +void +quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, + ibz_mat_4x4_t *gram, + const quat_left_ideal_t *lideal, + const quat_alg_t *alg) +{ + assert(quat_order_is_maximal((lideal->parent_order), alg)); + ibz_t gram_corrector; + ibz_init(&gram_corrector); + ibz_mul(&gram_corrector, &(lideal->lattice.denom), &(lideal->lattice.denom)); + quat_lideal_class_gram(gram, lideal, alg); + ibz_mat_4x4_copy(reduced, &(lideal->lattice.basis)); + quat_lll_core(gram, reduced); + ibz_mat_4x4_scalar_mul(gram, &gram_corrector, gram); + for (int i = 0; i < 4; i++) { + ibz_div_2exp(&((*gram)[i][i]), &((*gram)[i][i]), 1); + for (int j = i + 1; j < 4; j++) { + ibz_set(&((*gram)[i][j]), 0); + } + } + ibz_finalize(&gram_corrector); +} + +void +quat_lideal_lideal_mul_reduced(quat_left_ideal_t *prod, + ibz_mat_4x4_t *gram, + const quat_left_ideal_t *lideal1, + const quat_left_ideal_t *lideal2, + const quat_alg_t *alg) +{ + ibz_mat_4x4_t red; + ibz_mat_4x4_init(&red); + + quat_lattice_mul(&(prod->lattice), &(lideal1->lattice), &(lideal2->lattice), alg); + prod->parent_order = lideal1->parent_order; + quat_lideal_norm(prod); + quat_lideal_reduce_basis(&red, gram, prod, alg); + ibz_mat_4x4_copy(&(prod->lattice.basis), &red); + + ibz_mat_4x4_finalize(&red); +} + +int +quat_lideal_prime_norm_reduced_equivalent(quat_left_ideal_t *lideal, + const quat_alg_t *alg, + const int primality_num_iter, + const int equiv_bound_coeff) +{ + ibz_mat_4x4_t gram, red; + ibz_mat_4x4_init(&gram); + ibz_mat_4x4_init(&red); + + int found = 0; + + // computing the reduced basis + quat_lideal_reduce_basis(&red, &gram, lideal, alg); + + quat_alg_elem_t new_alpha; + quat_alg_elem_init(&new_alpha); + ibz_t tmp, remainder, adjusted_norm; + ibz_init(&tmp); + ibz_init(&remainder); + ibz_init(&adjusted_norm); + + ibz_mul(&adjusted_norm, &lideal->lattice.denom, &lideal->lattice.denom); + + int ctr = 0; + + // equiv_num_iter = (2 * equiv_bound_coeff + 1)^4 + assert(equiv_bound_coeff < (1 << 20)); + int equiv_num_iter = (2 * equiv_bound_coeff + 1); + equiv_num_iter = equiv_num_iter * equiv_num_iter; + equiv_num_iter = equiv_num_iter * equiv_num_iter; + + while (!found && ctr < equiv_num_iter) { + ctr++; + // we select our linear combination at random + ibz_rand_interval_minm_m(&new_alpha.coord[0], equiv_bound_coeff); + ibz_rand_interval_minm_m(&new_alpha.coord[1], equiv_bound_coeff); + ibz_rand_interval_minm_m(&new_alpha.coord[2], equiv_bound_coeff); + ibz_rand_interval_minm_m(&new_alpha.coord[3], equiv_bound_coeff); + + // computation of the norm of the vector sampled + quat_qf_eval(&tmp, &gram, &new_alpha.coord); + + // compute the norm of the equivalent ideal + // can be improved by removing the power of two first and the odd part only if the trial + // division failed (this should always be called on an ideal of norm 2^x * N for some + // big prime N ) + ibz_div(&tmp, &remainder, &tmp, &adjusted_norm); + + // debug : check that the remainder is zero + assert(ibz_is_zero(&remainder)); + + // pseudo-primality test + if (ibz_probab_prime(&tmp, primality_num_iter)) { + + // computes the generator using a matrix multiplication + ibz_mat_4x4_eval(&new_alpha.coord, &red, &new_alpha.coord); + ibz_copy(&new_alpha.denom, &lideal->lattice.denom); + assert(quat_lattice_contains(NULL, &lideal->lattice, &new_alpha)); + + quat_alg_conj(&new_alpha, &new_alpha); + ibz_mul(&new_alpha.denom, &new_alpha.denom, &lideal->norm); + quat_lideal_mul(lideal, lideal, &new_alpha, alg); + assert(ibz_probab_prime(&lideal->norm, primality_num_iter)); + + found = 1; + break; + } + } + assert(found); + + ibz_finalize(&tmp); + ibz_finalize(&remainder); + ibz_finalize(&adjusted_norm); + quat_alg_elem_finalize(&new_alpha); + + ibz_mat_4x4_finalize(&gram); + ibz_mat_4x4_finalize(&red); + + return found; +} diff --git a/src/quaternion/ref/generic/lll/lll_benchmarks.c b/src/quaternion/ref/generic/lll/lll_benchmarks.c new file mode 100644 index 0000000..6b9bfba --- /dev/null +++ b/src/quaternion/ref/generic/lll/lll_benchmarks.c @@ -0,0 +1,377 @@ +#include "lll_internals.h" +#include "quaternion_tests.h" +#include +#include +#include + +// norms must be either a vector of length iterations of norms or NULL +int +quat_bench_lll_benchmark_lll_core(int bitsize, + int iterations, + int warmup_loops, //(int)(100000 / (bitsize*bitsize)) + 1; + quat_lattice_t *lattices, + const ibz_t *norms, + const quat_alg_t *alg, + int add_tests) +{ + int res = 0; + uint64_t start, end, time; + quat_lattice_t test; + ibz_t num, denom; + ibq_t eta, delta; + ibz_mat_4x4_t *reds; + ibz_mat_4x4_t gram; + ibz_init(&num); + ibz_init(&denom); + ibq_init(&eta); + ibq_init(&delta); + quat_lattice_init(&test); + ibz_mat_4x4_init(&gram); + quat_lll_set_ibq_parameters(&delta, &eta); + + reds = (ibz_mat_4x4_t *)malloc(iterations * sizeof(ibz_mat_4x4_t)); + for (int i = 0; i < iterations; i++) + ibz_mat_4x4_init(&(reds[i])); + + // warmup setup + quat_lattice_t *wu; + ibz_mat_4x4_t *wur; + wu = (quat_lattice_t *)malloc(warmup_loops * sizeof(quat_lattice_t)); + wur = (ibz_mat_4x4_t *)malloc(warmup_loops * sizeof(ibz_mat_4x4_t)); + for (int i = 0; i < warmup_loops; i++) { + quat_lattice_init(&(wu[i])); + ibz_mat_4x4_init(&(wur[i])); + } + quat_test_input_random_lattice_generation(wu, bitsize, warmup_loops, 1); + // Case for unknown norms + if (norms == NULL) { + printf("Start warmup and measures for bitsize %d iterations %d with non-ideals\n", bitsize, iterations); + // warmup loop + for (int iter = 0; iter < warmup_loops; iter++) { + quat_lattice_gram(&gram, &(lattices[iter]), alg); + ibz_mat_4x4_copy(&(reds[iter]), &(lattices[iter].basis)); + quat_lll_core(&gram, &(reds[iter])); + } + // benchmark loop + start = cpucycles(); + for (int iter = 0; iter < iterations; iter++) { + quat_lattice_gram(&gram, &(lattices[iter]), alg); + ibz_mat_4x4_copy(&(reds[iter]), &(lattices[iter].basis)); + quat_lll_core(&gram, &(reds[iter])); + } + end = cpucycles(); + } else { + // Using division by norm + quat_lattice_t O0; + quat_left_ideal_t *ideals; + quat_lattice_init(&O0); + quat_lattice_O0_set(&O0); + ideals = (quat_left_ideal_t *)malloc(iterations * sizeof(quat_left_ideal_t)); + for (int i = 0; i < iterations; i++) { + quat_left_ideal_init(&(ideals[i])); + ibz_mat_4x4_copy(&(ideals[i].lattice.basis), &(lattices[i].basis)); + ibz_copy(&(ideals[i].lattice.denom), &(lattices[i].denom)); + ibz_copy(&(ideals[i].norm), &(norms[i])); + (ideals[i].parent_order) = &O0; + } + + printf("Start warmup and measures for bitsize %d iterations %d with ideals\n", bitsize, iterations); + // warmup loop + for (int iter = 0; iter < warmup_loops; iter++) { + quat_lideal_class_gram(&gram, &(ideals[iter % iterations]), alg); + ibz_mat_4x4_copy(&(reds[iter % iterations]), &(ideals[iter % iterations].lattice.basis)); + quat_lll_core(&gram, &(reds[iter % iterations])); + } + // benchmark loop + start = cpucycles(); + for (int iter = 0; iter < iterations; iter++) { + quat_lideal_class_gram(&gram, &(ideals[iter]), alg); + ibz_mat_4x4_copy(&(reds[iter]), &(ideals[iter].lattice.basis)); + quat_lll_core(&gram, &(reds[iter])); + } + end = cpucycles(); + for (int i = 0; i < iterations; i++) + quat_left_ideal_finalize(&(ideals[i])); + free(ideals); + quat_lattice_finalize(&O0); + } + // results output + time = (end - start); + printf("%" PRIu64 " cycles per lattice\n%d Lattices %" PRIu64 " cycles total\n", + (uint64_t)(time / iterations), + iterations, + time); + + // test loop + if (add_tests) { + for (int iter = 0; iter < iterations; iter++) { + // test lll reduced + res = res || !quat_lll_verify(&(reds[iter]), &delta, &eta, alg); + // test lattice equality + ibz_copy(&(test.denom), &((lattices[iter]).denom)); + ibz_mat_4x4_copy(&(test.basis), &(reds[iter])); + quat_lattice_hnf(&test); + res = res || !quat_lattice_equal(&test, &(lattices[iter])); + } + + if (res != 0) { + printf("Quaternion benchmark tests for lll_core failed\n"); + } + } + printf("\n"); + + ibz_finalize(&num); + ibz_finalize(&denom); + ibq_finalize(&delta); + ibq_finalize(&eta); + quat_lattice_finalize(&test); + ibz_mat_4x4_finalize(&gram); + for (int i = 0; i < warmup_loops; i++) { + quat_lattice_finalize(&(wu[i])); + ibz_mat_4x4_finalize(&(wur[i])); + } + for (int i = 0; i < iterations; i++) + ibz_mat_4x4_finalize(&(reds[i])); + free(reds); + free(wu); + free(wur); + return (res); +} + +// ideals determines if generated as ideals: 0 means ideals, 1 lattices without HNF, 2 and any other +// number lattices in HNF tests if tests are run +int +quat_bench_lll_one_level(const ibz_t *prime, + const int *norm_bitsizes, + int nb_bitsizes, + int iterations, + int ideals, + int tests) +{ + // initializations + quat_alg_t alg; + quat_p_extremal_maximal_order_t order; + quat_lattice_t *lattices; + ibz_t *norms; + const ibz_t *used_norms; + quat_represent_integer_params_t params; + quat_alg_init_set(&alg, prime); + lattices = malloc(iterations * sizeof(quat_lattice_t)); + norms = malloc(iterations * sizeof(ibz_t)); + // initialize params: + quat_lattice_init(&(order.order)); + quat_alg_elem_init(&(order.t)); + quat_alg_elem_init(&(order.z)); + quat_lattice_O0_set_extremal(&order); + params.algebra = &alg; + params.order = ℴ + params.primality_test_iterations = 30; + int res = 0; + int randret = 0; + if (ideals == 0) { + used_norms = norms; + } else { + used_norms = NULL; + } + + // run benchmarks + for (int i = 0; i < iterations; i++) { + quat_lattice_init(&(lattices[i])); + ibz_init(&(norms[i])); + } + for (int i = 0; i < nb_bitsizes; i++) { + int warmups = (int)(100000 / (norm_bitsizes[i] * norm_bitsizes[i])) + 1; + if (ideals == 0) { + randret = randret || quat_test_input_random_ideal_lattice_generation( + lattices, norms, norm_bitsizes[i], iterations, ¶ms); + } else { + randret = randret || quat_test_input_random_lattice_generation( + lattices, norm_bitsizes[i], iterations, ideals - 1); // in HNF + } + if (!randret) { + res = res || quat_bench_lll_benchmark_lll_core( + norm_bitsizes[i], iterations, warmups, lattices, used_norms, &alg, tests); + } + } + quat_alg_finalize(&alg); + for (int i = 0; i < iterations; i++) { + ibz_finalize(&(norms[i])); + quat_lattice_finalize(&(lattices[i])); + } + quat_lattice_finalize(&(order.order)); + quat_alg_elem_finalize(&(order.t)); + quat_alg_elem_finalize(&(order.z)); + free(norms); + free(lattices); + return (res + 2 * (randret)); +} + +// this function must be adapted if algorithms or parameters change +int +quat_bench_lll_level(int lvl, int iterations, int ideals, int tests) +{ + if (!((lvl == 1) || (lvl == 3) || (lvl == 5))) { + printf("Invalid input level to quat_bench_lll_level: %d\n", lvl); + return (1); + } + ibz_t prime; + int norm_bitsizes[4] = { 0 }; + int nb_bitsizes = 4; + ibz_init(&prime); + if (lvl == 5) { + ibz_set_from_str(&prime, + "1afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffff", + 16); + norm_bitsizes[0] = 254; + norm_bitsizes[1] = 254; + norm_bitsizes[2] = 747; + norm_bitsizes[3] = 1006; + } + if (lvl == 3) { + ibz_set_from_str(&prime, + "40fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "fffffffffffffffffffffff", + 16); + norm_bitsizes[0] = 193; + norm_bitsizes[1] = 193; + norm_bitsizes[2] = 571; + norm_bitsizes[3] = 761; + } + if (lvl == 1) { + ibz_set_from_str(&prime, "4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16); + norm_bitsizes[0] = 127; + norm_bitsizes[1] = 127; + norm_bitsizes[2] = 377; + norm_bitsizes[3] = 501; + } + printf("Running benchmarks for lvl %d with bitsizes of [%d, %d, %d, %d] \n", + lvl, + norm_bitsizes[0], + norm_bitsizes[1], + norm_bitsizes[2], + norm_bitsizes[3]); + printf("Using prime "); + ibz_print(&prime, 10); + printf("\n"); + printf("With %d iterations, ", iterations); + if (tests == 0) + printf("no "); + printf("tests, and lattices generated as "); + if (ideals == 0) + printf("ideals"); + else { + printf("lattices"); + if (ideals != 1) + printf("not in hnf"); + } + printf("\n\n"); + int res = quat_bench_lll_one_level(&prime, norm_bitsizes, nb_bitsizes, iterations, ideals, tests); + ibz_finalize(&prime); + return (res); +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12]; + int iterations = SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + int tests = 0; + int ideals = 0; + int res = 0; + int level = 1; + int level_set = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!tests && strcmp(argv[i], "--tests") == 0) { + tests = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (level_set == 0 && sscanf(argv[i], "--level=%d", &level) == 1) { + level_set = 1; + continue; + } + + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!help && strcmp(argv[i], "--not_ideals") == 0) { + ideals = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || (level != 1 && level != 3 && level != 5)) { + printf("Usage: %s [--level=] [--iterations=] [--tests] [--seed=]\n", argv[0]); + printf("Where is either 1 or 3 or 5; if not passed, runs on all levels\n"); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + printf("Additional verifications are run on each output if --tests is passed\n"); + printf("If --not_ideals is passed, input lattices are not generated as random O0 ideals of " + "norm of a level-specific bitsize, but as random lattices with entries of the same " + "bitsize\n"); + printf("Output has last bit set if tests failed, second-to-last if randomness failed\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + if (level_set != 0) { + res = quat_bench_lll_level(level, iterations, ideals, tests); + } else { + for (level = 1; level <= 5; level += 2) { + res |= quat_bench_lll_level(level, iterations, ideals, tests); + } + } + + return (res); +} + +// Notes on realistic benchmarks: +// Denominator is always 2 +// Lattice numerators have following maximal bitsizes (when in HNF): +// lvl5: 254, 254, 755-757, ni 1006 +// lvl3: 193, 193, 570-571, ni 760-761 +// lvl1: 127, 127, 372-377, ni 500-501 +// where only the "ni" ones are not calls through the ideal reduction function. +// The largest coeff of all ideals above is about 2 times its norm. +// The quat_bench_lll_level and main functions takes the above into account. +// In particular lattices are always generated as ideals of O0 in HNF. + +// Measures obtained by prints in the L2 function and its applications diff --git a/src/quaternion/ref/generic/lll/lll_tests.c b/src/quaternion/ref/generic/lll/lll_tests.c new file mode 100644 index 0000000..0a0c773 --- /dev/null +++ b/src/quaternion/ref/generic/lll/lll_tests.c @@ -0,0 +1,794 @@ +#include "lll_internals.h" +#include "quaternion_tests.h" +#include + +int +quat_test_lll_ibq_consts(void) +{ + int ret = 0; + ibq_t t; + ibz_t tmp1, tmp2, tmp3; + ibz_init(&tmp1); + ibz_init(&tmp2); + ibz_init(&tmp3); + ibq_init(&t); + + ibz_set(&tmp1, 123); + ibz_set(&tmp2, -123); + if (!ibq_set(&t, &tmp1, &tmp2)) { + ret = -1; + goto err; + } + + if (ibq_is_one(&t)) { + ret = -1; + goto err; + } + + if (!ibq_is_ibz(&t)) { + ret = -1; + goto err; + } + + if (!ibq_to_ibz(&tmp3, &t)) { + ret = -1; + goto err; + } + + if (ibz_is_one(&tmp3)) { + ret = -1; + goto err; + } + + ibz_set(&tmp2, 123); + if (!ibq_set(&t, &tmp1, &tmp2)) { + ret = -1; + goto err; + } + + if (!ibq_is_one(&t)) { + ret = -1; + goto err; + } + + if (!ibq_is_ibz(&t)) { + ret = -1; + goto err; + } + + if (!ibq_to_ibz(&tmp3, &t)) { + ret = -1; + goto err; + } + + if (!ibz_is_one(&tmp3)) { + ret = -1; + goto err; + } + + ibz_set(&tmp1, 0); + ibq_set(&t, &tmp1, &tmp2); + + if (!ibq_is_zero(&t)) { + ret = -1; + goto err; + } + + if (!ibq_is_ibz(&t)) { + ret = -1; + goto err; + } + + if (!ibq_to_ibz(&tmp3, &t)) { + ret = -1; + goto err; + } + + if (!ibz_is_zero(&tmp3)) { + ret = -1; + goto err; + } + +err: + ibq_finalize(&t); + ibz_finalize(&tmp1); + ibz_finalize(&tmp2); + ibz_finalize(&tmp3); + return ret; +} + +// test for lll verification +// void ibq_vec_4_copy_ibz(ibq_vec_4_t *vec, const ibz_t *coeff0, const ibz_t *coeff1,const ibz_t +// *coeff2,const ibz_t *coeff3); +int +quat_test_lll_ibq_vec_4_copy_ibz(void) +{ + int res = 0; + ibq_vec_4_t vec; + ibz_vec_4_t vec_z; + ibz_vec_4_init(&vec_z); + ibq_vec_4_init(&vec); + ibz_vec_4_set(&vec_z, 2, 3, 4, 5); + ibq_vec_4_copy_ibz(&vec, &(vec_z[0]), &(vec_z[1]), &(vec_z[2]), &(vec_z[3])); + for (int i = 0; i < 4; i++) { + ibq_to_ibz(&(vec_z[i]), &(vec[i])); + res = res || (ibz_cmp_int32(&(vec_z[i]), i + 2) != 0); + } + + if (res != 0) { + printf("Quaternion unit test lll_ibq_vec_4_copy_ibz failed\n"); + } + ibz_vec_4_finalize(&vec_z); + ibq_vec_4_finalize(&vec); + return (res); +} + +// void quat_lll_bilinear(ibq_t *b, const ibq_vec_4_t *vec0, const ibq_vec_4_t *vec1, const +// ibz_t *q); +int +quat_test_lll_bilinear(void) +{ + int res = 0; + ibz_vec_4_t init_helper; + ibq_vec_4_t vec0, vec1; + ibz_t q; + ibq_t cmp, b; + ibz_vec_4_init(&init_helper); + ibq_init(&cmp); + ibq_init(&b); + ibz_init(&q); + ibq_vec_4_init(&vec0); + ibq_vec_4_init(&vec1); + ibz_vec_4_set(&init_helper, 1, 2, 3, 4); + ibq_vec_4_copy_ibz(&vec0, &(init_helper[0]), &(init_helper[1]), &(init_helper[2]), &(init_helper[3])); + ibz_vec_4_set(&init_helper, 9, -8, 7, -6); + ibq_vec_4_copy_ibz(&vec1, &(init_helper[0]), &(init_helper[1]), &(init_helper[2]), &(init_helper[3])); + for (int i = 0; i < 4; i++) { + ibq_inv(&(vec0[i]), &(vec0[i])); + } + ibz_set(&q, 3); + ibz_vec_4_set(&init_helper, 15, 2, 0, 0); + ibq_set(&cmp, &(init_helper[0]), &(init_helper[1])); + quat_lll_bilinear(&b, &vec0, &vec1, &q); + res = res || (ibq_cmp(&b, &cmp)); + + if (res != 0) { + printf("Quaternion unit test quat_lll_bilinear failed\n"); + } + ibq_finalize(&cmp); + ibq_finalize(&b); + ibz_finalize(&q); + ibz_vec_4_finalize(&init_helper); + ibq_vec_4_finalize(&vec0); + ibq_vec_4_finalize(&vec1); + return (res); +} + +// void quat_lll_gram_schmidt_transposed_with_ibq(ibq_mat_4x4_t *orthogonalised_transposed, const +// ibz_mat_4x4_t *mat, const ibz_t *q); +int +quat_test_lll_gram_schmidt_transposed_with_ibq(void) +{ + int res = 0; + int zero; + ibq_mat_4x4_t ot, cmp; + ibz_mat_4x4_t mat; + ibz_t q, num, denom; + ibq_t b; + ibz_init(&q); + ibz_init(&num); + ibz_init(&denom); + ibq_init(&b); + ibz_mat_4x4_init(&mat); + ibq_mat_4x4_init(&ot); + ibq_mat_4x4_init(&cmp); + + ibz_mat_4x4_zero(&mat); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), i * i + (j + 5) * j - 2 + (i == j)); + } + } + ibz_set(&q, 3); + quat_lll_gram_schmidt_transposed_with_ibq(&ot, &mat, &q); + // test orthogonality + for (int i = 0; i < 4; i++) { + for (int j = i + 1; j < 4; j++) { + quat_lll_bilinear(&b, &(ot[i]), &(ot[j]), &q); + res = res || !ibq_is_zero(&b); + } + } + // test first vector is identical to mat + for (int i = 0; i < 4; i++) { + ibq_to_ibz(&q, &(ot[0][i])); + res = res || ibz_cmp(&q, &(mat[i][0])); + } + // test no zero vector + for (int i = 0; i < 4; i++) { + zero = 1; + for (int j = 0; j < 4; j++) { + zero = zero && ibq_is_zero(&(ot[i][j])); + } + res = res || zero; + } + + ibz_set(&(mat[0][0]), 1); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 1); + ibz_set(&(mat[0][3]), 0); + ibz_set(&(mat[1][0]), 0); + ibz_set(&(mat[1][1]), 1); + ibz_set(&(mat[1][2]), 0); + ibz_set(&(mat[1][3]), 1); + ibz_set(&(mat[2][0]), 1); + ibz_set(&(mat[2][1]), 0); + ibz_set(&(mat[2][2]), 2); + ibz_set(&(mat[2][3]), 0); + ibz_set(&(mat[3][0]), 0); + ibz_set(&(mat[3][1]), 1); + ibz_set(&(mat[3][2]), 0); + ibz_set(&(mat[3][3]), 2); + ibz_set(&denom, 1); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibq_set(&(cmp[i][j]), &(mat[j][i]), &denom); + } + } + ibz_set(&denom, 3); + ibz_set(&num, -2); + ibq_set(&(cmp[2][0]), &num, &denom); + ibq_set(&(cmp[3][1]), &num, &denom); + ibz_set(&num, 1); + ibq_set(&(cmp[2][2]), &num, &denom); + ibq_set(&(cmp[3][3]), &num, &denom); + ibz_set(&q, 2); + quat_lll_gram_schmidt_transposed_with_ibq(&ot, &mat, &q); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res || ibq_cmp(&(cmp[i][j]), &(ot[i][j])); + } + } + + ibz_set(&(mat[0][0]), 1); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 1); + ibz_set(&(mat[0][3]), 0); + ibz_set(&(mat[1][0]), 0); + ibz_set(&(mat[1][1]), 1); + ibz_set(&(mat[1][2]), 0); + ibz_set(&(mat[1][3]), 1); + ibz_set(&(mat[2][0]), 1); + ibz_set(&(mat[2][1]), 0); + ibz_set(&(mat[2][2]), 2); + ibz_set(&(mat[2][3]), 1); + ibz_set(&(mat[3][0]), 0); + ibz_set(&(mat[3][1]), 1); + ibz_set(&(mat[3][2]), 0); + ibz_set(&(mat[3][3]), 2); + ibz_set(&denom, 1); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibq_set(&(cmp[i][j]), &(mat[j][i]), &denom); + } + } + ibz_set(&denom, 3); + ibz_set(&num, -2); + ibq_set(&(cmp[2][0]), &num, &denom); + ibq_set(&(cmp[3][1]), &num, &denom); + ibz_set(&num, 1); + ibq_set(&(cmp[2][2]), &num, &denom); + ibq_set(&(cmp[3][3]), &num, &denom); + ibz_set(&num, 0); + ibq_set(&(cmp[3][0]), &num, &denom); + ibq_set(&(cmp[3][2]), &num, &denom); + ibz_set(&q, 2); + quat_lll_gram_schmidt_transposed_with_ibq(&ot, &mat, &q); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res || ibq_cmp(&(cmp[i][j]), &(ot[i][j])); + } + } + + if (res != 0) { + printf("Quaternion unit test dim4_gram_schmidt_transposed_with_ibq failed\n"); + } + ibz_finalize(&q); + ibz_finalize(&num); + ibz_finalize(&denom); + ibq_finalize(&b); + ibz_mat_4x4_finalize(&mat); + ibq_mat_4x4_finalize(&ot); + ibq_mat_4x4_finalize(&cmp); + return (res); +} + +// int quat_lll_verify(const ibz_mat_4x4_t *mat, const ibq_t *delta, const ibq_t *eta, const +// quat_alg_t *alg); +int +quat_test_lll_verify(void) +{ + int res = 0; + ibz_mat_4x4_t mat; + ibz_t q, coeff_num, coeff_denom; + ibq_t eta, delta; + quat_alg_t alg; + ibz_mat_4x4_init(&mat); + ibz_init(&q); + ibq_init(&delta); + ibq_init(&eta); + ibz_init(&coeff_num); + ibz_init(&coeff_denom); + + // reduced: non-1 norm + ibz_set(&q, 3); + quat_alg_init_set(&alg, &q); + ibq_set(&eta, &ibz_const_one, &ibz_const_two); + ibq_set(&delta, &ibz_const_three, &ibz_const_two); + ibq_mul(&delta, &delta, &eta); + ibz_set(&(mat[0][0]), 0); + ibz_set(&(mat[0][1]), 2); + ibz_set(&(mat[0][2]), 3); + ibz_set(&(mat[0][3]), -14); + ibz_set(&(mat[1][0]), 2); + ibz_set(&(mat[1][1]), -1); + ibz_set(&(mat[1][2]), -4); + ibz_set(&(mat[1][3]), -8); + ibz_set(&(mat[2][0]), 1); + ibz_set(&(mat[2][1]), -2); + ibz_set(&(mat[2][2]), 1); + ibz_set(&(mat[2][3]), 0); + ibz_set(&(mat[3][0]), 1); + ibz_set(&(mat[3][1]), 1); + ibz_set(&(mat[3][2]), 0); + ibz_set(&(mat[3][3]), 7); + res = res || !quat_lll_verify(&mat, &delta, &eta, &alg); + quat_alg_finalize(&alg); + + // reduced: non-1 norm + ibz_set(&q, 103); + quat_alg_init_set(&alg, &q); + ibz_set(&coeff_num, 99); + ibz_set(&coeff_denom, 100); + ibq_set(&delta, &coeff_num, &coeff_denom); + ibz_set(&(mat[0][0]), 3); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[0][2]), 90); + ibz_set(&(mat[0][3]), -86); + ibz_set(&(mat[1][0]), 11); + ibz_set(&(mat[1][1]), 15); + ibz_set(&(mat[1][2]), 12); + ibz_set(&(mat[1][3]), 50); + ibz_set(&(mat[2][0]), 1); + ibz_set(&(mat[2][1]), -2); + ibz_set(&(mat[2][2]), 0); + ibz_set(&(mat[2][3]), 3); + ibz_set(&(mat[3][0]), -1); + ibz_set(&(mat[3][1]), 0); + ibz_set(&(mat[3][2]), 5); + ibz_set(&(mat[3][3]), 5); + res = res || !quat_lll_verify(&mat, &delta, &eta, &alg); + quat_alg_finalize(&alg); + + if (res != 0) { + printf("Quaternion unit test quat_lll_verify failed\n"); + } + ibz_finalize(&q); + ibq_finalize(&delta); + ibq_finalize(&eta); + ibz_finalize(&coeff_num); + ibz_finalize(&coeff_denom); + ibz_mat_4x4_finalize(&mat); + return (res); +} + +// int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const ibz_t *q, int +// precision); +int +quat_test_lll_lattice_lll(void) +{ + int res = 0; + quat_lattice_t lat, test; + ibz_mat_4x4_t red; + ibz_t num, denom, q; + ibq_t eta, delta; + quat_alg_t alg; + ibz_init(&num); + ibz_init(&denom); + ibz_init(&q); + ibq_init(&delta); + ibq_init(&eta); + ibz_mat_4x4_init(&red); + quat_lattice_init(&lat); + quat_lattice_init(&test); + ibz_set(&q, 103); + quat_alg_init_set(&alg, &q); + + // set lattice + ibz_set(&lat.denom, 60); + ibz_mat_4x4_zero(&(lat.basis)); + ibz_set(&lat.basis[0][0], 3); + ibz_set(&lat.basis[1][0], 7); + ibz_set(&lat.basis[0][1], 1); + ibz_set(&lat.basis[3][1], -6); + ibz_set(&lat.basis[1][2], 12); + ibz_set(&lat.basis[2][2], 5); + ibz_set(&lat.basis[0][3], -19); + ibz_set(&lat.basis[3][3], 3); + + quat_lattice_hnf(&lat); + + res = res || quat_lattice_lll(&red, &lat, &alg); + // test lll reduced + quat_lll_set_ibq_parameters(&delta, &eta); + res = res || !quat_lll_verify(&red, &delta, &eta, &alg); + // test lattice equality + ibz_copy(&(test.denom), &(lat.denom)); + ibz_mat_4x4_copy(&(test.basis), &(red)); + quat_lattice_hnf(&test); + res = res || !quat_lattice_equal(&test, &lat); + + if (res != 0) { + printf("Quaternion unit test lll_lattice_lll failed\n"); + } + ibz_finalize(&num); + ibz_finalize(&denom); + ibz_finalize(&q); + ibq_finalize(&eta); + ibq_finalize(&delta); + ibz_mat_4x4_finalize(&red); + quat_lattice_finalize(&lat); + quat_lattice_finalize(&test); + quat_alg_finalize(&alg); + return (res); +} + +// int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const quat_alg_t *alg); +int +quat_test_lll_randomized_lattice_lll(void) +{ + int res = 0; + quat_lattice_t lat, test; + ibz_mat_4x4_t red; + ibz_t q, det; + ibq_t delta, eta; + int32_t rand[4][4]; + int32_t rand_denom; + uint32_t rand_q; + ibz_init(&q); + ibz_init(&det); + ibq_init(&eta); + ibq_init(&delta); + ibz_mat_4x4_init(&red); + quat_lattice_init(&lat); + quat_lattice_init(&test); + quat_lll_set_ibq_parameters(&delta, &eta); + + for (int iter = 0; iter < 20; iter++) { + quat_alg_t alg; + rand_denom = 0; + while (rand_denom <= 0) { + int randret = randombytes((unsigned char *)&rand_denom, sizeof(int32_t)); + if (randret != 0) + return 1; + } + int randret = randombytes((unsigned char *)&rand_q, sizeof(uint32_t)); + if (randret != 0) + return 1; + // generate random invertible matrix + ibz_set(&det, 0); + while (ibz_is_zero(&det)) { + randret = randombytes((unsigned char *)rand, sizeof(rand)); + if (randret != 0) + return 1; + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat.basis[i][j]), rand[j][i]); + } + } + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &(lat.basis)); + } + + // set lattice + ibz_set(&lat.denom, rand_denom); + quat_lattice_hnf(&lat); + // set algebra + ibz_set(&q, 1 + (rand_q % 1023)); + quat_alg_init_set(&alg, &q); + // reduce + res = res || quat_lattice_lll(&red, &lat, &alg); + // test lll reduced + res = res || !quat_lll_verify(&red, &delta, &eta, &alg); + // test lattice equality + ibz_copy(&(test.denom), &(lat.denom)); + ibz_mat_4x4_copy(&(test.basis), &(red)); + quat_lattice_hnf(&test); + res = res || !quat_lattice_equal(&test, &lat); + quat_alg_finalize(&alg); + } + + if (res != 0) { + printf("Quaternion unit test of lll with randomization for lattice_lll failed\n"); + } + ibz_finalize(&q); + ibz_finalize(&det); + ibq_finalize(&delta); + ibq_finalize(&eta); + ibz_mat_4x4_finalize(&red); + quat_lattice_finalize(&lat); + quat_lattice_finalize(&test); + return (res); +} + +// int quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, ibz_mat_4x4_t *gram, const +// quat_left_ideal_t *lideal, const quat_alg_t *alg); +int +quat_test_lideal_reduce_basis() +{ + int res = 0; + ibz_mat_4x4_t red, gram, prod, gram_norm; + ibz_vec_4_t vec; + quat_left_ideal_t lideal; + quat_lattice_t test; + quat_alg_t alg; + quat_alg_elem_t init_helper; + quat_lattice_t order; + ibq_t delta, eta; + ibz_t num, denom, norm, test_norm; + ibz_init(&num); + ibz_init(&denom); + ibz_init(&norm); + ibz_init(&test_norm); + ibq_init(&delta); + ibq_init(&eta); + ibz_vec_4_init(&vec); + ibz_mat_4x4_init(&prod); + ibz_mat_4x4_init(&gram_norm); + quat_lattice_init(&test); + quat_alg_elem_init(&init_helper); + quat_lattice_init(&order); + quat_alg_init_set_ui(&alg, 19); + ibz_mat_4x4_init(&gram); + ibz_mat_4x4_init(&red); + quat_left_ideal_init(&lideal); + quat_lattice_O0_set(&order); + quat_alg_elem_set(&init_helper, 1, 1, 2, 8, 8); + quat_lideal_create_principal(&lideal, &init_helper, &order, &alg); + quat_lattice_reduce_denom(&(lideal.lattice), &(lideal.lattice)); + quat_lideal_reduce_basis(&red, &gram, &lideal, &alg); + quat_lll_set_ibq_parameters(&delta, &eta); + res = res || !quat_lll_verify(&red, &delta, &eta, &alg); + // test reduced and lideal generate same lattice + ibz_mat_4x4_copy(&(test.basis), &red); + ibz_copy(&(test.denom), &(lideal.lattice.denom)); + quat_lattice_hnf(&test); + res = res || !quat_lattice_equal(&(lideal.lattice), &test); + // test gram matrix is gram matrix + ibz_mat_4x4_identity(&gram_norm); + ibz_copy(&(gram_norm[2][2]), &(alg.p)); + ibz_copy(&(gram_norm[3][3]), &(alg.p)); + ibz_mat_4x4_transpose(&prod, &red); + ibz_mat_4x4_mul(&prod, &prod, &gram_norm); + ibz_mat_4x4_mul(&prod, &prod, &red); + for (int i = 0; i < 4; i++) { + ibz_vec_4_set(&vec, (i == 0), (i == 1), (i == 2), (i == 3)); + quat_qf_eval(&norm, &gram, &vec); + quat_qf_eval(&test_norm, &prod, &vec); + ibz_mul(&norm, &(lideal.norm), &norm); + res = res || !(ibz_cmp(&norm, &test_norm) == 0); + } + + if (res != 0) { + printf("Quaternion unit test lideal_reduce_basis failed\n"); + } + ibz_finalize(&num); + ibz_finalize(&denom); + ibz_finalize(&norm); + ibz_finalize(&test_norm); + ibq_finalize(&delta); + ibq_finalize(&eta); + quat_lattice_finalize(&test); + quat_alg_elem_finalize(&init_helper); + ibz_mat_4x4_finalize(&prod); + quat_lattice_finalize(&order); + quat_alg_finalize(&alg); + ibz_vec_4_finalize(&vec); + ibz_mat_4x4_finalize(&gram); + ibz_mat_4x4_finalize(&red); + ibz_mat_4x4_finalize(&gram_norm); + quat_left_ideal_finalize(&lideal); + return (res); +} + +// int quat_lideal_lideal_mul_reduced(quat_left_ideal_t *prod, ibz_mat_4x4_t *gram, const +// quat_left_ideal_t *lideal1,const quat_left_ideal_t *lideal2, const quat_alg_t *alg); +int +quat_test_lll_lideal_lideal_mul_reduced() +{ + int res = 0; + ibz_t n, norm, test_norm; + ibq_t delta, eta; + ibz_vec_4_t vec; + quat_alg_t alg; + quat_alg_elem_t gen; + quat_lattice_t order, ro; + quat_left_ideal_t lideal1, lideal2, prod, i1, i2; + ibz_mat_4x4_t gram; + ibz_mat_4x4_t gram_test; + + ibz_init(&n); + ibz_init(&norm); + ibz_init(&test_norm); + ibq_init(&delta); + ibq_init(&eta); + ibz_vec_4_init(&vec); + quat_alg_elem_init(&gen); + quat_left_ideal_init(&lideal1); + quat_left_ideal_init(&lideal2); + quat_left_ideal_init(&i1); + quat_left_ideal_init(&i2); + quat_left_ideal_init(&prod); + quat_lattice_init(&order); + quat_lattice_init(&ro); + ibz_mat_4x4_init(&gram); + ibz_mat_4x4_init(&gram_test); + + quat_alg_init_set_ui(&alg, 103); + quat_lattice_O0_set(&order); + quat_lll_set_ibq_parameters(&delta, &eta); + + ibz_set(&n, 113); + quat_alg_elem_set(&gen, 1, 10, 0, 1, 3); + quat_lideal_create(&lideal1, &gen, &n, &order, &alg); + + ibz_set(&n, 89); + quat_alg_elem_set(&gen, 2, 2, 5, 1, 4); + quat_lideal_create(&lideal2, &gen, &n, &order, &alg); + + quat_lideal_copy(&i1, &lideal1); + quat_lideal_copy(&i2, &lideal2); + + quat_lideal_lideal_mul_reduced(&prod, &gram, &lideal1, &lideal2, &alg); + res = res || !quat_lll_verify(&(prod.lattice.basis), &delta, &eta, &alg); + ibz_mat_4x4_identity(&(gram_test)); + ibz_copy(&(gram_test[2][2]), &(alg.p)); + ibz_copy(&(gram_test[3][3]), &(alg.p)); + ibz_mat_4x4_mul(&(gram_test), &(gram_test), &(prod.lattice.basis)); + ibz_mat_4x4_transpose(&(gram_test), &(gram_test)); + ibz_mat_4x4_mul(&(gram_test), &(gram_test), &(prod.lattice.basis)); + for (int i = 0; i < 4; i++) { + ibz_vec_4_set(&vec, (i == 0), (i == 1), (i == 2), (i == 3)); + quat_qf_eval(&norm, &gram, &vec); + quat_qf_eval(&test_norm, &gram_test, &vec); + ibz_mul(&norm, &(prod.norm), &norm); + res = res || !(ibz_cmp(&norm, &test_norm) == 0); + } + quat_lattice_hnf(&(prod.lattice)); + + res = res || !quat_lideal_equals(&i1, &lideal1, &alg); + res = res || !quat_lideal_equals(&i2, &lideal2, &alg); + quat_lattice_mul(&i1.lattice, &i1.lattice, &i2.lattice, &alg); + res = res || !quat_lattice_equal(&i1.lattice, &prod.lattice); + res = res || !(prod.parent_order == lideal1.parent_order); + i1.parent_order = lideal1.parent_order; + quat_lideal_norm(&i1); + res = res || !quat_lideal_equals(&i1, &prod, &alg); + + if (res != 0) { + printf("Quaternion unit test lideal_lideal_mul_reduced failed\n"); + } + ibz_finalize(&n); + ibz_finalize(&norm); + ibz_finalize(&test_norm); + ibq_finalize(&delta); + ibq_finalize(&eta); + ibz_vec_4_finalize(&vec); + quat_alg_elem_finalize(&gen); + quat_left_ideal_finalize(&lideal1); + quat_left_ideal_finalize(&lideal2); + quat_left_ideal_finalize(&i1); + quat_left_ideal_finalize(&i2); + quat_left_ideal_finalize(&prod); + quat_lattice_finalize(&order); + quat_lattice_finalize(&ro); + quat_alg_finalize(&alg); + ibz_mat_4x4_finalize(&gram); + ibz_mat_4x4_finalize(&gram_test); + return (res); +} + +// int quat_lideal_prime_norm_reduced_equivalent(quat_left_ideal_t *lideal, const quat_alg_t *alg, +// const int primality_num_iter, const int equiv_bound_coeff, const int equiv_num_iter); +int +quat_test_lll_lideal_prime_norm_reduced_equivalent() +{ + int res = 0; + ibz_t n, d; + quat_alg_t alg; + quat_alg_elem_t gen; + ibz_mat_4x4_t red, gram; + quat_lattice_t order, ro, ro2; + quat_left_ideal_t lideal1, lideal2, i1; + + ibz_init(&n); + ibz_init(&d); + quat_alg_elem_init(&gen); + quat_left_ideal_init(&lideal1); + quat_left_ideal_init(&lideal2); + quat_left_ideal_init(&i1); + quat_lattice_init(&order); + quat_lattice_init(&ro); + quat_lattice_init(&ro2); + ibz_mat_4x4_init(&red); + ibz_mat_4x4_init(&gram); + + quat_alg_init_set_ui(&alg, 103); + quat_lattice_O0_set(&order); + + ibz_set(&n, 113); + quat_alg_elem_set(&gen, 1, 10, 0, 1, 3); + quat_lideal_create(&lideal1, &gen, &n, &order, &alg); + + quat_lideal_copy(&i1, &lideal1); + quat_lideal_right_order(&ro, &lideal1, &alg); + + quat_lideal_prime_norm_reduced_equivalent(&lideal1, &alg, 20, 20); + + // test norm correctness + quat_lattice_hnf(&(lideal1.lattice)); + ibz_copy(&n, &(lideal1.norm)); + quat_lideal_norm(&lideal1); + res = res || (0 != ibz_cmp(&n, &(lideal1.norm))); + + // test norm primality + res = res || !ibz_probab_prime(&n, 20); + + // test equivalence + quat_lideal_right_order(&ro2, &lideal1, &alg); + quat_lattice_mul(&(lideal2.lattice), &ro, &ro2, &alg); + ibz_set(&(lideal2.lattice.denom), 1); + lideal2.parent_order = &ro; + quat_lattice_hnf(&(lideal2.lattice)); + quat_lideal_norm(&lideal2); + // now lideal2 is a connecting idea of ro and ro2 + quat_lideal_reduce_basis(&red, &gram, &lideal2, &alg); + quat_alg_elem_copy_ibz(&gen, &(lideal2.lattice.denom), &(red[0][0]), &(red[1][0]), &(red[2][0]), &(red[3][0])); + quat_alg_norm(&n, &d, &gen, &alg); + assert(ibz_is_one(&d)); + res = res || (0 != ibz_cmp(&n, &(lideal2.norm))); + + if (res != 0) { + printf("Quaternion unit test lideal_prime_norm_reduced_equivalent failed\n"); + } + ibz_finalize(&n); + ibz_finalize(&d); + ibz_mat_4x4_finalize(&red); + ibz_mat_4x4_finalize(&gram); + quat_alg_elem_finalize(&gen); + quat_left_ideal_finalize(&lideal1); + quat_left_ideal_finalize(&lideal2); + quat_left_ideal_finalize(&i1); + quat_lattice_finalize(&order); + quat_lattice_finalize(&ro); + quat_lattice_finalize(&ro2); + quat_alg_finalize(&alg); + return (res); +} + +// run all previous tests +int +quat_test_lll(void) +{ + int res = 0; + printf("\nRunning quaternion tests of lll and its subfunctions\n"); + res = res | quat_test_lll_ibq_consts(); + res = res | quat_test_lll_ibq_vec_4_copy_ibz(); + res = res | quat_test_lll_bilinear(); + res = res | quat_test_lll_gram_schmidt_transposed_with_ibq(); + res = res | quat_test_lll_verify(); + res = res | quat_test_lll_lattice_lll(); + res = res | quat_test_lll_randomized_lattice_lll(); + res = res | quat_test_lideal_reduce_basis(); + res = res | quat_test_lll_lideal_lideal_mul_reduced(); + res = res | quat_test_lll_lideal_prime_norm_reduced_equivalent(); + return (res); +} diff --git a/src/quaternion/ref/generic/lll/lll_verification.c b/src/quaternion/ref/generic/lll/lll_verification.c new file mode 100644 index 0000000..359c91f --- /dev/null +++ b/src/quaternion/ref/generic/lll/lll_verification.c @@ -0,0 +1,174 @@ +#include "lll_internals.h" + +// functions to verify lll +void +quat_lll_set_ibq_parameters(ibq_t *delta, ibq_t *eta) +{ + ibz_t num, denom; + ibz_init(&num); + ibz_init(&denom); + ibq_set(delta, &ibz_const_one, &ibz_const_two); + ibz_set(&num, EPSILON_NUM); + ibz_set(&denom, EPSILON_DENOM); + ibq_set(eta, &num, &denom); + ibq_add(eta, eta, delta); + ibz_set(&num, DELTA_NUM); + ibz_set(&denom, DELTA_DENOM); + ibq_set(delta, &num, &denom); + ibz_finalize(&num); + ibz_finalize(&denom); +} + +void +ibq_vec_4_copy_ibz(ibq_vec_4_t *vec, const ibz_t *coeff0, const ibz_t *coeff1, const ibz_t *coeff2, const ibz_t *coeff3) +{ + ibz_t one; + ibz_init(&one); + ibz_set(&one, 1); + ibq_set(&((*vec)[0]), coeff0, &one); + ibq_set(&((*vec)[1]), coeff1, &one); + ibq_set(&((*vec)[2]), coeff2, &one); + ibq_set(&((*vec)[3]), coeff3, &one); + ibz_finalize(&one); +} + +void +quat_lll_bilinear(ibq_t *b, const ibq_vec_4_t *vec0, const ibq_vec_4_t *vec1, const ibz_t *q) +{ + ibq_t sum, prod, norm_q; + ibz_t one; + ibz_init(&one); + ibz_set(&one, 1); + ibq_init(&sum); + ibq_init(&prod); + ibq_init(&norm_q); + ibq_set(&norm_q, q, &one); + + ibq_mul(&sum, &((*vec0)[0]), &((*vec1)[0])); + ibq_mul(&prod, &((*vec0)[1]), &((*vec1)[1])); + ibq_add(&sum, &sum, &prod); + ibq_mul(&prod, &((*vec0)[2]), &((*vec1)[2])); + ibq_mul(&prod, &prod, &norm_q); + ibq_add(&sum, &sum, &prod); + ibq_mul(&prod, &((*vec0)[3]), &((*vec1)[3])); + ibq_mul(&prod, &prod, &norm_q); + ibq_add(b, &sum, &prod); + + ibz_finalize(&one); + ibq_finalize(&sum); + ibq_finalize(&prod); + ibq_finalize(&norm_q); +} + +void +quat_lll_gram_schmidt_transposed_with_ibq(ibq_mat_4x4_t *orthogonalised_transposed, + const ibz_mat_4x4_t *mat, + const ibz_t *q) +{ + ibq_mat_4x4_t work; + ibq_vec_4_t vec; + ibq_t norm, b, coeff, prod; + ibq_init(&norm); + ibq_init(&coeff); + ibq_init(&prod); + ibq_init(&b); + ibq_mat_4x4_init(&work); + ibq_vec_4_init(&vec); + // transpose the input matrix to be able to work on vectors + for (int i = 0; i < 4; i++) { + ibq_vec_4_copy_ibz(&(work[i]), &((*mat)[0][i]), &((*mat)[1][i]), &((*mat)[2][i]), &((*mat)[3][i])); + } + + for (int i = 0; i < 4; i++) { + quat_lll_bilinear(&norm, &(work[i]), &(work[i]), q); + ibq_inv(&norm, &norm); + for (int j = i + 1; j < 4; j++) { + ibq_vec_4_copy_ibz(&vec, &((*mat)[0][j]), &((*mat)[1][j]), &((*mat)[2][j]), &((*mat)[3][j])); + quat_lll_bilinear(&b, &(work[i]), &vec, q); + ibq_mul(&coeff, &norm, &b); + for (int k = 0; k < 4; k++) { + ibq_mul(&prod, &coeff, &(work[i][k])); + ibq_sub(&(work[j][k]), &(work[j][k]), &prod); + } + } + } + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibq_copy(&((*orthogonalised_transposed)[i][j]), &(work[i][j])); + } + } + + ibq_finalize(&norm); + ibq_finalize(&coeff); + ibq_finalize(&prod); + ibq_finalize(&b); + ibq_mat_4x4_finalize(&work); + ibq_vec_4_finalize(&vec); +} + +int +quat_lll_verify(const ibz_mat_4x4_t *mat, const ibq_t *delta, const ibq_t *eta, const quat_alg_t *alg) +{ + int res = 1; + ibq_mat_4x4_t orthogonalised_transposed; + ibq_vec_4_t tmp_vec; + ibq_t div, tmp, mu, two, norm, b; + ibz_t mu2_floored, num, denom; + ibq_mat_4x4_init(&orthogonalised_transposed); + ibq_vec_4_init(&tmp_vec); + ibq_init(&div); + ibq_init(&tmp); + ibq_init(&norm); + ibq_init(&b); + ibq_init(&mu); + ibq_init(&two); + ibz_init(&mu2_floored); + ibz_init(&num); + ibz_init(&denom); + ibz_set(&num, 2); + ibz_set(&denom, 1); + ibq_set(&two, &num, &denom); + + quat_lll_gram_schmidt_transposed_with_ibq(&orthogonalised_transposed, mat, &(alg->p)); + // check small bilinear products/norms + for (int i = 0; i < 4; i++) { + for (int j = 0; j < i; j++) { + ibq_vec_4_copy_ibz(&tmp_vec, &((*mat)[0][i]), &((*mat)[1][i]), &((*mat)[2][i]), &((*mat)[3][i])); + quat_lll_bilinear(&b, &(orthogonalised_transposed[j]), &tmp_vec, &(alg->p)); + quat_lll_bilinear(&norm, &(orthogonalised_transposed[j]), &(orthogonalised_transposed[j]), &(alg->p)); + ibq_inv(&tmp, &norm); + ibq_mul(&mu, &b, &tmp); + ibq_abs(&mu, &mu); + // compare to eta + res = res && (ibq_cmp(&mu, eta) <= 0); + } + } + for (int i = 1; i < 4; i++) { + ibq_vec_4_copy_ibz(&tmp_vec, &((*mat)[0][i]), &((*mat)[1][i]), &((*mat)[2][i]), &((*mat)[3][i])); + quat_lll_bilinear(&b, &(orthogonalised_transposed[i - 1]), &tmp_vec, &(alg->p)); + quat_lll_bilinear(&norm, &(orthogonalised_transposed[i - 1]), &(orthogonalised_transposed[i - 1]), &(alg->p)); + ibq_inv(&tmp, &norm); + ibq_mul(&mu, &b, &tmp); + // tmp is mu^2 + ibq_mul(&tmp, &mu, &mu); + // mu is delta-mu^2 + ibq_sub(&mu, delta, &tmp); + quat_lll_bilinear(&tmp, &(orthogonalised_transposed[i]), &(orthogonalised_transposed[i]), &(alg->p)); + // get (delta-mu^2)norm(i-1) + ibq_mul(&div, &norm, &mu); + res = res && (ibq_cmp(&tmp, &div) >= 0); + } + ibq_mat_4x4_finalize(&orthogonalised_transposed); + ibq_vec_4_finalize(&tmp_vec); + ibq_finalize(&div); + ibq_finalize(&norm); + ibq_finalize(&b); + ibq_finalize(&tmp); + ibq_finalize(&mu); + ibq_finalize(&two); + ibz_finalize(&mu2_floored); + ibz_finalize(&num); + ibz_finalize(&denom); + return (res); +} diff --git a/src/quaternion/ref/generic/lll/rationals.c b/src/quaternion/ref/generic/lll/rationals.c new file mode 100644 index 0000000..0c5387e --- /dev/null +++ b/src/quaternion/ref/generic/lll/rationals.c @@ -0,0 +1,233 @@ +#include +#include "internal.h" +#include "lll_internals.h" + +void +ibq_init(ibq_t *x) +{ + ibz_init(&((*x)[0])); + ibz_init(&((*x)[1])); + ibz_set(&((*x)[1]), 1); +} + +void +ibq_finalize(ibq_t *x) +{ + ibz_finalize(&((*x)[0])); + ibz_finalize(&((*x)[1])); +} + +void +ibq_mat_4x4_init(ibq_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibq_init(&(*mat)[i][j]); + } + } +} +void +ibq_mat_4x4_finalize(ibq_mat_4x4_t *mat) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibq_finalize(&(*mat)[i][j]); + } + } +} + +void +ibq_vec_4_init(ibq_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibq_init(&(*vec)[i]); + } +} +void +ibq_vec_4_finalize(ibq_vec_4_t *vec) +{ + for (int i = 0; i < 4; i++) { + ibq_finalize(&(*vec)[i]); + } +} + +void +ibq_mat_4x4_print(const ibq_mat_4x4_t *mat) +{ + printf("matrix: "); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_print(&((*mat)[i][j][0]), 10); + printf("/"); + ibz_print(&((*mat)[i][j][1]), 10); + printf(" "); + } + printf("\n "); + } + printf("\n"); +} + +void +ibq_vec_4_print(const ibq_vec_4_t *vec) +{ + printf("vector: "); + for (int i = 0; i < 4; i++) { + ibz_print(&((*vec)[i][0]), 10); + printf("/"); + ibz_print(&((*vec)[i][1]), 10); + printf(" "); + } + printf("\n\n"); +} + +void +ibq_reduce(ibq_t *x) +{ + ibz_t gcd, r; + ibz_init(&gcd); + ibz_init(&r); + ibz_gcd(&gcd, &((*x)[0]), &((*x)[1])); + ibz_div(&((*x)[0]), &r, &((*x)[0]), &gcd); + assert(ibz_is_zero(&r)); + ibz_div(&((*x)[1]), &r, &((*x)[1]), &gcd); + assert(ibz_is_zero(&r)); + ibz_finalize(&gcd); + ibz_finalize(&r); +} + +void +ibq_add(ibq_t *sum, const ibq_t *a, const ibq_t *b) +{ + ibz_t add, prod; + ibz_init(&add); + ibz_init(&prod); + + ibz_mul(&add, &((*a)[0]), &((*b)[1])); + ibz_mul(&prod, &((*b)[0]), &((*a)[1])); + ibz_add(&((*sum)[0]), &add, &prod); + ibz_mul(&((*sum)[1]), &((*a)[1]), &((*b)[1])); + ibz_finalize(&add); + ibz_finalize(&prod); +} + +void +ibq_neg(ibq_t *neg, const ibq_t *x) +{ + ibz_copy(&((*neg)[1]), &((*x)[1])); + ibz_neg(&((*neg)[0]), &((*x)[0])); +} + +void +ibq_sub(ibq_t *diff, const ibq_t *a, const ibq_t *b) +{ + ibq_t neg; + ibq_init(&neg); + ibq_neg(&neg, b); + ibq_add(diff, a, &neg); + ibq_finalize(&neg); +} + +void +ibq_abs(ibq_t *abs, const ibq_t *x) // once +{ + ibq_t neg; + ibq_init(&neg); + ibq_neg(&neg, x); + if (ibq_cmp(x, &neg) < 0) + ibq_copy(abs, &neg); + else + ibq_copy(abs, x); + ibq_finalize(&neg); +} + +void +ibq_mul(ibq_t *prod, const ibq_t *a, const ibq_t *b) +{ + ibz_mul(&((*prod)[0]), &((*a)[0]), &((*b)[0])); + ibz_mul(&((*prod)[1]), &((*a)[1]), &((*b)[1])); +} + +int +ibq_inv(ibq_t *inv, const ibq_t *x) +{ + int res = !ibq_is_zero(x); + if (res) { + ibz_copy(&((*inv)[0]), &((*x)[0])); + ibz_copy(&((*inv)[1]), &((*x)[1])); + ibz_swap(&((*inv)[1]), &((*inv)[0])); + } + return (res); +} + +int +ibq_cmp(const ibq_t *a, const ibq_t *b) +{ + ibz_t x, y; + ibz_init(&x); + ibz_init(&y); + ibz_copy(&x, &((*a)[0])); + ibz_copy(&y, &((*b)[0])); + ibz_mul(&y, &y, &((*a)[1])); + ibz_mul(&x, &x, &((*b)[1])); + if (ibz_cmp(&((*a)[1]), &ibz_const_zero) > 0) { + ibz_neg(&y, &y); + ibz_neg(&x, &x); + } + if (ibz_cmp(&((*b)[1]), &ibz_const_zero) > 0) { + ibz_neg(&y, &y); + ibz_neg(&x, &x); + } + int res = ibz_cmp(&x, &y); + ibz_finalize(&x); + ibz_finalize(&y); + return (res); +} + +int +ibq_is_zero(const ibq_t *x) +{ + return ibz_is_zero(&((*x)[0])); +} + +int +ibq_is_one(const ibq_t *x) +{ + return (0 == ibz_cmp(&((*x)[0]), &((*x)[1]))); +} + +int +ibq_set(ibq_t *q, const ibz_t *a, const ibz_t *b) +{ + ibz_copy(&((*q)[0]), a); + ibz_copy(&((*q)[1]), b); + return !ibz_is_zero(b); +} + +void +ibq_copy(ibq_t *target, const ibq_t *value) // once +{ + ibz_copy(&((*target)[0]), &((*value)[0])); + ibz_copy(&((*target)[1]), &((*value)[1])); +} + +int +ibq_is_ibz(const ibq_t *q) +{ + ibz_t r; + ibz_init(&r); + ibz_mod(&r, &((*q)[0]), &((*q)[1])); + int res = ibz_is_zero(&r); + ibz_finalize(&r); + return (res); +} + +int +ibq_to_ibz(ibz_t *z, const ibq_t *q) +{ + ibz_t r; + ibz_init(&r); + ibz_div(z, &r, &((*q)[0]), &((*q)[1])); + int res = ibz_is_zero(&r); + ibz_finalize(&r); + return (res); +} diff --git a/src/quaternion/ref/generic/matkermod.c b/src/quaternion/ref/generic/matkermod.c deleted file mode 100644 index f2def12..0000000 --- a/src/quaternion/ref/generic/matkermod.c +++ /dev/null @@ -1,421 +0,0 @@ -#include "internal.h" - -/***************** Howell form **********************/ - -/** @brief Compute u s.t. gcd(u, mod) = 1 and ux = gcd(x, mod) - */ -static int unit(ibz_t *unit, ibz_t *gcd, const ibz_t *x, const ibz_t *mod) { - if (ibz_is_zero(x)) - return 0; - ibz_t stab, nmod, nmod2, thrash, tmp; - ibz_init(&stab); ibz_init(&nmod); ibz_init(&nmod2); ibz_init(&thrash); ibz_init(&tmp); - ibz_xgcd(gcd, unit, &thrash, x, mod); - ibz_div(&nmod, &thrash, mod, gcd); - // Stabilizer(unit, nmod) - ibz_gcd(&stab, unit, &nmod); - ibz_div(&nmod2, &thrash, mod, &stab); - ibz_div(&stab, &thrash, unit, &stab); - // Split(nmod2, stab) - for (int i = ibz_bitsize(&nmod2); i > 0; i >>= 1) { - ibz_mul(&stab, &stab, &stab); - ibz_mod(&stab, &stab, &nmod2); - } - ibz_gcd(&stab, &stab, &nmod2); - ibz_div(&stab, &thrash, &nmod2, &stab); -#ifndef NDEBUG - ibz_mul(&thrash, &stab, &nmod); - ibz_add(&thrash, unit, &thrash); - ibz_gcd(&thrash, &thrash, mod); - ibz_gcd(&tmp, unit, &nmod); - assert(ibz_cmp(&thrash, &tmp) == 0); -#endif - // Finish off - ibz_mul(&stab, &stab, &nmod); - ibz_add(unit, unit, &stab); - ibz_mod(unit, unit, mod); -#ifndef NDEBUG - ibz_gcd(&stab, unit, mod); - assert(ibz_is_one(&stab)); - ibz_mul(&stab, unit, x); - ibz_mod(&stab, &stab, mod); - assert(ibz_cmp(&stab, gcd) == 0); -#endif - ibz_finalize(&stab); ibz_finalize(&nmod); ibz_finalize(&nmod2); ibz_finalize(&thrash); ibz_finalize(&tmp); - return 1; -} - -/** @brief Linear combination of two columns - * - * (mat[][j] | mat[][k]) <- (mat[][j] | mat[][k]) * U (mod) - * - * only update columns between start (included) and end (excluded) - */ -static void gen_elem(int rows, int cols, ibz_t mat[rows][cols], int j, int k, int start, int end, const ibz_mat_2x2_t *U, const ibz_t *mod) -{ - ibz_t tmp1, tmp2; - ibz_init(&tmp1); ibz_init(&tmp2); - for (int i = start; i < end; i++) { - ibz_mul(&tmp1, &mat[i][j], &(*U)[0][0]); - ibz_mul(&tmp2, &mat[i][k], &(*U)[1][0]); - ibz_add(&tmp1, &tmp1, &tmp2); - - ibz_mul(&tmp2, &mat[i][j], &(*U)[0][1]); - ibz_mul(&mat[i][k], &mat[i][k], &(*U)[1][1]); - ibz_add(&mat[i][k], &tmp2, &mat[i][k]); - - ibz_mod(&mat[i][j], &tmp1, mod); - ibz_mod(&mat[i][k], &mat[i][k], mod); - } - ibz_finalize(&tmp1); ibz_finalize(&tmp2); -} - -/** @brief Swap columns j and k of mat - */ -static inline void swap_col(int rows, int cols, ibz_t mat[rows][cols], int j, int k) -{ - ibz_t tmp; - ibz_init(&tmp); - for (int i = 0; i < rows; i++) { - ibz_copy(&tmp, &mat[i][j]); - ibz_copy(&mat[i][j], &mat[i][k]); - ibz_copy(&mat[i][k], &tmp); - } - ibz_finalize(&tmp); -} - -/** @brief Check if column is all zeros - */ -static inline int is_col_zero(int rows, int cols, ibz_t mat[rows][cols], int j) -{ - int is_zero = 1; - for (int i = 0; i < rows; i++) - is_zero &= ibz_is_zero(&mat[i][j]); - return is_zero; -} - -/** Check that mat * trans = howell - */ -static int howell_check_matrices(int rows, int cols, const ibz_t howell[rows][rows+1], const ibz_t trans[rows+1][rows+1], const ibz_t mat[rows][cols], ibz_t *mod) -{ - const int extra = rows + 1 - cols; - ibz_t test[rows][rows+1], res[rows][rows+1]; - ibz_mat_init(rows, rows+1, test); - ibz_mat_init(rows, rows+1, res); - - // copy mat to the right of test - for (int i = 0; i < rows; i++) - for (int j = 0; j < cols; j++) - ibz_mod(&test[i][j+extra], &mat[i][j], mod); - - ibz_mat_mulmod(rows, rows+1, rows+1, res, test, trans, mod); - - int ok = 1; - for (int i = 0; i < rows; i++) - for (int j = 0; j < rows+1; j++) - ok &= ibz_cmp(&howell[i][j], &res[i][j]) == 0; - - ibz_mat_finalize(rows, rows+1, res); - ibz_mat_finalize(rows, rows+1, test); - - return ok; -} - -void ibz_mat_mulmod(int from, int through, int to, ibz_t res[from][to], const ibz_t A[from][through], const ibz_t B[through][to], const ibz_t *mod) -{ - ibz_t tmp; - ibz_init(&tmp); - for (int i = 0; i < from; i++) { - for (int j = 0; j < to; j++) { - ibz_set(&res[i][j], 0); - for (int k = 0; k < through; k++) { - ibz_mul(&tmp, &A[i][k], &B[k][j]); - ibz_add(&res[i][j], &res[i][j], &tmp); - ibz_mod(&res[i][j], &res[i][j], mod); - } - } - } - ibz_finalize(&tmp); -} - -int ibz_mat_howell(int rows, int cols, ibz_t howell[rows][rows+1], ibz_t trans[rows+1][rows+1], const ibz_t mat[rows][cols], ibz_t *mod) { - assert(cols <= rows); - const int extra = rows + 1 - cols; - - ibz_mat_2x2_t U; - ibz_t gcd, u, q; - ibz_mat_2x2_init(&U); - ibz_init(&gcd); ibz_init(&u); ibz_init(&q); - - // copy mat to the right of howell - for (int i = 0; i < rows; i++) { - for (int j = cols; j < rows+1; j++) - ibz_set(&howell[i][j-cols], 0); - for (int j = 0; j < cols; j++) - ibz_mod(&howell[i][j+extra], &mat[i][j], mod); - } - // initialize trans to identity - if (trans) { - for (int i = 0; i < rows+1; i++) { - for (int j = 0; j < rows+1; j++) - if (j != i) ibz_set(&trans[i][j], 0); - ibz_set(&trans[i][i], 1); - } - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - - // Put in upper triangular form - for (int i = rows-1; i >= extra-1; i--) { - for (int j = extra; j <= i; j++) { - if (ibz_is_zero(&howell[i][j])) - continue; - ibz_xgcd_ann(&gcd, &U[0][0], &U[1][0], &U[0][1], &U[1][1], &howell[i][j], &howell[i][i+1]); - gen_elem(rows, rows+1, howell, j, i+1, 0, i, &U, mod); - ibz_set(&howell[i][j], 0); - ibz_copy(&howell[i][i+1], &gcd); - // - if (trans) { - gen_elem(rows+1, rows+1, trans, j, i+1, 0, rows+1, &U, mod); - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - } - } - - // Put in reduced Howell form - for (int i = rows-1; i >= 0; i--) { - /* normalize diagonal coefficient */ - if (unit(&u, &gcd, &howell[i][i+1], mod)) { - for (int k = 0; k < i; k++) { - ibz_mul(&howell[k][i+1], &howell[k][i+1], &u); - ibz_mod(&howell[k][i+1], &howell[k][i+1], mod); - } - ibz_copy(&howell[i][i+1], &gcd); - // - if (trans) { - for (int k = 0; k < rows+1; k++) { - ibz_mul(&trans[k][i+1], &trans[k][i+1], &u); - ibz_mod(&trans[k][i+1], &trans[k][i+1], mod); - } - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - } - - /* reduce right of the diagonal */ - ibz_t *pivot = &howell[i][i+1]; - if (!ibz_is_zero(pivot)) { - for (int j = i+2; j < rows+1; j++) { - assert(ibz_cmp(pivot, &ibz_const_zero) > 0); - ibz_div(&q, &howell[i][j], &howell[i][j], pivot); - // howell[][j] -= q howell[][i+1] - for (int k = 0; k < i; k++) { - ibz_mul(&u, &q, &howell[k][i+1]); - ibz_sub(&howell[k][j], &howell[k][j], &u); - ibz_mod(&howell[k][j], &howell[k][j], mod); - } - // trans[][j] -= q trans[][i+1] - if (trans) { - for (int k = 0; k < rows+1; k++) { - ibz_mul(&u, &q, &trans[k][i+1]); - ibz_sub(&trans[k][j], &trans[k][j], &u); - ibz_mod(&trans[k][j], &trans[k][j], mod); - } - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - } - } - - /* ensure Howell property */ - if (i > 0) { - ibz_gcd(&gcd, pivot, mod); - if (!ibz_is_one(&gcd)) { - // Ann(pivot) - ibz_div(&u, &gcd, mod, &gcd); - for (int k = 0; k < rows; k++) { - if (k < i) { - ibz_mul(&howell[k][0], &howell[k][i+1], &u); - ibz_mod(&howell[k][0], &howell[k][0], mod); - } else { - ibz_set(&howell[k][0], 0); - } - } - // trans[][0] += u trans[][i+1] - if (trans) { - for (int k = 0; k < rows+1; k++) { - ibz_mul(&q, &u, &trans[k][i+1]); - ibz_add(&trans[k][0], &trans[k][0], &q); - ibz_mod(&trans[k][0], &trans[k][0], mod); - } - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - - for (int i2 = i-1; i2 >= 0; i2--) { - if (ibz_is_zero(&howell[i2][0])) - continue; - if (ibz_is_zero(&howell[i2][i2+1])) { - swap_col(rows, rows+1, howell, 0, i2+1); - if (trans) { - swap_col(rows+1, rows+1, trans, 0, i2+1); - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - continue; - } - ibz_xgcd_ann(&gcd, &U[0][0], &U[1][0], &U[0][1], &U[1][1], &howell[i2][0], &howell[i2][i2+1]); - gen_elem(rows, rows+1, howell, 0, i2+1, 0, i2, &U, mod); - ibz_set(&howell[i2][0], 0); - ibz_copy(&howell[i2][i2+1], &gcd); - // - if (trans) { - gen_elem(rows, rows+1, trans, 0, i2+1, 0, rows+1, &U, mod); - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - } - } - } - } - - /* put zero columns first */ - int read, write; - for (read = rows, write = rows; read >= 1; read--) { - if (!is_col_zero(rows, rows+1, howell, read)) { - if (read < write) { - swap_col(rows, rows+1, howell, read, write); - if (trans) { - swap_col(rows+1, rows+1, trans, read, write); - assert(howell_check_matrices(rows, cols, howell, trans, mat, mod)); - } - } - write--; - } - } - - // Finalize - ibz_mat_2x2_finalize(&U); - ibz_finalize(&gcd); ibz_finalize(&u); ibz_finalize(&q); - - return write + 1; -} - -void ibz_mat_right_ker_mod(int rows, int cols, ibz_t ker[cols][cols], const ibz_t mat[rows][cols], ibz_t *mod) -{ - assert(cols <= rows); - const int extra = rows + 1 - cols; - - ibz_t tmp; - ibz_mat_2x2_t U; - ibz_t howell[rows][rows+1], trans[rows+1][rows+1], preker[rows+1][rows+1], near_ker[cols][rows+1]; - - ibz_init(&tmp); - ibz_mat_2x2_init(&U); - ibz_mat_init(rows, rows+1, howell); - ibz_mat_init(rows+1, rows+1, trans); - ibz_mat_init(rows+1, rows+1, preker); - ibz_mat_init(cols, rows+1, near_ker); - - // Compute Howell form of mat - int zeros = ibz_mat_howell(rows, cols, howell, trans, mat, mod); - - // Compute right kernel of Howell form - for (int j = rows, i = rows-1; j >= 0; j--) { - while (i >= 0 && ibz_is_zero(&howell[i][j])) - i--; - if (i < 0) { - ibz_set(&preker[j][j], 1); - continue; - } - ibz_t *pivot = &howell[i][j]; - - // Ann(pivot) - ibz_gcd(&tmp, pivot, mod); - if (!ibz_is_one(&tmp)) - ibz_div(&preker[j][j], &tmp, mod, &tmp); - - for (int j2 = j+1; j2 <= rows; j2++) { - // howell[i][j+1..rows] * preker[j+1..rows][j2] - for (int k = j+1; k <= rows; k++) { - ibz_mul(&tmp, &howell[i][k], &preker[k][j2]); - ibz_add(&preker[j][j2], &preker[j][j2], &tmp); - } - ibz_mod(&preker[j][j2], &preker[j][j2], mod); - // - ibz_div(&preker[j][j2], &tmp, &preker[j][j2], pivot); - assert(ibz_is_zero(&tmp)); - if (!ibz_is_zero(&preker[j][j2])) - ibz_sub(&preker[j][j2], mod, &preker[j][j2]); - } - } - -#ifndef NDEBUG - // Check that preker is indeed a kernel of howell - ibz_t acc; - ibz_init(&acc); - for (int i = 0; i < rows; i++) { - for (int j = 0; j < rows+1; j++) { - ibz_set(&acc, 0); - for (int k = 0; k < rows+1; k++) { - ibz_mul(&tmp, &howell[i][k], &preker[k][j]); - ibz_add(&acc, &acc, &tmp); - } - ibz_mod(&acc, &acc, mod); - assert(ibz_is_zero(&acc)); - } - } - ibz_finalize(&acc); -#endif - - // Apply (bottom part of) transition matrix to computed kernel - for (int i = 0; i < cols; i++) { - for (int j = 0; j < rows+1; j++) { - for (int k = 0; k < rows+1; k++) { - ibz_mul(&tmp, &trans[i+extra][k], &preker[k][j]); - ibz_add(&near_ker[i][j], &near_ker[i][j], &tmp); - } - ibz_mod(&near_ker[i][j], &near_ker[i][j], mod); - } - } - - // Move zero columns to the start - int read, write; - for (read = rows, write = rows; read >= 0; read--) { - if (!is_col_zero(cols, rows+1, near_ker, read)) { - if (read < write) { - swap_col(cols, rows+1, near_ker, read, write); - } - write--; - } - } - - // Put in upper triangular form - const int diag_shift = rows - cols + 1; // i-th diagonal is at (i+diag_shift) column - for (int i = cols-1; i >= 0; i--) { - for (int j = write+1; j < i+diag_shift; j++) { - if (ibz_is_zero(&near_ker[i][j])) - continue; - ibz_xgcd_ann(&tmp, &U[0][0], &U[1][0], &U[0][1], &U[1][1], &near_ker[i][j], &near_ker[i][i+diag_shift]); - gen_elem(cols, rows+1, near_ker, j, i+diag_shift, 0, i+1, &U, mod); - ibz_set(&howell[i][j], 0); - ibz_copy(&howell[i][i+diag_shift], &tmp); - } - } - -#ifndef NDEBUG - // Check that ker is indeed a kernel of mat - ibz_t check[rows][rows+1]; - ibz_mat_init(rows, rows+1, check); - ibz_mat_mulmod(rows, cols, rows+1, check, mat, near_ker, mod); - for (int i = 0; i < rows; i++) - for (int j = 0; j < rows+1; j++) - assert(ibz_is_zero(&check[i][j])); - ibz_mat_finalize(rows, rows+1, check); -#endif - - // Copy result - for (int i = 0; i < cols; i++) - for (int j = 0; j < cols; j++) - ibz_copy(&ker[i][j], &near_ker[i][j+rows-cols+1]); - // Finalize - ibz_finalize(&tmp); - ibz_mat_2x2_finalize(&U); - ibz_mat_finalize(rows, rows+1, howell); - ibz_mat_finalize(rows+1, rows+1, trans); - ibz_mat_finalize(rows+1, rows+1, preker); - ibz_mat_finalize(cols, rows+1, near_ker); -} diff --git a/src/quaternion/ref/generic/normeq.c b/src/quaternion/ref/generic/normeq.c new file mode 100644 index 0000000..8c133dd --- /dev/null +++ b/src/quaternion/ref/generic/normeq.c @@ -0,0 +1,369 @@ +#include +#include "internal.h" + +/** @file + * + * @authors Antonin Leroux + * + * @brief Functions related to norm equation solving or special extremal orders + */ + +void +quat_lattice_O0_set(quat_lattice_t *O0) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(O0->basis[i][j]), 0); + } + } + ibz_set(&(O0->denom), 2); + ibz_set(&(O0->basis[0][0]), 2); + ibz_set(&(O0->basis[1][1]), 2); + ibz_set(&(O0->basis[2][2]), 1); + ibz_set(&(O0->basis[1][2]), 1); + ibz_set(&(O0->basis[3][3]), 1); + ibz_set(&(O0->basis[0][3]), 1); +} + +void +quat_lattice_O0_set_extremal(quat_p_extremal_maximal_order_t *O0) +{ + ibz_set(&O0->z.coord[1], 1); + ibz_set(&O0->t.coord[2], 1); + ibz_set(&O0->z.denom, 1); + ibz_set(&O0->t.denom, 1); + O0->q = 1; + quat_lattice_O0_set(&(O0->order)); +} + +void +quat_order_elem_create(quat_alg_elem_t *elem, + const quat_p_extremal_maximal_order_t *order, + const ibz_vec_4_t *coeffs, + const quat_alg_t *Bpoo) +{ + + // var dec + quat_alg_elem_t quat_temp; + + // var init + quat_alg_elem_init(&quat_temp); + + // elem = x + quat_alg_scalar(elem, &(*coeffs)[0], &ibz_const_one); + + // quat_temp = i*y + quat_alg_scalar(&quat_temp, &((*coeffs)[1]), &ibz_const_one); + quat_alg_mul(&quat_temp, &order->z, &quat_temp, Bpoo); + + // elem = x + i*y + quat_alg_add(elem, elem, &quat_temp); + + // quat_temp = z * j + quat_alg_scalar(&quat_temp, &(*coeffs)[2], &ibz_const_one); + quat_alg_mul(&quat_temp, &order->t, &quat_temp, Bpoo); + + // elem = x + i* + z*j + quat_alg_add(elem, elem, &quat_temp); + + // quat_temp = t * j * i + quat_alg_scalar(&quat_temp, &(*coeffs)[3], &ibz_const_one); + quat_alg_mul(&quat_temp, &order->t, &quat_temp, Bpoo); + quat_alg_mul(&quat_temp, &quat_temp, &order->z, Bpoo); + + // elem = x + i*y + j*z + j*i*t + quat_alg_add(elem, elem, &quat_temp); + + quat_alg_elem_finalize(&quat_temp); +} + +int +quat_represent_integer(quat_alg_elem_t *gamma, + const ibz_t *n_gamma, + int non_diag, + const quat_represent_integer_params_t *params) +{ + + if (ibz_is_even(n_gamma)) { + return 0; + } + // var dec + int found; + ibz_t cornacchia_target; + ibz_t adjusted_n_gamma, q; + ibz_t bound, sq_bound, temp; + ibz_t test; + ibz_vec_4_t coeffs; // coeffs = [x,y,z,t] + quat_alg_elem_t quat_temp; + + if (non_diag) + assert(params->order->q % 4 == 1); + + // var init + found = 0; + ibz_init(&bound); + ibz_init(&test); + ibz_init(&temp); + ibz_init(&q); + ibz_init(&sq_bound); + ibz_vec_4_init(&coeffs); + quat_alg_elem_init(&quat_temp); + ibz_init(&adjusted_n_gamma); + ibz_init(&cornacchia_target); + + ibz_set(&q, params->order->q); + + // this could be removed in the current state + int standard_order = (params->order->q == 1); + + // adjusting the norm of gamma (multiplying by 4 to find a solution in an order of odd level) + if (non_diag || standard_order) { + ibz_mul(&adjusted_n_gamma, n_gamma, &ibz_const_two); + ibz_mul(&adjusted_n_gamma, &adjusted_n_gamma, &ibz_const_two); + } else { + ibz_copy(&adjusted_n_gamma, n_gamma); + } + // computation of the first bound = sqrt (adjust_n_gamma / p - q) + ibz_div(&sq_bound, &bound, &adjusted_n_gamma, &((params->algebra)->p)); + ibz_set(&temp, params->order->q); + ibz_sub(&sq_bound, &sq_bound, &temp); + ibz_sqrt_floor(&bound, &sq_bound); + + // the size of the search space is roughly n_gamma / (p√q) + ibz_t counter; + ibz_init(&counter); + ibz_mul(&temp, &temp, &((params->algebra)->p)); + ibz_mul(&temp, &temp, &((params->algebra)->p)); + ibz_sqrt_floor(&temp, &temp); + ibz_div(&counter, &temp, &adjusted_n_gamma, &temp); + + // entering the main loop + while (!found && ibz_cmp(&counter, &ibz_const_zero) != 0) { + // decreasing the counter + ibz_sub(&counter, &counter, &ibz_const_one); + + // we start by sampling the first coordinate + ibz_rand_interval(&coeffs[2], &ibz_const_one, &bound); + + // then, we sample the second coordinate + // computing the second bound in temp as sqrt( (adjust_n_gamma - p*coeffs[2]²)/qp ) + ibz_mul(&cornacchia_target, &coeffs[2], &coeffs[2]); + ibz_mul(&temp, &cornacchia_target, &(params->algebra->p)); + ibz_sub(&temp, &adjusted_n_gamma, &temp); + ibz_mul(&sq_bound, &q, &(params->algebra->p)); + ibz_div(&temp, &sq_bound, &temp, &sq_bound); + ibz_sqrt_floor(&temp, &temp); + + if (ibz_cmp(&temp, &ibz_const_zero) == 0) { + continue; + } + // sampling the second value + ibz_rand_interval(&coeffs[3], &ibz_const_one, &temp); + + // compute cornacchia_target = n_gamma - p * (z² + q*t²) + ibz_mul(&temp, &coeffs[3], &coeffs[3]); + ibz_mul(&temp, &q, &temp); + ibz_add(&cornacchia_target, &cornacchia_target, &temp); + ibz_mul(&cornacchia_target, &cornacchia_target, &((params->algebra)->p)); + ibz_sub(&cornacchia_target, &adjusted_n_gamma, &cornacchia_target); + assert(ibz_cmp(&cornacchia_target, &ibz_const_zero) > 0); + + // applying cornacchia + if (ibz_probab_prime(&cornacchia_target, params->primality_test_iterations)) + found = ibz_cornacchia_prime(&(coeffs[0]), &(coeffs[1]), &q, &cornacchia_target); + else + found = 0; + + if (found && non_diag && standard_order) { + // check that we can divide by two at least once + // the treatmeat depends if the basis contains (1+j)/2 or (1+k)/2 + // we must have x = t mod 2 and y = z mod 2 + // if q=1 we can simply swap x and y + if (ibz_is_odd(&coeffs[0]) != ibz_is_odd(&coeffs[3])) { + ibz_swap(&coeffs[1], &coeffs[0]); + } + // we further check that (x-t)/2 = 1 mod 2 and (y-z)/2 = 1 mod 2 to ensure that the + // resulting endomorphism will behave well for dim 2 computations + found = found && ((ibz_get(&coeffs[0]) - ibz_get(&coeffs[3])) % 4 == 2) && + ((ibz_get(&coeffs[1]) - ibz_get(&coeffs[2])) % 4 == 2); + } + if (found) { + +#ifndef NDEBUG + ibz_set(&temp, (params->order->q)); + ibz_mul(&temp, &temp, &(coeffs[1])); + ibz_mul(&temp, &temp, &(coeffs[1])); + ibz_mul(&test, &(coeffs[0]), &(coeffs[0])); + ibz_add(&temp, &temp, &test); + assert(0 == ibz_cmp(&temp, &cornacchia_target)); + + ibz_mul(&cornacchia_target, &(coeffs[3]), &(coeffs[3])); + ibz_mul(&cornacchia_target, &cornacchia_target, &(params->algebra->p)); + ibz_mul(&temp, &(coeffs[1]), &(coeffs[1])); + ibz_add(&cornacchia_target, &cornacchia_target, &temp); + ibz_set(&temp, (params->order->q)); + ibz_mul(&cornacchia_target, &cornacchia_target, &temp); + ibz_mul(&temp, &(coeffs[0]), &coeffs[0]); + ibz_add(&cornacchia_target, &cornacchia_target, &temp); + ibz_mul(&temp, &(coeffs[2]), &coeffs[2]); + ibz_mul(&temp, &temp, &(params->algebra->p)); + ibz_add(&cornacchia_target, &cornacchia_target, &temp); + assert(0 == ibz_cmp(&cornacchia_target, &adjusted_n_gamma)); +#endif + // translate x,y,z,t into the quaternion element gamma + quat_order_elem_create(gamma, (params->order), &coeffs, (params->algebra)); +#ifndef NDEBUG + quat_alg_norm(&temp, &(coeffs[0]), gamma, (params->algebra)); + assert(ibz_is_one(&(coeffs[0]))); + assert(0 == ibz_cmp(&temp, &adjusted_n_gamma)); + assert(quat_lattice_contains(NULL, &((params->order)->order), gamma)); +#endif + // making gamma primitive + // coeffs contains the coefficients of primitivized gamma in the basis of order + quat_alg_make_primitive(&coeffs, &temp, gamma, &((params->order)->order)); + + if (non_diag || standard_order) + found = (ibz_cmp(&temp, &ibz_const_two) == 0); + else + found = (ibz_cmp(&temp, &ibz_const_one) == 0); + } + } + + if (found) { + // new gamma + ibz_mat_4x4_eval(&coeffs, &(((params->order)->order).basis), &coeffs); + ibz_copy(&gamma->coord[0], &coeffs[0]); + ibz_copy(&gamma->coord[1], &coeffs[1]); + ibz_copy(&gamma->coord[2], &coeffs[2]); + ibz_copy(&gamma->coord[3], &coeffs[3]); + ibz_copy(&gamma->denom, &(((params->order)->order).denom)); + } + // var finalize + ibz_finalize(&counter); + ibz_finalize(&bound); + ibz_finalize(&temp); + ibz_finalize(&sq_bound); + ibz_vec_4_finalize(&coeffs); + quat_alg_elem_finalize(&quat_temp); + ibz_finalize(&adjusted_n_gamma); + ibz_finalize(&cornacchia_target); + ibz_finalize(&q); + ibz_finalize(&test); + + return found; +} + +int +quat_sampling_random_ideal_O0_given_norm(quat_left_ideal_t *lideal, + const ibz_t *norm, + int is_prime, + const quat_represent_integer_params_t *params, + const ibz_t *prime_cofactor) +{ + + ibz_t n_temp, norm_d; + ibz_t disc; + quat_alg_elem_t gen, gen_rerand; + int found = 0; + ibz_init(&n_temp); + ibz_init(&norm_d); + ibz_init(&disc); + quat_alg_elem_init(&gen); + quat_alg_elem_init(&gen_rerand); + + // when the norm is prime we can be quite efficient + // by avoiding to run represent integer + // the first step is to generate one ideal of the correct norm + if (is_prime) { + + // we find a quaternion element of norm divisible by norm + while (!found) { + // generating a trace-zero element at random + ibz_set(&gen.coord[0], 0); + ibz_sub(&n_temp, norm, &ibz_const_one); + for (int i = 1; i < 4; i++) + ibz_rand_interval(&gen.coord[i], &ibz_const_zero, &n_temp); + + // first, we compute the norm of the gen + quat_alg_norm(&n_temp, &norm_d, &gen, (params->algebra)); + assert(ibz_is_one(&norm_d)); + + // and finally the negation mod norm + ibz_neg(&disc, &n_temp); + ibz_mod(&disc, &disc, norm); + // now we check that -n is a square mod norm + // and if the square root exists we compute it + found = ibz_sqrt_mod_p(&gen.coord[0], &disc, norm); + found = found && !quat_alg_elem_is_zero(&gen); + } + } else { + assert(prime_cofactor != NULL); + // if it is not prime or we don't know if it is prime, we may just use represent integer + // and use a precomputed prime as cofactor + assert(!ibz_is_zero(norm)); + ibz_mul(&n_temp, prime_cofactor, norm); + found = quat_represent_integer(&gen, &n_temp, 0, params); + found = found && !quat_alg_elem_is_zero(&gen); + } +#ifndef NDEBUG + if (found) { + // first, we compute the norm of the gen + quat_alg_norm(&n_temp, &norm_d, &gen, (params->algebra)); + assert(ibz_is_one(&norm_d)); + ibz_mod(&n_temp, &n_temp, norm); + assert(ibz_cmp(&n_temp, &ibz_const_zero) == 0); + } +#endif + + // now we just have to rerandomize the class of the ideal generated by gen + found = 0; + while (!found) { + for (int i = 0; i < 4; i++) { + ibz_rand_interval(&gen_rerand.coord[i], &ibz_const_one, norm); + } + quat_alg_norm(&n_temp, &norm_d, &gen_rerand, (params->algebra)); + assert(ibz_is_one(&norm_d)); + ibz_gcd(&disc, &n_temp, norm); + found = ibz_is_one(&disc); + found = found && !quat_alg_elem_is_zero(&gen_rerand); + } + + quat_alg_mul(&gen, &gen, &gen_rerand, (params->algebra)); + // in both cases, whether norm is prime or not prime, + // gen is not divisible by any integer factor of the target norm + // therefore the call below will yield an ideal of the correct norm + quat_lideal_create(lideal, &gen, norm, &((params->order)->order), (params->algebra)); + assert(ibz_cmp(norm, &(lideal->norm)) == 0); + + ibz_finalize(&n_temp); + quat_alg_elem_finalize(&gen); + quat_alg_elem_finalize(&gen_rerand); + ibz_finalize(&norm_d); + ibz_finalize(&disc); + return (found); +} + +void +quat_change_to_O0_basis(ibz_vec_4_t *vec, const quat_alg_elem_t *el) +{ + ibz_t tmp; + ibz_init(&tmp); + ibz_copy(&(*vec)[2], &el->coord[2]); + ibz_add(&(*vec)[2], &(*vec)[2], &(*vec)[2]); // double (not optimal if el->denom is even...) + ibz_copy(&(*vec)[3], &el->coord[3]); // double (not optimal if el->denom is even...) + ibz_add(&(*vec)[3], &(*vec)[3], &(*vec)[3]); + ibz_sub(&(*vec)[0], &el->coord[0], &el->coord[3]); + ibz_sub(&(*vec)[1], &el->coord[1], &el->coord[2]); + + assert(ibz_divides(&(*vec)[0], &el->denom)); + assert(ibz_divides(&(*vec)[1], &el->denom)); + assert(ibz_divides(&(*vec)[2], &el->denom)); + assert(ibz_divides(&(*vec)[3], &el->denom)); + + ibz_div(&(*vec)[0], &tmp, &(*vec)[0], &el->denom); + ibz_div(&(*vec)[1], &tmp, &(*vec)[1], &el->denom); + ibz_div(&(*vec)[2], &tmp, &(*vec)[2], &el->denom); + ibz_div(&(*vec)[3], &tmp, &(*vec)[3], &el->denom); + + ibz_finalize(&tmp); +} diff --git a/src/quaternion/ref/generic/printer.c b/src/quaternion/ref/generic/printer.c index da0f86e..6d6a3ca 100644 --- a/src/quaternion/ref/generic/printer.c +++ b/src/quaternion/ref/generic/printer.c @@ -1,158 +1,132 @@ -#include +#include +#include "internal.h" -void ibz_mat_2x2_print(const ibz_mat_2x2_t *mat){ - ibz_printf("matrix: "); - for(int i = 0; i < 2; i++){ - for(int j = 0; j < 2; j++){ - ibz_printf("%Zd ", &((*mat)[i][j])); +void +ibz_mat_2x2_print(const ibz_mat_2x2_t *mat) +{ + printf("matrix: "); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + ibz_print(&((*mat)[i][j]), 10); + printf(" "); } - ibz_printf("\n "); + printf("\n "); } - ibz_printf("\n"); + printf("\n"); } -void ibz_mat_4x4_print(const ibz_mat_4x4_t *mat){ - ibz_printf("matrix: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_printf("%Zd ", &((*mat)[i][j])); +void +ibz_mat_4x4_print(const ibz_mat_4x4_t *mat) +{ + printf("matrix: "); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_print(&((*mat)[i][j]), 10); + printf(" "); } - ibz_printf("\n "); + printf("\n "); } - ibz_printf("\n"); + printf("\n"); } -void ibz_mat_4x5_print(const ibz_mat_4x5_t *mat){ - ibz_printf("matrix: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 5; j++){ - ibz_printf("%Zd ", &((*mat)[i][j])); +void +ibz_vec_2_print(const ibz_vec_2_t *vec) +{ + printf("vector: "); + for (int i = 0; i < 2; i++) { + ibz_print(&((*vec)[i]), 10); + printf(" "); + } + printf("\n\n"); +} + +void +ibz_vec_4_print(const ibz_vec_4_t *vec) +{ + printf("vector: "); + for (int i = 0; i < 4; i++) { + ibz_print(&((*vec)[i]), 10); + printf(" "); + } + printf("\n\n"); +} + +void +quat_lattice_print(const quat_lattice_t *lat) +{ + printf("lattice\n"); + printf("denominator: "); + ibz_print(&(lat->denom), 10); + printf("\n"); + printf("basis: "); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_print(&((lat->basis)[i][j]), 10); + printf(" "); } - ibz_printf("\n "); + printf("\n "); } - ibz_printf("\n"); + printf("\n"); } -void ibz_mat_4x8_print(const ibz_mat_4x8_t *mat){ - ibz_printf("matrix: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 8; j++){ - ibz_printf("%Zd ", &((*mat)[i][j])); +void +quat_alg_print(const quat_alg_t *alg) +{ + printf("quaternion algebra ramified at "); + ibz_print(&(alg->p), 10); + printf(" and infinity\n\n"); +} + +void +quat_alg_elem_print(const quat_alg_elem_t *elem) +{ + printf("denominator: "); + ibz_print(&(elem->denom), 10); + printf("\n"); + printf("coordinates: "); + for (int i = 0; i < 4; i++) { + ibz_print(&((elem->coord)[i]), 10); + printf(" "); + } + printf("\n\n"); +} + +void +quat_left_ideal_print(const quat_left_ideal_t *lideal) +{ + printf("left ideal\n"); + printf("norm: "); + ibz_print(&(lideal->norm), 10); + printf("\n"); + printf("denominator: "); + ibz_print(&(lideal->lattice.denom), 10); + printf("\n"); + printf("basis: "); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_print(&((lideal->lattice.basis)[i][j]), 10); + printf(" "); } - ibz_printf("\n "); - } - ibz_printf("\n"); -} - -void ibz_mat_print(int rows, int cols, const ibz_t mat[rows][cols]){ - ibz_printf("matrix: "); - for(int i = 0; i < rows; i++){ - for(int j = 0; j < cols; j++){ - ibz_printf("%Zd ", &mat[i][j]); + if (i != 3) { + printf("\n "); + } else { + printf("\n"); } - ibz_printf("\n "); } - ibz_printf("\n"); -} - - -void ibz_vec_2_print(const ibz_vec_2_t *vec){ - ibz_printf("vector: "); - for(int i = 0; i < 2; i++){ - ibz_printf("%Zd ", &((*vec)[i])); - } - ibz_printf("\n\n"); -} - -void ibz_vec_4_print(const ibz_vec_4_t *vec){ - ibz_printf("vector: "); - for(int i = 0; i < 4; i++){ - ibz_printf("%Zd ", &((*vec)[i])); - } - ibz_printf("\n\n"); -} -void ibz_vec_5_print(const ibz_vec_5_t *vec){ - ibz_printf("vector: "); - for(int i = 0; i < 5; i++){ - ibz_printf("%Zd ", &((*vec)[i])); - } - ibz_printf("\n\n"); -} - - -void quat_lattice_print(const quat_lattice_t *lat){ - ibz_printf("lattice\n"); - ibz_printf("denominator: %Zd\n",(lat->denom)); - ibz_printf("basis: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_printf("%Zd ", &((lat->basis)[i][j])); + if ((lideal->parent_order) != NULL) { + printf("parent order denominator: "); + ibz_print(&(lideal->parent_order->denom), 10); + printf("\n"); + printf("parent order basis: "); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_print(&((lideal->parent_order->basis)[i][j]), 10); + printf(" "); } - ibz_printf("\n "); - } - ibz_printf("\n"); -} - -void quat_alg_print(const quat_alg_t *alg){ - ibz_printf("quaternion algebra ramified at %Zd and infinity\n\n", &(alg->p)); -} - -void quat_alg_elem_print(const quat_alg_elem_t *elem){ - ibz_printf("denominator: %Zd\n",(elem->denom)); - ibz_printf("coordinates: "); - for(int i = 0; i < 4; i++){ - ibz_printf("%Zd ",&((elem->coord)[i])); - } - ibz_printf("\n\n"); -} - -void quat_alg_coord_print(const quat_alg_coord_t *coord){ - ibz_printf("coordinates: "); - for(int i = 0; i < 4; i++){ - ibz_printf("%Zd ",&((*coord)[i])); - } - ibz_printf("\n\n"); -} - -void quat_order_print(const quat_order_t *order){ - ibz_printf("order\n"); - ibz_printf("denominator: %Zd\n",&(order->denom)); - ibz_printf("basis: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_printf("%Zd ", &((order->basis)[i][j])); - } - ibz_printf("\n "); - } - ibz_printf("\n"); -} - -void quat_left_ideal_print(const quat_left_ideal_t *lideal){ - ibz_printf("left ideal\n"); - ibz_printf("norm : %Zd\n",&(lideal->norm)); - ibz_printf("denominator: %Zd\n",&(lideal->lattice.denom)); - ibz_printf("basis: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_printf("%Zd ", &((lideal->lattice.basis)[i][j])); - } - if(i!=3){ - ibz_printf("\n "); - } else { - ibz_printf("\n"); - } - } - if((lideal->parent_order )!= NULL){ - ibz_printf("parent order denominator: %Zd\n",&(lideal->parent_order->denom)); - ibz_printf("parent order basis: "); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_printf("%Zd ", &((lideal->parent_order->basis)[i][j])); - } - ibz_printf("\n "); + printf("\n "); } } else { - ibz_printf("Parent order not given!\n"); + printf("Parent order not given!\n"); } - ibz_printf("\n"); + printf("\n"); } diff --git a/src/quaternion/ref/generic/test/CMakeLists.txt b/src/quaternion/ref/generic/test/CMakeLists.txt index 6598004..35dc5e1 100644 --- a/src/quaternion/ref/generic/test/CMakeLists.txt +++ b/src/quaternion/ref/generic/test/CMakeLists.txt @@ -1,21 +1,40 @@ -set(SOURCE_FILES_QUATERNION_GENERIC_REF_TESTS +set(SOURCE_FILES_QUATERNION_GENERIC_REF + intbig.c algebra.c ideal.c dim4.c dim2.c integers.c lattice.c + lat_ball.c finit.c - matkermod.c + mini-gmp.c + normeq.c randomized.c - test_quaternions.c ) -add_executable(sqisign_test_quaternion ${SOURCE_FILES_QUATERNION_GENERIC_REF_TESTS}) -target_link_libraries(sqisign_test_quaternion ${LIB_INTBIG} ${LIB_QUATERNION} ${GMP} sqisign_common_sys ) -target_include_directories(sqisign_test_quaternion PRIVATE ${INC_INTBIG} ${INC_COMMON} ${INC_QUATERNION} ${INC_PUBLIC} ) + +if (NOT GMP_LIBRARY STREQUAL "MINI") + list(APPEND SOURCE_FILES_QUATERNION_GENERIC_REF ${PROJECT_SOURCE_DIR}/src/mini-gmp/mini-gmp-extra.c) +endif() + +set(SOURCE_FILES_QUATERNION_GENERIC_REF_TESTS + ${SOURCE_FILES_QUATERNION_GENERIC_REF} + ../hnf/hnf_tests.c + ../lll/lll_verification.c + ../lll/lll_tests.c +) +add_executable(sqisign_test_quaternion ${SOURCE_FILES_QUATERNION_GENERIC_REF_TESTS} test_quaternions.c) +target_link_libraries(sqisign_test_quaternion ${LIB_QUATERNION} ${GMP} sqisign_common_sys) +target_include_directories(sqisign_test_quaternion PRIVATE ../internal_quaternion_headers ${INC_COMMON} ${INC_QUATERNION} ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/mini-gmp) + +add_executable(sqisign_bm_quaternion ${SOURCE_FILES_QUATERNION_GENERIC_REF_TESTS} ../lll/lll_benchmarks.c) +target_link_libraries(sqisign_bm_quaternion ${LIB_QUATERNION} ${GMP} sqisign_common_test) +target_include_directories(sqisign_bm_quaternion PRIVATE ../internal_quaternion_headers ${INC_COMMON} ${INC_QUATERNION} ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/mini-gmp) # MSAN and GMP lead to false positives, see # https://gmplib.org/list-archives/gmp-bugs/2019-March/004529.html if(NOT CMAKE_BUILD_TYPE STREQUAL "MSAN") add_test(sqisign_test_quaternion sqisign_test_quaternion) endif() + +set(BM_BINS ${BM_BINS} sqisign_bm_quaternion CACHE INTERNAL "List of benchmark executables") diff --git a/src/quaternion/ref/generic/test/algebra.c b/src/quaternion/ref/generic/test/algebra.c index 90949c8..60ce769 100644 --- a/src/quaternion/ref/generic/test/algebra.c +++ b/src/quaternion/ref/generic/test/algebra.c @@ -2,162 +2,93 @@ // tests of internal helper functions -//static inline void quat_alg_init_set_ui(quat_alg_t *alg, unsigned int p); -int quat_test_init_set_ui(){ +// static inline void quat_alg_init_set_ui(quat_alg_t *alg, unsigned int p); +int +quat_test_init_set_ui(void) +{ int res = 0; int p = 5; quat_alg_t alg; - ibz_mat_4x4_t cmp; - ibz_mat_4x4_init(&cmp); quat_alg_init_set_ui(&alg, p); - res = res || (p != ibz_get(&(alg.p))); - ibz_mat_4x4_identity(&cmp); - ibz_set(&(cmp[2][2]),p); - ibz_set(&(cmp[3][3]),p); - res = res || !ibz_mat_4x4_equal(&cmp,&(alg.gram)); - if (res != 0){ + res = res || (ibz_cmp_int32(&(alg.p), p) != 0); + if (res != 0) { printf("Quaternion unit test alg_init_set_ui failed\n"); } quat_alg_finalize(&alg); - ibz_mat_4x4_finalize(&cmp); - return(res); + return (res); } -//void quat_alg_coord_add(quat_alg_coord_t *res, const quat_alg_coord_t *a, const quat_alg_coord_t *b); -int quat_test_alg_coord_add(){ +// void quat_alg_coord_mul(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b, const +// quat_alg_t *alg); +int +quat_test_alg_coord_mul(void) +{ int res = 0; - quat_alg_coord_t a, b, c, cmp; - quat_alg_coord_init(&a); - quat_alg_coord_init(&b); - quat_alg_coord_init(&c); - quat_alg_coord_init(&cmp); + quat_alg_t alg; + quat_alg_init_set_ui(&alg, 7); + ibz_vec_4_t a, b, c, cmp; + ibz_vec_4_init(&a); + ibz_vec_4_init(&b); + ibz_vec_4_init(&c); + ibz_vec_4_init(&cmp); - - ibz_set(&(a[0]),1); - ibz_set(&(a[1]),-2); - ibz_set(&(a[2]),7); - ibz_set(&(a[3]),199); - ibz_set(&(b[0]),-6); - ibz_set(&(b[1]),2); - ibz_set(&(b[2]),67); - ibz_set(&(b[3]),-22); - ibz_set(&(cmp[0]),-5); - ibz_set(&(cmp[1]),0); - ibz_set(&(cmp[2]),74); - ibz_set(&(cmp[3]),177); - quat_alg_coord_add(&c,&a,&b); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c[i]),&(cmp[i])); + ibz_set(&(a[0]), 152); + ibz_set(&(a[1]), 57); + ibz_set(&(a[2]), 190); + ibz_set(&(a[3]), 28); + ibz_set(&(b[0]), 165); + ibz_set(&(b[1]), 35); + ibz_set(&(b[2]), 231); + ibz_set(&(b[3]), 770); + ibz_set(&(cmp[0]), -435065); + ibz_set(&(cmp[1]), 993549); + ibz_set(&(cmp[2]), 23552); + ibz_set(&(cmp[3]), 128177); + quat_alg_coord_mul(&c, &a, &b, &alg); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(c[i]), &(cmp[i])); + } + ibz_set(&(alg.p), 11); + ibz_set(&(cmp[0]), -696865); + ibz_set(&(cmp[1]), 1552877); + quat_alg_coord_mul(&c, &a, &b, &alg); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(c[i]), &(cmp[i])); } - ibz_set(&(a[0]),-122); - ibz_set(&(a[1]),0); - ibz_set(&(a[2]),-7); - ibz_set(&(a[3]),1889); - ibz_set(&(b[0]),-6); - ibz_set(&(b[1]),2); - ibz_set(&(b[2]),67); - ibz_set(&(b[3]),-1889); - ibz_set(&(cmp[0]),-128); - ibz_set(&(cmp[1]),2); - ibz_set(&(cmp[2]),60); - ibz_set(&(cmp[3]),0); - quat_alg_coord_add(&c,&a,&b); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c[i]),&(cmp[i])); + ibz_set(&(alg.p), 7); + ibz_set(&(a[0]), 1); + ibz_set(&(a[1]), 1); + ibz_set(&(a[2]), 1); + ibz_set(&(a[3]), 1); + ibz_set(&(cmp[0]), -14); + ibz_set(&(cmp[1]), 2); + ibz_set(&(cmp[2]), 2); + ibz_set(&(cmp[3]), 2); + quat_alg_coord_mul(&a, &a, &a, &alg); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(a[i]), &(cmp[i])); } - ibz_set(&(a[0]),-1); - ibz_set(&(a[1]),2); - ibz_set(&(a[2]),-7); - ibz_set(&(a[3]),19);; - ibz_set(&(cmp[0]),-2); - ibz_set(&(cmp[1]),4); - ibz_set(&(cmp[2]),-14); - ibz_set(&(cmp[3]),38); - quat_alg_coord_add(&a,&a,&a); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(a[i]),&(cmp[i])); + if (res != 0) { + printf("Quaternion unit test alg_coord_mul failed\n"); } - - if (res != 0){ - printf("Quaternion unit test alg_coord_add failed\n"); - } - quat_alg_coord_finalize(&a); - quat_alg_coord_finalize(&b); - quat_alg_coord_finalize(&c); - quat_alg_coord_finalize(&cmp); - return(res); + ibz_vec_4_finalize(&a); + ibz_vec_4_finalize(&b); + ibz_vec_4_finalize(&c); + ibz_vec_4_finalize(&cmp); + quat_alg_finalize(&alg); + return (res); } -//void quat_alg_coord_sub(quat_alg_coord_t *res, const quat_alg_coord_t *a, const quat_alg_coord_t *b); -int quat_test_alg_coord_sub(){ - int res = 0; - quat_alg_coord_t a, b, c, cmp; - quat_alg_coord_init(&a); - quat_alg_coord_init(&b); - quat_alg_coord_init(&c); - quat_alg_coord_init(&cmp); - - ibz_set(&(a[0]),1); - ibz_set(&(a[1]),-2); - ibz_set(&(a[2]),7); - ibz_set(&(a[3]),199); - ibz_set(&(b[0]),-6); - ibz_set(&(b[1]),2); - ibz_set(&(b[2]),67); - ibz_set(&(b[3]),-22); - ibz_set(&(cmp[0]),7); - ibz_set(&(cmp[1]),-4); - ibz_set(&(cmp[2]),-60); - ibz_set(&(cmp[3]),221); - quat_alg_coord_sub(&c,&a,&b); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c[i]),&(cmp[i])); - } - - ibz_set(&(a[0]),-122); - ibz_set(&(a[1]),0); - ibz_set(&(a[2]),-7); - ibz_set(&(a[3]),1889); - ibz_set(&(b[0]),-6); - ibz_set(&(b[1]),2); - ibz_set(&(b[2]),67); - ibz_set(&(b[3]),-1889); - ibz_set(&(cmp[0]),-116); - ibz_set(&(cmp[1]),-2); - ibz_set(&(cmp[2]),-74); - ibz_set(&(cmp[3]),3778); - quat_alg_coord_sub(&c,&a,&b); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c[i]),&(cmp[i])); - } - - ibz_set(&(a[0]),-1); - ibz_set(&(a[1]),2); - ibz_set(&(a[2]),-7); - ibz_set(&(a[3]),19);; - ibz_set(&(cmp[0]),0); - ibz_set(&(cmp[1]),0); - ibz_set(&(cmp[2]),0); - ibz_set(&(cmp[3]),0); - quat_alg_coord_sub(&a,&a,&a); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(a[i]),&(cmp[i])); - } - - if (res != 0){ - printf("Quaternion unit test alg_coord_sub failed\n"); - } - quat_alg_coord_finalize(&a); - quat_alg_coord_finalize(&b); - quat_alg_coord_finalize(&c); - quat_alg_coord_finalize(&cmp); - return(res); -} - -//void quat_alg_equal_denom(quat_alg_elem_t *res_a, quat_alg_elem_t *res_b, const quat_alg_elem_t *a, const quat_alg_elem_t *b); -int quat_test_alg_equal_denom(){ +// void quat_alg_equal_denom(quat_alg_elem_t *res_a, quat_alg_elem_t *res_b, const quat_alg_elem_t +// *a, const quat_alg_elem_t *b); +int +quat_test_alg_equal_denom(void) +{ int res = 0; quat_alg_elem_t a, b, res_a, res_b, cmp_a, cmp_b; quat_alg_elem_init(&a); @@ -167,118 +98,117 @@ int quat_test_alg_equal_denom(){ quat_alg_elem_init(&cmp_a); quat_alg_elem_init(&cmp_b); - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),67); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),3); - ibz_set(&(cmp_a.coord[0]),-12); - ibz_set(&(cmp_a.coord[1]),0); - ibz_set(&(cmp_a.coord[2]),-7); - ibz_set(&(cmp_a.coord[3]),19); - ibz_set(&(cmp_a.denom),9); - ibz_set(&(cmp_b.coord[0]),-18); - ibz_set(&(cmp_b.coord[1]),6); - ibz_set(&(cmp_b.coord[2]),201); - ibz_set(&(cmp_b.coord[3]),-57); - ibz_set(&(cmp_b.denom),9); - quat_alg_equal_denom(&res_a,&res_b,&a,&b); - res = res || ibz_cmp(&(res_a.denom),&(cmp_a.denom)); - res = res || ibz_cmp(&(res_b.denom),&(cmp_b.denom)); - res = res || ibz_cmp(&(cmp_a.denom),&(cmp_b.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(res_a.coord[i]),&(cmp_a.coord[i])); - res = res || ibz_cmp(&(res_b.coord[i]),&(cmp_b.coord[i])); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 67); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 3); + ibz_set(&(cmp_a.coord[0]), -12); + ibz_set(&(cmp_a.coord[1]), 0); + ibz_set(&(cmp_a.coord[2]), -7); + ibz_set(&(cmp_a.coord[3]), 19); + ibz_set(&(cmp_a.denom), 9); + ibz_set(&(cmp_b.coord[0]), -18); + ibz_set(&(cmp_b.coord[1]), 6); + ibz_set(&(cmp_b.coord[2]), 201); + ibz_set(&(cmp_b.coord[3]), -57); + ibz_set(&(cmp_b.denom), 9); + quat_alg_equal_denom(&res_a, &res_b, &a, &b); + res = res || ibz_cmp(&(res_a.denom), &(cmp_a.denom)); + res = res || ibz_cmp(&(res_b.denom), &(cmp_b.denom)); + res = res || ibz_cmp(&(cmp_a.denom), &(cmp_b.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(res_a.coord[i]), &(cmp_a.coord[i])); + res = res || ibz_cmp(&(res_b.coord[i]), &(cmp_b.coord[i])); } - - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),67); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),6); - ibz_set(&(cmp_a.coord[0]),-24); - ibz_set(&(cmp_a.coord[1]),0); - ibz_set(&(cmp_a.coord[2]),-14); - ibz_set(&(cmp_a.coord[3]),38); - ibz_set(&(cmp_a.denom),18); - ibz_set(&(cmp_b.coord[0]),-18); - ibz_set(&(cmp_b.coord[1]),6); - ibz_set(&(cmp_b.coord[2]),201); - ibz_set(&(cmp_b.coord[3]),-57); - ibz_set(&(cmp_b.denom),18); - quat_alg_equal_denom(&res_a,&res_b,&a,&b); - res = res || ibz_cmp(&(res_a.denom),&(cmp_a.denom)); - res = res || ibz_cmp(&(res_b.denom),&(cmp_b.denom)); - res = res || ibz_cmp(&(cmp_a.denom),&(cmp_b.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(res_a.coord[i]),&(cmp_a.coord[i])); - res = res || ibz_cmp(&(res_b.coord[i]),&(cmp_b.coord[i])); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 67); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 6); + ibz_set(&(cmp_a.coord[0]), -24); + ibz_set(&(cmp_a.coord[1]), 0); + ibz_set(&(cmp_a.coord[2]), -14); + ibz_set(&(cmp_a.coord[3]), 38); + ibz_set(&(cmp_a.denom), 18); + ibz_set(&(cmp_b.coord[0]), -18); + ibz_set(&(cmp_b.coord[1]), 6); + ibz_set(&(cmp_b.coord[2]), 201); + ibz_set(&(cmp_b.coord[3]), -57); + ibz_set(&(cmp_b.denom), 18); + quat_alg_equal_denom(&res_a, &res_b, &a, &b); + res = res || ibz_cmp(&(res_a.denom), &(cmp_a.denom)); + res = res || ibz_cmp(&(res_b.denom), &(cmp_b.denom)); + res = res || ibz_cmp(&(cmp_a.denom), &(cmp_b.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(res_a.coord[i]), &(cmp_a.coord[i])); + res = res || ibz_cmp(&(res_b.coord[i]), &(cmp_b.coord[i])); } - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),6); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),67); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),6); - ibz_set(&(cmp_a.coord[0]),-12); - ibz_set(&(cmp_a.coord[1]),0); - ibz_set(&(cmp_a.coord[2]),-7); - ibz_set(&(cmp_a.coord[3]),19); - ibz_set(&(cmp_a.denom),6); - ibz_set(&(cmp_b.coord[0]),-6); - ibz_set(&(cmp_b.coord[1]),2); - ibz_set(&(cmp_b.coord[2]),67); - ibz_set(&(cmp_b.coord[3]),-19); - ibz_set(&(cmp_b.denom),6); - quat_alg_equal_denom(&res_a,&res_b,&a,&b); - res = res || ibz_cmp(&(res_a.denom),&(cmp_a.denom)); - res = res || ibz_cmp(&(res_b.denom),&(cmp_b.denom)); - res = res || ibz_cmp(&(cmp_a.denom),&(cmp_b.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(res_a.coord[i]),&(cmp_a.coord[i])); - res = res || ibz_cmp(&(res_b.coord[i]),&(cmp_b.coord[i])); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 6); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 67); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 6); + ibz_set(&(cmp_a.coord[0]), -12); + ibz_set(&(cmp_a.coord[1]), 0); + ibz_set(&(cmp_a.coord[2]), -7); + ibz_set(&(cmp_a.coord[3]), 19); + ibz_set(&(cmp_a.denom), 6); + ibz_set(&(cmp_b.coord[0]), -6); + ibz_set(&(cmp_b.coord[1]), 2); + ibz_set(&(cmp_b.coord[2]), 67); + ibz_set(&(cmp_b.coord[3]), -19); + ibz_set(&(cmp_b.denom), 6); + quat_alg_equal_denom(&res_a, &res_b, &a, &b); + res = res || ibz_cmp(&(res_a.denom), &(cmp_a.denom)); + res = res || ibz_cmp(&(res_b.denom), &(cmp_b.denom)); + res = res || ibz_cmp(&(cmp_a.denom), &(cmp_b.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(res_a.coord[i]), &(cmp_a.coord[i])); + res = res || ibz_cmp(&(res_b.coord[i]), &(cmp_b.coord[i])); } - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),6); - ibz_set(&(cmp_a.coord[0]),-12); - ibz_set(&(cmp_a.coord[1]),0); - ibz_set(&(cmp_a.coord[2]),-7); - ibz_set(&(cmp_a.coord[3]),19); - ibz_set(&(cmp_a.denom),6); - ibz_set(&(cmp_b.coord[0]),-12); - ibz_set(&(cmp_b.coord[1]),0); - ibz_set(&(cmp_b.coord[2]),-7); - ibz_set(&(cmp_b.coord[3]),19); - ibz_set(&(cmp_b.denom),6); - quat_alg_equal_denom(&a,&b,&a,&a); - res = res || ibz_cmp(&(a.denom),&(a.denom)); - res = res || ibz_cmp(&(b.denom),&(b.denom)); - res = res || ibz_cmp(&(cmp_a.denom),&(cmp_b.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(a.coord[i]),&(a.coord[i])); - res = res || ibz_cmp(&(b.coord[i]),&(b.coord[i])); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 6); + ibz_set(&(cmp_a.coord[0]), -12); + ibz_set(&(cmp_a.coord[1]), 0); + ibz_set(&(cmp_a.coord[2]), -7); + ibz_set(&(cmp_a.coord[3]), 19); + ibz_set(&(cmp_a.denom), 6); + ibz_set(&(cmp_b.coord[0]), -12); + ibz_set(&(cmp_b.coord[1]), 0); + ibz_set(&(cmp_b.coord[2]), -7); + ibz_set(&(cmp_b.coord[3]), 19); + ibz_set(&(cmp_b.denom), 6); + quat_alg_equal_denom(&a, &b, &a, &a); + res = res || ibz_cmp(&(a.denom), &(a.denom)); + res = res || ibz_cmp(&(b.denom), &(b.denom)); + res = res || ibz_cmp(&(cmp_a.denom), &(cmp_b.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(a.coord[i]), &(a.coord[i])); + res = res || ibz_cmp(&(b.coord[i]), &(b.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_equal_denom failed\n"); } quat_alg_elem_finalize(&a); @@ -287,15 +217,15 @@ int quat_test_alg_equal_denom(){ quat_alg_elem_finalize(&res_b); quat_alg_elem_finalize(&cmp_a); quat_alg_elem_finalize(&cmp_b); - return(res); + return (res); } +// Tests of public functions -//Tests of public functions - - -//void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); -int quat_test_alg_add(){ +// void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); +int +quat_test_alg_add(void) +{ int res = 0; quat_alg_elem_t a, b, c, cmp; quat_alg_elem_init(&a); @@ -303,76 +233,78 @@ int quat_test_alg_add(){ quat_alg_elem_init(&c); quat_alg_elem_init(&cmp); - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),7); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),3); - ibz_set(&(cmp.coord[0]),-30); - ibz_set(&(cmp.coord[1]),6); - ibz_set(&(cmp.coord[2]),14); - ibz_set(&(cmp.coord[3]),-38); - ibz_set(&(cmp.denom),9); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 7); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 3); + ibz_set(&(cmp.coord[0]), -30); + ibz_set(&(cmp.coord[1]), 6); + ibz_set(&(cmp.coord[2]), 14); + ibz_set(&(cmp.coord[3]), -38); + ibz_set(&(cmp.denom), 9); quat_alg_add(&c, &a, &b); - res = res || ibz_cmp(&(c.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(c.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c.coord[i]), &(cmp.coord[i])); } - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),7); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),6); - ibz_set(&(cmp.coord[0]),-42); - ibz_set(&(cmp.coord[1]),6); - ibz_set(&(cmp.coord[2]),7); - ibz_set(&(cmp.coord[3]),-19); - ibz_set(&(cmp.denom),18); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 7); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 6); + ibz_set(&(cmp.coord[0]), -42); + ibz_set(&(cmp.coord[1]), 6); + ibz_set(&(cmp.coord[2]), 7); + ibz_set(&(cmp.coord[3]), -19); + ibz_set(&(cmp.denom), 18); quat_alg_add(&c, &a, &b); - res = res || ibz_cmp(&(c.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(c.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c.coord[i]), &(cmp.coord[i])); } - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(cmp.coord[0]),-24); - ibz_set(&(cmp.coord[1]),0); - ibz_set(&(cmp.coord[2]),-14); - ibz_set(&(cmp.coord[3]),38); - ibz_set(&(cmp.denom),9); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(cmp.coord[0]), -24); + ibz_set(&(cmp.coord[1]), 0); + ibz_set(&(cmp.coord[2]), -14); + ibz_set(&(cmp.coord[3]), 38); + ibz_set(&(cmp.denom), 9); quat_alg_add(&a, &a, &a); - res = res || ibz_cmp(&(a.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(a.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(a.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(a.coord[i]), &(cmp.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_add failed\n"); } quat_alg_elem_finalize(&a); quat_alg_elem_finalize(&b); quat_alg_elem_finalize(&c); quat_alg_elem_finalize(&cmp); - return(res); + return (res); } -//void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); -int quat_test_alg_sub(){ +// void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); +int +quat_test_alg_sub(void) +{ int res = 0; quat_alg_elem_t a, b, c, cmp; quat_alg_elem_init(&a); @@ -380,76 +312,81 @@ int quat_test_alg_sub(){ quat_alg_elem_init(&c); quat_alg_elem_init(&cmp); - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),7); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),3); - ibz_set(&(cmp.coord[0]),-12-3*(-6)); - ibz_set(&(cmp.coord[1]),-3*2); - ibz_set(&(cmp.coord[2]),-7-3*7); - ibz_set(&(cmp.coord[3]),19-3*(-19)); - ibz_set(&(cmp.denom),9); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 7); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 3); + ibz_set(&(cmp.coord[0]), -12 - 3 * (-6)); + ibz_set(&(cmp.coord[1]), -3 * 2); + ibz_set(&(cmp.coord[2]), -7 - 3 * 7); + ibz_set(&(cmp.coord[3]), 19 - 3 * (-19)); + ibz_set(&(cmp.denom), 9); quat_alg_sub(&c, &a, &b); - res = res || ibz_cmp(&(c.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(c.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(c.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c.coord[i]), &(cmp.coord[i])); } - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(b.coord[0]),-6); - ibz_set(&(b.coord[1]),2); - ibz_set(&(b.coord[2]),7); - ibz_set(&(b.coord[3]),-19); - ibz_set(&(b.denom),6); - ibz_set(&(cmp.coord[0]),-2*12-3*(-6)); - ibz_set(&(cmp.coord[1]),-3*2); - ibz_set(&(cmp.coord[2]),-2*7-3*7); - ibz_set(&(cmp.coord[3]),2*19-3*(-19)); - ibz_set(&(cmp.denom),18); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(b.coord[0]), -6); + ibz_set(&(b.coord[1]), 2); + ibz_set(&(b.coord[2]), 7); + ibz_set(&(b.coord[3]), -19); + ibz_set(&(b.denom), 6); + ibz_set(&(cmp.coord[0]), -2 * 12 - 3 * (-6)); + ibz_set(&(cmp.coord[1]), -3 * 2); + ibz_set(&(cmp.coord[2]), -2 * 7 - 3 * 7); + ibz_set(&(cmp.coord[3]), 2 * 19 - 3 * (-19)); + ibz_set(&(cmp.denom), 18); quat_alg_sub(&a, &a, &b); - res = res || ibz_cmp(&(a.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(a.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(a.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(a.coord[i]), &(cmp.coord[i])); } - ibz_set(&(a.coord[0]),-12); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),-7); - ibz_set(&(a.coord[3]),19); - ibz_set(&(a.denom),9); - ibz_set(&(cmp.coord[0]),0); - ibz_set(&(cmp.coord[1]),0); - ibz_set(&(cmp.coord[2]),0); - ibz_set(&(cmp.coord[3]),0); - ibz_set(&(cmp.denom),9); + ibz_set(&(a.coord[0]), -12); + ibz_set(&(a.coord[1]), 0); + ibz_set(&(a.coord[2]), -7); + ibz_set(&(a.coord[3]), 19); + ibz_set(&(a.denom), 9); + ibz_set(&(cmp.coord[0]), 0); + ibz_set(&(cmp.coord[1]), 0); + ibz_set(&(cmp.coord[2]), 0); + ibz_set(&(cmp.coord[3]), 0); + ibz_set(&(cmp.denom), 9); quat_alg_sub(&a, &a, &a); - res = res || ibz_cmp(&(a.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(a.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(a.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(a.coord[i]), &(cmp.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_sub failed\n"); } quat_alg_elem_finalize(&a); quat_alg_elem_finalize(&b); quat_alg_elem_finalize(&c); quat_alg_elem_finalize(&cmp); - return(res); + return (res); } -//void quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const quat_alg_t *alg); -int quat_test_alg_mul(){ +// void quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const +// quat_alg_t *alg); +int +quat_test_alg_mul(void) +{ int res = 0; quat_alg_t alg; quat_alg_init_set_ui(&alg, 7); @@ -459,71 +396,75 @@ int quat_test_alg_mul(){ quat_alg_elem_init(&c); quat_alg_elem_init(&cmp); - ibz_set(&(a.coord[0]),152); - ibz_set(&(a.coord[1]),57); - ibz_set(&(a.coord[2]),190); - ibz_set(&(a.coord[3]),28); - ibz_set(&(a.denom),76); - ibz_set(&(b.coord[0]),165); - ibz_set(&(b.coord[1]),35); - ibz_set(&(b.coord[2]),231); - ibz_set(&(b.coord[3]),770); - ibz_set(&(b.denom),385); - ibz_set(&(cmp.coord[0]),-435065); - ibz_set(&(cmp.coord[1]),993549); - ibz_set(&(cmp.coord[2]),23552); - ibz_set(&(cmp.coord[3]),128177); - ibz_set(&(cmp.denom),29260); + ibz_set(&(a.coord[0]), 152); + ibz_set(&(a.coord[1]), 57); + ibz_set(&(a.coord[2]), 190); + ibz_set(&(a.coord[3]), 28); + ibz_set(&(a.denom), 76); + ibz_set(&(b.coord[0]), 165); + ibz_set(&(b.coord[1]), 35); + ibz_set(&(b.coord[2]), 231); + ibz_set(&(b.coord[3]), 770); + ibz_set(&(b.denom), 385); + ibz_set(&(cmp.coord[0]), -435065); + ibz_set(&(cmp.coord[1]), 993549); + ibz_set(&(cmp.coord[2]), 23552); + ibz_set(&(cmp.coord[3]), 128177); + ibz_set(&(cmp.denom), 29260); quat_alg_mul(&c, &a, &b, &alg); - res = res || ibz_cmp(&(c.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(c.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(c.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(c.coord[i]), &(cmp.coord[i])); } - ibz_set(&(alg.p),11); - ibz_set(&(cmp.coord[0]),-696865); - ibz_set(&(cmp.coord[1]),1552877); - ibz_set(&(cmp.denom),29260); + ibz_set(&(alg.p), 11); + ibz_set(&(cmp.coord[0]), -696865); + ibz_set(&(cmp.coord[1]), 1552877); + ibz_set(&(cmp.denom), 29260); quat_alg_mul(&c, &a, &b, &alg); - res = res || ibz_cmp(&(c.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(c.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(c.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(c.coord[i]), &(cmp.coord[i])); } - ibz_set(&(alg.p),7); - ibz_set(&(a.coord[0]),1); - ibz_set(&(a.coord[1]),1); - ibz_set(&(a.coord[2]),1); - ibz_set(&(a.coord[3]),1); - ibz_set(&(a.denom),2); - ibz_set(&(cmp.coord[0]),-14); - ibz_set(&(cmp.coord[1]),2); - ibz_set(&(cmp.coord[2]),2); - ibz_set(&(cmp.coord[3]),2); - ibz_set(&(cmp.denom),4); + ibz_set(&(alg.p), 7); + ibz_set(&(a.coord[0]), 1); + ibz_set(&(a.coord[1]), 1); + ibz_set(&(a.coord[2]), 1); + ibz_set(&(a.coord[3]), 1); + ibz_set(&(a.denom), 2); + ibz_set(&(cmp.coord[0]), -14); + ibz_set(&(cmp.coord[1]), 2); + ibz_set(&(cmp.coord[2]), 2); + ibz_set(&(cmp.coord[3]), 2); + ibz_set(&(cmp.denom), 4); quat_alg_mul(&c, &a, &a, &alg); - res = res || ibz_cmp(&(c.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(c.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(c.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(c.coord[i]), &(cmp.coord[i])); } - ibz_set(&(alg.p),7); - ibz_set(&(a.coord[0]),1); - ibz_set(&(a.coord[1]),1); - ibz_set(&(a.coord[2]),1); - ibz_set(&(a.coord[3]),1); - ibz_set(&(a.denom),2); - ibz_set(&(cmp.coord[0]),-14); - ibz_set(&(cmp.coord[1]),2); - ibz_set(&(cmp.coord[2]),2); - ibz_set(&(cmp.coord[3]),2); - ibz_set(&(cmp.denom),4); + ibz_set(&(alg.p), 7); + ibz_set(&(a.coord[0]), 1); + ibz_set(&(a.coord[1]), 1); + ibz_set(&(a.coord[2]), 1); + ibz_set(&(a.coord[3]), 1); + ibz_set(&(a.denom), 2); + ibz_set(&(cmp.coord[0]), -14); + ibz_set(&(cmp.coord[1]), 2); + ibz_set(&(cmp.coord[2]), 2); + ibz_set(&(cmp.coord[3]), 2); + ibz_set(&(cmp.denom), 4); quat_alg_mul(&a, &a, &a, &alg); - res = res || ibz_cmp(&(a.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(a.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(a.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(a.coord[i]), &(cmp.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_mul failed\n"); } quat_alg_elem_finalize(&a); @@ -531,155 +472,101 @@ int quat_test_alg_mul(){ quat_alg_elem_finalize(&c); quat_alg_elem_finalize(&cmp); quat_alg_finalize(&alg); - return(res); + return (res); } -//void quat_alg_norm(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_t *alg); -int quat_test_alg_norm(){ +// void quat_alg_norm(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_t *alg); +int +quat_test_alg_norm(void) +{ int res = 0; quat_alg_t alg; quat_alg_init_set_ui(&alg, 11); quat_alg_elem_t a; - ibq_t norm, cmp; - ibz_t num, denom; + ibz_t num, denom, cmp_num, cmp_denom; quat_alg_elem_init(&a); - ibq_init(&norm); - ibq_init(&cmp); ibz_init(&num); ibz_init(&denom); + ibz_init(&cmp_num); + ibz_init(&cmp_denom); - ibz_set(&(alg.p),11); - ibz_set(&(a.coord[0]),1); - ibz_set(&(a.coord[1]),5); - ibz_set(&(a.coord[2]),7); - ibz_set(&(a.coord[3]),2); - ibz_set(&(a.denom),2); - ibz_set(&num,609); - ibz_set(&denom,4); - ibq_set(&cmp,&num,&denom); - quat_alg_norm(&norm,&a,&alg); - res = res || (ibq_cmp(&norm,&cmp)); + ibz_set(&(alg.p), 11); + ibz_set(&(a.coord[0]), 1); + ibz_set(&(a.coord[1]), 5); + ibz_set(&(a.coord[2]), 7); + ibz_set(&(a.coord[3]), 2); + ibz_set(&(a.denom), 2); + ibz_set(&cmp_num, 609); + ibz_set(&cmp_denom, 4); + quat_alg_norm(&num, &denom, &a, &alg); + res = res || (ibz_cmp(&num, &cmp_num)); + res = res || (ibz_cmp(&denom, &cmp_denom)); // same vector, not reduced - ibz_set(&(alg.p),11); - ibz_set(&(a.coord[0]),2); - ibz_set(&(a.coord[1]),10); - ibz_set(&(a.coord[2]),14); - ibz_set(&(a.coord[3]),4); - ibz_set(&(a.denom),4); - ibz_set(&num,609); - ibz_set(&denom,4); - ibq_set(&cmp,&num,&denom); - quat_alg_norm(&norm,&a,&alg); - res = res || (ibq_cmp(&norm,&cmp)); + ibz_set(&(alg.p), 11); + ibz_set(&(a.coord[0]), 2); + ibz_set(&(a.coord[1]), 10); + ibz_set(&(a.coord[2]), 14); + ibz_set(&(a.coord[3]), 4); + ibz_set(&(a.denom), 4); + ibz_set(&cmp_num, 609); + ibz_set(&cmp_denom, 4); + quat_alg_norm(&num, &denom, &a, &alg); + res = res || (ibz_cmp(&num, &cmp_num)); + res = res || (ibz_cmp(&denom, &cmp_denom)); - ibz_set(&(alg.p),11); - ibz_set(&(a.coord[0]),152); - ibz_set(&(a.coord[1]),57); - ibz_set(&(a.coord[2]),190); - ibz_set(&(a.coord[3]),28); - ibz_set(&(a.denom),76); - ibz_set(&num,432077); - ibz_set(&denom,5776); - ibq_set(&cmp,&num,&denom); - quat_alg_norm(&norm,&a,&alg); - res = res || (ibq_cmp(&norm,&cmp)); + ibz_set(&(alg.p), 11); + ibz_set(&(a.coord[0]), 152); + ibz_set(&(a.coord[1]), 57); + ibz_set(&(a.coord[2]), 190); + ibz_set(&(a.coord[3]), 28); + ibz_set(&(a.denom), 76); + ibz_set(&cmp_num, 432077); + ibz_set(&cmp_denom, 5776); + quat_alg_norm(&num, &denom, &a, &alg); + res = res || (ibz_cmp(&num, &cmp_num)); + res = res || (ibz_cmp(&denom, &cmp_denom)); - ibz_set(&(alg.p),11); - ibz_set(&(a.coord[0]),0); - ibz_set(&(a.coord[1]),12); - ibz_set(&(a.coord[2]),35); - ibz_set(&(a.coord[3]),49); - ibz_set(&(a.denom),28); - ibz_set(&num,20015); - ibz_set(&denom,392); - ibq_set(&cmp,&num,&denom); - quat_alg_norm(&norm,&a,&alg); - res = res || (ibq_cmp(&norm,&cmp)); + ibz_set(&(alg.p), 11); + ibz_set(&(a.coord[0]), 0); + ibz_set(&(a.coord[1]), 12); + ibz_set(&(a.coord[2]), 35); + ibz_set(&(a.coord[3]), 49); + ibz_set(&(a.denom), 28); + ibz_set(&cmp_num, 20015); + ibz_set(&cmp_denom, 392); + quat_alg_norm(&num, &denom, &a, &alg); + res = res || (ibz_cmp(&num, &cmp_num)); + res = res || (ibz_cmp(&denom, &cmp_denom)); - ibz_set(&(alg.p),7); - ibz_set(&(a.coord[0]),152); - ibz_set(&(a.coord[1]),57); - ibz_set(&(a.coord[2]),190); - ibz_set(&(a.coord[3]),28); - ibz_set(&(a.denom),76); - ibz_set(&num,284541); - ibz_set(&denom,5776); - ibq_set(&cmp,&num,&denom); - quat_alg_norm(&norm,&a,&alg); - res = res || (ibq_cmp(&norm,&cmp)); + ibz_set(&(alg.p), 7); + ibz_set(&(a.coord[0]), 152); + ibz_set(&(a.coord[1]), 57); + ibz_set(&(a.coord[2]), 190); + ibz_set(&(a.coord[3]), 28); + ibz_set(&(a.denom), 76); + ibz_set(&cmp_num, 284541); + ibz_set(&cmp_denom, 5776); + quat_alg_norm(&num, &denom, &a, &alg); + res = res || (ibz_cmp(&num, &cmp_num)); + res = res || (ibz_cmp(&denom, &cmp_denom)); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_norm failed\n"); } quat_alg_elem_finalize(&a); - ibq_finalize(&norm); - ibq_finalize(&cmp); + ibz_finalize(&cmp_num); + ibz_finalize(&cmp_denom); ibz_finalize(&num); ibz_finalize(&denom); quat_alg_finalize(&alg); - return(res); + return (res); } -//void quat_alg_trace(quat_alg_elem_t *res, const quat_alg_elem_t *a); -int quat_test_alg_trace(){ - int res = 0; - quat_alg_elem_t a; - ibq_t trace, cmp; - ibz_t num, denom; - quat_alg_elem_init(&a); - ibq_init(&trace); - ibq_init(&cmp); - ibz_init(&num); - ibz_init(&denom); - - ibz_set(&(a.coord[0]),152); - ibz_set(&(a.coord[1]),57); - ibz_set(&(a.coord[2]),190); - ibz_set(&(a.coord[3]),28); - ibz_set(&(a.denom),76); - ibz_set(&num,4); - ibz_set(&denom,1); - ibq_set(&cmp,&num,&denom); - quat_alg_trace(&trace,&a); - res = res || (ibq_cmp(&trace,&cmp)); - - ibz_set(&(a.coord[0]),0); - ibz_set(&(a.coord[1]),12); - ibz_set(&(a.coord[2]),35); - ibz_set(&(a.coord[3]),49); - ibz_set(&(a.denom),28); - ibz_set(&num,0); - ibz_set(&denom,1); - ibq_set(&cmp,&num,&denom); - quat_alg_trace(&trace,&a); - res = res || (ibq_cmp(&trace,&cmp)); - - ibz_set(&(a.coord[0]),5); - ibz_set(&(a.coord[1]),0); - ibz_set(&(a.coord[2]),0); - ibz_set(&(a.coord[3]),0); - ibz_set(&(a.denom),2); - ibz_set(&num,10); - ibz_set(&denom,2); - ibq_set(&cmp,&num,&denom); - quat_alg_trace(&trace,&a); - res = res || (ibq_cmp(&trace,&cmp)); - - if (res != 0){ - printf("Quaternion unit test alg_trace failed\n"); - } - quat_alg_elem_finalize(&a); - ibq_finalize(&trace); - ibq_finalize(&cmp); - ibz_finalize(&num); - ibz_finalize(&denom); - return(res); -} - - -//void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator); -int quat_test_alg_scalar(){ +// void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator); +int +quat_test_alg_scalar(void) +{ int res = 0; quat_alg_elem_t elem, cmp; ibz_t denom, num; @@ -695,10 +582,11 @@ int quat_test_alg_scalar(){ ibz_set(&(cmp.coord[2]), 0); ibz_set(&(cmp.coord[3]), 0); ibz_set(&(cmp.denom), 1); - quat_alg_scalar(&elem,&num,&denom); - res = res || ibz_cmp(&(elem.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(elem.coord[i]),&(cmp.coord[i])); + quat_alg_scalar(&elem, &num, &denom); + res = res || ibz_cmp(&(elem.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(elem.coord[i]), &(cmp.coord[i])); } ibz_set(&num, 5); @@ -708,10 +596,11 @@ int quat_test_alg_scalar(){ ibz_set(&(cmp.coord[2]), 0); ibz_set(&(cmp.coord[3]), 0); ibz_set(&(cmp.denom), 9); - quat_alg_scalar(&elem,&num,&denom); - res = res || ibz_cmp(&(elem.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(elem.coord[i]),&(cmp.coord[i])); + quat_alg_scalar(&elem, &num, &denom); + res = res || ibz_cmp(&(elem.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(elem.coord[i]), &(cmp.coord[i])); } ibz_set(&num, -125); @@ -721,23 +610,26 @@ int quat_test_alg_scalar(){ ibz_set(&(cmp.coord[2]), 0); ibz_set(&(cmp.coord[3]), 0); ibz_set(&(cmp.denom), 25); - quat_alg_scalar(&elem,&num,&denom); - res = res || ibz_cmp(&(elem.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(elem.coord[i]),&(cmp.coord[i])); + quat_alg_scalar(&elem, &num, &denom); + res = res || ibz_cmp(&(elem.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(elem.coord[i]), &(cmp.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_scalar failed\n"); } quat_alg_elem_finalize(&elem); quat_alg_elem_finalize(&cmp); ibz_finalize(&num); ibz_finalize(&denom); - return(res); + return (res); } -//void quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x); -int quat_test_alg_conj(){ +// void quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x); +int +quat_test_alg_conj(void) +{ int res = 0; quat_alg_elem_t a, conj, cmp; quat_alg_elem_init(&cmp); @@ -754,10 +646,11 @@ int quat_test_alg_conj(){ ibz_set(&(cmp.coord[2]), 0); ibz_set(&(cmp.coord[3]), -7); ibz_set(&(cmp.denom), 25); - quat_alg_conj(&conj,&a); - res = res || ibz_cmp(&(conj.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(conj.coord[i]),&(cmp.coord[i])); + quat_alg_conj(&conj, &a); + res = res || ibz_cmp(&(conj.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(conj.coord[i]), &(cmp.coord[i])); } ibz_set(&(a.coord[0]), -125); @@ -770,189 +663,122 @@ int quat_test_alg_conj(){ ibz_set(&(cmp.coord[2]), 0); ibz_set(&(cmp.coord[3]), 30); ibz_set(&(cmp.denom), 25); - quat_alg_conj(&conj,&a); - res = res || ibz_cmp(&(conj.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(conj.coord[i]),&(cmp.coord[i])); + quat_alg_conj(&conj, &a); + res = res || ibz_cmp(&(conj.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(conj.coord[i]), &(cmp.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_conj failed\n"); } quat_alg_elem_finalize(&a); quat_alg_elem_finalize(&conj); quat_alg_elem_finalize(&cmp); - return(res); + return (res); } -//void quat_alg_make_primitive(quat_alg_coord_t *primitive_x, ibz_t *content, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg); -int quat_test_alg_make_primitive(){ +// void quat_alg_make_primitive(quat_alg_coord_t *primitive_x, ibz_t *content, const quat_alg_elem_t +// *x, const quat_lattice_t *order, const quat_alg_t *alg); +int +quat_test_alg_make_primitive(void) +{ int res = 0; quat_alg_elem_t x; quat_alg_t alg; - quat_order_t order; - quat_alg_coord_t prim, x_coord_in_order; + quat_lattice_t order; + ibz_vec_4_t prim, x_coord_in_order; ibz_t cmp_cnt, cnt; quat_alg_elem_init(&x); quat_alg_init_set_ui(&alg, 19); - quat_alg_coord_init(&x_coord_in_order); - quat_alg_coord_init(&prim); - quat_order_init(&order); + ibz_vec_4_init(&x_coord_in_order); + ibz_vec_4_init(&prim); + quat_lattice_init(&order); ibz_init(&cmp_cnt); ibz_init(&cnt); - - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(order.basis[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(order.basis[i][j]), 0); } } - ibz_set(&(order.basis[0][0]),1); - ibz_set(&(order.basis[0][3]),-1); - ibz_set(&(order.basis[1][1]),-2); - ibz_set(&(order.basis[2][2]),1); - ibz_set(&(order.basis[2][1]),1); - ibz_set(&(order.basis[3][3]),-3); - ibz_set(&(order.denom),6); + ibz_set(&(order.basis[0][0]), 1); + ibz_set(&(order.basis[0][3]), -1); + ibz_set(&(order.basis[1][1]), -2); + ibz_set(&(order.basis[2][2]), 1); + ibz_set(&(order.basis[2][1]), 1); + ibz_set(&(order.basis[3][3]), -3); + ibz_set(&(order.denom), 6); quat_lattice_hnf(&order); // x=1, should succeed if order - ibz_set(&(x.denom),1); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),0); - ibz_set(&(x.coord[2]),0); - ibz_set(&(x.coord[3]),0); + ibz_set(&(x.denom), 1); + ibz_set(&(x.coord[0]), 1); + ibz_set(&(x.coord[1]), 0); + ibz_set(&(x.coord[2]), 0); + ibz_set(&(x.coord[3]), 0); // is it an order? - res = res || (0==quat_lattice_contains(&prim,&order,&x,&alg)); + res = res || (0 == quat_lattice_contains(&prim, &order, &x)); // actual test - ibz_set(&(x.denom),6); - ibz_set(&(x.coord[0]),2); - ibz_set(&(x.coord[1]),-4); - ibz_set(&(x.coord[2]),26); - ibz_set(&(x.coord[3]),18); + ibz_set(&(x.denom), 6); + ibz_set(&(x.coord[0]), 2); + ibz_set(&(x.coord[1]), -4); + ibz_set(&(x.coord[2]), 26); + ibz_set(&(x.coord[3]), 18); - res = res || (0==quat_lattice_contains(&x_coord_in_order,&order,&x,&alg)); - ibz_content(&cmp_cnt,&x_coord_in_order); - quat_alg_make_primitive(&prim,&cnt,&x,&order,&alg); - res = res || ibz_cmp(&cnt,&cmp_cnt); - ibz_content(&cmp_cnt,&prim); + res = res || (0 == quat_lattice_contains(&x_coord_in_order, &order, &x)); + ibz_vec_4_content(&cmp_cnt, &x_coord_in_order); + quat_alg_make_primitive(&prim, &cnt, &x, &order); + res = res || ibz_cmp(&cnt, &cmp_cnt); + ibz_vec_4_content(&cmp_cnt, &prim); res = res || !ibz_is_one(&cmp_cnt); - //multiply by cnt, and compare to x in order - //assumes contains is correct - for(int i = 0; i < 4; i++){ - ibz_mul(&cmp_cnt,&cnt,&(prim[i])); - res = res || ibz_cmp(&cmp_cnt,&(x_coord_in_order[i])); + // multiply by cnt, and compare to x in order + // assumes contains is correct + for (int i = 0; i < 4; i++) { + ibz_mul(&cmp_cnt, &cnt, &(prim[i])); + res = res || ibz_cmp(&cmp_cnt, &(x_coord_in_order[i])); } - //on a primitive element - ibz_set(&(x.denom),6); - ibz_set(&(x.coord[0]),2); - ibz_set(&(x.coord[1]),-4); - ibz_set(&(x.coord[2]),5); - ibz_set(&(x.coord[3]),18); + // on a primitive element + ibz_set(&(x.denom), 6); + ibz_set(&(x.coord[0]), 2); + ibz_set(&(x.coord[1]), -4); + ibz_set(&(x.coord[2]), 5); + ibz_set(&(x.coord[3]), 18); - res = res || (0==quat_lattice_contains(&x_coord_in_order,&order,&x,&alg)); - ibz_content(&cmp_cnt,&x_coord_in_order); - quat_alg_make_primitive(&prim,&cnt,&x,&order,&alg); - res = res || ibz_cmp(&cnt,&cmp_cnt); - ibz_content(&cmp_cnt,&prim); + res = res || (0 == quat_lattice_contains(&x_coord_in_order, &order, &x)); + ibz_vec_4_content(&cmp_cnt, &x_coord_in_order); + quat_alg_make_primitive(&prim, &cnt, &x, &order); + res = res || ibz_cmp(&cnt, &cmp_cnt); + ibz_vec_4_content(&cmp_cnt, &prim); res = res || !ibz_is_one(&cmp_cnt); // this x is is primitive, so cnt should be 1 res = res || !ibz_is_one(&cnt); - //multiply by cnt, and compare to x in order - //assumes contains is correct - for(int i = 0; i < 4; i++){ - ibz_mul(&cmp_cnt,&cnt,&(prim[i])); - res = res || ibz_cmp(&cmp_cnt,&(x_coord_in_order[i])); + // multiply by cnt, and compare to x in order + // assumes contains is correct + for (int i = 0; i < 4; i++) { + ibz_mul(&cmp_cnt, &cnt, &(prim[i])); + res = res || ibz_cmp(&cmp_cnt, &(x_coord_in_order[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_make_primitive failed\n"); } quat_alg_elem_finalize(&x); quat_alg_finalize(&alg); - quat_alg_coord_finalize(&x_coord_in_order); - quat_alg_coord_finalize(&prim); - quat_order_finalize(&order); + ibz_vec_4_finalize(&x_coord_in_order); + ibz_vec_4_finalize(&prim); + quat_lattice_finalize(&order); ibz_finalize(&cmp_cnt); ibz_finalize(&cnt); - return(res); + return (res); } -//int quat_alg_is_primitive(const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg): -int quat_test_alg_is_primitive(){ - int res = 0; - ibz_t cnt; - quat_alg_elem_t x; - quat_alg_t alg; - quat_order_t order; - quat_alg_coord_t coord; - quat_alg_elem_init(&x); - quat_alg_init_set_ui(&alg, 19); - quat_order_init(&order); - quat_alg_coord_init(&coord); - ibz_init(&cnt); - - - - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(order.basis[i][j]),0); - } - } - ibz_set(&(order.basis[0][0]),1); - ibz_set(&(order.basis[0][3]),-1); - ibz_set(&(order.basis[1][1]),-2); - ibz_set(&(order.basis[2][2]),1); - ibz_set(&(order.basis[2][1]),1); - ibz_set(&(order.basis[3][3]),-3); - ibz_set(&(order.denom),6); - quat_lattice_hnf(&order); - // x=1, should succeed if order - ibz_set(&(x.denom),1); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),0); - ibz_set(&(x.coord[2]),0); - ibz_set(&(x.coord[3]),0); - // is it an order? - res = res || (0==quat_lattice_contains(&coord,&order,&x,&alg)); - - // actual test, this is not primitive - ibz_set(&(x.denom),6); - ibz_set(&(x.coord[0]),2); - ibz_set(&(x.coord[1]),-4); - ibz_set(&(x.coord[2]),26); - ibz_set(&(x.coord[3]),18); - // x not primitive - res = res || (0==quat_lattice_contains(&coord,&order,&x,&alg)); - ibz_content(&cnt,&coord); - res = res || ibz_is_one(&cnt); - res = res || quat_alg_is_primitive(&x,&order,&alg); - - // actual test, this is primitive - ibz_set(&(x.denom),6); - ibz_set(&(x.coord[0]),2); - ibz_set(&(x.coord[1]),-4); - ibz_set(&(x.coord[2]),5); - ibz_set(&(x.coord[3]),18); - // x is primitive - res = res || (0==quat_lattice_contains(&coord,&order,&x,&alg)); - ibz_content(&cnt,&coord); - res = res || !ibz_is_one(&cnt); - res = res || !quat_alg_is_primitive(&x,&order,&alg); - if (res != 0){ - printf("Quaternion unit test alg_is_primitive failed\n"); - } - quat_alg_elem_finalize(&x); - quat_alg_finalize(&alg); - quat_order_finalize(&order); - quat_alg_coord_finalize(&coord); - ibz_finalize(&cnt); - return(res); -} - -//void quat_alg_normalize(quat_alg_elem_t *x); -int quat_test_alg_normalize(){ +// void quat_alg_normalize(quat_alg_elem_t *x); +int +quat_test_alg_normalize(void) +{ int res = 0; quat_alg_elem_t x, cmp; ibz_t gcd; @@ -972,11 +798,12 @@ int quat_test_alg_normalize(){ ibz_set(&(cmp.coord[3]), 30); ibz_set(&(cmp.denom), 25); quat_alg_normalize(&x); - res = res || ibz_cmp(&(x.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(x.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(x.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(x.coord[i]), &(cmp.coord[i])); } - //divide by gcd + // divide by gcd ibz_set(&(x.coord[0]), -36); ibz_set(&(x.coord[1]), 18); ibz_set(&(x.coord[2]), 0); @@ -988,11 +815,12 @@ int quat_test_alg_normalize(){ ibz_set(&(cmp.coord[3]), -50); ibz_set(&(cmp.denom), 8); quat_alg_normalize(&x); - res = res || ibz_cmp(&(x.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(x.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(x.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(x.coord[i]), &(cmp.coord[i])); } - //divide by gcd + // divide by gcd ibz_set(&(x.coord[0]), -36); ibz_set(&(x.coord[1]), 18); ibz_set(&(x.coord[2]), 0); @@ -1004,125 +832,166 @@ int quat_test_alg_normalize(){ ibz_set(&(cmp.coord[3]), 50); ibz_set(&(cmp.denom), 1); quat_alg_normalize(&x); - res = res || ibz_cmp(&(x.denom),&(cmp.denom)); - for (int i = 0; i<4; i++){; - res = res || ibz_cmp(&(x.coord[i]),&(cmp.coord[i])); + res = res || ibz_cmp(&(x.denom), &(cmp.denom)); + for (int i = 0; i < 4; i++) { + ; + res = res || ibz_cmp(&(x.coord[i]), &(cmp.coord[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_normalize failed\n"); } quat_alg_elem_finalize(&x); quat_alg_elem_finalize(&cmp); ibz_finalize(&gcd); - return(res); + return (res); } -//int quat_alg_elem_is_zero(const quat_alg_elem_t *x); -int quat_test_alg_elem_is_zero(){ +// int quat_alg_elem_equal(const quat_alg_elem_t *a, const quat_alg_elem_t *b); +int +quat_test_alg_elem_equal(void) +{ + int res = 0; + quat_alg_elem_t a, b; + quat_alg_elem_init(&a); + quat_alg_elem_init(&b); + ibz_vec_4_set(&(a.coord), 1, -3, -2, 2); + ibz_set(&(a.denom), 5); + ibz_vec_4_set(&(b.coord), 3, -9, -6, 6); + ibz_set(&(b.denom), 15); + res = res || !quat_alg_elem_equal(&a, &b); + res = res || !quat_alg_elem_equal(&a, &a); + res = res || !quat_alg_elem_equal(&b, &b); + ibz_vec_4_set(&(a.coord), 1, -3, -2, 2); + ibz_set(&(a.denom), 5); + ibz_vec_4_set(&(b.coord), 3, -9, -6, 3); + ibz_set(&(b.denom), 15); + res = res || quat_alg_elem_equal(&a, &b); + ibz_vec_4_set(&(a.coord), 5, -15, -10, 10); + ibz_set(&(a.denom), 25); + ibz_vec_4_set(&(b.coord), 3, -9, -6, 6); + ibz_set(&(b.denom), 15); + res = res || !quat_alg_elem_equal(&a, &b); + ibz_vec_4_set(&(a.coord), 5, -15, -10, 10); + ibz_set(&(a.denom), 25); + ibz_vec_4_set(&(b.coord), 0, -9, -6, 6); + ibz_set(&(b.denom), 5); + res = res || quat_alg_elem_equal(&a, &b); + if (res != 0) { + printf("Quaternion unit test alg_elem_equal failed\n"); + } + quat_alg_elem_finalize(&a); + quat_alg_elem_finalize(&b); + return (res); +} + +// int quat_alg_elem_is_zero(const quat_alg_elem_t *x); +int +quat_test_alg_elem_is_zero(void) +{ int res = 0; quat_alg_elem_t x; quat_alg_elem_init(&x); - ibz_set(&(x.denom),1); - ibz_set(&(x.coord[0]),0); - ibz_set(&(x.coord[1]),0); - ibz_set(&(x.coord[2]),0); - ibz_set(&(x.coord[3]),0); - res = res | (1-quat_alg_elem_is_zero(&x)); - ibz_set(&(x.denom),56865); - res = res | (1-quat_alg_elem_is_zero(&x)); - ibz_set(&(x.denom),0); + ibz_set(&(x.denom), 1); + ibz_set(&(x.coord[0]), 0); + ibz_set(&(x.coord[1]), 0); + ibz_set(&(x.coord[2]), 0); + ibz_set(&(x.coord[3]), 0); + res = res | (1 - quat_alg_elem_is_zero(&x)); + ibz_set(&(x.denom), 56865); + res = res | (1 - quat_alg_elem_is_zero(&x)); + ibz_set(&(x.denom), 0); // maybe failure should be accepted here, but according to doc, this is still 0 - res = res | (1-quat_alg_elem_is_zero(&x)); - ibz_set(&(x.coord[3]),1); + res = res | (1 - quat_alg_elem_is_zero(&x)); + ibz_set(&(x.coord[3]), 1); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.denom),56865); + ibz_set(&(x.denom), 56865); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[3]),-1); + ibz_set(&(x.coord[3]), -1); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[2]),1); - ibz_set(&(x.coord[3]),0); + ibz_set(&(x.coord[2]), 1); + ibz_set(&(x.coord[3]), 0); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[2]),-20); + ibz_set(&(x.coord[2]), -20); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[1]),1); - ibz_set(&(x.coord[2]),0); + ibz_set(&(x.coord[1]), 1); + ibz_set(&(x.coord[2]), 0); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[1]),-50000); + ibz_set(&(x.coord[1]), -50000); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),0); + ibz_set(&(x.coord[0]), 1); + ibz_set(&(x.coord[1]), 0); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[0]),-90000); + ibz_set(&(x.coord[0]), -90000); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[0]),0); - ibz_set(&(x.coord[1]),-500); - ibz_set(&(x.coord[2]),20); - ibz_set(&(x.coord[3]),0); + ibz_set(&(x.coord[0]), 0); + ibz_set(&(x.coord[1]), -500); + ibz_set(&(x.coord[2]), 20); + ibz_set(&(x.coord[3]), 0); res = res | quat_alg_elem_is_zero(&x); - ibz_set(&(x.coord[0]),19); - ibz_set(&(x.coord[1]),-500); - ibz_set(&(x.coord[2]),20); - ibz_set(&(x.coord[3]),-2); + ibz_set(&(x.coord[0]), 19); + ibz_set(&(x.coord[1]), -500); + ibz_set(&(x.coord[2]), 20); + ibz_set(&(x.coord[3]), -2); res = res | quat_alg_elem_is_zero(&x); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_elem_is_zero failed\n"); } quat_alg_elem_finalize(&x); - return(res); + return (res); } -//int quat_alg_coord_is_zero(const quat_alg_coord_t *x); -int quat_test_alg_coord_is_zero(){ +// void quat_alg_elem_set(quat_alg_elem_t *elem, int32_t denom, int32_t coord0, int32_t coord1, +// int32_t coord2, int32_t coord3) +int +quat_test_alg_elem_set(void) +{ int res = 0; - quat_alg_coord_t x; - quat_alg_coord_init(&x); - ibz_set(&(x[0]),0); - ibz_set(&(x[1]),0); - ibz_set(&(x[2]),0); - ibz_set(&(x[3]),0); - res = res | (1-quat_alg_coord_is_zero(&x)); - ibz_set(&(x[3]),1); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[3]),-1); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[2]),1); - ibz_set(&(x[3]),0); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[2]),-20); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[1]),1); - ibz_set(&(x[2]),0); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[1]),-50000); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[0]),1); - ibz_set(&(x[1]),0); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[0]),-90000); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[0]),0); - ibz_set(&(x[1]),-500); - ibz_set(&(x[2]),20); - ibz_set(&(x[3]),0); - res = res | quat_alg_coord_is_zero(&x); - ibz_set(&(x[0]),19); - ibz_set(&(x[1]),-500); - ibz_set(&(x[2]),20); - ibz_set(&(x[3]),-2); - res = res | quat_alg_coord_is_zero(&x); - if (res != 0){ - printf("Quaternion unit test alg_coord_is_zero failed\n"); + quat_alg_elem_t elem; + quat_alg_elem_init(&elem); + quat_alg_elem_set(&elem, 5, 1, 2, 3, 4); + res = res || (ibz_cmp_int32(&(elem.coord[0]), 1) != 0); + res = res || (ibz_cmp_int32(&(elem.coord[1]), 2) != 0); + res = res || (ibz_cmp_int32(&(elem.coord[2]), 3) != 0); + res = res || (ibz_cmp_int32(&(elem.coord[3]), 4) != 0); + res = res || (ibz_cmp_int32(&(elem.denom), 5) != 0); + + if (res != 0) { + printf("Quaternion unit test alg_elem_set failed\n"); } - quat_alg_coord_finalize(&x); - return(res); + quat_alg_elem_finalize(&elem); + return (res); } - -//void quat_alg_elem_set(quat_alg_elem_t *elem, const ibz_t *denom, const ibz_t *coord0,const ibz_t *coord1,const ibz_t *coord2,const ibz_t *coord3){ -int quat_test_alg_elem_copy_ibz(){ +// void quat_alg_elem_copy(quat_alg_elem_t *copy, const quat_alg_elem_t *copied); +int +quat_test_alg_elem_copy() +{ int res = 0; - ibz_t a,b,c,d,q; + quat_alg_elem_t elem, copy; + quat_alg_elem_init(&elem); + quat_alg_elem_init(©); + quat_alg_elem_set(&elem, 7, -2, 9, 2091, 21); + quat_alg_elem_copy(©, &elem); + res = res || !quat_alg_elem_equal(&elem, ©); + quat_alg_elem_set(&elem, 3, -6, 9, 2091, 21); + quat_alg_elem_copy(©, &elem); + res = res || !quat_alg_elem_equal(&elem, ©); + if (res) { + printf("Quaternion unit test alg_elem_copy failed\n"); + } + quat_alg_elem_finalize(&elem); + quat_alg_elem_finalize(©); + return (res); +} + +// void quat_alg_elem_copy_ibz(quat_alg_elem_t *elem, const ibz_t *denom, const ibz_t *coord0,const +// ibz_t *coord1,const ibz_t *coord2,const ibz_t *coord3){ +int +quat_test_alg_elem_copy_ibz(void) +{ + int res = 0; + ibz_t a, b, c, d, q; quat_alg_elem_t elem; quat_alg_elem_init(&elem); ibz_init(&a); @@ -1130,19 +999,19 @@ int quat_test_alg_elem_copy_ibz(){ ibz_init(&c); ibz_init(&d); ibz_init(&q); - ibz_set(&a,1); - ibz_set(&b,2); - ibz_set(&c,3); - ibz_set(&d,4); - ibz_set(&q,5); - quat_alg_elem_copy_ibz(&elem,&q,&a,&b,&c,&d); - res = res || ibz_cmp(&(elem.coord[0]),&a); - res = res || ibz_cmp(&(elem.coord[1]),&b); - res = res || ibz_cmp(&(elem.coord[2]),&c); - res = res || ibz_cmp(&(elem.coord[3]),&d); - res = res || ibz_cmp(&(elem.denom),&q); + ibz_set(&a, 1); + ibz_set(&b, 2); + ibz_set(&c, 3); + ibz_set(&d, 4); + ibz_set(&q, 5); + quat_alg_elem_copy_ibz(&elem, &q, &a, &b, &c, &d); + res = res || ibz_cmp(&(elem.coord[0]), &a); + res = res || ibz_cmp(&(elem.coord[1]), &b); + res = res || ibz_cmp(&(elem.coord[2]), &c); + res = res || ibz_cmp(&(elem.coord[3]), &d); + res = res || ibz_cmp(&(elem.denom), &q); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test alg_elem_copy_ibz failed\n"); } ibz_finalize(&a); @@ -1151,31 +1020,14 @@ int quat_test_alg_elem_copy_ibz(){ ibz_finalize(&d); ibz_finalize(&q); quat_alg_elem_finalize(&elem); - return(res); + return (res); } - -//void quat_alg_elem_set(quat_alg_elem_t *elem, int64_t denom, int64_t coord0, int64_t coord1, int64_t coord2, int64_t coord3) -int quat_test_alg_elem_set(){ - int res = 0; - quat_alg_elem_t elem; - quat_alg_elem_init(&elem); - quat_alg_elem_set(&elem,5,1,2,3,4); - res = res || (ibz_get(&(elem.coord[0])) != 1); - res = res || (ibz_get(&(elem.coord[1])) != 2); - res = res || (ibz_get(&(elem.coord[2])) != 3); - res = res || (ibz_get(&(elem.coord[3])) != 4); - res = res || (ibz_get(&(elem.denom)) != 5); - - if (res != 0){ - printf("Quaternion unit test alg_elem_set failed\n"); - } - quat_alg_elem_finalize(&elem); - return(res); -} - -//void quat_alg_elem_mul_by_scalar(quat_alg_elem_t *res, const ibz_t *scalar, const quat_alg_elem_t *elem); -int quat_test_alg_elem_mul_by_scalar(){ +// void quat_alg_elem_mul_by_scalar(quat_alg_elem_t *res, const ibz_t *scalar, const quat_alg_elem_t +// *elem); +int +quat_test_alg_elem_mul_by_scalar(void) +{ int res = 0; ibz_t scalar; quat_alg_elem_t elem, cmp, prod; @@ -1184,109 +1036,73 @@ int quat_test_alg_elem_mul_by_scalar(){ quat_alg_elem_init(&prod); quat_alg_elem_init(&cmp); - ibz_set(&scalar,6); - ibz_set(&(elem.denom),2); - ibz_set(&(elem.coord[0]),2); - ibz_set(&(elem.coord[1]),-4); - ibz_set(&(elem.coord[2]),5); - ibz_set(&(elem.coord[3]),25); - ibz_set(&(cmp.denom),2); - ibz_set(&(cmp.coord[0]),12); - ibz_set(&(cmp.coord[1]),-24); - ibz_set(&(cmp.coord[2]),30); - ibz_set(&(cmp.coord[3]),150); - - quat_alg_elem_mul_by_scalar(&prod,&scalar,&elem); - res = res || ibz_cmp(&(prod.coord[0]),&(cmp.coord[0])); - res = res || ibz_cmp(&(prod.coord[1]),&(cmp.coord[1])); - res = res || ibz_cmp(&(prod.coord[2]),&(cmp.coord[2])); - res = res || ibz_cmp(&(prod.coord[3]),&(cmp.coord[3])); - res = res || ibz_cmp(&(prod.denom),&(cmp.denom)); + ibz_set(&scalar, 6); + ibz_set(&(elem.denom), 2); + ibz_set(&(elem.coord[0]), 2); + ibz_set(&(elem.coord[1]), -4); + ibz_set(&(elem.coord[2]), 5); + ibz_set(&(elem.coord[3]), 25); + ibz_set(&(cmp.denom), 2); + ibz_set(&(cmp.coord[0]), 12); + ibz_set(&(cmp.coord[1]), -24); + ibz_set(&(cmp.coord[2]), 30); + ibz_set(&(cmp.coord[3]), 150); + + quat_alg_elem_mul_by_scalar(&prod, &scalar, &elem); + res = res || ibz_cmp(&(prod.coord[0]), &(cmp.coord[0])); + res = res || ibz_cmp(&(prod.coord[1]), &(cmp.coord[1])); + res = res || ibz_cmp(&(prod.coord[2]), &(cmp.coord[2])); + res = res || ibz_cmp(&(prod.coord[3]), &(cmp.coord[3])); + res = res || ibz_cmp(&(prod.denom), &(cmp.denom)); // denom should not be modified - res = res || ibz_cmp(&(prod.denom),&(elem.denom)); + res = res || ibz_cmp(&(prod.denom), &(elem.denom)); - ibz_set(&scalar,-3); - ibz_set(&(cmp.denom),2); - ibz_set(&(cmp.coord[0]),-6); - ibz_set(&(cmp.coord[1]),12); - ibz_set(&(cmp.coord[2]),-15); - ibz_set(&(cmp.coord[3]),-75); - - quat_alg_elem_mul_by_scalar(&prod,&scalar,&elem); - res = res || ibz_cmp(&(prod.coord[0]),&(cmp.coord[0])); - res = res || ibz_cmp(&(prod.coord[1]),&(cmp.coord[1])); - res = res || ibz_cmp(&(prod.coord[2]),&(cmp.coord[2])); - res = res || ibz_cmp(&(prod.coord[3]),&(cmp.coord[3])); - res = res || ibz_cmp(&(prod.denom),&(cmp.denom)); + ibz_set(&scalar, -3); + ibz_set(&(cmp.denom), 2); + ibz_set(&(cmp.coord[0]), -6); + ibz_set(&(cmp.coord[1]), 12); + ibz_set(&(cmp.coord[2]), -15); + ibz_set(&(cmp.coord[3]), -75); - if (res != 0){ + quat_alg_elem_mul_by_scalar(&prod, &scalar, &elem); + res = res || ibz_cmp(&(prod.coord[0]), &(cmp.coord[0])); + res = res || ibz_cmp(&(prod.coord[1]), &(cmp.coord[1])); + res = res || ibz_cmp(&(prod.coord[2]), &(cmp.coord[2])); + res = res || ibz_cmp(&(prod.coord[3]), &(cmp.coord[3])); + res = res || ibz_cmp(&(prod.denom), &(cmp.denom)); + + if (res != 0) { printf("Quaternion unit test alg_elem_mul_by_scalar failed\n"); } ibz_finalize(&scalar); quat_alg_elem_finalize(&elem); quat_alg_elem_finalize(&prod); quat_alg_elem_finalize(&cmp); - return(res); -} - - -//void quat_alg_rightmul_mat(ibz_mat_4x4_t *mulmat, const quat_alg_elem_t *a, const quat_alg_t *alg); -int quat_test_alg_rightmul_mat(){ - int res = 0; - ibz_mat_4x4_t mat; - quat_alg_t alg; - quat_alg_elem_t elem, prod, test, prodmat; - quat_alg_init_set_ui(&alg,19); - ibz_mat_4x4_init(&mat); - quat_alg_elem_init(&prod); - quat_alg_elem_init(&prodmat); - quat_alg_elem_init(&test); - quat_alg_elem_init(&elem); - - quat_alg_elem_set(&elem, 2,4,2,6,8); - quat_alg_elem_set(&elem, 12,9,81,27,-6); - quat_alg_rightmul_mat(&mat,&elem,&alg); - ibz_mat_4x4_eval(&(prodmat.coord),&mat,&(test.coord)); - ibz_mul(&(prodmat.denom),&(test.denom),&(elem.denom)); - quat_alg_mul(&prod,&test,&elem,&alg); - quat_alg_sub(&test,&prod,&prod); - res = res || !quat_alg_elem_is_zero(&test); - - if (res != 0){ - printf("Quaternion unit test alg_rightmul_mat failed\n"); - } - ibz_mat_4x4_finalize(&mat); - quat_alg_elem_finalize(&prod); - quat_alg_elem_finalize(&prodmat); - quat_alg_elem_finalize(&test); - quat_alg_elem_finalize(&elem); - quat_alg_finalize(&alg); - return(res); + return (res); } // run all previous tests -int quat_test_algebra(){ +int +quat_test_algebra(void) +{ int res = 0; printf("\nRunning quaternion tests of algebra operations\n"); res = res | quat_test_init_set_ui(); - res = res | quat_test_alg_coord_add(); - res = res | quat_test_alg_coord_sub(); + res = res | quat_test_alg_coord_mul(); res = res | quat_test_alg_equal_denom(); res = res | quat_test_alg_add(); res = res | quat_test_alg_sub(); res = res | quat_test_alg_mul(); res = res | quat_test_alg_norm(); - res = res | quat_test_alg_trace(); res = res | quat_test_alg_scalar(); res = res | quat_test_alg_conj(); res = res | quat_test_alg_make_primitive(); - res = res | quat_test_alg_is_primitive(); res = res | quat_test_alg_normalize(); + res = res | quat_test_alg_elem_equal(); res = res | quat_test_alg_elem_is_zero(); - res = res | quat_test_alg_coord_is_zero(); - res = res | quat_test_alg_elem_copy_ibz(); res = res | quat_test_alg_elem_set(); + res = res | quat_test_alg_elem_copy_ibz(); + res = res | quat_test_alg_elem_copy(); res = res | quat_test_alg_elem_mul_by_scalar(); - res = res | quat_test_alg_rightmul_mat(); - return(res); + return (res); } diff --git a/src/quaternion/ref/generic/test/dim2.c b/src/quaternion/ref/generic/test/dim2.c index be3d64f..16d5efc 100644 --- a/src/quaternion/ref/generic/test/dim2.c +++ b/src/quaternion/ref/generic/test/dim2.c @@ -1,16 +1,16 @@ #include "quaternion_tests.h" // void ibz_vec_2_set(ibz_vec_2_t *vec, int a0, int a1); -int quat_test_dim2_ibz_vec_2_set() +int +quat_test_dim2_ibz_vec_2_set(void) { int res = 0; ibz_vec_2_t vec; ibz_vec_2_init(&vec); ibz_vec_2_set(&vec, 2, 5); - res = res || !(ibz_get(&(vec[0])) == 2); - res = res || !(ibz_get(&(vec[1])) == 5); - if (res != 0) - { + res = res || (ibz_cmp_int32(&(vec[0]), 2) != 0); + res = res || (ibz_cmp_int32(&(vec[1]), 5) != 0); + if (res != 0) { printf("Quaternion unit test dim2_ibz_vec_2_set failed\n"); } ibz_vec_2_finalize(&vec); @@ -18,66 +18,105 @@ int quat_test_dim2_ibz_vec_2_set() } // void ibz_mat_2x2_set(ibz_mat_2x2_t *mat, int a00, int a01, int a10, int a11); -int quat_test_dim2_ibz_mat_2x2_set() +int +quat_test_dim2_ibz_mat_2x2_set(void) { int res = 0; ibz_mat_2x2_t mat; ibz_mat_2x2_init(&mat); ibz_mat_2x2_set(&mat, 2, 7, -1, 5); - res = res || !(ibz_get(&(mat[0][0])) == 2); - res = res || !(ibz_get(&(mat[0][1])) == 7); - res = res || !(ibz_get(&(mat[1][0])) == -1); - res = res || !(ibz_get(&(mat[1][1])) == 5); - if (res != 0) - { + res = res || (ibz_cmp_int32(&(mat[0][0]), 2) != 0); + res = res || (ibz_cmp_int32(&(mat[0][1]), 7) != 0); + res = res || (ibz_cmp_int32(&(mat[1][0]), -1) != 0); + res = res || (ibz_cmp_int32(&(mat[1][1]), 5) != 0); + if (res != 0) { printf("Quaternion unit test dim2_ibz_mat_2x2_set failed\n"); } ibz_mat_2x2_finalize(&mat); return (res); } -//void ibz_mat_2x2_det_from_ibz(ibz_t *det, const ibz_t *a11, const ibz_t *a12, const ibz_t *a21, const ibz_t *a22); -int quat_test_dim2_ibz_mat_2x2_det_from_ibz(){ +// void ibz_mat_2x2_copy(ibz_vec_2_t *copy, const ibz_mat_2x2_t *copied); +int +quat_test_dim2_ibz_mat_2x2_copy(void) +{ int res = 0; - ibz_t det,cmp,a11,a12,a21,a22; + ibz_mat_2x2_t mat, copy; + ibz_mat_2x2_init(&mat); + ibz_mat_2x2_init(©); + + ibz_mat_2x2_set(&mat, 1, -1, 2, 4); + res = res || (0 == ibz_cmp_int32(&(copy[0][0]), 1)); + res = res || (0 == ibz_cmp_int32(&(copy[0][1]), -1)); + res = res || (0 == ibz_cmp_int32(&(copy[1][0]), 2)); + res = res || (0 == ibz_cmp_int32(&(copy[1][1]), 4)); + res = res || (0 != ibz_cmp_int32(&(mat[0][0]), 1)); + res = res || (0 != ibz_cmp_int32(&(mat[0][1]), -1)); + res = res || (0 != ibz_cmp_int32(&(mat[1][0]), 2)); + res = res || (0 != ibz_cmp_int32(&(mat[1][1]), 4)); + ibz_mat_2x2_copy(©, &mat); + res = res || (0 != ibz_cmp_int32(&(copy[0][0]), 1)); + res = res || (0 != ibz_cmp_int32(&(copy[0][1]), -1)); + res = res || (0 != ibz_cmp_int32(&(copy[1][0]), 2)); + res = res || (0 != ibz_cmp_int32(&(copy[1][1]), 4)); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + res = res || (0 != ibz_cmp(&(mat[i][j]), &(copy[i][j]))); + } + } + + if (res != 0) { + printf("Quaternion unit test dim2_ibz_mat_2x2_copy failed\n"); + } + ibz_mat_2x2_finalize(&mat); + ibz_mat_2x2_finalize(©); + return (res); +} + +// void ibz_mat_2x2_det_from_ibz(ibz_t *det, const ibz_t *a11, const ibz_t *a12, const ibz_t *a21, +// const ibz_t *a22); +int +quat_test_dim2_ibz_mat_2x2_det_from_ibz(void) +{ + int res = 0; + ibz_t det, cmp, a11, a12, a21, a22; ibz_init(&a11); ibz_init(&a12); ibz_init(&a21); ibz_init(&a22); ibz_init(&det); ibz_init(&cmp); - - ibz_set(&a11,1); - ibz_set(&a12,0); - ibz_set(&a21,0); - ibz_set(&a22,1); - ibz_set(&cmp,1); - ibz_mat_2x2_det_from_ibz(&det,&a11,&a12,&a21,&a22); - res = res || ibz_cmp(&cmp,&det); - ibz_set(&a11,2); - ibz_set(&a12,3); - ibz_set(&a21,1); - ibz_set(&a22,-2); - ibz_set(&cmp,-7); - ibz_mat_2x2_det_from_ibz(&det,&a11,&a12,&a21,&a22); - res = res || ibz_cmp(&cmp,&det); + ibz_set(&a11, 1); + ibz_set(&a12, 0); + ibz_set(&a21, 0); + ibz_set(&a22, 1); + ibz_set(&cmp, 1); + ibz_mat_2x2_det_from_ibz(&det, &a11, &a12, &a21, &a22); + res = res || ibz_cmp(&cmp, &det); - ibz_set(&a11,0); - ibz_set(&a12,3); - ibz_set(&a21,-1); - ibz_set(&a22,0); - ibz_set(&cmp,3); - ibz_mat_2x2_det_from_ibz(&det,&a11,&a12,&a21,&a22); - res = res || ibz_cmp(&cmp,&det); + ibz_set(&a11, 2); + ibz_set(&a12, 3); + ibz_set(&a21, 1); + ibz_set(&a22, -2); + ibz_set(&cmp, -7); + ibz_mat_2x2_det_from_ibz(&det, &a11, &a12, &a21, &a22); + res = res || ibz_cmp(&cmp, &det); - ibz_set(&a11,2); - ibz_set(&cmp,0); - ibz_mat_2x2_det_from_ibz(&a11,&a11,&a11,&a11,&a11); - res = res || ibz_cmp(&cmp,&a11); + ibz_set(&a11, 0); + ibz_set(&a12, 3); + ibz_set(&a21, -1); + ibz_set(&a22, 0); + ibz_set(&cmp, 3); + ibz_mat_2x2_det_from_ibz(&det, &a11, &a12, &a21, &a22); + res = res || ibz_cmp(&cmp, &det); + ibz_set(&a11, 2); + ibz_set(&cmp, 0); + ibz_mat_2x2_det_from_ibz(&a11, &a11, &a11, &a11, &a11); + res = res || ibz_cmp(&cmp, &a11); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim2_ibz_mat_2x2_det_from_ibz failed\n"); } ibz_finalize(&a11); @@ -90,7 +129,8 @@ int quat_test_dim2_ibz_mat_2x2_det_from_ibz(){ } // void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec); -int quat_test_dim2_ibz_mat_2x2_eval() +int +quat_test_dim2_ibz_mat_2x2_eval(void) { int res = 0; ibz_vec_2_t vec, ret, cmp; @@ -114,8 +154,7 @@ int quat_test_dim2_ibz_mat_2x2_eval() res = res || ibz_cmp(&(vec[0]), &(cmp[0])); res = res || ibz_cmp(&(vec[1]), &(cmp[1])); - if (res != 0) - { + if (res != 0) { printf("Quaternion unit test dim2_ibz_mat_2x2_eval failed\n"); } ibz_vec_2_finalize(&vec); @@ -127,8 +166,10 @@ int quat_test_dim2_ibz_mat_2x2_eval() // modular 2x2 operations -// void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, const ibz_t *m); -int quat_test_dim2_ibz_mat_2x2_mul_mod() +// void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, +// const ibz_t *m); +int +quat_test_dim2_ibz_mat_2x2_mul_mod(void) { int res = 0; ibz_t m; @@ -164,8 +205,7 @@ int quat_test_dim2_ibz_mat_2x2_mul_mod() res = res || ibz_cmp(&(a[1][0]), &(cmp[1][0])); res = res || ibz_cmp(&(a[1][1]), &(cmp[1][1])); - if (res != 0) - { + if (res != 0) { printf("Quaternion unit test dim2_ibz_mat_2x2_mul_mod failed\n"); } ibz_mat_2x2_finalize(&a); @@ -176,8 +216,9 @@ int quat_test_dim2_ibz_mat_2x2_mul_mod() return (res); } -// int ibz_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); -int quat_test_dim2_ibz_mat_2x2_inv_mod() +// int ibz_mat_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); +int +quat_test_dim2_ibz_mat_2x2_inv_mod(void) { int res = 0; ibz_t m; @@ -192,48 +233,41 @@ int quat_test_dim2_ibz_mat_2x2_inv_mod() // inverse exists ibz_set(&m, 7); ibz_mat_2x2_set(&a, 2, -3, 1, 3); - if (ibz_2x2_inv_mod(&inv, &a, &m)) - { + if (ibz_mat_2x2_inv_mod(&inv, &a, &m)) { // ibz_2x2_mul_mod(&prod,&a,&inv, &m); ibz_2x2_mul_mod(&prod, &inv, &a, &m); res = res || ibz_cmp(&(prod[0][0]), &(id[0][0])); res = res || ibz_cmp(&(prod[0][1]), &(id[0][1])); res = res || ibz_cmp(&(prod[1][0]), &(id[1][0])); res = res || ibz_cmp(&(prod[1][1]), &(id[1][1])); - } - else - { + } else { res = 1; } ibz_set(&m, 12); ibz_mat_2x2_set(&a, 2, 7, 1, -2); ibz_mat_2x2_set(&inv, 2, 7, 1, -2); - if (ibz_2x2_inv_mod(&inv, &inv, &m)) - { + if (ibz_mat_2x2_inv_mod(&inv, &inv, &m)) { ibz_2x2_mul_mod(&prod, &a, &inv, &m); res = res || ibz_cmp(&(prod[0][0]), &(id[0][0])); res = res || ibz_cmp(&(prod[0][1]), &(id[0][1])); res = res || ibz_cmp(&(prod[1][0]), &(id[1][0])); res = res || ibz_cmp(&(prod[1][1]), &(id[1][1])); - } - else - { + } else { res = 1; } // no inverse ibz_set(&m, 25); ibz_mat_2x2_set(&a, 2, -2, -1, 1); - res = res || ibz_2x2_inv_mod(&inv, &a, &m); + res = res || ibz_mat_2x2_inv_mod(&inv, &a, &m); ibz_set(&m, 7); ibz_mat_2x2_set(&a, 2, 3, 1, -2); - res = res || ibz_2x2_inv_mod(&inv, &a, &m); + res = res || ibz_mat_2x2_inv_mod(&inv, &a, &m); ibz_set(&m, 25); ibz_mat_2x2_set(&a, 2, 1, 1, -2); - res = res || ibz_2x2_inv_mod(&inv, &a, &m); + res = res || ibz_mat_2x2_inv_mod(&inv, &a, &m); - if (res != 0) - { + if (res != 0) { printf("Quaternion unit test dim2_ibz_mat_2x2_inv_mod failed\n"); } ibz_mat_2x2_finalize(&a); @@ -244,944 +278,19 @@ int quat_test_dim2_ibz_mat_2x2_inv_mod() return (res); } - -// cvp helper functions - -// int quat_dim2_lattice_contains(ibz_mat_2x2_t *basis, ibz_t *coord1, ibz_t *coord2); -int quat_test_dim2_lattice_contains() -{ - int res = 0; - ibz_mat_2x2_t basis; - ibz_t c1, c2; - ibz_mat_2x2_init(&basis); - ibz_init(&c1); - ibz_init(&c2); - ibz_mat_2x2_set(&basis, -1, 2, 5, 0); - ibz_set(&c1, 0); - ibz_set(&c2, 0); - res = res || !quat_dim2_lattice_contains(&basis, &c1, &c2); - ibz_set(&c1, 1); - ibz_set(&c2, 5); - res = res || !quat_dim2_lattice_contains(&basis, &c1, &c2); - ibz_set(&c1, 1); - ibz_set(&c2, 4); - res = res || quat_dim2_lattice_contains(&basis, &c1, &c2); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_contains failed\n"); - } - ibz_mat_2x2_finalize(&basis); - ibz_finalize(&c1); - ibz_finalize(&c2); - return (res); -} - -// void quat_dim2_lattice_norm(ibz_t *norm, const ibz_t *coord1, const ibz_t *coord2, const ibz_t *norm_q) -int quat_test_dim2_lattice_norm() -{ - int res = 0; - ibz_t norm, cmp, q, a, b; - ibz_init(&a); - ibz_init(&b); - ibz_init(&q); - ibz_init(&norm); - ibz_init(&cmp); - ibz_set(&a, 1); - ibz_set(&b, 2); - ibz_set(&q, 3); - ibz_set(&cmp, 1 * 1 + 3 * 2 * 2); - quat_dim2_lattice_norm(&norm, &a, &b, &q); - res = res || ibz_cmp(&norm, &cmp); - ibz_set(&a, 7); - ibz_set(&b, -2); - ibz_set(&q, 5); - ibz_set(&cmp, 7 * 7 + 5 * 2 * 2); - quat_dim2_lattice_norm(&norm, &a, &b, &q); - res = res || ibz_cmp(&norm, &cmp); - ibz_set(&cmp, 7 * 7 + 7 * 7 * 7); - quat_dim2_lattice_norm(&a, &a, &a, &a); - res = res || ibz_cmp(&a, &cmp); - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_norm failed\n"); - } - ibz_finalize(&a); - ibz_finalize(&b); - ibz_finalize(&q); - ibz_finalize(&norm); - ibz_finalize(&cmp); - return (res); -} - -// void quat_dim2_lattice_bilinear(ibz_t *res, const ibz_t *v11, const ibz_t *v12,const ibz_t *v21, const ibz_t *v22, const ibz_t *norm_q); -int quat_test_dim2_lattice_bilinear() -{ - int res = 0; - ibz_t prod, cmp, q, a, b, c, d; - ibz_init(&a); - ibz_init(&b); - ibz_init(&c); - ibz_init(&d); - ibz_init(&q); - ibz_init(&prod); - ibz_init(&cmp); - ibz_set(&a, 1); - ibz_set(&b, 2); - ibz_set(&c, 3); - ibz_set(&d, 4); - ibz_set(&q, 3); - ibz_set(&cmp, 1 * 3 + 3 * 2 * 4); - quat_dim2_lattice_bilinear(&prod, &a, &b, &c, &d, &q); - res = res || ibz_cmp(&prod, &cmp); - ibz_set(&a, 7); - ibz_set(&b, -2); - ibz_set(&c, 4); - ibz_set(&d, 7); - ibz_set(&q, 5); - ibz_set(&cmp, 7 * 4 - 5 * 2 * 7); - quat_dim2_lattice_bilinear(&prod, &a, &b, &c, &d, &q); - res = res || ibz_cmp(&prod, &cmp); - ibz_set(&cmp, 7 * 7 + 7 * 7 * 7); - quat_dim2_lattice_bilinear(&a, &a, &a, &a, &a, &a); - res = res || ibz_cmp(&a, &cmp); - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_bilinear failed\n"); - } - ibz_finalize(&a); - ibz_finalize(&b); - ibz_finalize(&c); - ibz_finalize(&d); - ibz_finalize(&q); - ibz_finalize(&prod); - ibz_finalize(&cmp); - return (res); -} - -// according to conditions from https://cseweb.ucsd.edu/classes/wi12/cse206A-a/lec3.pdf -int quat_dim2_lattice_verify_lll(const ibz_mat_2x2_t *mat, const ibz_t *norm_q){ - ibz_t prod, norm_a, norm_bstar, norm_b, b_ab, b_abstar, b_bbstar,p01_denom,p00_denom, norm_p00,norm_p01; - ibz_vec_2_t p00,p01,bstar; - ibz_vec_2_init(&p00); - ibz_vec_2_init(&p01); - ibz_vec_2_init(&bstar); - ibz_init(&prod); - ibz_init(&norm_a); - ibz_init(&norm_bstar); - ibz_init(&norm_b); - ibz_init(&b_ab); - ibz_init(&b_bbstar); - ibz_init(&b_abstar); - ibz_init(&p00_denom); - ibz_init(&p01_denom); - ibz_init(&norm_p00); - ibz_init(&norm_p01); - quat_dim2_lattice_norm(&norm_a,&((*mat)[0][0]),&((*mat)[1][0]),norm_q); - quat_dim2_lattice_norm(&norm_b,&((*mat)[0][1]),&((*mat)[1][1]),norm_q); - quat_dim2_lattice_bilinear(&b_ab,&((*mat)[0][0]),&((*mat)[1][0]),&((*mat)[0][1]),&((*mat)[1][1]),norm_q); - ibz_mul(&(bstar[0]),&((*mat)[0][1]),&norm_b); - ibz_mul(&prod,&((*mat)[0][0]),&b_ab); - ibz_sub(&(bstar[0]),&(bstar[0]),&prod); - ibz_mul(&(bstar[1]),&((*mat)[1][1]),&norm_b); - ibz_mul(&prod,&((*mat)[1][0]),&b_ab); - ibz_sub(&(bstar[1]),&(bstar[1]),&prod); - quat_dim2_lattice_norm(&norm_bstar,&(bstar[0]),&(bstar[1]),norm_q); - quat_dim2_lattice_bilinear(&b_bbstar,&(bstar[0]),&(bstar[1]),&((*mat)[0][1]),&((*mat)[1][1]),norm_q); - quat_dim2_lattice_bilinear(&b_abstar,&((*mat)[0][0]),&((*mat)[1][0]),&(bstar[0]),&(bstar[1]),norm_q); - // first projection - ibz_mul(&(p00[0]),&((*mat)[0][0]),&norm_bstar); - ibz_mul(&prod,&(bstar[0]),&b_abstar); - ibz_add(&(p00[0]),&(p00[0]),&prod); - ibz_mul(&(p00[1]),&((*mat)[1][0]),&norm_bstar); - ibz_mul(&prod,&(bstar[1]),&b_abstar); - ibz_add(&(p00[1]),&(p00[1]),&prod); - ibz_copy(&p00_denom,&norm_bstar); - // second projection - ibz_mul(&(p01[0]),&((*mat)[0][0]),&b_ab); - ibz_mul(&(p01[0]),&(p01[0]),&norm_bstar); - ibz_mul(&prod,&(bstar[0]),&b_bbstar); - ibz_mul(&prod,&prod,&norm_a); - ibz_add(&(p01[0]),&(p01[0]),&prod); - ibz_mul(&(p01[1]),&((*mat)[1][0]),&b_ab); - ibz_mul(&(p01[1]),&(p01[1]),&norm_bstar); - ibz_mul(&prod,&(bstar[1]),&b_bbstar); - ibz_mul(&prod,&prod,&norm_a); - ibz_add(&(p01[1]),&(p01[1]),&prod); - ibz_mul(&p01_denom,&norm_a,&norm_bstar); - // compute norms - quat_dim2_lattice_norm(&norm_p00,&(p00[0]),&(p00[1]),norm_q); - quat_dim2_lattice_norm(&norm_p01,&(p01[0]),&(p01[1]),norm_q); - // compare on same denom - ibz_mul(&norm_p00,&norm_p00,&norm_a); - ibz_mul(&norm_p00,&norm_p00,&norm_a); - ibz_mul(&p00_denom,&p00_denom,&norm_a); - int res = (ibz_cmp(&norm_p00,&norm_p01)<=0); - // also check 2times bilinear against norm - ibz_set(&prod,2); - ibz_mul(&prod,&b_ab,&prod); - res = res && (ibz_cmp(&prod,&norm_a)< 0); - - ibz_finalize(&prod); - ibz_finalize(&norm_a); - ibz_finalize(&norm_bstar); - ibz_finalize(&norm_b); - ibz_finalize(&norm_p00); - ibz_finalize(&norm_p01); - ibz_finalize(&b_ab); - ibz_finalize(&b_abstar); - ibz_finalize(&b_bbstar); - ibz_finalize(&p00_denom); - ibz_finalize(&p01_denom); - ibz_vec_2_finalize(&p00); - ibz_vec_2_finalize(&p01); - ibz_vec_2_finalize(&bstar); - return(res); -} - -// void quat_dim2_lattice_short_basis(ibz_mat_2x2_t *reduced, const ibz_mat_2x2_t *basis, const ibz_t *norm_q); -int quat_test_dim2_lattice_short_basis() -{ - int res = 0; - ibz_mat_2x2_t basis, cmp, red; - ibz_t prod, sum, norm_q, bound; - ibz_init(&prod); - ibz_init(&sum); - ibz_init(&norm_q); - ibz_init(&bound); - ibz_mat_2x2_init(&basis); - ibz_mat_2x2_init(&cmp); - ibz_mat_2x2_init(&red); - // first test - ibz_mat_2x2_set(&basis, 3, 5, 7, 9); - ibz_set(&norm_q, 2); - quat_dim2_lattice_short_basis(&red, &basis, &norm_q); - // check second basis vector larger (or at least equal) than 1st - res = res || (ibz_cmp(&sum, &prod) > 0); - // check mutual inclusion of lattices - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][0]), &(basis[1][0]))); - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][1]), &(basis[1][1]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][0]), &(red[1][0]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][1]), &(red[1][1]))); - // check bilinear form value is small - ibz_set(&bound, 12); - quat_dim2_lattice_bilinear(&sum, &(red[0][0]), &(red[0][1]), &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - // check norm smaller than original - ibz_set(&bound, 12); - quat_dim2_lattice_norm(&sum, &(red[0][0]), &(red[1][0]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - quat_dim2_lattice_norm(&prod, &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&prod, &bound) > 0); - // check lll - res = res || !quat_dim2_lattice_verify_lll(&red,&norm_q); - - // second test - ibz_mat_2x2_set(&basis, 48, 4, 81, 9); - ibz_set(&norm_q, 9); - quat_dim2_lattice_short_basis(&red, &basis, &norm_q); - // check second basis vector larger (or at least equal) than 1st - res = res || (ibz_cmp(&sum, &prod) > 0); - // check mutual inclusion of lattices - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][0]), &(basis[1][0]))); - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][1]), &(basis[1][1]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][0]), &(red[1][0]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][1]), &(red[1][1]))); - // check bilinear form value is small - ibz_set(&bound, 50 * 100); - quat_dim2_lattice_bilinear(&sum, &(red[0][0]), &(red[0][1]), &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - // check norm smaller than original - ibz_set(&bound, 50 * 50); - quat_dim2_lattice_norm(&sum, &(red[0][0]), &(red[1][0]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - quat_dim2_lattice_norm(&prod, &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&prod, &bound) > 0); - // check lll - res = res || !quat_dim2_lattice_verify_lll(&red,&norm_q); - - // third test - ibz_mat_2x2_set(&basis, -1, 2, 3, 2); - ibz_set(&norm_q, 2); - quat_dim2_lattice_short_basis(&red, &basis, &norm_q); - // check second basis vector larger (or at least equal) than 1st - res = res || (ibz_cmp(&sum, &prod) > 0); - // check mutual inclusion of lattices - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][0]), &(basis[1][0]))); - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][1]), &(basis[1][1]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][0]), &(red[1][0]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][1]), &(red[1][1]))); - // check bilinear form value is small - ibz_set(&bound, 12); - quat_dim2_lattice_bilinear(&sum, &(red[0][0]), &(red[0][1]), &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - // check norm smaller than original - ibz_set(&bound, 12); - quat_dim2_lattice_norm(&sum, &(red[0][0]), &(red[1][0]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - quat_dim2_lattice_norm(&prod, &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&prod, &bound) > 0); - // check lll - res = res || !quat_dim2_lattice_verify_lll(&red,&norm_q); - - //4th test - ibz_set(&norm_q, 12165); - ibz_mat_2x2_set(&basis, 364, 0, 1323546, 266606); - quat_dim2_lattice_short_basis(&red, &basis,&norm_q); - // check second basis vector larger (or at least equal) than 1st - res = res || (ibz_cmp(&sum, &prod) > 0); - // check mutual inclusion of lattices - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][0]), &(basis[1][0]))); - res = res || (!quat_dim2_lattice_contains(&red, &(basis[0][1]), &(basis[1][1]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][0]), &(red[1][0]))); - res = res || (!quat_dim2_lattice_contains(&basis, &(red[0][1]), &(red[1][1]))); - // check bilinear form value is small - quat_dim2_lattice_norm(&bound, &(basis[0][1]), &(basis[1][1]),&norm_q); - quat_dim2_lattice_bilinear(&sum, &(red[0][0]), &(red[0][1]), &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - // check norm smaller than original - quat_dim2_lattice_norm(&bound, &(basis[0][1]), &(basis[1][1]),&norm_q); - quat_dim2_lattice_norm(&sum, &(red[0][0]), &(red[1][0]), &norm_q); - res = res || (ibz_cmp(&sum, &bound) > 0); - quat_dim2_lattice_norm(&prod, &(red[0][1]), &(red[1][1]), &norm_q); - res = res || (ibz_cmp(&prod, &bound) > 0); - // check lll - res = res || !quat_dim2_lattice_verify_lll(&red,&norm_q); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_short_basis failed\n"); - } - ibz_finalize(&prod); - ibz_finalize(&sum); - ibz_finalize(&norm_q); - ibz_finalize(&bound); - ibz_mat_2x2_finalize(&basis); - ibz_mat_2x2_finalize(&cmp); - ibz_mat_2x2_finalize(&red); - return res; -} - -//void quat_dim2_lattice_get_coefficient_with_orthogonalisation(ibz_t *res, const ibz_t *a0,const ibz_t *a1,const ibz_t *b0,const ibz_t *b1,const ibz_t *t0,const ibz_t *t1,const ibz_t *norm_q); -int quat_test_dim2_lattice_get_coefficient_with_orthogonalisation(){ - int res = 0; - ibz_t out, q, cmp; - ibz_vec_2_t a, b, t; - ibz_init(&out); - ibz_init(&q); - ibz_vec_2_init(&a); - ibz_vec_2_init(&b); - ibz_vec_2_init(&t); - ibz_init(&cmp); - - ibz_vec_2_set(&b,364,203); - ibz_vec_2_set(&a,136,-606); - ibz_vec_2_set(&t,4312, 1122); - ibz_set(&q,1); - ibz_set(&cmp,2); - quat_dim2_lattice_get_coefficient_with_orthogonalisation(&out,&(a[0]),&(a[1]),&(b[0]),&(b[1]),&(t[0]),&(t[1]),&q); - res = res || ibz_cmp(&cmp,&out); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_get_coefficient_with_orthogonalisation failed\n"); - } - ibz_finalize(&out); - ibz_finalize(&q); - ibz_vec_2_finalize(&a); - ibz_vec_2_finalize(&b); - ibz_vec_2_finalize(&t); - ibz_finalize(&cmp); - return(res); -} - -// void quat_dim2_lattice_closest_vector(ibz_vec_2_t *target_minus_closest, ibz_vec_2_t *closest_coords_in_basis, const ibz_mat_2x2_t *reduced_basis, const ibz_vec_2_t *target, const ibz_t *norm_q); -// void quat_dim2_lattice_closest_vector(ibz_vec_2_t *target_minus_closest, ibz_vec_2_t *closest_coords_in_basis, const ibz_mat_2x2_t *reduced_basis, const ibz_vec_2_t *target, const ibz_t *norm_q); -int quat_test_dim2_lattice_closest_vector() -{ - int res = 0; - ibz_vec_2_t target, coords, diff, cmp_c, cmp_d; - ibz_t q; - ibz_mat_2x2_t basis; - ibz_mat_2x2_init(&basis); - ibz_init(&q); - ibz_vec_2_init(&diff); - ibz_vec_2_init(&target); - ibz_vec_2_init(&coords); - ibz_vec_2_init(&cmp_c); - ibz_vec_2_init(&cmp_d); - - ibz_vec_2_set(&target, 1216765, 879777); - ibz_set(&q, 12165); - ibz_mat_2x2_set(&basis, 364, 0, 1323546, 266606); - quat_dim2_lattice_short_basis(&basis, &basis,&q); - res = res || !quat_dim2_lattice_verify_lll(&basis,&q); - - quat_dim2_lattice_norm(&(cmp_d[0]),&(basis[0][0]),&(basis[1][0]),&q); - quat_dim2_lattice_norm(&(cmp_d[1]),&(basis[0][1]),&(basis[1][1]),&q); - quat_dim2_lattice_closest_vector(&diff, &coords, &basis, &target, &q); - quat_dim2_lattice_norm(&(cmp_c[0]),&(diff[0]),&(diff[1]),&q); - // test if diff has short norm - res = res || (ibz_cmp(&(cmp_d[0]), &(cmp_c[0]))<0); - res = res || (ibz_cmp(&(cmp_d[1]), &(cmp_c[0]))<0);// test coord in std basis + diff gives target - ibz_mul(&(cmp_c[0]), &(basis[0][0]), &(coords[0])); - ibz_mul(&(cmp_d[0]), &(basis[0][1]), &(coords[1])); - ibz_add(&(cmp_c[0]), &(cmp_c[0]), &(cmp_d[0])); - ibz_mul(&(cmp_c[1]), &(basis[1][0]), &(coords[0])); - ibz_mul(&(cmp_d[1]), &(basis[1][1]), &(coords[1])); - ibz_add(&(cmp_c[1]), &(cmp_c[1]), &(cmp_d[1])); - ibz_add(&(cmp_d[1]), &(diff[1]), &(cmp_c[1])); - ibz_add(&(cmp_d[0]), &(diff[0]), &(cmp_c[0])); - res = res || ibz_cmp(&(target[0]), &(cmp_d[0])); - res = res || ibz_cmp(&(target[1]), &(cmp_d[1])); - - ibz_set_from_str(&(target[0]),"24331603791763515691729329496192502951056898161849272968170597636916968011043891967931576902713229532952543949167870260",10); - ibz_set_from_str(&(target[1]),"320864169455876864410246920205472260746024223953596490297261861428291460634916982031632479909031611896628831462307645903",10); - ibz_set_from_str(&(basis[0][0]),"83823929950128301594915602697228677079260482500022964929273",10); - ibz_set_from_str(&(basis[0][1]),"0",10); - ibz_set_from_str(&(basis[1][0]),"26601400243014239200180507899382755112580169588401175904342542265512938583814884922817611265843666255091702318534544478",10); - ibz_set_from_str(&(basis[1][1]),"702645123228401649030937397460831326065409163240113467483219315690011711473572222698591407715178198721852976513892308529",10); - ibz_set(&q, 1); - quat_dim2_lattice_short_basis(&basis, &basis,&q); - res = res || !quat_dim2_lattice_verify_lll(&basis,&q); - - quat_dim2_lattice_norm(&(cmp_d[0]),&(basis[0][0]),&(basis[1][0]),&q); - quat_dim2_lattice_norm(&(cmp_d[1]),&(basis[0][1]),&(basis[1][1]),&q); - quat_dim2_lattice_closest_vector(&diff, &coords, &basis, &target, &q); - quat_dim2_lattice_norm(&(cmp_c[0]),&(diff[0]),&(diff[1]),&q); - quat_dim2_lattice_bilinear(&(cmp_c[1]),&(basis[0][0]),&(basis[1][0]),&(basis[0][1]),&(basis[1][1]),&q); - quat_dim2_lattice_bilinear(&(cmp_c[1]),&(basis[0][0]),&(basis[1][0]),&(diff[0]),&(diff[1]),&q); - quat_dim2_lattice_bilinear(&(cmp_c[1]),&(basis[0][1]),&(basis[1][1]),&(diff[0]),&(diff[1]),&q); - // test if diff has short norm - res = res || (ibz_cmp(&(cmp_d[0]), &(cmp_c[0]))<0); - res = res || (ibz_cmp(&(cmp_d[1]), &(cmp_c[0]))<0); - // test coord in std basis + diff gives target - ibz_mul(&(cmp_c[0]), &(basis[0][0]), &(coords[0])); - ibz_mul(&(cmp_d[0]), &(basis[0][1]), &(coords[1])); - ibz_add(&(cmp_c[0]), &(cmp_c[0]), &(cmp_d[0])); - ibz_mul(&(cmp_c[1]), &(basis[1][0]), &(coords[0])); - ibz_mul(&(cmp_d[1]), &(basis[1][1]), &(coords[1])); - ibz_add(&(cmp_c[1]), &(cmp_c[1]), &(cmp_d[1])); - ibz_add(&(cmp_d[1]), &(diff[1]), &(cmp_c[1])); - ibz_add(&(cmp_d[0]), &(diff[0]), &(cmp_c[0])); - res = res || ibz_cmp(&(target[0]), &(cmp_d[0])); - res = res || ibz_cmp(&(target[1]), &(cmp_d[1])); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_closest_vector failed\n"); - } - ibz_mat_2x2_finalize(&basis); - ibz_finalize(&q); - ibz_vec_2_finalize(&diff); - ibz_vec_2_finalize(&target); - ibz_vec_2_finalize(&coords); - ibz_vec_2_finalize(&cmp_c); - ibz_vec_2_finalize(&cmp_d); - return (res); -} - -// void quat_dim2_lattice_get_qf_on_lattice(ibz_t *qf_a, ibz_t *qf_b,ibz_t *qf_c, const ibz_mat_2x2_t *basis ,const ibz_t *norm_q); -int quat_test_dim2_lattice_get_qf_on_lattice() -{ - int res = 0; - ibz_t a, b, c, q, cmp_a, cmp_b, cmp_c; - ibz_mat_2x2_t basis; - ibz_mat_2x2_init(&basis); - ibz_init(&a); - ibz_init(&b); - ibz_init(&c); - ibz_init(&q); - ibz_init(&cmp_a); - ibz_init(&cmp_b); - ibz_init(&cmp_c); - ibz_mat_2x2_set(&basis, -3, 2, 1, 2); - ibz_set(&q, 2); - ibz_set(&cmp_a, 11); - ibz_set(&cmp_b, -4); - ibz_set(&cmp_c, 12); - quat_dim2_lattice_get_qf_on_lattice(&a, &b, &c, &basis, &q); - res = res || ibz_cmp(&a, &cmp_a); - res = res || ibz_cmp(&b, &cmp_b); - res = res || ibz_cmp(&c, &cmp_c); - ibz_mat_2x2_set(&basis, 5, 7, -1, 1); - ibz_set(&q, 20); - ibz_set(&cmp_a, 5 * 5 + 20); - ibz_set(&cmp_b, 2 * (5 * 7 - 20)); - ibz_set(&cmp_c, 7 * 7 + 20); - quat_dim2_lattice_get_qf_on_lattice(&q, &b, &c, &basis, &q); - res = res || ibz_cmp(&q, &cmp_a); - res = res || ibz_cmp(&b, &cmp_b); - res = res || ibz_cmp(&c, &cmp_c); - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_get_qf_on_lattice failed\n"); - } - ibz_mat_2x2_finalize(&basis); - ibz_finalize(&a); - ibz_finalize(&b); - ibz_finalize(&c); - ibz_finalize(&q); - ibz_finalize(&cmp_a); - ibz_finalize(&cmp_b); - ibz_finalize(&cmp_c); - return (res); -} - -// int quat_dim2_lattice_test_cvp_condition(quat_alg_elem_t* elem, const ibz_vec_2_t* vec, const void* params); -int quat_test_dim2_lattice_test_cvp_condition() -{ - int res = 0; - ibz_vec_2_t vec; - quat_alg_elem_t elem; - ibz_t p; - void *params = (void *)&p; - quat_alg_elem_init(&elem); - ibz_vec_2_init(&vec); - ibz_init(&p); - ibz_vec_2_set(&vec, 5, 7); - ibz_set(&p, 5); - res = res || !quat_dim2_lattice_test_cvp_condition(&elem, &vec, params); - res = res || ibz_cmp(&(elem.coord[0]), &(vec[0])); - res = res || ibz_cmp(&(elem.coord[1]), &(vec[1])); - res = res || ibz_cmp(&(elem.coord[2]), &(vec[0])); - res = res || ibz_cmp(&(elem.coord[3]), &(vec[1])); - ibz_vec_2_set(&vec, 5, 8); - ibz_set(&p, 5); - res = res || quat_dim2_lattice_test_cvp_condition(&elem, &vec, params); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_test_cvp_condition failed\n"); - } - quat_alg_elem_finalize(&elem); - ibz_vec_2_finalize(&vec); - ibz_finalize(&p); - return (res); -} - -// int quat_dim2_lattice_bound_and_condition(quat_alg_elem_t *res, const ibz_t *x, const ibz_t *y, int (*condition)(quat_alg_elem_t* , const ibz_vec_2_t*, const void*), const void* params, const ibz_vec_2_t* target_minus_closest, const ibz_mat_2x2_t *lat_basis, const ibz_t *norm_q, const ibz_t *norm_bound); -int quat_test_dim2_lattice_bound_and_condition() -{ - int res = 0; - quat_alg_elem_t out; - ibz_t x, y, q, bound, p; - ibz_vec_2_t cmp, diff; - ibz_mat_2x2_t basis; - quat_alg_elem_init(&out); - ibz_init(&x); - ibz_init(&y); - ibz_init(&q); - ibz_init(&p); - ibz_init(&bound); - ibz_vec_2_init(&cmp); - ibz_vec_2_init(&diff); - ibz_mat_2x2_init(&basis); - void *params = (void *)&p; - - // should pass - ibz_mat_2x2_set(&basis, -3, 2, 1, 2); - ibz_set(&q, 2); - ibz_set(&x, -1); - ibz_set(&y, 3); - ibz_set(&p, 3); - ibz_set(&bound, 1000); - ibz_vec_2_set(&diff, 1, 0); - // out contains target - closest - short = diff - short - ibz_vec_2_set(&cmp, -8, -5); - if (quat_dim2_lattice_bound_and_condition(&out, &x, &y, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound)) - { - res = res || ibz_cmp(&(cmp[0]), &(out.coord[0])); - res = res || ibz_cmp(&(cmp[1]), &(out.coord[1])); - } - else - { - res = 1; - } - // fail due to bound - ibz_set(&bound, 10); - res = res || quat_dim2_lattice_bound_and_condition(&out, &x, &y, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound); - - // fail due to condition - ibz_set(&bound, 1000); - ibz_set(&p, 2); - res = res || quat_dim2_lattice_bound_and_condition(&out, &x, &y, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_bound_and_condition failed\n"); - } - quat_alg_elem_finalize(&out); - ibz_finalize(&x); - ibz_finalize(&y); - ibz_finalize(&q); - ibz_finalize(&p); - ibz_finalize(&bound); - ibz_vec_2_finalize(&cmp); - ibz_vec_2_finalize(&diff); - ibz_mat_2x2_finalize(&basis); - return (res); -} - -// int quat_dim2_lattice_qf_value_bound_generation(ibz_t *res, const ibz_t *num_a, const ibz_t *denom_a, const ibz_t *num_b, const ibz_t *denom_b){ -int quat_test_dim2_lattice_qf_value_bound_generation() -{ - int res = 0; - ibz_t sqrt_num, sqrt_denom, num_b, denom_b, cmp, bound; - ibz_init(&sqrt_denom); - ibz_init(&sqrt_num); - ibz_init(&denom_b); - ibz_init(&num_b); - ibz_init(&cmp); - ibz_init(&bound); - - ibz_set(&sqrt_denom, 4); - ibz_set(&sqrt_num, 10); - ibz_set(&denom_b, 2); - ibz_set(&num_b, 5); - ibz_set(&cmp, 5); - quat_dim2_lattice_qf_value_bound_generation(&bound, &sqrt_num, &sqrt_denom, &num_b, &denom_b); - res = res || ibz_cmp(&bound, &cmp); - - ibz_set(&sqrt_denom, 6); - ibz_set(&sqrt_num, 9); - ibz_set(&denom_b, 2); - ibz_set(&num_b, 3); - ibz_set(&cmp, 4); - quat_dim2_lattice_qf_value_bound_generation(&bound, &sqrt_num, &sqrt_denom, &num_b, &denom_b); - res = res || ibz_cmp(&bound, &cmp); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_qf_value_bound_generation failed\n"); - } - ibz_finalize(&sqrt_denom); - ibz_finalize(&sqrt_num); - ibz_finalize(&denom_b); - ibz_finalize(&num_b); - ibz_finalize(&cmp); - ibz_finalize(&bound); - return res; -} - -// int quat_dim2_lattice_qf_enumerate_short_vec(quat_alg_elem_t *res,int (*condition)(quat_alg_elem_t*, const ibz_vec_2_t*, const void*), const void *params, const ibz_vec_2_t *target_minus_closest, const ibz_mat_2x2_t *lat_basis, const ibz_t *norm_q,const ibz_t *norm_bound, const int max_tries); -int quat_test_dim2_lattice_qf_enumerate_short_vec() -{ - int res = 0; - quat_alg_elem_t out; - ibz_t q, bound, p; - ibz_vec_2_t diff; - ibz_mat_2x2_t basis; - int max_tries = 1000; - quat_alg_elem_init(&out); - void *params = (void *)&p; - ibz_init(&q); - ibz_init(&p); - ibz_init(&bound); - ibz_vec_2_init(&diff); - ibz_mat_2x2_init(&basis); - ibz_set(&p, 3); - - // should pass - ibz_mat_2x2_set(&basis, -3, 2, 1, 2); - ibz_set(&q, 2); - ibz_set(&p, 3); - ibz_set(&bound, 200); - max_tries = 20000; - ibz_vec_2_set(&diff, 2, 1); - if (quat_dim2_lattice_qf_enumerate_short_vec(&out, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound, max_tries)) - { - res = res || quat_dim2_lattice_bound_and_condition(&out, &(out.coord[0]), &(out.coord[1]), &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound); - } - else - { - res = 1; - } - - // should passibz_vec_2_set(&target, 1216765, 879777); - ibz_mat_2x2_set(&basis, 364, 0, 1323546, 266606); - ibz_set(&q, 12165); - ibz_set(&p, 3); - ibz_set(&bound, 1024*64); - ibz_mul(&bound,&bound,&bound); - max_tries = 100; - ibz_vec_2_set(&diff, -18287, -155); - if (quat_dim2_lattice_qf_enumerate_short_vec(&out, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound, max_tries)) - { - res = res || quat_dim2_lattice_bound_and_condition(&out, &(out.coord[0]), &(out.coord[1]), &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound); - } - else - { - res = 1; - } - - // should fail - ibz_mat_2x2_set(&basis, -3, 2, 1, 2); - ibz_set(&q, 2); - ibz_set(&p, 2); - ibz_set(&bound, 200); - max_tries = 2000; - ibz_vec_2_set(&diff, 2, 1); - res = res || quat_dim2_lattice_qf_enumerate_short_vec(&out, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound, max_tries); - - // should fail - ibz_mat_2x2_set(&basis, -3, 2, 1, 2); - ibz_set(&q, 2); - ibz_set(&p, 2); - ibz_set(&bound, 50); - max_tries = 2000; - ibz_vec_2_set(&diff, 2, 1); - res = res || quat_dim2_lattice_qf_enumerate_short_vec(&out, &quat_dim2_lattice_test_cvp_condition, params, &diff, &basis, &q, &bound, max_tries); - - if (res != 0) - { - printf("Quaternion unit test dim2_lattice_qf_enumerate_short_vec failed\n"); - } - quat_alg_elem_finalize(&out); - ibz_finalize(&q); - ibz_finalize(&p); - ibz_finalize(&bound); - ibz_vec_2_finalize(&diff); - ibz_mat_2x2_finalize(&basis); - return (res); -} - -// int quat_2x2_lattice_enumerate_cvp_filter(quat_alg_elem_t *res, const ibz_mat_2x2_t *lat_basis, const ibz_vec_2_t *target,unsigned int qf, unsigned int dist_bound, int (*condition)(quat_alg_elem_t* , const ibz_vec_2_t*, const void*), const void* params, unsigned int max_tries); -int quat_test_dim2_2x2_lattice_enumerate_cvp_filter() -{ - int res = 0; - ibz_t p, bound, norm_q, norm; - quat_alg_elem_t cvp_res; - ibz_mat_2x2_t basis; - ibz_vec_2_t target, diff, found; - ibz_mat_2x2_init(&basis); - quat_alg_elem_init(&cvp_res); - ibz_vec_2_init(&target); - ibz_vec_2_init(&diff); - ibz_vec_2_init(&found); - ibz_init(&p); - ibz_init(&norm_q); - ibz_init(&norm); - ibz_init(&bound); - unsigned int q; - unsigned int dist_bound; - void *params = (void *)&p; - unsigned int max_tries; - - // solution should exist - ibz_mat_2x2_set(&basis, -3, 2, 1, 2); - ibz_vec_2_set(&target, -3, 3); - ibz_set(&p, 3); - q = 2; - dist_bound = 10; - max_tries = 20000; - if (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)) - { - // used cvp_res and condition to exfiltrate standard coords of distance to target from close vector found - ibz_copy(&(diff[0]), &(cvp_res.coord[0])); - ibz_copy(&(diff[1]), &(cvp_res.coord[1])); - // compute close vector in lattice from target and diff - ibz_sub(&(found[0]), &(target[0]), &(diff[0])); - ibz_sub(&(found[1]), &(target[1]), &(diff[1])); - // norm bound on diff ok? - ibz_set(&norm_q, q); - ibz_set(&bound, 2); - ibz_pow(&bound, &bound, dist_bound); - quat_dim2_lattice_norm(&norm, &(diff[0]), &(diff[1]), &norm_q); - res = res || !(ibz_cmp(&norm, &bound) < 0); - // Condition ok - res = res || (!quat_dim2_lattice_test_cvp_condition(&cvp_res, &diff, params)); - // Is in lattice - res = res || (!quat_dim2_lattice_contains(&basis, &(found[0]), &(found[1]))); - } - else - { - res = 1; - } - - // solution should exist - ibz_mat_2x2_set(&basis, -1, 2, 3, 2); - ibz_vec_2_set(&target, -3, 3); - ibz_set(&p, 3); - q = 2; - dist_bound = 10; - max_tries = 20000; - if (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)) - { - // used cvp_res and condition to exfiltrate standard coords of distance to target from close vector found - ibz_copy(&(diff[0]), &(cvp_res.coord[0])); - ibz_copy(&(diff[1]), &(cvp_res.coord[1])); - // compute close vector in lattice from target and diff - ibz_sub(&(found[0]), &(target[0]), &(diff[0])); - ibz_sub(&(found[1]), &(target[1]), &(diff[1])); - // norm bound on diff ok? - ibz_set(&norm_q, q); - ibz_set(&bound, 2); - ibz_pow(&bound, &bound, dist_bound); - quat_dim2_lattice_norm(&norm, &(diff[0]), &(diff[1]), &norm_q); - res = res || !(ibz_cmp(&norm, &bound) < 0); - // Condition ok - res = res || (!quat_dim2_lattice_test_cvp_condition(&cvp_res, &diff, params)); - // Is in lattice - res = res || (!quat_dim2_lattice_contains(&basis, &(found[0]), &(found[1]))); - } - else - { - res = 1; - } - - // solution should not exist because of lower dist_bound - ibz_mat_2x2_set(&basis, -1, 2, 1, 2); - ibz_vec_2_set(&target, -3, 3); - ibz_set(&p, 5); - q = 3; - dist_bound = 1; - max_tries = 1000; - res = res || (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)); - - // solution should not exist because of impossible condition - ibz_mat_2x2_set(&basis, -1, 2, 1, 2); - ibz_vec_2_set(&target, -3, 3); - ibz_set(&p, 2); - q = 3; - dist_bound = 20; - max_tries = 1000; - res = res || (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)); - - // should succeed, but close to bound - ibz_vec_2_set(&target, 1216765, 879777); - q = 12165; - dist_bound = 32; - ibz_set(&p, 3); - max_tries = 100; - ibz_mat_2x2_set(&basis, 364, 0, 1323546, 266606); - if (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)) - { - // used cvp_res and condition to exfiltrate standard coords of distance to target from close vector found - ibz_copy(&(diff[0]), &(cvp_res.coord[0])); - ibz_copy(&(diff[1]), &(cvp_res.coord[1])); - // compute close vector in lattice from target and diff - ibz_sub(&(found[0]), &(target[0]), &(diff[0])); - ibz_sub(&(found[1]), &(target[1]), &(diff[1])); - // norm bound on diff ok? - ibz_set(&norm_q, q); - ibz_set(&bound, 2); - ibz_pow(&bound, &bound, dist_bound); - quat_dim2_lattice_norm(&norm, &(diff[0]), &(diff[1]), &norm_q); - res = res || !(ibz_cmp(&norm, &bound) < 0); - // Condition ok - res = res || (!quat_dim2_lattice_test_cvp_condition(&cvp_res, &diff, params)); - // Is in lattice - res = res || (!quat_dim2_lattice_contains(&basis, &(found[0]), &(found[1]))); - } - else - { - res = 1; - } - - ibz_vec_2_set(&target, 1216765, -223409); - q = 12; - dist_bound = 25; - ibz_set(&p, 3); - max_tries = 50; - ibz_mat_2x2_set(&basis, 364, 2, -132346, 26606); - if (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)) - { - // used cvp_res and condition to exfiltrate standard coords of distance to target from close vector found - ibz_copy(&(diff[0]), &(cvp_res.coord[0])); - ibz_copy(&(diff[1]), &(cvp_res.coord[1])); - // compute close vector in lattice from target and diff - ibz_sub(&(found[0]), &(target[0]), &(diff[0])); - ibz_sub(&(found[1]), &(target[1]), &(diff[1])); - // norm bound on diff ok? - ibz_set(&norm_q, q); - ibz_set(&bound, 2); - ibz_pow(&bound, &bound, dist_bound); - quat_dim2_lattice_norm(&norm, &(diff[0]), &(diff[1]), &norm_q); - res = res || !(ibz_cmp(&norm, &bound) < 0); - // Condition ok - res = res || (!quat_dim2_lattice_test_cvp_condition(&cvp_res, &diff, params)); - // Is in lattice - res = res || (!quat_dim2_lattice_contains(&basis, &(found[0]), &(found[1]))); - } - else - { - res = 1; - } - - //large passing test - ibz_set_from_str(&(target[0]),"24331603791763515691729329496192502951056898161849272968170597636916968011043891967931576902713229532952543949167870260",10); - ibz_set_from_str(&(target[1]),"320864169455876864410246920205472260746024223953596490297261861428291460634916982031632479909031611896628831462307645903",10); - ibz_set_from_str(&(basis[0][0]),"83823929950128301594915602697228677079260482500022964929273",10); - ibz_set_from_str(&(basis[0][1]),"0",10); - ibz_set_from_str(&(basis[1][0]),"26601400243014239200180507899382755112580169588401175904342542265512938583814884922817611265843666255091702318534544478",10); - ibz_set_from_str(&(basis[1][1]),"702645123228401649030937397460831326065409163240113467483219315690011711473572222698591407715178198721852976513892308529",10); - q = 1; - dist_bound = 600; - ibz_set(&p, 3); - max_tries = 1000; - if (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)) - { - // used cvp_res and condition to exfiltrate standard coords of distance to target from close vector found - ibz_copy(&(diff[0]), &(cvp_res.coord[0])); - ibz_copy(&(diff[1]), &(cvp_res.coord[1])); - // compute close vector in lattice from target and diff - ibz_sub(&(found[0]), &(target[0]), &(diff[0])); - ibz_sub(&(found[1]), &(target[1]), &(diff[1])); - // norm bound on diff ok? - ibz_set(&norm_q, q); - ibz_set(&bound, 2); - ibz_pow(&bound, &bound, dist_bound); - quat_dim2_lattice_norm(&norm, &(diff[0]), &(diff[1]), &norm_q); - res = res || !(ibz_cmp(&norm, &bound) < 0); - // Condition ok - res = res || (!quat_dim2_lattice_test_cvp_condition(&cvp_res, &diff, params)); - // Is in lattice - res = res || (!quat_dim2_lattice_contains(&basis, &(found[0]), &(found[1]))); - } - else - { - res = 1; - } - - if (res != 0) - { - printf("Quaternion unit test dim2_2x2_lattice_enumerate_cvp_filter failed\n"); - } - ibz_mat_2x2_finalize(&basis); - quat_alg_elem_finalize(&cvp_res); - ibz_vec_2_finalize(&target); - ibz_vec_2_finalize(&diff); - ibz_vec_2_finalize(&found); - ibz_finalize(&p); - ibz_finalize(&norm_q); - ibz_finalize(&norm); - ibz_finalize(&bound); - return res; -} - // run all previous tests -int quat_test_dim2() +int +quat_test_dim2(void) { int res = 0; - printf("\nRunning quaternion tests of functions for matrices, vectors and lattices in dimension 2\n"); + printf("\nRunning quaternion tests of functions for matrices, vectors and lattices in " + "dimension 2\n"); res = res | quat_test_dim2_ibz_vec_2_set(); res = res | quat_test_dim2_ibz_mat_2x2_set(); + res = res | quat_test_dim2_ibz_mat_2x2_copy(); res = res | quat_test_dim2_ibz_mat_2x2_det_from_ibz(); res = res | quat_test_dim2_ibz_mat_2x2_eval(); res = res | quat_test_dim2_ibz_mat_2x2_mul_mod(); res = res | quat_test_dim2_ibz_mat_2x2_inv_mod(); - res = res | quat_test_dim2_lattice_test_cvp_condition(); - res = res | quat_test_dim2_lattice_contains(); - res = res | quat_test_dim2_lattice_norm(); - res = res | quat_test_dim2_lattice_bilinear(); - res = res | quat_test_dim2_lattice_short_basis(); - res = res | quat_test_dim2_lattice_get_coefficient_with_orthogonalisation(); - res = res | quat_test_dim2_lattice_closest_vector(); - res = res | quat_test_dim2_lattice_get_qf_on_lattice(); - res = res | quat_test_dim2_lattice_bound_and_condition(); - res = res | quat_test_dim2_lattice_qf_value_bound_generation(); - res = res | quat_test_dim2_lattice_qf_enumerate_short_vec(); - res = res | quat_test_dim2_2x2_lattice_enumerate_cvp_filter(); return (res); } diff --git a/src/quaternion/ref/generic/test/dim4.c b/src/quaternion/ref/generic/test/dim4.c index a66dd49..0ad38ce 100644 --- a/src/quaternion/ref/generic/test/dim4.c +++ b/src/quaternion/ref/generic/test/dim4.c @@ -1,16 +1,18 @@ #include "quaternion_tests.h" // internal helper function -//void ibz_mat_4x4_mul(ibz_mat_4x4_t *res, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b) -int quat_test_dim4_ibz_mat_4x4_mul(){ +// void ibz_mat_4x4_mul(ibz_mat_4x4_t *res, const ibz_mat_4x4_t *a, const ibz_mat_4x4_t *b) +int +quat_test_dim4_ibz_mat_4x4_mul(void) +{ int res = 0; ibz_mat_4x4_t a, b, prod, cmp; ibz_mat_4x4_init(&a); ibz_mat_4x4_init(&b); ibz_mat_4x4_init(&prod); ibz_mat_4x4_init(&cmp); - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { ibz_set(&(a[i][j]), 0); ibz_set(&(b[i][j]), 0); ibz_set(&(cmp[i][j]), 0); @@ -49,10 +51,10 @@ int quat_test_dim4_ibz_mat_4x4_mul(){ ibz_set(&(cmp[3][2]), -1); ibz_set(&(cmp[3][3]), 2); ibz_mat_4x4_mul(&prod, &a, &b); - res = res || ibz_mat_4x4_equal(&cmp,&prod); + res = res || ibz_mat_4x4_equal(&cmp, &prod); ibz_mat_4x4_mul(&b, &a, &b); - res = res || ibz_mat_4x4_equal(&b,&cmp); + res = res || ibz_mat_4x4_equal(&b, &cmp); ibz_set(&(b[0][0]), -1); ibz_set(&(b[1][0]), 1); @@ -64,9 +66,9 @@ int quat_test_dim4_ibz_mat_4x4_mul(){ ibz_set(&(b[3][2]), -1); ibz_set(&(b[3][3]), 2); ibz_mat_4x4_mul(&a, &a, &b); - res = res || ibz_mat_4x4_equal(&a,&cmp); + res = res || ibz_mat_4x4_equal(&a, &cmp); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_mul failed\n"); } ibz_mat_4x4_finalize(&a); @@ -77,78 +79,322 @@ int quat_test_dim4_ibz_mat_4x4_mul(){ } // helper functions for lattices -//void ibz_vec_4_set(ibz_vec_4_t *vec, int64_t coord0, int64_t coord1, int64_t coord2, int64_t coord3) -int quat_test_dim4_ibz_vec_4_set(){ +// void ibz_vec_4_set(ibz_vec_4_t *vec, int32_t coord0, int32_t coord1, int32_t coord2, int32_t +// coord3) +int +quat_test_dim4_ibz_vec_4_set(void) +{ int res = 0; ibz_vec_4_t a; ibz_vec_4_init(&a); - ibz_vec_4_set(&a,1,2,3,4); - res = res || !(1 == ibz_get(&(a[0]))); - res = res || !(2 == ibz_get(&(a[1]))); - res = res || !(3 == ibz_get(&(a[2]))); - res = res || !(4 == ibz_get(&(a[3]))); - if (res != 0){ + ibz_vec_4_set(&a, 1, 2, 3, 4); + res = res || !(ibz_cmp_int32(&(a[0]), 1) == 0); + res = res || !(ibz_cmp_int32(&(a[1]), 2) == 0); + res = res || !(ibz_cmp_int32(&(a[2]), 3) == 0); + res = res || !(ibz_cmp_int32(&(a[3]), 4) == 0); + if (res != 0) { printf("Quaternion unit test dim4_ibz_vec_4_set failed\n"); } ibz_vec_4_finalize(&a); - return(res); + return (res); } - -//void ibz_vec_4_copy(ibz_vec_4_t *new, const ibz_vec_4_t *vec); -int quat_test_dim4_ibz_vec_4_copy(){ +// void ibz_vec_4_copy(ibz_vec_4_t *new, const ibz_vec_4_t *vec); +int +quat_test_dim4_ibz_vec_4_copy(void) +{ int res = 0; - ibz_vec_4_t a,b; + ibz_vec_4_t a, b; ibz_vec_4_init(&a); ibz_vec_4_init(&b); - ibz_vec_4_set(&a,1,2,3,4); - ibz_vec_4_copy(&b,&a); - res = res || !(1 == ibz_get(&(b[0]))); - res = res || !(2 == ibz_get(&(b[1]))); - res = res || !(3 == ibz_get(&(b[2]))); - res = res || !(4 == ibz_get(&(b[3]))); - ibz_vec_4_copy(&a,&a); - res = res || !(1 == ibz_get(&(a[0]))); - res = res || !(2 == ibz_get(&(a[1]))); - res = res || !(3 == ibz_get(&(a[2]))); - res = res || !(4 == ibz_get(&(a[3]))); + ibz_vec_4_set(&a, 1, 2, 3, 4); + ibz_vec_4_copy(&b, &a); + res = res || !(ibz_cmp_int32(&(b[0]), 1) == 0); + res = res || !(ibz_cmp_int32(&(b[1]), 2) == 0); + res = res || !(ibz_cmp_int32(&(b[2]), 3) == 0); + res = res || !(ibz_cmp_int32(&(b[3]), 4) == 0); + ibz_vec_4_copy(&a, &a); + res = res || !(ibz_cmp_int32(&(a[0]), 1) == 0); + res = res || !(ibz_cmp_int32(&(a[1]), 2) == 0); + res = res || !(ibz_cmp_int32(&(a[2]), 3) == 0); + res = res || !(ibz_cmp_int32(&(a[3]), 4) == 0); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_vec_4_copy failed\n"); } ibz_vec_4_finalize(&a); ibz_vec_4_finalize(&b); - return(res); + return (res); } - -//void ibz_vec_4_negate(ibz_vec_4_t *neg, const ibz_vec_4_t *vec); -int quat_test_dim4_ibz_vec_4_negate(){ +// void ibz_vec_4_negate(ibz_vec_4_t *neg, const ibz_vec_4_t *vec); +int +quat_test_dim4_ibz_vec_4_negate(void) +{ int res = 0; - ibz_vec_4_t a,b; + ibz_vec_4_t a, b; ibz_vec_4_init(&a); ibz_vec_4_init(&b); - ibz_vec_4_set(&a,1,2,3,4); - ibz_vec_4_negate(&b,&a); - res = res || !(-1 == ibz_get(&(b[0]))); - res = res || !(-2 == ibz_get(&(b[1]))); - res = res || !(-3 == ibz_get(&(b[2]))); - res = res || !(-4 == ibz_get(&(b[3]))); - ibz_vec_4_negate(&a,&a); - res = res || !(-1 == ibz_get(&(a[0]))); - res = res || !(-2 == ibz_get(&(a[1]))); - res = res || !(-3 == ibz_get(&(a[2]))); - res = res || !(-4 == ibz_get(&(a[3]))); - if (res != 0){ + ibz_vec_4_set(&a, 1, 2, 3, 4); + ibz_vec_4_negate(&b, &a); + res = res || !(ibz_cmp_int32(&(b[0]), -1) == 0); + res = res || !(ibz_cmp_int32(&(b[1]), -2) == 0); + res = res || !(ibz_cmp_int32(&(b[2]), -3) == 0); + res = res || !(ibz_cmp_int32(&(b[3]), -4) == 0); + ibz_vec_4_negate(&a, &a); + res = res || !(ibz_cmp_int32(&(a[0]), -1) == 0); + res = res || !(ibz_cmp_int32(&(a[1]), -2) == 0); + res = res || !(ibz_cmp_int32(&(a[2]), -3) == 0); + res = res || !(ibz_cmp_int32(&(a[3]), -4) == 0); + if (res != 0) { printf("Quaternion unit test dim4_ibz_vec_4_negate failed\n"); } ibz_vec_4_finalize(&a); ibz_vec_4_finalize(&b); - return(res); + return (res); } -//void ibz_vec_4_linear_combination(ibz_vec_4_t *lc, const ibz_t *coeff_a, const ibz_vec_4_t *vec_a, const ibz_t *coeff_b, const ibz_vec_4_t *vec_b){ -int quat_test_dim4_ibz_vec_4_linear_combination(){ +// void ibz_vec_4_copy_ibz(ibz_vec_4_t *coord, const ibz_t *coord0,const ibz_t *coord1,const ibz_t +// *coord2,const ibz_t *coord3){ +int +quat_test_dim4_vec_4_copy_ibz(void) +{ + int res = 0; + ibz_t a, b, c, d; + ibz_vec_4_t coord; + ibz_vec_4_init(&coord); + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&d); + ibz_set(&a, 1); + ibz_set(&b, 2); + ibz_set(&c, 3); + ibz_set(&d, 4); + ibz_vec_4_copy_ibz(&coord, &a, &b, &c, &d); + res = res || ibz_cmp(&(coord[0]), &a); + res = res || ibz_cmp(&(coord[1]), &b); + res = res || ibz_cmp(&(coord[2]), &c); + res = res || ibz_cmp(&(coord[3]), &d); + + if (res != 0) { + printf("Quaternion unit test dim4_vec_4_copy_ibz failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&d); + ibz_vec_4_finalize(&coord); + return (res); +} + +// void ibz_vec_4_add(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b); +int +quat_test_dim4_ibz_vec_4_add(void) +{ + int res = 0; + ibz_vec_4_t a, b, c, cmp; + ibz_vec_4_init(&a); + ibz_vec_4_init(&b); + ibz_vec_4_init(&c); + ibz_vec_4_init(&cmp); + + ibz_set(&(a[0]), 1); + ibz_set(&(a[1]), -2); + ibz_set(&(a[2]), 7); + ibz_set(&(a[3]), 199); + ibz_set(&(b[0]), -6); + ibz_set(&(b[1]), 2); + ibz_set(&(b[2]), 67); + ibz_set(&(b[3]), -22); + ibz_set(&(cmp[0]), -5); + ibz_set(&(cmp[1]), 0); + ibz_set(&(cmp[2]), 74); + ibz_set(&(cmp[3]), 177); + ibz_vec_4_add(&c, &a, &b); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c[i]), &(cmp[i])); + } + + ibz_set(&(a[0]), -122); + ibz_set(&(a[1]), 0); + ibz_set(&(a[2]), -7); + ibz_set(&(a[3]), 1889); + ibz_set(&(b[0]), -6); + ibz_set(&(b[1]), 2); + ibz_set(&(b[2]), 67); + ibz_set(&(b[3]), -1889); + ibz_set(&(cmp[0]), -128); + ibz_set(&(cmp[1]), 2); + ibz_set(&(cmp[2]), 60); + ibz_set(&(cmp[3]), 0); + ibz_vec_4_add(&c, &a, &b); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c[i]), &(cmp[i])); + } + + ibz_set(&(a[0]), -1); + ibz_set(&(a[1]), 2); + ibz_set(&(a[2]), -7); + ibz_set(&(a[3]), 19); + ; + ibz_set(&(cmp[0]), -2); + ibz_set(&(cmp[1]), 4); + ibz_set(&(cmp[2]), -14); + ibz_set(&(cmp[3]), 38); + ibz_vec_4_add(&a, &a, &a); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(a[i]), &(cmp[i])); + } + + if (res != 0) { + printf("Quaternion unit test dim4_ibz_vec_4_add failed\n"); + } + ibz_vec_4_finalize(&a); + ibz_vec_4_finalize(&b); + ibz_vec_4_finalize(&c); + ibz_vec_4_finalize(&cmp); + return (res); +} + +// void ibz_vec_4_sub(ibz_vec_4_t *res, const ibz_vec_4_t *a, const ibz_vec_4_t *b); +int +quat_test_dim4_ibz_vec_4_sub(void) +{ + int res = 0; + ibz_vec_4_t a, b, c, cmp; + ibz_vec_4_init(&a); + ibz_vec_4_init(&b); + ibz_vec_4_init(&c); + ibz_vec_4_init(&cmp); + + ibz_set(&(a[0]), 1); + ibz_set(&(a[1]), -2); + ibz_set(&(a[2]), 7); + ibz_set(&(a[3]), 199); + ibz_set(&(b[0]), -6); + ibz_set(&(b[1]), 2); + ibz_set(&(b[2]), 67); + ibz_set(&(b[3]), -22); + ibz_set(&(cmp[0]), 7); + ibz_set(&(cmp[1]), -4); + ibz_set(&(cmp[2]), -60); + ibz_set(&(cmp[3]), 221); + ibz_vec_4_sub(&c, &a, &b); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c[i]), &(cmp[i])); + } + + ibz_set(&(a[0]), -122); + ibz_set(&(a[1]), 0); + ibz_set(&(a[2]), -7); + ibz_set(&(a[3]), 1889); + ibz_set(&(b[0]), -6); + ibz_set(&(b[1]), 2); + ibz_set(&(b[2]), 67); + ibz_set(&(b[3]), -1889); + ibz_set(&(cmp[0]), -116); + ibz_set(&(cmp[1]), -2); + ibz_set(&(cmp[2]), -74); + ibz_set(&(cmp[3]), 3778); + ibz_vec_4_sub(&c, &a, &b); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(c[i]), &(cmp[i])); + } + + ibz_set(&(a[0]), -1); + ibz_set(&(a[1]), 2); + ibz_set(&(a[2]), -7); + ibz_set(&(a[3]), 19); + ; + ibz_set(&(cmp[0]), 0); + ibz_set(&(cmp[1]), 0); + ibz_set(&(cmp[2]), 0); + ibz_set(&(cmp[3]), 0); + ibz_vec_4_sub(&a, &a, &a); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(a[i]), &(cmp[i])); + } + + if (res != 0) { + printf("Quaternion unit test dim4_ibz_vec_4_sub failed\n"); + } + ibz_vec_4_finalize(&a); + ibz_vec_4_finalize(&b); + ibz_vec_4_finalize(&c); + ibz_vec_4_finalize(&cmp); + return (res); +} + +// void ibz_vec_4_is_zero(ibz_vec_4_t *x); +int +quat_test_dim4_ibz_vec_4_is_zero(void) +{ + int res = 0; + ibz_vec_4_t x; + ibz_vec_4_init(&x); + ibz_vec_4_set(&x, 0, 0, 0, 0); + res = res || !ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, 20, 0, 0, 0); + res = res || ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, 0, -1, 0, 0); + res = res || ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, 0, 0, 2, 0); + res = res || ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, 0, 0, 0, 1); + res = res || ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, 1, 1, 1, 1); + res = res || ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, -1, 1, 1, -1); + res = res || ibz_vec_4_is_zero(&x); + ibz_vec_4_set(&x, 0, 0, 0, 0); + ibz_set(&(x[0]), 0); + ibz_set(&(x[1]), 0); + ibz_set(&(x[2]), 0); + ibz_set(&(x[3]), 0); + res = res | (1 - ibz_vec_4_is_zero(&x)); + ibz_set(&(x[3]), 1); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[3]), -1); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[2]), 1); + ibz_set(&(x[3]), 0); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[2]), -20); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[1]), 1); + ibz_set(&(x[2]), 0); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[1]), -50000); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[0]), 1); + ibz_set(&(x[1]), 0); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[0]), -90000); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[0]), 0); + ibz_set(&(x[1]), -500); + ibz_set(&(x[2]), 20); + ibz_set(&(x[3]), 0); + res = res | ibz_vec_4_is_zero(&x); + ibz_set(&(x[0]), 19); + ibz_set(&(x[1]), -500); + ibz_set(&(x[2]), 20); + ibz_set(&(x[3]), -2); + res = res | ibz_vec_4_is_zero(&x); + + if (res != 0) { + printf("Quaternion unit test dim4_ibz_vec_4_is_zero failed\n"); + } + ibz_vec_4_finalize(&x); + return (res); +} + +// void ibz_vec_4_linear_combination(ibz_vec_4_t *lc, const ibz_t *coeff_a, const ibz_vec_4_t +// *vec_a, const ibz_t *coeff_b, const ibz_vec_4_t *vec_b){ +int +quat_test_dim4_ibz_vec_4_linear_combination(void) +{ int res = 0; ibz_vec_4_t a, b, lc, cmp; ibz_t ca, cb; @@ -158,21 +404,21 @@ int quat_test_dim4_ibz_vec_4_linear_combination(){ ibz_vec_4_init(&b); ibz_vec_4_init(&lc); ibz_vec_4_init(&cmp); - ibz_vec_4_set(&a,1,2,3,4); - ibz_vec_4_set(&b,-2,1,3,-3); - ibz_set(&ca,2); - ibz_set(&cb,-1); - ibz_vec_4_set(&cmp,4,3,3,11); - ibz_vec_4_linear_combination(&lc,&ca,&a,&cb,&b); - for(int i = 0; i < 4; i++){ - res = res || ibz_cmp(&(lc[i]),&(cmp[i])); + ibz_vec_4_set(&a, 1, 2, 3, 4); + ibz_vec_4_set(&b, -2, 1, 3, -3); + ibz_set(&ca, 2); + ibz_set(&cb, -1); + ibz_vec_4_set(&cmp, 4, 3, 3, 11); + ibz_vec_4_linear_combination(&lc, &ca, &a, &cb, &b); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(lc[i]), &(cmp[i])); } - ibz_vec_4_set(&cmp,1,2,3,4); - ibz_vec_4_linear_combination(&a,&ca,&a,&cb,&a); - for(int i = 0; i < 4; i++){ - res = res || ibz_cmp(&(a[i]),&(cmp[i])); + ibz_vec_4_set(&cmp, 1, 2, 3, 4); + ibz_vec_4_linear_combination(&a, &ca, &a, &cb, &a); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(a[i]), &(cmp[i])); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_vec_4_linear_combination failed\n"); } ibz_finalize(&ca); @@ -181,106 +427,150 @@ int quat_test_dim4_ibz_vec_4_linear_combination(){ ibz_vec_4_finalize(&b); ibz_vec_4_finalize(&lc); ibz_vec_4_finalize(&cmp); - return(res); + return (res); } -//int ibz_vec_4_scalar_div(ibz_vec_4_t *quot, const ibz_t *scalar, const ibz_vec_4_t *vec); -int quat_test_dim4_ibz_vec_4_scalar_div(){ +// void ibz_vec_4_scalar_mul(ibz_vec_4_t *prod, const ibz_t *scalar, const ibz_vec_4_t *vec); +int +quat_test_dim4_ibz_vec_4_scalar_mul(void) +{ int res = 0; int s; ibz_t scalar; - ibz_vec_4_t quot,vec; + ibz_vec_4_t prod, vec; + ibz_vec_4_init(&vec); + ibz_vec_4_init(&prod); + ibz_init(&scalar); + + s = 5; + ibz_set(&scalar, s); + for (int i = 0; i < 4; i++) { + ibz_set(&(vec[i]), (i)); + } + ibz_vec_4_scalar_mul(&prod, &scalar, &vec); + for (int i = 0; i < 4; i++) { + res = res || (ibz_cmp_int32(&(prod[i]), i * s) != 0); + } + + ibz_vec_4_scalar_mul(&vec, &scalar, &vec); + for (int i = 0; i < 4; i++) { + res = res || (ibz_cmp_int32(&(vec[i]), i * s) != 0); + } + + if (res != 0) { + printf("Quaternion unit test dim4_ibz_vec_4_scalar_mul failed\n"); + } + ibz_vec_4_finalize(&vec); + ibz_vec_4_finalize(&prod); + ibz_finalize(&scalar); + return (res); +} + +// int ibz_vec_4_scalar_div(ibz_vec_4_t *quot, const ibz_t *scalar, const ibz_vec_4_t *vec); +int +quat_test_dim4_ibz_vec_4_scalar_div(void) +{ + int res = 0; + int s; + ibz_t scalar; + ibz_vec_4_t quot, vec; ibz_vec_4_init(&vec); ibz_vec_4_init("); ibz_init(&scalar); s = 5; - ibz_set(&scalar,s); - for(int i = 0; i < 4; i++){ - ibz_set(&(vec[i]),(i)*s); + ibz_set(&scalar, s); + for (int i = 0; i < 4; i++) { + ibz_set(&(vec[i]), (i)*s); } - res = res || !ibz_vec_4_scalar_div(",&scalar,&vec); - for(int i = 0; i < 4; i++){ - res = res || (ibz_get(&(quot[i])) !=i); + res = res || !ibz_vec_4_scalar_div(", &scalar, &vec); + for (int i = 0; i < 4; i++) { + res = res || (ibz_cmp_int32(&(quot[i]), i) != 0); } - res = res || ibz_vec_4_scalar_div(&vec,&scalar,&vec); - for(int i = 0; i < 4; i++){ - res = res || (ibz_get(&(vec[i])) !=i); + res = res || ibz_vec_4_scalar_div(&vec, &scalar, &vec); + for (int i = 0; i < 4; i++) { + res = res || (ibz_cmp_int32(&(vec[i]), i) != 0); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_vec_4_scalar_div failed\n"); } ibz_vec_4_finalize(&vec); ibz_vec_4_finalize("); ibz_finalize(&scalar); - return(res); + return (res); } -//void ibz_mat_4x4_copy(ibz_mat_4x4_t *new, const ibz_mat_4x4_t *mat); -int quat_test_dim4_ibz_mat_4x4_copy(){ +// void ibz_mat_4x4_copy(ibz_mat_4x4_t *new, const ibz_mat_4x4_t *mat); +int +quat_test_dim4_ibz_mat_4x4_copy(void) +{ int res = 0; ibz_mat_4x4_t mat, new; ibz_mat_4x4_init(&new); ibz_mat_4x4_init(&mat); ibz_mat_4x4_zero(&mat); - ibz_set(&(mat[0][0]),1); - ibz_set(&(mat[0][1]),2); - ibz_set(&(mat[0][2]),-7); + ibz_set(&(mat[0][0]), 1); + ibz_set(&(mat[0][1]), 2); + ibz_set(&(mat[0][2]), -7); ibz_set(&(mat[0][3]), 77); - ibz_set(&(mat[2][0]),13); - ibz_set(&(mat[1][1]),20); - ibz_set(&(mat[3][2]),-77); + ibz_set(&(mat[2][0]), 13); + ibz_set(&(mat[1][1]), 20); + ibz_set(&(mat[3][2]), -77); ibz_set(&(mat[3][3]), 7); - ibz_mat_4x4_copy(&new,&mat); - res = res || !ibz_mat_4x4_equal(&new,&mat); - if (res != 0){ + ibz_mat_4x4_copy(&new, &mat); + res = res || !ibz_mat_4x4_equal(&new, &mat); + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_copy failed\n"); } ibz_mat_4x4_finalize(&new); ibz_mat_4x4_finalize(&mat); - return(res); + return (res); } -//void ibz_mat_4x4_negate(ibz_mat_4x4_t *neg, const ibz_mat_4x4_t *mat); -int quat_test_dim4_ibz_mat_4x4_negate(){ +// void ibz_mat_4x4_negate(ibz_mat_4x4_t *neg, const ibz_mat_4x4_t *mat); +int +quat_test_dim4_ibz_mat_4x4_negate(void) +{ int res = 0; - ibz_mat_4x4_t mat, neg,cmp; + ibz_mat_4x4_t mat, neg, cmp; ibz_mat_4x4_init(&neg); ibz_mat_4x4_init(&mat); ibz_mat_4x4_init(&cmp); ibz_mat_4x4_zero(&cmp); ibz_mat_4x4_zero(&mat); - ibz_set(&(mat[0][0]),1); - ibz_set(&(cmp[0][0]),-1); - ibz_set(&(mat[0][1]),2); - ibz_set(&(cmp[0][1]),-2); - ibz_set(&(mat[0][2]),-7); - ibz_set(&(cmp[0][2]),7); + ibz_set(&(mat[0][0]), 1); + ibz_set(&(cmp[0][0]), -1); + ibz_set(&(mat[0][1]), 2); + ibz_set(&(cmp[0][1]), -2); + ibz_set(&(mat[0][2]), -7); + ibz_set(&(cmp[0][2]), 7); ibz_set(&(mat[0][3]), 77); ibz_set(&(cmp[0][3]), -77); - ibz_set(&(mat[2][0]),13); - ibz_set(&(cmp[2][0]),-13); - ibz_set(&(mat[1][1]),20); - ibz_set(&(cmp[1][1]),-20); - ibz_set(&(mat[3][2]),-77); - ibz_set(&(cmp[3][2]),77); + ibz_set(&(mat[2][0]), 13); + ibz_set(&(cmp[2][0]), -13); + ibz_set(&(mat[1][1]), 20); + ibz_set(&(cmp[1][1]), -20); + ibz_set(&(mat[3][2]), -77); + ibz_set(&(cmp[3][2]), 77); ibz_set(&(mat[3][3]), 7); ibz_set(&(cmp[3][3]), -7); - ibz_mat_4x4_negate(&neg,&mat); - res = res || !ibz_mat_4x4_equal(&neg,&cmp); - if (res != 0){ + ibz_mat_4x4_negate(&neg, &mat); + res = res || !ibz_mat_4x4_equal(&neg, &cmp); + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_negate failed\n"); } ibz_mat_4x4_finalize(&neg); ibz_mat_4x4_finalize(&mat); ibz_mat_4x4_finalize(&cmp); - return(res); + return (res); } -//void ibz_mat_4x4_transpose(ibz_mat_4x4_t *transposed, const ibz_mat_4x4_t *mat) -int quat_test_dim4_ibz_mat_4x4_transpose(){ +// void ibz_mat_4x4_transpose(ibz_mat_4x4_t *transposed, const ibz_mat_4x4_t *mat) +int +quat_test_dim4_ibz_mat_4x4_transpose(void) +{ int res = 0; ibz_mat_4x4_t mat, transposed, cmp; ibz_mat_4x4_init(&transposed); @@ -288,159 +578,170 @@ int quat_test_dim4_ibz_mat_4x4_transpose(){ ibz_mat_4x4_init(&cmp); ibz_mat_4x4_zero(&mat); ibz_mat_4x4_zero(&cmp); - ibz_set(&(mat[0][0]),1); - ibz_set(&(cmp[0][0]),1); - ibz_set(&(mat[0][1]),2); - ibz_set(&(cmp[1][0]),2); - ibz_set(&(mat[0][2]),-7); - ibz_set(&(cmp[2][0]),-7); + ibz_set(&(mat[0][0]), 1); + ibz_set(&(cmp[0][0]), 1); + ibz_set(&(mat[0][1]), 2); + ibz_set(&(cmp[1][0]), 2); + ibz_set(&(mat[0][2]), -7); + ibz_set(&(cmp[2][0]), -7); ibz_set(&(mat[0][3]), 77); ibz_set(&(cmp[3][0]), 77); - ibz_set(&(mat[2][0]),13); - ibz_set(&(cmp[0][2]),13); - ibz_set(&(mat[1][1]),20); - ibz_set(&(cmp[1][1]),20); - ibz_set(&(mat[3][2]),-77); - ibz_set(&(cmp[2][3]),-77); + ibz_set(&(mat[2][0]), 13); + ibz_set(&(cmp[0][2]), 13); + ibz_set(&(mat[1][1]), 20); + ibz_set(&(cmp[1][1]), 20); + ibz_set(&(mat[3][2]), -77); + ibz_set(&(cmp[2][3]), -77); ibz_set(&(mat[3][3]), 7); ibz_set(&(cmp[3][3]), 7); - ibz_mat_4x4_transpose(&transposed,&mat); - res = res || !ibz_mat_4x4_equal(&transposed,&cmp); - if (res != 0){ + ibz_mat_4x4_transpose(&transposed, &mat); + res = res || !ibz_mat_4x4_equal(&transposed, &cmp); + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_transpose failed\n"); } ibz_mat_4x4_finalize(&transposed); ibz_mat_4x4_finalize(&mat); ibz_mat_4x4_finalize(&cmp); - return(res); + return (res); } -//void ibz_mat_4x4_zero(ibz_mat_4x4_t *zero); -int quat_test_dim4_ibz_mat_4x4_zero(){ +// void ibz_mat_4x4_zero(ibz_mat_4x4_t *zero); +int +quat_test_dim4_ibz_mat_4x4_zero(void) +{ int res = 0; ibz_mat_4x4_t mat, cmp; ibz_mat_4x4_init(&cmp); ibz_mat_4x4_init(&mat); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(cmp[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp[i][j]), 0); } } ibz_mat_4x4_zero(&mat); - res = res || !ibz_mat_4x4_equal(&cmp,&mat); - if (res != 0){ + res = res || !ibz_mat_4x4_equal(&cmp, &mat); + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_zero failed\n"); } ibz_mat_4x4_finalize(&cmp); ibz_mat_4x4_finalize(&mat); - return(res); + return (res); } -//void ibz_mat_4x4_identity(ibz_mat_4x4_t *id); -int quat_test_dim4_ibz_mat_4x4_identity(){ +// void ibz_mat_4x4_identity(ibz_mat_4x4_t *id); +int +quat_test_dim4_ibz_mat_4x4_identity(void) +{ int res = 0; ibz_mat_4x4_t mat, cmp; ibz_mat_4x4_init(&cmp); ibz_mat_4x4_init(&mat); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(cmp[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp[i][j]), 0); } - ibz_set(&(cmp[i][i]),1); + ibz_set(&(cmp[i][i]), 1); } ibz_mat_4x4_identity(&mat); - res = res || !ibz_mat_4x4_equal(&cmp,&mat); - if (res != 0){ + res = res || !ibz_mat_4x4_equal(&cmp, &mat); + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_identity failed\n"); } ibz_mat_4x4_finalize(&cmp); ibz_mat_4x4_finalize(&mat); - return(res); + return (res); } -//int ibz_mat_4x4_is_identity(const ibz_mat_4x4_t *mat); -int quat_test_dim4_ibz_mat_4x4_is_identity(){ +// int ibz_mat_4x4_is_identity(const ibz_mat_4x4_t *mat); +int +quat_test_dim4_ibz_mat_4x4_is_identity(void) +{ int res = 0; ibz_mat_4x4_t mat; ibz_mat_4x4_init(&mat); ibz_mat_4x4_identity(&mat); res = res || !ibz_mat_4x4_is_identity(&mat); - ibz_set(&(mat[0][1]),1); + ibz_set(&(mat[0][1]), 1); res = res || ibz_mat_4x4_is_identity(&mat); - ibz_set(&(mat[0][1]),0); - ibz_set(&(mat[3][3]),0); + ibz_set(&(mat[0][1]), 0); + ibz_set(&(mat[3][3]), 0); res = res || ibz_mat_4x4_is_identity(&mat); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_is_identity failed\n"); } ibz_mat_4x4_finalize(&mat); - return(res); + return (res); } -//int ibz_mat_4x4_equal(const ibz_mat_4x4_t *mat1, const ibz_mat_4x4_t *mat2); -int quat_test_dim4_ibz_mat_4x4_equal(){ +// int ibz_mat_4x4_equal(const ibz_mat_4x4_t *mat1, const ibz_mat_4x4_t *mat2); +int +quat_test_dim4_ibz_mat_4x4_equal(void) +{ int res = 0; - ibz_mat_4x4_t a,b; + ibz_mat_4x4_t a, b; ibz_mat_4x4_init(&a); ibz_mat_4x4_init(&b); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(a[i][j]),i+j); - ibz_set(&(b[i][j]),i+j); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(a[i][j]), i + j); + ibz_set(&(b[i][j]), i + j); } } - res = res || (!ibz_mat_4x4_equal(&a,&b)); + res = res || (!ibz_mat_4x4_equal(&a, &b)); - ibz_set(&(b[2][2]),2); - res = res || ibz_mat_4x4_equal(&a,&b); + ibz_set(&(b[2][2]), 2); + res = res || ibz_mat_4x4_equal(&a, &b); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_equal failed\n"); } ibz_mat_4x4_finalize(&a); ibz_mat_4x4_finalize(&b); - return(res); + return (res); } -//void ibz_mat_4x4_scalar_mul(ibz_mat_4x4_t *prod, const ibz_t *scalar, const ibz_mat_4x4_t *mat); -int quat_test_dim4_ibz_mat_4x4_scalar_mul(){ +// void ibz_mat_4x4_scalar_mul(ibz_mat_4x4_t *prod, const ibz_t *scalar, const ibz_mat_4x4_t *mat); +int +quat_test_dim4_ibz_mat_4x4_scalar_mul(void) +{ int res = 0; int s; ibz_t scalar; - ibz_mat_4x4_t prod,mat,cmp; + ibz_mat_4x4_t prod, mat, cmp; ibz_mat_4x4_init(&mat); ibz_mat_4x4_init(&cmp); ibz_mat_4x4_init(&prod); ibz_init(&scalar); s = 5; - ibz_set(&scalar,s); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),i+j); - ibz_set(&(cmp[i][j]),(i+j)*s); + ibz_set(&scalar, s); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), i + j); + ibz_set(&(cmp[i][j]), (i + j) * s); } } - ibz_mat_4x4_scalar_mul(&prod,&scalar,&mat); - res = res || (!ibz_mat_4x4_equal(&prod,&cmp)); + ibz_mat_4x4_scalar_mul(&prod, &scalar, &mat); + res = res || (!ibz_mat_4x4_equal(&prod, &cmp)); + ibz_mat_4x4_scalar_mul(&mat, &scalar, &mat); + res = res || (!ibz_mat_4x4_equal(&mat, &cmp)); - ibz_mat_4x4_scalar_mul(&mat,&scalar,&mat); - res = res || (!ibz_mat_4x4_equal(&mat,&cmp)); - - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_scalar_mul failed\n"); } ibz_mat_4x4_finalize(&mat); ibz_mat_4x4_finalize(&cmp); ibz_mat_4x4_finalize(&prod); ibz_finalize(&scalar); - return(res); + return (res); } // void ibz_mat_4x4_gcd(ibz_t *gcd, const ibz_mat_4x4_t *mat); -int quat_test_dim4_ibz_mat_4x4_gcd(){ +int +quat_test_dim4_ibz_mat_4x4_gcd(void) +{ int res = 0; int d; ibz_t cmp, gcd; @@ -448,736 +749,80 @@ int quat_test_dim4_ibz_mat_4x4_gcd(){ ibz_mat_4x4_init(&mat); ibz_init(&cmp); ibz_init(&gcd); - + d = 2; - ibz_set(&cmp,d); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),d*i*j); + ibz_set(&cmp, d); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), d * i * j); } } - ibz_mat_4x4_gcd(&gcd,&mat); - res = res || ibz_cmp(&gcd,&cmp); + ibz_mat_4x4_gcd(&gcd, &mat); + res = res || ibz_cmp(&gcd, &cmp); d = 21; - ibz_set(&cmp,d); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),d*i*j); + ibz_set(&cmp, d); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), d * i * j); } } - ibz_mat_4x4_gcd(&gcd,&mat); - res = res || ibz_cmp(&gcd,&cmp); + ibz_mat_4x4_gcd(&gcd, &mat); + res = res || ibz_cmp(&gcd, &cmp); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_gcd failed\n"); } ibz_mat_4x4_finalize(&mat); ibz_finalize(&cmp); ibz_finalize(&gcd); - return(res); + return (res); } -//int ibz_mat_4x4_scalar_div(ibz_mat_4x4_t *quot, const ibz_t *scalar, const ibz_mat_4x4_t *mat); -int quat_test_dim4_ibz_mat_4x4_scalar_div(){ +// int ibz_mat_4x4_scalar_div(ibz_mat_4x4_t *quot, const ibz_t *scalar, const ibz_mat_4x4_t *mat); +int +quat_test_dim4_ibz_mat_4x4_scalar_div(void) +{ int res = 0; int s; ibz_t scalar; - ibz_mat_4x4_t quot,mat,cmp; + ibz_mat_4x4_t quot, mat, cmp; ibz_mat_4x4_init(&mat); ibz_mat_4x4_init(&cmp); ibz_mat_4x4_init("); ibz_init(&scalar); s = 5; - ibz_set(&scalar,s); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),(i+j)*s); - ibz_set(&(cmp[i][j]),(i+j)); + ibz_set(&scalar, s); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), (i + j) * s); + ibz_set(&(cmp[i][j]), (i + j)); } } - ibz_mat_4x4_scalar_div(",&scalar,&mat); - res = res || (!ibz_mat_4x4_equal(",&cmp)); + ibz_mat_4x4_scalar_div(", &scalar, &mat); + res = res || (!ibz_mat_4x4_equal(", &cmp)); - ibz_mat_4x4_scalar_div(&mat,&scalar,&mat); - res = res || (!ibz_mat_4x4_equal(&mat,&cmp)); + ibz_mat_4x4_scalar_div(&mat, &scalar, &mat); + res = res || (!ibz_mat_4x4_equal(&mat, &cmp)); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_scalar_div failed\n"); } ibz_mat_4x4_finalize(&mat); ibz_mat_4x4_finalize(&cmp); ibz_mat_4x4_finalize("); ibz_finalize(&scalar); - return(res); + return (res); } - -//int ibz_mat_4x4_is_hnf(const ibz_mat_4x4_t *mat); -int quat_test_dim4_is_hnf(){ +// void ibz_inv_dim4_make_coeff_pmp(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, +// const ibz_t *b2, const ibz_t *c1, const ibz_t *c2); +int +quat_test_dim4_ibz_inv_dim4_make_coeff_pmp(void) +{ int res = 0; - ibz_mat_4x4_t mat; - ibz_mat_4x4_init(&mat); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),0); - } - } - res = res || (!ibz_mat_4x4_is_hnf(&mat)); - ibz_set(&(mat[0][0]),7); - ibz_set(&(mat[0][1]),6); - ibz_set(&(mat[0][2]),5); - ibz_set(&(mat[0][3]),4); - ibz_set(&(mat[1][1]),6); - ibz_set(&(mat[1][2]),5); - ibz_set(&(mat[1][3]),4); - ibz_set(&(mat[2][2]),5); - ibz_set(&(mat[2][3]),4); - ibz_set(&(mat[3][3]),4); - res = res || (!ibz_mat_4x4_is_hnf(&mat)); - - ibz_set(&(mat[0][0]),7); - ibz_set(&(mat[0][1]),0); - ibz_set(&(mat[0][2]),5); - ibz_set(&(mat[0][3]),4); - ibz_set(&(mat[1][1]),0); - ibz_set(&(mat[1][2]),0); - ibz_set(&(mat[1][3]),0); - ibz_set(&(mat[2][2]),5); - ibz_set(&(mat[2][3]),4); - ibz_set(&(mat[3][3]),4); - res = res || (!ibz_mat_4x4_is_hnf(&mat)); - - // negative tests - ibz_set(&(mat[0][0]),7); - ibz_set(&(mat[0][1]),0); - ibz_set(&(mat[0][2]),5); - ibz_set(&(mat[0][3]),4); - ibz_set(&(mat[1][1]),1); - ibz_set(&(mat[1][2]),5); - ibz_set(&(mat[1][3]),9); - ibz_set(&(mat[2][2]),5); - ibz_set(&(mat[2][3]),4); - ibz_set(&(mat[3][3]),4); - res = res || (ibz_mat_4x4_is_hnf(&mat)); - - ibz_set(&(mat[0][0]),7); - ibz_set(&(mat[0][1]),0); - ibz_set(&(mat[0][2]),5); - ibz_set(&(mat[0][3]),4); - ibz_set(&(mat[1][1]),1); - ibz_set(&(mat[1][2]),-5); - ibz_set(&(mat[1][3]),1); - ibz_set(&(mat[2][2]),5); - ibz_set(&(mat[2][3]),4); - ibz_set(&(mat[3][3]),4); - res = res || (ibz_mat_4x4_is_hnf(&mat)); - - - ibz_set(&(mat[0][0]),7); - ibz_set(&(mat[0][1]),0); - ibz_set(&(mat[0][2]),5); - ibz_set(&(mat[0][3]),4); - ibz_set(&(mat[1][0]),2); - ibz_set(&(mat[1][1]),3); - ibz_set(&(mat[1][2]),1); - ibz_set(&(mat[1][3]),1); - ibz_set(&(mat[2][2]),5); - ibz_set(&(mat[2][3]),4); - ibz_set(&(mat[3][3]),4); - res = res || (ibz_mat_4x4_is_hnf(&mat)); - - - ibz_set(&(mat[0][0]),7); - ibz_set(&(mat[0][1]),0); - ibz_set(&(mat[0][2]),5); - ibz_set(&(mat[0][3]),4); - ibz_set(&(mat[1][0]),2); - ibz_set(&(mat[1][1]),3); - ibz_set(&(mat[1][2]),-1); - ibz_set(&(mat[1][3]),7); - ibz_set(&(mat[2][2]),0); - ibz_set(&(mat[2][3]),0); - ibz_set(&(mat[3][3]),4); - res = res || (ibz_mat_4x4_is_hnf(&mat)); - - if (res != 0){ - printf("Quaternion unit test dim4_ibz_mat_4x4_is_hnf failed\n"); - } - ibz_mat_4x4_finalize(&mat); - return(res); -} - - -//void ibz_mat_4x8_hnf_core(ibz_mat_4x4_t *hnf, const ibz_mat_4x8_t *generators); -int quat_test_dim4_ibz_mat_4x8_hnf_core(){ - int res = 0; - ibz_mat_4x8_t mat; - ibz_mat_4x4_t hnf,cmp; - ibz_mat_4x8_init(&mat); - ibz_mat_4x4_init(&hnf); - ibz_mat_4x4_init(&cmp); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 8; j++){ - ibz_set(&(mat[i][j]),0); - } - } - ibz_mat_4x8_hnf_core(&hnf,&mat); - res = res || (!ibz_mat_4x4_is_hnf(&hnf)); - // also should test that they generate the same lattice. Since HNF is unique, copute the HNF for test vectors might be ok - - ibz_set(&(mat[0][2]),2); - ibz_set(&(mat[1][3]),3); - ibz_set(&(mat[0][4]),4); - ibz_set(&(mat[3][2]),5); - ibz_set(&(mat[3][7]),6); - ibz_set(&(mat[1][7]),7); - ibz_set(&(mat[1][3]),8); - ibz_set(&(mat[1][1]),9); - ibz_set(&(mat[0][6]),10); - ibz_set(&(mat[0][5]),11); - ibz_set(&(mat[0][0]),12); - ibz_mat_4x8_hnf_core(&hnf,&mat); - res = res || (!ibz_mat_4x4_is_hnf(&hnf)); - - ibz_set(&(mat[2][5]),1); - ibz_set(&(mat[2][0]),2); - ibz_mat_4x8_hnf_core(&hnf,&mat); - res = res || (!ibz_mat_4x4_is_hnf(&hnf)); - - // test equality of result to a known hnf - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 8; j++){ - ibz_set(&(mat[i][j]),0); - } - } - ibz_set(&(mat[0][0]),4); - ibz_set(&(mat[0][2]),3); - ibz_set(&(mat[0][4]),1); - ibz_set(&(mat[0][7]),-1); - ibz_set(&(mat[1][1]),5); - ibz_set(&(mat[1][5]),-2); - ibz_set(&(mat[2][2]),3); - ibz_set(&(mat[2][6]),1); - ibz_set(&(mat[2][5]),1); - ibz_set(&(mat[3][3]),7); - ibz_set(&(mat[3][7]),-3); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(cmp[i][j]),0); - } - ibz_set(&(cmp[i][i]),1); - } - ibz_mat_4x8_hnf_core(&hnf,&mat); - res = res || (!ibz_mat_4x4_equal(&cmp,&hnf)); - - // test known hnf encountered in - // https://github.com/SQISign/sqisign-nist/issues/38#issuecomment-1554585079 - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 8; j++){ - ibz_set(&(mat[i][j]),0); - } - } - ibz_set(&(mat[0][4]),438); - ibz_set(&(mat[1][4]),400); - ibz_set(&(mat[2][4]),156); - ibz_set(&(mat[3][4]),-2); - ibz_set(&(mat[0][5]),-400); - ibz_set(&(mat[1][5]),438); - ibz_set(&(mat[2][5]),2); - ibz_set(&(mat[3][5]),156); - ibz_set(&(mat[0][6]),-28826); - ibz_set(&(mat[1][6]),-148); - ibz_set(&(mat[2][6]),220); - ibz_set(&(mat[3][6]),-122); - ibz_set(&(mat[0][7]),586); - ibz_set(&(mat[1][7]),-28426); - ibz_set(&(mat[2][7]),278); - ibz_set(&(mat[3][7]),218); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(cmp[i][j]),0); - } - } - ibz_set(&(cmp[0][0]),2321156); - ibz_set(&(cmp[1][1]),2321156); - ibz_set(&(cmp[0][2]),620252); - ibz_set(&(cmp[1][2]),365058); - ibz_set(&(cmp[2][2]),2); - ibz_set(&(cmp[0][3]),1956098); - ibz_set(&(cmp[1][3]),620252); - ibz_set(&(cmp[3][3]),2); - ibz_mat_4x8_hnf_core(&hnf,&mat); - res = res || (!ibz_mat_4x4_equal(&cmp,&hnf)); - - if (res != 0){ - printf("Quaternion unit test dim4_ibz_mat_4x8_hnf_core failed\n"); - } - ibz_mat_4x8_finalize(&mat); - ibz_mat_4x4_finalize(&hnf); - ibz_mat_4x4_finalize(&cmp); - return(res); -} - -//void ibz_mat_4x4_hnf_mod(ibz_mat_4x4_t *hnf, const ibz_mat_4x4_t *mat, const ibz_t *mod); -int quat_test_dim4_ibz_mat_4x4_hnf_mod(){ - int res = 0; - ibz_mat_4x4_t hnf, mat, cmp; - ibz_t mod; - ibz_mat_4x4_init(&hnf); - ibz_mat_4x4_init(&mat); - ibz_mat_4x4_init(&cmp); - ibz_init(&mod); - - ibz_set(&mod,3); - ibz_set(&(mat[0][0]), 4); - ibz_set(&(mat[0][1]), 0); - ibz_set(&(mat[0][2]), 3); - ibz_set(&(mat[0][3]), 0); - ibz_set(&(mat[1][0]), 0); - ibz_set(&(mat[1][1]), 5); - ibz_set(&(mat[1][2]), 0); - ibz_set(&(mat[1][3]), 0); - ibz_set(&(mat[2][0]), 3); - ibz_set(&(mat[2][1]), -1); - ibz_set(&(mat[2][2]), 3); - ibz_set(&(mat[2][3]), -5); - ibz_set(&(mat[3][0]), 7); - ibz_set(&(mat[3][1]), 0); - ibz_set(&(mat[3][2]), 0); - ibz_set(&(mat[3][3]), 11); - - ibz_set(&(cmp[0][0]), 3); - ibz_set(&(cmp[0][1]), 2); - ibz_set(&(cmp[0][2]), 1); - ibz_set(&(cmp[0][3]), 1); - ibz_set(&(cmp[1][0]), 0); - ibz_set(&(cmp[1][1]), 1); - ibz_set(&(cmp[1][2]), 0); - ibz_set(&(cmp[1][3]), 0); - ibz_set(&(cmp[2][0]), 0); - ibz_set(&(cmp[2][1]), 0); - ibz_set(&(cmp[2][2]), 1); - ibz_set(&(cmp[2][3]), 0); - ibz_set(&(cmp[3][0]), 0); - ibz_set(&(cmp[3][1]), 0); - ibz_set(&(cmp[3][2]), 0); - ibz_set(&(cmp[3][3]), 1); - - ibz_mat_4x4_hnf_mod(&hnf, &mat, &mod); - res = res || !ibz_mat_4x4_equal(&hnf,&cmp); - - ibz_set(&mod,100); - ibz_set(&(mat[0][0]), 12); - ibz_set(&(mat[0][1]), -111); - ibz_set(&(mat[0][2]), 12); - ibz_set(&(mat[0][3]), -345); - ibz_set(&(mat[1][0]), 1134); - ibz_set(&(mat[1][1]), -2); - ibz_set(&(mat[1][2]), 56); - ibz_set(&(mat[1][3]), 72); - ibz_set(&(mat[2][0]), 8); - ibz_set(&(mat[2][1]), 231); - ibz_set(&(mat[2][2]), -21); - ibz_set(&(mat[2][3]), 22); - ibz_set(&(mat[3][0]), 30); - ibz_set(&(mat[3][1]), 34); - ibz_set(&(mat[3][2]), 5); - ibz_set(&(mat[3][3]), -33); - - ibz_set(&(cmp[0][0]), 4); - ibz_set(&(cmp[0][1]), 2); - ibz_set(&(cmp[0][2]), 3); - ibz_set(&(cmp[0][3]), 3); - ibz_set(&(cmp[1][0]), 0); - ibz_set(&(cmp[1][1]), 2); - ibz_set(&(cmp[1][2]), 0); - ibz_set(&(cmp[1][3]), 0); - ibz_set(&(cmp[2][0]), 0); - ibz_set(&(cmp[2][1]), 0); - ibz_set(&(cmp[2][2]), 1); - ibz_set(&(cmp[2][3]), 0); - ibz_set(&(cmp[3][0]), 0); - ibz_set(&(cmp[3][1]), 0); - ibz_set(&(cmp[3][2]), 0); - ibz_set(&(cmp[3][3]), 1); - - ibz_mat_4x4_hnf_mod(&hnf, &mat, &mod); - res = res || !ibz_mat_4x4_equal(&hnf,&cmp); - - ibz_set(&mod,3); - ibz_set(&(cmp[0][0]), 3); - ibz_set(&(cmp[0][1]), 0); - ibz_set(&(cmp[0][2]), 0); - ibz_set(&(cmp[0][3]), 0); - ibz_set(&(cmp[1][0]), 0); - ibz_set(&(cmp[1][1]), 3); - ibz_set(&(cmp[1][2]), 0); - ibz_set(&(cmp[1][3]), 1); - ibz_set(&(cmp[2][0]), 0); - ibz_set(&(cmp[2][1]), 0); - ibz_set(&(cmp[2][2]), 1); - ibz_set(&(cmp[2][3]), 0); - ibz_set(&(cmp[3][0]), 0); - ibz_set(&(cmp[3][1]), 0); - ibz_set(&(cmp[3][2]), 0); - ibz_set(&(cmp[3][3]), 1); - - ibz_mat_4x4_hnf_mod(&mat, &mat, &mod); - res = res || !ibz_mat_4x4_equal(&mat,&cmp); - - if (res != 0){ - printf("Quaternion unit test dim4_ibz_mat_4x4_hnf_mod failed\n"); - } - ibz_mat_4x4_finalize(&hnf); - ibz_mat_4x4_finalize(&mat); - ibz_mat_4x4_finalize(&cmp); - ibz_finalize(&mod); - return(res); -} - - -// test for lll verification -//void ibq_vec_4_copy_ibz(ibq_t (*vec)[4], const ibz_t *coeff0, const ibz_t *coeff1,const ibz_t *coeff2,const ibz_t *coeff3); -int quat_test_dim4_ibq_vec_4_copy_ibz(){ - int res = 0; - ibq_t vec[4]; - ibz_vec_4_t vec_z; - ibz_vec_4_init(&vec_z); - ibq_init(&(vec[0])); - ibq_init(&(vec[1])); - ibq_init(&(vec[2])); - ibq_init(&(vec[3])); - ibz_vec_4_set(&vec_z,2,3,4,5); - ibq_vec_4_copy_ibz(&vec,&(vec_z[0]),&(vec_z[1]),&(vec_z[2]),&(vec_z[3])); - for(int i = 0; i <4; i++){ - ibq_to_ibz(&(vec_z[i]),&(vec[i])); - res = res || !(ibz_get(&(vec_z[i]))==i+2); - } - - if (res != 0){ - printf("Quaternion unit test dim4_ibq_vec_4_copy_ibz failed\n"); - } - ibz_vec_4_finalize(&vec_z); - ibq_finalize(&(vec[0])); - ibq_finalize(&(vec[1])); - ibq_finalize(&(vec[2])); - ibq_finalize(&(vec[3])); - return(res); -} - -//void quat_dim4_lll_bilinear(ibq_t *b, const ibq_t (*vec0)[4], const ibq_t (*vec1)[4], const ibz_t *q); -int quat_test_dim4_lll_bilinear(){ - int res = 0; - ibz_vec_4_t init_helper; - ibq_t vec0[4]; - ibq_t vec1[4]; - ibz_t q; - ibq_t cmp, b; - ibz_vec_4_init(&init_helper); - ibq_init(&cmp); - ibq_init(&b); - ibz_init(&q); - for(int i = 0; i <4; i++){ - ibq_init(&(vec0[i])); - ibq_init(&(vec1[i])); - } - ibz_vec_4_set(&init_helper,1,2,3,4); - ibq_vec_4_copy_ibz(&vec0,&(init_helper[0]),&(init_helper[1]),&(init_helper[2]),&(init_helper[3])); - ibz_vec_4_set(&init_helper,9,-8,7,-6); - ibq_vec_4_copy_ibz(&vec1,&(init_helper[0]),&(init_helper[1]),&(init_helper[2]),&(init_helper[3])); - for(int i = 0; i <4; i++){ - ibq_inv(&(vec0[i]),&(vec0[i])); - } - ibz_set(&q,3); - ibz_vec_4_set(&init_helper,15,2,0,0); - ibq_set(&cmp,&(init_helper[0]),&(init_helper[1])); - quat_dim4_lll_bilinear(&b,&vec0,&vec1,&q); - res = res || (ibq_cmp(&b,&cmp)); - - if (res != 0){ - printf("Quaternion unit test quat_dim4_lll_bilinear failed\n"); - } - ibq_finalize(&cmp); - ibq_finalize(&b); - ibz_finalize(&q); - ibz_vec_4_finalize(&init_helper); - for(int i = 0; i <4; i++){ - ibq_finalize(&(vec0[i])); - ibq_finalize(&(vec1[i])); - } - return(res); -} - -//void quat_dim4_gram_schmidt_transposed_with_ibq(ibq_t (*orthogonalised_transposed)[4][4], const ibz_mat_4x4_t *mat, const ibz_t *q); -int quat_test_dim4_gram_schmidt_transposed_with_ibq(){ - int res = 0; - int zero; - ibq_t ot[4][4]; - ibq_t cmp[4][4]; - ibz_mat_4x4_t mat; - ibz_t q, num, denom; - ibq_t b; - ibz_init(&q); - ibz_init(&num); - ibz_init(&denom); - ibq_init(&b); - ibz_mat_4x4_init(&mat); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_init(&(cmp[i][j])); - ibq_init(&(ot[i][j])); - } - } - - - ibz_mat_4x4_zero(&mat); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]), i*i+(j+5)*j-2+(i==j)); - } - } - ibz_set(&q,3); - quat_dim4_gram_schmidt_transposed_with_ibq(&ot,&mat,&q); - // test orthogonality - for(int i = 0; i < 4; i++){ - for(int j = i+1; j < 4; j++){ - quat_dim4_lll_bilinear(&b,&(ot[i]),&(ot[j]),&q); - res = res || !ibq_is_zero(&b); - } - } - // test first vector is identical to mat - for(int i = 0; i < 4; i++){ - ibq_to_ibz(&q,&(ot[0][i])); - res = res || ibz_cmp(&q,&(mat[i][0])); - } - // test no zero vector - for(int i = 0; i < 4; i++){ - zero = 1; - for(int j = 0; j < 4; j++){ - zero = zero && ibq_is_zero(&(ot[i][j])); - } - res = res || zero; - } - - ibz_set(&(mat[0][0]), 1); - ibz_set(&(mat[0][1]), 0); - ibz_set(&(mat[0][2]), 1); - ibz_set(&(mat[0][3]), 0); - ibz_set(&(mat[1][0]), 0); - ibz_set(&(mat[1][1]), 1); - ibz_set(&(mat[1][2]), 0); - ibz_set(&(mat[1][3]), 1); - ibz_set(&(mat[2][0]), 1); - ibz_set(&(mat[2][1]), 0); - ibz_set(&(mat[2][2]), 2); - ibz_set(&(mat[2][3]), 0); - ibz_set(&(mat[3][0]), 0); - ibz_set(&(mat[3][1]), 1); - ibz_set(&(mat[3][2]), 0); - ibz_set(&(mat[3][3]), 2); - ibz_set(&denom,1); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_set(&(cmp[i][j]),&(mat[j][i]),&denom); - } - } - ibz_set(&denom,3); - ibz_set(&num,-2); - ibq_set(&(cmp[2][0]),&num,&denom); - ibq_set(&(cmp[3][1]),&num,&denom); - ibz_set(&num,1); - ibq_set(&(cmp[2][2]),&num,&denom); - ibq_set(&(cmp[3][3]),&num,&denom); - ibz_set(&q,2); - quat_dim4_gram_schmidt_transposed_with_ibq(&ot,&mat,&q); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - res = res || ibq_cmp(&(cmp[i][j]),&(ot[i][j])); - } - } - - ibz_set(&(mat[0][0]), 1); - ibz_set(&(mat[0][1]), 0); - ibz_set(&(mat[0][2]), 1); - ibz_set(&(mat[0][3]), 0); - ibz_set(&(mat[1][0]), 0); - ibz_set(&(mat[1][1]), 1); - ibz_set(&(mat[1][2]), 0); - ibz_set(&(mat[1][3]), 1); - ibz_set(&(mat[2][0]), 1); - ibz_set(&(mat[2][1]), 0); - ibz_set(&(mat[2][2]), 2); - ibz_set(&(mat[2][3]), 1); - ibz_set(&(mat[3][0]), 0); - ibz_set(&(mat[3][1]), 1); - ibz_set(&(mat[3][2]), 0); - ibz_set(&(mat[3][3]), 2); - ibz_set(&denom,1); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_set(&(cmp[i][j]),&(mat[j][i]),&denom); - } - } - ibz_set(&denom,3); - ibz_set(&num,-2); - ibq_set(&(cmp[2][0]),&num,&denom); - ibq_set(&(cmp[3][1]),&num,&denom); - ibz_set(&num,1); - ibq_set(&(cmp[2][2]),&num,&denom); - ibq_set(&(cmp[3][3]),&num,&denom); - ibz_set(&num,0); - ibq_set(&(cmp[3][0]),&num,&denom); - ibq_set(&(cmp[3][2]),&num,&denom); - ibz_set(&q,2); - quat_dim4_gram_schmidt_transposed_with_ibq(&ot,&mat,&q); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - res = res || ibq_cmp(&(cmp[i][j]),&(ot[i][j])); - } - } - - if (res != 0){ - printf("Quaternion unit test dim4_gram_schmidt_transposed_with_ibq failed\n"); - } - ibz_finalize(&q); - ibz_finalize(&num); - ibz_finalize(&denom); - ibq_finalize(&b); - ibz_mat_4x4_finalize(&mat); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibq_finalize(&(ot[i][j])); - ibq_finalize(&(cmp[i][j])); - } - } - return(res); -} - - - -//int quat_dim4_lll_verify(const ibz_mat_4x4_t *mat, const ibq_t *coeff, const ibz_t *q); -int quat_test_dim4_lll_verify(){ - int res = 0; - ibz_mat_4x4_t mat; - ibz_t q, coeff_num, coeff_denom; - ibq_t coeff; - ibz_mat_4x4_init(&mat); - ibz_init(&q); - ibq_init(&coeff); - ibz_init(&coeff_num); - ibz_init(&coeff_denom); - - ibz_mat_4x4_identity(&mat); - ibz_set(&q,1); - ibz_set(&coeff_num,1); - ibz_set(&coeff_denom,1); - ibq_set(&coeff,&coeff_num,&coeff_denom); - res = res || !quat_dim4_lll_verify(&mat,&coeff,&q); - - // non reduced - ibz_set(&q,1); - ibz_set(&coeff_num,99); - ibz_set(&coeff_denom,100); - ibq_set(&coeff,&coeff_num,&coeff_denom); - ibz_mat_4x4_identity(&mat); - ibz_set(&(mat[0][0]),50); - res = res || quat_dim4_lll_verify(&mat,&coeff,&q); - - // non reduced - ibz_set(&q,1); - ibz_set(&coeff_num,99); - ibz_set(&coeff_denom,100); - ibq_set(&coeff,&coeff_num,&coeff_denom); - ibz_mat_4x4_identity(&mat); - ibz_set(&(mat[0][1]),4); - res = res || quat_dim4_lll_verify(&mat,&coeff,&q); - - // reduced - ibz_set(&q,1); - ibz_set(&coeff_num,99); - ibz_set(&coeff_denom,100); - ibq_set(&coeff,&coeff_num,&coeff_denom); - ibz_set(&(mat[0][0]), 0); - ibz_set(&(mat[0][1]), 2); - ibz_set(&(mat[0][2]), 1); - ibz_set(&(mat[0][3]), -7); - ibz_set(&(mat[1][0]), 2); - ibz_set(&(mat[1][1]), -1); - ibz_set(&(mat[1][2]), -1); - ibz_set(&(mat[1][3]), -6); - ibz_set(&(mat[2][0]), 1); - ibz_set(&(mat[2][1]), -2); - ibz_set(&(mat[2][2]), 4); - ibz_set(&(mat[2][3]), 1); - ibz_set(&(mat[3][0]), 1); - ibz_set(&(mat[3][1]), 1); - ibz_set(&(mat[3][2]), 0); - ibz_set(&(mat[3][3]), 13); - res = res || !quat_dim4_lll_verify(&mat,&coeff,&q); - - // reduced: non-1 norm - ibz_set(&q,3); - ibz_set(&coeff_num,99); - ibz_set(&coeff_denom,100); - ibq_set(&coeff,&coeff_num,&coeff_denom); - ibz_set(&(mat[0][0]), 0); - ibz_set(&(mat[0][1]), 2); - ibz_set(&(mat[0][2]), 3); - ibz_set(&(mat[0][3]), -14); - ibz_set(&(mat[1][0]), 2); - ibz_set(&(mat[1][1]), -1); - ibz_set(&(mat[1][2]), -4); - ibz_set(&(mat[1][3]), -8); - ibz_set(&(mat[2][0]), 1); - ibz_set(&(mat[2][1]), -2); - ibz_set(&(mat[2][2]), 1); - ibz_set(&(mat[2][3]), 0); - ibz_set(&(mat[3][0]), 1); - ibz_set(&(mat[3][1]), 1); - ibz_set(&(mat[3][2]), 0); - ibz_set(&(mat[3][3]), 7); - res = res || !quat_dim4_lll_verify(&mat,&coeff,&q); - - // reduced: non-1 norm - ibz_set(&q,103); - ibz_set(&coeff_num,99); - ibz_set(&coeff_denom,100); - ibq_set(&coeff,&coeff_num,&coeff_denom); - ibz_set(&(mat[0][0]), 3); - ibz_set(&(mat[0][1]), 0); - ibz_set(&(mat[0][2]), 90); - ibz_set(&(mat[0][3]), -86); - ibz_set(&(mat[1][0]), 11); - ibz_set(&(mat[1][1]), 15); - ibz_set(&(mat[1][2]), 12); - ibz_set(&(mat[1][3]), 50); - ibz_set(&(mat[2][0]), 1); - ibz_set(&(mat[2][1]), -2); - ibz_set(&(mat[2][2]), 0); - ibz_set(&(mat[2][3]), 3); - ibz_set(&(mat[3][0]), -1); - ibz_set(&(mat[3][1]), 0); - ibz_set(&(mat[3][2]), 5); - ibz_set(&(mat[3][3]), 5); - res = res || !quat_dim4_lll_verify(&mat,&coeff,&q); - - if (res != 0){ - printf("Quaternion unit test quat_dim4_lll_verify failed\n"); - } - ibz_finalize(&q); - ibq_finalize(&coeff); - ibz_finalize(&coeff_num); - ibz_finalize(&coeff_denom); - ibz_mat_4x4_finalize(&mat); - return(res); -} - -//void ibz_inv_dim4_make_coeff_pmp(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, const ibz_t *b2, const ibz_t *c1, const ibz_t *c2); -int quat_test_dim4_ibz_inv_dim4_make_coeff_pmp(){ - int res = 0; - ibz_t coeff,cmp,a1,a2,b1,b2, c1, c2; + ibz_t coeff, cmp, a1, a2, b1, b2, c1, c2; ibz_init(&a1); ibz_init(&a2); ibz_init(&b1); @@ -1187,32 +832,32 @@ int quat_test_dim4_ibz_inv_dim4_make_coeff_pmp(){ ibz_init(&coeff); ibz_init(&cmp); - ibz_set(&a1,0); - ibz_set(&a2,3); - ibz_set(&b1,-1); - ibz_set(&b2,0); - ibz_set(&c1,-1); - ibz_set(&c2,0); - ibz_set(&cmp,0); - ibz_inv_dim4_make_coeff_pmp(&coeff,&a1,&a2,&b1,&b2, &c1,&c2); - res = res || ibz_cmp(&cmp,&coeff); + ibz_set(&a1, 0); + ibz_set(&a2, 3); + ibz_set(&b1, -1); + ibz_set(&b2, 0); + ibz_set(&c1, -1); + ibz_set(&c2, 0); + ibz_set(&cmp, 0); + ibz_inv_dim4_make_coeff_pmp(&coeff, &a1, &a2, &b1, &b2, &c1, &c2); + res = res || ibz_cmp(&cmp, &coeff); - ibz_set(&a1,2); - ibz_set(&a2,3); - ibz_set(&b1,-1); - ibz_set(&b2,1); - ibz_set(&c1,-4); - ibz_set(&c2,2); - ibz_set(&cmp,-1); - ibz_inv_dim4_make_coeff_pmp(&coeff,&a1,&a2,&b1,&b2, &c1,&c2); - res = res || ibz_cmp(&cmp,&coeff); + ibz_set(&a1, 2); + ibz_set(&a2, 3); + ibz_set(&b1, -1); + ibz_set(&b2, 1); + ibz_set(&c1, -4); + ibz_set(&c2, 2); + ibz_set(&cmp, -1); + ibz_inv_dim4_make_coeff_pmp(&coeff, &a1, &a2, &b1, &b2, &c1, &c2); + res = res || ibz_cmp(&cmp, &coeff); - ibz_set(&a1,2); - ibz_set(&cmp,4); - ibz_inv_dim4_make_coeff_pmp(&a1,&a1,&a1,&a1,&a1, &a1,&a1); - res = res || ibz_cmp(&cmp,&a1); + ibz_set(&a1, 2); + ibz_set(&cmp, 4); + ibz_inv_dim4_make_coeff_pmp(&a1, &a1, &a1, &a1, &a1, &a1, &a1); + res = res || ibz_cmp(&cmp, &a1); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_inv_dim4_make_coeff_pmp failed\n"); } ibz_finalize(&a1); @@ -1226,10 +871,13 @@ int quat_test_dim4_ibz_inv_dim4_make_coeff_pmp(){ return res; } -//void ibz_inv_make_coeff_mpm(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, const ibz_t *b2, const ibz_t *c1, const ibz_t *c2); -int quat_test_dim4_ibz_inv_dim4_make_coeff_mpm(){ +// void ibz_inv_make_coeff_mpm(ibz_t *coeff, const ibz_t *a1, const ibz_t *a2, const ibz_t *b1, +// const ibz_t *b2, const ibz_t *c1, const ibz_t *c2); +int +quat_test_dim4_ibz_inv_dim4_make_coeff_mpm(void) +{ int res = 0; - ibz_t coeff,cmp,a1,a2,b1,b2, c1, c2; + ibz_t coeff, cmp, a1, a2, b1, b2, c1, c2; ibz_init(&a1); ibz_init(&a2); ibz_init(&b1); @@ -1239,34 +887,32 @@ int quat_test_dim4_ibz_inv_dim4_make_coeff_mpm(){ ibz_init(&coeff); ibz_init(&cmp); - ibz_set(&a1,0); - ibz_set(&a2,3); - ibz_set(&b1,-1); - ibz_set(&b2,0); - ibz_set(&c1,-1); - ibz_set(&c2,0); - ibz_set(&cmp,0); - ibz_inv_dim4_make_coeff_mpm(&coeff,&a1,&a2,&b1,&b2, &c1,&c2); - res = res || ibz_cmp(&cmp,&coeff); + ibz_set(&a1, 0); + ibz_set(&a2, 3); + ibz_set(&b1, -1); + ibz_set(&b2, 0); + ibz_set(&c1, -1); + ibz_set(&c2, 0); + ibz_set(&cmp, 0); + ibz_inv_dim4_make_coeff_mpm(&coeff, &a1, &a2, &b1, &b2, &c1, &c2); + res = res || ibz_cmp(&cmp, &coeff); - ibz_set(&a1,2); - ibz_set(&a2,3); - ibz_set(&b1,-1); - ibz_set(&b2,1); - ibz_set(&c1,-4); - ibz_set(&c2,2); - ibz_set(&cmp,1); - ibz_inv_dim4_make_coeff_mpm(&coeff,&a1,&a2,&b1,&b2, &c1,&c2); - res = res || ibz_cmp(&cmp,&coeff); + ibz_set(&a1, 2); + ibz_set(&a2, 3); + ibz_set(&b1, -1); + ibz_set(&b2, 1); + ibz_set(&c1, -4); + ibz_set(&c2, 2); + ibz_set(&cmp, 1); + ibz_inv_dim4_make_coeff_mpm(&coeff, &a1, &a2, &b1, &b2, &c1, &c2); + res = res || ibz_cmp(&cmp, &coeff); + ibz_set(&a1, 2); + ibz_set(&cmp, -4); + ibz_inv_dim4_make_coeff_mpm(&a1, &a1, &a1, &a1, &a1, &a1, &a1); + res = res || ibz_cmp(&cmp, &a1); - ibz_set(&a1,2); - ibz_set(&cmp,-4); - ibz_inv_dim4_make_coeff_mpm(&a1,&a1,&a1,&a1,&a1, &a1,&a1); - res = res || ibz_cmp(&cmp,&a1); - - - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_inv_dim4_make_coeff_mpm failed\n"); } ibz_finalize(&a1); @@ -1281,24 +927,30 @@ int quat_test_dim4_ibz_inv_dim4_make_coeff_mpm(){ } // returns 1 if inverse is valid, 0 otherwise -int quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(const ibz_mat_4x4_t *mat, const ibz_t *det, const ibz_mat_4x4_t *inv){ +int +quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(const ibz_mat_4x4_t *mat, + const ibz_t *det, + const ibz_mat_4x4_t *inv) +{ int res = 1; ibz_mat_4x4_t det_id, prod; ibz_mat_4x4_init(&det_id); ibz_mat_4x4_init(&prod); ibz_mat_4x4_identity(&det_id); - ibz_mat_4x4_scalar_mul(&det_id,det,&det_id); + ibz_mat_4x4_scalar_mul(&det_id, det, &det_id); ibz_mat_4x4_mul(&prod, inv, mat); - res = res && ibz_mat_4x4_equal(&det_id,&prod); + res = res && ibz_mat_4x4_equal(&det_id, &prod); ibz_mat_4x4_mul(&prod, mat, inv); - res = res && ibz_mat_4x4_equal(&det_id,&prod); + res = res && ibz_mat_4x4_equal(&det_id, &prod); ibz_mat_4x4_finalize(&det_id); ibz_mat_4x4_finalize(&prod); return res; } -//int ibz_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t mat); -int quat_test_dim4_ibz_mat_4x4_inv_with_det_as_denom(){ +// int ibz_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t mat); +int +quat_test_dim4_ibz_mat_4x4_inv_with_det_as_denom(void) +{ int res = 0; ibz_t det; ibz_mat_4x4_t mat, inv; @@ -1307,45 +959,45 @@ int quat_test_dim4_ibz_mat_4x4_inv_with_det_as_denom(){ ibz_mat_4x4_init(&inv); ibz_mat_4x4_zero(&mat); - res = res || ibz_mat_4x4_inv_with_det_as_denom(&inv,&det,&mat); + res = res || ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &mat); res = res || !ibz_is_zero(&det); ibz_mat_4x4_identity(&mat); - if(ibz_mat_4x4_inv_with_det_as_denom(&inv,&det,&mat)){ + if (ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &mat)) { res = res || !ibz_is_one(&det); - res = res || !quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(&inv,&det,&mat); + res = res || !quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(&inv, &det, &mat); } else { res = 1; } - ibz_set(&(mat[0][0]),2); - ibz_set(&(mat[0][1]),-17); - ibz_set(&(mat[0][2]),3); - ibz_set(&(mat[0][3]),5); - ibz_set(&(mat[1][1]),-2); - ibz_set(&(mat[1][2]),3); - ibz_set(&(mat[1][3]),2); - ibz_set(&(mat[2][2]),-3); - ibz_set(&(mat[2][3]),0); - ibz_set(&(mat[3][3]),1); - if(ibz_mat_4x4_inv_with_det_as_denom(&inv,&det,&mat)){ - res = res || (ibz_get(&det)!=12); - res = res || !quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(&inv,&det,&mat); + ibz_set(&(mat[0][0]), 2); + ibz_set(&(mat[0][1]), -17); + ibz_set(&(mat[0][2]), 3); + ibz_set(&(mat[0][3]), 5); + ibz_set(&(mat[1][1]), -2); + ibz_set(&(mat[1][2]), 3); + ibz_set(&(mat[1][3]), 2); + ibz_set(&(mat[2][2]), -3); + ibz_set(&(mat[2][3]), 0); + ibz_set(&(mat[3][3]), 1); + if (ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &mat)) { + res = res || (ibz_cmp_int32(&det, 12) != 0); + res = res || !quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(&inv, &det, &mat); } else { res = 1; } - ibz_set(&(mat[3][0]),1); - ibz_set(&(mat[3][1]),8); - ibz_set(&(mat[3][2]),-9); - ibz_set(&(mat[2][0]),3); - ibz_set(&(mat[2][1]),0); - ibz_set(&(mat[1][0]),4); - if(ibz_mat_4x4_inv_with_det_as_denom(&inv,&det,&mat)){ - res = res || (ibz_get(&det)!=-1503); - res = res || !quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(&inv,&det,&mat); + ibz_set(&(mat[3][0]), 1); + ibz_set(&(mat[3][1]), 8); + ibz_set(&(mat[3][2]), -9); + ibz_set(&(mat[2][0]), 3); + ibz_set(&(mat[2][1]), 0); + ibz_set(&(mat[1][0]), 4); + if (ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &mat)) { + res = res || (ibz_cmp_int32(&det, -1503) != 0); + res = res || !quat_test_dim4_validate_mat_4x4_rational_inv_if_exists(&inv, &det, &mat); } else { res = 1; } - - if (res != 0){ + + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_inv_with_det_as_denom failed\n"); } ibz_mat_4x4_finalize(&mat); @@ -1354,335 +1006,22 @@ int quat_test_dim4_ibz_mat_4x4_inv_with_det_as_denom(){ return res; } -// larger matrix modular kernel - -// returns 1 if product is 0 mod p, 0 otherwise -int quat_test_dim4_4x5_vec_5_mul_is_zero_mod(const ibz_mat_4x5_t *mat, const ibz_vec_5_t *vec, ibz_t *p){ - int res = 1; - ibz_t prod, sum; - ibz_init(&prod); - ibz_init(&sum); - for(int i = 0; i < 4; i++){ - ibz_set(&sum,0); - for(int j = 0; j < 5; j++){ - ibz_mul(&prod,&((*mat)[i][j]),&((*vec)[j])); - ibz_add(&sum,&sum,&prod); - ibz_mod(&sum,&sum,p); - } - res = res && ibz_is_zero(&sum); - } - ibz_finalize(&sum); - ibz_finalize(&prod); - return(res); -} - -//int ibz_4x5_right_ker_mod_prime(ibz_vec_5_t *ker, const ibz_mat_4x5_t *mat, const ibz_t *p); -int quat_test_dim4_ibz_4x5_right_ker_mod_prime(){ - int res = 0; - ibz_t prime; - ibz_mat_4x5_t mat; - ibz_vec_5_t ker; - ibz_mat_4x5_init(&mat); - ibz_vec_5_init(&ker); - ibz_init(&prime); - - // kernel has dimension 1 - ibz_set(&prime,5); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 5; j++){ - ibz_set(&(mat[i][j]),0); - } - } - ibz_set(&(mat[0][0]),2); - ibz_set(&(mat[1][1]),3); - ibz_set(&(mat[2][2]),3); - ibz_set(&(mat[1][3]),1); - ibz_set(&(mat[3][3]),2); - ibz_set(&(mat[3][2]),1); - ibz_set(&(mat[0][4]),1); - if (ibz_4x5_right_ker_mod_prime(&ker,&mat,&prime)){ - res = res || !quat_test_dim4_4x5_vec_5_mul_is_zero_mod(&mat,&ker,&prime); - } else { - res = 1; - } - - // too large kernel - ibz_set(&prime,5); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 5; j++){ - ibz_set(&(mat[i][j]),0); - } - } - res = res || ibz_4x5_right_ker_mod_prime(&ker,&mat,&prime); - ibz_set(&(mat[0][0]),1); - ibz_set(&(mat[2][2]),2); - ibz_set(&(mat[3][3]),3); - res = res || ibz_4x5_right_ker_mod_prime(&ker,&mat,&prime); - - if (res != 0){ - printf("Quaternion unit test dim4_ibz_4x5_right_ker_mod_prime failed\n"); - } - ibz_vec_5_finalize(&ker); - ibz_mat_4x5_finalize(&mat); - ibz_finalize(&prime); - return(res); -} - -// returns 1 if product is 0 mod p, 0 otherwise -int quat_test_dim4_4x4_vec_4_mul_is_zero_mod(const ibz_mat_4x4_t *mat, const ibz_vec_4_t *vec, ibz_t *p){ - int res = 1; - ibz_t prod, sum; - ibz_init(&prod); - ibz_init(&sum); - for(int i = 0; i < 4; i++){ - ibz_set(&sum,0); - for(int j = 0; j < 4; j++){ - ibz_mul(&prod,&((*mat)[i][j]),&((*vec)[j])); - ibz_add(&sum,&sum,&prod); - ibz_mod(&sum,&sum,p); - } - res = res && ibz_is_zero(&sum); - } - ibz_finalize(&sum); - ibz_finalize(&prod); - return(res); -} - -//int ibz_4x4_right_ker_mod_prime(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, const ibz_t *p); -int quat_test_dim4_ibz_4x4_right_ker_mod_prime(){ - int res = 0; - ibz_t prime; - ibz_mat_4x4_t mat; - ibz_vec_4_t ker; - ibz_mat_4x4_init(&mat); - ibz_vec_4_init(&ker); - ibz_init(&prime); - - // kernel has dimension 1 - ibz_set(&prime,5); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),0); - } - } - ibz_set(&(mat[0][0]),2); - ibz_set(&(mat[1][1]),3); - ibz_set(&(mat[2][2]),3); - ibz_set(&(mat[2][3]),1); - ibz_set(&(mat[3][3]),2); - ibz_set(&(mat[3][2]),1); - if (ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime)){ - res = res || !quat_test_dim4_4x4_vec_4_mul_is_zero_mod(&mat,&ker,&prime); - } else { - res = 1; - } - - // too large kernel - ibz_set(&prime,5); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),0); - } - } - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - ibz_set(&(mat[1][2]),2); - ibz_set(&(mat[3][3]),3); - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - - // too small kernel - ibz_set(&(mat[0][0]),1); - ibz_set(&(mat[1][1]),2); - ibz_set(&(mat[2][2]),3); - ibz_set(&(mat[3][3]),2); - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - - if (res != 0){ - printf("Quaternion unit test dim4_ibz_4x4_right_ker_mod_prime failed\n"); - } - ibz_vec_4_finalize(&ker); - ibz_mat_4x4_finalize(&mat); - ibz_finalize(&prime); - return(res); -} - -//int ibz_4x4_right_ker_mod_power_of_2(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, unsigned short exp); -int quat_test_dim4_ibz_4x4_right_ker_mod_power_of_2(){ - int res = 0; - int zero = 1; - - ibz_mat_4x4_t mat; - ibz_vec_4_t ker; - ibz_vec_4_t prod; - ibz_t q, r, two; - ibz_mat_4x4_init(&mat); - ibz_vec_4_init(&ker); - ibz_vec_4_init(&prod); - ibz_init(&q); - ibz_init(&r); - ibz_init(&two); - ibz_set(&two,2); - - // A diagonal matrix with an obvious kernel over the 2-adics - ibz_mat_4x4_zero(&mat); - ibz_set(&mat[0][0], 1); - ibz_set(&mat[1][1], 1); - ibz_set(&mat[2][1], 1); - ibz_set(&mat[3][3], 2); - - res |= ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, 60) != 1; - - res |= ibz_cmp_si(&ker[0], 0); - res |= ibz_cmp_si(&ker[1], 0); - res |= ibz_cmp_si(&ker[2], 1); - res |= ibz_cmp_si(&ker[3], 0); - - // such a vector does exist - ibz_mat_4x4_zero(&mat); - ibz_set(&mat[0][0], 4); - ibz_set(&mat[0][1], 21); - ibz_set(&mat[0][2], 0); - ibz_set(&mat[0][3], 2); - ibz_set(&mat[1][0], 82); - ibz_set(&mat[1][1], 21); - ibz_set(&mat[1][2], 0); - ibz_set(&mat[1][3], 22); - ibz_set(&mat[2][0], 22); - ibz_set(&mat[2][1], 128); - ibz_set(&mat[2][2], 22); - ibz_set(&mat[2][3], 108); - ibz_set(&mat[3][0], 32); - ibz_set(&mat[3][1], 10); - ibz_set(&mat[3][2], 4); - ibz_set(&mat[3][3], 4); - - if (ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, 6)){ - zero = 1; - ibz_mat_4x4_eval(&prod,&mat,&ker); - for (int i = 0; i < 4; i++){ - ibz_div(&q,&r,&(ker[i]),&two); - zero = zero && ibz_is_zero(&r); - ibz_pow(&q,&two,6); - ibz_mod(&(prod[i]),&(prod[i]),&q); - } - res |= !quat_alg_coord_is_zero(&prod); - res |= zero; - } else { - res = 1; - } - - // such a vector does exist (since 0 row) - ibz_mat_4x4_zero(&mat); - ibz_set(&mat[0][0], 1); - ibz_set(&mat[0][1], 1); - ibz_set(&mat[0][2], 2); - ibz_set(&mat[1][0], 3); - ibz_set(&mat[1][1], 9); - ibz_set(&mat[1][2], 9); - ibz_set(&mat[2][0], 7); - ibz_set(&mat[2][1], 1); - ibz_set(&mat[2][2], 8); - ibz_set(&mat[2][3], 5); - - if (ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, 6)){ - zero = 1; - ibz_mat_4x4_eval(&prod,&mat,&ker); - for (int i = 0; i < 4; i++){ - ibz_div(&q,&r,&(ker[i]),&two); - zero = zero && ibz_is_zero(&r); - ibz_pow(&q,&two,6); - ibz_mod(&(prod[i]),&(prod[i]),&q); - } - res |= !quat_alg_coord_is_zero(&prod); - res |= zero; - } else { - res = 1; - } - - - // Vector exists - ibz_mat_4x4_zero(&mat); - ibz_set(&mat[0][0], 1); - ibz_set(&mat[0][1], 1); - ibz_set(&mat[0][2], 2); - ibz_set(&mat[1][0], 3); - ibz_set(&mat[1][1], 9); - ibz_set(&mat[1][2], 0); - ibz_set(&mat[2][0], 7); - ibz_set(&mat[2][1], 1); - ibz_set(&mat[2][2], 8); - ibz_set(&mat[2][3], 5); - - res |= !ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, 6); - // Can check exact match, thanks to Howell form - res |= ibz_cmp_si(&ker[0], 43) != 0; - res |= ibz_cmp_si(&ker[1], 7) != 0; - res |= ibz_cmp_si(&ker[2], 7) != 0; - res |= ibz_cmp_si(&ker[3], 4) != 0; - - // Vector exists - ibz_mat_4x4_zero(&mat); - ibz_set(&mat[0][0], 1); - ibz_set(&mat[0][1], 1); - ibz_set(&mat[0][2], 2); - ibz_set(&mat[1][0], 3); - ibz_set(&mat[1][1], 9); - ibz_set(&mat[1][2], 0); - ibz_set(&mat[1][3], 1); - ibz_set(&mat[2][0], 7); - ibz_set(&mat[2][1], 1); - ibz_set(&mat[2][2], 1); - ibz_set(&mat[2][3], 5); - - res |= !ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, 6); - // Can check exact match, thanks to Howell form - res |= ibz_cmp_si(&ker[0], 31) != 0; - res |= ibz_cmp_si(&ker[1], 25) != 0; - res |= ibz_cmp_si(&ker[2], 4) != 0; - res |= ibz_cmp_si(&ker[3], 2) != 0; - - // such a vector does not exist, since bad kernel - ibz_mat_4x4_zero(&mat); - ibz_set(&mat[0][0], 1); - ibz_set(&mat[0][1], 1); - ibz_set(&mat[0][2], 2); - ibz_set(&mat[1][0], 3); - ibz_set(&mat[1][1], 9); - ibz_set(&mat[1][2], 0); - ibz_set(&mat[2][0], 7); - ibz_set(&mat[2][1], 1); - ibz_set(&mat[2][2], 8); - ibz_set(&mat[2][3], 5); - ibz_set(&mat[3][0], 1); - - res |= ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, 6); - - - - if (res != 0){ - printf("Quaternion unit dim4_ibz_4x4_right_ker_mod_power_of_2 failed\n"); - } - ibz_mat_4x4_finalize(&mat); - ibz_vec_4_finalize(&ker); - ibz_vec_4_finalize(&prod); - ibz_finalize(&q); - ibz_finalize(&r); - ibz_finalize(&two); - return(res); -} - -//void ibz_mat_4x4_eval(quat_alg_coord_t *res, const ibz_mat_4x4_t *mat, const quat_alg_coord_t *vec); -int quat_test_dim4_ibz_mat_4x4_eval(){ +// void ibz_mat_4x4_eval(ibz_vec_4_t *res, const ibz_mat_4x4_t *mat, const ibz_vec_4_t *vec); +// void ibz_mat_4x4_eval_t(ibz_vec_4_t *res, const ibz_vec_4_t *vec, const ibz_mat_4x4_t *mat); +int +quat_test_dim4_ibz_mat_4x4_eval(void) +{ int res = 0; ibz_mat_4x4_t mat; - quat_alg_coord_t vec, cmp, vres; - quat_alg_coord_init(&cmp); - quat_alg_coord_init(&vres); - quat_alg_coord_init(&vec); + ibz_vec_4_t vec, cmp, vres; + ibz_vec_4_init(&cmp); + ibz_vec_4_init(&vres); + ibz_vec_4_init(&vec); ibz_mat_4x4_init(&mat); - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ - ibz_set(&(mat[i][j]), i*j); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), i * j); } ibz_set(&(vec[i]), i); } @@ -1690,144 +1029,167 @@ int quat_test_dim4_ibz_mat_4x4_eval(){ ibz_set(&(cmp[1]), 14); ibz_set(&(cmp[2]), 28); ibz_set(&(cmp[3]), 42); - ibz_mat_4x4_eval(&vres,&mat,&vec); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(vres[i]),&(cmp[i])); + ibz_mat_4x4_eval(&vres, &mat, &vec); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(vres[i]), &(cmp[i])); } + ibz_vec_4_set(&vres, 0, 0, 0, 0); + ibz_mat_4x4_transpose(&mat, &mat); + ibz_mat_4x4_eval_t(&vres, &vec, &mat); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(vres[i]), &(cmp[i])); + } + ibz_mat_4x4_transpose(&mat, &mat); - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ - ibz_set(&(mat[i][j]), i*(j-1)+1); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), i * (j - 1) + 1); } - ibz_set(&(vec[i]), i*i-2); + ibz_set(&(vec[i]), i * i - 2); } ibz_set(&(cmp[0]), 6); ibz_set(&(cmp[1]), 24); ibz_set(&(cmp[2]), 42); ibz_set(&(cmp[3]), 60); - ibz_mat_4x4_eval(&vres,&mat,&vec); - for (int i = 0; i<4; i++){ - res = res || ibz_cmp(&(vres[i]),&(cmp[i])); + ibz_mat_4x4_eval(&vres, &mat, &vec); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(vres[i]), &(cmp[i])); } + ibz_vec_4_set(&vres, 0, 0, 0, 0); + ibz_mat_4x4_transpose(&mat, &mat); + ibz_mat_4x4_eval_t(&vres, &vec, &mat); + for (int i = 0; i < 4; i++) { + res = res || ibz_cmp(&(vres[i]), &(cmp[i])); + } + ibz_mat_4x4_transpose(&mat, &mat); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_ibz_mat_4x4_eval failed\n"); } - quat_alg_coord_finalize(&cmp); - quat_alg_coord_finalize(&vres); - quat_alg_coord_finalize(&vec); + ibz_vec_4_finalize(&cmp); + ibz_vec_4_finalize(&vres); + ibz_vec_4_finalize(&vec); ibz_mat_4x4_finalize(&mat); return res; } -//void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const quat_alg_coord_t *coord); -int quat_test_dim4_qf_eval(){ +// void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const quat_alg_coord_t *coord); +int +quat_test_dim4_qf_eval(void) +{ int res = 0; ibz_t ires, cmp; ibz_mat_4x4_t qf; - quat_alg_coord_t vec; + ibz_vec_4_t vec; ibz_init(&cmp); ibz_init(&ires); - quat_alg_coord_init(&vec); + ibz_vec_4_init(&vec); ibz_mat_4x4_init(&qf); - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ - ibz_set(&(qf[i][j]), i*j); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(qf[i][j]), i * j); } ibz_set(&(vec[i]), i); } ibz_set(&(cmp), 196); - quat_qf_eval(&ires,&qf,&vec); - res = res || ibz_cmp(&ires,&cmp); + quat_qf_eval(&ires, &qf, &vec); + res = res || ibz_cmp(&ires, &cmp); - for (int i = 0; i <4; i++){ - for (int j = 0; j <4; j++){ - ibz_set(&(qf[i][j]), (i+1)*(j+1)-4); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(qf[i][j]), (i + 1) * (j + 1) - 4); } - ibz_set(&(vec[i]), (i-1)*2-2); + ibz_set(&(vec[i]), (i - 1) * 2 - 2); } - ibz_set(&(cmp), -4*16); - quat_qf_eval(&ires,&qf,&vec); - res = res || ibz_cmp(&ires,&cmp); + ibz_set(&(cmp), -4 * 16); + quat_qf_eval(&ires, &qf, &vec); + res = res || ibz_cmp(&ires, &cmp); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test dim4_qf_eval failed\n"); } ibz_finalize(&cmp); ibz_finalize(&ires); - quat_alg_coord_finalize(&vec); + ibz_vec_4_finalize(&vec); ibz_mat_4x4_finalize(&qf); return res; } -//void ibz_content(ibz_t *content, const quat_alg_coord_t *v); -int quat_test_dim4_ibz_content(){ +// void ibz_vec_4_content(ibz_t *content, const quat_alg_coord_t *v); +int +quat_test_dim4_ibz_vec_4_content(void) +{ int res = 0; - ibz_t c,cmp; - quat_alg_coord_t x; + ibz_t c, cmp; + ibz_vec_4_t x; ibz_init(&c); ibz_init(&cmp); - quat_alg_coord_init(&x); + ibz_vec_4_init(&x); - ibz_set(&(x[0]),0); - ibz_set(&(x[1]),0); - ibz_set(&(x[2]),0); - ibz_set(&(x[3]),0); - ibz_set(&cmp,0); - ibz_content(&c,&x); - res = res || ibz_cmp(&c,&cmp); + ibz_set(&(x[0]), 0); + ibz_set(&(x[1]), 0); + ibz_set(&(x[2]), 0); + ibz_set(&(x[3]), 0); + ibz_set(&cmp, 0); + ibz_vec_4_content(&c, &x); + res = res || ibz_cmp(&c, &cmp); - ibz_set(&(x[0]),5); - ibz_set(&(x[1]),25); - ibz_set(&(x[2]),125); - ibz_set(&(x[3]),30); - ibz_set(&cmp,5); - ibz_content(&c,&x); - res = res || ibz_cmp(&c,&cmp); + ibz_set(&(x[0]), 5); + ibz_set(&(x[1]), 25); + ibz_set(&(x[2]), 125); + ibz_set(&(x[3]), 30); + ibz_set(&cmp, 5); + ibz_vec_4_content(&c, &x); + res = res || ibz_cmp(&c, &cmp); - ibz_set(&(x[0]),5); - ibz_set(&(x[1]),2); - ibz_set(&(x[2]),125); - ibz_set(&(x[3]),30); - ibz_set(&cmp,1); - ibz_content(&c,&x); - res = res || ibz_cmp(&c,&cmp); + ibz_set(&(x[0]), 5); + ibz_set(&(x[1]), 2); + ibz_set(&(x[2]), 125); + ibz_set(&(x[3]), 30); + ibz_set(&cmp, 1); + ibz_vec_4_content(&c, &x); + res = res || ibz_cmp(&c, &cmp); - ibz_set(&(x[0]),5); - ibz_set(&(x[1]),-2); - ibz_set(&(x[2]),125); - ibz_set(&(x[3]),0); - ibz_set(&cmp,1); - ibz_content(&c,&x); - res = res || ibz_cmp(&c,&cmp); + ibz_set(&(x[0]), 5); + ibz_set(&(x[1]), -2); + ibz_set(&(x[2]), 125); + ibz_set(&(x[3]), 0); + ibz_set(&cmp, 1); + ibz_vec_4_content(&c, &x); + res = res || ibz_cmp(&c, &cmp); - ibz_set(&(x[0]),0); - ibz_set(&(x[1]),-2); - ibz_set(&(x[2]),0); - ibz_set(&(x[3]),0); - ibz_set(&cmp,2); - ibz_content(&c,&x); - res = res || ibz_cmp(&c,&cmp); + ibz_set(&(x[0]), 0); + ibz_set(&(x[1]), -2); + ibz_set(&(x[2]), 0); + ibz_set(&(x[3]), 0); + ibz_set(&cmp, 2); + ibz_vec_4_content(&c, &x); + res = res || ibz_cmp(&c, &cmp); - if (res != 0){ - printf("Quaternion unit test dim4_ibz_content failed\n"); + if (res != 0) { + printf("Quaternion unit test dim4_ibz_vec_4_content failed\n"); } - quat_alg_coord_finalize(&x); + ibz_vec_4_finalize(&x); ibz_finalize(&c); ibz_finalize(&cmp); return res; } - // run all previous tests -int quat_test_dim4(){ +int +quat_test_dim4(void) +{ int res = 0; printf("\nRunning quaternion tests of matrices, vectors and quadratic forms in dimension 4\n"); res = res | quat_test_dim4_ibz_mat_4x4_mul(); res = res | quat_test_dim4_ibz_vec_4_set(); res = res | quat_test_dim4_ibz_vec_4_copy(); res = res | quat_test_dim4_ibz_vec_4_negate(); + res = res | quat_test_dim4_vec_4_copy_ibz(); + res = res | quat_test_dim4_ibz_vec_4_add(); + res = res | quat_test_dim4_ibz_vec_4_sub(); + res = res | quat_test_dim4_ibz_vec_4_is_zero(); res = res | quat_test_dim4_ibz_vec_4_linear_combination(); res = res | quat_test_dim4_ibz_mat_4x4_copy(); res = res | quat_test_dim4_ibz_mat_4x4_negate(); @@ -1838,22 +1200,13 @@ int quat_test_dim4(){ res = res | quat_test_dim4_ibz_mat_4x4_equal(); res = res | quat_test_dim4_ibz_mat_4x4_scalar_mul(); res = res | quat_test_dim4_ibz_mat_4x4_gcd(); + res = res | quat_test_dim4_ibz_vec_4_scalar_mul(); res = res | quat_test_dim4_ibz_mat_4x4_scalar_div(); - res = res | quat_test_dim4_is_hnf(); - res = res | quat_test_dim4_ibz_mat_4x8_hnf_core(); - res = res | quat_test_dim4_ibz_mat_4x4_hnf_mod(); - res = res | quat_test_dim4_ibq_vec_4_copy_ibz(); - res = res | quat_test_dim4_lll_bilinear(); - res = res | quat_test_dim4_gram_schmidt_transposed_with_ibq(); - res = res | quat_test_dim4_lll_verify(); res = res | quat_test_dim4_ibz_inv_dim4_make_coeff_pmp(); res = res | quat_test_dim4_ibz_inv_dim4_make_coeff_mpm(); res = res | quat_test_dim4_ibz_mat_4x4_inv_with_det_as_denom(); - res = res | quat_test_dim4_ibz_4x5_right_ker_mod_prime(); - res = res | quat_test_dim4_ibz_4x4_right_ker_mod_prime(); - res = res | quat_test_dim4_ibz_4x4_right_ker_mod_power_of_2(); res = res | quat_test_dim4_ibz_mat_4x4_eval(); res = res | quat_test_dim4_qf_eval(); - res = res | quat_test_dim4_ibz_content(); - return(res); + res = res | quat_test_dim4_ibz_vec_4_content(); + return (res); } diff --git a/src/quaternion/ref/generic/test/finit.c b/src/quaternion/ref/generic/test/finit.c index 88da165..9335246 100644 --- a/src/quaternion/ref/generic/test/finit.c +++ b/src/quaternion/ref/generic/test/finit.c @@ -2,276 +2,193 @@ // Schema of tests: initialize structure, assign values, finalize -//void quat_alg_init(quat_alg_t *alg); -//void quat_alg_finalize(quat_alg_t *alg); -int quat_test_finit_alg(){ +// void quat_alg_init(quat_alg_t *alg); +// void quat_alg_finalize(quat_alg_t *alg); +int +quat_test_finit_alg(void) +{ int res = 0; quat_alg_t alg; ibz_t p; - ibz_mat_4x4_t cmp; - ibz_mat_4x4_init(&cmp); ibz_init(&p); - ibz_set(&p,7); + ibz_set(&p, 7); quat_alg_init_set(&alg, &p); - res = res || ibz_cmp(&(alg.p),&p); - ibz_mat_4x4_identity(&cmp); - ibz_copy(&(cmp[2][2]),&p); - ibz_copy(&(cmp[3][3]),&p); - res = res || !ibz_mat_4x4_equal(&cmp,&(alg.gram)); - if (res != 0){ + res = res || ibz_cmp(&(alg.p), &p); + if (res != 0) { printf("Quaternion unit test finit_alg failed\n"); } - ibz_mat_4x4_finalize(&cmp); ibz_finalize(&p); quat_alg_finalize(&alg); return res; } -//void quat_alg_elem_init(quat_alg_elem_t *elem); -//void quat_alg_elem_finalize(quat_alg_elem_t *elem); -int quat_test_finit_alg_elem(){ +// void quat_alg_elem_init(quat_alg_elem_t *elem); +// void quat_alg_elem_finalize(quat_alg_elem_t *elem); +int +quat_test_finit_alg_elem(void) +{ quat_alg_elem_t elem; int res; quat_alg_elem_init(&elem); - ibz_set(&(elem.coord[0]),0); - ibz_set(&(elem.coord[1]),1); - ibz_set(&(elem.coord[2]),2); - ibz_set(&(elem.coord[3]),3); - ibz_set(&(elem.denom),1); - res = 1-(1==ibz_is_one(&(elem.denom))); - for(int i = 0; i <4; i++){ - res = res || (i!=ibz_get(&(elem.coord[i]))); + ibz_set(&(elem.coord[0]), 0); + ibz_set(&(elem.coord[1]), 1); + ibz_set(&(elem.coord[2]), 2); + ibz_set(&(elem.coord[3]), 3); + ibz_set(&(elem.denom), 1); + res = 1 - (1 == ibz_is_one(&(elem.denom))); + for (int i = 0; i < 4; i++) { + res = res || (ibz_cmp_int32(&(elem.coord[i]), i) != 0); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test finit_alg_elem failed\n"); } quat_alg_elem_finalize(&elem); return res; } -//void quat_alg_coord_init(quat_alg_coord_t *coord); -//void quat_alg_coord_finalize(quat_alg_coord_t *coord); -int quat_test_finit_alg_coord(){ - quat_alg_coord_t coord; +// void ibz_vec_2_init(ibz_vec_2_t *vec); +// void ibz_vec_2_finalize(ibz_vec_2_t *vec); +int +quat_test_finit_ibz_vec_2(void) +{ + ibz_vec_2_t vec; int res = 0; - quat_alg_coord_init(&coord); - ibz_set(&(coord[0]),0); - ibz_set(&(coord[1]),1); - ibz_set(&(coord[2]),2); - ibz_set(&(coord[3]),3); - for(int i = 0; i <4; i++){ - res = res || (i!=ibz_get(&(coord[i]))); + ibz_vec_2_init(&vec); + for (int i = 0; i < 2; i++) { + ibz_set(&(vec[i]), i); } - if (res != 0){ - printf("Quaternion unit test finit_alg_coord failed\n"); + for (int i = 0; i < 2; i++) { + res = res || (ibz_cmp_int32(&(vec[i]), i) != 0); } - quat_alg_coord_finalize(&coord); + if (res != 0) { + printf("Quaternion unit test finit_ibz_vec_2 failed\n"); + } + ibz_vec_2_finalize(&vec); return res; } -//void ibz_vec_4_init(ibz_vec_4_t *vec); -//void ibz_vec_4_finalize(ibz_vec_4_t *vec); -int quat_test_finit_ibz_vec_4(){ +// void ibz_vec_4_init(ibz_vec_4_t *vec); +// void ibz_vec_4_finalize(ibz_vec_4_t *vec); +int +quat_test_finit_ibz_vec_4(void) +{ ibz_vec_4_t vec; int res = 0; ibz_vec_4_init(&vec); - for(int i = 0; i <4; i++){ - ibz_set(&(vec[i]),i); + for (int i = 0; i < 4; i++) { + ibz_set(&(vec[i]), i); } - for(int i = 0; i <4; i++){ - res = res || (i!=ibz_get(&(vec[i]))); + for (int i = 0; i < 4; i++) { + res = res || (ibz_cmp_int32(&(vec[i]), i) != 0); } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test finit_ibz_vec_4 failed\n"); } ibz_vec_4_finalize(&vec); return res; } -//void ibz_vec_5_init(ibz_vec_5_t *vec); -//void ibz_vec_5_finalize(ibz_vec_5_t *vec); -int quat_test_finit_ibz_vec_5(){ - ibz_vec_5_t vec; - int res = 0; - ibz_vec_5_init(&vec); - for(int i = 0; i <5; i++){ - ibz_set(&(vec[i]),i); - } - for(int i = 0; i <5; i++){ - res = res || (i!=ibz_get(&(vec[i]))); - } - if (res != 0){ - printf("Quaternion unit test finit_ibz_vec_5 failed\n"); - } - ibz_vec_5_finalize(&vec); - return res; -} - -//void ibz_mat_2x2_init(ibz_mat_2x2_t *mat); -//void ibz_mat_2x2_finalize(ibz_mat_2x2_t *mat); -int quat_test_finit_ibz_mat_2x2(){ +// void ibz_mat_2x2_init(ibz_mat_2x2_t *mat); +// void ibz_mat_2x2_finalize(ibz_mat_2x2_t *mat); +int +quat_test_finit_ibz_mat_2x2(void) +{ ibz_mat_2x2_t mat; int res = 0; ibz_mat_2x2_init(&mat); - for (int i = 0; i < 2; i++){ - for (int j = 0; j < 2; j++){ - ibz_set(&(mat[i][j]),i+j); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + ibz_set(&(mat[i][j]), i + j); } } - for(int i = 0; i <2; i++){ - for (int j = 0; j < 2; j++){ - res = res || (i+j!=ibz_get(&(mat[i][j]))); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + res = res || (ibz_cmp_int32(&(mat[i][j]), i + j) != 0); } } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test finit_ibz_mat_2x2 failed\n"); } ibz_mat_2x2_finalize(&mat); return res; } -//void ibz_mat_4x4_init(ibz_mat_4x4_t *mat); -//void ibz_mat_4x4_finalize(ibz_mat_4x4_t *mat); -int quat_test_finit_ibz_mat_4x4(){ +// void ibz_mat_4x4_init(ibz_mat_4x4_t *mat); +// void ibz_mat_4x4_finalize(ibz_mat_4x4_t *mat); +int +quat_test_finit_ibz_mat_4x4(void) +{ ibz_mat_4x4_t mat; int res = 0; ibz_mat_4x4_init(&mat); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),i+j); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(mat[i][j]), i + j); } } - for(int i = 0; i <4; i++){ - for (int j = 0; j < 4; j++){ - res = res || (i+j!=ibz_get(&(mat[i][j]))); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res || (ibz_cmp_int32(&(mat[i][j]), i + j) != 0); } } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test finit_ibz_mat_4x4 failed\n"); } ibz_mat_4x4_finalize(&mat); return res; } - -//void ibz_mat_4x5_init(ibz_mat_4x5_t *mat); -//void ibz_mat_4x5_finalize(ibz_mat_4x5_t *mat); -int quat_test_finit_ibz_mat_4x5(){ - ibz_mat_4x5_t mat; - int res = 0; - ibz_mat_4x5_init(&mat); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 5; j++){ - ibz_set(&(mat[i][j]),i+j); - } - } - for(int i = 0; i <4; i++){ - for (int j = 0; j < 5; j++){ - res = res || (i+j!=ibz_get(&(mat[i][j]))); - } - } - if (res != 0){ - printf("Quaternion unit test finit_ibz_mat_4x5 failed\n"); - } - ibz_mat_4x5_finalize(&mat); - return res; -} - -//void ibz_mat_4x8_init(ibz_mat_4x8_t *mat); -//void ibz_mat_4x8_finalize(ibz_mat_4x8_t *mat); -int quat_test_finit_ibz_mat_4x8(){ - ibz_mat_4x8_t mat; - int res = 0; - ibz_mat_4x8_init(&mat); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 8; j++){ - ibz_set(&(mat[i][j]),i+j); - } - } - for(int i = 0; i <4; i++){ - for (int j = 0; j < 8; j++){ - res = res || (i+j!=ibz_get(&(mat[i][j]))); - } - } - if (res != 0){ - printf("Quaternion unit test finit_ibz_mat_4x8 failed\n"); - } - ibz_mat_4x8_finalize(&mat); - return res; -} - -//void quat_lattice_init(quat_lattice_t *lat); -//void quat_lattice_finalize(quat_lattice_t *lat); -int quat_test_finit_lattice(){ +// void quat_lattice_init(quat_lattice_t *lat); +// void quat_lattice_finalize(quat_lattice_t *lat); +int +quat_test_finit_lattice(void) +{ quat_lattice_t lat; int res = 0; quat_lattice_init(&lat); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),i+j); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat.basis[i][j]), i + j); } } - ibz_set(&(lat.denom),1); - res = 1-(1==ibz_is_one(&(lat.denom))); - for(int i = 0; i <4; i++){ - for (int j = 0; j < 4; j++){ - res = res || (i+j!=ibz_get(&(lat.basis[i][j]))); + ibz_set(&(lat.denom), 1); + res = 1 - (1 == ibz_is_one(&(lat.denom))); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res || (ibz_cmp_int32(&(lat.basis[i][j]), i + j) != 0); } } - if (res != 0){ + if (res != 0) { printf("Quaternion unit test finit_alg_lattice failed\n"); } quat_lattice_finalize(&lat); return res; } -//void quat_order_init(quat_order_t *order); -//void quat_order_finalize(quat_order_t *order); -int quat_test_finit_order(){ - quat_order_t order; - int res = 0; - quat_order_init(&order); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(order.basis[i][j]),i+j); - } - } - ibz_set(&(order.denom),1); - res = 1-(1==ibz_is_one(&(order.denom))); - for(int i = 0; i <4; i++){ - for (int j = 0; j < 4; j++){ - res = res || (i+j!=ibz_get(&(order.basis[i][j]))); - } - } - if (res != 0){ - printf("Quaternion unit test finit_alg_order failed\n"); - } - quat_order_finalize(&order); - return res; -} - -//void quat_left_ideal_init(quat_left_ideal_t *lideal); -//void quat_left_ideal_finalize(quat_left_ideal_t *lideal); -int quat_test_finit_lideal(){ +// void quat_left_ideal_init(quat_left_ideal_t *lideal); +// void quat_left_ideal_finalize(quat_left_ideal_t *lideal); +int +quat_test_finit_lideal(void) +{ quat_left_ideal_t lideal; int res = 0; quat_left_ideal_init(&lideal); - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(lideal.lattice.basis[i][j]),i+j); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lideal.lattice.basis[i][j]), i + j); } } - ibz_set(&(lideal.lattice.denom),1); - ibz_set(&(lideal.norm),5); + ibz_set(&(lideal.lattice.denom), 1); + ibz_set(&(lideal.norm), 5); lideal.parent_order = NULL; - res = 1-(1==ibz_is_one(&(lideal.lattice.denom))); - for(int i = 0; i <4; i++){ - for (int j = 0; j < 4; j++){ - res = res || (i+j!=ibz_get(&(lideal.lattice.basis[i][j]))); + res = 1 - (1 == ibz_is_one(&(lideal.lattice.denom))); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + res = res || (ibz_cmp_int32(&(lideal.lattice.basis[i][j]), i + j) != 0); } } - res = res || (5!=ibz_get(&(lideal.norm))); - if (res != 0){ + res = res || (ibz_cmp_int32(&(lideal.norm), 5) != 0); + if (res != 0) { printf("Quaternion unit test finit_alg_lideal failed\n"); } quat_left_ideal_finalize(&lideal); @@ -279,21 +196,18 @@ int quat_test_finit_lideal(){ } // run all previous tests -int quat_test_finit(){ +int +quat_test_finit(void) +{ int res = 0; printf("\nRunning quaternion tests of initializers and finalizers\n"); res = res | quat_test_finit_alg(); res = res | quat_test_finit_alg_elem(); - res = res | quat_test_finit_alg_coord(); + res = res | quat_test_finit_ibz_vec_2(); res = res | quat_test_finit_ibz_vec_4(); - res = res | quat_test_finit_ibz_vec_5(); res = res | quat_test_finit_ibz_mat_2x2(); res = res | quat_test_finit_ibz_mat_4x4(); - res = res | quat_test_finit_ibz_mat_4x5(); - res = res | quat_test_finit_ibz_mat_4x8(); res = res | quat_test_finit_lattice(); - res = res | quat_test_finit_order(); res = res | quat_test_finit_lideal(); - return(res); + return (res); } - diff --git a/src/quaternion/ref/generic/test/ideal.c b/src/quaternion/ref/generic/test/ideal.c index ab82d24..7e92ab8 100644 --- a/src/quaternion/ref/generic/test/ideal.c +++ b/src/quaternion/ref/generic/test/ideal.c @@ -1,55 +1,122 @@ #include "quaternion_tests.h" -//void quat_lideal_create_principal(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg); -int quat_test_lideal_create_principal(){ +// void quat_lideal_norm(quat_left_ideal_t *lideal); +int +quat_test_lideal_norm(void) +{ int res = 0; - - // Example from https://github.com/SQISign/sqisign-nist/issues/38#issuecomment-1554585079 + quat_left_ideal_t lideal; + quat_lattice_t order; quat_alg_t alg; - quat_order_t lat; + quat_alg_elem_t gen; + ibz_t norm; + ibz_init(&norm); + quat_left_ideal_init(&lideal); + quat_lattice_init(&order); + quat_alg_elem_init(&gen); + quat_alg_init_set_ui(&alg, 23); + quat_lattice_O0_set(&order); + quat_alg_elem_set(&gen, 1, 3, 2, 1, 4); + assert(quat_lattice_contains(NULL, &order, &gen)); + ibz_set(&norm, 17); + quat_lideal_create(&lideal, &gen, &norm, &order, &alg); + ibz_copy(&norm, &(lideal.norm)); + ibz_set(&(lideal.norm), 0); + quat_lideal_norm(&lideal); + res = res || ibz_cmp(&(lideal.norm), &norm); + + if (res != 0) { + printf("Quaternion unit test lideal_norm failed\n"); + } + ibz_finalize(&norm); + quat_left_ideal_finalize(&lideal); + quat_lattice_finalize(&order); + quat_alg_elem_finalize(&gen); + quat_alg_finalize(&alg); + return (res); +} + +// void quat_lideal_copy(quat_left_ideal_t *copy, const quat_left_ideal_t *copied); +int +quat_test_lideal_copy() +{ + int res = 0; + quat_left_ideal_t copy, copied; + quat_alg_elem_t elem; + quat_alg_t alg; + quat_lattice_t order; + quat_alg_init_set_ui(&alg, 103); + quat_lattice_init(&order); + quat_alg_elem_init(&elem); + quat_left_ideal_init(©); + quat_left_ideal_init(&copied); + quat_lattice_O0_set(&order); + quat_alg_elem_set(&elem, 1, 4, 2, 9, -1); + quat_lideal_create_principal(&copied, &elem, &order, &alg); + quat_lideal_copy(©, &copied); + res = res | !(quat_lideal_equals(©, &copied, &alg)); + ibz_set(&(elem.coord[0]), 23); + quat_lideal_create_principal(&copied, &elem, &order, &alg); + res = res | (quat_lideal_equals(©, &copied, &alg)); + quat_lideal_copy(©, &copied); + res = res | !(quat_lideal_equals(©, &copied, &alg)); + if (res) { + printf("Quaternion unit test lideal_copy failed\n"); + } + quat_alg_elem_finalize(&elem); + quat_alg_finalize(&alg); + quat_lattice_finalize(&order); + quat_left_ideal_finalize(©); + quat_left_ideal_finalize(&copied); + return (res); +} + +// void quat_lideal_create_principal(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const +// quat_lattice_t *order, const quat_alg_t *alg); +int +quat_test_lideal_create_principal(void) +{ + int res = 0; + + quat_alg_t alg; + quat_lattice_t lat; quat_alg_elem_t gamma; quat_left_ideal_t I; quat_alg_init_set_ui(&alg, 367); - quat_order_init(&lat); + quat_lattice_init(&lat); quat_alg_elem_init(&gamma); quat_left_ideal_init(&I); - ibz_set(&lat.denom, 2); - ibz_set(&lat.basis[0][0], 2); - ibz_set(&lat.basis[1][1], 2); - ibz_set(&lat.basis[1][2], 1); - ibz_set(&lat.basis[2][2], 1); - ibz_set(&lat.basis[3][3], 1); - ibz_set(&lat.basis[0][3], 1); + quat_lattice_O0_set(&lat); ibz_set(&gamma.coord[0], 219); ibz_set(&gamma.coord[1], 200); ibz_set(&gamma.coord[2], 78); ibz_set(&gamma.coord[3], -1); quat_lideal_create_principal(&I, &gamma, &lat, &alg); - + res |= I.parent_order != ⪫ - res |= ibz_cmp_si(&I.norm, 2321156); + res |= ibz_cmp_int32(&I.norm, 2321156); res |= ibz_cmp(&I.lattice.denom, &ibz_const_one); - - res |= ibz_cmp_si(&I.lattice.basis[0][0], 1160578); - res |= ibz_cmp_si(&I.lattice.basis[1][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[2][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[1][1], 1160578); - res |= ibz_cmp_si(&I.lattice.basis[2][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][0], 1160578); + res |= ibz_cmp_int32(&I.lattice.basis[1][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[2][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][2], 310126); - res |= ibz_cmp_si(&I.lattice.basis[1][2], 182529); - res |= ibz_cmp_si(&I.lattice.basis[2][2], 1); - res |= ibz_cmp_si(&I.lattice.basis[3][2], 0); - - res |= ibz_cmp_si(&I.lattice.basis[0][3], 978049); - res |= ibz_cmp_si(&I.lattice.basis[1][3], 310126); - res |= ibz_cmp_si(&I.lattice.basis[2][3], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][3], 1); + res |= ibz_cmp_int32(&I.lattice.basis[0][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[1][1], 1160578); + res |= ibz_cmp_int32(&I.lattice.basis[2][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][1], 0); + + res |= ibz_cmp_int32(&I.lattice.basis[0][2], 310126); + res |= ibz_cmp_int32(&I.lattice.basis[1][2], 182529); + res |= ibz_cmp_int32(&I.lattice.basis[2][2], 1); + res |= ibz_cmp_int32(&I.lattice.basis[3][2], 0); + + res |= ibz_cmp_int32(&I.lattice.basis[0][3], 978049); + res |= ibz_cmp_int32(&I.lattice.basis[1][3], 310126); + res |= ibz_cmp_int32(&I.lattice.basis[2][3], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][3], 1); // same test, just with gamma not reduced ibz_set(&gamma.coord[0], 438); @@ -61,28 +128,28 @@ int quat_test_lideal_create_principal(){ quat_lideal_create_principal(&I, &gamma, &lat, &alg); res |= I.parent_order != ⪫ - res |= ibz_cmp_si(&I.norm, 2321156); + res |= ibz_cmp_int32(&I.norm, 2321156); res |= ibz_cmp(&I.lattice.denom, &ibz_const_one); - res |= ibz_cmp_si(&I.lattice.basis[0][0], 1160578); - res |= ibz_cmp_si(&I.lattice.basis[1][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[2][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][0], 1160578); + res |= ibz_cmp_int32(&I.lattice.basis[1][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[2][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[1][1], 1160578); - res |= ibz_cmp_si(&I.lattice.basis[2][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[1][1], 1160578); + res |= ibz_cmp_int32(&I.lattice.basis[2][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][2], 310126); - res |= ibz_cmp_si(&I.lattice.basis[1][2], 182529); - res |= ibz_cmp_si(&I.lattice.basis[2][2], 1); - res |= ibz_cmp_si(&I.lattice.basis[3][2], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][2], 310126); + res |= ibz_cmp_int32(&I.lattice.basis[1][2], 182529); + res |= ibz_cmp_int32(&I.lattice.basis[2][2], 1); + res |= ibz_cmp_int32(&I.lattice.basis[3][2], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][3], 978049); - res |= ibz_cmp_si(&I.lattice.basis[1][3], 310126); - res |= ibz_cmp_si(&I.lattice.basis[2][3], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][3], 1); + res |= ibz_cmp_int32(&I.lattice.basis[0][3], 978049); + res |= ibz_cmp_int32(&I.lattice.basis[1][3], 310126); + res |= ibz_cmp_int32(&I.lattice.basis[2][3], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][3], 1); // same test, just with gamma and basis not reduced ibz_set(&lat.denom, 6); @@ -99,220 +166,123 @@ int quat_test_lideal_create_principal(){ ibz_set(&gamma.denom, 2); quat_lideal_create_principal(&I, &gamma, &lat, &alg); - + res |= I.parent_order != ⪫ - res |= ibz_cmp_si(&I.norm, 2321156); + res |= ibz_cmp_int32(&I.norm, 2321156); res |= ibz_cmp(&I.lattice.denom, &ibz_const_one); - - res |= ibz_cmp_si(&I.lattice.basis[0][0], 1160578); - res |= ibz_cmp_si(&I.lattice.basis[1][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[2][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[1][1], 1160578); - res |= ibz_cmp_si(&I.lattice.basis[2][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][0], 1160578); + res |= ibz_cmp_int32(&I.lattice.basis[1][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[2][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][2], 310126); - res |= ibz_cmp_si(&I.lattice.basis[1][2], 182529); - res |= ibz_cmp_si(&I.lattice.basis[2][2], 1); - res |= ibz_cmp_si(&I.lattice.basis[3][2], 0); - - res |= ibz_cmp_si(&I.lattice.basis[0][3], 978049); - res |= ibz_cmp_si(&I.lattice.basis[1][3], 310126); - res |= ibz_cmp_si(&I.lattice.basis[2][3], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][3], 1); + res |= ibz_cmp_int32(&I.lattice.basis[0][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[1][1], 1160578); + res |= ibz_cmp_int32(&I.lattice.basis[2][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][2], 310126); + res |= ibz_cmp_int32(&I.lattice.basis[1][2], 182529); + res |= ibz_cmp_int32(&I.lattice.basis[2][2], 1); + res |= ibz_cmp_int32(&I.lattice.basis[3][2], 0); + + res |= ibz_cmp_int32(&I.lattice.basis[0][3], 978049); + res |= ibz_cmp_int32(&I.lattice.basis[1][3], 310126); + res |= ibz_cmp_int32(&I.lattice.basis[2][3], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][3], 1); quat_alg_finalize(&alg); - quat_order_finalize(&lat); + quat_lattice_finalize(&lat); quat_alg_elem_finalize(&gamma); quat_left_ideal_finalize(&I); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lideal_create_principal failed\n"); } - return(res); + return (res); } -//void quat_lideal_create_from_primitive(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg); -int quat_test_lideal_create_from_primitive(){ +// void quat_lideal_create(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const +// ibz_t *N, const quat_lattice_t *order, const quat_alg_t *alg); +int +quat_test_lideal_create_from_primitive(void) +{ int res = 0; - // Example from https://github.com/SQISign/sqisign-nist/issues/38#issuecomment-1554585079 quat_alg_t alg; - quat_order_t lat; + quat_lattice_t lat; quat_alg_elem_t gamma; ibz_t N; quat_left_ideal_t I; quat_alg_init_set_ui(&alg, 367); - quat_order_init(&lat); + quat_lattice_init(&lat); quat_alg_elem_init(&gamma); ibz_init(&N); quat_left_ideal_init(&I); - ibz_set(&lat.denom, 2); - ibz_set(&lat.basis[0][0], 2); - ibz_set(&lat.basis[1][1], 2); - ibz_set(&lat.basis[1][2], 1); - ibz_set(&lat.basis[2][2], 1); - ibz_set(&lat.basis[3][3], 1); - ibz_set(&lat.basis[0][3], 1); + quat_lattice_O0_set(&lat); ibz_set(&gamma.coord[0], 219); ibz_set(&gamma.coord[1], 200); ibz_set(&gamma.coord[2], 78); ibz_set(&gamma.coord[3], -1); ibz_set(&N, 31); - quat_lideal_create_from_primitive(&I, &gamma, &N, &lat, &alg); - + quat_lideal_create(&I, &gamma, &N, &lat, &alg); + res |= I.parent_order != ⪫ res |= ibz_cmp(&I.norm, &N); res |= ibz_cmp(&I.lattice.denom, &ibz_const_two); - res |= ibz_cmp_si(&I.lattice.basis[0][0], 62); - res |= ibz_cmp_si(&I.lattice.basis[1][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[2][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[0][0], 62); + res |= ibz_cmp_int32(&I.lattice.basis[1][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[2][0], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][0], 0); - res |= ibz_cmp_si(&I.lattice.basis[0][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[1][1], 62); - res |= ibz_cmp_si(&I.lattice.basis[2][1], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][1], 0); - - res |= ibz_cmp_si(&I.lattice.basis[0][2], 2); - res |= ibz_cmp_si(&I.lattice.basis[1][2], 1); - res |= ibz_cmp_si(&I.lattice.basis[2][2], 1); - res |= ibz_cmp_si(&I.lattice.basis[3][2], 0); - - res |= ibz_cmp_si(&I.lattice.basis[0][3], 61); - res |= ibz_cmp_si(&I.lattice.basis[1][3], 2); - res |= ibz_cmp_si(&I.lattice.basis[2][3], 0); - res |= ibz_cmp_si(&I.lattice.basis[3][3], 1); + res |= ibz_cmp_int32(&I.lattice.basis[0][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[1][1], 62); + res |= ibz_cmp_int32(&I.lattice.basis[2][1], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][1], 0); + + res |= ibz_cmp_int32(&I.lattice.basis[0][2], 2); + res |= ibz_cmp_int32(&I.lattice.basis[1][2], 1); + res |= ibz_cmp_int32(&I.lattice.basis[2][2], 1); + res |= ibz_cmp_int32(&I.lattice.basis[3][2], 0); + + res |= ibz_cmp_int32(&I.lattice.basis[0][3], 61); + res |= ibz_cmp_int32(&I.lattice.basis[1][3], 2); + res |= ibz_cmp_int32(&I.lattice.basis[2][3], 0); + res |= ibz_cmp_int32(&I.lattice.basis[3][3], 1); quat_alg_finalize(&alg); - quat_order_finalize(&lat); + quat_lattice_finalize(&lat); quat_alg_elem_finalize(&gamma); ibz_finalize(&N); quat_left_ideal_finalize(&I); - - if (res != 0){ + + if (res != 0) { printf("Quaternion unit test lideal_create_from_primitive failed\n"); } - return(res); + return (res); } -//void quat_lideal_make_primitive_then_create(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg); -int quat_test_lideal_make_primitive_then_create(){ - int res = 0; - ibz_t n, cnt; - quat_alg_t alg; - quat_alg_elem_t gen, x; - quat_alg_coord_t prim; - quat_order_t order; - quat_left_ideal_t lideal,cmp; - quat_left_ideal_init(&lideal); - quat_left_ideal_init(&cmp); - quat_alg_init_set_ui(&alg, 103); - quat_alg_elem_init(&gen); - quat_alg_elem_init(&x); - quat_alg_coord_init(&prim); - quat_order_init(&order); - ibz_init(&n); - ibz_init(&cnt); - - - ibz_set(&order.denom, 2); - ibz_set(&order.basis[0][0], 2); - ibz_set(&order.basis[1][1], 2); - ibz_set(&order.basis[1][2], 1); - ibz_set(&order.basis[2][2], 1); - ibz_set(&order.basis[3][3], 1); - ibz_set(&order.basis[0][3], 1); - - ibz_set(&x.coord[0], 6); - ibz_set(&x.coord[1], 10); - ibz_set(&x.coord[2], 14); - ibz_set(&x.coord[3], 22); - ibz_set(&n, 17); - - quat_lideal_make_primitive_then_create(&lideal,&x,&n,&order,&alg); - quat_alg_make_primitive(&prim,&cnt,&x,&order,&alg); - ibz_mat_4x4_eval(&(gen.coord),&(order.basis),&prim); - ibz_copy(&gen.denom,&order.denom); - quat_lideal_create_from_primitive(&cmp,&gen,&n,&order,&alg); - res = res || !quat_lideal_equals(&lideal,&cmp,&alg); - - if (res != 0){ - printf("Quaternion unit test lideal_make_primitive_then_create failed\n"); - } - quat_alg_finalize(&alg); - quat_alg_elem_finalize(&gen); - quat_alg_elem_finalize(&x); - quat_alg_coord_finalize(&prim); - quat_order_finalize(&order); - ibz_finalize(&n); - ibz_finalize(&cnt); - quat_left_ideal_finalize(&lideal); - quat_left_ideal_finalize(&cmp); - return(res); -} - -//void quat_lideal_random_2e(quat_left_ideal_t *lideal, const quat_order_t *order, const quat_alg_t *alg, int64_t e, unsigned char n); -int quat_test_lideal_random_2e(){ +// int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t +// *alg) +int +quat_test_lideal_generator(void) +{ int res = 0; quat_alg_t alg; - quat_order_t order; - quat_left_ideal_t lideal; - quat_alg_init_set_ui(&alg, 103); - quat_order_init(&order); - quat_left_ideal_init(&lideal); - - ibz_set(&order.denom, 2); - ibz_set(&order.basis[0][0], 2); - ibz_set(&order.basis[1][1], 2); - ibz_set(&order.basis[1][2], 1); - ibz_set(&order.basis[2][2], 1); - ibz_set(&order.basis[3][3], 1); - ibz_set(&order.basis[0][3], 1); - - // Pretty much self-testing (thanks to embedded asserts) - res |= quat_lideal_random_2e(&lideal, &order, &alg, 100, 10) == 0; - - quat_alg_finalize(&alg); - quat_order_finalize(&order); - quat_left_ideal_finalize(&lideal); - - if (res != 0){ - printf("Quaternion unit test lideal_random_2e failed\n"); - } - return(res); -} - -//int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *alg, int bound) -int quat_test_lideal_generator(){ - int res = 0; - - quat_alg_t alg; - quat_order_t order; + quat_lattice_t order; quat_alg_elem_t gen; ibz_t N; quat_left_ideal_t lideal, lideal2; quat_alg_init_set_ui(&alg, 103); - quat_order_init(&order); + quat_lattice_init(&order); quat_alg_elem_init(&gen); ibz_init(&N); quat_left_ideal_init(&lideal); quat_left_ideal_init(&lideal2); - - ibz_set(&order.denom, 2); - ibz_set(&order.basis[0][0], 2); - ibz_set(&order.basis[1][1], 2); - ibz_set(&order.basis[1][2], 1); - ibz_set(&order.basis[2][2], 1); - ibz_set(&order.basis[3][3], 1); - ibz_set(&order.basis[0][3], 1); + quat_lattice_O0_set(&order); ibz_set(&gen.coord[0], 3); ibz_set(&gen.coord[1], 5); @@ -320,148 +290,47 @@ int quat_test_lideal_generator(){ ibz_set(&gen.coord[3], 11); ibz_set(&N, 17); - quat_lideal_create_from_primitive(&lideal, &gen, &N, &order, &alg); - + quat_lideal_create(&lideal, &gen, &N, &order, &alg); + // Try to regenerate the same ideal for (int i = 0; i <= 10; i++) { - res |= !quat_lideal_generator(&gen, &lideal, &alg,0); - quat_lideal_create_from_primitive(&lideal2, &gen, &N, &order, &alg); + res |= !quat_lideal_generator(&gen, &lideal, &alg); + quat_lideal_create(&lideal2, &gen, &N, &order, &alg); res |= !quat_lideal_equals(&lideal, &lideal2, &alg); } - + quat_alg_finalize(&alg); - quat_order_finalize(&order); + quat_lattice_finalize(&order); quat_alg_elem_finalize(&gen); ibz_finalize(&N); quat_left_ideal_finalize(&lideal); quat_left_ideal_finalize(&lideal2); - - if (res != 0){ + + if (res != 0) { printf("Quaternion unit test lideal_generator failed\n"); } - return(res); + return (res); } -//int quat_lideal_generator_coprime(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const ibz_t *n, const quat_alg_t *alg, int bound); -int quat_test_lideal_generator_coprime(){ +// void quat_lideal_mul(quat_left_ideal_t *product, const quat_left_ideal_t *lideal, const +// quat_alg_elem_t *alpha, const quat_alg_t *alg); +int +quat_test_lideal_mul(void) +{ int res = 0; quat_alg_t alg; - quat_order_t order, order2; - quat_alg_elem_t gen; - ibz_t N, M, gcd, norm_int, prod; - ibq_t norm; - quat_left_ideal_t lideal, lideal2; - quat_alg_init_set_ui(&alg, 103); - quat_order_init(&order); - quat_order_init(&order2); - quat_alg_elem_init(&gen); - ibz_init(&N); - ibz_init(&M); - ibz_init(&norm_int); - ibz_init(&prod); - ibz_init(&gcd); - ibq_init(&norm); - quat_left_ideal_init(&lideal); - quat_left_ideal_init(&lideal2); - - ibz_set(&order.denom, 2); - ibz_set(&order.basis[0][0], 2); - ibz_set(&order.basis[1][1], 2); - ibz_set(&order.basis[1][2], 1); - ibz_set(&order.basis[2][2], 1); - ibz_set(&order.basis[3][3], 1); - ibz_set(&order.basis[0][3], 1); - - ibz_set(&gen.coord[0], 3); - ibz_set(&gen.coord[1], 5); - ibz_set(&gen.coord[2], 7); - ibz_set(&gen.coord[3], 11); - ibz_set(&N, 5); - // product of primes < 50 - ibz_set(&M, 614889782588491410l); - - quat_lideal_create_from_primitive(&lideal, &gen, &N, &order, &alg); - - res |= !quat_lideal_generator_coprime(&gen, &lideal, &M, &alg,0); - quat_alg_norm(&norm, &gen, &alg); - res |= !ibq_to_ibz(&norm_int, &norm); - // case with coprimality - ibz_gcd(&gcd, &norm_int, &M); - res |= !ibz_is_one(&gcd); - // test other formula - ibz_mul(&prod,&M,&M); - ibz_gcd(&prod,&prod,&norm_int); - ibz_gcd(&gcd, &(lideal.norm), &M); - res |= ibz_cmp(&gcd,&prod); - - quat_lideal_create_from_primitive(&lideal2, &gen, &N, &order, &alg); - res |= !quat_lideal_equals(&lideal, &lideal2, &alg); - res |= !quat_alg_is_primitive(&gen,&(lideal.lattice), &alg); - - - - ibz_set(&(order.denom),1); - quat_alg_elem_set(&gen,1,2,4,2,6); - - quat_lideal_create_from_primitive(&lideal, &gen, &N, &order, &alg); - - ibz_set(&M,15); - res |= !quat_lideal_generator_coprime(&gen, &lideal, &M, &alg,0); - quat_alg_norm(&norm, &gen, &alg); - res |= !ibq_to_ibz(&norm_int, &norm); - // test other formula - ibz_mul(&prod,&M,&M); - ibz_gcd(&prod,&prod,&norm_int); - ibz_gcd(&gcd, &(lideal.norm), &M); - res |= ibz_cmp(&gcd,&prod); - - quat_lideal_create_from_primitive(&lideal2, &gen, &N, &order, &alg); - res |= !quat_lideal_equals(&lideal, &lideal2, &alg); - res |= !quat_alg_is_primitive(&gen,&(lideal.lattice), &alg); - - quat_alg_finalize(&alg); - quat_order_finalize(&order); - quat_order_finalize(&order2); - quat_alg_elem_finalize(&gen); - ibz_finalize(&N); - ibz_finalize(&M); - ibz_finalize(&norm_int); - ibz_finalize(&prod); - ibz_finalize(&gcd); - ibq_finalize(&norm); - quat_left_ideal_finalize(&lideal); - quat_left_ideal_finalize(&lideal2); - - if (res != 0){ - printf("Quaternion unit test lideal_generator_coprime failed\n"); - } - return(res); -} - -//int quat_lideal_mul(quat_left_ideal_t *product, const quat_left_ideal_t *lideal, const quat_alg_elem_t *alpha, const quat_alg_t *alg, int bound); -int quat_test_lideal_mul(){ - int res = 0; - - quat_alg_t alg; - quat_order_t order; + quat_lattice_t order; quat_alg_elem_t gen1, gen2, gen_prod; quat_left_ideal_t lideal, lideal2; quat_alg_init_set_ui(&alg, 103); - quat_order_init(&order); + quat_lattice_init(&order); quat_alg_elem_init(&gen1); quat_alg_elem_init(&gen2); quat_alg_elem_init(&gen_prod); quat_left_ideal_init(&lideal); quat_left_ideal_init(&lideal2); - - ibz_set(&order.denom, 2); - ibz_set(&order.basis[0][0], 2); - ibz_set(&order.basis[1][1], 2); - ibz_set(&order.basis[1][2], 1); - ibz_set(&order.basis[2][2], 1); - ibz_set(&order.basis[3][3], 1); - ibz_set(&order.basis[0][3], 1); + quat_lattice_O0_set(&order); ibz_set(&gen1.coord[0], 3); ibz_set(&gen1.coord[1], 5); @@ -474,46 +343,108 @@ int quat_test_lideal_mul(){ // Check that (O·gen1)·gen2 == O·(gen1·gen2) quat_lideal_create_principal(&lideal, &gen1, &order, &alg); - res |= !quat_lideal_mul(&lideal, &lideal, &gen2, &alg,0); + quat_lideal_mul(&lideal, &lideal, &gen2, &alg); quat_alg_mul(&gen_prod, &gen1, &gen2, &alg); quat_lideal_create_principal(&lideal2, &gen_prod, &order, &alg); res |= !quat_lideal_equals(&lideal, &lideal2, &alg); // Same test, but with non-integral gen2 - ibz_set(&(gen2.denom),2); + ibz_set(&(gen2.denom), 2); quat_lideal_create_principal(&lideal, &gen1, &order, &alg); - res |= !quat_lideal_mul(&lideal, &lideal, &gen2, &alg,0); + quat_lideal_mul(&lideal, &lideal, &gen2, &alg); quat_alg_mul(&gen_prod, &gen1, &gen2, &alg); quat_lideal_create_principal(&lideal2, &gen_prod, &order, &alg); res |= !quat_lideal_equals(&lideal, &lideal2, &alg); - + quat_alg_finalize(&alg); - quat_order_finalize(&order); + quat_lattice_finalize(&order); quat_alg_elem_finalize(&gen1); quat_alg_elem_finalize(&gen2); quat_alg_elem_finalize(&gen_prod); quat_left_ideal_finalize(&lideal); quat_left_ideal_finalize(&lideal2); - - if (res != 0){ + + if (res != 0) { printf("Quaternion unit test lideal_mul failed\n"); } - return(res); + return (res); } -//void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); -//void quat_lideal_inter(quat_left_ideal_t *intersection, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); -//int quat_lideal_equals(const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); -int quat_test_lideal_add_intersect_equals(){ +// void quat_lideal_conjugate_without_hnf(quat_left_ideal_t *conj, quat_lattice_t *new_parent_order, +// const quat_left_ideal_t *lideal, const quat_alg_t *alg); +int +quat_test_lideal_conj_without_hnf(void) +{ + int res = 0; + ibz_t n; + quat_lattice_t o, ro, rro, test, cmp; + quat_left_ideal_t lideal, conj; + quat_alg_elem_t gen; + quat_alg_t alg; + ibz_init(&n); + quat_alg_elem_init(&gen); + quat_lattice_init(&o); + quat_lattice_init(&ro); + quat_lattice_init(&rro); + quat_lattice_init(&test); + quat_left_ideal_init(&lideal); + quat_left_ideal_init(&conj); + quat_lattice_init(&cmp); + quat_alg_init_set_ui(&alg, 103); + ibz_set(&n, 25); + quat_alg_elem_set(&gen, 1, 2, 3, 0, 2); + quat_lattice_O0_set(&o); + quat_lideal_create(&lideal, &gen, &n, &o, &alg); + + quat_lideal_conjugate_without_hnf(&conj, &ro, &lideal, &alg); + quat_lattice_hnf(&(conj.lattice)); + quat_lattice_mul(&test, &(lideal.lattice), &(conj.lattice), &alg); + ibz_copy(&(cmp.denom), &(o.denom)); + ibz_mat_4x4_scalar_mul(&(cmp.basis), &n, &(o.basis)); + res = res || !quat_lattice_equal(&test, &cmp); + quat_lattice_mul(&test, &(conj.lattice), &(lideal.lattice), &alg); + ibz_copy(&(cmp.denom), &(ro.denom)); + ibz_mat_4x4_scalar_mul(&(cmp.basis), &n, &(ro.basis)); + res = res || !quat_lattice_equal(&test, &cmp); + quat_lideal_conjugate_without_hnf(&conj, &rro, &conj, &alg); + res = res || !quat_lattice_equal(&rro, &o); + conj.parent_order = &o; + quat_lattice_hnf(&(conj.lattice)); + res = res || !quat_lideal_equals(&conj, &lideal, &alg); + + if (res != 0) { + printf("Quaternion unit test lideal_conj_without_hnf failed\n"); + } + ibz_finalize(&n); + quat_alg_elem_finalize(&gen); + quat_lattice_finalize(&o); + quat_lattice_finalize(&ro); + quat_lattice_finalize(&rro); + quat_lattice_finalize(&test); + quat_lattice_finalize(&cmp); + quat_alg_finalize(&alg); + quat_left_ideal_finalize(&lideal); + quat_left_ideal_finalize(&conj); + return (res); +} + +// void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *I1, const quat_left_ideal_t +// *I2, const quat_alg_t *alg); void quat_lideal_inter(quat_left_ideal_t *intersection, const +// quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); int +// quat_lideal_equals(const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t +// *alg); +int +quat_test_lideal_add_intersect_equals(void) +{ int res = 0; quat_alg_t alg; - quat_order_t order; + quat_lattice_t order; quat_alg_elem_t gen1, gen2, gen3; ibz_t N1, N2, N3; quat_left_ideal_t lideal1, lideal2, lideal3, lideal4, lideal5; quat_alg_init_set_ui(&alg, 103); - quat_order_init(&order); + quat_lattice_init(&order); quat_alg_elem_init(&gen1); quat_alg_elem_init(&gen2); quat_alg_elem_init(&gen3); @@ -526,31 +457,25 @@ int quat_test_lideal_add_intersect_equals(){ quat_left_ideal_init(&lideal4); quat_left_ideal_init(&lideal5); - ibz_set(&order.denom, 2); - ibz_set(&order.basis[0][0], 2); - ibz_set(&order.basis[1][1], 2); - ibz_set(&order.basis[1][2], 1); - ibz_set(&order.basis[2][2], 1); - ibz_set(&order.basis[3][3], 1); - ibz_set(&order.basis[0][3], 1); + quat_lattice_O0_set(&order); ibz_set(&gen1.coord[0], 3); ibz_set(&gen1.coord[1], 5); ibz_set(&gen1.coord[2], 7); ibz_set(&gen1.coord[3], 11); ibz_set(&N1, 17); - quat_lideal_create_from_primitive(&lideal1, &gen1, &N1, &order, &alg); + quat_lideal_create(&lideal1, &gen1, &N1, &order, &alg); ibz_set(&gen2.coord[0], -2); ibz_set(&gen2.coord[1], 13); ibz_set(&gen2.coord[2], -17); ibz_set(&gen2.coord[3], 19); ibz_set(&N2, 43); - quat_lideal_create_from_primitive(&lideal2, &gen2, &N2, &order, &alg); + quat_lideal_create(&lideal2, &gen2, &N2, &order, &alg); quat_alg_mul(&gen3, &gen2, &gen1, &alg); quat_lideal_create_principal(&lideal3, &gen3, &order, &alg); - + // Union should be the whole ring quat_lideal_add(&lideal4, &lideal1, &lideal2, &alg); res |= !ibz_is_one(&lideal4.norm); @@ -559,7 +484,7 @@ int quat_test_lideal_add_intersect_equals(){ // Self-intersection should be stable quat_lideal_inter(&lideal4, &lideal1, &lideal1, &alg); res |= !quat_lideal_equals(&lideal4, &lideal1, &alg); - + // Self-union should be stable quat_lideal_add(&lideal4, &lideal1, &lideal1, &alg); res |= !quat_lideal_equals(&lideal4, &lideal1, &alg); @@ -582,10 +507,10 @@ int quat_test_lideal_add_intersect_equals(){ quat_lideal_add(&lideal5, &lideal2, &lideal3, &alg); quat_lideal_inter(&lideal5, &lideal1, &lideal5, &alg); res |= !quat_lideal_equals(&lideal4, &lideal5, &alg); - res |= ibz_cmp_si(&lideal4.norm, 17); - + res |= ibz_cmp_int32(&lideal4.norm, 17); + quat_alg_finalize(&alg); - quat_order_finalize(&order); + quat_lattice_finalize(&order); quat_alg_elem_finalize(&gen1); quat_alg_elem_finalize(&gen2); quat_alg_elem_finalize(&gen3); @@ -597,371 +522,403 @@ int quat_test_lideal_add_intersect_equals(){ quat_left_ideal_finalize(&lideal3); quat_left_ideal_finalize(&lideal4); quat_left_ideal_finalize(&lideal5); - - if (res != 0){ + + if (res != 0) { printf("Quaternion unit test lideal_add_intersect_equals failed\n"); } - return(res); + return (res); } -//int quat_lideal_isom(quat_alg_elem_t *iso, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); -int quat_test_lideal_isom(){ +// void quat_lideal_inverse_lattice_without_hnf(quat_lattice_t *inv, const quat_left_ideal_t +// *lideal, const quat_alg_t *alg); +int +quat_test_lideal_inverse_lattice_without_hnf(void) +{ int res = 0; - quat_left_ideal_t lideal1,lideal2,prod; + quat_left_ideal_t lideal; + quat_lattice_t inv, prod; ibz_t norm; - quat_alg_elem_t init_helper, isom; - quat_order_t order, order2; + quat_alg_elem_t init_helper; + quat_lattice_t order; + quat_alg_t alg; + ibz_init(&norm); + quat_left_ideal_init(&lideal); + quat_lattice_init(&inv); + quat_lattice_init(&prod); + quat_alg_init_set_ui(&alg, 19); + quat_lattice_init(&order); + quat_alg_elem_init(&init_helper); + + ibz_set(&(order.basis[0][0]), 4); + ibz_set(&(order.basis[0][1]), 0); + ibz_set(&(order.basis[0][2]), 2); + ibz_set(&(order.basis[0][3]), 2); + ibz_set(&(order.basis[1][0]), 0); + ibz_set(&(order.basis[1][1]), 8); + ibz_set(&(order.basis[1][2]), 4); + ibz_set(&(order.basis[1][3]), 3); + ibz_set(&(order.basis[2][0]), 0); + ibz_set(&(order.basis[2][1]), 0); + ibz_set(&(order.basis[2][2]), 2); + ibz_set(&(order.basis[2][3]), 0); + ibz_set(&(order.basis[3][0]), 0); + ibz_set(&(order.basis[3][1]), 0); + ibz_set(&(order.basis[3][2]), 0); + ibz_set(&(order.basis[3][3]), 1); + ibz_set(&(order.denom), 4); + quat_alg_elem_set(&init_helper, 1, 2, 3, 0, 1); + ibz_set(&norm, 15); + quat_lideal_create(&lideal, &init_helper, &norm, &order, &alg); + quat_lideal_inverse_lattice_without_hnf(&inv, &lideal, &alg); + quat_lattice_mul(&prod, &(lideal.lattice), &inv, &alg); + res = res || !quat_lattice_equal(&prod, &order); + + if (res != 0) { + printf("Quaternion unit test lideal_inverse_lattice_without_hnf failed\n"); + } + ibz_finalize(&norm); + quat_left_ideal_finalize(&lideal); + quat_lattice_finalize(&inv); + quat_lattice_finalize(&prod); + quat_alg_finalize(&alg); + quat_lattice_finalize(&order); + quat_alg_elem_finalize(&init_helper); + return (res); +} + +// void quat_lideal_right_transporter(quat_lattice_t *trans, const quat_left_ideal_t *lideal1, const +// quat_left_ideal_t *lideal2, const quat_alg_t *alg); +int +quat_test_lideal_right_transporter(void) +{ + int res = 0; + quat_left_ideal_t lideal1, lideal2; + quat_lattice_t trans, prod; + ibz_t norm; + quat_alg_elem_t init_helper; + quat_lattice_t order; quat_alg_t alg; ibz_init(&norm); quat_left_ideal_init(&lideal1); quat_left_ideal_init(&lideal2); - quat_left_ideal_init(&prod); - quat_alg_init_set_ui(&alg,19); - quat_order_init(&order); - quat_order_init(&order2); - quat_alg_elem_init(&isom); + quat_lattice_init(&trans); + quat_lattice_init(&prod); + quat_alg_init_set_ui(&alg, 19); + quat_lattice_init(&order); quat_alg_elem_init(&init_helper); - ibz_set(&(order.basis[0][0]),4); - ibz_set(&(order.basis[0][1]),0); - ibz_set(&(order.basis[0][2]),2); - ibz_set(&(order.basis[0][3]),2); - ibz_set(&(order.basis[1][0]),0); - ibz_set(&(order.basis[1][1]),8); - ibz_set(&(order.basis[1][2]),4); - ibz_set(&(order.basis[1][3]),3); - ibz_set(&(order.basis[2][0]),0); - ibz_set(&(order.basis[2][1]),0); - ibz_set(&(order.basis[2][2]),2); - ibz_set(&(order.basis[2][3]),0); - ibz_set(&(order.basis[3][0]),0); - ibz_set(&(order.basis[3][1]),0); - ibz_set(&(order.basis[3][2]),0); - ibz_set(&(order.basis[3][3]),1); - ibz_set(&(order.denom),4); - quat_alg_elem_set(&init_helper,1,2,6,2,1); - quat_lideal_create_principal(&lideal1,&init_helper,&order,&alg); - quat_alg_elem_set(&init_helper,3,1,6,5,1); - res |= !quat_lideal_mul(&lideal2,&lideal1,&init_helper,&alg,0); - res = res || !quat_lideal_isom(&isom,&lideal1,&lideal2,&alg); - if(!res){ - res |= !quat_lideal_mul(&prod,&lideal1,&isom,&alg,0); - res = res || !quat_lideal_equals(&prod,&lideal2,&alg); - } - - // not same order - ibz_set(&(order2.basis[0][0]),2); - ibz_set(&(order2.basis[0][1]),0); - ibz_set(&(order2.basis[0][2]),1); - ibz_set(&(order2.basis[0][3]),0); - ibz_set(&(order2.basis[1][0]),0); - ibz_set(&(order2.basis[1][1]),2); - ibz_set(&(order2.basis[1][2]),0); - ibz_set(&(order2.basis[1][3]),1); - ibz_set(&(order2.basis[2][0]),0); - ibz_set(&(order2.basis[2][1]),0); - ibz_set(&(order2.basis[2][2]),1); - ibz_set(&(order2.basis[2][3]),0); - ibz_set(&(order2.basis[3][0]),0); - ibz_set(&(order2.basis[3][1]),0); - ibz_set(&(order2.basis[3][2]),0); - ibz_set(&(order2.basis[3][3]),1); - ibz_set(&(order2.denom),2); - quat_alg_elem_set(&init_helper,1,2,6,2,1); - quat_lideal_create_principal(&lideal2,&init_helper,&order2,&alg); - res = res || quat_lideal_isom(&isom,&lideal1,&lideal2,&alg); - - // should add test for not isomorphic ideals - - if (res != 0){ - printf("Quaternion unit test lideal_isom failed\n"); + ibz_set(&(order.basis[0][0]), 4); + ibz_set(&(order.basis[0][1]), 0); + ibz_set(&(order.basis[0][2]), 2); + ibz_set(&(order.basis[0][3]), 2); + ibz_set(&(order.basis[1][0]), 0); + ibz_set(&(order.basis[1][1]), 8); + ibz_set(&(order.basis[1][2]), 4); + ibz_set(&(order.basis[1][3]), 3); + ibz_set(&(order.basis[2][0]), 0); + ibz_set(&(order.basis[2][1]), 0); + ibz_set(&(order.basis[2][2]), 2); + ibz_set(&(order.basis[2][3]), 0); + ibz_set(&(order.basis[3][0]), 0); + ibz_set(&(order.basis[3][1]), 0); + ibz_set(&(order.basis[3][2]), 0); + ibz_set(&(order.basis[3][3]), 1); + ibz_set(&(order.denom), 4); + quat_alg_elem_set(&init_helper, 1, 2, 3, 0, 1); + ibz_set(&norm, 15); + quat_lideal_create(&lideal1, &init_helper, &norm, &order, &alg); + quat_alg_elem_set(&init_helper, 1, 4, 3, 0, 1); + ibz_set(&norm, 11); + quat_lideal_create(&lideal2, &init_helper, &norm, &order, &alg); + quat_lideal_right_transporter(&trans, &lideal1, &lideal2, &alg); + quat_lattice_mul(&prod, &(lideal1.lattice), &trans, &alg); + res = res || !quat_lattice_inclusion(&prod, &(lideal2.lattice)); + quat_lideal_right_transporter(&trans, &lideal2, &lideal1, &alg); + quat_lattice_mul(&prod, &(lideal2.lattice), &trans, &alg); + res = res || !quat_lattice_inclusion(&prod, &(lideal1.lattice)); + quat_lideal_right_transporter(&(lideal1.lattice), &lideal2, &lideal1, &alg); + res = res || !quat_lattice_equal(&trans, &(lideal1.lattice)); + quat_alg_elem_set(&init_helper, 1, 2, 3, 0, 1); + ibz_set(&norm, 15); + quat_lideal_create(&lideal1, &init_helper, &norm, &order, &alg); + quat_lideal_right_transporter(&(lideal2.lattice), &lideal2, &lideal1, &alg); + res = res || !quat_lattice_equal(&trans, &(lideal2.lattice)); + if (res != 0) { + printf("Quaternion unit test lideal_right_transporter failed\n"); } + ibz_finalize(&norm); quat_left_ideal_finalize(&lideal1); quat_left_ideal_finalize(&lideal2); - quat_left_ideal_finalize(&prod); - ibz_finalize(&norm); + quat_lattice_finalize(&trans); + quat_lattice_finalize(&prod); quat_alg_finalize(&alg); - quat_order_finalize(&order); - quat_order_finalize(&order2); - quat_alg_elem_finalize(&isom); + quat_lattice_finalize(&order); quat_alg_elem_finalize(&init_helper); - return(res); + return (res); } -//void quat_lideal_right_order(quat_order_t *order, const quat_left_ideal_t *lideal, const quat_alg_t *alg); -int quat_test_lideal_right_order(){ +// void quat_lideal_right_order(quat_lattice_t *order, const quat_left_ideal_t *lideal, const +// quat_alg_t *alg); +int +quat_test_lideal_right_order(void) +{ int res = 0; ibz_t norm; quat_alg_t alg; quat_alg_elem_t gen; - quat_order_t order,rorder; + quat_lattice_t order, rorder; quat_lattice_t prod; quat_alg_elem_t test; - quat_left_ideal_t lideal, cmp; - quat_order_init(&order); - quat_order_init(&rorder); + quat_left_ideal_t lideal; + quat_lattice_init(&order); + quat_lattice_init(&rorder); quat_lattice_init(&prod); - quat_alg_init_set_ui(&alg,19); + quat_alg_init_set_ui(&alg, 19); quat_left_ideal_init(&lideal); quat_alg_elem_init(&test); quat_alg_elem_init(&gen); + ibz_init(&norm); - ibz_set(&(order.basis[0][0]),4); - ibz_set(&(order.basis[0][1]),0); - ibz_set(&(order.basis[0][2]),2); - ibz_set(&(order.basis[0][3]),2); - ibz_set(&(order.basis[1][0]),0); - ibz_set(&(order.basis[1][1]),8); - ibz_set(&(order.basis[1][2]),4); - ibz_set(&(order.basis[1][3]),3); - ibz_set(&(order.basis[2][0]),0); - ibz_set(&(order.basis[2][1]),0); - ibz_set(&(order.basis[2][2]),2); - ibz_set(&(order.basis[2][3]),0); - ibz_set(&(order.basis[3][0]),0); - ibz_set(&(order.basis[3][1]),0); - ibz_set(&(order.basis[3][2]),0); - ibz_set(&(order.basis[3][3]),1); - ibz_set(&(order.denom),4); - quat_alg_elem_set(&gen,1,2,1,8,-8); - quat_lideal_create_principal(&lideal,&gen,&order,&alg); + ibz_set(&(order.basis[0][0]), 4); + ibz_set(&(order.basis[0][1]), 0); + ibz_set(&(order.basis[0][2]), 2); + ibz_set(&(order.basis[0][3]), 2); + ibz_set(&(order.basis[1][0]), 0); + ibz_set(&(order.basis[1][1]), 8); + ibz_set(&(order.basis[1][2]), 4); + ibz_set(&(order.basis[1][3]), 3); + ibz_set(&(order.basis[2][0]), 0); + ibz_set(&(order.basis[2][1]), 0); + ibz_set(&(order.basis[2][2]), 2); + ibz_set(&(order.basis[2][3]), 0); + ibz_set(&(order.basis[3][0]), 0); + ibz_set(&(order.basis[3][1]), 0); + ibz_set(&(order.basis[3][2]), 0); + ibz_set(&(order.basis[3][3]), 1); + ibz_set(&(order.denom), 4); + quat_alg_elem_set(&gen, 1, 3, 3, 0, 1); + ibz_set(&norm, 15); + quat_lideal_create(&lideal, &gen, &norm, &order, &alg); - quat_lideal_right_order(&rorder,&lideal,&alg); + quat_lideal_right_order(&rorder, &lideal, &alg); // test order is in HNF res = res || !ibz_mat_4x4_is_hnf(&(rorder.basis)); // test order is of dimension 4 (assuming HNF) - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(rorder.denom),&(rorder.basis[0][i]),&(rorder.basis[1][i]),&(rorder.basis[2][i]),&(rorder.basis[3][i])); - res = res || quat_alg_elem_is_zero(&test); + for (int i = 0; i < 4; i++) { + res = res || ibz_is_zero(&(rorder.basis[i][i])); } // test order contains 1 - quat_alg_elem_set(&test,1,1,0,0,0); - res = res || !quat_lattice_contains(NULL,&rorder,&test,&alg); + quat_alg_elem_set(&test, 1, 1, 0, 0, 0); + res = res || !quat_lattice_contains(NULL, &rorder, &test); + // test it is stable by product + quat_lattice_mul(&prod, &rorder, &rorder, &alg); + res = res || !quat_lattice_inclusion(&prod, &rorder); // test it is right order of ideal - quat_lattice_mul(&prod,&(lideal.lattice),&rorder,&alg); - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(prod.denom),&(prod.basis[0][i]),&(prod.basis[1][i]),&(prod.basis[2][i]),&(prod.basis[3][i])); - res = res || !quat_lattice_contains(NULL,&(lideal.lattice),&test,&alg); - } + quat_lattice_mul(&prod, &(lideal.lattice), &rorder, &alg); + res = res || !quat_lattice_inclusion(&prod, &(lideal.lattice)); - ibz_set(&(order.basis[0][0]),2); - ibz_set(&(order.basis[0][1]),0); - ibz_set(&(order.basis[0][2]),1); - ibz_set(&(order.basis[0][3]),0); - ibz_set(&(order.basis[1][0]),0); - ibz_set(&(order.basis[1][1]),2); - ibz_set(&(order.basis[1][2]),0); - ibz_set(&(order.basis[1][3]),1); - ibz_set(&(order.basis[2][0]),0); - ibz_set(&(order.basis[2][1]),0); - ibz_set(&(order.basis[2][2]),1); - ibz_set(&(order.basis[2][3]),0); - ibz_set(&(order.basis[3][0]),0); - ibz_set(&(order.basis[3][1]),0); - ibz_set(&(order.basis[3][2]),0); - ibz_set(&(order.basis[3][3]),1); - ibz_set(&(order.denom),2); - quat_alg_elem_set(&gen,1,1,2,8,8); - quat_lideal_create_principal(&lideal,&gen,&order,&alg); + quat_lattice_O0_set(&order); - quat_lideal_right_order(&rorder,&lideal,&alg); - quat_lattice_mul(&prod,&(lideal.lattice),&rorder,&alg); + quat_alg_elem_set(&gen, 1, 1, 1, 1, 0); + ibz_set(&norm, 35); + quat_lideal_create(&lideal, &gen, &norm, &order, &alg); + + quat_lideal_right_order(&rorder, &lideal, &alg); + quat_lattice_mul(&prod, &(lideal.lattice), &rorder, &alg); // test order is in HNF res = res || !ibz_mat_4x4_is_hnf(&(rorder.basis)); // test order is of dimension 4 (assuming HNF) - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(rorder.denom),&(rorder.basis[0][i]),&(rorder.basis[1][i]),&(rorder.basis[2][i]),&(rorder.basis[3][i])); - res = res || quat_alg_elem_is_zero(&test); + for (int i = 0; i < 4; i++) { + res = res || ibz_is_zero(&(rorder.basis[i][i])); } // test order contains 1 - quat_alg_elem_set(&test,1,1,0,0,0); - res = res || !quat_lattice_contains(NULL,&rorder,&test,&alg); + quat_alg_elem_set(&test, 1, 1, 0, 0, 0); + res = res || !quat_lattice_contains(NULL, &rorder, &test); + // test it is stable by product + quat_lattice_mul(&prod, &rorder, &rorder, &alg); + res = res || !quat_lattice_inclusion(&prod, &rorder); // test it is right order of ideal - quat_lattice_mul(&prod,&(lideal.lattice),&rorder,&alg); - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(prod.denom),&(prod.basis[0][i]),&(prod.basis[1][i]),&(prod.basis[2][i]),&(prod.basis[3][i])); - res = res || !quat_lattice_contains(NULL,&(lideal.lattice),&test,&alg); - } + quat_lattice_mul(&prod, &(lideal.lattice), &rorder, &alg); + res = res || !quat_lattice_inclusion(&prod, &(lideal.lattice)); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lideal_right_order failed\n"); } quat_alg_elem_finalize(&test); - quat_order_finalize(&order); - quat_order_finalize(&rorder); + quat_lattice_finalize(&order); + quat_lattice_finalize(&rorder); quat_lattice_finalize(&prod); quat_left_ideal_finalize(&lideal); quat_alg_finalize(&alg); quat_alg_elem_finalize(&gen); - return(res); + ibz_finalize(&norm); + return (res); } -//void quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, ibz_mat_4x4_t *gram, const quat_left_ideal_t *lideal, const quat_alg_t *alg); //replaces lideal_lll -int quat_test_lideal_reduce_basis(){ +/********************* Functions from quaternion_tools.c **********************/ + +// int quat_order_discriminant(ibz_t *disc, const quat_lattice_t *order, const quat_alg_t *alg); +int +quat_test_lideal_order_discriminant(void) +{ int res = 0; - ibz_mat_4x4_t red, gram, prod; - quat_left_ideal_t lideal; - quat_lattice_t test; + ibz_t disc; quat_alg_t alg; - quat_alg_elem_t init_helper; - quat_order_t order; - ibq_t coeff; - ibz_t num,denom; - ibz_init(&num); - ibz_init(&denom); - ibq_init(&coeff); - ibz_mat_4x4_init(&prod); - quat_lattice_init(&test); - quat_alg_elem_init(&init_helper); - quat_order_init(&order); - quat_alg_init_set_ui(&alg,19); - ibz_mat_4x4_init(&gram); - ibz_mat_4x4_init(&red); - quat_left_ideal_init(&lideal); + quat_lattice_t order; + ibz_init(&disc); + quat_lattice_init(&order); + quat_alg_init_set_ui(&alg, 43); + quat_lattice_O0_set(&order); + quat_order_discriminant(&disc, &order, &alg); + res = res | ibz_cmp(&(alg.p), &disc); + if (res != 0) { + printf("Quaternion unit test lideal_order_discriminant failed\n"); + } + ibz_finalize(&disc); + quat_lattice_finalize(&order); + quat_alg_finalize(&alg); + return (res); +} + +// int quat_order_is_maximal(const quat_lattice_t *order, const quat_alg_t *alg); +int +quat_test_lideal_order_is_maximal(void) +{ + int res = 0; + quat_alg_t alg; + quat_lattice_t order; + quat_lattice_init(&order); + quat_alg_init_set_ui(&alg, 43); + quat_lattice_O0_set(&order); + res = res | !quat_order_is_maximal(&order, &alg); ibz_mat_4x4_identity(&(order.basis)); - ibz_set(&(order.denom),2); - quat_alg_elem_set(&init_helper,1,1,2,8,8); - quat_lideal_create_principal(&lideal,&init_helper,&order,&alg); - quat_lattice_reduce_denom(&(lideal.lattice),&(lideal.lattice)); - quat_lideal_reduce_basis(&red,&gram,&lideal,&alg); - // test if red is lll-reduced, assuming he used coeff was at least 3/4 - ibz_set(&num,99); - ibz_set(&denom,100); - ibq_set(&coeff,&num,&denom); - res = res || !quat_dim4_lll_verify(&red,&coeff,&(alg.p)); - // test reduced and lideal generate same lattice - ibz_mat_4x4_copy(&(test.basis),&red); - ibz_copy(&(test.denom),&(lideal.lattice.denom)); - quat_lattice_hnf(&test); - res = res || !quat_lattice_equal(&(lideal.lattice),&test); - // test gram matrix is gram matrix - ibz_mat_4x4_transpose(&prod,&red); - ibz_mat_4x4_mul(&prod,&prod,&(alg.gram)); - ibz_mat_4x4_mul(&prod,&prod,&red); - res = res || !ibz_mat_4x4_equal(&prod,&gram); - if (res != 0){ - printf("Quaternion unit test lideal_reduce_basis failed\n"); + ibz_set(&(order.denom), 1); + res = res | quat_order_is_maximal(&order, &alg); + if (res != 0) { + printf("Quaternion unit test lideal__order_is_maximal failed\n"); } - ibz_finalize(&num); - ibz_finalize(&denom); - ibq_finalize(&coeff); - quat_lattice_finalize(&test); - quat_alg_elem_finalize(&init_helper); - ibz_mat_4x4_finalize(&prod); - quat_order_finalize(&order); + quat_lattice_finalize(&order); quat_alg_finalize(&alg); - ibz_mat_4x4_finalize(&gram); - ibz_mat_4x4_finalize(&red); - quat_left_ideal_finalize(&lideal); - return(res); + return (res); } -/***************************** Functions from quaternion_tools.c ***************************************/ - -//void quat_connecting_ideal(quat_left_ideal_t *connecting_ideal, const quat_order_t *O1, const quat_order_t *O2, const quat_alg_t *alg); -int quat_test_lideal_connecting_ideal(){ +// void quat_lideal_class_gram(ibz_mat_4x4_t *G, const quat_left_ideal_t *lideal, const quat_alg_t +// *alg); +int +quat_test_lideal_class_gram() +{ int res = 0; - ibz_t norm; + ibz_t norm, norm1, norm2, cmp; + ibz_mat_4x4_t gram, gram_l; + quat_left_ideal_t lideal; + quat_lattice_t order; + quat_alg_elem_t elem, elem1, elem2; + ibz_vec_4_t vec, vec1, vec2; quat_alg_t alg; - quat_alg_elem_t gen; - quat_order_t o1, o2; - quat_lattice_t prod; - quat_alg_elem_t test; - quat_left_ideal_t lideal, cmp; - quat_order_init(&o1); - quat_order_init(&o2); - quat_lattice_init(&prod); - quat_alg_init_set_ui(&alg,19); + ibz_init(&norm); + ibz_init(&norm1); + ibz_init(&norm2); + ibz_init(&cmp); + ibz_mat_4x4_init(&gram); + ibz_mat_4x4_init(&gram_l); + ibz_vec_4_init(&vec); + ibz_vec_4_init(&vec1); + ibz_vec_4_init(&vec2); quat_left_ideal_init(&lideal); - quat_alg_elem_init(&test); + quat_lattice_init(&order); + quat_alg_elem_init(&elem); + quat_alg_elem_init(&elem1); + quat_alg_elem_init(&elem2); + quat_alg_init_set_ui(&alg, 103); - ibz_set(&(o1.basis[0][0]),4); - ibz_set(&(o1.basis[0][1]),0); - ibz_set(&(o1.basis[0][2]),2); - ibz_set(&(o1.basis[0][3]),2); - ibz_set(&(o1.basis[1][0]),0); - ibz_set(&(o1.basis[1][1]),8); - ibz_set(&(o1.basis[1][2]),4); - ibz_set(&(o1.basis[1][3]),3); - ibz_set(&(o1.basis[2][0]),0); - ibz_set(&(o1.basis[2][1]),0); - ibz_set(&(o1.basis[2][2]),2); - ibz_set(&(o1.basis[2][3]),0); - ibz_set(&(o1.basis[3][0]),0); - ibz_set(&(o1.basis[3][1]),0); - ibz_set(&(o1.basis[3][2]),0); - ibz_set(&(o1.basis[3][3]),1); - ibz_set(&(o1.denom),4); + // setup + quat_lattice_O0_set(&order); + ibz_set(&cmp, 101); + quat_alg_elem_set(&elem, 1, 9, 4, 1, 1); + quat_lideal_create(&lideal, &elem, &cmp, &order, &alg); - ibz_set(&(o2.basis[0][0]),2); - ibz_set(&(o2.basis[0][1]),0); - ibz_set(&(o2.basis[0][2]),1); - ibz_set(&(o2.basis[0][3]),0); - ibz_set(&(o2.basis[1][0]),0); - ibz_set(&(o2.basis[1][1]),2); - ibz_set(&(o2.basis[1][2]),0); - ibz_set(&(o2.basis[1][3]),1); - ibz_set(&(o2.basis[2][0]),0); - ibz_set(&(o2.basis[2][1]),0); - ibz_set(&(o2.basis[2][2]),1); - ibz_set(&(o2.basis[2][3]),0); - ibz_set(&(o2.basis[3][0]),0); - ibz_set(&(o2.basis[3][1]),0); - ibz_set(&(o2.basis[3][2]),0); - ibz_set(&(o2.basis[3][3]),1); - ibz_set(&(o2.denom),2); + // test relation to lattice_gram output + quat_lideal_class_gram(&gram, &lideal, &alg); + ibz_mul(&cmp, &(lideal.lattice.denom), &(lideal.lattice.denom)); + ibz_mul(&cmp, &cmp, &(lideal.norm)); + ibz_mat_4x4_scalar_mul(&gram, &cmp, &gram); + quat_lattice_gram(&gram_l, &(lideal.lattice), &alg); + res = res | !ibz_mat_4x4_equal(&gram, &gram_l); - quat_connecting_ideal(&lideal,&o1,&o2,&alg); - quat_lattice_mul(&prod,&o1,&(lideal.lattice),&alg); - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(prod.denom),&(prod.basis[0][i]),&(prod.basis[1][i]),&(prod.basis[2][i]),&(prod.basis[3][i])); - res = res || !quat_lattice_contains(NULL,&(lideal.lattice),&test,&alg); - } - quat_lattice_mul(&prod,&(lideal.lattice),&o2,&alg); - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(prod.denom),&(prod.basis[0][i]),&(prod.basis[1][i]),&(prod.basis[2][i]),&(prod.basis[3][i])); - res = res || !quat_lattice_contains(NULL,&(lideal.lattice),&test,&alg); - } + // repeat lattice_gram test + quat_alg_elem_set(&elem1, 2, 360, 149, 1, 0); + quat_alg_elem_set(&elem2, 2, 53, 360, 0, 1); + int ok = quat_lattice_contains(&vec1, &(lideal.lattice), &elem1); + ok = ok && quat_lattice_contains(&vec2, &(lideal.lattice), &elem2); + assert(ok); + quat_alg_conj(&elem2, &elem2); + quat_alg_mul(&elem1, &elem1, &elem2, &alg); + ibz_mul(&norm1, &(elem1.coord[0]), &ibz_const_two); + ibz_div(&norm1, &cmp, &norm1, &(elem1.denom)); - quat_connecting_ideal(&lideal,&o2,&o2,&alg); - quat_lattice_mul(&prod,&o2,&(lideal.lattice),&alg); - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(prod.denom),&(prod.basis[0][i]),&(prod.basis[1][i]),&(prod.basis[2][i]),&(prod.basis[3][i])); - res = res || !quat_lattice_contains(NULL,&(lideal.lattice),&test,&alg); - } - quat_lattice_mul(&prod,&(lideal.lattice),&o2,&alg); - for(int i = 0; i < 4; i++){ - quat_alg_elem_copy_ibz(&test,&(prod.denom),&(prod.basis[0][i]),&(prod.basis[1][i]),&(prod.basis[2][i]),&(prod.basis[3][i])); - res = res || !quat_lattice_contains(NULL,&(lideal.lattice),&test,&alg); + ibz_mat_4x4_eval(&vec1, &gram, &vec1); + ibz_set(&norm2, 0); + for (int i = 0; i < 4; i++) { + ibz_mul(&cmp, &(vec1[i]), &(vec2[i])); + ibz_add(&norm2, &norm2, &cmp); } + ibz_div(&norm2, &cmp, &norm2, &(lideal.lattice.denom)); + ibz_div(&norm2, &cmp, &norm2, &(lideal.lattice.denom)); - if (res != 0){ - printf("Quaternion unit test lideal_connecting_ideal failed\n"); + res = res | !(0 == ibz_cmp(&norm1, &norm2)); + + // test for norm + quat_lideal_class_gram(&gram, &lideal, &alg); + quat_lattice_contains(&vec, &(lideal.lattice), &elem); + quat_alg_norm(&norm, &cmp, &elem, &alg); + assert(ibz_is_one(&cmp)); + ibz_mul(&norm, &norm, &ibz_const_two); + ibz_div(&norm, &cmp, &norm, &(lideal.norm)); + + assert(ibz_is_zero(&cmp)); + quat_qf_eval(&cmp, &gram, &vec); + res = res | !(0 == ibz_cmp(&cmp, &norm)); + + if (res != 0) { + printf("Quaternion unit test lideal_class_gram failed\n"); } - quat_alg_elem_finalize(&test); - quat_order_finalize(&o1); - quat_order_finalize(&o2); - quat_lattice_finalize(&prod); + ibz_finalize(&norm); + ibz_finalize(&norm1); + ibz_finalize(&norm2); + ibz_finalize(&cmp); + ibz_mat_4x4_finalize(&gram); + ibz_mat_4x4_finalize(&gram_l); + ibz_vec_4_finalize(&vec); + ibz_vec_4_finalize(&vec1); + ibz_vec_4_finalize(&vec2); quat_left_ideal_finalize(&lideal); + quat_lattice_finalize(&order); + quat_alg_elem_finalize(&elem); + quat_alg_elem_finalize(&elem1); + quat_alg_elem_finalize(&elem2); quat_alg_finalize(&alg); - return(res); + return (res); } // run all previous tests -int quat_test_lideal(){ +int +quat_test_lideal(void) +{ int res = 0; printf("\nRunning quaternion tests of ideal and order functions\n"); + res = res | quat_test_lideal_norm(); + res = res | quat_test_lideal_copy(); res = res | quat_test_lideal_create_principal(); res = res | quat_test_lideal_create_from_primitive(); - res = res | quat_test_lideal_make_primitive_then_create(); - res = res | quat_test_lideal_random_2e(); res = res | quat_test_lideal_generator(); - res = res | quat_test_lideal_generator_coprime(); res = res | quat_test_lideal_mul(); + res = res | quat_test_lideal_conj_without_hnf(); res = res | quat_test_lideal_add_intersect_equals(); - res = res | quat_test_lideal_isom(); + res = res | quat_test_lideal_inverse_lattice_without_hnf(); + res = res | quat_test_lideal_right_transporter(); res = res | quat_test_lideal_right_order(); - res = res | quat_test_lideal_reduce_basis(); - res = res | quat_test_lideal_connecting_ideal(); - return(res); + res = res | quat_test_lideal_order_discriminant(); + res = res | quat_test_lideal_order_is_maximal(); + res = res | quat_test_lideal_class_gram(); + return (res); } diff --git a/src/quaternion/ref/generic/test/intbig.c b/src/quaternion/ref/generic/test/intbig.c new file mode 100644 index 0000000..2a91d2a --- /dev/null +++ b/src/quaternion/ref/generic/test/intbig.c @@ -0,0 +1,977 @@ +#include +#include +#include +#include +#include "intbig_internal.h" + +// void ibz_init(ibz_t *x); +// void ibz_finalize(ibz_t *x); +// int ibz_cmp(const ibz_t *a, const ibz_t *b); +// int ibz_is_zero(const ibz_t *x); +// int ibz_is_one(const ibz_t *x); +// int ibz_cmp_int32(const ibz_t *x, int32_t y); +// int ibz_is_even(const ibz_t *x); +// int ibz_is_odd(const ibz_t *x); +// void ibz_set(ibz_t *i, int32_t x); +// void ibz_copy(ibz_t *target, const ibz_t *value); +// void ibz_swap(ibz_t *a, ibz_t *b); +// int32_t ibz_get(const ibz_t *i); +// int ibz_bitsize(const ibz_t *a); +int +ibz_test_init_set_cmp() +{ + int res = 0; + ibz_t a, b, c; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + + res = res | !ibz_is_zero(&a); + ibz_set(&a, 1); + res = res | !ibz_is_one(&a); + res = res | ibz_is_zero(&a); + res = res | (0 != ibz_cmp(&b, &c)); + res = res | (0 == ibz_cmp(&a, &c)); + res = res | ibz_is_even(&a); + res = res | !ibz_is_odd(&a); + res = res | !ibz_is_even(&b); + res = res | ibz_is_odd(&b); + ibz_copy(&b, &a); + res = res | !ibz_is_one(&a); + res = res | !ibz_is_one(&b); + res = res | (0 != ibz_cmp(&a, &b)); + res = res | (0 == ibz_cmp(&c, &b)); + ibz_swap(&b, &c); + res = res | (0 == ibz_cmp(&a, &b)); + res = res | (0 == ibz_cmp(&c, &b)); + res = res | (0 != ibz_cmp(&a, &c)); + res = res | (ibz_bitsize(&a) != 1); + res = res | (ibz_get(&a) != 1); + res = res | (ibz_cmp_int32(&a, 1) != 0); + res = res | (ibz_bitsize(&b) > 1); + res = res | (ibz_get(&b) != 0); + res = res | (ibz_cmp_int32(&b, 0) != 0); + + ibz_set(&a, -1); + res = res | !(ibz_cmp(&a, &b) < 0); + res = res | !(ibz_cmp(&b, &c) < 0); + res = res | !(ibz_cmp(&b, &a) > 0); + res = res | !(ibz_cmp(&c, &b) > 0); + ibz_copy(&b, &a); + res = res | (0 != ibz_cmp(&a, &b)); + res = res | (0 == ibz_cmp(&c, &b)); + ibz_swap(&b, &c); + res = res | (0 == ibz_cmp(&a, &b)); + res = res | (0 != ibz_cmp(&c, &a)); + + ibz_set_from_str(&a, "-10000000000000000011111100000001", 10); + res = res | !(ibz_cmp(&a, &b) < 0); + res = res | !(ibz_cmp(&b, &a) > 0); + ibz_copy(&b, &a); + res = res | (0 != ibz_cmp(&a, &b)); + res = res | (0 == ibz_cmp(&c, &b)); + ibz_swap(&b, &c); + res = res | (0 == ibz_cmp(&a, &b)); + res = res | (0 != ibz_cmp(&c, &a)); + + ibz_set_from_str(&a, "1aaaa00000000000000000123", 16); + res = res | !(ibz_cmp(&a, &c) > 0); + res = res | !(ibz_cmp(&c, &a) < 0); + res = res | (ibz_bitsize(&a) != 4 * 24 + 1); + res = res | (ibz_get(&a) != 16 * 18 + 3); + if (res) { + printf("Quaternion module integer group test ibz_test_init_set_cmp failed\n"); + } + + ibz_set_from_str(&a, "deadbeef12345678", 16); + res = res | (ibz_get(&a) != 0x12345678); + + // Test INT32_MAX and INT32_MIN + ibz_set_from_str(&a, "-2147483648", 10); + ibz_set(&b, INT32_MIN); + res = res | (ibz_get(&a) != -2147483648); + res = res | (ibz_cmp_int32(&a, -2147483648) != 0); + res = res | (0 != ibz_cmp(&a, &b)); + ibz_set_from_str(&a, "2147483647", 10); + ibz_set(&b, INT32_MAX); + res = res | (ibz_get(&a) != 2147483647); + res = res | (ibz_cmp_int32(&a, 2147483647) != 0); + res = res | (0 != ibz_cmp(&a, &b)); + + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + return (res); +} + +// void ibz_add(ibz_t *sum, const ibz_t *a, const ibz_t *b); +// void ibz_sub(ibz_t *diff, const ibz_t *a, const ibz_t *b); +// void ibz_neg(ibz_t *neg, const ibz_t *a); +// void ibz_abs(ibz_t *abs, const ibz_t *a); +int +ibz_test_add_sub_neg_abs() +{ + int res = 0; + ibz_t a, b, c, d, r, q, m; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&d); + ibz_init(&r); + ibz_init(&q); + ibz_init(&m); + + ibz_set_from_str(&a, "10000111100002222", 16); + ibz_copy(&c, &a); + ibz_add(&d, &a, &b); + res = res | (0 != ibz_cmp(&b, &q)); + res = res | (0 != ibz_cmp(&a, &c)); + res = res | (0 != ibz_cmp(&d, &c)); + ibz_add(&d, &b, &a); + res = res | (0 != ibz_cmp(&b, &q)); + res = res | (0 != ibz_cmp(&a, &c)); + res = res | (0 != ibz_cmp(&d, &c)); + // add test for adding non-0, sub, mul, ... + ibz_set_from_str(&b, "20000111100002223", 16); + ibz_set_from_str(&c, "30000222200004445", 16); + ibz_add(&d, &a, &b); + res = res | (0 != ibz_cmp(&d, &c)); + ibz_neg(&m, &a); + ibz_add(&q, &m, &d); + res = res | (0 != ibz_cmp(&q, &b)); + ibz_neg(&m, &m); + res = res | (0 != ibz_cmp(&m, &a)); + ibz_add(&q, &m, &b); + res = res | (0 != ibz_cmp(&q, &c)); + ibz_neg(&m, &m); + ibz_sub(&q, &b, &m); + res = res | (0 != ibz_cmp(&q, &c)); + ibz_neg(&m, &m); + res = res | (0 != ibz_cmp(&a, &m)); + ibz_sub(&q, &d, &a); + res = res | (0 != ibz_cmp(&q, &b)); + ibz_neg(&d, &d); + ibz_neg(&m, &a); + ibz_neg(&c, &b); + ibz_sub(&q, &d, &m); + res = res | (0 != ibz_cmp(&q, &c)); + ibz_sub(&q, &m, &b); + res = res | (0 != ibz_cmp(&q, &d)); + ibz_abs(&r, &r); + res = res | !ibz_is_zero(&r); + ibz_abs(&r, &a); + res = res | (0 != ibz_cmp(&a, &r)); + ibz_abs(&r, &m); + res = res | (0 != ibz_cmp(&a, &r)); + ibz_neg(&m, &m); + res = res | (0 != ibz_cmp(&a, &m)); + + if (res) { + printf("Quaternion module integer group test ibz_test_add_sub_neg_abs failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&d); + ibz_finalize(&r); + ibz_finalize(&q); + ibz_finalize(&m); + return (res); +} + +// void ibz_mul(ibz_t *prod, const ibz_t *a, const ibz_t *b); +// void ibz_sqrt_floor(ibz_t *sqrt, const ibz_t *a); +int +ibz_test_mul_sqrt() +{ + int res = 0; + ibz_t a, b, c, d, r, q, m; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&d); + ibz_init(&r); + ibz_init(&q); + ibz_init(&m); + + // zero + ibz_set_from_str(&a, "2113309833171849999003363", 10); + ibz_copy(&c, &a); + ibz_set(&b, 0); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &b)); + res = res | (0 != ibz_cmp(&a, &c)); + ibz_mul(&m, &b, &a); + res = res | (0 != ibz_cmp(&m, &b)); + res = res | (0 != ibz_cmp(&a, &c)); + // one + ibz_set(&b, 1); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &a)); + res = res | (0 != ibz_cmp(&a, &c)); + ibz_mul(&m, &b, &a); + res = res | (0 != ibz_cmp(&m, &a)); + res = res | (0 != ibz_cmp(&a, &c)); + // -1 + ibz_neg(&b, &b); + ibz_neg(&d, &a); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &d)); + res = res | (0 != ibz_cmp(&a, &c)); + ibz_mul(&m, &b, &a); + res = res | (0 != ibz_cmp(&m, &d)); + res = res | (0 != ibz_cmp(&a, &c)); + // larger + ibz_set_from_str(&b, "34575345632322576567896", 10); + ibz_set_from_str(&c, "73068417910102676801285574959599851857101834248", 10); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &c)); + ibz_neg(&b, &b); + ibz_neg(&a, &a); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &c)); + ibz_neg(&a, &a); + ibz_neg(&c, &c); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &c)); + ibz_neg(&b, &b); + ibz_neg(&a, &a); + ibz_mul(&m, &a, &b); + res = res | (0 != ibz_cmp(&m, &c)); + + // sqrt tests + ibz_abs(&b, &b); + ibz_abs(&a, &a); + ibz_mul(&m, &a, &a); + ibz_sqrt_floor(&d, &m); + res = res | (0 != ibz_cmp(&d, &a)); + ibz_mul(&m, &b, &b); + ibz_sqrt_floor(&d, &m); + res = res | (0 != ibz_cmp(&d, &b)); + ibz_set(&d, 1); + ibz_mul(&m, &b, &b); + ibz_sub(&m, &m, &d); + ibz_sub(&c, &b, &d); + ibz_sqrt_floor(&d, &m); + res = res | (0 != ibz_cmp(&d, &c)); + + if (res) { + printf("Quaternion module integer group test ibz_test_mul_sqrt failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&d); + ibz_finalize(&r); + ibz_finalize(&q); + ibz_finalize(&m); + return (res); +} + +// void ibz_div(ibz_t *quotient, ibz_t *remainder, const ibz_t *a, const ibz_t *b); +// int ibz_divides(const ibz_t *a, const ibz_t *b); +int +ibz_test_div() +{ + int res = 0; + ibz_t a, b, c, d, r, q, m; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&d); + ibz_init(&r); + ibz_init(&q); + ibz_init(&m); + + // one + ibz_set_from_str(&a, "2113309833171849999003363", 10); + ibz_copy(&c, &a); + ibz_set(&b, 1); + ibz_copy(&d, &b); + res = res | !ibz_divides(&a, &b); + ibz_div(&q, &r, &a, &b); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &a)); + res = res | (0 != ibz_cmp(&c, &a)); + res = res | (0 != ibz_cmp(&b, &d)); + // not one, zero remainder + ibz_set_from_str(&b, "15678200126527887351125", 10); + ibz_mul(&d, &a, &b); + ibz_copy(&c, &d); + res = res | !ibz_divides(&d, &b); + res = res | !ibz_divides(&d, &a); + res = res | !ibz_divides(&d, &d); + ibz_div(&q, &r, &d, &b); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &a)); + ibz_div(&q, &r, &d, &a); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &b)); + // flipping signs + ibz_neg(&a, &a); + ibz_neg(&b, &b); + ibz_div(&q, &r, &d, &b); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &a)); + ibz_div(&q, &r, &d, &a); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &b)); + ibz_neg(&a, &a); + ibz_neg(&d, &d); + ibz_div(&q, &r, &d, &b); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &a)); + ibz_div(&q, &r, &d, &a); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &b)); + ibz_neg(&a, &a); + ibz_neg(&b, &b); + ibz_div(&q, &r, &d, &b); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &a)); + ibz_div(&q, &r, &d, &a); + res = res | !ibz_is_zero(&r); + res = res | (0 != ibz_cmp(&q, &b)); + // non-zero remainder + ibz_neg(&a, &a); + ibz_neg(&d, &d); + ibz_set_from_str(&c, "8678205677345432110000", 10); + ibz_add(&d, &d, &c); + ibz_div(&q, &r, &d, &b); + ibz_mul(&m, &q, &b); + ibz_add(&m, &m, &r); + res = res | (0 != ibz_cmp(&d, &m)); + ibz_abs(&m, &r); + ibz_abs(&q, &b); + res = res | (0 <= ibz_cmp(&m, &q)); + ibz_set(&q, 0); + res = + res | !(((ibz_cmp(&q, &r) <= 0) && (ibz_cmp(&q, &d) < 0)) || ((ibz_cmp(&q, &r) >= 0) && (ibz_cmp(&r, &d) > 0))); + // flip signs + ibz_neg(&d, &d); + ibz_div(&q, &r, &d, &b); + ibz_mul(&m, &q, &b); + ibz_add(&m, &m, &r); + res = res | (0 != ibz_cmp(&d, &m)); + ibz_abs(&m, &r); + ibz_abs(&q, &b); + res = res | (0 <= ibz_cmp(&m, &q)); + ibz_set(&q, 0); + res = + res | !(((ibz_cmp(&q, &r) <= 0) && (ibz_cmp(&q, &d) < 0)) || ((ibz_cmp(&q, &r) >= 0) && (ibz_cmp(&r, &d) > 0))); + ibz_neg(&b, &b); + ibz_div(&q, &r, &d, &b); + ibz_mul(&m, &q, &b); + ibz_add(&m, &m, &r); + res = res | (0 != ibz_cmp(&d, &m)); + ibz_abs(&m, &r); + ibz_abs(&q, &b); + res = res | (0 <= ibz_cmp(&m, &q)); + ibz_set(&q, 0); + res = + res | !(((ibz_cmp(&q, &r) <= 0) && (ibz_cmp(&q, &d) < 0)) || ((ibz_cmp(&q, &r) >= 0) && (ibz_cmp(&r, &d) > 0))); + ibz_neg(&d, &d); + ibz_div(&q, &r, &d, &b); + ibz_mul(&m, &q, &b); + ibz_add(&m, &m, &r); + res = res | (0 != ibz_cmp(&d, &m)); + ibz_abs(&m, &r); + ibz_abs(&q, &b); + res = res | (0 <= ibz_cmp(&m, &q)); + ibz_set(&q, 0); + res = + res | !(((ibz_cmp(&q, &r) <= 0) && (ibz_cmp(&q, &d) < 0)) || ((ibz_cmp(&q, &r) >= 0) && (ibz_cmp(&r, &d) > 0))); + + if (res) { + printf("Quaternion module integer group test ibz_test_div failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&d); + ibz_finalize(&r); + ibz_finalize(&q); + ibz_finalize(&m); + return (res); +} + +// void ibz_mod(ibz_t *r, const ibz_t *a, const ibz_t *b); +// unsigned long int ibz_mod_ui(const mpz_t *n, unsigned long int d); +int +ibz_test_mod() +{ + int res = 0; + ibz_t a, b, c, r, m; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&r); + ibz_init(&m); + + ibz_set_from_str(&a, "2113309833171849999003363", 10); + res = res | (ibz_mod_ui(&a, 3) != 0); + res = res | (ibz_mod_ui(&a, 2) != 1); + ibz_set_from_str(&m, "2113309833171840000000000", 10); + ibz_mod(&r, &a, &m); + ibz_add(&c, &r, &m); + res = res | (0 != ibz_cmp(&c, &a)); + ibz_neg(&b, &a); + res = res | (ibz_mod_ui(&b, 3) != 0); + res = res | (ibz_mod_ui(&b, 2) != 1); + ibz_mod(&r, &b, &m); + ibz_sub(&c, &r, &m); + ibz_sub(&c, &c, &m); + res = res | (0 != ibz_cmp(&c, &b)); + + if (res) { + printf("Quaternion module integer group test ibz_test_mod failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&r); + ibz_finalize(&m); + return (res); +} + +// void ibz_pow(ibz_t *pow, const ibz_t *x, uint32_t e); +// void ibz_pow_mod(ibz_t *pow, const ibz_t *x, const ibz_t *e, const ibz_t *m); +// void ibz_div_2exp(ibz_t *quotient, const ibz_t *a, uint32_t exp); +int +ibz_test_pow() +{ + int res = 0; + ibz_t a, b, c, d, e, m; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&d); + ibz_init(&e); + ibz_init(&m); + + ibz_set_from_str(&a, "aaaaaaaabbbbbbbb2222221111", 16); + ibz_copy(&c, &a); + int exp = 10; + ibz_set(&b, 1); + for (int i = 1; i < exp + 1; i++) + ibz_mul(&b, &b, &a); + ibz_pow(&d, &a, exp); + res = res | (0 != ibz_cmp(&c, &a)); + res = res | (0 != ibz_cmp(&d, &b)); + ibz_neg(&a, &a); + ibz_copy(&c, &a); + ibz_pow(&d, &a, exp); + res = res | (0 != ibz_cmp(&c, &a)); + res = res | (0 != ibz_cmp(&d, &b)); + exp = 9; + ibz_set(&b, 1); + for (int i = 1; i < exp + 1; i++) + ibz_mul(&b, &b, &a); + ibz_pow(&d, &a, exp); + res = res | (0 != ibz_cmp(&c, &a)); + res = res | (0 != ibz_cmp(&d, &b)); + + ibz_set_from_str(&a, "aaaaaaaabbbbbbbb2222221111", 16); + ibz_set_from_str(&m, "cdabde24864122912341", 16); + exp = 10; + ibz_set(&m, exp); + ibz_copy(&c, &a); + ibz_set(&b, 1); + for (int i = 1; i < exp + 1; i++) { + ibz_mul(&b, &b, &a); + ibz_mod(&b, &b, &m); + } + ibz_pow_mod(&d, &a, &e, &m); + res = res | (0 != ibz_cmp(&c, &a)); + res = res | (0 != ibz_cmp(&d, &b)); + + exp = 23; + ibz_set(&b, 2); + ibz_pow(&b, &b, exp); + ibz_div(&m, &b, &a, &b); + ibz_div_2exp(&d, &a, exp); + res = res | (0 != ibz_cmp(&c, &a)); + res = res | (0 != ibz_cmp(&m, &d)); + + if (res) { + printf("Quaternion module integer group test ibz_test_pow failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&d); + ibz_finalize(&e); + ibz_finalize(&m); + return (res); +} + +// void ibz_gcd(ibz_t *gcd, const ibz_t *a, const ibz_t *b); +// int ibz_invmod(ibz_t *inv, const ibz_t *a, const ibz_t *mod);ibz_test_mod() +int +ibz_test_gcd() +{ + int res = 0; + ibz_t a, b, c, d, ac, bc, m; + ibz_init(&a); + ibz_init(&b); + ibz_init(&c); + ibz_init(&d); + ibz_init(&ac); + ibz_init(&bc); + ibz_init(&m); + + // fixed large test + ibz_set_from_str(&c, "25791357069084", 10); + ibz_set_from_str(&a, "6173271838293993987767", 10); + ibz_set_from_str(&b, "89882267321617266071838286", 10); + ibz_mul(&ac, &a, &c); + ibz_mul(&bc, &b, &c); + ibz_gcd(&d, &ac, &bc); + res = res | (0 != ibz_cmp(&c, &d)); + ibz_mul(&m, &a, &c); + res = res | (0 != ibz_cmp(&ac, &m)); + ibz_mul(&m, &b, &c); + res = res | (0 != ibz_cmp(&bc, &m)); + // gcd is positif whatever the inputs are + ibz_neg(&ac, &ac); + ibz_gcd(&d, &ac, &bc); + res = res | (0 != ibz_cmp(&c, &d)); + ibz_neg(&bc, &bc); + ibz_gcd(&d, &ac, &bc); + res = res | (0 != ibz_cmp(&c, &d)); + ibz_neg(&ac, &ac); + ibz_gcd(&d, &ac, &bc); + res = res | (0 != ibz_cmp(&c, &d)); + // different sizes do not matter + ibz_set(&d, 2); + ibz_gcd(&m, &ac, &d); + res = res | (0 != ibz_cmp(&m, &d)); + + // invmod + ibz_invmod(&d, &a, &b); + res = res | (0 >= ibz_cmp(&b, &d)); + ibz_set(&m, 0); + res = res | (0 <= ibz_cmp(&m, &d)); + ibz_mul(&m, &d, &a); + ibz_mod(&m, &m, &b); + res = res | !ibz_is_one(&m); + // negative changes nothing + ibz_neg(&a, &a); + ibz_invmod(&d, &a, &b); + res = res | (0 >= ibz_cmp(&b, &d)); + ibz_set(&m, 0); + res = res | (0 <= ibz_cmp(&m, &d)); + ibz_mul(&m, &d, &a); + ibz_mod(&m, &m, &b); + res = res | !ibz_is_one(&m); + + if (res) { + printf("Quaternion module integer group test ibz_test_gcd failed\n"); + } + ibz_finalize(&a); + ibz_finalize(&b); + ibz_finalize(&c); + ibz_finalize(&d); + ibz_finalize(&ac); + ibz_finalize(&bc); + ibz_finalize(&m); + return (res); +} + +// Tests ibz_sqrt_mod_p +// Allows to provide the number of repetitions and the bit-size of the primes. +int +ibz_test_sqrt_mod_p(int reps, int prime_n) +{ + int res = 0; + + // Initialize GMP variables + ibz_t prime, a, prime_minus_a, asq, sqrt, tmp; + ibz_t prime_p4m3, prime_p5m8, prime_p1m8; + ibz_t prime_p4m3_x2, prime_p5m8_x2, prime_p1m8_x2; + ibz_t two_to_the_n_minus_1; + ibz_init(&prime); + ibz_init(&prime_p4m3); + ibz_init(&prime_p5m8); + ibz_init(&prime_p1m8); + ibz_init(&prime_p4m3_x2); + ibz_init(&prime_p5m8_x2); + ibz_init(&prime_p1m8_x2); + ibz_init(&a); + ibz_init(&prime_minus_a); + ibz_init(&asq); + ibz_init(&sqrt); + ibz_init(&tmp); + ibz_init(&two_to_the_n_minus_1); + + // Generate random prime number + int n = prime_n; // Number of bits + ibz_set(&two_to_the_n_minus_1, 1); + mpz_mul_2exp(two_to_the_n_minus_1, two_to_the_n_minus_1, n); + ibz_sub(&two_to_the_n_minus_1, &two_to_the_n_minus_1, &ibz_const_one); + + for (int r = 0; r < reps; ++r) { + ibz_rand_interval(&prime, &ibz_const_zero, &two_to_the_n_minus_1); + if (ibz_is_even(&prime)) + ibz_add(&prime, &prime, &ibz_const_one); + + int p4m3 = 0, p5m8 = 0, p1m8 = 0; + + while (p4m3 == 0 || p5m8 == 0 || p1m8 == 0) { + do { + ibz_add(&prime, &prime, &ibz_const_two); + } while (!mpz_probab_prime_p(prime, 25)); + + if (mpz_mod_ui(tmp, prime, 4) == 3) { + ibz_copy(&prime_p4m3, &prime); + p4m3 = 1; + } else if (mpz_mod_ui(tmp, prime, 8) == 5) { + ibz_copy(&prime_p5m8, &prime); + p5m8 = 1; + } else if (mpz_mod_ui(tmp, prime, 8) == 1) { + ibz_copy(&prime_p1m8, &prime); + p1m8 = 1; + } else { + res = 1; + goto err; + } + } + + ibz_t *primes[] = { &prime_p4m3, &prime_p5m8, &prime_p1m8 }; + ibz_t *primes_x2[] = { &prime_p4m3_x2, &prime_p5m8_x2, &prime_p1m8_x2 }; + for (int i = 0; i < 3; ++i) // 2p + mpz_mul_2exp(*primes_x2[i], *primes[i], 1); + + // Test sqrt mod p + for (int i = 0; i < 3; ++i) { + ibz_sub(&tmp, primes[i], &ibz_const_one); + ibz_rand_interval(&a, &ibz_const_zero, &tmp); + ibz_sub(&prime_minus_a, (primes[i]), &a); + mpz_powm_ui(asq, a, 2, *primes[i]); + + int no_sqrt = !ibz_sqrt_mod_p(&sqrt, &asq, primes[i]); + mpz_powm_ui(tmp, sqrt, 2, *primes[i]); + + if (no_sqrt || (ibz_cmp(&sqrt, &a) && ibz_cmp(&sqrt, &prime_minus_a))) { + res = 1; + goto err; + } + } + } + +err: + if (res) { + printf("Quaternion module integer test ibz_test_sqrt_mod_p failed\n"); + } + ibz_finalize(&prime); + ibz_finalize(&prime_p4m3); + ibz_finalize(&prime_p5m8); + ibz_finalize(&prime_p1m8); + ibz_finalize(&prime_p4m3_x2); + ibz_finalize(&prime_p5m8_x2); + ibz_finalize(&prime_p1m8_x2); + ibz_finalize(&a); + ibz_finalize(&prime_minus_a); + ibz_finalize(&asq); + ibz_finalize(&sqrt); + ibz_finalize(&tmp); + ibz_finalize(&two_to_the_n_minus_1); + return res; +} + +int +ibz_test_rand_interval(int reps) +{ + int res = 0; + ibz_t low, high, rand; + ibz_init(&low); + ibz_init(&high); + ibz_init(&rand); + ibz_set_from_str(&low, "ffa", 16); + ibz_set_from_str(&high, "eeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", 16); + + for (int i = 0; i < reps; ++i) { + res = ibz_rand_interval(&rand, &low, &high); + if (res != 1) { + res = 1; + goto err; + } else { + res = 0; + } + + if (ibz_cmp(&rand, &low) < 0 || ibz_cmp(&rand, &high) > 0) { + res = 1; + goto err; + } + } +err: + if (res) { + printf("Quaternion module integer test ibz_test_rand_interval failed\n"); + } + ibz_finalize(&low); + ibz_finalize(&high); + ibz_finalize(&rand); + return res; +} + +int +ibz_test_rand_interval_i(int reps) +{ + int res = 0; + int32_t low, high; + ibz_t rand, cmp; + ibz_init(&rand); + ibz_init(&cmp); + + for (int i = 0; i < reps; ++i) { + randombytes((unsigned char *)&low, sizeof(int32_t)); + randombytes((unsigned char *)&high, sizeof(int32_t)); + if (low < 0) + low = -low; + if (high < 0) + high = -high; + // The function requires a < b, thus a != b + if (low == high) { + continue; + } + if (low > high) { + int32_t tmp = low; + low = high; + high = tmp; + } + + res = ibz_rand_interval_i(&rand, low, high); + if (res != 1) { + res = 1; + goto err; + } else { + res = 0; + } + ibz_set(&cmp, low); + if (ibz_cmp(&rand, &cmp) < 0) { + res = 1; + goto err; + } + ibz_set(&cmp, high); + if (ibz_cmp(&rand, &cmp) > 0) { + res = 1; + goto err; + } + } + +err: + if (res) { + printf("Quaternion module integer test ibz_test_rand_interval_i failed\n"); + } + ibz_finalize(&rand); + ibz_finalize(&cmp); + return res; +} + +int +ibz_test_rand_interval_minm_m(int reps) +{ + int res = 0; + int32_t m; + ibz_t rand; + ibz_init(&rand); + + for (int i = 0; i < reps; ++i) { + randombytes((unsigned char *)&m, sizeof(int32_t)); + if (m < 0) + m = -m; + m >>= 1; // less than 32 bit + + if (m < 0) { + res = 1; + goto err; + } + + res = ibz_rand_interval_minm_m(&rand, m); + if (res != 1) { + res = 1; + goto err; + } else { + res = 0; + } + if (ibz_cmp_int32(&rand, -m) < 0) { + res = 1; + goto err; + } + if (ibz_cmp_int32(&rand, m) > 0) { + res = 1; + goto err; + } + } + +err: + if (res) { + printf("Quaternion module integer test ibz_test_rand_interval_minm_m failed\n"); + } + ibz_finalize(&rand); + return res; +} + +int +ibz_test_copy_digits(void) +{ + int res = 0; + const digit_t d1[] = { 0x12345678 }; + const digit_t d2[] = { 2, 1 }; + + const char d1str[] = "12345678"; +#if RADIX == 32 + const char d2str[] = "100000002"; +#elif RADIX == 64 + const char d2str[] = "10000000000000002"; +#endif + + char d1_intbig_str[80] = { 0 }; + char d2_intbig_str[80] = { 0 }; + + ibz_t d1_intbig, d2_intbig; + ibz_init(&d1_intbig); + ibz_init(&d2_intbig); + + ibz_copy_digits(&d1_intbig, d1, 1); + ibz_copy_digits(&d2_intbig, d2, 2); + + ibz_convert_to_str(&d1_intbig, d1_intbig_str, 16); + ibz_convert_to_str(&d2_intbig, d2_intbig_str, 16); + + if (memcmp(d1str, d1_intbig_str, sizeof(d1str))) { + res = 1; + goto err; + } + if (memcmp(d2str, d2_intbig_str, sizeof(d2str))) { + res = 1; + goto err; + } +err: + if (res) { + printf("Quaternion module integer test ibz_test_copy_digits failed\n"); + } + ibz_finalize(&d1_intbig); + ibz_finalize(&d2_intbig); + return res; +} + +int +ibz_test_to_digits(void) +{ + int res = 0; + ibz_t d1_intbig, d2_intbig, zero_intbig; + ibz_t d1_intbig_rec, d2_intbig_rec, zero_intbig_rec, cof, cof2; + const char d1str[] = "12345678"; + const char d2str[] = "10000000000000002"; + ibz_init(&d1_intbig); + ibz_init(&d2_intbig); + + ibz_set_from_str(&d1_intbig, d1str, 16); + ibz_set_from_str(&d2_intbig, d2str, 16); + ibz_init(&zero_intbig); + + ibz_init(&d1_intbig_rec); + ibz_init(&d2_intbig_rec); + ibz_init(&zero_intbig_rec); + ibz_init(&cof); + ibz_init(&cof2); + + size_t d1_digits = (mpz_sizeinbase(d1_intbig, 2) + sizeof(digit_t) * 8 - 1) / (sizeof(digit_t) * 8); + size_t d2_digits = (mpz_sizeinbase(d2_intbig, 2) + sizeof(digit_t) * 8 - 1) / (sizeof(digit_t) * 8); + + digit_t d1[d1_digits]; + digit_t d2[d2_digits]; + digit_t zero[1]; + + ibz_to_digits(d1, &d1_intbig); + ibz_to_digits(d2, &d2_intbig); + ibz_to_digits(zero, &zero_intbig); + + // A lazy test, but we know that this conversion should be correct from the previous test + + ibz_copy_digits(&d1_intbig_rec, d1, d1_digits); + ibz_copy_digits(&d2_intbig_rec, d2, d2_digits); + ibz_copy_digits(&zero_intbig_rec, zero, 1); + + if (ibz_cmp(&d1_intbig, &d1_intbig_rec) || ibz_cmp(&zero_intbig, &zero_intbig_rec)) { + res = 1; + goto err; + } + +#if RADIX == 64 + const digit_t p_cofactor_for_3g[5] = { + 0x0000000000000000, 0x74f9dace0d9ec800, 0x63a25b437f655001, 0x0000000000000019, 0 + }; + digit_t p_cofactor_for_3g_rec[10] = { 0 }; +#elif RADIX == 32 + const digit_t p_cofactor_for_3g[10] = { 0x00000000, 0x00000000, 0x0d9ec800, 0x74f9dace, 0x7f655001, + 0x63a25b43, 0x00000019, 0x00000000, 0, 0 }; + digit_t p_cofactor_for_3g_rec[5] = { 0 }; +#endif + ibz_copy_digits(&cof, p_cofactor_for_3g, 5); + ibz_to_digits(p_cofactor_for_3g_rec, &cof); + ibz_copy_digits(&cof2, p_cofactor_for_3g_rec, 5); + + if (ibz_cmp(&cof, &cof2)) { + res = 1; + goto err; + } + +#if RADIX == 32 + digit_t da[3] = { 0, 0, 0 }; +#elif RADIX == 64 + digit_t da[2] = { 0, 0 }; +#endif + + ibz_t strval, strval_check; + ibz_init(&strval_check); + ibz_init(&strval); + ibz_set_from_str(&strval, "1617406613339667622221321", 10); + ibz_to_digits(da, &strval); + ibz_copy_digits(&strval_check, da, sizeof(da) / sizeof(digit_t)); + // ibz_printf("strval: %Zd\nstrval_check: %Zd\n", strval, strval_check); + if (ibz_cmp(&strval, &strval_check)) { + res = 1; + goto err; + } + +err: + if (res) { + printf("Quaternion module integer test ibz_test_to_digits failed\n"); + } + ibz_finalize(&d1_intbig); + ibz_finalize(&d2_intbig); + ibz_finalize(&zero_intbig); + ibz_finalize(&d1_intbig_rec); + ibz_finalize(&d2_intbig_rec); + ibz_finalize(&zero_intbig_rec); + ibz_finalize(&cof); + ibz_finalize(&cof2); + ibz_finalize(&strval); + ibz_finalize(&strval_check); + return res; +} + +int +ibz_test_intbig() +{ + int reps = 2; + int prime_n = 103; + int res = 0; + printf("\nRunning quaternion tests of gmp-based integer functions\n"); + res = res | ibz_test_init_set_cmp(); + res = res | ibz_test_add_sub_neg_abs(); + res = res | ibz_test_mul_sqrt(); + res = res | ibz_test_div(); + res = res | ibz_test_mod(); + res = res | ibz_test_pow(); + res = res | ibz_test_gcd(); + res = res | ibz_test_sqrt_mod_p(reps, prime_n); + res = res | ibz_test_rand_interval(reps); + res = res | ibz_test_rand_interval_i(reps); + res = res | ibz_test_rand_interval_minm_m(reps); + res = res | ibz_test_copy_digits(); + res = res | ibz_test_to_digits(); + return res; +} diff --git a/src/quaternion/ref/generic/test/integers.c b/src/quaternion/ref/generic/test/integers.c index 4eecc6a..1adc072 100644 --- a/src/quaternion/ref/generic/test/integers.c +++ b/src/quaternion/ref/generic/test/integers.c @@ -1,288 +1,44 @@ #include "quaternion_tests.h" - -//integer helpers -//void ibz_rounded_div(ibz_t *q, const ibz_t *a, const ibz_t *b); -int quat_test_integer_ibz_rounded_div(){ +// int ibz_generate_random_prime(ibz_t *p, int is3mod4, int bitsize); +int +quat_test_ibz_generate_random_prime() +{ int res = 0; - ibz_t q, a, b; - ibz_init(&a); - ibz_init(&b); - ibz_init(&q); - - // basic tests - ibz_set(&a,15); - ibz_set(&b,3); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==5); - ibz_set(&a,16); - ibz_set(&b,3); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==5); - ibz_set(&a,17); - ibz_set(&b,3); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==6); - ibz_set(&a,37); - ibz_set(&b,5); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==7); - // test sign combination - ibz_set(&a,149); - ibz_set(&b,12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==12); - ibz_set(&a,149); - ibz_set(&b,-12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-12); - ibz_set(&a,-149); - ibz_set(&b,-12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==12); - ibz_set(&a,-149); - ibz_set(&b,12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-12); - ibz_set(&a,151); - ibz_set(&b,12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==13); - ibz_set(&a,-151); - ibz_set(&b,-12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==13); - ibz_set(&a,151); - ibz_set(&b,-12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-13); - ibz_set(&a,-151); - ibz_set(&b,12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-13); - //divisibles with sign - ibz_set(&a,144); - ibz_set(&b,12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==12); - ibz_set(&a,-144); - ibz_set(&b,-12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==12); - ibz_set(&a,144); - ibz_set(&b,-12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-12); - ibz_set(&a,-144); - ibz_set(&b,12); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-12); - // tests close to 0 - ibz_set(&a,-12); - ibz_set(&b,-25); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==0); - ibz_set(&a,12); - ibz_set(&b,25); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==0); - ibz_set(&a,-12); - ibz_set(&b,25); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==0); - ibz_set(&a,12); - ibz_set(&b,-25); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==0); - ibz_set(&a,-12); - ibz_set(&b,-23); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==1); - ibz_set(&a,12); - ibz_set(&b,23); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==1); - ibz_set(&a,-12); - ibz_set(&b,23); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-1); - ibz_set(&a,12); - ibz_set(&b,-23); - ibz_rounded_div(&q,&a,&b); - res = res || !(ibz_get(&q)==-1); - // test output equal input - ibz_set(&a,-151); - ibz_set(&b,12); - ibz_rounded_div(&a,&a,&b); - res = res || !(ibz_get(&a)==-13); - ibz_set(&a,-151); - ibz_set(&b,12); - ibz_rounded_div(&b,&a,&b); - res = res || !(ibz_get(&b)==-13); - // test for cmp not returning 1 or -1 or 0 - ibz_set(&a,4292606433816540); - ibz_set(&b,864673106105940); - ibz_rounded_div(&b,&a,&b); - res = res || !(ibz_get(&b)==5); - - if (res != 0){ - printf("Quaternion unit test integer_ibz_rounded_div failed\n"); + int bitsize, is3mod4, primality_test_attempts; + ibz_t p; + ibz_init(&p); + bitsize = 20; + primality_test_attempts = 30; + is3mod4 = 1; + res = res || !ibz_generate_random_prime(&p, is3mod4, bitsize, primality_test_attempts); + res = res || (ibz_probab_prime(&p, 20) == 0); + res = res || (ibz_bitsize(&p) < bitsize); + res = res || (is3mod4 && (ibz_get(&p) % 4 != 3)); + bitsize = 30; + is3mod4 = 0; + res = res || !ibz_generate_random_prime(&p, is3mod4, bitsize, primality_test_attempts); + res = res || (ibz_probab_prime(&p, 20) == 0); + res = res || (ibz_bitsize(&p) < bitsize); + res = res || (is3mod4 && (ibz_get(&p) % 4 != 3)); + is3mod4 = 1; + res = res || !ibz_generate_random_prime(&p, is3mod4, bitsize, primality_test_attempts); + res = res || (ibz_probab_prime(&p, 20) == 0); + res = res || (ibz_bitsize(&p) < bitsize); + res = res || (is3mod4 && (ibz_get(&p) % 4 != 3)); + if (res) { + printf("Quaternion unit test ibz_generate_random_prime failed\n"); } - ibz_finalize(&a); - ibz_finalize(&b); - ibz_finalize(&q); - return(res); + ibz_finalize(&p); + return (res); } -// tests for cornacchia helper functions -//void ibz_complex_mul(ibz_t *re_res, ibz_t *im_res, const ibz_t *re_a, const ibz_t *im_a, const ibz_t *re_b, const ibz_t *im_b); -int quat_test_integer_ibz_complex_mul(){ +// int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p); +int +quat_test_integer_ibz_cornacchia_prime(void) +{ int res = 0; - ibz_t re_res, re_a, re_b, re_cmp, im_res, im_a, im_b, im_cmp; - ibz_init(&re_res); - ibz_init(&re_a); - ibz_init(&re_b); - ibz_init(&re_cmp); - ibz_init(&im_res); - ibz_init(&im_a); - ibz_init(&im_b); - ibz_init(&im_cmp); - - ibz_set(&re_a, 1); - ibz_set(&im_a, 2); - ibz_set(&re_b, 3); - ibz_set(&im_b, -4); - ibz_set(&re_cmp, 11); - ibz_set(&im_cmp, 2); - ibz_complex_mul(&re_res,&im_res,&re_a,&im_a,&re_b,&im_b); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - ibz_set(&re_a, -3); - ibz_set(&im_a, -5); - ibz_set(&re_b, 2); - ibz_set(&im_b, 4); - ibz_set(&re_cmp, 14); - ibz_set(&im_cmp, -22); - ibz_complex_mul(&re_res,&im_res,&re_a,&im_a,&re_b,&im_b); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - if (res != 0){ - printf("Quaternion unit test integer_ibz_complex_mul failed\n"); - } - ibz_finalize(&re_res); - ibz_finalize(&re_cmp); - ibz_finalize(&re_a); - ibz_finalize(&re_b); - ibz_finalize(&im_res); - ibz_finalize(&im_cmp); - ibz_finalize(&im_a); - ibz_finalize(&im_b); - return(res); -} - -//void ibz_complex_mul_by_complex_power(ibz_t *re_res, ibz_t *im_res, const ibz_t *re_a, const ibz_t *im_a, int64_t exp); -int quat_test_integer_ibz_complex_mul_by_complex_power(){ - int res = 0; - int64_t exp; - ibz_t re_res, re_a, re_cmp, im_res, im_a, im_cmp; - ibz_init(&re_res); - ibz_init(&re_a); - ibz_init(&re_cmp); - ibz_init(&im_res); - ibz_init(&im_a); - ibz_init(&im_cmp); - - exp = 0; - ibz_set(&re_a, 1); - ibz_set(&im_a, 2); - ibz_set(&re_res, 3); - ibz_set(&im_res, -4); - ibz_set(&re_cmp, 3); - ibz_set(&im_cmp, -4); - ibz_complex_mul_by_complex_power(&re_res,&im_res,&re_a,&im_a,exp); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - exp = 1; - ibz_set(&re_a, 1); - ibz_set(&im_a, 2); - ibz_set(&re_res, 3); - ibz_set(&im_res, -4); - ibz_set(&re_cmp, 11); - ibz_set(&im_cmp, 2); - ibz_complex_mul_by_complex_power(&re_res,&im_res,&re_a,&im_a,exp); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - exp = 2; - ibz_set(&re_a, 1); - ibz_set(&im_a, 2); - ibz_set(&re_res, 3); - ibz_set(&im_res, -4); - ibz_set(&re_cmp, 7); - ibz_set(&im_cmp, 24); - ibz_complex_mul_by_complex_power(&re_res,&im_res,&re_a,&im_a,exp); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - if (res != 0){ - printf("Quaternion unit test integer_ibz_complex_mul_by_complex_power failed\n"); - } - ibz_finalize(&re_res); - ibz_finalize(&re_cmp); - ibz_finalize(&re_a); - ibz_finalize(&im_res); - ibz_finalize(&im_cmp); - ibz_finalize(&im_a); - return(res); -} - -//int ibz_cornacchia_extended_prime_loop(ibz_t *re_res, ibz_t *im_res, int64_t prime, int64_t val); -int quat_test_integer_ibz_cornacchia_extended_prime_loop(){ - int res = 0; - int64_t p, re_a, im_a; - ibz_t re_res, re_cmp, im_res, im_cmp, prod; - ibz_init(&re_res); - ibz_init(&re_cmp); - ibz_init(&im_res); - ibz_init(&im_cmp); - ibz_init(&prod); - - p = 5; - ibz_set(&re_res, 1); - ibz_set(&im_res, 1); - ibz_set(&re_cmp, -1); - ibz_set(&im_cmp, 7); - ibz_cornacchia_extended_prime_loop(&re_res, &im_res, p, 2); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - p = 7; - ibz_set(&re_res, -1); - ibz_set(&im_res, 7); - ibz_set(&re_cmp, -1); - ibz_set(&im_cmp, 7); - ibz_cornacchia_extended_prime_loop(&re_res, &im_res, p, 0); - res = res || ibz_cmp(&re_res,&re_cmp); - res = res || ibz_cmp(&im_res,&im_cmp); - - if (res != 0){ - printf("Quaternion unit test integer_ibz_cornacchia_extended_prime_loop failed\n"); - } - ibz_finalize(&re_res); - ibz_finalize(&re_cmp); - ibz_finalize(&im_res); - ibz_finalize(&im_cmp); - ibz_finalize(&prod); - return(res); -} - -//int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p); -int quat_test_integer_ibz_cornacchia_prime(){ - int res = 0; - ibz_t x,y,n, prod,c_res,p; + ibz_t x, y, n, prod, c_res, p; ibz_init(&x); ibz_init(&y); ibz_init(&n); @@ -293,54 +49,54 @@ int quat_test_integer_ibz_cornacchia_prime(){ ibz_set(&n, 1); // there is a solution in these cases ibz_set(&p, 5); - if(ibz_cornacchia_prime(&x,&y,&n,&p)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&p,&c_res); + if (ibz_cornacchia_prime(&x, &y, &n, &p)) { + ibz_mul(&c_res, &x, &x); + ibz_mul(&prod, &y, &y); + ibz_mul(&prod, &prod, &n); + ibz_add(&c_res, &c_res, &prod); + res = res || ibz_cmp(&p, &c_res); } else { res = 1; } ibz_set(&p, 2); - if(ibz_cornacchia_prime(&x,&y,&n,&p)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&p,&c_res); + if (ibz_cornacchia_prime(&x, &y, &n, &p)) { + ibz_mul(&c_res, &x, &x); + ibz_mul(&prod, &y, &y); + ibz_mul(&prod, &prod, &n); + ibz_add(&c_res, &c_res, &prod); + res = res || ibz_cmp(&p, &c_res); } else { res = 1; } ibz_set(&p, 41); - if(ibz_cornacchia_prime(&x,&y,&n,&p)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&p,&c_res); + if (ibz_cornacchia_prime(&x, &y, &n, &p)) { + ibz_mul(&c_res, &x, &x); + ibz_mul(&prod, &y, &y); + ibz_mul(&prod, &prod, &n); + ibz_add(&c_res, &c_res, &prod); + res = res || ibz_cmp(&p, &c_res); } else { res = 1; } ibz_set(&n, 2); ibz_set(&p, 3); - if(ibz_cornacchia_prime(&x,&y,&n,&p)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&p,&c_res); + if (ibz_cornacchia_prime(&x, &y, &n, &p)) { + ibz_mul(&c_res, &x, &x); + ibz_mul(&prod, &y, &y); + ibz_mul(&prod, &prod, &n); + ibz_add(&c_res, &c_res, &prod); + res = res || ibz_cmp(&p, &c_res); } else { res = 1; } ibz_set(&n, 3); ibz_set(&p, 7); - if(ibz_cornacchia_prime(&x,&y,&n,&p)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&p,&c_res); + if (ibz_cornacchia_prime(&x, &y, &n, &p)) { + ibz_mul(&c_res, &x, &x); + ibz_mul(&prod, &y, &y); + ibz_mul(&prod, &prod, &n); + ibz_add(&c_res, &c_res, &prod); + res = res || ibz_cmp(&p, &c_res); } else { res = 1; } @@ -348,13 +104,17 @@ int quat_test_integer_ibz_cornacchia_prime(){ ibz_set(&n, 1); // there is no solution in these cases ibz_set(&p, 7); - res = res || ibz_cornacchia_prime(&x,&y,&n,&p); + res = res || ibz_cornacchia_prime(&x, &y, &n, &p); ibz_set(&p, 3); - res = res || ibz_cornacchia_prime(&x,&y,&n,&p); + res = res || ibz_cornacchia_prime(&x, &y, &n, &p); ibz_set(&n, 3); ibz_set(&p, 5); - res = res || ibz_cornacchia_prime(&x,&y,&n,&p); - if (res != 0){ + res = res || ibz_cornacchia_prime(&x, &y, &n, &p); + // This should be solved + ibz_set(&n, 3); + ibz_set(&p, 3); + res = res || !ibz_cornacchia_prime(&x, &y, &n, &p); + if (res != 0) { printf("Quaternion unit test integer_ibz_cornacchia_prime failed\n"); } ibz_finalize(&x); @@ -366,222 +126,13 @@ int quat_test_integer_ibz_cornacchia_prime(){ return res; } - -//int ibz_cornacchia_special_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p, const int exp_adjust); -int quat_test_integer_ibz_cornacchia_special_prime(){ - int res = 0; - int exp_adjust; - ibz_t x,y,n, prod,c_res,p, cmp, two; - ibz_init(&x); - ibz_init(&y); - ibz_init(&n); - ibz_init(&p); - ibz_init(&prod); - ibz_init(&c_res); - ibz_init(&cmp); - ibz_init(&two); - ibz_set(&two,2); - - ibz_set(&n, 3); - // there is a solution in these cases - ibz_set(&p, 43); - exp_adjust = 2; - //x^2 + 3y^2 = 4*43, (5,7) is solution - if(ibz_cornacchia_special_prime(&x,&y,&n,&p, exp_adjust)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - ibz_pow(&cmp,&two,exp_adjust); - ibz_mul(&cmp,&cmp,&p); - res = res || ibz_cmp(&cmp,&c_res); - } else { - res = 1; - } - ibz_set(&n, 7); - exp_adjust = 3; - ibz_set(&p, 11); - //x^2 + 7y^2 = 8*11, (5,3) is solution - if(ibz_cornacchia_special_prime(&x,&y,&n,&p, exp_adjust)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - ibz_pow(&cmp,&two,exp_adjust); - ibz_mul(&cmp,&cmp,&p); - res = res || ibz_cmp(&cmp,&c_res); - } else { - res = 1; - } - /* Failing testcase, needs investigation - ibz_set(&n, 15); - exp_adjust = 4; - ibz_set(&p, 31); - //x^2 + 15y^2 = 16*31, (19,3) is solution - if(ibz_cornacchia_special_prime(&x,&y,&n,&p, exp_adjust)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - ibz_pow(&cmp,&two,exp_adjust); - ibz_mul(&cmp,&cmp,&p); - res = res || ibz_cmp(&cmp,&c_res); - } else { - res = 1; - } - ibz_set(&n, 3); - exp_adjust = 2; - ibz_set(&p, 7); - //x^2 + 3y^2 = 4*7, (1,3) is solution - if(ibz_cornacchia_special_prime(&x,&y,&n,&p, exp_adjust)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_mul(&prod,&prod,&n); - ibz_add(&c_res,&c_res,&prod); - ibz_pow(&cmp,&two,exp_adjust); - ibz_mul(&cmp,&cmp,&p); - res = res || ibz_cmp(&cmp,&c_res); - } else { - res = 1; - } - */ - - // there is no solution in these cases - ibz_set(&n, 3); - ibz_set(&p, 11); - exp_adjust = 3; - res = res || ibz_cornacchia_special_prime(&x,&y,&n,&p, exp_adjust); - - if (res != 0){ - printf("Quaternion unit test integer_ibz_cornacchia_special_prime failed\n"); - } - ibz_finalize(&x); - ibz_finalize(&y); - ibz_finalize(&n); - ibz_finalize(&p); - ibz_finalize(&prod); - ibz_finalize(&c_res); - ibz_finalize(&two); - ibz_finalize(&cmp); - return res; -} - -//int ibz_cornacchia_extended(ibz_t *x, ibz_t *y, const ibz_t *n, const short *prime_list, const int prime_list_length, short primality_test_iterations, const ibz_t *bad_primes_prod); -int quat_test_integer_ibz_cornacchia_extended(){ - int res = 0; - ibz_t x,y,n, prod,c_res,bad; - short primes[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101}; - int primes_length = 26; - short iterations = 20; - ibz_init(&x); - ibz_init(&y); - ibz_init(&n); - ibz_init(&prod); - ibz_init(&c_res); - ibz_init(&bad); - ibz_set(&bad,3*7*11*19); - - // there is a solution in these cases - ibz_set(&n, 5); - if(ibz_cornacchia_extended(&x,&y,&n, primes, 4,iterations, NULL)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } else { - res = 1; - } - ibz_set(&n, 50); - if(ibz_cornacchia_extended(&x,&y,&n, primes, 7,iterations,NULL)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } else { - res = 1; - } - ibz_set(&n, 4100); - if(ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,&bad)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } else { - res = 1; - } - // test product of all small primes - ibz_set(&n, 5*13*17*29*37*41); - ibz_set(&x, 53*61*73*89*97); - ibz_mul(&n, &n, &x); - ibz_set(&x, 404); - ibz_mul(&n, &n, &x); - if(ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,NULL)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } else { - res = 1; - } - // test with large prime - ibz_set(&n, 1381); // prime and 1 mod 4 - if(ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,&bad)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } else { - res = 1; - } - // test with large prime part - ibz_set(&n, 5*13*17*29*37*97); - ibz_set(&x, 1381); // prime and 1 mod 4 - ibz_mul(&n, &n, &x); - if(ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,NULL)){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } else { - res = 1; - } - - // there is no solution in these cases - ibz_set(&n, 7); - res = res || ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,&bad); - ibz_set(&n, 3); - res = res || ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,&bad); - ibz_set(&n, 6); - res = res || ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,NULL); - ibz_set(&n, 30); - res = res || ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,&bad); - ibz_set(&n, 30*1381); - res = res || ibz_cornacchia_extended(&x,&y,&n, primes, primes_length,iterations,&bad); - - if (res != 0){ - printf("Quaternion unit test integer_ibz_cornacchia_extended failed\n"); - } - ibz_finalize(&x); - ibz_finalize(&y); - ibz_finalize(&n); - ibz_finalize(&prod); - ibz_finalize(&c_res); - ibz_finalize(&bad); - return res; -} - - // run all previous tests -int quat_test_integers(){ +int +quat_test_integers(void) +{ int res = 0; printf("\nRunning quaternion tests of integer functions\n"); - res = res | quat_test_integer_ibz_rounded_div(); - res = res | quat_test_integer_ibz_complex_mul(); - res = res | quat_test_integer_ibz_complex_mul_by_complex_power(); - res = res | quat_test_integer_ibz_cornacchia_extended_prime_loop(); + res = res | quat_test_ibz_generate_random_prime(); res = res | quat_test_integer_ibz_cornacchia_prime(); - res = res | quat_test_integer_ibz_cornacchia_special_prime(); - res = res | quat_test_integer_ibz_cornacchia_extended(); - return(res); + return (res); } - diff --git a/src/quaternion/ref/generic/test/lat_ball.c b/src/quaternion/ref/generic/test/lat_ball.c new file mode 100644 index 0000000..da8ca21 --- /dev/null +++ b/src/quaternion/ref/generic/test/lat_ball.c @@ -0,0 +1,266 @@ +#include "quaternion_tests.h" +#include + +// int quat_lattice_bound_parallelogram(ibz_vec_4_t *box, ibz_mat_4x4_t *U, const ibz_mat_4x4_t *G, +// const ibz_t *radius); +int +quat_test_lat_ball_paralellogram_randomized(int iterations, int bitsize) +{ + int res = 0; + + quat_lattice_t lattice; + ibz_t radius, length, tmp; + ibz_mat_4x4_t U, G; + ibz_vec_4_t box, dbox, x; + quat_lattice_init(&lattice); + ibz_vec_4_init(&box); + ibz_vec_4_init(&dbox); + ibz_vec_4_init(&x); + ibz_mat_4x4_init(&U); + ibz_mat_4x4_init(&G); + ibz_init(&radius); + ibz_init(&length); + ibz_init(&tmp); + + for (int it = 0; it < iterations; it++) { +// Create a random positive definite quadatic form +#ifndef NDEBUG + int randret = quat_test_input_random_lattice_generation(&lattice, bitsize, 1, 0); + assert(randret == 0); +#else + (void)quat_test_input_random_lattice_generation(&lattice, bitsize, 1, 0); +#endif + ibz_mat_4x4_transpose(&G, &lattice.basis); + ibz_mat_4x4_mul(&G, &G, &lattice.basis); + +// Set radius to 2 × sqrt(lattice volume) +#ifndef NDEBUG + int ok = ibz_mat_4x4_inv_with_det_as_denom(NULL, &radius, &(lattice.basis)); + assert(ok); +#else + (void)ibz_mat_4x4_inv_with_det_as_denom(NULL, &radius, &(lattice.basis)); +#endif + ibz_abs(&radius, &radius); + ibz_sqrt_floor(&radius, &radius); + ibz_mul(&radius, &radius, &ibz_const_two); + + quat_lattice_bound_parallelogram(&box, &U, &G, &radius); + for (int i = 0; i < 4; i++) { + // dbox is a box with sides dbox[i] = 2*box[i] + 1 + ibz_add(&dbox[i], &box[i], &box[i]); + ibz_add(&dbox[i], &dbox[i], &ibz_const_one); + // initialize x[i] to the bottom of dbox[i] + ibz_neg(&x[i], &dbox[i]); + } + + // Integrate U into the Gram matrix + ibz_mat_4x4_mul(&G, &U, &G); + ibz_mat_4x4_transpose(&U, &U); + ibz_mat_4x4_mul(&G, &G, &U); + + // We treat x[0]...x[4] as a counter, incrementing one by one + // but skipping values that are inside the parallelogram defined + // by box. + while (1) { + // x is out of the parallelogram, so its length must be + // greater than the radius + quat_qf_eval(&length, &G, &x); + if (ibz_cmp(&length, &radius) <= 0) { + res = 1; + break; + } + + // Increment counter + ibz_add(&x[0], &x[0], &ibz_const_one); + // if x[0] just entered the interval + ibz_add(&tmp, &x[0], &box[0]); + if (ibz_is_zero(&tmp)) { + int inbox = 1; + for (int i = 1; i < 4; i++) { + ibz_abs(&tmp, &x[i]); + inbox &= ibz_cmp(&tmp, &box[i]) <= 0; + } + // if x[1]...x[3] are all in the respective intervals + // jump straight to the end of x[0]'s interval + if (inbox) + ibz_set(&x[0], 1); + } + + // if x[0] became positive, loop the counter + if (ibz_is_one(&x[0])) { + ibz_neg(&x[0], &dbox[0]); + int carry = 1; + for (int i = 1; carry && i < 4; i++) { + ibz_add(&x[i], &x[i], &ibz_const_one); + if (ibz_cmp(&x[i], &dbox[i]) > 0) { + ibz_neg(&x[i], &dbox[i]); + } else { + carry = 0; + } + } + + // If there still is a carry, we are at the end + if (carry) + break; + } + } + } + + quat_lattice_finalize(&lattice); + ibz_vec_4_finalize(&box); + ibz_vec_4_finalize(&dbox); + ibz_vec_4_finalize(&x); + ibz_mat_4x4_finalize(&U); + ibz_mat_4x4_finalize(&G); + ibz_finalize(&radius); + ibz_finalize(&length); + ibz_finalize(&tmp); + + if (res != 0) { + printf("Quaternion unit test lat_ball_paralellogram_randomized failed\n"); + } + return (res); +} + +// helper which tests quat_lattice_sample_from_ball on given input +int +quat_test_lat_ball_sample_helper(const quat_lattice_t *lat, const ibz_t *radius, const quat_alg_t *alg) +{ + int res = 0; + quat_alg_elem_t vec; + ibz_t norm_d, norm_n; + ibz_init(&norm_d); + ibz_init(&norm_n); + quat_alg_elem_init(&vec); + // check return value + res |= !quat_lattice_sample_from_ball(&vec, lat, alg, radius); + // check result is in lattice + res |= !quat_lattice_contains(NULL, lat, &vec); + quat_alg_norm(&norm_n, &norm_d, &vec, alg); + // test that n/d <= r so that n <= rd + ibz_mul(&norm_d, &norm_d, radius); + res |= !(ibz_cmp(&norm_n, &norm_d) <= 0); + + ibz_finalize(&norm_d); + ibz_finalize(&norm_n); + quat_alg_elem_finalize(&vec); + return res; +} + +// int quat_lattice_sample_from_ball(ibz_vec_4_t *x, const quat_lattice_t *lattice, const quat_alg_t +// *alg, const ibz_t *radius); +int +quat_test_lat_ball_sample_from_ball() +{ + int res = 0; + + ibz_t norm_n, norm_d; + quat_alg_t alg; + quat_alg_elem_t vec; + quat_lattice_t lattice; + ibz_t radius; + + quat_alg_init_set_ui(&alg, 11); + ibz_init(&norm_n); + ibz_init(&norm_d); + quat_lattice_init(&lattice); + ibz_init(&radius); + quat_alg_elem_init(&vec); + + for (int it = 0; it < 3; it++) { + if (it == 0) { + ibz_mat_4x4_identity(&(lattice.basis)); // Test inner product + } else if (it == 1) { + ibz_set(&lattice.denom, 13); // Test with denominator + } else { // if (it == 2) + // Test a very much non-orthogonal qf + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + ibz_add(&(lattice.basis[i][j]), &(lattice.basis[i][j]), &ibz_const_one); + } + + for (int i = 0; i < 100; i++) { + ibz_set(&radius, i + 1); + res |= quat_test_lat_ball_sample_helper(&lattice, &radius, &alg); + if (res != 0) + break; + } + } + + if (res != 0) { + printf("Quaternion unit test lat_ball_sample_from_ball failed\n"); + } + + quat_alg_finalize(&alg); + quat_lattice_finalize(&lattice); + ibz_finalize(&radius); + quat_alg_elem_finalize(&vec); + ibz_finalize(&norm_n); + ibz_finalize(&norm_d); + return (res); +} + +int +quat_test_lat_ball_sample_from_ball_randomized(int iterations, int bitsize) +{ + int res = 0; + + ibz_t norm_n, norm_d; + quat_alg_t alg; + quat_alg_elem_t vec; + quat_lattice_t *lattices; + ibz_t radius; + + quat_alg_init_set_ui(&alg, 11); + ibz_init(&norm_n); + ibz_init(&norm_d); + lattices = malloc(iterations * sizeof(quat_lattice_t)); + for (int i = 0; i < iterations; i++) + quat_lattice_init(&(lattices[i])); + ibz_init(&radius); + quat_alg_elem_init(&vec); + + int randret = quat_test_input_random_lattice_generation(lattices, bitsize, iterations, 0); + + if (!randret) { + for (int i = 0; i < iterations; i++) { +#ifndef NDEBUG + + int ok = ibz_mat_4x4_inv_with_det_as_denom(NULL, &radius, &(lattices[i].basis)); + assert(ok); +#else + (void)ibz_mat_4x4_inv_with_det_as_denom(NULL, &radius, &(lattices[i].basis)); +#endif + ibz_abs(&radius, &radius); + res |= quat_test_lat_ball_sample_helper(&(lattices[i]), &radius, &alg); + if (res != 0) + break; + } + } + + if (res != 0) { + printf("Quaternion unit test lat_ball_sample_from_ball_randomized failed\n"); + } + + quat_alg_finalize(&alg); + for (int i = 0; i < iterations; i++) + quat_lattice_finalize(&(lattices[i])); + free(lattices); + ibz_finalize(&radius); + quat_alg_elem_finalize(&vec); + ibz_finalize(&norm_n); + ibz_finalize(&norm_d); + return (res); +} + +// run all previous tests +int +quat_test_lat_ball(void) +{ + int res = 0; + printf("\nRunning quaternion tests for sampling lattice points of bounded norm\n"); + res = res | quat_test_lat_ball_sample_from_ball(); + res = res | quat_test_lat_ball_sample_from_ball_randomized(100, 10); + res = res | quat_test_lat_ball_paralellogram_randomized(100, 100); + return (res); +} diff --git a/src/quaternion/ref/generic/test/lattice.c b/src/quaternion/ref/generic/test/lattice.c index 2dd4f06..51c4326 100644 --- a/src/quaternion/ref/generic/test/lattice.c +++ b/src/quaternion/ref/generic/test/lattice.c @@ -2,8 +2,10 @@ // helper functions -//int quat_lattice_equal(const quat_lattice_t *lat1, const quat_lattice_t *lat2); -int quat_test_lattice_equal(){ +// int quat_lattice_equal(const quat_lattice_t *lat1, const quat_lattice_t *lat2); +int +quat_test_lattice_equal(void) +{ int res = 0; quat_lattice_t lat, cmp; quat_lattice_init(&lat); @@ -11,43 +13,91 @@ int quat_test_lattice_equal(){ ibz_mat_4x4_identity(&(lat.basis)); ibz_mat_4x4_identity(&(cmp.basis)); - res = res || !quat_lattice_equal(&lat,&cmp); - ibz_set(&(lat.denom),5); - ibz_set(&(cmp.denom),4); - res = res || quat_lattice_equal(&lat,&cmp); - ibz_set(&(lat.denom),1); - ibz_set(&(cmp.denom),-1); - res = res || !quat_lattice_equal(&lat,&cmp); - ibz_set(&(lat.denom),3); - ibz_set(&(cmp.denom),3); - res = res || !quat_lattice_equal(&lat,&cmp); - ibz_set(&(lat.basis[0][0]),1); - ibz_set(&(lat.basis[0][3]),-1); - ibz_set(&(lat.basis[1][1]),-2); - ibz_set(&(lat.basis[2][2]),1); - ibz_set(&(lat.basis[2][1]),1); - ibz_set(&(lat.basis[3][3]),-3); - ibz_set(&(lat.denom),6); + res = res || !quat_lattice_equal(&lat, &cmp); + ibz_set(&(lat.denom), 5); + ibz_set(&(cmp.denom), 4); + res = res || quat_lattice_equal(&lat, &cmp); + ibz_set(&(lat.denom), 1); + ibz_set(&(cmp.denom), -1); + res = res || !quat_lattice_equal(&lat, &cmp); + ibz_set(&(lat.denom), 3); + ibz_set(&(cmp.denom), 3); + res = res || !quat_lattice_equal(&lat, &cmp); + ibz_set(&(lat.basis[0][0]), 1); + ibz_set(&(lat.basis[0][3]), -1); + ibz_set(&(lat.basis[1][1]), -2); + ibz_set(&(lat.basis[2][2]), 1); + ibz_set(&(lat.basis[2][1]), 1); + ibz_set(&(lat.basis[3][3]), -3); + ibz_set(&(lat.denom), 6); quat_lattice_hnf(&lat); ibz_mat_4x4_copy(&(cmp.basis), &(lat.basis)); - ibz_set(&(cmp.denom),6); - res = res || !quat_lattice_equal(&lat,&cmp); - ibz_set(&(cmp.denom),-7); - res = res || quat_lattice_equal(&lat,&cmp); - ibz_set(&(cmp.denom),6); - ibz_set(&(cmp.basis[3][3]),165); - res = res || quat_lattice_equal(&lat,&cmp); + ibz_set(&(cmp.denom), 6); + res = res || !quat_lattice_equal(&lat, &cmp); + ibz_set(&(cmp.denom), -7); + res = res || quat_lattice_equal(&lat, &cmp); + ibz_set(&(cmp.denom), 6); + ibz_set(&(cmp.basis[3][3]), 165); + res = res || quat_lattice_equal(&lat, &cmp); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_equal failed\n"); } quat_lattice_finalize(&lat); quat_lattice_finalize(&cmp); - return(res); + return (res); } -//void quat_lattice_reduce_denom(quat_lattice_t *reduced, const quat_lattice_t *lat); -int quat_test_lattice_reduce_denom(){ +// int quat_lattice_inclusion(const quat_lattice_t *sublat, const quat_lattice_t *overlat) +int +quat_test_lattice_inclusion(void) +{ + int res = 0; + quat_lattice_t lat, cmp; + quat_lattice_init(&lat); + quat_lattice_init(&cmp); + + ibz_mat_4x4_identity(&(lat.basis)); + ibz_mat_4x4_identity(&(cmp.basis)); + res = res || !quat_lattice_inclusion(&lat, &cmp); + ibz_set(&(lat.denom), 5); + ibz_set(&(cmp.denom), 4); + res = res || quat_lattice_inclusion(&lat, &cmp); + ibz_set(&(lat.denom), 1); + ibz_set(&(cmp.denom), 3); + res = res || !quat_lattice_inclusion(&lat, &cmp); + ibz_set(&(lat.denom), 3); + ibz_set(&(cmp.denom), 3); + res = res || !quat_lattice_inclusion(&lat, &cmp); + ibz_set(&(lat.basis[0][0]), 1); + ibz_set(&(lat.basis[0][3]), -1); + ibz_set(&(lat.basis[1][1]), -2); + ibz_set(&(lat.basis[2][2]), 1); + ibz_set(&(lat.basis[2][1]), 1); + ibz_set(&(lat.basis[3][3]), -3); + ibz_set(&(lat.denom), 6); + quat_lattice_hnf(&lat); + ibz_mat_4x4_copy(&(cmp.basis), &(lat.basis)); + ibz_set(&(cmp.denom), 6); + res = res || !quat_lattice_inclusion(&lat, &cmp); + ibz_set(&(cmp.denom), 12); + res = res || !quat_lattice_inclusion(&lat, &cmp); + ibz_set(&(cmp.denom), 6); + ibz_set(&(cmp.basis[3][3]), 165); + res = res || quat_lattice_inclusion(&lat, &cmp); + + if (res != 0) { + printf("Quaternion unit test lattice_inclusion failed\n"); + } + quat_lattice_finalize(&lat); + quat_lattice_finalize(&cmp); + return (res); +} + +// void quat_lattice_reduce_denom(quat_lattice_t *reduced, const quat_lattice_t *lat); +int +quat_test_lattice_reduce_denom(void) +{ int res = 0; int s; quat_lattice_t red, lat, cmp; @@ -56,78 +106,126 @@ int quat_test_lattice_reduce_denom(){ quat_lattice_init(&lat); s = 15; - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),(i+j)*s); - ibz_set(&(cmp.basis[i][j]),(i+j)); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat.basis[i][j]), (i + j) * s); + ibz_set(&(cmp.basis[i][j]), (i + j)); } } - ibz_set(&(lat.denom),4*s); + ibz_set(&(lat.denom), 4 * s); ibz_set(&(cmp.denom), 4); - quat_lattice_reduce_denom(&red,&lat); - res = res || (!ibz_mat_4x4_equal(&(red.basis),&(cmp.basis))); - res = res || ibz_cmp(&(red.denom),&(cmp.denom)); + quat_lattice_reduce_denom(&red, &lat); + res = res || (!ibz_mat_4x4_equal(&(red.basis), &(cmp.basis))); + res = res || ibz_cmp(&(red.denom), &(cmp.denom)); + quat_lattice_reduce_denom(&lat, &lat); + res = res || (!ibz_mat_4x4_equal(&(lat.basis), &(cmp.basis))); + res = res || ibz_cmp(&(lat.denom), &(cmp.denom)); - quat_lattice_reduce_denom(&lat,&lat); - res = res || (!ibz_mat_4x4_equal(&(lat.basis),&(cmp.basis))); - res = res || ibz_cmp(&(lat.denom),&(cmp.denom)); - - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_reduce_denom failed\n"); } quat_lattice_finalize(&red); quat_lattice_finalize(&cmp); quat_lattice_finalize(&lat); - return(res); + return (res); } -//void quat_lattice_dual_without_hnf(quat_lattice_t *dual, const quat_lattice_t *lat); -int quat_test_lattice_dual_without_hnf(){ +// void quat_lattice_conjugate_without_hnf(quat_lattice_t *conj, const quat_lattice_t *lat); +int +quat_test_lattice_conjugate_without_hnf(void) +{ int res = 0; - quat_lattice_t lat, dual,cmp; + quat_lattice_t lat, conj, cmp; + quat_lattice_init(&lat); + quat_lattice_init(&conj); + quat_lattice_init(&cmp); + // set lattice + ibz_mat_4x4_zero(&(lat.basis)); + ibz_set(&(lat.basis[0][0]), 4); + ibz_set(&(lat.basis[0][3]), 1); + ibz_set(&(lat.basis[1][1]), -2); + ibz_set(&(lat.basis[2][2]), -1); + ibz_set(&(lat.basis[2][1]), -1); + ibz_set(&(lat.basis[3][3]), -3); + ibz_set(&(lat.denom), 6); + ibz_mat_4x4_zero(&(cmp.basis)); + ibz_set(&(cmp.basis[0][0]), 4); + ibz_set(&(cmp.basis[0][3]), 1); + ibz_set(&(cmp.basis[1][1]), 2); + ibz_set(&(cmp.basis[2][2]), 1); + ibz_set(&(cmp.basis[2][1]), 1); + ibz_set(&(cmp.basis[3][3]), 3); + ibz_set(&(cmp.denom), 6); + quat_lattice_hnf(&lat); + quat_lattice_conjugate_without_hnf(&conj, &lat); + quat_lattice_hnf(&conj); + quat_lattice_hnf(&cmp); + res = res || !quat_lattice_equal(&conj, &cmp); + // test whether coj of conj is original lattice + quat_lattice_conjugate_without_hnf(&conj, &conj); + quat_lattice_hnf(&conj); + res = res || !quat_lattice_equal(&conj, &lat); + + if (res != 0) { + printf("Quaternion unit test lattice_conjugate_without_hnf failed\n"); + } + quat_lattice_finalize(&lat); + quat_lattice_finalize(&conj); + quat_lattice_finalize(&cmp); + return (res); +} + +// void quat_lattice_dual_without_hnf(quat_lattice_t *dual, const quat_lattice_t *lat); +int +quat_test_lattice_dual_without_hnf(void) +{ + int res = 0; + quat_lattice_t lat, dual, cmp; quat_lattice_init(&lat); quat_lattice_init(&dual); quat_lattice_init(&cmp); // set lattice ibz_mat_4x4_zero(&(lat.basis)); - ibz_set(&(lat.basis[0][0]),1); - ibz_set(&(lat.basis[0][3]),-1); - ibz_set(&(lat.basis[1][1]),-2); - ibz_set(&(lat.basis[2][2]),1); - ibz_set(&(lat.basis[2][1]),1); - ibz_set(&(lat.basis[3][3]),-3); - ibz_set(&(lat.denom),6); + ibz_set(&(lat.basis[0][0]), 1); + ibz_set(&(lat.basis[0][3]), -1); + ibz_set(&(lat.basis[1][1]), -2); + ibz_set(&(lat.basis[2][2]), 1); + ibz_set(&(lat.basis[2][1]), 1); + ibz_set(&(lat.basis[3][3]), -3); + ibz_set(&(lat.denom), 6); ibz_mat_4x4_zero(&(cmp.basis)); - ibz_set(&(cmp.basis[0][0]),6); - ibz_set(&(cmp.basis[1][1]),3); - ibz_set(&(cmp.basis[2][2]),6); - ibz_set(&(cmp.basis[3][3]),2); - ibz_set(&(cmp.denom),1); + ibz_set(&(cmp.basis[0][0]), 6); + ibz_set(&(cmp.basis[1][1]), 3); + ibz_set(&(cmp.basis[2][2]), 6); + ibz_set(&(cmp.basis[3][3]), 2); + ibz_set(&(cmp.denom), 1); quat_lattice_hnf(&lat); // test whether dual of dual is original lattice, but dual is not. - quat_lattice_dual_without_hnf(&dual,&lat); + quat_lattice_dual_without_hnf(&dual, &lat); quat_lattice_hnf(&dual); quat_lattice_hnf(&cmp); - res = res || !quat_lattice_equal(&dual,&cmp); - res = res || quat_lattice_equal(&dual,&lat); - quat_lattice_dual_without_hnf(&dual,&dual); + res = res || !quat_lattice_equal(&dual, &cmp); + res = res || quat_lattice_equal(&dual, &lat); + quat_lattice_dual_without_hnf(&dual, &dual); quat_lattice_hnf(&dual); - res = res || !quat_lattice_equal(&dual,&lat); - + res = res || !quat_lattice_equal(&dual, &lat); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_dual_without_hnf failed\n"); } quat_lattice_finalize(&lat); quat_lattice_finalize(&dual); quat_lattice_finalize(&cmp); - return(res); + return (res); } -//void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); -int quat_test_lattice_add(){ +// void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t +// *lat2); +int +quat_test_lattice_add(void) +{ int res = 0; quat_lattice_t lat1, lat2, cmp, sum; quat_lattice_init(&lat1); @@ -137,72 +235,75 @@ int quat_test_lattice_add(){ ibz_mat_4x4_zero(&(lat1.basis)); ibz_mat_4x4_zero(&(lat2.basis)); ibz_mat_4x4_zero(&(cmp.basis)); - ibz_set(&(lat1.basis[0][0]),44); - ibz_set(&(lat1.basis[0][2]),3); - ibz_set(&(lat1.basis[0][3]),32); - ibz_set(&(lat2.basis[0][0]),1); - ibz_set(&(cmp.basis[0][0]),2); - ibz_set(&(cmp.basis[0][2]),1); - ibz_set(&(lat1.basis[1][1]),5); - ibz_set(&(lat2.basis[1][1]),2); - ibz_set(&(cmp.basis[1][1]),1); - ibz_set(&(lat1.basis[2][2]),3); - ibz_set(&(lat2.basis[2][2]),1); - ibz_set(&(cmp.basis[2][2]),1); - ibz_set(&(lat1.basis[3][3]),1); - ibz_set(&(lat2.basis[3][3]),3); - ibz_set(&(cmp.basis[3][3]),3); - ibz_set(&(lat1.denom),4); - ibz_set(&(lat2.denom),6); - ibz_set(&(cmp.denom),12); + ibz_set(&(lat1.basis[0][0]), 44); + ibz_set(&(lat1.basis[0][2]), 3); + ibz_set(&(lat1.basis[0][3]), 32); + ibz_set(&(lat2.basis[0][0]), 1); + ibz_set(&(cmp.basis[0][0]), 2); + ibz_set(&(cmp.basis[0][2]), 1); + ibz_set(&(lat1.basis[1][1]), 5); + ibz_set(&(lat2.basis[1][1]), 2); + ibz_set(&(cmp.basis[1][1]), 1); + ibz_set(&(lat1.basis[2][2]), 3); + ibz_set(&(lat2.basis[2][2]), 1); + ibz_set(&(cmp.basis[2][2]), 1); + ibz_set(&(lat1.basis[3][3]), 1); + ibz_set(&(lat2.basis[3][3]), 3); + ibz_set(&(cmp.basis[3][3]), 3); + ibz_set(&(lat1.denom), 4); + ibz_set(&(lat2.denom), 6); + ibz_set(&(cmp.denom), 12); - quat_lattice_add(&sum,&lat1,&lat2); - res = res || (!ibz_mat_4x4_equal(&(sum.basis),&(cmp.basis))); - res = res || ibz_cmp(&(sum.denom),&(cmp.denom)); + quat_lattice_add(&sum, &lat1, &lat2); + res = res || (!ibz_mat_4x4_equal(&(sum.basis), &(cmp.basis))); + res = res || ibz_cmp(&(sum.denom), &(cmp.denom)); // same lattices but not under hnf ibz_mat_4x4_zero(&(lat1.basis)); ibz_mat_4x4_zero(&(lat2.basis)); - ibz_set(&(lat1.basis[0][0]),4); - ibz_set(&(lat1.basis[0][2]),3); - ibz_set(&(lat2.basis[0][0]),1); - ibz_set(&(lat2.basis[0][3]),-1); - ibz_set(&(lat1.basis[1][1]),5); - ibz_set(&(lat2.basis[1][1]),-2); - ibz_set(&(lat1.basis[2][2]),3); - ibz_set(&(lat2.basis[2][2]),1); - ibz_set(&(lat2.basis[2][1]),1); - ibz_set(&(lat1.basis[3][3]),7); - ibz_set(&(lat2.basis[3][3]),-3); - ibz_set(&(lat1.denom),4); - ibz_set(&(lat2.denom),6); + ibz_set(&(lat1.basis[0][0]), 4); + ibz_set(&(lat1.basis[0][2]), 3); + ibz_set(&(lat2.basis[0][0]), 1); + ibz_set(&(lat2.basis[0][3]), -1); + ibz_set(&(lat1.basis[1][1]), 5); + ibz_set(&(lat2.basis[1][1]), -2); + ibz_set(&(lat1.basis[2][2]), 3); + ibz_set(&(lat2.basis[2][2]), 1); + ibz_set(&(lat2.basis[2][1]), 1); + ibz_set(&(lat1.basis[3][3]), 7); + ibz_set(&(lat2.basis[3][3]), -3); + ibz_set(&(lat1.denom), 4); + ibz_set(&(lat2.denom), 6); - quat_lattice_add(&sum,&lat1,&lat2); - res = res || (!ibz_mat_4x4_equal(&(sum.basis),&(cmp.basis))); - res = res || ibz_cmp(&(sum.denom),&(cmp.denom)); + quat_lattice_add(&sum, &lat1, &lat2); + res = res || (!ibz_mat_4x4_equal(&(sum.basis), &(cmp.basis))); + res = res || ibz_cmp(&(sum.denom), &(cmp.denom)); - //double in place gives hnf - ibz_mat_4x4_copy(&(cmp.basis),&lat2.basis); - ibz_copy(&(cmp.denom),&(lat2.denom)); + // double in place gives hnf + ibz_mat_4x4_copy(&(cmp.basis), &lat2.basis); + ibz_copy(&(cmp.denom), &(lat2.denom)); quat_lattice_hnf(&cmp); - quat_lattice_add(&lat2,&lat2,&lat2); - res = res || (!ibz_mat_4x4_equal(&(lat2.basis),&(cmp.basis))); - res = res || ibz_cmp(&(lat2.denom),&(cmp.denom)); + quat_lattice_add(&lat2, &lat2, &lat2); + res = res || (!ibz_mat_4x4_equal(&(lat2.basis), &(cmp.basis))); + res = res || ibz_cmp(&(lat2.denom), &(cmp.denom)); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_add failed\n"); } quat_lattice_finalize(&lat1); quat_lattice_finalize(&lat2); quat_lattice_finalize(&sum); quat_lattice_finalize(&cmp); - return(res); + return (res); } -//void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); -int quat_test_lattice_intersect(){ +// void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t +// *lat2); +int +quat_test_lattice_intersect(void) +{ int res = 0; - quat_lattice_t lat1,lat2, inter, cmp; + quat_lattice_t lat1, lat2, inter, cmp; quat_lattice_init(&lat1); quat_lattice_init(&lat2); quat_lattice_init(&inter); @@ -210,50 +311,163 @@ int quat_test_lattice_intersect(){ ibz_mat_4x4_zero(&(cmp.basis)); ibz_mat_4x4_zero(&(lat1.basis)); ibz_mat_4x4_zero(&(lat2.basis)); - ibz_set(&(lat1.basis[0][0]),4); - ibz_set(&(lat1.basis[0][2]),3); - ibz_set(&(lat2.basis[0][0]),1); - ibz_set(&(lat2.basis[0][3]),-1); - ibz_set(&(lat1.basis[1][1]),5); - ibz_set(&(lat2.basis[1][1]),-2); - ibz_set(&(lat1.basis[2][2]),3); - ibz_set(&(lat2.basis[2][2]),1); - ibz_set(&(lat2.basis[2][1]),1); - ibz_set(&(lat1.basis[3][3]),7); - ibz_set(&(lat2.basis[3][3]),-3); - ibz_set(&(lat1.denom),4); - ibz_set(&(lat2.denom),6); + ibz_set(&(lat1.basis[0][0]), 4); + ibz_set(&(lat1.basis[0][2]), 3); + ibz_set(&(lat2.basis[0][0]), 1); + ibz_set(&(lat2.basis[0][3]), -1); + ibz_set(&(lat1.basis[1][1]), 5); + ibz_set(&(lat2.basis[1][1]), -2); + ibz_set(&(lat1.basis[2][2]), 3); + ibz_set(&(lat2.basis[2][2]), 1); + ibz_set(&(lat2.basis[2][1]), 1); + ibz_set(&(lat1.basis[3][3]), 7); + ibz_set(&(lat2.basis[3][3]), -3); + ibz_set(&(lat1.denom), 4); + ibz_set(&(lat2.denom), 6); quat_lattice_hnf(&lat1); quat_lattice_hnf(&lat2); - - ibz_set(&(cmp.basis[0][0]),2); - ibz_set(&(cmp.basis[0][2]),1); - ibz_set(&(cmp.basis[1][1]),10); - ibz_set(&(cmp.basis[2][2]),3); - ibz_set(&(cmp.basis[3][3]),7); - ibz_set(&(cmp.denom),2); - quat_lattice_intersect(&inter,&lat1,&lat2); - res = res || !quat_lattice_equal(&inter,&cmp); - quat_lattice_intersect(&lat2,&lat1,&lat2); - res = res || !quat_lattice_equal(&lat2,&cmp); - ibz_mat_4x4_copy(&(cmp.basis),&(lat1.basis)); - ibz_copy(&(cmp.denom),&(lat1.denom)); - quat_lattice_intersect(&lat1,&lat1,&lat1); - res = res || !quat_lattice_equal(&lat1,&cmp); + ibz_set(&(cmp.basis[0][0]), 2); + ibz_set(&(cmp.basis[0][2]), 1); + ibz_set(&(cmp.basis[1][1]), 10); + ibz_set(&(cmp.basis[2][2]), 3); + ibz_set(&(cmp.basis[3][3]), 7); + ibz_set(&(cmp.denom), 2); + quat_lattice_intersect(&inter, &lat1, &lat2); - if (res != 0){ + res = res || !quat_lattice_equal(&inter, &cmp); + quat_lattice_intersect(&lat2, &lat1, &lat2); + res = res || !quat_lattice_equal(&lat2, &cmp); + ibz_mat_4x4_copy(&(cmp.basis), &(lat1.basis)); + ibz_copy(&(cmp.denom), &(lat1.denom)); + quat_lattice_intersect(&lat1, &lat1, &lat1); + res = res || !quat_lattice_equal(&lat1, &cmp); + + if (res != 0) { printf("Quaternion unit test lattice_intersect failed\n"); } quat_lattice_finalize(&lat1); quat_lattice_finalize(&lat2); quat_lattice_finalize(&inter); quat_lattice_finalize(&cmp); - return(res); + return (res); } -//void quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg); -int quat_test_lattice_mul(){ +// void quat_lattice_mat_alg_coord_mul_without_hnf(ibz_mat_4x4_t *prod, const ibz_mat_4x4_t *lat, +// const ibz_vec_4_t *coord, const quat_alg_t *alg); +int +quat_test_lattice_mat_alg_coord_mul_without_hnf(void) +{ + int res = 0; + ibz_mat_4x4_t prod, cmp, lat; + ibz_vec_4_t elem; + quat_alg_t alg; + ibz_mat_4x4_init(&prod); + ibz_mat_4x4_init(&cmp); + ibz_mat_4x4_init(&lat); + ibz_vec_4_init(&elem); + quat_alg_init_set_ui(&alg, 23); + ibz_vec_4_set(&elem, 3, 4, -1, 0); + ibz_set(&(lat[0][0]), 11); + ibz_set(&(lat[1][1]), 13); + ibz_set(&(lat[2][2]), 15); + ibz_set(&(lat[3][3]), 4); + ibz_set(&(lat[0][1]), 9); + ibz_set(&(lat[1][3]), 1); + quat_lattice_mat_alg_coord_mul_without_hnf(&prod, &lat, &elem, &alg); + ibz_set(&(cmp[0][0]), 33); + ibz_set(&(cmp[1][0]), 44); + ibz_set(&(cmp[2][0]), -11); + ibz_set(&(cmp[3][0]), 0); + ibz_set(&(cmp[0][1]), 27 - 4 * 13); + ibz_set(&(cmp[1][1]), 36 + 3 * 13); + ibz_set(&(cmp[2][1]), -9 + 0); + ibz_set(&(cmp[3][1]), 0 - 13); + ibz_set(&(cmp[0][2]), 15 * 23); + ibz_set(&(cmp[1][2]), 0); + ibz_set(&(cmp[2][2]), 45); + ibz_set(&(cmp[3][2]), -60); + ibz_set(&(cmp[0][3]), -4); + ibz_set(&(cmp[1][3]), 3 + 23 * 4); + ibz_set(&(cmp[2][3]), 0 + 4 * 4); + ibz_set(&(cmp[3][3]), -1 + 4 * 3); + res = res || !ibz_mat_4x4_equal(&cmp, &prod); + quat_lattice_mat_alg_coord_mul_without_hnf(&lat, &lat, &elem, &alg); + res = res || !ibz_mat_4x4_equal(&cmp, &lat); + + if (res != 0) { + printf("Quaternion unit test lattice_mat_alg_coord_mul_without_hnf failed\n"); + } + ibz_mat_4x4_finalize(&prod); + ibz_mat_4x4_finalize(&cmp); + ibz_mat_4x4_finalize(&lat); + ibz_vec_4_finalize(&elem); + quat_alg_finalize(&alg); + return (res); +} + +// void quat_lattice_alg_elem_mul(quat_lattice_t *prod, const quat_lattice_t *lat, const +// quat_alg_elem_t *elem, const quat_alg_t *alg); +int +quat_test_lattice_alg_elem_mul(void) +{ + int res = 0; + quat_lattice_t prod, cmp, lat; + quat_alg_elem_t elem; + quat_alg_t alg; + quat_lattice_init(&prod); + quat_lattice_init(&cmp); + quat_lattice_init(&lat); + quat_alg_elem_init(&elem); + quat_alg_init_set_ui(&alg, 23); + quat_alg_elem_set(&elem, 2, 3, 4, -1, 0); + ibz_set(&(lat.basis[0][0]), 11); + ibz_set(&(lat.basis[1][1]), -13); + ibz_set(&(lat.basis[2][2]), 15); + ibz_set(&(lat.basis[3][3]), -4); + ibz_set(&(lat.basis[0][1]), 2); + ibz_set(&(lat.basis[1][3]), -1); + ibz_set(&(lat.denom), 5); + quat_lattice_hnf(&lat); + quat_lattice_alg_elem_mul(&prod, &lat, &elem, &alg); + ibz_set(&(cmp.basis[0][0]), 33); + ibz_set(&(cmp.basis[1][0]), 44); + ibz_set(&(cmp.basis[2][0]), -11); + ibz_set(&(cmp.basis[3][0]), 0); + ibz_set(&(cmp.basis[0][1]), 27 - 4 * 13); + ibz_set(&(cmp.basis[1][1]), 36 + 3 * 13); + ibz_set(&(cmp.basis[2][1]), -9 + 0); + ibz_set(&(cmp.basis[3][1]), 0 - 13); + ibz_set(&(cmp.basis[0][2]), 15 * 23); + ibz_set(&(cmp.basis[1][2]), 0); + ibz_set(&(cmp.basis[2][2]), 45); + ibz_set(&(cmp.basis[3][2]), -60); + ibz_set(&(cmp.basis[0][3]), -4); + ibz_set(&(cmp.basis[1][3]), 3 + 23 * 4); + ibz_set(&(cmp.basis[2][3]), 0 + 4 * 4); + ibz_set(&(cmp.basis[3][3]), -1 + 4 * 3); + ibz_set(&(cmp.denom), 10); + quat_lattice_hnf(&cmp); + res = res || !quat_lattice_equal(&cmp, &prod); + quat_lattice_alg_elem_mul(&lat, &lat, &elem, &alg); + res = res || !quat_lattice_equal(&cmp, &lat); + + if (res != 0) { + printf("Quaternion unit test lattice_alg_elem_mul failed\n"); + } + quat_lattice_finalize(&prod); + quat_lattice_finalize(&cmp); + quat_lattice_finalize(&lat); + quat_alg_elem_finalize(&elem); + quat_alg_finalize(&alg); + return (res); +} + +// void quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t +// *lat2, const quat_alg_t *alg); +int +quat_test_lattice_mul(void) +{ int res = 0; quat_lattice_t lat1, lat2, cmp, prod; quat_alg_t alg; @@ -263,77 +477,77 @@ int quat_test_lattice_mul(){ quat_lattice_init(&cmp); quat_alg_init_set_ui(&alg, 19); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat1.basis[i][j]),0); - ibz_set(&(lat2.basis[i][j]),0); - ibz_set(&(cmp.basis[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat1.basis[i][j]), 0); + ibz_set(&(lat2.basis[i][j]), 0); + ibz_set(&(cmp.basis[i][j]), 0); } } - ibz_set(&(lat1.basis[0][0]),44); - ibz_set(&(lat1.basis[0][2]),3); - ibz_set(&(lat1.basis[0][3]),32); - ibz_set(&(lat2.basis[0][0]),1); - ibz_set(&(cmp.basis[0][0]),1); - ibz_set(&(lat1.basis[1][1]),5); - ibz_set(&(lat2.basis[1][1]),2); - ibz_set(&(cmp.basis[1][1]),1); - ibz_set(&(lat1.basis[2][2]),3); - ibz_set(&(lat2.basis[2][2]),1); - ibz_set(&(cmp.basis[2][2]),1); - ibz_set(&(lat1.basis[3][3]),1); - ibz_set(&(lat2.basis[3][3]),3); - ibz_set(&(cmp.basis[3][3]),1); - ibz_set(&(lat1.denom),4); - ibz_set(&(lat2.denom),6); - ibz_set(&(cmp.denom),24); + ibz_set(&(lat1.basis[0][0]), 44); + ibz_set(&(lat1.basis[0][2]), 3); + ibz_set(&(lat1.basis[0][3]), 32); + ibz_set(&(lat2.basis[0][0]), 1); + ibz_set(&(cmp.basis[0][0]), 1); + ibz_set(&(lat1.basis[1][1]), 5); + ibz_set(&(lat2.basis[1][1]), 2); + ibz_set(&(cmp.basis[1][1]), 1); + ibz_set(&(lat1.basis[2][2]), 3); + ibz_set(&(lat2.basis[2][2]), 1); + ibz_set(&(cmp.basis[2][2]), 1); + ibz_set(&(lat1.basis[3][3]), 1); + ibz_set(&(lat2.basis[3][3]), 3); + ibz_set(&(cmp.basis[3][3]), 1); + ibz_set(&(lat1.denom), 4); + ibz_set(&(lat2.denom), 6); + ibz_set(&(cmp.denom), 24); - quat_lattice_mul(&prod,&lat1,&lat2,&alg); - res = res || (!ibz_mat_4x4_equal(&(prod.basis),&(cmp.basis))); - res = res || ibz_cmp(&(prod.denom),&(cmp.denom)); + quat_lattice_mul(&prod, &lat1, &lat2, &alg); + res = res || (!ibz_mat_4x4_equal(&(prod.basis), &(cmp.basis))); + res = res || ibz_cmp(&(prod.denom), &(cmp.denom)); // same lattices but not under hnf - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat1.basis[i][j]),0); - ibz_set(&(lat2.basis[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat1.basis[i][j]), 0); + ibz_set(&(lat2.basis[i][j]), 0); } } - ibz_set(&(lat1.basis[0][0]),4); - ibz_set(&(lat1.basis[0][2]),3); - ibz_set(&(lat2.basis[0][0]),1); - ibz_set(&(lat2.basis[0][3]),-1); - ibz_set(&(lat1.basis[1][1]),5); - ibz_set(&(lat2.basis[1][1]),-2); - ibz_set(&(lat1.basis[2][2]),3); - ibz_set(&(lat2.basis[2][2]),1); - ibz_set(&(lat2.basis[2][1]),1); - ibz_set(&(lat1.basis[3][3]),7); - ibz_set(&(lat2.basis[3][3]),-3); - ibz_set(&(lat1.denom),4); - ibz_set(&(lat2.denom),6); + ibz_set(&(lat1.basis[0][0]), 4); + ibz_set(&(lat1.basis[0][2]), 3); + ibz_set(&(lat2.basis[0][0]), 1); + ibz_set(&(lat2.basis[0][3]), -1); + ibz_set(&(lat1.basis[1][1]), 5); + ibz_set(&(lat2.basis[1][1]), -2); + ibz_set(&(lat1.basis[2][2]), 3); + ibz_set(&(lat2.basis[2][2]), 1); + ibz_set(&(lat2.basis[2][1]), 1); + ibz_set(&(lat1.basis[3][3]), 7); + ibz_set(&(lat2.basis[3][3]), -3); + ibz_set(&(lat1.denom), 4); + ibz_set(&(lat2.denom), 6); - quat_lattice_mul(&prod,&lat1,&lat2,&alg); - res = res || (!ibz_mat_4x4_equal(&(prod.basis),&(cmp.basis))); - res = res || ibz_cmp(&(prod.denom),&(cmp.denom)); + quat_lattice_mul(&prod, &lat1, &lat2, &alg); + res = res || (!ibz_mat_4x4_equal(&(prod.basis), &(cmp.basis))); + res = res || ibz_cmp(&(prod.denom), &(cmp.denom)); - //double in place gives hnf - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(cmp.basis[i][j]),0); + // double in place gives hnf + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(cmp.basis[i][j]), 0); } } - ibz_set(&(cmp.basis[0][0]),1); - ibz_set(&(cmp.basis[1][1]),1); - ibz_set(&(cmp.basis[2][2]),1); - ibz_set(&(cmp.basis[3][3]),1); - ibz_set(&(cmp.denom),36); - quat_lattice_mul(&lat2,&lat2,&lat2,&alg); - res = res || (!ibz_mat_4x4_equal(&(lat2.basis),&(cmp.basis))); - res = res || ibz_cmp(&(lat2.denom),&(cmp.denom)); + ibz_set(&(cmp.basis[0][0]), 1); + ibz_set(&(cmp.basis[1][1]), 1); + ibz_set(&(cmp.basis[2][2]), 1); + ibz_set(&(cmp.basis[3][3]), 1); + ibz_set(&(cmp.denom), 36); + quat_lattice_mul(&lat2, &lat2, &lat2, &alg); + res = res || (!ibz_mat_4x4_equal(&(lat2.basis), &(cmp.basis))); + res = res || ibz_cmp(&(lat2.denom), &(cmp.denom)); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_mul failed\n"); } quat_lattice_finalize(&lat1); @@ -341,178 +555,101 @@ int quat_test_lattice_mul(){ quat_lattice_finalize(&prod); quat_lattice_finalize(&cmp); quat_alg_finalize(&alg); - return(res); + return (res); } -//int quat_lattice_contains_without_alg(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x); -int quat_test_lattice_contains_without_alg(){ - int res = 0; - quat_alg_elem_t x; - quat_alg_coord_t coord, cmp; - quat_lattice_t lat; - quat_alg_elem_init(&x); - quat_alg_coord_init(&coord); - quat_alg_coord_init(&cmp); - quat_lattice_init(&lat); - - // lattice 1 - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),0); - } - } - ibz_set(&(lat.basis[0][0]),4); - ibz_set(&(lat.basis[0][2]),3); - ibz_set(&(lat.basis[1][1]),5); - ibz_set(&(lat.basis[2][2]),3); - ibz_set(&(lat.basis[3][3]),7); - ibz_set(&(lat.denom),4); - - // x 1, should fail - ibz_set(&(x.denom),3); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),-2); - ibz_set(&(x.coord[2]),26); - ibz_set(&(x.coord[3]),9); - - res = res || quat_lattice_contains_without_alg(&coord,&lat,&x); - // again, but with NULL - res = res || quat_lattice_contains_without_alg(NULL,&lat,&x); - - - // lattice 2 - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),0); - } - } - ibz_set(&(lat.basis[0][0]),1); - ibz_set(&(lat.basis[0][3]),-1); - ibz_set(&(lat.basis[1][1]),-2); - ibz_set(&(lat.basis[2][2]),1); - ibz_set(&(lat.basis[2][1]),1); - ibz_set(&(lat.basis[3][3]),-3); - ibz_set(&(lat.denom),6); - quat_lattice_hnf(&lat); - // x 1, should succeed - ibz_set(&(x.denom),3); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),-2); - ibz_set(&(x.coord[2]),26); - ibz_set(&(x.coord[3]),9); - ibz_set(&(cmp[0]),2); - ibz_set(&(cmp[1]),-2); - ibz_set(&(cmp[2]),52); - ibz_set(&(cmp[3]),6); - - res = res || (0==quat_lattice_contains_without_alg(&coord,&lat,&x)); - - res = res || ibz_cmp(&(coord[0]),&(cmp[0])); - res = res || ibz_cmp(&(coord[1]),&(cmp[1])); - res = res || ibz_cmp(&(coord[2]),&(cmp[2])); - res = res || ibz_cmp(&(coord[3]),&(cmp[3])); - // again, but with NULL - res = res || (0==quat_lattice_contains_without_alg(NULL,&lat,&x)); - - - if (res != 0){ - printf("Quaternion unit test lattice_contains_without_alg failed\n"); - } - quat_alg_elem_finalize(&x); - quat_alg_coord_finalize(&coord); - quat_alg_coord_finalize(&cmp); - quat_lattice_finalize(&lat); - return(res); -} - -//int quat_lattice_contains(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x, const quat_alg_t *alg); -int quat_test_lattice_contains(){ +// int quat_lattice_contains(quat_alg_coord_t *coord, const quat_lattice_t *lat, const +// quat_alg_elem_t *x, const quat_alg_t *alg); +int +quat_test_lattice_contains(void) +{ int res = 0; quat_alg_t alg; quat_alg_elem_t x; - quat_alg_coord_t coord, cmp; + ibz_vec_4_t coord, cmp; quat_lattice_t lat; quat_alg_init_set_ui(&alg, 103); quat_alg_elem_init(&x); - quat_alg_coord_init(&coord); - quat_alg_coord_init(&cmp); + ibz_vec_4_init(&coord); + ibz_vec_4_init(&cmp); quat_lattice_init(&lat); // lattice 1 - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat.basis[i][j]), 0); } } - ibz_set(&(lat.basis[0][0]),4); - ibz_set(&(lat.basis[0][2]),3); - ibz_set(&(lat.basis[1][1]),5); - ibz_set(&(lat.basis[2][2]),3); - ibz_set(&(lat.basis[3][3]),7); - ibz_set(&(lat.denom),4); + ibz_set(&(lat.basis[0][0]), 4); + ibz_set(&(lat.basis[0][2]), 3); + ibz_set(&(lat.basis[1][1]), 5); + ibz_set(&(lat.basis[2][2]), 3); + ibz_set(&(lat.basis[3][3]), 7); + ibz_set(&(lat.denom), 4); // x 1, should fail - ibz_set(&(x.denom),3); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),-2); - ibz_set(&(x.coord[2]),26); - ibz_set(&(x.coord[3]),9); + ibz_set(&(x.denom), 3); + ibz_set(&(x.coord[0]), 1); + ibz_set(&(x.coord[1]), -2); + ibz_set(&(x.coord[2]), 26); + ibz_set(&(x.coord[3]), 9); - res = res || quat_lattice_contains(&coord,&lat,&x,&alg); + res = res || quat_lattice_contains(&coord, &lat, &x); // again, but with NULL - res = res || quat_lattice_contains(NULL,&lat,&x,&alg); - + res = res || quat_lattice_contains(NULL, &lat, &x); // lattice 2 - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat.basis[i][j]), 0); } } - ibz_set(&(lat.basis[0][0]),1); - ibz_set(&(lat.basis[0][3]),-1); - ibz_set(&(lat.basis[1][1]),-2); - ibz_set(&(lat.basis[2][2]),1); - ibz_set(&(lat.basis[2][1]),1); - ibz_set(&(lat.basis[3][3]),-3); - ibz_set(&(lat.denom),6); + ibz_set(&(lat.basis[0][0]), 1); + ibz_set(&(lat.basis[0][3]), -1); + ibz_set(&(lat.basis[1][1]), -2); + ibz_set(&(lat.basis[2][2]), 1); + ibz_set(&(lat.basis[2][1]), 1); + ibz_set(&(lat.basis[3][3]), -3); + ibz_set(&(lat.denom), 6); quat_lattice_hnf(&lat); // x 1, should succeed - ibz_set(&(x.denom),3); - ibz_set(&(x.coord[0]),1); - ibz_set(&(x.coord[1]),-2); - ibz_set(&(x.coord[2]),26); - ibz_set(&(x.coord[3]),9); - ibz_set(&(cmp[0]),2); - ibz_set(&(cmp[1]),-2); - ibz_set(&(cmp[2]),52); - ibz_set(&(cmp[3]),6); + ibz_set(&(x.denom), 3); + ibz_set(&(x.coord[0]), 1); + ibz_set(&(x.coord[1]), -2); + ibz_set(&(x.coord[2]), 26); + ibz_set(&(x.coord[3]), 9); + ibz_set(&(cmp[0]), 2); + ibz_set(&(cmp[1]), -2); + ibz_set(&(cmp[2]), 52); + ibz_set(&(cmp[3]), 6); - res = res || (0==quat_lattice_contains(&coord,&lat,&x,&alg)); + res = res || (0 == quat_lattice_contains(&coord, &lat, &x)); - res = res || ibz_cmp(&(coord[0]),&(cmp[0])); - res = res || ibz_cmp(&(coord[1]),&(cmp[1])); - res = res || ibz_cmp(&(coord[2]),&(cmp[2])); - res = res || ibz_cmp(&(coord[3]),&(cmp[3])); + res = res || ibz_cmp(&(coord[0]), &(cmp[0])); + res = res || ibz_cmp(&(coord[1]), &(cmp[1])); + res = res || ibz_cmp(&(coord[2]), &(cmp[2])); + res = res || ibz_cmp(&(coord[3]), &(cmp[3])); // again, but with NULL - res = res || (0==quat_lattice_contains(NULL,&lat,&x,&alg)); + res = res || (0 == quat_lattice_contains(NULL, &lat, &x)); - - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_contains failed\n"); } quat_alg_finalize(&alg); quat_alg_elem_finalize(&x); - quat_alg_coord_finalize(&coord); - quat_alg_coord_finalize(&cmp); + ibz_vec_4_finalize(&coord); + ibz_vec_4_finalize(&cmp); quat_lattice_finalize(&lat); - return(res); + return (res); } -//void quat_lattice_index(ibz_t *index, const quat_lattice_t *sublat, const quat_lattice_t *overlat); -int quat_test_lattice_index(){ +// void quat_lattice_index(ibz_t *index, const quat_lattice_t *sublat, const quat_lattice_t +// *overlat); +int +quat_test_lattice_index(void) +{ int res = 0; - quat_lattice_t sublat,overlat; + quat_lattice_t sublat, overlat; ibz_t index; ibz_init(&index); quat_lattice_init(&sublat); @@ -520,267 +657,187 @@ int quat_test_lattice_index(){ ibz_mat_4x4_zero(&(sublat.basis)); ibz_mat_4x4_identity(&(overlat.basis)); - ibz_set(&(overlat.denom),2); - ibz_set(&(sublat.basis[0][0]),2); - ibz_set(&(sublat.basis[0][1]),0); - ibz_set(&(sublat.basis[0][2]),1); - ibz_set(&(sublat.basis[0][3]),0); - ibz_set(&(sublat.basis[1][0]),0); - ibz_set(&(sublat.basis[1][1]),4); - ibz_set(&(sublat.basis[1][2]),2); - ibz_set(&(sublat.basis[1][3]),3); - ibz_set(&(sublat.basis[2][0]),0); - ibz_set(&(sublat.basis[2][1]),0); - ibz_set(&(sublat.basis[2][2]),1); - ibz_set(&(sublat.basis[2][3]),0); - ibz_set(&(sublat.basis[3][0]),0); - ibz_set(&(sublat.basis[3][1]),0); - ibz_set(&(sublat.basis[3][2]),0); - ibz_set(&(sublat.basis[3][3]),1); - ibz_set(&(sublat.denom),2); - quat_lattice_index(&index,&sublat,&overlat); + ibz_set(&(overlat.denom), 2); + ibz_set(&(sublat.basis[0][0]), 2); + ibz_set(&(sublat.basis[0][1]), 0); + ibz_set(&(sublat.basis[0][2]), 1); + ibz_set(&(sublat.basis[0][3]), 0); + ibz_set(&(sublat.basis[1][0]), 0); + ibz_set(&(sublat.basis[1][1]), 4); + ibz_set(&(sublat.basis[1][2]), 2); + ibz_set(&(sublat.basis[1][3]), 3); + ibz_set(&(sublat.basis[2][0]), 0); + ibz_set(&(sublat.basis[2][1]), 0); + ibz_set(&(sublat.basis[2][2]), 1); + ibz_set(&(sublat.basis[2][3]), 0); + ibz_set(&(sublat.basis[3][0]), 0); + ibz_set(&(sublat.basis[3][1]), 0); + ibz_set(&(sublat.basis[3][2]), 0); + ibz_set(&(sublat.basis[3][3]), 1); + ibz_set(&(sublat.denom), 2); + quat_lattice_index(&index, &sublat, &overlat); - res = res || !(ibz_get(&index)==8); + res = res || !(ibz_cmp_int32(&index, 8) == 0); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_index failed\n"); } quat_lattice_finalize(&sublat); quat_lattice_finalize(&overlat); ibz_finalize(&index); - return(res); + return (res); } -//void quat_lattice_hnf(quat_lattice_t *lat); -int quat_test_lattice_hnf(){ +// void quat_lattice_hnf(quat_lattice_t *lat); +int +quat_test_lattice_hnf(void) +{ int res = 0; quat_lattice_t lat, cmp; quat_lattice_init(&lat); quat_lattice_init(&cmp); - for(int i = 0; i < 4; i++){ - for(int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),0); - ibz_set(&(cmp.basis[i][j]),0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ibz_set(&(lat.basis[i][j]), 0); + ibz_set(&(cmp.basis[i][j]), 0); } } - ibz_set(&(lat.basis[0][0]),1); - ibz_set(&(lat.basis[0][3]),-1); - ibz_set(&(lat.basis[1][1]),-2); - ibz_set(&(lat.basis[2][2]),1); - ibz_set(&(lat.basis[2][1]),1); - ibz_set(&(lat.basis[3][3]),-3); - ibz_set(&(cmp.basis[0][0]),1); - ibz_set(&(cmp.basis[1][1]),2); - ibz_set(&(cmp.basis[2][2]),1); - ibz_set(&(cmp.basis[3][3]),3); - ibz_set(&(cmp.denom),6); - ibz_set(&(lat.denom),6); + ibz_set(&(lat.basis[0][0]), 1); + ibz_set(&(lat.basis[0][3]), -1); + ibz_set(&(lat.basis[1][1]), -2); + ibz_set(&(lat.basis[2][2]), 1); + ibz_set(&(lat.basis[2][1]), 1); + ibz_set(&(lat.basis[3][3]), -3); + ibz_set(&(cmp.basis[0][0]), 1); + ibz_set(&(cmp.basis[1][1]), 2); + ibz_set(&(cmp.basis[2][2]), 1); + ibz_set(&(cmp.basis[3][3]), 3); + ibz_set(&(cmp.denom), 6); + ibz_set(&(lat.denom), 6); quat_lattice_hnf(&lat); - res = res || (!ibz_mat_4x4_equal(&(lat.basis),&(cmp.basis))); - res = res || ibz_cmp(&(lat.denom),&(cmp.denom)); + res = res || (!ibz_mat_4x4_equal(&(lat.basis), &(cmp.basis))); + res = res || ibz_cmp(&(lat.denom), &(cmp.denom)); - if (res != 0){ + if (res != 0) { printf("Quaternion unit test lattice_hnf failed\n"); } quat_lattice_finalize(&lat); quat_lattice_finalize(&cmp); - return(res); + return (res); } -//int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const ibz_t *q, int precision); -int quat_test_lattice_lll(){ - int res = 0; - quat_lattice_t lat, test; - ibz_mat_4x4_t red; - ibz_t num, denom, q; - ibq_t coeff; - ibz_init(&num); - ibz_init(&denom); - ibz_init(&q); - ibq_init(&coeff); - ibz_mat_4x4_init(&red); - quat_lattice_init(&lat); - quat_lattice_init(&test); - - // set lattice - ibz_set(&lat.denom, 60); - ibz_mat_4x4_zero(&(lat.basis)); - ibz_set(&lat.basis[0][0], 3); - ibz_set(&lat.basis[1][0], 7); - ibz_set(&lat.basis[0][1], 1); - ibz_set(&lat.basis[3][1], -6); - ibz_set(&lat.basis[1][2], 12); - ibz_set(&lat.basis[2][2], 5); - ibz_set(&lat.basis[0][3], -19); - ibz_set(&lat.basis[3][3], 3); - - quat_lattice_hnf(&lat); - - ibz_set(&q,103); - res = res || quat_lattice_lll(&red,&lat,&q,10); - // test lll reduced - ibz_set(&num,3); - ibz_set(&denom,4); - ibq_set(&coeff,&num,&denom); - res = res || !quat_dim4_lll_verify(&red,&coeff,&q); - // test lattice equality - ibz_copy(&(test.denom),&(lat.denom)); - ibz_mat_4x4_copy(&(test.basis),&(red)); - quat_lattice_hnf(&test); - res = res || !quat_lattice_equal(&test,&lat); - - if (res != 0){ - printf("Quaternion unit test lattice_lll failed\n"); - } - ibz_finalize(&num); - ibz_finalize(&denom); - ibz_finalize(&q); - ibq_finalize(&coeff); - ibz_mat_4x4_finalize(&red); - quat_lattice_finalize(&lat); - quat_lattice_finalize(&test); - return(res); -} - -//int quat_lattice_random_elem(quat_alg_elem_t *elem, const quat_lattice_t *lattice, unsigned char n) -int quat_test_lattice_random_elem(){ - int res = 0; - - quat_lattice_t lat; - quat_alg_elem_t elem; - quat_lattice_init(&lat); - quat_alg_elem_init(&elem); - - ibz_set(&lat.denom, 60); - ibz_set(&lat.basis[0][0], 3); - ibz_set(&lat.basis[1][0], 7); - ibz_set(&lat.basis[0][1], 1); - ibz_set(&lat.basis[3][1], -6); - ibz_set(&lat.basis[1][2], 12); - ibz_set(&lat.basis[2][2], 5); - ibz_set(&lat.basis[0][3], -19); - ibz_set(&lat.basis[3][3], 3); - quat_lattice_hnf(&lat); - - for (int i = 0; i <= 10; i++) { - int prng = quat_lattice_random_elem(&elem, &lat, 3); - assert(prng); - res |= !quat_lattice_contains_without_alg(&elem.coord, &lat, &elem); - for (int j = 0; j < 4; j++) { - res |= !(ibz_get(&elem.coord[j]) < (1 << 2)); - res |= !(-(1 << 2) <= ibz_get(&elem.coord[j])); - } - } - - quat_lattice_finalize(&lat); - quat_alg_elem_finalize(&elem); - - if (res != 0){ - printf("Quaternion unit test lattice_random_elem failed\n"); - } - return res; -} - -//void quat_lattice_right_transporter(quat_lattice_t *trans, const quat_lattice_t *lat1, const quat_lattice_t *lat1) -int quat_test_lattice_right_transporter_hnf(){ +int +quat_test_lattice_gram() +{ int res = 0; + quat_lattice_t lattice; + ibz_mat_4x4_t gram; + ibz_t test, norm1, norm2; + ibz_vec_4_t vec1, vec2; + quat_alg_elem_t elem1, elem2; quat_alg_t alg; - quat_lattice_t lat1, lat2, trans, exp; + quat_lattice_init(&lattice); + ibz_mat_4x4_init(&gram); + ibz_init(&test); + ibz_init(&norm1); + ibz_init(&norm2); + ibz_vec_4_init(&vec1); + ibz_vec_4_init(&vec2); + quat_alg_elem_init(&elem1); + quat_alg_elem_init(&elem2); quat_alg_init_set_ui(&alg, 103); - quat_lattice_init(&lat1); - quat_lattice_init(&lat2); - quat_lattice_init(&trans); - quat_lattice_init(&exp); - ibz_set(&lat1.basis[0][0], 9); - ibz_set(&lat1.basis[0][1], 4); - ibz_set(&lat1.basis[0][2], 7); - ibz_set(&lat1.basis[1][1], 12); - ibz_set(&lat1.basis[1][3], 6); - ibz_set(&lat1.basis[2][2], 8); - ibz_set(&lat1.basis[2][3], 3); - ibz_set(&lat1.basis[3][3], 3); - ibz_set(&lat1.denom, 11); + quat_lattice_O0_set(&lattice); + quat_lattice_gram(&gram, &lattice, &alg); + quat_alg_elem_set(&elem1, 1, 2, 3, 4, 1); + quat_alg_elem_set(&elem2, 1, 2, 4, 4, 1); + quat_lattice_contains(&vec1, &lattice, &elem1); + quat_lattice_contains(&vec2, &lattice, &elem2); + quat_alg_conj(&elem2, &elem2); + quat_alg_mul(&elem1, &elem1, &elem2, &alg); + ibz_mul(&norm1, &(elem1.coord[0]), &ibz_const_two); + ibz_div(&norm1, &test, &norm1, &(elem1.denom)); - quat_lattice_mul(&lat2, &lat1, &lat1, &alg); - quat_lattice_right_transporter(&trans, &lat1, &lat2, &alg); - - ibz_set(&exp.basis[0][0], 1); - ibz_set(&exp.basis[1][1], 12); - ibz_set(&exp.basis[1][3], 6); - ibz_set(&exp.basis[2][2], 8); - ibz_set(&exp.basis[2][3], 3); - ibz_set(&exp.basis[3][3], 3); - ibz_set(&exp.denom, 11); - - res |= !quat_lattice_equal(&trans, &exp); - - ibz_set(&(alg.p),19); - ibz_set(&(alg.gram[2][2]),19); - ibz_set(&(alg.gram[3][3]),19); - ibz_set(&lat1.basis[0][0], -12); - ibz_set(&lat1.basis[0][1], 60); - ibz_set(&lat1.basis[0][2], 42); - ibz_set(&lat1.basis[0][3], 60); - ibz_set(&lat1.basis[1][0], 9); - ibz_set(&lat1.basis[1][1], 24); - ibz_set(&lat1.basis[1][2], 0); - ibz_set(&lat1.basis[1][3], -21); - ibz_set(&lat1.basis[2][0], 0); - ibz_set(&lat1.basis[2][1], -18); - ibz_set(&lat1.basis[2][2], 27); - ibz_set(&lat1.basis[2][3], 3); - ibz_set(&lat1.basis[3][0], 0); - ibz_set(&lat1.basis[3][1], 0); - ibz_set(&lat1.basis[3][2], 15); - ibz_set(&lat1.basis[3][3], 3); - ibz_set(&lat1.denom, 15); - - quat_lattice_hnf(&lat1); - quat_lattice_reduce_denom(&lat1, &lat1); - quat_lattice_mul(&lat2, &lat1, &lat1, &alg); - quat_lattice_right_transporter(&trans, &lat1, &lat2, &alg); - ibz_mat_4x4_zero(&(exp.basis)); - ibz_set(&exp.basis[0][0], 2); - ibz_set(&exp.basis[1][1], 1); - ibz_set(&exp.basis[2][2], 2); - ibz_set(&exp.basis[2][3], 1); - ibz_set(&exp.basis[3][3], 1); - ibz_set(&exp.denom, 5); - - res |= !quat_lattice_equal(&trans, &exp); - - if (res != 0){ - printf("Quaternion unit test lattice_right_transporter_hnf failed\n"); + ibz_mat_4x4_eval(&vec1, &gram, &vec1); + ibz_set(&norm2, 0); + for (int i = 0; i < 4; i++) { + ibz_mul(&test, &(vec1[i]), &(vec2[i])); + ibz_add(&norm2, &norm2, &test); } - quat_alg_finalize(&alg); - quat_lattice_finalize(&lat1); - quat_lattice_finalize(&lat2); - quat_lattice_finalize(&trans); - quat_lattice_finalize(&exp); - return(res); -} + ibz_div(&norm2, &test, &norm2, &(lattice.denom)); + ibz_div(&norm2, &test, &norm2, &(lattice.denom)); + res = res | !(ibz_cmp(&norm1, &norm2) == 0); + ibz_mat_4x4_zero(&(lattice.basis)); + ibz_set(&(lattice.basis[0][0]), 202); + ibz_set(&(lattice.basis[1][1]), 202); + ibz_set(&(lattice.basis[2][2]), 1); + ibz_set(&(lattice.basis[3][3]), 1); + ibz_set(&(lattice.basis[0][2]), 158); + ibz_set(&(lattice.basis[0][3]), 53); + ibz_set(&(lattice.basis[1][2]), 149); + ibz_set(&(lattice.basis[1][3]), 158); + ibz_set(&(lattice.denom), 2); + quat_lattice_gram(&gram, &lattice, &alg); + + quat_alg_elem_set(&elem1, 2, 360, 149, 1, 0); + quat_alg_elem_set(&elem2, 2, 53, 360, 0, 1); + int ok = quat_lattice_contains(&vec1, &lattice, &elem1); + ok = ok && quat_lattice_contains(&vec2, &lattice, &elem2); + assert(ok); + quat_alg_conj(&elem2, &elem2); + quat_alg_mul(&elem1, &elem1, &elem2, &alg); + ibz_mul(&norm1, &(elem1.coord[0]), &ibz_const_two); + ibz_div(&norm1, &test, &norm1, &(elem1.denom)); + + ibz_mat_4x4_eval(&vec1, &gram, &vec1); + ibz_set(&norm2, 0); + for (int i = 0; i < 4; i++) { + ibz_mul(&test, &(vec1[i]), &(vec2[i])); + ibz_add(&norm2, &norm2, &test); + } + ibz_div(&norm2, &test, &norm2, &(lattice.denom)); + ibz_div(&norm2, &test, &norm2, &(lattice.denom)); + res = res | !(ibz_cmp(&norm1, &norm2) == 0); + + if (res != 0) { + printf("Quaternion unit test lattice_gram failed\n"); + } + quat_lattice_finalize(&lattice); + ibz_mat_4x4_finalize(&gram); + ibz_finalize(&test); + ibz_finalize(&norm1); + ibz_finalize(&norm2); + ibz_vec_4_finalize(&vec1); + ibz_vec_4_finalize(&vec2); + quat_alg_elem_finalize(&elem1); + quat_alg_elem_finalize(&elem2); + quat_alg_finalize(&alg); + return (res); +} // run all previous tests -int quat_test_lattice(){ +int +quat_test_lattice(void) +{ int res = 0; printf("\nRunning quaternion tests of lattice functions\n"); res = res | quat_test_lattice_equal(); + res = res | quat_test_lattice_inclusion(); res = res | quat_test_lattice_reduce_denom(); + res = res | quat_test_lattice_conjugate_without_hnf(); res = res | quat_test_lattice_dual_without_hnf(); res = res | quat_test_lattice_add(); res = res | quat_test_lattice_intersect(); + res = res | quat_test_lattice_mat_alg_coord_mul_without_hnf(); + res = res | quat_test_lattice_alg_elem_mul(); res = res | quat_test_lattice_mul(); - res = res | quat_test_lattice_contains_without_alg(); res = res | quat_test_lattice_contains(); res = res | quat_test_lattice_index(); res = res | quat_test_lattice_hnf(); - res = res | quat_test_lattice_lll(); - res = res | quat_test_lattice_random_elem(); - res = res | quat_test_lattice_right_transporter_hnf(); - return(res); + res = res | quat_test_lattice_gram(); + return (res); } diff --git a/src/quaternion/ref/generic/test/matkermod.c b/src/quaternion/ref/generic/test/matkermod.c deleted file mode 100644 index 1a9b804..0000000 --- a/src/quaternion/ref/generic/test/matkermod.c +++ /dev/null @@ -1,218 +0,0 @@ -#include "quaternion_tests.h" - -//void ibz_mat_howell(int rows, int cols, ibz_t howell[rows][rows+1], const ibz_t mat[rows][cols], ibz_t *mod) -int quat_test_ibz_mat_howell(){ - int res = 0; - - // Examples from Mulders & Storjohan - - ibz_t mod; - ibz_t stormin[3][3], stormout[3][4], stormtrans[4][4], expected[3][4]; - ibz_init(&mod); - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) - ibz_init(&stormin[i][j]); - for (int j = 0; j < 4; j++) { - ibz_init(&stormout[i][j]); - ibz_init(&expected[i][j]); - } - } - for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) - ibz_init(&stormtrans[i][j]); - - ibz_set(&mod, 12); - ibz_set(&expected[0][2], 4); - ibz_set(&expected[1][2], 1); - ibz_set(&expected[2][3], 1); - - ibz_set(&stormin[0][0], 4); - ibz_set(&stormin[1][0], 1); - ibz_set(&stormin[2][1], 5); - int zeros = ibz_mat_howell(3, 3, stormout, stormtrans, stormin, &mod); - res |= zeros != 2; - - for (int i = 0; i < 3; i++) - for (int j = 0; j < 3; j++) - res |= ibz_cmp(&stormout[i][j], &expected[i][j]); - - ibz_set(&stormin[0][0], 8); - ibz_set(&stormin[1][0], 5); - ibz_set(&stormin[2][0], 5); - ibz_set(&stormin[1][1], 9); - ibz_set(&stormin[2][1], 8); - ibz_set(&stormin[2][2], 10); - zeros = ibz_mat_howell(3, 3, stormout, stormtrans, stormin, &mod); - res |= zeros != 2; - - for (int i = 0; i < 3; i++) - for (int j = 0; j < 4; j++) - res |= ibz_cmp(&stormout[i][j], &expected[i][j]); - - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) - ibz_finalize(&stormin[i][j]); - for (int j = 0; j < 4; j++) { - ibz_finalize(&stormout[i][j]); - ibz_finalize(&expected[i][j]); - } - } - for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) - ibz_finalize(&stormtrans[i][j]); - - // An example computed in Pari - ibz_t in[5][3], out[5][6], exp[5][6], trans[6][6]; - for (int i = 0; i < 5; i++) { - for (int j = 0; j < 3; j++) - ibz_init(&in[i][j]); - for (int j = 0; j < 6; j++) { - ibz_init(&out[i][j]); - ibz_init(&exp[i][j]); - } - } - for (int i = 0; i < 6; i++) - for (int j = 0; j < 6; j++) - ibz_init(&trans[i][j]); - - ibz_set(&mod, 60); - - ibz_set(&in[0][0], 1); - ibz_set(&in[0][1], 2); - ibz_set(&in[0][2], -3); - ibz_set(&in[1][0], 4); - ibz_set(&in[1][1], 5); - ibz_set(&in[1][2], 6); - ibz_set(&in[2][0], 7); - ibz_set(&in[2][1], 8); - ibz_set(&in[2][2], 19); - ibz_set(&in[3][0], 10); - ibz_set(&in[3][1], 11); - ibz_set(&in[3][2], 12); - ibz_set(&in[4][0], 13); - ibz_set(&in[4][1], 14); - ibz_set(&in[4][2], 15); - - ibz_set(&exp[0][2], 12); - ibz_set(&exp[0][3], 6); - ibz_set(&exp[2][3], 10); - ibz_set(&exp[1][4], 9); - ibz_set(&exp[2][4], 6); - ibz_set(&exp[3][4], 3); - ibz_set(&exp[0][5], 1); - ibz_set(&exp[1][5], 1); - ibz_set(&exp[2][5], 1); - ibz_set(&exp[3][5], 1); - ibz_set(&exp[4][5], 1); - - zeros = ibz_mat_howell(5, 3, out, trans, in, &mod); - res |= zeros != 2; - - for (int i = 0; i < 5; i++) - for (int j = 0; j < 6; j++) - res |= ibz_cmp(&out[i][j], &exp[i][j]); - - if (res != 0){ - printf("Quaternion unit test ibz_mat_howell failed\n"); - } - for (int i = 0; i < 5; i++) { - for (int j = 0; j < 3; j++) - ibz_finalize(&in[i][j]); - for (int j = 0; j < 6; j++) { - ibz_finalize(&out[i][j]); - ibz_finalize(&exp[i][j]); - } - } - for (int i = 0; i < 6; i++) - for (int j = 0; j < 6; j++) - ibz_finalize(&trans[i][j]); - ibz_finalize(&mod); - return res; -} - - -//void ibz_mat_right_ker_mod(int rows, int cols, ibz_t ker[cols][rows], const ibz_t mat[rows][cols], ibz_t *mod) -int quat_test_ibz_mat_right_ker_mod() { - int res = 0; - - // An example computed in Pari - ibz_t mod, a, b, tmp; - ibz_init(&mod); - ibz_init(&a); - ibz_init(&b); - ibz_init(&tmp); - ibz_t mat[5][3], ker[3][5]; - for (int i = 0; i < 5; i++) { - for (int j = 0; j < 3; j++) { - ibz_init(&mat[i][j]); - ibz_init(&ker[j][i]); - } - } - - ibz_set(&mod, 60); - - ibz_set(&mat[0][0], 1); - ibz_set(&mat[0][1], 2); - ibz_set(&mat[0][2], -3); - ibz_set(&mat[1][0], 4); - ibz_set(&mat[1][1], 5); - ibz_set(&mat[1][2], 6); - ibz_set(&mat[2][0], 7); - ibz_set(&mat[2][1], 8); - ibz_set(&mat[2][2], 19); - ibz_set(&mat[3][0], 10); - ibz_set(&mat[3][1], 11); - ibz_set(&mat[3][2], 12); - ibz_set(&mat[4][0], 13); - ibz_set(&mat[4][1], 14); - ibz_set(&mat[4][2], 15); - - // self-testing thanks to assertions - ibz_mat_right_ker_mod(5, 3, ker, mat, &mod); - - // Randomized test - ibz_set(&mod, 6402373705728000l); - for (int r = 0; r < 10; r++) { - for (int i = 0; i < 2; i++) - for (int j = 0; j < 3; j++) - ibz_rand_interval(&mat[i][j], &ibz_const_zero, &mod); - for (int i = 2; i < 5; i++) { - ibz_rand_interval(&a, &ibz_const_zero, &mod); - ibz_rand_interval(&b, &ibz_const_zero, &mod); - for (int j = 0; j < 3; j++) { - ibz_mul(&tmp, &mat[0][j], &a); - ibz_mul(&mat[i][j], &mat[1][1], &b); - ibz_add(&mat[i][j], &mat[i][j], &tmp); - ibz_mod(&mat[i][j], &mat[i][j], &mod); - } - } - - // self-testing thanks to assertions - ibz_mat_right_ker_mod(5, 3, ker, mat, &mod); - } - - - if (res != 0){ - printf("Quaternion unit test ibz_mat_howell failed\n"); - } - for (int i = 0; i < 5; i++) { - for (int j = 0; j < 3; j++) { - ibz_finalize(&mat[i][j]); - ibz_finalize(&ker[j][i]); - } - } - ibz_finalize(&mod); - ibz_finalize(&a); - ibz_finalize(&b); - ibz_finalize(&tmp); - return res; -} - -// run all previous tests -int quat_test_matkermod(){ - int res = 0; - printf("\nRunning quaternion tests of matkermod\n"); - res = res | quat_test_ibz_mat_howell(); - res = res | quat_test_ibz_mat_right_ker_mod(); - return(res); -} diff --git a/src/quaternion/ref/generic/test/mini-gmp.c b/src/quaternion/ref/generic/test/mini-gmp.c new file mode 100644 index 0000000..9870c21 --- /dev/null +++ b/src/quaternion/ref/generic/test/mini-gmp.c @@ -0,0 +1,211 @@ +#include +#include +#include +#include +#include "mini-gmp-extra.h" +#include "intbig_internal.h" +#include "rng.h" + +#define RANDOM_TEST_ITERS 1000 + +int +mini_gmp_test_mpz_legendre(void) +{ + int res = 0; + const int levels = 3; + const int cofactor[] = { 5, 65, 27 }; + const int e[] = { 248, 376, 500 }; + + int as[] = { -2, -1, 0, 1, 2 }; + // clang-format off + int legendre[3][5] = { + { -1, -1, 0, 1, 1, }, + { -1, -1, 0, 1, 1, }, + { -1, -1, 0, 1, 1, }, + }; + // clang-format on + + mpz_t a, p; + mpz_init(a); + mpz_init(p); + + for (int i = 0; i < levels; i++) { + // build cofactor*2^e - 1 for the i-th level + mpz_set_ui(p, 1); + mpz_mul_2exp(p, p, e[i]); + mpz_mul_ui(p, p, cofactor[i]); + mpz_sub_ui(p, p, 1); + + for (unsigned long j = 0; j < sizeof(as) / sizeof(as[0]); j++) { + mpz_set_si(a, as[j]); + res = res | (mini_mpz_legendre(a, p) != legendre[i][j]); + } + +#if defined(__GMP_H__) + for (int j = 0; j < RANDOM_TEST_ITERS; j++) { + ibz_rand_interval(&a, &ibz_const_zero, &p); + // Compare against the full GMP implementation + res = res | (mini_mpz_legendre(a, p) != mpz_legendre(a, p)); + } +#endif + } + + mpz_clear(a); + mpz_clear(p); + + if (res) { + printf("mini-gmp test mpz_legendre failed\n"); + } + + return res; +} + +typedef union +{ + double d; + int64_t s64; + unsigned char uc[sizeof(int64_t)]; +} double_int64_uchar_t; + +int +mini_gmp_test_mpz_get_d_2exp(void) +{ + int res = 0; + signed long int e, e2 UNUSED; + double d, d2 UNUSED; + mpz_t op; + + mpz_init(op); + + // Test 0 + mpz_set_si(op, 0); + d = mini_mpz_get_d_2exp(&e, op); + res = res | (e != 0); + res = res | (d != 0.0); // exact floating point comparison + + // Test 1 + mpz_set_si(op, 1); + d = mini_mpz_get_d_2exp(&e, op); + res = res | (e != 1); + res = res | (d != 0.5); // exact floating point comparison + + // Test -1 + mpz_set_si(op, -1); + d = mini_mpz_get_d_2exp(&e, op); + res = res | (e != 1); + res = res | (d != -0.5); // exact floating point comparison + + // Test a few powers of 2: 2^1, 2^2, 2^4, 2^8, ..., 2^65536, and their negatives + for (int i = 0; i <= 16; i++) { + mpz_set_ui(op, 1); + mpz_mul_2exp(op, op, 1 << i); + + d = mini_mpz_get_d_2exp(&e, op); + res = res | (e != (1 << i) + 1); + res = res | (d != 0.5); // exact floating point comparison + + mpz_neg(op, op); + d = mini_mpz_get_d_2exp(&e, op); + res = res | (e != (1 << i) + 1); + res = res | (d != -0.5); // exact floating point comparison + } + + // Test random doubles with random exponent + double_int64_uchar_t dd; + volatile uint16_t ee; + + for (uint32_t i = 0; i < RANDOM_TEST_ITERS; i++) { + randombytes(dd.uc, sizeof(dd.uc)); + randombytes((unsigned char *)&ee, sizeof(ee)); + +#ifdef TARGET_BIG_ENDIAN + // Ensure reproducibility in big-endian systems + dd.s64 = BSWAP64(dd.s64); + ee = BSWAP16(ee); +#endif + + dd.s64 &= 0x800fffffffffffff; // clear exponent + dd.s64 |= 0x3fe0000000000000; // set exponent to -1 + + if (ee >= DBL_MANT_DIG) { + mpz_set_d(op, dd.d * (INT64_C(1) << DBL_MANT_DIG)); + mpz_mul_2exp(op, op, ee - DBL_MANT_DIG); + } else { + // Since it fits in a double, round it first to ensure it's an integer + dd.d = round(dd.d * (INT64_C(1) << ee)); + mpz_set_d(op, dd.d); + dd.d /= INT64_C(1) << ee; + // These cases (-1, 0, 1) were already tested, and +/- 1 would require special-casing below + if (fabs(dd.d) <= 1.0) { + continue; + } + } + + d = mini_mpz_get_d_2exp(&e, op); + + res = res | (e != ee); + res = res | (d != dd.d); + +#if defined(__GMP_H__) + // Compare against the full GMP implementation + d2 = mpz_get_d_2exp(&e2, op); + + res = res | (e != e2); + res = res | (d != d2); +#endif + } + +#if defined(__GMP_H__) + for (int exp2 = 1023; exp2 <= 1025; exp2++) { + for (int sign_outer = -1; sign_outer <= 1; sign_outer += 2) { + for (int sign_inner = -1; sign_inner <= 1; sign_inner += 2) { + for (int i = 1; i < 15; i++) { + mpz_set_si(op, i); + mpz_mul_2exp(op, op, 55); + if (sign_inner > 0) + mpz_add_ui(op, op, 1); + else + mpz_sub_ui(op, op, 1); + mpz_mul_2exp(op, op, exp2 - 55); + mpz_mul_si(op, op, sign_outer); + + d = mini_mpz_get_d_2exp(&e, op); + d2 = mpz_get_d_2exp(&e2, op); + + res = res | (e != e2); + res = res | (d != d2); + } + } + } + } + + // Test random integers + for (uint32_t i = 0; i < RANDOM_TEST_ITERS; i++) { + ibz_rand_interval_bits(&op, 8 * (i + 1)); + + d = mini_mpz_get_d_2exp(&e, op); + d2 = mpz_get_d_2exp(&e2, op); + + res = res | (e != e2); + res = res | (d != d2); + } +#endif + + if (res) { + printf("mini-gmp test mpz_get_d_2exp failed\n"); + } + + mpz_clear(op); + + return res; +} + +int +mini_gmp_test(void) +{ + int res = 0; + printf("\nRunning tests for implementations of GMP functions missing from the mini-GMP API\n"); + res = res | mini_gmp_test_mpz_legendre(); + res = res | mini_gmp_test_mpz_get_d_2exp(); + return res; +} diff --git a/src/quaternion/ref/generic/test/normeq.c b/src/quaternion/ref/generic/test/normeq.c new file mode 100644 index 0000000..cbdeea3 --- /dev/null +++ b/src/quaternion/ref/generic/test/normeq.c @@ -0,0 +1,384 @@ +#include "quaternion_tests.h" +#include +#include + +// helpers for setting parameters + +// test if parameters are such that represent_inter is likely to find a solution +int +quat_test_input_for_repres_bound(const ibz_t *p, const ibz_t *M, int q) +{ + ibz_t c, r; + ibz_init(&c); + ibz_init(&r); + ibz_set(&r, q); + ibz_mul(&r, &r, p); + ibz_div(&c, &r, M, &r); + ibz_set(&r, 1 << 20); + int res = (ibz_cmp(&r, &c) <= 0); + ibz_finalize(&c); + ibz_finalize(&r); + return (res); +} + +// 1 if ok, 0 if error +int +quat_test_special_extremal_setup(quat_represent_integer_params_t *params, const quat_alg_t *alg) +{ // check the order is maximal and i,j generate a suborder + int res = 1; + ibz_vec_4_t ij; + quat_lattice_t lat; + quat_lattice_t test; + ibz_vec_4_init(&ij); + quat_lattice_init(&lat); + quat_lattice_init(&test); + quat_alg_coord_mul(&ij, &(params->order->z.coord), &(params->order->t.coord), alg); + ibz_copy(&(lat.denom), &(params->order->z.denom)); + ibz_copy(&(lat.basis[0][0]), &(lat.denom)); + for (int i = 0; i < 4; i++) { + ibz_copy(&(lat.basis[i][3]), &(ij[i])); + ibz_mul(&(lat.basis[i][2]), &(params->order->t.coord[i]), &(lat.denom)); + ibz_copy(&(lat.basis[i][1]), &(params->order->z.coord[i])); + } + quat_lattice_hnf(&lat); + quat_lattice_mul(&test, &lat, &lat, alg); + res = res && quat_lattice_inclusion(&test, &lat); + quat_lattice_mul(&test, &(params->order->order), &(params->order->order), alg); + res = res && quat_lattice_inclusion(&test, &(params->order->order)); + res = res && quat_order_is_maximal(&(params->order->order), alg); + res = res && quat_lattice_inclusion(&lat, &(params->order->order)); + ibz_vec_4_finalize(&ij); + quat_lattice_finalize(&lat); + quat_lattice_finalize(&test); + return (res); +} + +void +quat_test_set_params_standard(quat_represent_integer_params_t *params, + quat_p_extremal_maximal_order_t *order, + const quat_alg_t *alg) +{ + quat_lattice_O0_set_extremal(order); + + params->algebra = alg; + params->order = order; + assert(quat_test_special_extremal_setup(params, alg)); +} + +void +quat_test_set_params_non_standard(quat_represent_integer_params_t *params, + quat_p_extremal_maximal_order_t *order, + const quat_alg_t *alg) +{ + ibz_set_from_str(&order->z.coord[1], "214764116738303679745780048598183569015", 10); + ibz_set(&order->z.coord[2], 0); + ibz_set_from_str(&order->z.coord[3], "1", 10); + ibz_set_from_str(&order->z.denom, "73403150722045993989123427738005336972", 10); + ibz_set(&order->t.coord[2], 1); + ibz_set(&order->t.denom, 1); + order->q = 13; + ibz_set_from_str(&(order->order.basis[0][0]), "73403150722045993989123427738005336972", 10); + ibz_set_from_str(&(order->order.basis[1][1]), + "2694011267961700664357934052637599020390646823337886018360381743577635064392", + 10); + ibz_set_from_str(&(order->order.basis[2][2]), "36701575361022996994561713869002668486", 10); + ibz_set(&(order->order.basis[3][3]), 1); + ibz_set_from_str(&(order->order.basis[0][2]), "36701575361022996994561713869002668486", 10); + ibz_set_from_str(&(order->order.basis[0][3]), "0", 10); + ibz_set_from_str(&(order->order.basis[1][2]), "0", 10); + ibz_set_from_str(&(order->order.basis[1][3]), "214764116738303679745780048598183569015", 10); + ibz_set_from_str(&(order->order.denom), "73403150722045993989123427738005336972", 10); + + params->algebra = alg; + params->order = order; + + assert(quat_test_special_extremal_setup(params, alg)); +} + +// void quat_order_elem_create(quat_alg_elem_t *elem, const quat_p_extremal_maximal_order_t *order, +// const ibz_vec_4_t *coeffs, const quat_alg_t *Bpoo); +int +quat_test_order_elem_create() +{ + int res = 0; + quat_p_extremal_maximal_order_t O0; + ibz_vec_4_t vec, cmp; + quat_alg_t alg; + quat_alg_elem_t elem; + ibz_vec_4_init(&vec); + ibz_vec_4_init(&cmp); + quat_alg_elem_init(&elem); + quat_alg_elem_init(&(O0.z)); + quat_alg_elem_init(&(O0.t)); + quat_lattice_init(&(O0.order)); + quat_alg_init_set_ui(&alg, 103); + + quat_lattice_O0_set_extremal(&O0); + ibz_vec_4_set(&vec, 1, 7, 2, -2); + ibz_vec_4_copy(&cmp, &vec); + ibz_neg(&(cmp[3]), &(cmp[3])); + quat_order_elem_create(&elem, &O0, &vec, &alg); + res = res | ibz_cmp(&(elem.denom), &ibz_const_one); + for (int i = 0; i < 4; i++) + res = res | ibz_cmp(&(elem.coord[i]), &cmp[i]); + + if (res) { + printf("Quaternion unit test order_elem_create failed\n"); + } + ibz_vec_4_finalize(&vec); + ibz_vec_4_finalize(&cmp); + quat_alg_elem_finalize(&elem); + quat_alg_elem_finalize(&(O0.z)); + quat_alg_elem_finalize(&(O0.t)); + quat_lattice_finalize(&(O0.order)); + quat_alg_finalize(&alg); + return (res); +} + +// int quat_sampling_random_ideal_O0_given_norm(quat_left_ideal_t *lideal,const ibz_t *norm,int +// is_prime,const quat_represent_integer_params_t *params,int prime_sampling_attempts); +int +quat_test_sampling_random_ideal_O0_given_norm() +{ + int res = 0; + quat_left_ideal_t lideal; + quat_lattice_t test; + quat_represent_integer_params_t params; + quat_p_extremal_maximal_order_t O0; + quat_alg_t alg; + ibz_t p, norm, coprime; + quat_lattice_init(&test); + ibz_init(&norm); + ibz_init(&p); + ibz_init(&coprime); + quat_left_ideal_init(&lideal); + quat_alg_elem_init(&(O0.z)); + quat_alg_elem_init(&(O0.t)); + quat_lattice_init(&(O0.order)); + params.primality_test_iterations = 30; + ibz_set(&p, 1533069323); + quat_alg_init_set(&alg, &p); + quat_test_set_params_standard(¶ms, &O0, &alg); + ibz_set(&p, 1338708463); + res = res || !quat_sampling_random_ideal_O0_given_norm(&lideal, &p, 1, ¶ms, NULL); + res = res || (ibz_cmp(&(lideal.norm), &p) != 0); + quat_lideal_norm(&lideal); + res = res || (ibz_cmp(&(lideal.norm), &p) != 0); + res = res || !ibz_mat_4x4_equal(&(O0.order.basis), &(lideal.parent_order->basis)); + res = res || (0 != ibz_cmp(&(O0.order.denom), &(lideal.parent_order->denom))); + quat_lattice_mul(&test, &(lideal.lattice), &(lideal.lattice), &alg); + res = res || !quat_lattice_inclusion(&test, &(lideal.lattice)); + + ibz_set(&p, 3093 * 59471); + ibz_set(&coprime, 1533069337); + res = res || !quat_sampling_random_ideal_O0_given_norm(&lideal, &p, 0, ¶ms, &coprime); + res = res || (ibz_cmp(&(lideal.norm), &p) != 0); + quat_lideal_norm(&lideal); + res = res || (ibz_cmp(&(lideal.norm), &p) != 0); + res = res || !ibz_mat_4x4_equal(&(O0.order.basis), &(lideal.parent_order->basis)); + res = res || (0 != ibz_cmp(&(O0.order.denom), &(lideal.parent_order->denom))); + quat_lattice_mul(&test, &(lideal.lattice), &(lideal.lattice), &alg); + res = res || !quat_lattice_inclusion(&test, &(lideal.lattice)); + + if (res) { + printf("Quaternion unit test sampling_random_ideal_O0_given_norm failed\n"); + } + quat_left_ideal_finalize(&lideal); + quat_alg_elem_finalize(&(O0.z)); + quat_alg_elem_finalize(&(O0.t)); + quat_lattice_finalize(&(O0.order)); + ibz_finalize(&norm); + ibz_finalize(&p); + ibz_finalize(&coprime); + quat_lattice_finalize(&test); + quat_alg_finalize(&alg); + return (res); +} + +// void quat_change_to_O0_basis(ibz_vec_4_t *vec, const quat_alg_elem_t *el); +int +quat_test_change_to_O0_basis() +{ + int res = 0; + quat_alg_elem_t cmp, elem; + ibz_vec_4_t out; + quat_lattice_t O0; + quat_alg_elem_init(&elem); + quat_alg_elem_init(&cmp); + ibz_vec_4_init(&out); + quat_lattice_init(&O0); + quat_lattice_O0_set(&O0); + + quat_alg_elem_set(&cmp, 2, 2, 7, 1, -4); + quat_alg_elem_copy(&elem, &cmp); + quat_change_to_O0_basis(&out, &elem); + res = res || !quat_alg_elem_equal(&elem, &cmp); + quat_alg_elem_set(&elem, 1, 0, 0, 0, 0); + ibz_mat_4x4_eval(&(elem.coord), &(O0.basis), &out); + ibz_copy(&(elem.denom), &(O0.denom)); + res = res || !quat_alg_elem_equal(&elem, &cmp); + + quat_alg_elem_set(&cmp, 2, 1, 0, 6, -3); + quat_alg_elem_copy(&elem, &cmp); + quat_change_to_O0_basis(&out, &elem); + res = res || !quat_alg_elem_equal(&elem, &cmp); + quat_alg_elem_set(&elem, 1, 0, 0, 0, 0); + ibz_mat_4x4_eval(&(elem.coord), &(O0.basis), &out); + ibz_copy(&(elem.denom), &(O0.denom)); + res = res || !quat_alg_elem_equal(&elem, &cmp); + + quat_alg_elem_set(&cmp, 1, -8, 2, 1, 3); + quat_alg_elem_copy(&elem, &cmp); + quat_change_to_O0_basis(&out, &elem); + res = res || !quat_alg_elem_equal(&elem, &cmp); + quat_alg_elem_set(&elem, 1, 0, 0, 0, 0); + ibz_mat_4x4_eval(&(elem.coord), &(O0.basis), &out); + ibz_copy(&(elem.denom), &(O0.denom)); + res = res || !quat_alg_elem_equal(&elem, &cmp); + + if (res) { + printf("Quaternion unit test change_to_O0_basis failed"); + } + quat_alg_elem_finalize(&elem); + quat_alg_elem_finalize(&cmp); + ibz_vec_4_finalize(&out); + quat_lattice_finalize(&O0); + return (res); +} + +int +quat_test_represent_integer_internal(int gamma_iter, + int prim_iter, + int nbits, + int randomized, + int standard, + int non_diag) +{ + int tested = 0; + int rand_ret = 1; + int res = 0; + ibz_t p, norm_n, M, norm_d; + ibz_vec_4_t coord; + quat_alg_t Bpoo; + quat_alg_elem_t gamma; + // must initialize special extremal order, product and primes + quat_represent_integer_params_t params; + quat_p_extremal_maximal_order_t order; + quat_lattice_init(&order.order); + quat_alg_elem_init(&order.z); + quat_alg_elem_init(&order.t); + quat_alg_elem_init(&gamma); + ibz_vec_4_init(&coord); + ibz_init(&M); + ibz_init(&p); + ibz_init(&norm_d); + ibz_init(&norm_n); + quat_alg_init_set_ui(&Bpoo, 101); + + // setup + params.primality_test_iterations = gamma_iter; + + while (!tested) { + if (standard) { + ibz_set(&p, 0); + rand_ret = !ibz_generate_random_prime(&p, 1, 2 * nbits, 32); + rand_ret = rand_ret || !ibz_rand_interval_bits(&M, 2 * nbits + 24 + 100 * non_diag); + ibz_copy(&(Bpoo.p), &p); + quat_test_set_params_standard(¶ms, &order, &Bpoo); + } else { + ibz_set_from_str(&p, "23920667128620486487914848107166358953830561597426178123910317653495243603967", 10); + int real_nbits = ibz_bitsize(&p); + rand_ret = !ibz_rand_interval_bits(&M, real_nbits + 24 + 100 * non_diag); + ibz_copy(&(Bpoo.p), &p); + quat_test_set_params_non_standard(¶ms, &order, &Bpoo); + } + // make test more realistic by keeping some properties always given in SQIsign + tested = (ibz_get(&p) % 8 == 7); + tested = tested && (ibz_get(&M) % 2 == 1); + tested = tested && quat_test_input_for_repres_bound(&(Bpoo.p), &M, params.order->q); + if (rand_ret) + break; + } + + if (!rand_ret) { + res = !quat_represent_integer(&gamma, &M, non_diag, ¶ms); + if (!res) { + quat_alg_norm(&norm_n, &norm_d, &gamma, &Bpoo); + res = res || !ibz_is_one(&norm_d); + res = res || !(ibz_cmp(&norm_n, &M) == 0); + res = res || !quat_lattice_contains(NULL, &(params.order->order), &gamma); + if (non_diag) { + if (standard) { + ibz_mul(&norm_n, &ibz_const_two, &ibz_const_two); + // add not sub since basis in quat_order_elem_create is 1,i,j,-ij for O0 + ibz_add(&norm_d, &(gamma.coord[0]), &(gamma.coord[3])); + ibz_mod(&norm_d, &norm_d, &norm_n); + res = res || (0 != ibz_cmp(&ibz_const_two, &norm_d)); + ibz_sub(&norm_d, &(gamma.coord[1]), &(gamma.coord[2])); + ibz_mod(&norm_d, &norm_d, &norm_n); + res = res || (0 != ibz_cmp(&ibz_const_two, &norm_d)); + } else { + quat_lattice_contains(&coord, &(params.order->order), &gamma); + ibz_gcd(&norm_d, &(coord[1]), &(coord[2])); + ibz_gcd(&norm_d, &norm_d, &(coord[3])); + res = res || ibz_is_even(&norm_d); + } + } + } + } else { + printf("Randomness failure in quat_represent_integer test\n"); + } + + quat_alg_finalize(&Bpoo); + ibz_finalize(&p); + ibz_finalize(&M); + ibz_finalize(&norm_n); + ibz_finalize(&norm_d); + ibz_vec_4_finalize(&coord); + quat_lattice_finalize(&order.order); + quat_alg_elem_finalize(&order.z); + quat_alg_elem_finalize(&order.t); + quat_alg_elem_finalize(&gamma); + return res | (rand_ret); +} + +// int quat_represent_integer(quat_alg_elem_t *gamma, const ibz_t *n_gamma, const +// quat_represent_integer_params_t *params); +int +quat_test_represent_integer(void) +{ + int res = 0; + int prim_iter = 32; + int gamma_iter = 16384; + + res = res | quat_test_represent_integer_internal(prim_iter, gamma_iter, 64, 1, 1, 0); + res = res | quat_test_represent_integer_internal(prim_iter, gamma_iter, 64, 1, 1, 1); + + gamma_iter = 32768; + res = res | quat_test_represent_integer_internal(prim_iter, gamma_iter, 128, 1, 1, 0); + res = res | quat_test_represent_integer_internal(prim_iter, gamma_iter, 128, 1, 1, 1); + + gamma_iter = 100000; + res = res | quat_test_represent_integer_internal(prim_iter, gamma_iter, 128, 1, 0, 0); + res = res | quat_test_represent_integer_internal(prim_iter, gamma_iter, 128, 1, 0, 1); + + if (res) { + printf("Quaternion unit test represent_integer failed\n"); + } + return (res); +} + +int +quat_test_normeq(void) +{ + + int res = 0; + printf("\nRunning quaternion tests of functions for special extremal orders\n"); + + res = res | quat_test_change_to_O0_basis(); + res = res | quat_test_order_elem_create(); + res = res | quat_test_sampling_random_ideal_O0_given_norm(); + res = res | quat_test_represent_integer(); + + return res; +} diff --git a/src/quaternion/ref/generic/test/quaternion_tests.h b/src/quaternion/ref/generic/test/quaternion_tests.h deleted file mode 100644 index 130b471..0000000 --- a/src/quaternion/ref/generic/test/quaternion_tests.h +++ /dev/null @@ -1,188 +0,0 @@ -/** @file - * - * @authors Sina Schaeffler - * - * @brief Declarations of tests of quaternion algebra operations - */ - -#ifndef QUATERNION_TESTS_H -#define QUATERNION_TESTS_H - -#include -#include -#include "../internal.h" - -/** @internal - * @ingroup quat_quat - * @defgroup quat_tests Quaternion module test functions - * @{ - */ - -/** @brief Test initializers and finalizers for quaternion algebra types - * - * Test initializers and finalizers for the following types: - * - * quat_alg_t - * - * quat_alg_elem_t - * - * quat_alg_coord_t - * - * ibz_vec_4_t - * - * ibz_vec_5_t - * - * ibz_mat_2x2_t - * - * ibz_mat_4x4_t - * - * ibz_mat_4x5_t - * - * ibz_mat_4x8_t - * - * quat_lattice_t - * - * quat_order_t - * - * quat_left_ideal_t - */ -int quat_test_finit(); - -/** @brief Test integer, quadratic form and matrix functions for dimension 4 from the quaternion module - * - * Runs unit tests for the following functions - * - * int ibz_4x5_right_ker_mod_prime(ibz_vec_5_t *ker, const ibz_mat_4x5_t *mat, const ibz_t *p); - * - * int ibz_4x4_right_ker_mod_prime(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, const ibz_t *p); - * - * int ibz_4x4_right_ker_mod_power_of_2(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, unsigned short exp); - * - * void ibz_mat_4x4_eval(quat_alg_coord_t *res, const ibz_mat_4x4_t *mat, const quat_alg_coord_t *vec); - * - * void quat_qf_eval(ibz_t *res, const ibz_mat_4x4_t *qf, const quat_alg_coord_t *coord); - * - * void ibz_content(ibz_t *content, const quat_alg_coord_t *v); - */ -int quat_test_dim4(); - -/** @brief Test integer, lattice and matrix functions for dimension 2 from the quaternion module - * - * Runs unit tests for the following functions - * - * void ibz_mat_2x2_eval(ibz_vec_2_t *res, const ibz_mat_2x2_t *mat, const ibz_vec_2_t *vec); - * - * void ibz_2x2_mul_mod(ibz_mat_2x2_t *prod, const ibz_mat_2x2_t *mat_a, const ibz_mat_2x2_t *mat_b, const ibz_t *m); - * - * int ibz_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); - * - * int quat_2x2_lattice_enumerate_cvp_filter(quat_alg_elem_t *res, const ibz_mat_2x2_t *lat_basis, const ibz_vec_2_t *target,unsigned int qf, unsigned int dist_bound, int (*condition)(quat_alg_elem_t* , const ibz_vec_2_t*, const void*), const void* params, unsigned int max_tries); - */ -int quat_test_dim2(); - -/** @brief Test integer functions - * - * Runs unit tests for the following functions - * - * int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p); - * - * int ibz_cornacchia_special_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p, const int exp_adjust); - * - * int ibz_cornacchia_extended(ibz_t *x, ibz_t *y, const ibz_t *n, const short *prime_list, const int prime_list_length, short primality_test_iterations, const ibz_t *bad_primes_prod); - */ -int quat_test_integers(); - -/** @brief Test operations on quaternion algebra elements - * - * Runs unit tests for the following functions - * - * void quat_alg_add(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); - * - * void quat_alg_sub(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b); - * - * void quat_alg_mul(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_elem_t *b, const quat_alg_t *alg); - * - * void quat_alg_norm(quat_alg_elem_t *res, const quat_alg_elem_t *a, const quat_alg_t *alg); - * - * void quat_alg_trace(quat_alg_elem_t *res, const quat_alg_elem_t *a); - * - * void quat_alg_scalar(quat_alg_elem_t *elem, const ibz_t *numerator, const ibz_t *denominator); - * - * void quat_alg_conj(quat_alg_elem_t *conj, const quat_alg_elem_t *x); - * - * void quat_alg_make_primitive(quat_alg_coord_t *primitive_x, ibz_t *content, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg){ - * - * int quat_alg_is_primitive(const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg): - * - * void quat_alg_normalize(quat_alg_elem_t *x); - * - * int quat_alg_elem_is_zero(const quat_alg_elem_t *x); - * - * int quat_alg_coord_is_zero(const quat_alg_coord_t *x); - */ -int quat_test_algebra(); - -/** @brief Test operations on lattices - * - * Runs unit tests for the following functions - * - * void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); - * - * void quat_lattice_intersect(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2); - * - * void quat_lattice_mul(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t *lat2, const quat_alg_t *alg); - * - * int quat_lattice_contains(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x, const quat_alg_t *alg); - * - * void quat_lattice_hnf(quat_lattice_t *lat); - */ -int quat_test_lattice(); - -/** @brief Test operations on left ideals and their creation - * - * Runs unit tests for the following functions - * - * void quat_lideal_create_principal(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const quat_order_t *order, const quat_alg_t *alg); - * - * void quat_lideal_create_from_primitive(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg); - * - * void quat_lideal_make_primitive_then_create(quat_left_ideal_t *lideal, const quat_alg_elem_t *x, const ibz_t *N, const quat_order_t *order, const quat_alg_t *alg); - * - * void quat_lideal_random_2e(quat_left_ideal_t *lideal, const quat_order_t *order, const quat_alg_t *alg, int64_t e); - * - * int quat_lideal_generator(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const quat_alg_t *alg, int bound); - * - * int quat_lideal_generator_coprime(quat_alg_elem_t *gen, const quat_left_ideal_t *lideal, const ibz_t *n, const quat_alg_t *alg, int bound); - * - * int quat_lideal_mul(quat_left_ideal_t *product, const quat_left_ideal_t *lideal, const quat_alg_elem_t *alpha, const quat_alg_t *alg, int bound); - * - * void quat_lideal_add(quat_left_ideal_t *sum, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); - * - * void quat_lideal_inter(quat_left_ideal_t *intersection, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); - * - * int quat_lideal_equals(const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); - * - * int quat_lideal_isom(quat_alg_elem_t *iso, const quat_left_ideal_t *I1, const quat_left_ideal_t *I2, const quat_alg_t *alg); - * - * void quat_lideal_right_order(quat_order_t *order, const quat_left_ideal_t *lideal, const quat_alg_t *alg); - * - * void quat_lideal_reduce_basis(ibz_mat_4x4_t *reduced, ibz_mat_4x4_t *gram, const quat_left_ideal_t *lideal, const quat_alg_t *alg); //replaces lideal_lll - * - * void quat_connecting_ideal(quat_left_ideal_t *connecting_ideal, const quat_order_t *O1, const quat_order_t *O2, const quat_alg_t *alg); -*/ -int quat_test_lideal(); - -/** @brief test matkermod and Howell form - */ -int quat_test_matkermod(); - -/** @brief Test with randomization for complex functions where this is possible - * - */ -int quat_test_with_randomization(); - - -/** @} - */ - -#endif diff --git a/src/quaternion/ref/generic/test/random_input_generation.c b/src/quaternion/ref/generic/test/random_input_generation.c new file mode 100644 index 0000000..1cbe716 --- /dev/null +++ b/src/quaternion/ref/generic/test/random_input_generation.c @@ -0,0 +1,109 @@ +#include "quaternion_tests.h" +#include + +int +quat_test_input_random_ideal_generation(quat_left_ideal_t *ideals, + int norm_bitsize, + int iterations, + const quat_represent_integer_params_t *params) +{ + int randret = 0; + ibz_t norm, cofactor; + ibz_init(&norm); + ibz_init(&cofactor); + int size_p = ibz_bitsize(&(params->algebra->p)); + randret = !ibz_generate_random_prime(&cofactor, + 0, + ((norm_bitsize + 5) > size_p) * (norm_bitsize + 5) + + ((norm_bitsize + 5) <= size_p) * size_p, + params->primality_test_iterations); + if ((randret != 0) || ibz_is_zero(&cofactor)) { + printf("Random generation failed in quat_test_input_random_ideal_generation\n"); + goto fin; + } + + for (int iter = 0; iter < iterations; iter++) { + // generate random odd norm + randret = !ibz_rand_interval_bits(&norm, norm_bitsize - 1); + ibz_add(&norm, &norm, &norm); + ibz_add(&norm, &norm, &ibz_const_one); + if ((randret != 0) || ibz_is_zero(&norm)) { + printf("Random generation failed in quat_test_input_random_ideal_generation\n"); + goto fin; + } + ibz_abs(&norm, &norm); + // compute ideal + randret = !quat_sampling_random_ideal_O0_given_norm(&(ideals[iter]), &norm, 0, params, &cofactor); + if (randret != 0) { + printf("Random generation failed in quat_test_input_random_ideal_generation\n"); + goto fin; + } + } +fin:; + ibz_finalize(&norm); + ibz_finalize(&cofactor); + return (randret); +} + +// norms is either of length iterations or NULL +int +quat_test_input_random_ideal_lattice_generation(quat_lattice_t *lattices, + ibz_t *norms, + int norm_bitsize, + int iterations, + const quat_represent_integer_params_t *params) +{ + quat_left_ideal_t *ideals; + ideals = malloc(iterations * sizeof(quat_left_ideal_t)); + for (int i = 0; i < iterations; i++) + quat_left_ideal_init(&(ideals[i])); + int randret = quat_test_input_random_ideal_generation(ideals, norm_bitsize, iterations, params); + + for (int iter = 0; iter < iterations; iter++) { + ibz_mat_4x4_copy(&(lattices[iter].basis), &(ideals[iter].lattice.basis)); + ibz_copy(&(lattices[iter].denom), &(ideals[iter].lattice.denom)); + if (norms != NULL) { + ibz_copy(&(norms[iter]), &(ideals[iter].norm)); + } + } + for (int i = 0; i < iterations; i++) + quat_left_ideal_finalize(&(ideals[i])); + free(ideals); + return randret; +} + +int +quat_test_input_random_lattice_generation(quat_lattice_t *lattices, int bitsize, int iterations, int in_hnf) +{ + ibz_t det; + ibz_init(&det); + int randret = 0; + for (int iter = 0; iter < iterations; iter++) { + // generate random invertible matrix + ibz_set(&det, 0); + while (ibz_is_zero(&det)) { + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + randret = !ibz_rand_interval_bits(&((lattices[iter]).basis[i][j]), bitsize); + if (randret != 0) { + printf("Random generation failed in " + "quat_test_input_random_lattice_generation\n"); + goto fin; + } + } + } + randret = !ibz_rand_interval_bits(&((lattices[iter]).denom), bitsize); + if (randret != 0) { + printf("Random generation failed in quat_test_input_random_lattice_generation\n"); + goto fin; + } + ibz_mat_4x4_inv_with_det_as_denom(NULL, &det, &((lattices[iter]).basis)); + ibz_mul(&det, &det, &(lattices[iter].denom)); + if (in_hnf && !ibz_is_zero(&det)) + quat_lattice_hnf(&(lattices[iter])); + } + } +fin:; + ibz_finalize(&det); + return (randret); +} diff --git a/src/quaternion/ref/generic/test/randomized.c b/src/quaternion/ref/generic/test/randomized.c index 2168da8..b088b1c 100644 --- a/src/quaternion/ref/generic/test/randomized.c +++ b/src/quaternion/ref/generic/test/randomized.c @@ -1,14 +1,14 @@ #include "quaternion_tests.h" #include -// int ibz_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); -int quat_test_randomized_ibz_mat_2x2_inv_mod() +// int ibz_mat_2x2_inv_mod(ibz_mat_2x2_t *inv, const ibz_mat_2x2_t *mat, const ibz_t *m); +int +quat_test_randomized_ibz_mat_2x2_inv_mod(int bitsize_matrix, int bitsize_modulus, int iterations) { + int randret = 0; int res = 0; ibz_t m, det, gcd; ibz_mat_2x2_t a, inv, id, prod; - int64_t rand[4]; - int64_t rand_m; ibz_init(&m); ibz_init(&det); ibz_init(&gcd); @@ -18,47 +18,46 @@ int quat_test_randomized_ibz_mat_2x2_inv_mod() ibz_mat_2x2_init(&id); ibz_mat_2x2_set(&id, 1, 0, 0, 1); - - for (int iter = 0; iter < 100; iter++){ + for (int iter = 0; iter < iterations; iter++) { // generate random matrix and modulo, with modulo larger than 2 - int randret = randombytes((unsigned char*)rand, 4*sizeof(uint64_t)); - if (randret != 0) - return 1; - ibz_mat_2x2_set(&a, rand[0],rand[1],rand[2],rand[3]); - rand_m = 0; - while(rand_m < 2) { - int randret = randombytes((unsigned char*)&rand_m, sizeof(uint64_t)); - if (randret != 0) - return 1; + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + randret = randret | !ibz_rand_interval_bits(&(a[i][j]), bitsize_matrix); + } } - ibz_set(&m,rand_m); + randret = randret | !ibz_rand_interval_bits(&m, bitsize_modulus); + ibz_abs(&m, &m); + ibz_add(&m, &m, &ibz_const_two); + if (randret != 0) + goto fin; // compute det - ibz_mat_2x2_det_from_ibz(&det,&(a[0][0]),&(a[0][1]),&(a[1][0]),&(a[1][1])); + ibz_mat_2x2_det_from_ibz(&det, &(a[0][0]), &(a[0][1]), &(a[1][0]), &(a[1][1])); // is it prime to mod - ibz_gcd(&gcd,&det,&m); - if(ibz_is_one(&gcd)){ + ibz_gcd(&gcd, &det, &m); + if (ibz_is_one(&gcd)) { // matrix should be invertible mod m - if (ibz_2x2_inv_mod(&inv, &a, &m)) - { + if (ibz_mat_2x2_inv_mod(&inv, &a, &m)) { // ibz_2x2_mul_mod(&prod,&a,&inv, &m); ibz_2x2_mul_mod(&prod, &inv, &a, &m); res = res || ibz_cmp(&(prod[0][0]), &(id[0][0])); res = res || ibz_cmp(&(prod[0][1]), &(id[0][1])); res = res || ibz_cmp(&(prod[1][0]), &(id[1][0])); res = res || ibz_cmp(&(prod[1][1]), &(id[1][1])); - } - else - { + } else { res = 1; } } else { - res = res || ibz_2x2_inv_mod(&inv, &a, &m); + res = res || ibz_mat_2x2_inv_mod(&inv, &a, &m); } } - if (res != 0) - { +fin:; + if (randret != 0) { + printf("Randomness failed in quaternion unit test with randomization for " + "ibz_mat_2x2_inv_mod\n"); + } + if (res != 0) { printf("Quaternion unit test with randomization for ibz_mat_2x2_inv_mod failed\n"); } ibz_mat_2x2_finalize(&a); @@ -71,94 +70,12 @@ int quat_test_randomized_ibz_mat_2x2_inv_mod() return (res); } -// int quat_2x2_lattice_enumerate_cvp_filter(quat_alg_elem_t *res, const ibz_mat_2x2_t *lat_basis, const ibz_vec_2_t *target,unsigned int qf, unsigned int dist_bound, int (*condition)(quat_alg_elem_t* , const ibz_vec_2_t*, const void*), const void* params, unsigned int max_tries); -int quat_test_randomized_2x2_lattice_enumerate_cvp_filter() +// int ibz_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t mat); +int +quat_test_randomized_ibz_mat_4x4_inv_with_det_as_denom(int matrix_bitsize, int iterations) { - // test only wether a result is returned which verifies the conditions, if true is returned - // cannot test wether false is retured correctly or not - int res = 0; - ibz_t p, bound, norm_q, norm; - quat_alg_elem_t cvp_res; - ibz_mat_2x2_t basis; - ibz_vec_2_t target, diff, found; - ibz_mat_2x2_init(&basis); - quat_alg_elem_init(&cvp_res); - ibz_vec_2_init(&target); - ibz_vec_2_init(&diff); - ibz_vec_2_init(&found); - ibz_init(&p); - ibz_init(&norm_q); - ibz_init(&norm); - ibz_init(&bound); - unsigned int q; - unsigned int dist_bound; - void *params = (void *)&p; - unsigned int max_tries; - int64_t rand[9]; - - // fix p since only used inside condition which is internal, unused by any external function - ibz_set(&p, 3); - - - for (int iter = 0; iter < 20; iter++){ - // generate random matrix with non-0 det - ibz_set(&bound,0); - while(ibz_is_zero(&bound)){ - int randret = randombytes((unsigned char*)rand, 9*sizeof(uint64_t)); - if (randret != 0) - return 1; - ibz_mat_2x2_set(&basis, rand[0],rand[1],rand[2],rand[3]); - // check det is not 0 - ibz_mat_2x2_det_from_ibz(&bound,&(basis[0][0]),&(basis[0][1]),&(basis[1][0]),&(basis[1][1])); - } - // set target - ibz_vec_2_set(&target, rand[4], rand[5]); - //set other params randomly in reasonable ranges - q = ((unsigned int)rand[6]) % 1024; - if(q == 0){ - q = 1; - } - dist_bound = ((unsigned int)rand[7]) % 128; - max_tries = ((unsigned int)rand[8]) % 16384; - if (quat_2x2_lattice_enumerate_cvp_filter(&cvp_res, &basis, &target, q, dist_bound, &quat_dim2_lattice_test_cvp_condition, params, max_tries)){ - // used cvp_res and condition to exfiltrate standard coords of distance to target from close vector found - ibz_copy(&(diff[0]), &(cvp_res.coord[0])); - ibz_copy(&(diff[1]), &(cvp_res.coord[1])); - // compute close vector in lattice from target and diff - ibz_sub(&(found[0]), &(target[0]), &(diff[0])); - ibz_sub(&(found[1]), &(target[1]), &(diff[1])); - // norm bound on diff ok? - ibz_set(&norm_q, q); - ibz_set(&bound, 2); - ibz_pow(&bound, &bound, dist_bound); - quat_dim2_lattice_norm(&norm, &(diff[0]), &(diff[1]), &norm_q); - res = res || !(ibz_cmp(&norm, &bound) < 0); - // Condition ok - res = res || (!quat_dim2_lattice_test_cvp_condition(&cvp_res, &diff, params)); - // Is in lattice - res = res || (!quat_dim2_lattice_contains(&basis, &(found[0]), &(found[1]))); - } - } - - if (res != 0) - { - printf("Quaternion unit test with randomization for 2x2_lattice_enumerate_cvp_filter failed\n"); - } - ibz_mat_2x2_finalize(&basis); - quat_alg_elem_finalize(&cvp_res); - ibz_vec_2_finalize(&target); - ibz_vec_2_finalize(&diff); - ibz_vec_2_finalize(&found); - ibz_finalize(&p); - ibz_finalize(&norm_q); - ibz_finalize(&norm); - ibz_finalize(&bound); - return res; -} - -//int ibz_4x4_inv_with_det_as_denom(ibz_mat_4x4_t *inv, ibz_t *det, const ibz_mat_4x4_t mat); -int quat_test_randomized_ibz_mat_4x4_inv_with_det_as_denom(){ int res = 0; + int randret = 0; ibz_t det; ibz_mat_4x4_t mat, inv; ibz_mat_4x4_t det_id, prod; @@ -168,22 +85,31 @@ int quat_test_randomized_ibz_mat_4x4_inv_with_det_as_denom(){ ibz_mat_4x4_init(&mat); ibz_mat_4x4_init(&inv); - for (int r = 0; r < 10; r++) { + for (int r = 0; r < iterations; r++) { do { for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) - ibz_rand_interval_i(&mat[i][j], -(1 << 20), 1 << 20); + for (int j = 0; j < 4; j++) { + randret = randret | !ibz_rand_interval_bits(&mat[i][j], matrix_bitsize); + if (randret != 0) + goto fin; + } } while (!ibz_mat_4x4_inv_with_det_as_denom(&inv, &det, &mat)); ibz_mat_4x4_identity(&det_id); - ibz_mat_4x4_scalar_mul(&det_id,&det,&det_id); + ibz_mat_4x4_scalar_mul(&det_id, &det, &det_id); ibz_mat_4x4_mul(&prod, &inv, &mat); - res = res || !ibz_mat_4x4_equal(&det_id,&prod); + res = res || !ibz_mat_4x4_equal(&det_id, &prod); ibz_mat_4x4_mul(&prod, &mat, &inv); - res = res || !ibz_mat_4x4_equal(&det_id,&prod); + res = res || !ibz_mat_4x4_equal(&det_id, &prod); } - - if (res != 0){ - printf("Quaternion unit test with randomization for ibz_mat_4x4_inv_with_det_as_denom failed\n"); + +fin:; + if (randret != 0) { + printf("Randomness failed in quaternion unit test with randomization for " + "ibz_mat_2x2_inv_mod\n"); + } + if (res != 0) { + printf("Quaternion unit test with randomization for ibz_mat_4x4_inv_with_det_as_denom " + "failed\n"); } ibz_mat_4x4_finalize(&det_id); ibz_mat_4x4_finalize(&prod); @@ -193,545 +119,155 @@ int quat_test_randomized_ibz_mat_4x4_inv_with_det_as_denom(){ return res; } -//void ibz_mat_4x8_hnf_core(ibz_mat_4x4_t *hnf, const ibz_mat_4x8_t *generators); -int quat_test_randomized_ibz_mat_4x8_hnf_core(){ - // only partial test, since lattice equality cannot be tested without hnf, so only one inclusion is checked - int res = 0; - quat_alg_elem_t vec; - quat_lattice_t lat; - ibz_mat_4x8_t mat; - ibz_mat_4x4_t hnf,cmp; - quat_lattice_init(&lat); - quat_alg_elem_init(&vec); - ibz_mat_4x8_init(&mat); - ibz_mat_4x4_init(&hnf); - ibz_mat_4x4_init(&cmp); - int64_t rand[8][4]; - int det_non_0; - - for (int iter = 0; iter < 100; iter++){ - int randret = randombytes((unsigned char*)rand, 8*4*sizeof(uint64_t)); - if (randret != 0) - return 1; - - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 8; j++){ - ibz_set(&(mat[i][j]),rand[j][i]); - } - } - ibz_mat_4x8_hnf_core(&hnf,&mat); - res = res || (!ibz_mat_4x4_is_hnf(&hnf)); - // also should test that they generate the same lattice. However, can only check one inclusion efficiently (and this only if full rank), so do so - det_non_0 = 1; - for(int i = 0; i <4; i ++){ - det_non_0 = det_non_0 && ibz_is_zero(&(hnf[i][i])); - } - if(det_non_0){ - ibz_mat_4x4_copy(&(lat.basis),&hnf); - ibz_set(&(lat.denom),1); - for(int i = 0; i <8; i ++){ - quat_alg_elem_copy_ibz(&vec,&(lat.denom), &(mat[i][0]), &(mat[i][1]), &(mat[i][2]), &(mat[i][3])); - res = res || !quat_lattice_contains_without_alg(NULL,&lat,&vec); - } - } - } - - if (res != 0){ - printf("Quaternion unit test with randomization for ibz_mat_4x8_hnf_core failed\n"); - } - quat_lattice_finalize(&lat); - quat_alg_elem_finalize(&vec); - ibz_mat_4x8_finalize(&mat); - ibz_mat_4x4_finalize(&hnf); - ibz_mat_4x4_finalize(&cmp); - return(res); -} - -//int ibz_4x5_right_ker_mod_prime(ibz_vec_5_t *ker, const ibz_mat_4x5_t *mat, const ibz_t *p); -int quat_test_randomized_ibz_4x5_right_ker_mod_prime(){ - // check that if the function returns 1, the vector is in the kernel - int res = 0; - ibz_t prime; - ibz_mat_4x5_t mat; - ibz_vec_5_t ker; - ibz_t prod, sum; - ibz_init(&prod); - ibz_init(&sum); - ibz_mat_4x5_init(&mat); - ibz_vec_5_init(&ker); - ibz_init(&prime); - int64_t rand[5][4]; - int64_t rand_p; - - - for (int iter = 0; iter < 100; iter++){ - // generate random matrix and modulo, with modulo larger than 2 - int randret = randombytes((unsigned char*)rand, 4*5*sizeof(uint64_t)); - if (randret != 0) - return 1; - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 5; j++){ - ibz_set(&(mat[i][j]),rand[j][i]); - } - } - rand_p = 0; - while(rand_p ==0) { - int randret = randombytes((unsigned char*)&rand_p, sizeof(uint64_t)); - if (randret != 0) - return 1; - ibz_set(&prime,rand_p); - if(!ibz_probab_prime(&prime,20)) - rand_p = 0; - } - if (ibz_4x5_right_ker_mod_prime(&ker,&mat,&prime)){ - for(int i = 0; i < 4; i++){ - ibz_set(&sum,0); - for(int j = 0; j < 5; j++){ - ibz_mul(&prod,&(mat[i][j]),&(ker[j])); - ibz_add(&sum,&sum,&prod); - ibz_mod(&sum,&sum,&prime); - } - res = res || !ibz_is_zero(&sum); - } - } - } - - if (res != 0){ - printf("Quaternion unit test with randomization for ibz_4x5_right_ker_mod_prime failed\n"); - } - ibz_finalize(&sum); - ibz_finalize(&prod); - ibz_vec_5_finalize(&ker); - ibz_mat_4x5_finalize(&mat); - ibz_finalize(&prime); - return(res); -} - - -//int ibz_4x4_right_ker_mod_prime(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, const ibz_t *p); -int quat_test_randomized_ibz_4x4_right_ker_mod_prime(){ - int res = 0; - ibz_t prime; - ibz_mat_4x4_t mat, rank3, rank2; - ibz_vec_4_t ker; - ibz_t prod, sum,det; - ibz_init(&prod); - ibz_init(&sum); - ibz_init(&det); - ibz_mat_4x4_init(&mat); - ibz_mat_4x4_init(&rank3); - ibz_mat_4x4_init(&rank2); - ibz_vec_4_init(&ker); - ibz_init(&prime); - int64_t rand[4][4]; - int64_t rand_p; - ibz_mat_4x4_identity(&rank3); - ibz_set(&(rank3[3][3]),0); - ibz_mat_4x4_identity(&rank2); - ibz_set(&(rank2[3][3]),0); - ibz_set(&(rank2[2][2]),0); - - // test case where always 1 solution - for (int iter = 0; iter < 100; iter++){ - rand_p = 0; - while(rand_p ==0) { - int randret = randombytes((unsigned char*)&rand_p, sizeof(uint64_t)); - if (randret != 0) - return 1; - ibz_set(&prime,rand_p); - if(!ibz_probab_prime(&prime,20)) - rand_p = 0; - } - // generate random invertible matrix - ibz_set(&det,0); - while(ibz_is_zero(&det)){ - int randret = randombytes((unsigned char*)rand, 4*4*sizeof(uint64_t)); - if (randret != 0) - return 1; - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),rand[j][i]); - } - } - ibz_mat_4x4_inv_with_det_as_denom(NULL,&det,&mat); - ibz_mod(&det,&det,&prime); - } - // rank 4 matrix does not work - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - // multiply with rank3 to get random rank 3 matrix - ibz_mat_4x4_mul(&mat,&mat,&rank3); - - if (ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime)){ - for(int i = 0; i < 4; i++){ - ibz_set(&sum,0); - for(int j = 0; j < 4; j++){ - ibz_mul(&prod,&(mat[i][j]),&(ker[j])); - ibz_add(&sum,&sum,&prod); - ibz_mod(&sum,&sum,&prime); - } - res = res || !ibz_is_zero(&sum); - } - } else { - res = 1; - } - // multiply with rank2 to get matrix of too small rank - ibz_mat_4x4_mul(&mat,&mat,&rank2); - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - ibz_mat_4x4_mul(&mat,&mat,&rank2); - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - ibz_mat_4x4_mul(&mat,&mat,&rank2); - res = res || ibz_4x4_right_ker_mod_prime(&ker,&mat,&prime); - } - - if (res != 0){ - printf("Quaternion unit test with randomization for ibz_4x4_right_ker_mod_prime failed\n"); - } - ibz_finalize(&sum); - ibz_finalize(&prod); - ibz_finalize(&det); - ibz_vec_4_finalize(&ker); - ibz_mat_4x4_finalize(&mat); - ibz_mat_4x4_finalize(&rank3); - ibz_mat_4x4_finalize(&rank2); - ibz_finalize(&prime); - return(res); -} - -//int ibz_4x4_right_ker_mod_power_of_2(ibz_vec_4_t *ker, const ibz_mat_4x4_t *mat, unsigned short exp); -int quat_test_randomized_ibz_4x4_right_ker_mod_power_of_2(){ - // this only tests that if a vector is returned, it fullfills the conditions - int res = 0; - int zero = 1; - short exp; - int64_t rand[4][4]; - uint64_t rand_exp; - ibz_mat_4x4_t mat, rank3; - ibz_vec_4_t ker; - ibz_vec_4_t prod; - ibz_t q, r, two, det; - ibz_mat_4x4_init(&mat); - ibz_mat_4x4_init(&rank3); - ibz_vec_4_init(&ker); - ibz_vec_4_init(&prod); - ibz_init(&q); - ibz_init(&r); - ibz_init(&det); - ibz_init(&two); - ibz_set(&two,2); - ibz_mat_4x4_identity(&rank3); - ibz_set(&(rank3[3][3]),0); - - for (int iter = 0; iter < 100; iter++){ - rand_exp = 0; - while(rand_exp <=0) { - int randret = randombytes((unsigned char*)&rand_exp, sizeof(uint64_t)); - if (randret != 0) - return 1; - exp = ((short) ((unsigned char) rand_exp)); - } - // generate random invertible matrix - ibz_set(&det,0); - while(ibz_is_zero(&det)){ - int randret = randombytes((unsigned char*)rand, 4*4*sizeof(uint64_t)); - if (randret != 0) - return 1; - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(mat[i][j]),rand[j][i]); - } - } - ibz_mat_4x4_inv_with_det_as_denom(NULL,&det,&mat); - ibz_div(&q,&det,&det,&two); - } - - - // rank 4 matrix does not work - res = res || ibz_4x4_right_ker_mod_power_of_2(&ker,&mat,exp); - // multiply with rank3 to get random rank 3 matrix - ibz_mat_4x4_mul(&mat,&mat,&rank3); - - if (ibz_4x4_right_ker_mod_power_of_2(&ker, &mat, exp)){ - zero = 1; - ibz_mat_4x4_eval(&prod,&mat,&ker); - for (int i = 0; i < 4; i++){ - ibz_div(&q,&r,&(ker[i]),&two); - zero = zero && ibz_is_zero(&r); - ibz_pow(&q,&two,exp); - ibz_mod(&(prod[i]),&(prod[i]),&q); - } - res |= !quat_alg_coord_is_zero(&prod); - res |= zero; - } - } - - - if (res != 0){ - printf("Quaternion unit test with randomization for ibz_4x4_right_ker_mod_power_of_2 failed\n"); - } - ibz_mat_4x4_finalize(&mat); - ibz_mat_4x4_finalize(&rank3); - ibz_vec_4_finalize(&ker); - ibz_vec_4_finalize(&prod); - ibz_finalize(&q); - ibz_finalize(&r); - ibz_finalize(&two); - ibz_finalize(&det); - return(res); -} - - -//int quat_lattice_lll(ibz_mat_4x4_t *red, const quat_lattice_t *lattice, const ibz_t *q, int precision); -int quat_test_randomized_lattice_lll(){ - int res = 0; - quat_lattice_t lat, test; - ibz_mat_4x4_t red; - ibz_t num, denom, q, det; - ibq_t coeff; - int64_t rand[4][4]; - uint32_t rand_q, rand_prec, rand_denom; - ibz_init(&num); - ibz_init(&denom); - ibz_init(&q); - ibz_init(&det); - ibq_init(&coeff); - ibz_mat_4x4_init(&red); - quat_lattice_init(&lat); - quat_lattice_init(&test); - ibz_set(&num,3); - ibz_set(&denom,4); - ibq_set(&coeff,&num,&denom); - - for (int iter = 0; iter < 20; iter++){ - rand_denom = 0; - while(rand_denom ==0) { - int randret = randombytes((unsigned char*)&rand_denom, sizeof(uint32_t)); - if (randret != 0) - return 1; - } - int randret = randombytes((unsigned char*)&rand_q, sizeof(uint32_t)); - if (randret != 0) - return 1; - // generate random invertible matrix - ibz_set(&det,0); - while(ibz_is_zero(&det)){ - int randret = randombytes((unsigned char*)rand, 4*4*sizeof(uint64_t)); - if (randret != 0) - return 1; - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),rand[j][i]); - } - } - ibz_mat_4x4_inv_with_det_as_denom(NULL,&det,&(lat.basis)); - } - - // set lattice - ibz_set(&lat.denom, rand_denom); - quat_lattice_hnf(&lat); - // set other parameter - ibz_set(&q,rand_q % 1024); - //reduce - res = res || quat_lattice_lll(&red,&lat,&q,0); - // test lll reduced - res = res || !quat_dim4_lll_verify(&red,&coeff,&q); - // test lattice equality - ibz_copy(&(test.denom),&(lat.denom)); - ibz_mat_4x4_copy(&(test.basis),&(red)); - quat_lattice_hnf(&test); - res = res || !quat_lattice_equal(&test,&lat); - } - - if (res != 0){ - printf("Quaternion unit test with randomization for lattice_lll failed\n"); - } - ibz_finalize(&num); - ibz_finalize(&denom); - ibz_finalize(&q); - ibz_finalize(&det); - ibq_finalize(&coeff); - ibz_mat_4x4_finalize(&red); - quat_lattice_finalize(&lat); - quat_lattice_finalize(&test); - return(res); -} - -//int quat_lattice_contains_without_alg(quat_alg_coord_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t *x); -int quat_test_randomized_lattice_contains_without_alg(){ +// int quat_lattice_contains(ibz_vec_4_t *coord, const quat_lattice_t *lat, const quat_alg_elem_t +// *x); +int +quat_test_randomized_lattice_contains(int lattice_bitsize, int coord_bitsize, int iterations) +{ // only tests the case where the element is in the lattice int res = 0; + int randret = 0; ibz_t det; quat_alg_elem_t x, cmp; - quat_alg_coord_t coord; + ibz_vec_4_t coord, set_coord; quat_lattice_t lat; - uint64_t rand_denom; - int64_t rand[5][4]; ibz_init(&det); - quat_alg_coord_init(&coord); + ibz_vec_4_init(&coord); + ibz_vec_4_init(&set_coord); quat_alg_elem_init(&cmp); quat_alg_elem_init(&x); quat_lattice_init(&lat); - for (int iter = 0; iter < 10; iter++){ - rand_denom = 0; - while(rand_denom ==0) { - int randret = randombytes((unsigned char*)&rand_denom, sizeof(uint64_t)); - if (randret != 0) - return 1; - } - // generate random invertible matrix - ibz_set(&det,0); - while(ibz_is_zero(&det)){ - int randret = randombytes((unsigned char*)rand, 5*4*sizeof(uint64_t)); - if (randret != 0) - return 1; - for (int i = 0; i < 4; i++){ - for (int j = 0; j < 4; j++){ - ibz_set(&(lat.basis[i][j]),rand[j][i]); - } - ibz_set(&(coord[i]),rand[4][i]); - } - ibz_mat_4x4_inv_with_det_as_denom(NULL,&det,&(lat.basis)); + for (int iter = 0; iter < iterations; iter++) { + randret = quat_test_input_random_lattice_generation(&lat, lattice_bitsize, 1, 1); + for (int i = 0; i < 4; i++) { + randret = randret | !ibz_rand_interval_bits(&(set_coord[i]), coord_bitsize); } + if (randret != 0) + goto fin; - ibz_set(&(lat.denom),rand_denom); - quat_lattice_hnf(&lat); - ibz_mat_4x4_eval(&(x.coord),&(lat.basis),&coord); - ibz_copy(&(x.denom),&(lat.denom)); - ibz_vec_4_set(&coord,1,0,1,0); - if(quat_lattice_contains_without_alg(&coord,&lat,&x)){ - ibz_mat_4x4_eval(&(cmp.coord),&(lat.basis),&coord); - ibz_copy(&(cmp.denom),&(lat.denom)); - quat_alg_sub(&cmp,&x,&cmp); + ibz_mat_4x4_eval(&(x.coord), &(lat.basis), &set_coord); + ibz_copy(&(x.denom), &(lat.denom)); + ibz_vec_4_set(&coord, 1, 0, 1, 0); + if (quat_lattice_contains(&coord, &lat, &x)) { + ibz_mat_4x4_eval(&(cmp.coord), &(lat.basis), &coord); + ibz_copy(&(cmp.denom), &(lat.denom)); + quat_alg_sub(&cmp, &x, &cmp); res = res || !quat_alg_elem_is_zero(&cmp); + ibz_vec_4_sub(&coord, &coord, &set_coord); + res = res || !ibz_vec_4_is_zero(&coord); } else { res = 1; } - } - - if (res != 0){ - printf("Quaternion unit test with randomization for lattice_contains_without_alg failed\n"); +fin:; + if (randret != 0) { + printf("Randomness failed in quaternion unit test with randomization for lattice_contains\n"); + } + if (res != 0) { + printf("Quaternion unit test with randomization for lattice_contains failed\n"); } ibz_finalize(&det); - quat_alg_coord_finalize(&coord); + ibz_vec_4_finalize(&coord); + ibz_vec_4_finalize(&set_coord); quat_alg_elem_finalize(&x); quat_alg_elem_finalize(&cmp); quat_lattice_finalize(&lat); - return(res); + return (res); } - -//int ibz_cornacchia_extended(ibz_t *x, ibz_t *y, const ibz_t *n, const short *prime_list, const int prime_list_length, short primality_test_iterations, const ibz_t *bad_primes_prod); -int quat_test_randomized_ibz_cornacchia_extended(){ +// void quat_lattice_add(quat_lattice_t *res, const quat_lattice_t *lat1, const quat_lattice_t +// *lat2) +int +quat_test_randomized_lattice_add(int lattice_bitsize, int iterations) +{ int res = 0; - ibz_t x,y,n, prod,c_res,bad, p; - int counter = 1; - int counter_p = 3; - int counter_good = 1; - short rand_exps[100]; - int64_t rand_fact; - short primes[100]; - short good_primes[100]; - int primes_length = 100; - short iterations = 20; + int randret = 0; + ibz_t det; + quat_lattice_t lat1, lat2, sum; + ibz_init(&det); + quat_lattice_init(&lat1); + quat_lattice_init(&lat2); + quat_lattice_init(&sum); + + for (int iter = 0; iter < iterations; iter++) { + randret = quat_test_input_random_lattice_generation(&lat1, lattice_bitsize, 1, 1); + randret = randret | quat_test_input_random_lattice_generation(&lat2, lattice_bitsize, 1, 1); + if (!randret) + goto fin; + quat_lattice_add(&sum, &lat1, &lat2); + res = res | !quat_lattice_inclusion(&lat1, &sum); + res = res | !quat_lattice_inclusion(&lat2, &sum); + } + +fin:; + if (randret != 0) { + printf("Randomness failed in quaternion unit test with randomization for lattice_add\n"); + } + if (res != 0) { + printf("Quaternion unit test with randomization for lattice_add failed\n"); + } + ibz_finalize(&det); + quat_lattice_finalize(&lat1); + quat_lattice_finalize(&lat2); + quat_lattice_finalize(&sum); + return (res); +} + +// int ibz_cornacchia_prime(ibz_t *x, ibz_t *y, const ibz_t *n, const ibz_t *p); +int +quat_test_randomized_ibz_cornacchia_prime(int bitsize, int n_bound, int iterations) +{ + int res = 0; + ibz_t x, y, n, prod, c_res, p; + int32_t rand_fact; + int randret = 0; ibz_init(&x); ibz_init(&y); ibz_init(&n); ibz_init(&p); ibz_init(&prod); ibz_init(&c_res); - ibz_init(&bad); - ibz_set(&bad,1); - good_primes[0] = 2; - primes[0] = 2; - while(counter <100){ - ibz_set(&p,counter_p); - if(ibz_probab_prime(&p,20)){ - primes[counter]=(short) counter_p; - if(counter_p%4 == 3){ - ibz_mul(&bad,&bad,&p); - } else { - good_primes[counter_good]=(short) counter_p; - counter_good++; - } - counter++; - } - counter_p++; - } - - for (int iter = 0; iter < 1000; iter++){ - ibz_set(&n,1); - int randret = randombytes((unsigned char*)&rand_exps, 100*sizeof(short)); - for(int i = 0; i < counter_good; i++){ - ibz_set(&p,good_primes[i]); - ibz_pow(&p,&p,((int)((unsigned short)rand_exps[i])%16)); - ibz_mul(&n,&n,&p); - } - // sample large prime as last factor + for (int iter = 0; iter < iterations; iter++) { + // Sample small n for cornacchia rand_fact = 0; - while(rand_fact == 0) { - int randret = randombytes((unsigned char*)&rand_fact, sizeof(uint64_t)); + while (rand_fact < 1) { + randret = randret | randombytes((unsigned char *)&rand_fact, sizeof(int32_t)); if (randret != 0) - return 1; - if(rand_fact < 0) - rand_fact = - rand_fact; - ibz_set(&p,rand_fact); - if(!ibz_probab_prime(&p,20)) - rand_fact = 0; + goto fin; + if (rand_fact < 0) + rand_fact = -rand_fact; + rand_fact = rand_fact % n_bound; + ibz_set(&n, rand_fact); } - ibz_mul(&n,&n,&p); - - ibz_set(&prod,4); - ibz_mod(&prod,&p,&prod); - if((ibz_probab_prime(&p,100) || (ibz_is_one(&p))) && (ibz_is_one(&prod))){ - res = res || (!ibz_cornacchia_extended(&x,&y,&n,primes,100,100,&bad)); - if(res){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); + randret = randret | !ibz_generate_random_prime(&p, 0, bitsize, 32); + if (randret != 0) + goto fin; + // If the legendre symbol is ok, Cornacchia should sometimes be able to solve + ibz_neg(&prod, &n); + ibz_mod(&prod, &prod, &p); + if (ibz_legendre(&prod, &p) > -1) { + // If there is output, check the output is correct + if (ibz_cornacchia_prime(&x, &y, &n, &p)) { + ibz_mul(&c_res, &x, &x); + ibz_mul(&prod, &y, &y); + ibz_mul(&prod, &prod, &n); + ibz_add(&c_res, &c_res, &prod); + res = res || (0 != ibz_cmp(&p, &c_res)); } - //(this test depends on the primality test) - // now it is not a prime factor any more - ibz_set(&p,rand_fact); - ibz_mul(&n,&n,&p); - res = res || ibz_cornacchia_extended(&x,&y,&n,primes,100,1000,&bad); - // multiply with random bad primes - ibz_div(&n,&p,&n,&p); - int randret = randombytes((unsigned char*)&rand_exps, 100*sizeof(short)); - if (randret != 0) - return 1; - for(int i = 0; i < 100; i++){ - ibz_set(&p,primes[i]); - ibz_pow(&p,&p,((int)((unsigned short)rand_exps[i])%8)); - ibz_mul(&n,&n,&p); - } - ibz_gcd(&p,&n,&bad); - if(ibz_is_one(&p)){ - res = res || !ibz_cornacchia_extended(&x,&y,&n,primes,100,100,&bad); - if(res){ - ibz_mul(&c_res,&x,&x); - ibz_mul(&prod,&y,&y); - ibz_add(&c_res,&c_res,&prod); - res = res || ibz_cmp(&n,&c_res); - } - } else { - res = res || ibz_cornacchia_extended(&x,&y,&n,primes,100,100,&bad); - } } else { - res = res || ibz_cornacchia_extended(&x,&y,&n,primes,100,1000,&bad); - for(int i = 0; i < 100; i++){ - ibz_set(&p,primes[i]); - ibz_pow(&p,&p,((int)((unsigned short)rand_exps[i])%8)); - ibz_mul(&n,&n,&p); - } - ibz_gcd(&p,&n,&bad); - res = res || ibz_cornacchia_extended(&x,&y,&n,primes,100,100,&bad); - } + // Otherwise Cornacchia should fail + res = res || (ibz_cornacchia_prime(&x, &y, &n, &p)); + } } +fin:; - if (res != 0){ - printf("Quaternion unit test with randomization for ibz_cornacchia_extended failed\n"); + if (randret != 0) { + printf("Randomness failed in quaternion unit test with randomization for " + "ibz_cornacchia_prime\n"); + } + if (res != 0) { + printf("Quaternion unit test with randomization for ibz_cornacchia_prime failed\n"); } ibz_finalize(&x); ibz_finalize(&y); @@ -739,24 +275,19 @@ int quat_test_randomized_ibz_cornacchia_extended(){ ibz_finalize(&p); ibz_finalize(&prod); ibz_finalize(&c_res); - ibz_finalize(&bad); return res; } - // run all previous tests -int quat_test_with_randomization(){ +int +quat_test_with_randomization(void) +{ int res = 0; printf("\nRunning randomized tests from quaternion module\n"); - res = res | quat_test_randomized_ibz_mat_2x2_inv_mod(); - res = res | quat_test_randomized_2x2_lattice_enumerate_cvp_filter(); - res = res | quat_test_randomized_ibz_mat_4x4_inv_with_det_as_denom(); - res = res | quat_test_randomized_ibz_mat_4x8_hnf_core(); - res = res | quat_test_randomized_ibz_4x5_right_ker_mod_prime(); - res = res | quat_test_randomized_ibz_4x4_right_ker_mod_prime(); - res = res | quat_test_randomized_ibz_4x4_right_ker_mod_power_of_2(); - res = res | quat_test_randomized_lattice_lll(); - res = res | quat_test_randomized_lattice_contains_without_alg(); - res = res | quat_test_randomized_ibz_cornacchia_extended(); - return(res); + res = res | quat_test_randomized_ibz_mat_2x2_inv_mod(370, 270, 100); + res = res | quat_test_randomized_ibz_mat_4x4_inv_with_det_as_denom(1500, 10); + res = res | quat_test_randomized_lattice_contains(250, 250, 10); + res = res | quat_test_randomized_lattice_add(700, 100); + res = res | quat_test_randomized_ibz_cornacchia_prime(128, 6, 10); + return (res); } diff --git a/src/quaternion/ref/generic/test/test_quaternions.c b/src/quaternion/ref/generic/test/test_quaternions.c index 111842c..ffa5ac0 100644 --- a/src/quaternion/ref/generic/test/test_quaternions.c +++ b/src/quaternion/ref/generic/test/test_quaternions.c @@ -1,20 +1,70 @@ +#include +#include +#include +#include + #include "quaternion_tests.h" +#include +#include // run all tests in module -int main(){ +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int help = 0; + int seed_set = 0; int res = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + } + + if (help) { + printf("Usage: %s [--seed=]\n", argv[0]); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + printf("Running quaternion module unit tests\n"); + + res = res | ibz_test_intbig(); + res = res | mini_gmp_test(); res = res | quat_test_finit(); res = res | quat_test_dim4(); res = res | quat_test_dim2(); - res = res | quat_test_matkermod(); res = res | quat_test_integers(); + res = res | quat_test_hnf(); res = res | quat_test_algebra(); res = res | quat_test_lattice(); + res = res | quat_test_lll(); res = res | quat_test_lideal(); + res = res | quat_test_normeq(); + res = res | quat_test_lat_ball(); res = res | quat_test_with_randomization(); - if(res != 0){ + if (res != 0) { printf("\nSome tests failed!\n"); } - return(res); + return (res); } diff --git a/src/protocols/CMakeLists.txt b/src/signature/CMakeLists.txt similarity index 100% rename from src/protocols/CMakeLists.txt rename to src/signature/CMakeLists.txt diff --git a/src/signature/ref/CMakeLists.txt b/src/signature/ref/CMakeLists.txt new file mode 100644 index 0000000..d0ba315 --- /dev/null +++ b/src/signature/ref/CMakeLists.txt @@ -0,0 +1,3 @@ +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) + +include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/signature/ref/include/signature.h b/src/signature/ref/include/signature.h new file mode 100644 index 0000000..ba38c36 --- /dev/null +++ b/src/signature/ref/include/signature.h @@ -0,0 +1,97 @@ +/** @file + * + * @brief The key generation and signature protocols + */ + +#ifndef SIGNATURE_H +#define SIGNATURE_H + +#include +#include +#include +#include + +/** @defgroup signature SQIsignHD key generation and signature protocols + * @{ + */ +/** @defgroup signature_t Types for SQIsignHD key generation and signature protocols + * @{ + */ + +/** @brief Type for the secret keys + * + * @typedef secret_key_t + * + * @struct secret_key + * + */ +typedef struct secret_key +{ + ec_curve_t curve; /// the public curve, but with little precomputations + quat_left_ideal_t secret_ideal; + ibz_mat_2x2_t mat_BAcan_to_BA0_two; // mat_BA0_to_BAcan*BA0 = BAcan, where BAcan is the + // canonical basis of EA[2^e], and BA0 the image of the + // basis of E0[2^e] through the secret isogeny + ec_basis_t canonical_basis; // the canonical basis of the public key curve +} secret_key_t; + +/** @} + */ + +/*************************** Functions *****************************/ + +void secret_key_init(secret_key_t *sk); +void secret_key_finalize(secret_key_t *sk); + +/** + * @brief Key generation + * + * @param pk Output: will contain the public key + * @param sk Output: will contain the secret key + * @returns 1 if success, 0 otherwise + */ +int protocols_keygen(public_key_t *pk, secret_key_t *sk); + +/** + * @brief Signature computation + * + * @param sig Output: will contain the signature + * @param sk secret key + * @param pk public key + * @param m message + * @param l size + * @returns 1 if success, 0 otherwise + */ +int protocols_sign(signature_t *sig, const public_key_t *pk, secret_key_t *sk, const unsigned char *m, size_t l); + +/*************************** Encoding *****************************/ + +/** @defgroup encoding Encoding and decoding functions + * @{ + */ + +/** + * @brief Encodes a secret key as a byte array + * + * @param enc : Byte array to encode the secret key (including public key) in + * @param sk : Secret key to encode + * @param pk : Public key to encode + */ +void secret_key_to_bytes(unsigned char *enc, const secret_key_t *sk, const public_key_t *pk); + +/** + * @brief Decodes a secret key (and public key) from a byte array + * + * @param sk : Structure to decode the secret key in + * @param pk : Structure to decode the public key in + * @param enc : Byte array to decode + */ +void secret_key_from_bytes(secret_key_t *sk, public_key_t *pk, const unsigned char *enc); + +/** @} + */ + +/** @} + */ + +#endif diff --git a/src/signature/ref/lvl1/CMakeLists.txt b/src/signature/ref/lvl1/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/signature/ref/lvl1/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/signature/ref/lvl1/test/CMakeLists.txt b/src/signature/ref/lvl1/test/CMakeLists.txt new file mode 100644 index 0000000..316e0a8 --- /dev/null +++ b/src/signature/ref/lvl1/test/CMakeLists.txt @@ -0,0 +1 @@ +include(../../lvlx_test.cmake) diff --git a/src/signature/ref/lvl3/CMakeLists.txt b/src/signature/ref/lvl3/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/signature/ref/lvl3/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/signature/ref/lvl3/test/CMakeLists.txt b/src/signature/ref/lvl3/test/CMakeLists.txt new file mode 100644 index 0000000..316e0a8 --- /dev/null +++ b/src/signature/ref/lvl3/test/CMakeLists.txt @@ -0,0 +1 @@ +include(../../lvlx_test.cmake) diff --git a/src/signature/ref/lvl5/CMakeLists.txt b/src/signature/ref/lvl5/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/signature/ref/lvl5/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/signature/ref/lvl5/test/CMakeLists.txt b/src/signature/ref/lvl5/test/CMakeLists.txt new file mode 100644 index 0000000..316e0a8 --- /dev/null +++ b/src/signature/ref/lvl5/test/CMakeLists.txt @@ -0,0 +1 @@ +include(../../lvlx_test.cmake) diff --git a/src/signature/ref/lvlx.cmake b/src/signature/ref/lvlx.cmake new file mode 100644 index 0000000..aad1ee5 --- /dev/null +++ b/src/signature/ref/lvlx.cmake @@ -0,0 +1,13 @@ +set(SOURCE_FILES_SIGNATURE_GENERIC_REF + ${LVLX_DIR}/encode_signature.c + ${LVLX_DIR}/keygen.c + ${LVLX_DIR}/sign.c +) + +add_library(${LIB_SIGNATURE_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_SIGNATURE_GENERIC_REF}) +target_link_libraries(${LIB_SIGNATURE_${SVARIANT_UPPER}} ${LIB_QUATERNION} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${LIB_HD_${SVARIANT_UPPER}} ${LIB_ID2ISO_${SVARIANT_UPPER}} ${LIB_VERIFICATION_${SVARIANT_UPPER}}) +target_include_directories(${LIB_SIGNATURE_${SVARIANT_UPPER}} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_QUATERNION} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_HD} ${INC_ID2ISO} ${INC_VERIFICATION} ${INC_SIGNATURE}) +target_compile_options(${LIB_SIGNATURE_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_compile_definitions(${LIB_SIGNATURE_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) + +add_subdirectory(test) diff --git a/src/signature/ref/lvlx/encode_signature.c b/src/signature/ref/lvlx/encode_signature.c new file mode 100644 index 0000000..112c695 --- /dev/null +++ b/src/signature/ref/lvlx/encode_signature.c @@ -0,0 +1,208 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +typedef unsigned char byte_t; + +// digits + +static void +encode_digits(byte_t *enc, const digit_t *x, size_t nbytes) +{ +#ifdef TARGET_BIG_ENDIAN + const size_t ndigits = nbytes / sizeof(digit_t); + const size_t rem = nbytes % sizeof(digit_t); + + for (size_t i = 0; i < ndigits; i++) + ((digit_t *)enc)[i] = BSWAP_DIGIT(x[i]); + if (rem) { + digit_t ld = BSWAP_DIGIT(x[ndigits]); + memcpy(enc + ndigits * sizeof(digit_t), (byte_t *)&ld, rem); + } +#else + memcpy(enc, (const byte_t *)x, nbytes); +#endif +} + +static void +decode_digits(digit_t *x, const byte_t *enc, size_t nbytes, size_t ndigits) +{ + assert(nbytes <= ndigits * sizeof(digit_t)); + memcpy((byte_t *)x, enc, nbytes); + memset((byte_t *)x + nbytes, 0, ndigits * sizeof(digit_t) - nbytes); + +#ifdef TARGET_BIG_ENDIAN + for (size_t i = 0; i < ndigits; i++) + x[i] = BSWAP_DIGIT(x[i]); +#endif +} + +// ibz_t + +static byte_t * +ibz_to_bytes(byte_t *enc, const ibz_t *x, size_t nbytes, bool sgn) +{ +#ifndef NDEBUG + { + // make sure there is enough space + ibz_t abs, bnd; + ibz_init(&bnd); + ibz_init(&abs); + ibz_pow(&bnd, &ibz_const_two, 8 * nbytes - sgn); + ibz_abs(&abs, x); + assert(ibz_cmp(&abs, &bnd) < 0); + ibz_finalize(&bnd); + ibz_finalize(&abs); + } +#endif + const size_t digits = (nbytes + sizeof(digit_t) - 1) / sizeof(digit_t); + digit_t d[digits]; + memset(d, 0, sizeof(d)); + if (ibz_cmp(x, &ibz_const_zero) >= 0) { + // non-negative, straightforward. + ibz_to_digits(d, x); + } else { + assert(sgn); + // negative; use two's complement. + ibz_t tmp; + ibz_init(&tmp); + ibz_neg(&tmp, x); + ibz_sub(&tmp, &tmp, &ibz_const_one); + ibz_to_digits(d, &tmp); + for (size_t i = 0; i < digits; ++i) + d[i] = ~d[i]; +#ifndef NDEBUG + { + // make sure the result is correct + ibz_t chk; + ibz_init(&chk); + ibz_copy_digit_array(&tmp, d); + ibz_sub(&tmp, &tmp, x); + ibz_pow(&chk, &ibz_const_two, 8 * sizeof(d)); + assert(!ibz_cmp(&tmp, &chk)); + ibz_finalize(&chk); + } +#endif + ibz_finalize(&tmp); + } + encode_digits(enc, d, nbytes); + return enc + nbytes; +} + +static const byte_t * +ibz_from_bytes(ibz_t *x, const byte_t *enc, size_t nbytes, bool sgn) +{ + assert(nbytes > 0); + const size_t ndigits = (nbytes + sizeof(digit_t) - 1) / sizeof(digit_t); + assert(ndigits > 0); + digit_t d[ndigits]; + memset(d, 0, sizeof(d)); + decode_digits(d, enc, nbytes, ndigits); + if (sgn && enc[nbytes - 1] >> 7) { + // negative, decode two's complement + const size_t s = sizeof(digit_t) - 1 - (sizeof(d) - nbytes); + assert(s < sizeof(digit_t)); + d[ndigits - 1] |= ((digit_t)-1) >> 8 * s << 8 * s; + for (size_t i = 0; i < ndigits; ++i) + d[i] = ~d[i]; + ibz_copy_digits(x, d, ndigits); + ibz_add(x, x, &ibz_const_one); + ibz_neg(x, x); + } else { + // non-negative + ibz_copy_digits(x, d, ndigits); + } + return enc + nbytes; +} + +// public API + +void +secret_key_to_bytes(byte_t *enc, const secret_key_t *sk, const public_key_t *pk) +{ +#ifndef NDEBUG + byte_t *const start = enc; +#endif + + enc = public_key_to_bytes(enc, pk); + +#ifndef NDEBUG + { + fp2_t lhs, rhs; + fp2_mul(&lhs, &sk->curve.A, &pk->curve.C); + fp2_mul(&rhs, &sk->curve.C, &pk->curve.A); + assert(fp2_is_equal(&lhs, &rhs)); + } +#endif + + enc = ibz_to_bytes(enc, &sk->secret_ideal.norm, FP_ENCODED_BYTES, false); + { + quat_alg_elem_t gen; + quat_alg_elem_init(&gen); + int ret UNUSED = quat_lideal_generator(&gen, &sk->secret_ideal, &QUATALG_PINFTY); + assert(ret); + // we skip encoding the denominator since it won't change the generated ideal +#ifndef NDEBUG + { + // let's make sure that the denominator is indeed coprime to the norm of the ideal + ibz_t gcd; + ibz_init(&gcd); + ibz_gcd(&gcd, &gen.denom, &sk->secret_ideal.norm); + assert(!ibz_cmp(&gcd, &ibz_const_one)); + ibz_finalize(&gcd); + } +#endif + enc = ibz_to_bytes(enc, &gen.coord[0], FP_ENCODED_BYTES, true); + enc = ibz_to_bytes(enc, &gen.coord[1], FP_ENCODED_BYTES, true); + enc = ibz_to_bytes(enc, &gen.coord[2], FP_ENCODED_BYTES, true); + enc = ibz_to_bytes(enc, &gen.coord[3], FP_ENCODED_BYTES, true); + quat_alg_elem_finalize(&gen); + } + + enc = ibz_to_bytes(enc, &sk->mat_BAcan_to_BA0_two[0][0], TORSION_2POWER_BYTES, false); + enc = ibz_to_bytes(enc, &sk->mat_BAcan_to_BA0_two[0][1], TORSION_2POWER_BYTES, false); + enc = ibz_to_bytes(enc, &sk->mat_BAcan_to_BA0_two[1][0], TORSION_2POWER_BYTES, false); + enc = ibz_to_bytes(enc, &sk->mat_BAcan_to_BA0_two[1][1], TORSION_2POWER_BYTES, false); + + assert(enc - start == SECRETKEY_BYTES); +} + +void +secret_key_from_bytes(secret_key_t *sk, public_key_t *pk, const byte_t *enc) +{ +#ifndef NDEBUG + const byte_t *const start = enc; +#endif + + enc = public_key_from_bytes(pk, enc); + + { + ibz_t norm; + ibz_init(&norm); + quat_alg_elem_t gen; + quat_alg_elem_init(&gen); + enc = ibz_from_bytes(&norm, enc, FP_ENCODED_BYTES, false); + enc = ibz_from_bytes(&gen.coord[0], enc, FP_ENCODED_BYTES, true); + enc = ibz_from_bytes(&gen.coord[1], enc, FP_ENCODED_BYTES, true); + enc = ibz_from_bytes(&gen.coord[2], enc, FP_ENCODED_BYTES, true); + enc = ibz_from_bytes(&gen.coord[3], enc, FP_ENCODED_BYTES, true); + quat_lideal_create(&sk->secret_ideal, &gen, &norm, &MAXORD_O0, &QUATALG_PINFTY); + ibz_finalize(&norm); + quat_alg_elem_finalize(&gen); + } + + enc = ibz_from_bytes(&sk->mat_BAcan_to_BA0_two[0][0], enc, TORSION_2POWER_BYTES, false); + enc = ibz_from_bytes(&sk->mat_BAcan_to_BA0_two[0][1], enc, TORSION_2POWER_BYTES, false); + enc = ibz_from_bytes(&sk->mat_BAcan_to_BA0_two[1][0], enc, TORSION_2POWER_BYTES, false); + enc = ibz_from_bytes(&sk->mat_BAcan_to_BA0_two[1][1], enc, TORSION_2POWER_BYTES, false); + + assert(enc - start == SECRETKEY_BYTES); + + sk->curve = pk->curve; + ec_curve_to_basis_2f_from_hint(&sk->canonical_basis, &sk->curve, TORSION_EVEN_POWER, pk->hint_pk); +} diff --git a/src/signature/ref/lvlx/keygen.c b/src/signature/ref/lvlx/keygen.c new file mode 100644 index 0000000..c1c206c --- /dev/null +++ b/src/signature/ref/lvlx/keygen.c @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include + +void +secret_key_init(secret_key_t *sk) +{ + quat_left_ideal_init(&(sk->secret_ideal)); + ibz_mat_2x2_init(&(sk->mat_BAcan_to_BA0_two)); + ec_curve_init(&sk->curve); +} + +void +secret_key_finalize(secret_key_t *sk) +{ + quat_left_ideal_finalize(&(sk->secret_ideal)); + ibz_mat_2x2_finalize(&(sk->mat_BAcan_to_BA0_two)); +} + +int +protocols_keygen(public_key_t *pk, secret_key_t *sk) +{ + int found = 0; + ec_basis_t B_0_two; + + // iterating until a solution has been found + while (!found) { + + found = quat_sampling_random_ideal_O0_given_norm( + &sk->secret_ideal, &SEC_DEGREE, 1, &QUAT_represent_integer_params, NULL); + + // replacing the secret key ideal by a shorter equivalent one for efficiency + found = found && quat_lideal_prime_norm_reduced_equivalent( + &sk->secret_ideal, &QUATALG_PINFTY, QUAT_primality_num_iter, QUAT_equiv_bound_coeff); + + // ideal to isogeny clapotis + + found = found && dim2id2iso_arbitrary_isogeny_evaluation(&B_0_two, &sk->curve, &sk->secret_ideal); + } + + // Assert the isogeny was found and images have the correct order + assert(test_basis_order_twof(&B_0_two, &sk->curve, TORSION_EVEN_POWER)); + + // Compute a deterministic basis with a hint to speed up verification + pk->hint_pk = ec_curve_to_basis_2f_to_hint(&sk->canonical_basis, &sk->curve, TORSION_EVEN_POWER); + + // Assert the deterministic basis we computed has the correct order + assert(test_basis_order_twof(&sk->canonical_basis, &sk->curve, TORSION_EVEN_POWER)); + + // Compute the 2x2 matrix basis change from the canonical basis to the evaluation of our secret + // isogeny + change_of_basis_matrix_tate( + &sk->mat_BAcan_to_BA0_two, &sk->canonical_basis, &B_0_two, &sk->curve, TORSION_EVEN_POWER); + + // Set the public key from the codomain curve + copy_curve(&pk->curve, &sk->curve); + pk->curve.is_A24_computed_and_normalized = false; // We don't send any precomputation + + assert(fp2_is_one(&pk->curve.C) == 0xFFFFFFFF); + + return found; +} diff --git a/src/signature/ref/lvlx/sign.c b/src/signature/ref/lvlx/sign.c new file mode 100644 index 0000000..9216bbe --- /dev/null +++ b/src/signature/ref/lvlx/sign.c @@ -0,0 +1,634 @@ +#include +#include +#include +#include +#include +#include + +// compute the commitment with ideal to isogeny clapotis +// and apply it to the basis of E0 (together with the multiplication by some scalar u) +static bool +commit(ec_curve_t *E_com, ec_basis_t *basis_even_com, quat_left_ideal_t *lideal_com) +{ + + bool found = false; + + found = quat_sampling_random_ideal_O0_given_norm(lideal_com, &COM_DEGREE, 1, &QUAT_represent_integer_params, NULL); + // replacing it with a shorter prime norm equivalent ideal + found = found && quat_lideal_prime_norm_reduced_equivalent( + lideal_com, &QUATALG_PINFTY, QUAT_primality_num_iter, QUAT_equiv_bound_coeff); + // ideal to isogeny clapotis + found = found && dim2id2iso_arbitrary_isogeny_evaluation(basis_even_com, E_com, lideal_com); + return found; +} + +static void +compute_challenge_ideal_signature(quat_left_ideal_t *lideal_chall_two, const signature_t *sig, const secret_key_t *sk) +{ + ibz_vec_2_t vec; + ibz_vec_2_init(&vec); + + // vec is a vector [1, chall_coeff] coefficients encoding the kernel of the challenge + // isogeny as B[0] + chall_coeff*B[1] where B is the canonical basis of the + // 2^TORSION_EVEN_POWER torsion of EA + ibz_set(&vec[0], 1); + ibz_copy_digit_array(&vec[1], sig->chall_coeff); + + // now we compute the ideal associated to the challenge + // for that, we need to find vec such that + // the kernel of the challenge isogeny is generated by vec[0]*B0[0] + vec[1]*B0[1] where B0 + // is the image through the secret key isogeny of the canonical basis E0 + ibz_mat_2x2_eval(&vec, &(sk->mat_BAcan_to_BA0_two), &vec); + + // lideal_chall_two is the pullback of the ideal challenge through the secret key ideal + id2iso_kernel_dlogs_to_ideal_even(lideal_chall_two, &vec, TORSION_EVEN_POWER); + assert(ibz_cmp(&lideal_chall_two->norm, &TORSION_PLUS_2POWER) == 0); + + ibz_vec_2_finalize(&vec); +} + +static void +sample_response(quat_alg_elem_t *x, const quat_lattice_t *lattice, const ibz_t *lattice_content) +{ + ibz_t bound; + ibz_init(&bound); + ibz_pow(&bound, &ibz_const_two, SQIsign_response_length); + ibz_sub(&bound, &bound, &ibz_const_one); + ibz_mul(&bound, &bound, lattice_content); + + int ok UNUSED = quat_lattice_sample_from_ball(x, lattice, &QUATALG_PINFTY, &bound); + assert(ok); + + ibz_finalize(&bound); +} + +static void +compute_response_quat_element(quat_alg_elem_t *resp_quat, + ibz_t *lattice_content, + const secret_key_t *sk, + const quat_left_ideal_t *lideal_chall_two, + const quat_left_ideal_t *lideal_commit) +{ + quat_left_ideal_t lideal_chall_secret; + quat_lattice_t lattice_hom_chall_to_com, lat_commit; + + // Init + quat_left_ideal_init(&lideal_chall_secret); + quat_lattice_init(&lat_commit); + quat_lattice_init(&lattice_hom_chall_to_com); + + // lideal_chall_secret = lideal_secret * lideal_chall_two + quat_lideal_inter(&lideal_chall_secret, lideal_chall_two, &(sk->secret_ideal), &QUATALG_PINFTY); + + // now we compute lideal_com_to_chall which is dual(Icom)* lideal_chall_secret + quat_lattice_conjugate_without_hnf(&lat_commit, &(lideal_commit->lattice)); + quat_lattice_intersect(&lattice_hom_chall_to_com, &lideal_chall_secret.lattice, &lat_commit); + + // sampling the smallest response + ibz_mul(lattice_content, &lideal_chall_secret.norm, &lideal_commit->norm); + sample_response(resp_quat, &lattice_hom_chall_to_com, lattice_content); + + // Clean up + quat_left_ideal_finalize(&lideal_chall_secret); + quat_lattice_finalize(&lat_commit); + quat_lattice_finalize(&lattice_hom_chall_to_com); +} + +static void +compute_backtracking_signature(signature_t *sig, quat_alg_elem_t *resp_quat, ibz_t *lattice_content, ibz_t *remain) +{ + uint_fast8_t backtracking; + ibz_t tmp; + ibz_init(&tmp); + + ibz_vec_4_t dummy_coord; + ibz_vec_4_init(&dummy_coord); + + quat_alg_make_primitive(&dummy_coord, &tmp, resp_quat, &MAXORD_O0); + ibz_mul(&resp_quat->denom, &resp_quat->denom, &tmp); + assert(quat_lattice_contains(NULL, &MAXORD_O0, resp_quat)); + + // the backtracking is the common part of the response and the challenge + // its degree is the scalar tmp computed above such that quat_resp is in tmp * O0. + backtracking = ibz_two_adic(&tmp); + sig->backtracking = backtracking; + + ibz_pow(&tmp, &ibz_const_two, backtracking); + ibz_div(lattice_content, remain, lattice_content, &tmp); + + ibz_finalize(&tmp); + ibz_vec_4_finalize(&dummy_coord); +} + +static uint_fast8_t +compute_random_aux_norm_and_helpers(signature_t *sig, + ibz_t *random_aux_norm, + ibz_t *degree_resp_inv, + ibz_t *remain, + const ibz_t *lattice_content, + quat_alg_elem_t *resp_quat, + quat_left_ideal_t *lideal_com_resp, + quat_left_ideal_t *lideal_commit) +{ + uint_fast8_t pow_dim2_deg_resp; + uint_fast8_t exp_diadic_val_full_resp; + + ibz_t tmp, degree_full_resp, degree_odd_resp, norm_d; + + // Init + ibz_init(°ree_full_resp); + ibz_init(°ree_odd_resp); + ibz_init(&norm_d); + ibz_init(&tmp); + + quat_alg_norm(°ree_full_resp, &norm_d, resp_quat, &QUATALG_PINFTY); + + // dividing by n(lideal_com) * n(lideal_secret_chall) + assert(ibz_is_one(&norm_d)); + ibz_div(°ree_full_resp, remain, °ree_full_resp, lattice_content); + assert(ibz_cmp(remain, &ibz_const_zero) == 0); + + // computing the diadic valuation + exp_diadic_val_full_resp = ibz_two_adic(°ree_full_resp); + sig->two_resp_length = exp_diadic_val_full_resp; + + // removing the power of two part + ibz_pow(&tmp, &ibz_const_two, exp_diadic_val_full_resp); + ibz_div(°ree_odd_resp, remain, °ree_full_resp, &tmp); + assert(ibz_cmp(remain, &ibz_const_zero) == 0); +#ifndef NDEBUG + ibz_pow(&tmp, &ibz_const_two, SQIsign_response_length - sig->backtracking); + assert(ibz_cmp(&tmp, °ree_odd_resp) > 0); +#endif + + // creating the ideal + quat_alg_conj(resp_quat, resp_quat); + + // setting the norm + ibz_mul(&tmp, &lideal_commit->norm, °ree_odd_resp); + quat_lideal_create(lideal_com_resp, resp_quat, &tmp, &MAXORD_O0, &QUATALG_PINFTY); + + // now we compute the ideal_aux + // computing the norm + pow_dim2_deg_resp = SQIsign_response_length - exp_diadic_val_full_resp - sig->backtracking; + ibz_pow(remain, &ibz_const_two, pow_dim2_deg_resp); + ibz_sub(random_aux_norm, remain, °ree_odd_resp); + + // multiplying by 2^HD_extra_torsion to account for the fact that + // we use extra torsion above the kernel + for (int i = 0; i < HD_extra_torsion; i++) + ibz_mul(remain, remain, &ibz_const_two); + + ibz_invmod(degree_resp_inv, °ree_odd_resp, remain); + + ibz_finalize(°ree_full_resp); + ibz_finalize(°ree_odd_resp); + ibz_finalize(&norm_d); + ibz_finalize(&tmp); + + return pow_dim2_deg_resp; +} + +static int +evaluate_random_aux_isogeny_signature(ec_curve_t *E_aux, + ec_basis_t *B_aux, + const ibz_t *norm, + const quat_left_ideal_t *lideal_com_resp) +{ + quat_left_ideal_t lideal_aux; + quat_left_ideal_t lideal_aux_resp_com; + + // Init + quat_left_ideal_init(&lideal_aux); + quat_left_ideal_init(&lideal_aux_resp_com); + + // sampling the ideal at random + int found = quat_sampling_random_ideal_O0_given_norm( + &lideal_aux, norm, 0, &QUAT_represent_integer_params, &QUAT_prime_cofactor); + + if (found) { + // pushing forward + quat_lideal_inter(&lideal_aux_resp_com, lideal_com_resp, &lideal_aux, &QUATALG_PINFTY); + + // now we evaluate this isogeny on the basis of E0 + found = dim2id2iso_arbitrary_isogeny_evaluation(B_aux, E_aux, &lideal_aux_resp_com); + + // Clean up + quat_left_ideal_finalize(&lideal_aux_resp_com); + quat_left_ideal_finalize(&lideal_aux); + } + + return found; +} + +static int +compute_dim2_isogeny_challenge(theta_couple_curve_with_basis_t *codomain, + theta_couple_curve_with_basis_t *domain, + const ibz_t *degree_resp_inv, + int pow_dim2_deg_resp, + int exp_diadic_val_full_resp, + int reduced_order) +{ + // now, we compute the isogeny Phi : Ecom x Eaux -> Echl' x Eaux' + // where Echl' is 2^exp_diadic_val_full_resp isogenous to Echal + // ker Phi = <(Bcom_can.P,Baux.P),(Bcom_can.Q,Baux.Q)> + + // preparing the domain + theta_couple_curve_t EcomXEaux; + copy_curve(&EcomXEaux.E1, &domain->E1); + copy_curve(&EcomXEaux.E2, &domain->E2); + + // preparing the kernel + theta_kernel_couple_points_t dim_two_ker; + copy_bases_to_kernel(&dim_two_ker, &domain->B1, &domain->B2); + + // dividing by the degree of the response + digit_t scalar[NWORDS_ORDER]; + ibz_to_digit_array(scalar, degree_resp_inv); + ec_mul(&dim_two_ker.T1.P2, scalar, reduced_order, &dim_two_ker.T1.P2, &EcomXEaux.E2); + ec_mul(&dim_two_ker.T2.P2, scalar, reduced_order, &dim_two_ker.T2.P2, &EcomXEaux.E2); + ec_mul(&dim_two_ker.T1m2.P2, scalar, reduced_order, &dim_two_ker.T1m2.P2, &EcomXEaux.E2); + + // and multiplying by 2^exp_diadic... + double_couple_point_iter(&dim_two_ker.T1, exp_diadic_val_full_resp, &dim_two_ker.T1, &EcomXEaux); + double_couple_point_iter(&dim_two_ker.T2, exp_diadic_val_full_resp, &dim_two_ker.T2, &EcomXEaux); + double_couple_point_iter(&dim_two_ker.T1m2, exp_diadic_val_full_resp, &dim_two_ker.T1m2, &EcomXEaux); + + theta_couple_point_t pushed_points[3]; + theta_couple_point_t *const Tev1 = pushed_points + 0, *const Tev2 = pushed_points + 1, + *const Tev1m2 = pushed_points + 2; + + // Set points on the commitment curve + copy_point(&Tev1->P1, &domain->B1.P); + copy_point(&Tev2->P1, &domain->B1.Q); + copy_point(&Tev1m2->P1, &domain->B1.PmQ); + + // Zero points on the aux curve + ec_point_init(&Tev1->P2); + ec_point_init(&Tev2->P2); + ec_point_init(&Tev1m2->P2); + + theta_couple_curve_t codomain_product; + + // computation of the dim2 isogeny + if (!theta_chain_compute_and_eval_randomized(pow_dim2_deg_resp, + &EcomXEaux, + &dim_two_ker, + true, + &codomain_product, + pushed_points, + sizeof(pushed_points) / sizeof(*pushed_points))) + return 0; + + assert(test_couple_point_order_twof(Tev1, &codomain_product, reduced_order)); + + // Set the auxiliary curve + copy_curve(&codomain->E1, &codomain_product.E2); + + // Set the codomain curve from the dim 2 isogeny + // it should always be the first curve + copy_curve(&codomain->E2, &codomain_product.E1); + + // Set the evaluated basis points + copy_point(&codomain->B1.P, &Tev1->P2); + copy_point(&codomain->B1.Q, &Tev2->P2); + copy_point(&codomain->B1.PmQ, &Tev1m2->P2); + + copy_point(&codomain->B2.P, &Tev1->P1); + copy_point(&codomain->B2.Q, &Tev2->P1); + copy_point(&codomain->B2.PmQ, &Tev1m2->P1); + return 1; +} + +static int +compute_small_chain_isogeny_signature(ec_curve_t *E_chall_2, + ec_basis_t *B_chall_2, + const quat_alg_elem_t *resp_quat, + int pow_dim2_deg_resp, + int length) +{ + int ret = 1; + + ibz_t two_pow; + ibz_init(&two_pow); + + ibz_vec_2_t vec_resp_two; + ibz_vec_2_init(&vec_resp_two); + + quat_left_ideal_t lideal_resp_two; + quat_left_ideal_init(&lideal_resp_two); + + // computing the ideal + ibz_pow(&two_pow, &ibz_const_two, length); + + // we compute the generator of the challenge ideal + quat_lideal_create(&lideal_resp_two, resp_quat, &two_pow, &MAXORD_O0, &QUATALG_PINFTY); + + // computing the coefficients of the kernel in terms of the basis of O0 + id2iso_ideal_to_kernel_dlogs_even(&vec_resp_two, &lideal_resp_two); + + ec_point_t points[3]; + copy_point(&points[0], &B_chall_2->P); + copy_point(&points[1], &B_chall_2->Q); + copy_point(&points[2], &B_chall_2->PmQ); + + // getting down to the right order and applying the matrix + ec_dbl_iter_basis(B_chall_2, pow_dim2_deg_resp + HD_extra_torsion, B_chall_2, E_chall_2); + assert(test_basis_order_twof(B_chall_2, E_chall_2, length)); + + ec_point_t ker; + // applying the vector to find the kernel + ec_biscalar_mul_ibz_vec(&ker, &vec_resp_two, length, B_chall_2, E_chall_2); + assert(test_point_order_twof(&ker, E_chall_2, length)); + + // computing the isogeny and pushing the points + if (ec_eval_small_chain(E_chall_2, &ker, length, points, 3, true)) { + ret = 0; + } + + // copying the result + copy_point(&B_chall_2->P, &points[0]); + copy_point(&B_chall_2->Q, &points[1]); + copy_point(&B_chall_2->PmQ, &points[2]); + + ibz_finalize(&two_pow); + ibz_vec_2_finalize(&vec_resp_two); + quat_left_ideal_finalize(&lideal_resp_two); + + return ret; +} + +static int +compute_challenge_codomain_signature(const signature_t *sig, + secret_key_t *sk, + ec_curve_t *E_chall, + const ec_curve_t *E_chall_2, + ec_basis_t *B_chall_2) +{ + ec_isog_even_t phi_chall; + ec_basis_t bas_sk; + copy_basis(&bas_sk, &sk->canonical_basis); + + phi_chall.curve = sk->curve; + phi_chall.length = TORSION_EVEN_POWER - sig->backtracking; + assert(test_basis_order_twof(&bas_sk, &sk->curve, TORSION_EVEN_POWER)); + + // Compute the kernel + { + ec_ladder3pt(&phi_chall.kernel, sig->chall_coeff, &bas_sk.P, &bas_sk.Q, &bas_sk.PmQ, &sk->curve); + } + assert(test_point_order_twof(&phi_chall.kernel, &sk->curve, TORSION_EVEN_POWER)); + + // Double kernel to get correct order + ec_dbl_iter(&phi_chall.kernel, sig->backtracking, &phi_chall.kernel, &sk->curve); + + assert(test_point_order_twof(&phi_chall.kernel, E_chall, phi_chall.length)); + + // Compute the codomain from challenge isogeny + if (ec_eval_even(E_chall, &phi_chall, NULL, 0)) + return 0; + +#ifndef NDEBUG + fp2_t j_chall, j_codomain; + ec_j_inv(&j_codomain, E_chall_2); + ec_j_inv(&j_chall, E_chall); + // apparently its always the second one curve + assert(fp2_is_equal(&j_chall, &j_codomain)); +#endif + + // applying the isomorphism from E_chall_2 to E_chall + ec_isom_t isom; + if (ec_isomorphism(&isom, E_chall_2, E_chall)) + return 0; // error due to a corner case with 1/p probability + ec_iso_eval(&B_chall_2->P, &isom); + ec_iso_eval(&B_chall_2->Q, &isom); + ec_iso_eval(&B_chall_2->PmQ, &isom); + + return 1; +} + +static void +set_aux_curve_signature(signature_t *sig, ec_curve_t *E_aux) +{ + ec_normalize_curve(E_aux); + fp2_copy(&sig->E_aux_A, &E_aux->A); +} + +static void +compute_and_set_basis_change_matrix(signature_t *sig, + const ec_basis_t *B_aux_2, + ec_basis_t *B_chall_2, + ec_curve_t *E_aux_2, + ec_curve_t *E_chall, + int f) +{ + // Matrices for change of bases matrices + ibz_mat_2x2_t mat_Baux2_to_Baux2_can, mat_Bchall_can_to_Bchall; + ibz_mat_2x2_init(&mat_Baux2_to_Baux2_can); + ibz_mat_2x2_init(&mat_Bchall_can_to_Bchall); + + // Compute canonical bases + ec_basis_t B_can_chall, B_aux_2_can; + sig->hint_chall = ec_curve_to_basis_2f_to_hint(&B_can_chall, E_chall, TORSION_EVEN_POWER); + sig->hint_aux = ec_curve_to_basis_2f_to_hint(&B_aux_2_can, E_aux_2, TORSION_EVEN_POWER); + +#ifndef NDEBUG + { + // Ensure all points have the desired order + assert(test_basis_order_twof(&B_aux_2_can, E_aux_2, TORSION_EVEN_POWER)); + assert(test_basis_order_twof(B_aux_2, E_aux_2, f)); + fp2_t w0; + weil(&w0, f, &B_aux_2->P, &B_aux_2->Q, &B_aux_2->PmQ, E_aux_2); + } +#endif + + // compute the matrix to go from B_aux_2 to B_aux_2_can + change_of_basis_matrix_tate_invert(&mat_Baux2_to_Baux2_can, &B_aux_2_can, B_aux_2, E_aux_2, f); + + // apply the change of basis to B_chall_2 + matrix_application_even_basis(B_chall_2, E_chall, &mat_Baux2_to_Baux2_can, f); + +#ifndef NDEBUG + { + // Ensure all points have the desired order + assert(test_basis_order_twof(&B_can_chall, E_chall, TORSION_EVEN_POWER)); + } +#endif + + // compute the matrix to go from B_chall_can to B_chall_2 + change_of_basis_matrix_tate(&mat_Bchall_can_to_Bchall, B_chall_2, &B_can_chall, E_chall, f); + + // Assert all values in the matrix are of the expected size for packing + assert(ibz_bitsize(&mat_Bchall_can_to_Bchall[0][0]) <= SQIsign_response_length + HD_extra_torsion); + assert(ibz_bitsize(&mat_Bchall_can_to_Bchall[0][1]) <= SQIsign_response_length + HD_extra_torsion); + assert(ibz_bitsize(&mat_Bchall_can_to_Bchall[1][0]) <= SQIsign_response_length + HD_extra_torsion); + assert(ibz_bitsize(&mat_Bchall_can_to_Bchall[1][1]) <= SQIsign_response_length + HD_extra_torsion); + + // Set the basis change matrix to signature + ibz_to_digit_array(sig->mat_Bchall_can_to_B_chall[0][0], &(mat_Bchall_can_to_Bchall[0][0])); + ibz_to_digit_array(sig->mat_Bchall_can_to_B_chall[0][1], &(mat_Bchall_can_to_Bchall[0][1])); + ibz_to_digit_array(sig->mat_Bchall_can_to_B_chall[1][0], &(mat_Bchall_can_to_Bchall[1][0])); + ibz_to_digit_array(sig->mat_Bchall_can_to_B_chall[1][1], &(mat_Bchall_can_to_Bchall[1][1])); + + // Finalise the matrices + ibz_mat_2x2_finalize(&mat_Bchall_can_to_Bchall); + ibz_mat_2x2_finalize(&mat_Baux2_to_Baux2_can); +} + +int +protocols_sign(signature_t *sig, const public_key_t *pk, secret_key_t *sk, const unsigned char *m, size_t l) +{ + int ret = 0; + int reduced_order = 0; // work around false positive gcc warning + + uint_fast8_t pow_dim2_deg_resp; + assert(SQIsign_response_length <= (intmax_t)UINT_FAST8_MAX); // otherwise we might need more bits there + + ibz_t remain, lattice_content, random_aux_norm, degree_resp_inv; + ibz_init(&remain); + ibz_init(&lattice_content); + ibz_init(&random_aux_norm); + ibz_init(°ree_resp_inv); + + quat_alg_elem_t resp_quat; + quat_alg_elem_init(&resp_quat); + + quat_left_ideal_t lideal_commit, lideal_com_resp; + quat_left_ideal_init(&lideal_commit); + quat_left_ideal_init(&lideal_com_resp); + + // This structure holds two curves E1 x E2 together with a basis + // Bi of E[2^n] for each of these curves + theta_couple_curve_with_basis_t Ecom_Eaux; + // This structure holds two curves E1 x E2 together with a basis + // Bi of Ei[2^n] + theta_couple_curve_with_basis_t Eaux2_Echall2; + + // This will hold the challenge curve + ec_curve_t E_chall = sk->curve; + + ec_curve_init(&Ecom_Eaux.E1); + ec_curve_init(&Ecom_Eaux.E2); + + while (!ret) { + + // computing the commitment + ret = commit(&Ecom_Eaux.E1, &Ecom_Eaux.B1, &lideal_commit); + + // start again if the commitment generation has failed + if (!ret) { + continue; + } + + // Hash the message to a kernel generator + // i.e. a scalar such that ker = P + [s]Q + hash_to_challenge(&sig->chall_coeff, pk, &Ecom_Eaux.E1, m, l); + // Compute the challenge ideal and response quaternion element + { + quat_left_ideal_t lideal_chall_two; + quat_left_ideal_init(&lideal_chall_two); + + // computing the challenge ideal + compute_challenge_ideal_signature(&lideal_chall_two, sig, sk); + compute_response_quat_element(&resp_quat, &lattice_content, sk, &lideal_chall_two, &lideal_commit); + + // Clean up + quat_left_ideal_finalize(&lideal_chall_two); + } + + // computing the amount of backtracking we're making + // and removing it + compute_backtracking_signature(sig, &resp_quat, &lattice_content, &remain); + + // creating lideal_com * lideal_resp + // we first compute the norm of lideal_resp + // norm of the resp_quat + pow_dim2_deg_resp = compute_random_aux_norm_and_helpers(sig, + &random_aux_norm, + °ree_resp_inv, + &remain, + &lattice_content, + &resp_quat, + &lideal_com_resp, + &lideal_commit); + + // notational conventions: + // B0 = canonical basis of E0 + // B_com = image through commitment isogeny (odd degree) of canonical basis of E0 + // B_aux = image through aux_resp_com isogeny (odd degree) of canonical basis of E0 + + if (pow_dim2_deg_resp > 0) { + // Evaluate the random aux ideal on the curve E0 and its basis to find E_aux and B_aux + ret = + evaluate_random_aux_isogeny_signature(&Ecom_Eaux.E2, &Ecom_Eaux.B2, &random_aux_norm, &lideal_com_resp); + + // auxiliary isogeny computation failed we must start again + if (!ret) { + continue; + } + +#ifndef NDEBUG + // testing that the order of the points in the bases is as expected + assert(test_basis_order_twof(&Ecom_Eaux.B1, &Ecom_Eaux.E1, TORSION_EVEN_POWER)); + assert(test_basis_order_twof(&Ecom_Eaux.B2, &Ecom_Eaux.E2, TORSION_EVEN_POWER)); +#endif + + // applying the matrix to compute Baux + // first, we reduce to the relevant order + reduced_order = pow_dim2_deg_resp + HD_extra_torsion + sig->two_resp_length; + ec_dbl_iter_basis(&Ecom_Eaux.B1, TORSION_EVEN_POWER - reduced_order, &Ecom_Eaux.B1, &Ecom_Eaux.E1); + ec_dbl_iter_basis(&Ecom_Eaux.B2, TORSION_EVEN_POWER - reduced_order, &Ecom_Eaux.B2, &Ecom_Eaux.E2); + + // Given all the above data, compute a dim two isogeny with domain + // E_com x E_aux + // and codomain + // E_aux_2 x E_chall_2 (note: E_chall_2 is isomorphic to E_chall) + // and evaluated points stored as bases in + // B_aux_2 on E_aux_2 + // B_chall_2 on E_chall_2 + ret = compute_dim2_isogeny_challenge( + &Eaux2_Echall2, &Ecom_Eaux, °ree_resp_inv, pow_dim2_deg_resp, sig->two_resp_length, reduced_order); + if (!ret) + continue; + } else { + // No 2d isogeny needed, so simulate a "Kani matrix" identity here + copy_curve(&Eaux2_Echall2.E1, &Ecom_Eaux.E1); + copy_curve(&Eaux2_Echall2.E2, &Ecom_Eaux.E1); + + reduced_order = sig->two_resp_length; + ec_dbl_iter_basis(&Eaux2_Echall2.B1, TORSION_EVEN_POWER - reduced_order, &Ecom_Eaux.B1, &Ecom_Eaux.E1); + ec_dbl_iter_basis(&Eaux2_Echall2.B1, TORSION_EVEN_POWER - reduced_order, &Ecom_Eaux.B1, &Ecom_Eaux.E1); + copy_basis(&Eaux2_Echall2.B2, &Eaux2_Echall2.B1); + } + + // computation of the remaining small chain of two isogenies when needed + if (sig->two_resp_length > 0) { + if (!compute_small_chain_isogeny_signature( + &Eaux2_Echall2.E2, &Eaux2_Echall2.B2, &resp_quat, pow_dim2_deg_resp, sig->two_resp_length)) { + assert(0); // this shouldn't fail + } + } + + // computation of the challenge codomain + if (!compute_challenge_codomain_signature(sig, sk, &E_chall, &Eaux2_Echall2.E2, &Eaux2_Echall2.B2)) + assert(0); // this shouldn't fail + } + + // Set to the signature the Montgomery A-coefficient of E_aux_2 + set_aux_curve_signature(sig, &Eaux2_Echall2.E1); + + // Set the basis change matrix from canonical bases to the supplied bases + compute_and_set_basis_change_matrix( + sig, &Eaux2_Echall2.B1, &Eaux2_Echall2.B2, &Eaux2_Echall2.E1, &E_chall, reduced_order); + + quat_alg_elem_finalize(&resp_quat); + quat_left_ideal_finalize(&lideal_commit); + quat_left_ideal_finalize(&lideal_com_resp); + + ibz_finalize(&lattice_content); + ibz_finalize(&remain); + ibz_finalize(°ree_resp_inv); + ibz_finalize(&random_aux_norm); + + return ret; +} diff --git a/src/signature/ref/lvlx/test/bench_signature.c b/src/signature/ref/lvlx/test/bench_signature.c new file mode 100644 index 0000000..f101460 --- /dev/null +++ b/src/signature/ref/lvlx/test/bench_signature.c @@ -0,0 +1,140 @@ +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + +static __inline__ uint64_t +rdtsc(void) +{ + return (uint64_t)cpucycles(); +} + +void +bench_sqisign(uint64_t bench) +{ + setlocale(LC_NUMERIC, ""); + uint64_t t0, t1; + clock_t t; + float ms; + + public_key_t pks[bench]; + secret_key_t sks[bench]; + signature_t sigs[bench]; + unsigned char msg[32] = { 0 }; + + for (uint64_t i = 0; i < bench; i++) { + public_key_init(&pks[i]); + secret_key_init(&sks[i]); + } + + printf("\n\nBenchmarking signatures for " STRINGIFY(SQISIGN_VARIANT) ":\n\n"); + t = tic(); + t0 = rdtsc(); + for (uint64_t i = 0; i < bench; ++i) { + protocols_keygen(&pks[i], &sks[i]); + } + t1 = rdtsc(); + ms = (1000. * (float)(clock() - t) / CLOCKS_PER_SEC); + printf("Average keygen time [%.2f ms]\n", (float)(ms / bench)); + printf("\x1b[34mAvg keygen: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); + + t = tic(); + t0 = rdtsc(); + for (uint64_t i = 0; i < bench; ++i) { + protocols_sign(&(sigs[i]), &(pks[i]), &(sks[i]), msg, sizeof(msg) / sizeof(*msg)); + } + t1 = rdtsc(); + ms = (1000. * (float)(clock() - t) / CLOCKS_PER_SEC); + printf("Average signature time [%.2f ms]\n", (float)(ms / bench)); + printf("\x1b[34mAvg signature: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); + + t = tic(); + t0 = rdtsc(); + for (uint64_t i = 0; i < bench; ++i) { + int check = protocols_verify(&(sigs[i]), &(pks[i]), msg, sizeof(msg) / sizeof(*msg)); + if (!check) { + printf("verif failed ! \n"); + } + } + t1 = rdtsc(); + ms = (1000. * (float)(clock() - t) / CLOCKS_PER_SEC); + printf("Average verification time [%.2f ms]\n", (float)(ms / bench)); + printf("\x1b[34mAvg verification: %'" PRIu64 " cycles\x1b[0m\n", (t1 - t0) / bench); + + for (uint64_t i = 0; i < bench; i++) { + public_key_finalize(&pks[i]); + secret_key_finalize(&sks[i]); + } +} + +// run all tests in module +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + +#ifndef NDEBUG + fprintf(stderr, + "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" + "This will severely impact performance measurements.\x1b[0m\n"); +#endif + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for benchmarking; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + cpucycles_init(); + + bench_sqisign(iterations); + + return (0); +} diff --git a/src/signature/ref/lvlx/test/test_signature.c b/src/signature/ref/lvlx/test/test_signature.c new file mode 100644 index 0000000..911184d --- /dev/null +++ b/src/signature/ref/lvlx/test/test_signature.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +int +test_sqisign(int repeat) +{ + int res = 1; + + public_key_t pk; + secret_key_t sk; + signature_t sig; + const unsigned char msg[32] = { 0 }; + + public_key_init(&pk); + secret_key_init(&sk); + + printf("\n\nTesting signatures\n"); + for (int i = 0; i < repeat; ++i) { + printf("#%d \n", i); + + protocols_keygen(&pk, &sk); + protocols_sign(&sig, &pk, &sk, msg, 32); + int check = protocols_verify(&sig, &pk, msg, 32); + if (!check) { + printf("verif failed ! \n"); + } + } + + public_key_finalize(&pk); + secret_key_finalize(&sk); + + return res; +} + +// run all tests in module +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int iterations = SQISIGN_TEST_REPS; + int help = 0; + int seed_set = 0; + int res; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + } + + if (help || iterations <= 0) { + printf("Usage: %s [--iterations=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for testing; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + res = test_sqisign(iterations); + + if (!res) { + printf("\nSome tests failed!\n"); + } else { + printf("All tests passed!\n"); + } + return (!res); +} diff --git a/src/signature/ref/lvlx/test/test_threadsafety.c b/src/signature/ref/lvlx/test/test_threadsafety.c new file mode 100644 index 0000000..d5461b1 --- /dev/null +++ b/src/signature/ref/lvlx/test/test_threadsafety.c @@ -0,0 +1,125 @@ +#include +#include +#include + +#include +#include +#include +#include + +#include + +int threads = 4; +int iterations = SQISIGN_TEST_REPS; + +char dummy = 0; + +void * +test_sqisign(void *_) +{ + (void)_; + + bool res = 1; + + public_key_t pk; + secret_key_t sk; + signature_t sig; + unsigned char msg[32] = { 0 }; + + public_key_init(&pk); + secret_key_init(&sk); + + for (int i = 0; i < iterations; ++i) { + protocols_keygen(&pk, &sk); + int scheck = protocols_sign(&sig, &pk, &sk, msg, sizeof(msg) / sizeof(*msg)); + int check = protocols_verify(&sig, &pk, msg, sizeof(msg) / sizeof(*msg)); + assert(scheck); + assert(check); + res = res && scheck && check; + } + + public_key_finalize(&pk); + secret_key_finalize(&sk); + + return res ? &dummy : NULL; +} + +int +main(int argc, char *argv[]) +{ + uint32_t seed[12] = { 0 }; + int help = 0; + int seed_set = 0; + + for (int i = 1; i < argc; i++) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (sscanf(argv[i], "--iterations=%d", &iterations) == 1) { + continue; + } + + if (sscanf(argv[i], "--threads=%d", &threads) == 1) { + continue; + } + } + + if (help || iterations <= 0 || threads <= 0) { + printf("Usage: %s [--iterations=] [--threads=] [--seed=]\n", argv[0]); + printf("Where is the number of iterations used for testing; if not " + "present, uses the default: %d)\n", + iterations); + printf("Where is the number of threads used for testing; if not " + "present, uses the default: %d)\n", + threads); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + pthread_t thread_handles[threads]; + + { + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, 8 << 20); // 8 MB + for (int i = 0; i < threads; ++i) + pthread_create(&thread_handles[i], &attr, &test_sqisign, NULL); + pthread_attr_destroy(&attr); + } + + bool ok = true; + for (int i = 0; i < threads; ++i) { + void *res; + pthread_join(thread_handles[i], &res); + ok = ok && res; + } + + if (!ok) { + printf("\nSome tests failed!\n"); + } else { + printf("All tests passed!\n"); + } + return !ok; +} diff --git a/src/signature/ref/lvlx_test.cmake b/src/signature/ref/lvlx_test.cmake new file mode 100644 index 0000000..19066c3 --- /dev/null +++ b/src/signature/ref/lvlx_test.cmake @@ -0,0 +1,23 @@ +add_executable(sqisign_test_signature_${SVARIANT_LOWER} ${LVLX_DIR}/test/test_signature.c) +target_link_libraries(sqisign_test_signature_${SVARIANT_LOWER} ${LIB_SIGNATURE_${SVARIANT_UPPER}} ${LIB_VERIFICATION_${SVARIANT_UPPER}} sqisign_common_test) +target_include_directories(sqisign_test_signature_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_QUATERNION} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_VERIFICATION} ${INC_SIGNATURE}) + +add_executable(sqisign_test_threadsafety_${SVARIANT_LOWER} ${LVLX_DIR}/test/test_threadsafety.c) +target_link_libraries(sqisign_test_threadsafety_${SVARIANT_LOWER} ${LIB_SIGNATURE_${SVARIANT_UPPER}} ${LIB_VERIFICATION_${SVARIANT_UPPER}} sqisign_common_test pthread) +target_include_directories(sqisign_test_threadsafety_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_QUATERNION} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_VERIFICATION} ${INC_SIGNATURE}) + +add_test(sqisign_test_signature_${SVARIANT_LOWER} sqisign_test_signature_${SVARIANT_LOWER} 3) +add_test(sqisign_test_threadsafety_${SVARIANT_LOWER} sqisign_test_threadsafety_${SVARIANT_LOWER} 3) + +add_custom_command( + TARGET sqisign_test_signature_${SVARIANT_LOWER} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS -E copy $ ${CMAKE_BINARY_DIR}/test/sqisign_${SVARIANT_LOWER} +) + +add_executable(sqisign_bench_signature_${SVARIANT_LOWER} ${LVLX_DIR}/test/bench_signature.c) +target_link_libraries(sqisign_bench_signature_${SVARIANT_LOWER} ${LIB_SIGNATURE_${SVARIANT_UPPER}} ${LIB_VERIFICATION_${SVARIANT_UPPER}} sqisign_common_sys) +target_include_directories(sqisign_bench_signature_${SVARIANT_LOWER} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_QUATERNION} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_VERIFICATION} ${INC_SIGNATURE}) + +set(BM_BINS ${BM_BINS} sqisign_bench_signature_${SVARIANT_LOWER} CACHE INTERNAL "List of benchmark executables") diff --git a/src/sqisign.c b/src/sqisign.c index 31dcaf0..57fd75d 100644 --- a/src/sqisign.c +++ b/src/sqisign.c @@ -1,79 +1,106 @@ -#include +#include #include +#include +#include +#if defined(ENABLE_SIGN) +#include +#endif -int sqisign_keypair(unsigned char *pk, unsigned char *sk) { - int ret; +#if defined(ENABLE_SIGN) +SQISIGN_API +int +sqisign_keypair(unsigned char *pk, unsigned char *sk) +{ + int ret = 0; secret_key_t skt; public_key_t pkt = { 0 }; secret_key_init(&skt); ret = !protocols_keygen(&pkt, &skt); - secret_key_encode(sk, &skt, &pkt); - public_key_encode(pk, &pkt); + secret_key_to_bytes(sk, &skt, &pkt); + public_key_to_bytes(pk, &pkt); secret_key_finalize(&skt); return ret; } -int sqisign_sign(unsigned char *sm, - unsigned long long *smlen, const unsigned char *m, - unsigned long long mlen, const unsigned char *sk) { +SQISIGN_API +int +sqisign_sign(unsigned char *sm, + unsigned long long *smlen, + const unsigned char *m, + unsigned long long mlen, + const unsigned char *sk) +{ int ret = 0; secret_key_t skt; public_key_t pkt = { 0 }; signature_t sigt; secret_key_init(&skt); - signature_init(&sigt); - secret_key_decode(&skt, &pkt, sk); + secret_key_from_bytes(&skt, &pkt, sk); - ret = !protocols_sign(&sigt, &pkt, &skt, m, mlen); - signature_encode(sm, &sigt); + memmove(sm + SIGNATURE_BYTES, m, mlen); - memcpy(sm + SIGNATURE_LEN, m, mlen); - *smlen = SIGNATURE_LEN + mlen; - - secret_key_finalize(&skt); - signature_finalize(&sigt); - return ret; -} - -int sqisign_open(unsigned char *m, - unsigned long long *mlen, const unsigned char *sm, - unsigned long long smlen, const unsigned char *pk) { - int ret = 0; - public_key_t pkt = { 0 }; - signature_t sigt; - signature_init(&sigt); - - public_key_decode(&pkt, pk); - signature_decode(&sigt, sm); - - ret = !protocols_verif(&sigt, &pkt, sm + SIGNATURE_LEN, smlen - SIGNATURE_LEN); - - if (!ret) { - *mlen = smlen - SIGNATURE_LEN; - memmove(m, sm + SIGNATURE_LEN, *mlen); + ret = !protocols_sign(&sigt, &pkt, &skt, sm + SIGNATURE_BYTES, mlen); + if (ret != 0) { + *smlen = 0; + goto err; + } + + signature_to_bytes(sm, &sigt); + *smlen = SIGNATURE_BYTES + mlen; + +err: + secret_key_finalize(&skt); + return ret; +} +#endif + +SQISIGN_API +int +sqisign_open(unsigned char *m, + unsigned long long *mlen, + const unsigned char *sm, + unsigned long long smlen, + const unsigned char *pk) +{ + int ret = 0; + public_key_t pkt = { 0 }; + signature_t sigt; + + public_key_from_bytes(&pkt, pk); + signature_from_bytes(&sigt, sm); + + ret = !protocols_verify(&sigt, &pkt, sm + SIGNATURE_BYTES, smlen - SIGNATURE_BYTES); + + if (!ret) { + *mlen = smlen - SIGNATURE_BYTES; + memmove(m, sm + SIGNATURE_BYTES, *mlen); + } else { + *mlen = 0; + memset(m, 0, smlen - SIGNATURE_BYTES); } - signature_finalize(&sigt); return ret; } -int sqisign_verify(const unsigned char *m, - unsigned long long mlen, const unsigned char *sig, - unsigned long long siglen, const unsigned char *pk) { +SQISIGN_API +int +sqisign_verify(const unsigned char *m, + unsigned long long mlen, + const unsigned char *sig, + unsigned long long siglen, + const unsigned char *pk) +{ int ret = 0; public_key_t pkt = { 0 }; signature_t sigt; - signature_init(&sigt); - public_key_decode(&pkt, pk); - signature_decode(&sigt, sig); + public_key_from_bytes(&pkt, pk); + signature_from_bytes(&sigt, sig); - ret = !protocols_verif(&sigt, &pkt, m, mlen); + ret = !protocols_verify(&sigt, &pkt, m, mlen); - signature_finalize(&sigt); return ret; } - diff --git a/src/verification/CMakeLists.txt b/src/verification/CMakeLists.txt new file mode 100644 index 0000000..8c11419 --- /dev/null +++ b/src/verification/CMakeLists.txt @@ -0,0 +1 @@ +include(${SELECT_IMPL_TYPE}) diff --git a/src/verification/ref/CMakeLists.txt b/src/verification/ref/CMakeLists.txt new file mode 100644 index 0000000..d0ba315 --- /dev/null +++ b/src/verification/ref/CMakeLists.txt @@ -0,0 +1,3 @@ +set(LVLX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lvlx) + +include(${SELECT_SQISIGN_VARIANT}) diff --git a/src/verification/ref/include/verification.h b/src/verification/ref/include/verification.h new file mode 100644 index 0000000..af67469 --- /dev/null +++ b/src/verification/ref/include/verification.h @@ -0,0 +1,123 @@ +/** @file + * + * @brief The verification protocol + */ + +#ifndef VERIFICATION_H +#define VERIFICATION_H + +#include +#include + +/** @defgroup verification SQIsignHD verification protocol + * @{ + */ + +/** @defgroup verification_t Types for SQIsignHD verification protocol + * @{ + */ + +typedef digit_t scalar_t[NWORDS_ORDER]; +typedef scalar_t scalar_mtx_2x2_t[2][2]; + +/** @brief Type for the signature + * + * @typedef signature_t + * + * @struct signature + * + */ +typedef struct signature +{ + fp2_t E_aux_A; // the Montgomery A-coefficient for the auxiliary curve + uint8_t backtracking; + uint8_t two_resp_length; + scalar_mtx_2x2_t mat_Bchall_can_to_B_chall; // the matrix of the desired basis + scalar_t chall_coeff; + uint8_t hint_aux; + uint8_t hint_chall; +} signature_t; + +/** @brief Type for the public keys + * + * @typedef public_key_t + * + * @struct public_key + * + */ +typedef struct public_key +{ + ec_curve_t curve; // the normalized A-coefficient of the Montgomery curve + uint8_t hint_pk; +} public_key_t; + +/** @} + */ + +/*************************** Functions *****************************/ + +void public_key_init(public_key_t *pk); +void public_key_finalize(public_key_t *pk); + +void hash_to_challenge(scalar_t *scalar, + const public_key_t *pk, + const ec_curve_t *com_curve, + const unsigned char *message, + size_t length); + +/** + * @brief Verification + * + * @param sig signature + * @param pk public key + * @param m message + * @param l size + * @returns 1 if the signature verifies, 0 otherwise + */ +int protocols_verify(signature_t *sig, const public_key_t *pk, const unsigned char *m, size_t l); + +/*************************** Encoding *****************************/ + +/** @defgroup encoding Encoding and decoding functions + * @{ + */ + +/** + * @brief Encodes a signature as a byte array + * + * @param enc : Byte array to encode the signature in + * @param sig : Signature to encode + */ +void signature_to_bytes(unsigned char *enc, const signature_t *sig); + +/** + * @brief Decodes a signature from a byte array + * + * @param sig : Structure to decode the signature in + * @param enc : Byte array to decode + */ +void signature_from_bytes(signature_t *sig, const unsigned char *enc); + +/** + * @brief Encodes a public key as a byte array + * + * @param enc : Byte array to encode the public key in + * @param pk : Public key to encode + */ +unsigned char *public_key_to_bytes(unsigned char *enc, const public_key_t *pk); + +/** + * @brief Decodes a public key from a byte array + * + * @param pk : Structure to decode the public key in + * @param enc : Byte array to decode + */ +const unsigned char *public_key_from_bytes(public_key_t *pk, const unsigned char *enc); + +/** @} + */ + +/** @} + */ + +#endif diff --git a/src/verification/ref/lvl1/CMakeLists.txt b/src/verification/ref/lvl1/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/verification/ref/lvl1/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/verification/ref/lvl3/CMakeLists.txt b/src/verification/ref/lvl3/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/verification/ref/lvl3/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/verification/ref/lvl5/CMakeLists.txt b/src/verification/ref/lvl5/CMakeLists.txt new file mode 100644 index 0000000..c7637fa --- /dev/null +++ b/src/verification/ref/lvl5/CMakeLists.txt @@ -0,0 +1 @@ +include(../lvlx.cmake) diff --git a/src/verification/ref/lvlx.cmake b/src/verification/ref/lvlx.cmake new file mode 100644 index 0000000..2a4e96b --- /dev/null +++ b/src/verification/ref/lvlx.cmake @@ -0,0 +1,11 @@ +set(SOURCE_FILES_VERIFICATION_GENERIC_REF + ${LVLX_DIR}/common.c + ${LVLX_DIR}/encode_verification.c + ${LVLX_DIR}/verify.c +) + +add_library(${LIB_VERIFICATION_${SVARIANT_UPPER}} STATIC ${SOURCE_FILES_VERIFICATION_GENERIC_REF}) +target_link_libraries(${LIB_VERIFICATION_${SVARIANT_UPPER}} ${LIB_PRECOMP_${SVARIANT_UPPER}} ${LIB_MP} ${LIB_GF_${SVARIANT_UPPER}} ${LIB_EC_${SVARIANT_UPPER}} ${LIB_HD_${SVARIANT_UPPER}}) +target_include_directories(${LIB_VERIFICATION_${SVARIANT_UPPER}} PRIVATE ${INC_PUBLIC} ${INC_COMMON} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_MP} ${INC_GF} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_HD} ${INC_VERIFICATION}) +target_compile_options(${LIB_VERIFICATION_${SVARIANT_UPPER}} PRIVATE ${C_OPT_FLAGS}) +target_compile_definitions(${LIB_VERIFICATION_${SVARIANT_UPPER}} PUBLIC SQISIGN_VARIANT=${SVARIANT_LOWER}) diff --git a/src/verification/ref/lvlx/common.c b/src/verification/ref/lvlx/common.c new file mode 100644 index 0000000..d393e9c --- /dev/null +++ b/src/verification/ref/lvlx/common.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include +#include + +void +public_key_init(public_key_t *pk) +{ + ec_curve_init(&pk->curve); +} + +void +public_key_finalize(public_key_t *pk) +{ +} + +// compute the challenge as the hash of the message and the commitment curve and public key +void +hash_to_challenge(scalar_t *scalar, + const public_key_t *pk, + const ec_curve_t *com_curve, + const unsigned char *message, + size_t length) +{ + unsigned char buf[2 * FP2_ENCODED_BYTES]; + { + fp2_t j1, j2; + ec_j_inv(&j1, &pk->curve); + ec_j_inv(&j2, com_curve); + fp2_encode(buf, &j1); + fp2_encode(buf + FP2_ENCODED_BYTES, &j2); + } + + { + // The type scalar_t represents an element of GF(p), which is about + // 2*lambda bits, where lambda = 128, 192 or 256, according to the + // security level. Thus, the variable scalar should have enough memory + // for the values produced by SHAKE256 in the intermediate iterations. + + shake256incctx ctx; + + size_t hash_bytes = ((2 * SECURITY_BITS) + 7) / 8; + size_t limbs = (hash_bytes + sizeof(digit_t) - 1) / sizeof(digit_t); + size_t bits = (2 * SECURITY_BITS) % RADIX; + digit_t mask = ((digit_t)-1) >> ((RADIX - bits) % RADIX); +#ifdef TARGET_BIG_ENDIAN + mask = BSWAP_DIGIT(mask); +#endif + + shake256_inc_init(&ctx); + shake256_inc_absorb(&ctx, buf, 2 * FP2_ENCODED_BYTES); + shake256_inc_absorb(&ctx, message, length); + shake256_inc_finalize(&ctx); + shake256_inc_squeeze((void *)(*scalar), hash_bytes, &ctx); + (*scalar)[limbs - 1] &= mask; + for (int i = 2; i < HASH_ITERATIONS; i++) { + shake256_inc_init(&ctx); + shake256_inc_absorb(&ctx, (void *)(*scalar), hash_bytes); + shake256_inc_finalize(&ctx); + shake256_inc_squeeze((void *)(*scalar), hash_bytes, &ctx); + (*scalar)[limbs - 1] &= mask; + } + shake256_inc_init(&ctx); + shake256_inc_absorb(&ctx, (void *)(*scalar), hash_bytes); + shake256_inc_finalize(&ctx); + + hash_bytes = ((TORSION_EVEN_POWER - SQIsign_response_length) + 7) / 8; + limbs = (hash_bytes + sizeof(digit_t) - 1) / sizeof(digit_t); + bits = (TORSION_EVEN_POWER - SQIsign_response_length) % RADIX; + mask = ((digit_t)-1) >> ((RADIX - bits) % RADIX); +#ifdef TARGET_BIG_ENDIAN + mask = BSWAP_DIGIT(mask); +#endif + + memset(*scalar, 0, NWORDS_ORDER * sizeof(digit_t)); + shake256_inc_squeeze((void *)(*scalar), hash_bytes, &ctx); + (*scalar)[limbs - 1] &= mask; + +#ifdef TARGET_BIG_ENDIAN + for (int i = 0; i < NWORDS_ORDER; i++) + (*scalar)[i] = BSWAP_DIGIT((*scalar)[i]); +#endif + + mp_mod_2exp(*scalar, SECURITY_BITS, NWORDS_ORDER); + } +} diff --git a/src/verification/ref/lvlx/encode_verification.c b/src/verification/ref/lvlx/encode_verification.c new file mode 100644 index 0000000..fecdb9c --- /dev/null +++ b/src/verification/ref/lvlx/encode_verification.c @@ -0,0 +1,220 @@ +#include +#include +#include +#include +#include +#include + +typedef unsigned char byte_t; + +// digits + +static void +encode_digits(byte_t *enc, const digit_t *x, size_t nbytes) +{ +#ifdef TARGET_BIG_ENDIAN + const size_t ndigits = nbytes / sizeof(digit_t); + const size_t rem = nbytes % sizeof(digit_t); + + for (size_t i = 0; i < ndigits; i++) + ((digit_t *)enc)[i] = BSWAP_DIGIT(x[i]); + if (rem) { + digit_t ld = BSWAP_DIGIT(x[ndigits]); + memcpy(enc + ndigits * sizeof(digit_t), (byte_t *)&ld, rem); + } +#else + memcpy(enc, (const byte_t *)x, nbytes); +#endif +} + +static void +decode_digits(digit_t *x, const byte_t *enc, size_t nbytes, size_t ndigits) +{ + assert(nbytes <= ndigits * sizeof(digit_t)); + memcpy((byte_t *)x, enc, nbytes); + memset((byte_t *)x + nbytes, 0, ndigits * sizeof(digit_t) - nbytes); + +#ifdef TARGET_BIG_ENDIAN + for (size_t i = 0; i < ndigits; i++) + x[i] = BSWAP_DIGIT(x[i]); +#endif +} + +// fp2_t + +static byte_t * +fp2_to_bytes(byte_t *enc, const fp2_t *x) +{ + fp2_encode(enc, x); + return enc + FP2_ENCODED_BYTES; +} + +static const byte_t * +fp2_from_bytes(fp2_t *x, const byte_t *enc) +{ + fp2_decode(x, enc); + return enc + FP2_ENCODED_BYTES; +} + +// curves and points + +static byte_t * +proj_to_bytes(byte_t *enc, const fp2_t *x, const fp2_t *z) +{ + assert(!fp2_is_zero(z)); + fp2_t tmp = *z; + fp2_inv(&tmp); +#ifndef NDEBUG + { + fp2_t chk; + fp2_mul(&chk, z, &tmp); + fp2_t one; + fp2_set_one(&one); + assert(fp2_is_equal(&chk, &one)); + } +#endif + fp2_mul(&tmp, x, &tmp); + enc = fp2_to_bytes(enc, &tmp); + return enc; +} + +static const byte_t * +proj_from_bytes(fp2_t *x, fp2_t *z, const byte_t *enc) +{ + enc = fp2_from_bytes(x, enc); + fp2_set_one(z); + return enc; +} + +static byte_t * +ec_curve_to_bytes(byte_t *enc, const ec_curve_t *curve) +{ + return proj_to_bytes(enc, &curve->A, &curve->C); +} + +static const byte_t * +ec_curve_from_bytes(ec_curve_t *curve, const byte_t *enc) +{ + memset(curve, 0, sizeof(*curve)); + return proj_from_bytes(&curve->A, &curve->C, enc); +} + +static byte_t * +ec_point_to_bytes(byte_t *enc, const ec_point_t *point) +{ + return proj_to_bytes(enc, &point->x, &point->z); +} + +static const byte_t * +ec_point_from_bytes(ec_point_t *point, const byte_t *enc) +{ + return proj_from_bytes(&point->x, &point->z, enc); +} + +static byte_t * +ec_basis_to_bytes(byte_t *enc, const ec_basis_t *basis) +{ + enc = ec_point_to_bytes(enc, &basis->P); + enc = ec_point_to_bytes(enc, &basis->Q); + enc = ec_point_to_bytes(enc, &basis->PmQ); + return enc; +} + +static const byte_t * +ec_basis_from_bytes(ec_basis_t *basis, const byte_t *enc) +{ + enc = ec_point_from_bytes(&basis->P, enc); + enc = ec_point_from_bytes(&basis->Q, enc); + enc = ec_point_from_bytes(&basis->PmQ, enc); + return enc; +} + +// public API + +byte_t * +public_key_to_bytes(byte_t *enc, const public_key_t *pk) +{ +#ifndef NDEBUG + const byte_t *const start = enc; +#endif + enc = ec_curve_to_bytes(enc, &pk->curve); + *enc++ = pk->hint_pk; + assert(enc - start == PUBLICKEY_BYTES); + return enc; +} + +const byte_t * +public_key_from_bytes(public_key_t *pk, const byte_t *enc) +{ +#ifndef NDEBUG + const byte_t *const start = enc; +#endif + enc = ec_curve_from_bytes(&pk->curve, enc); + pk->hint_pk = *enc++; + assert(enc - start == PUBLICKEY_BYTES); + return enc; +} + +void +signature_to_bytes(byte_t *enc, const signature_t *sig) +{ +#ifndef NDEBUG + byte_t *const start = enc; +#endif + + enc = fp2_to_bytes(enc, &sig->E_aux_A); + + *enc++ = sig->backtracking; + *enc++ = sig->two_resp_length; + + size_t nbytes = (SQIsign_response_length + 9) / 8; + encode_digits(enc, sig->mat_Bchall_can_to_B_chall[0][0], nbytes); + enc += nbytes; + encode_digits(enc, sig->mat_Bchall_can_to_B_chall[0][1], nbytes); + enc += nbytes; + encode_digits(enc, sig->mat_Bchall_can_to_B_chall[1][0], nbytes); + enc += nbytes; + encode_digits(enc, sig->mat_Bchall_can_to_B_chall[1][1], nbytes); + enc += nbytes; + + nbytes = SECURITY_BITS / 8; + encode_digits(enc, sig->chall_coeff, nbytes); + enc += nbytes; + + *enc++ = sig->hint_aux; + *enc++ = sig->hint_chall; + + assert(enc - start == SIGNATURE_BYTES); +} + +void +signature_from_bytes(signature_t *sig, const byte_t *enc) +{ +#ifndef NDEBUG + const byte_t *const start = enc; +#endif + + enc = fp2_from_bytes(&sig->E_aux_A, enc); + + sig->backtracking = *enc++; + sig->two_resp_length = *enc++; + + size_t nbytes = (SQIsign_response_length + 9) / 8; + decode_digits(sig->mat_Bchall_can_to_B_chall[0][0], enc, nbytes, NWORDS_ORDER); + enc += nbytes; + decode_digits(sig->mat_Bchall_can_to_B_chall[0][1], enc, nbytes, NWORDS_ORDER); + enc += nbytes; + decode_digits(sig->mat_Bchall_can_to_B_chall[1][0], enc, nbytes, NWORDS_ORDER); + enc += nbytes; + decode_digits(sig->mat_Bchall_can_to_B_chall[1][1], enc, nbytes, NWORDS_ORDER); + enc += nbytes; + + nbytes = SECURITY_BITS / 8; + decode_digits(sig->chall_coeff, enc, nbytes, NWORDS_ORDER); + enc += nbytes; + + sig->hint_aux = *enc++; + sig->hint_chall = *enc++; + + assert(enc - start == SIGNATURE_BYTES); +} diff --git a/src/verification/ref/lvlx/verify.c b/src/verification/ref/lvlx/verify.c new file mode 100644 index 0000000..b5f78ad --- /dev/null +++ b/src/verification/ref/lvlx/verify.c @@ -0,0 +1,309 @@ +#include +#include +#include +#include +#include + +// Check that the basis change matrix elements are canonical +// representatives modulo 2^(SQIsign_response_length + 2). +static int +check_canonical_basis_change_matrix(const signature_t *sig) +{ + // This works as long as all values in sig->mat_Bchall_can_to_B_chall are + // positive integers. + int ret = 1; + scalar_t aux; + + memset(aux, 0, NWORDS_ORDER * sizeof(digit_t)); + aux[0] = 0x1; + multiple_mp_shiftl(aux, SQIsign_response_length + HD_extra_torsion - (int)sig->backtracking, NWORDS_ORDER); + + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + if (mp_compare(aux, sig->mat_Bchall_can_to_B_chall[i][j], NWORDS_ORDER) <= 0) { + ret = 0; + } + } + } + + return ret; +} + +// Compute the 2^n isogeny from the signature with kernel +// P + [chall_coeff]Q and store the codomain in E_chall +static int +compute_challenge_verify(ec_curve_t *E_chall, const signature_t *sig, const ec_curve_t *Epk, const uint8_t hint_pk) +{ + ec_basis_t bas_EA; + ec_isog_even_t phi_chall; + + // Set domain and length of 2^n isogeny + copy_curve(&phi_chall.curve, Epk); + phi_chall.length = TORSION_EVEN_POWER - sig->backtracking; + + // Compute the basis from the supplied hint + if (!ec_curve_to_basis_2f_from_hint(&bas_EA, &phi_chall.curve, TORSION_EVEN_POWER, hint_pk)) // canonical + return 0; + + // recovering the exact challenge + { + if (!ec_ladder3pt(&phi_chall.kernel, sig->chall_coeff, &bas_EA.P, &bas_EA.Q, &bas_EA.PmQ, &phi_chall.curve)) { + return 0; + }; + } + + // Double the kernel until is has the correct order + ec_dbl_iter(&phi_chall.kernel, sig->backtracking, &phi_chall.kernel, &phi_chall.curve); + + // Compute the codomain + copy_curve(E_chall, &phi_chall.curve); + if (ec_eval_even(E_chall, &phi_chall, NULL, 0)) + return 0; + return 1; +} + +// same as matrix_application_even_basis() in id2iso.c, with some modifications: +// - this version works with a matrix of scalars (not ibz_t). +// - reduction modulo 2^f of matrix elements is removed here, because it is +// assumed that the elements are already cannonical representatives modulo +// 2^f; this is ensured by calling check_canonical_basis_change_matrix() at +// the beginning of protocols_verify(). +static int +matrix_scalar_application_even_basis(ec_basis_t *bas, const ec_curve_t *E, scalar_mtx_2x2_t *mat, int f) +{ + scalar_t scalar0, scalar1; + memset(scalar0, 0, NWORDS_ORDER * sizeof(digit_t)); + memset(scalar1, 0, NWORDS_ORDER * sizeof(digit_t)); + + ec_basis_t tmp_bas; + copy_basis(&tmp_bas, bas); + + // For a matrix [[a, c], [b, d]] we compute: + // + // first basis element R = [a]P + [b]Q + if (!ec_biscalar_mul(&bas->P, (*mat)[0][0], (*mat)[1][0], f, &tmp_bas, E)) + return 0; + // second basis element S = [c]P + [d]Q + if (!ec_biscalar_mul(&bas->Q, (*mat)[0][1], (*mat)[1][1], f, &tmp_bas, E)) + return 0; + // Their difference R - S = [a - c]P + [b - d]Q + mp_sub(scalar0, (*mat)[0][0], (*mat)[0][1], NWORDS_ORDER); + mp_mod_2exp(scalar0, f, NWORDS_ORDER); + mp_sub(scalar1, (*mat)[1][0], (*mat)[1][1], NWORDS_ORDER); + mp_mod_2exp(scalar1, f, NWORDS_ORDER); + return ec_biscalar_mul(&bas->PmQ, scalar0, scalar1, f, &tmp_bas, E); +} + +// Compute the bases for the challenge and auxillary curve from +// the canonical bases. Challenge basis is reconstructed from the +// compressed scalars within the challenge. +static int +challenge_and_aux_basis_verify(ec_basis_t *B_chall_can, + ec_basis_t *B_aux_can, + ec_curve_t *E_chall, + ec_curve_t *E_aux, + signature_t *sig, + const int pow_dim2_deg_resp) +{ + + // recovering the canonical basis as TORSION_EVEN_POWER for consistency with signing + if (!ec_curve_to_basis_2f_from_hint(B_chall_can, E_chall, TORSION_EVEN_POWER, sig->hint_chall)) + return 0; + + // setting to the right order + ec_dbl_iter_basis(B_chall_can, + TORSION_EVEN_POWER - pow_dim2_deg_resp - HD_extra_torsion - sig->two_resp_length, + B_chall_can, + E_chall); + + if (!ec_curve_to_basis_2f_from_hint(B_aux_can, E_aux, TORSION_EVEN_POWER, sig->hint_aux)) + return 0; + + // setting to the right order + ec_dbl_iter_basis(B_aux_can, TORSION_EVEN_POWER - pow_dim2_deg_resp - HD_extra_torsion, B_aux_can, E_aux); + +#ifndef NDEBUG + if (!test_basis_order_twof(B_chall_can, E_chall, HD_extra_torsion + pow_dim2_deg_resp + sig->two_resp_length)) + debug_print("canonical basis has wrong order, expect something to fail"); +#endif + + // applying the change matrix on the basis of E_chall + return matrix_scalar_application_even_basis(B_chall_can, + E_chall, + &sig->mat_Bchall_can_to_B_chall, + pow_dim2_deg_resp + HD_extra_torsion + sig->two_resp_length); +} + +// When two_resp_length is non-zero, we must compute a small 2^n-isogeny +// updating E_chall as the codomain as well as push the basis on E_chall +// through this isogeny +static int +two_response_isogeny_verify(ec_curve_t *E_chall, ec_basis_t *B_chall_can, const signature_t *sig, int pow_dim2_deg_resp) +{ + ec_point_t ker, points[3]; + + // choosing the right point for the small two_isogenies + if (mp_is_even(sig->mat_Bchall_can_to_B_chall[0][0], NWORDS_ORDER) && + mp_is_even(sig->mat_Bchall_can_to_B_chall[1][0], NWORDS_ORDER)) { + copy_point(&ker, &B_chall_can->Q); + } else { + copy_point(&ker, &B_chall_can->P); + } + + copy_point(&points[0], &B_chall_can->P); + copy_point(&points[1], &B_chall_can->Q); + copy_point(&points[2], &B_chall_can->PmQ); + + ec_dbl_iter(&ker, pow_dim2_deg_resp + HD_extra_torsion, &ker, E_chall); + +#ifndef NDEBUG + if (!test_point_order_twof(&ker, E_chall, sig->two_resp_length)) + debug_print("kernel does not have order 2^(two_resp_length"); +#endif + + if (ec_eval_small_chain(E_chall, &ker, sig->two_resp_length, points, 3, false)) { + return 0; + } + +#ifndef NDEBUG + if (!test_point_order_twof(&points[0], E_chall, HD_extra_torsion + pow_dim2_deg_resp)) + debug_print("points[0] does not have order 2^(HD_extra_torsion + pow_dim2_deg_resp"); + if (!test_point_order_twof(&points[1], E_chall, HD_extra_torsion + pow_dim2_deg_resp)) + debug_print("points[1] does not have order 2^(HD_extra_torsion + pow_dim2_deg_resp"); + if (!test_point_order_twof(&points[2], E_chall, HD_extra_torsion + pow_dim2_deg_resp)) + debug_print("points[2] does not have order 2^(HD_extra_torsion + pow_dim2_deg_resp"); +#endif + + copy_point(&B_chall_can->P, &points[0]); + copy_point(&B_chall_can->Q, &points[1]); + copy_point(&B_chall_can->PmQ, &points[2]); + return 1; +} + +// The commitment curve can be recovered from the codomain of the 2D +// isogeny built from the bases computed during verification. +static int +compute_commitment_curve_verify(ec_curve_t *E_com, + const ec_basis_t *B_chall_can, + const ec_basis_t *B_aux_can, + const ec_curve_t *E_chall, + const ec_curve_t *E_aux, + int pow_dim2_deg_resp) + +{ +#ifndef NDEBUG + // Check all the points are the correct order + if (!test_basis_order_twof(B_chall_can, E_chall, HD_extra_torsion + pow_dim2_deg_resp)) + debug_print("B_chall_can does not have order 2^(HD_extra_torsion + pow_dim2_deg_resp"); + + if (!test_basis_order_twof(B_aux_can, E_aux, HD_extra_torsion + pow_dim2_deg_resp)) + debug_print("B_aux_can does not have order 2^(HD_extra_torsion + pow_dim2_deg_resp"); +#endif + + // now compute the dim2 isogeny from Echall x E_aux -> E_com x E_aux' + // of kernel B_chall_can x B_aux_can + + // first we set-up the kernel + theta_couple_curve_t EchallxEaux; + copy_curve(&EchallxEaux.E1, E_chall); + copy_curve(&EchallxEaux.E2, E_aux); + + theta_kernel_couple_points_t dim_two_ker; + copy_bases_to_kernel(&dim_two_ker, B_chall_can, B_aux_can); + + // computing the isogeny + theta_couple_curve_t codomain; + int codomain_splits; + ec_curve_init(&codomain.E1); + ec_curve_init(&codomain.E2); + // handling the special case where we don't need to perform any dim2 computation + if (pow_dim2_deg_resp == 0) { + codomain_splits = 1; + copy_curve(&codomain.E1, &EchallxEaux.E1); + copy_curve(&codomain.E2, &EchallxEaux.E2); + // We still need to check that E_chall is supersingular + // This assumes that HD_extra_torsion == 2 + if (!ec_is_basis_four_torsion(B_chall_can, E_chall)) { + return 0; + } + } else { + codomain_splits = theta_chain_compute_and_eval_verify( + pow_dim2_deg_resp, &EchallxEaux, &dim_two_ker, true, &codomain, NULL, 0); + } + + // computing the commitment curve + // its always the first one because of our (2^n,2^n)-isogeny formulae + copy_curve(E_com, &codomain.E1); + + return codomain_splits; +} + +// SQIsign verification +int +protocols_verify(signature_t *sig, const public_key_t *pk, const unsigned char *m, size_t l) +{ + int verify; + + if (!check_canonical_basis_change_matrix(sig)) + return 0; + + // Computation of the length of the dim 2 2^n isogeny + int pow_dim2_deg_resp = SQIsign_response_length - (int)sig->two_resp_length - (int)sig->backtracking; + + // basic sanity test: checking that the response is not too long + if (pow_dim2_deg_resp < 0) + return 0; + // The dim 2 isogeny embeds a dim 1 isogeny of odd degree, so it can + // never be of length 2. + if (pow_dim2_deg_resp == 1) + return 0; + + // check the public curve is valid + if (!ec_curve_verify_A(&(pk->curve).A)) + return 0; + + // Set auxiliary curve from the A-coefficient within the signature + ec_curve_t E_aux; + if (!ec_curve_init_from_A(&E_aux, &sig->E_aux_A)) + return 0; // invalid curve + + // checking that we are given A-coefficients and no precomputation + assert(fp2_is_one(&pk->curve.C) == 0xFFFFFFFF && !pk->curve.is_A24_computed_and_normalized); + + // computation of the challenge + ec_curve_t E_chall; + if (!compute_challenge_verify(&E_chall, sig, &pk->curve, pk->hint_pk)) { + return 0; + } + + // Computation of the canonical bases for the challenge and aux curve + ec_basis_t B_chall_can, B_aux_can; + + if (!challenge_and_aux_basis_verify(&B_chall_can, &B_aux_can, &E_chall, &E_aux, sig, pow_dim2_deg_resp)) { + return 0; + } + + // When two_resp_length != 0 we need to compute a second, short 2^r-isogeny + if (sig->two_resp_length > 0) { + if (!two_response_isogeny_verify(&E_chall, &B_chall_can, sig, pow_dim2_deg_resp)) { + return 0; + } + } + + // We can recover the commitment curve with a 2D isogeny + // The supplied signature did not compute an isogeny between eliptic products + // and so definitely is an invalid signature. + ec_curve_t E_com; + if (!compute_commitment_curve_verify(&E_com, &B_chall_can, &B_aux_can, &E_chall, &E_aux, pow_dim2_deg_resp)) + return 0; + + scalar_t chk_chall; + + // recomputing the challenge vector + hash_to_challenge(&chk_chall, pk, &E_com, m, l); + + // performing the final check + verify = mp_compare(sig->chall_coeff, chk_chall, NWORDS_ORDER) == 0; + + return verify; +} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e429faa..718786f 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,27 +1,22 @@ # SPDX-License-Identifier: Apache-2.0 FOREACH(SVARIANT ${SVARIANT_S}) + string(TOLOWER ${SVARIANT} SVARIANT_LOWER) string(TOUPPER ${SVARIANT} SVARIANT_UPPER) + add_executable(sqisign_test_kat_${SVARIANT} test_kat.c) target_link_libraries(sqisign_test_kat_${SVARIANT} sqisign_${SVARIANT_LOWER}_test) target_include_directories(sqisign_test_kat_${SVARIANT} PRIVATE ${PROJECT_SOURCE_DIR}/src/nistapi/${SVARIANT_LOWER} ${INC_PUBLIC} ${INC_INTBIG} ${INC_PRECOMP_${SVARIANT_UPPER}} ${INC_QUATERNION} ${INC_KLPT} ${INC_GF_${SVARIANT_UPPER}} ${INC_EC} ${INC_COMMON} ${INC_ID2ISO} ${INC_PROTOCOLS}) + add_test(sqisign_${SVARIANT}_KAT sqisign_test_kat_${SVARIANT}) - add_executable(sqisign_bench_${SVARIANT} bench.c) - target_link_libraries(sqisign_bench_${SVARIANT} sqisign_${SVARIANT_LOWER}) - target_include_directories(sqisign_bench_${SVARIANT} PUBLIC ${PROJECT_SOURCE_DIR}/src/common ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/nistapi/${SVARIANT_LOWER}) + if (ENABLE_SIGN) - add_executable(sqisign_test_scheme_${SVARIANT} test_sqisign.c) - target_link_libraries(sqisign_test_scheme_${SVARIANT} sqisign_${SVARIANT_LOWER}) - target_include_directories(sqisign_test_scheme_${SVARIANT} PUBLIC ${PROJECT_SOURCE_DIR}/src/common ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/nistapi/${SVARIANT_LOWER}) + add_executable(sqisign_test_scheme_${SVARIANT} test_sqisign.c) + target_link_libraries(sqisign_test_scheme_${SVARIANT} sqisign_${SVARIANT_LOWER}) + target_include_directories(sqisign_test_scheme_${SVARIANT} PUBLIC ${PROJECT_SOURCE_DIR}/src/common ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/nistapi/${SVARIANT_LOWER}) + add_test(sqisign_${SVARIANT}_SELFTEST sqisign_test_scheme_${SVARIANT}) - add_executable(sqisign_test_prof_${SVARIANT} test_sqisign_prof.c) - target_link_libraries(sqisign_test_prof_${SVARIANT} sqisign_${SVARIANT_LOWER}) - target_include_directories(sqisign_test_prof_${SVARIANT} PUBLIC ${PROJECT_SOURCE_DIR}/src/common ${INC_PUBLIC} ${PROJECT_SOURCE_DIR}/src/nistapi/${SVARIANT_LOWER}) + endif() - add_test(sqisign_${SVARIANT}_KAT sqisign_test_kat_${SVARIANT} 0) # testing only the first KAT - add_test(sqisign_${SVARIANT}_SELFTEST sqisign_test_scheme_${SVARIANT}) - - set_tests_properties(sqisign_${SVARIANT}_KAT PROPERTIES TIMEOUT 0) ENDFOREACH() - diff --git a/test/bench.c b/test/bench.c deleted file mode 100644 index 10232a0..0000000 --- a/test/bench.c +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include -#include -#include -#include -#include -#include - - -#if defined(TARGET_OS_UNIX) && (defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_OTHER)) -#include -#endif -#if (defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_S390X) || defined(TARGET_OTHER)) -#define print_unit printf("nsec\n"); -#else -#define print_unit printf("cycles\n"); -#endif - -static int bench_sig(int runs, int csv); -static inline int64_t cpucycles(void); - -int main(int argc, char *argv[]) { - int rc = 0; - -#ifndef NDEBUG -fprintf(stderr, "\x1b[31mIt looks like SQIsign was compiled with assertions enabled.\n" - "This will severely impact performance measurements.\x1b[0m\n"); -#endif - - if (argc < 2) { - printf("One argument needed\n"); - rc = 1; - goto end; - } - int runs = atoi(argv[1]); - rc = bench_sig(runs, 0); -end: - return rc; -} - -#if (defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_S390X)) -#define BENCH_UNITS "nsec" -#else -#define BENCH_UNITS "cycles" -#endif - -int cmpfunc (const void *a, const void *b) { - return ( *(uint64_t *)a - * (uint64_t *)b ); -} - -#define BENCH_CODE_1(r) \ - cycles = 0; \ - for (i = 0; i < (r); ++i) { \ - cycles1 = cpucycles(); - -#define BENCH_CODE_2(name, csv) \ - cycles2 = cpucycles(); \ - if(i < LIST_SIZE) \ - cycles_list[i] = (cycles2 - cycles1);\ - cycles = cycles + (cycles2 - cycles1); \ - } \ - qsort(cycles_list, (runs < LIST_SIZE)? runs : LIST_SIZE, sizeof(uint64_t), cmpfunc);\ - if (csv) \ - printf("%2" PRId64 ",", cycles_list[(runs < LIST_SIZE)? runs/2 : LIST_SIZE/2]); \ - else { \ - printf(" %-20s-> median: %2" PRId64 ", average: %2" PRId64 " ", name, \ - cycles_list[(runs < LIST_SIZE)? runs/2 : LIST_SIZE/2], (cycles / runs)); \ - printf("%s\n", BENCH_UNITS); \ - } - -#define LIST_SIZE 10000 - -static int bench_sig(int runs, int csv) { - - int rc = 0; - int i; - - int64_t cycles, cycles1, cycles2; - int64_t cycles_list[10000]; - - const int m_len = 32; - - unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); - unsigned char *sk = calloc(CRYPTO_SECRETKEYBYTES, 1); - unsigned char *sig = calloc(CRYPTO_BYTES + m_len, 1); - unsigned char *m = calloc(m_len, 1); - unsigned long long len = CRYPTO_BYTES; - - if (csv) { - printf("%s,", CRYPTO_ALGNAME); - } else { - printf("Benchmarking %s\n", CRYPTO_ALGNAME); - } - - BENCH_CODE_1(runs); - sqisign_keypair(pk, sk); - BENCH_CODE_2("sqisign_keypair", csv); - - BENCH_CODE_1(runs); - sqisign_sign(sig, &len, m, m_len, sk); - BENCH_CODE_2("sqisign_sign", csv); - - len = 32; - BENCH_CODE_1(runs); - sqisign_open(m, &len, sig, CRYPTO_BYTES, pk); - BENCH_CODE_2("sqisign_verify", csv); - - if (csv) { - printf("\n"); - } - - free(pk); - free(sk); - free(sig); - free(m); - return rc; -} - -static inline int64_t cpucycles(void) { -#if (defined(TARGET_AMD64) || defined(TARGET_X86)) - unsigned int hi, lo; - - asm volatile ("rdtsc" : "=a" (lo), "=d"(hi)); - return ((int64_t) lo) | (((int64_t) hi) << 32); -#elif (defined(TARGET_S390X)) - uint64_t tod; - asm volatile("stckf %0\n" : "=Q" (tod) : : "cc"); - return (tod * 1000 / 4096); -#else - struct timespec time; - clock_gettime(CLOCK_REALTIME, &time); - return (int64_t)(time.tv_sec * 1e9 + time.tv_nsec); -#endif -} diff --git a/test/test_kat.c b/test/test_kat.c index e27bd34..f68f8df 100644 --- a/test/test_kat.c +++ b/test/test_kat.c @@ -37,17 +37,22 @@ int main(int argc, char *argv[]) { static int test_sig_kat(int cnt) { +#if defined(ENABLE_SIGN) unsigned char seed[48]; - unsigned char *m, *sm, *m1, *sm_rsp; + unsigned char sk[CRYPTO_SECRETKEYBYTES]; + unsigned char pk[CRYPTO_PUBLICKEYBYTES]; + unsigned char sk_rsp[CRYPTO_SECRETKEYBYTES]; + unsigned char *sm; +#endif + unsigned char pk_rsp[CRYPTO_PUBLICKEYBYTES]; + unsigned char *m, *m1, *sm_rsp; unsigned long long mlen, smlen, mlen1; int count; int done; - unsigned char pk[CRYPTO_PUBLICKEYBYTES], sk[CRYPTO_SECRETKEYBYTES]; int ret_val; char fn_rsp[64]; FILE *fp_rsp; - unsigned char pk_rsp[CRYPTO_PUBLICKEYBYTES], sk_rsp[CRYPTO_SECRETKEYBYTES]; sprintf(fn_rsp, "../../KAT/PQCsignKAT_%d_%s.rsp", CRYPTO_SECRETKEYBYTES, CRYPTO_ALGNAME); if ( (fp_rsp = fopen(fn_rsp, "r")) == NULL ) { @@ -57,6 +62,7 @@ static int test_sig_kat(int cnt) { done = 0; do { + if ( FindMarker(fp_rsp, "count = ") ) { ret_val = fscanf(fp_rsp, "%d", &count); } else { @@ -67,12 +73,14 @@ static int test_sig_kat(int cnt) { if (cnt != -1 && cnt != count) continue; +#if defined(ENABLE_SIGN) if ( !ReadHex(fp_rsp, seed, 48, "seed = ") ) { printf("ERROR: unable to read 'seed' from <%s>\n", fn_rsp); return KAT_DATA_ERROR; } randombytes_init(seed, NULL, 256); +#endif if ( FindMarker(fp_rsp, "mlen = ") ) { ret_val = fscanf(fp_rsp, "%lld", &mlen); @@ -83,7 +91,9 @@ static int test_sig_kat(int cnt) { m = (unsigned char *)calloc(mlen, sizeof(unsigned char)); m1 = (unsigned char *)calloc(mlen, sizeof(unsigned char)); +#if defined(ENABLE_SIGN) sm = (unsigned char *)calloc(mlen + CRYPTO_BYTES, sizeof(unsigned char)); +#endif sm_rsp = (unsigned char *)calloc(mlen + CRYPTO_BYTES, sizeof(unsigned char)); if ( !ReadHex(fp_rsp, m, (int)mlen, "msg = ") ) { @@ -91,15 +101,20 @@ static int test_sig_kat(int cnt) { return KAT_DATA_ERROR; } +#if defined(ENABLE_SIGN) // Generate the public/private keypair if ( (ret_val = sqisign_keypair(pk, sk)) != 0) { printf("crypto_sign_keypair returned <%d>\n", ret_val); return KAT_CRYPTO_FAILURE; } +#endif + if ( !ReadHex(fp_rsp, pk_rsp, CRYPTO_PUBLICKEYBYTES, "pk = ") ) { printf("ERROR: unable to read 'pk' from <%s>\n", fn_rsp); return KAT_DATA_ERROR; } + +#if defined(ENABLE_SIGN) if ( !ReadHex(fp_rsp, sk_rsp, CRYPTO_SECRETKEYBYTES, "sk = ") ) { printf("ERROR: unable to read 'sk' from <%s>\n", fn_rsp); return KAT_DATA_ERROR; @@ -109,6 +124,7 @@ static int test_sig_kat(int cnt) { printf("ERROR: pk is different from <%s>\n", fn_rsp); return KAT_VERIFICATION_ERROR; } + if (memcmp(sk, sk_rsp, CRYPTO_SECRETKEYBYTES) != 0) { printf("ERROR: sk is different from <%s>\n", fn_rsp); return KAT_VERIFICATION_ERROR; @@ -129,11 +145,28 @@ static int test_sig_kat(int cnt) { return KAT_VERIFICATION_ERROR; } - if ( (ret_val = sqisign_open(m1, &mlen1, sm, smlen, pk)) != 0) { printf("crypto_sign_open returned <%d>\n", ret_val); return KAT_CRYPTO_FAILURE; } +#else + if ( FindMarker(fp_rsp, "smlen = ") ) { + ret_val = fscanf(fp_rsp, "%llu", &smlen); + } else { + printf("ERROR: unable to read 'smlen' from <%s>\n", fn_rsp); + return KAT_DATA_ERROR; + } + + if ( !ReadHex(fp_rsp, sm_rsp, smlen, "sm = ") ) { + printf("ERROR: unable to read 'sm' from <%s>\n", fn_rsp); + return KAT_DATA_ERROR; + } + + if ( (ret_val = sqisign_open(m1, &mlen1, sm_rsp, smlen, pk_rsp)) != 0 ) { + printf("crypto_sign_open returned <%d>\n", ret_val); + return KAT_CRYPTO_FAILURE; + } +#endif if ( mlen != mlen1 ) { printf("crypto_sign_open returned bad 'mlen': Got <%lld>, expected <%lld>\n", mlen1, mlen); @@ -147,7 +180,9 @@ static int test_sig_kat(int cnt) { free(m); free(m1); +#if defined(ENABLE_SIGN) free(sm); +#endif free(sm_rsp); } while ( !done ); diff --git a/test/test_sqisign.c b/test/test_sqisign.c index 5d47ba3..7c78b7f 100644 --- a/test/test_sqisign.c +++ b/test/test_sqisign.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 +#include #include #include #include @@ -7,6 +8,10 @@ #include #include #include +#include +#ifdef TARGET_BIG_ENDIAN +#include +#endif #ifdef ENABLE_CT_TESTING #include @@ -33,17 +38,18 @@ static void print_hex(const unsigned char *hex, int len) { } #endif - -static int test_sqisign() { +static int test_sqisign(unsigned long long in_msglen) { unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); unsigned char *sk = calloc(CRYPTO_SECRETKEYBYTES, 1); - unsigned char *sig = calloc(CRYPTO_BYTES + 32, 1); + unsigned char *sig = calloc(CRYPTO_BYTES + in_msglen, 1); - unsigned char seed[48] = { 0 }; - unsigned char msg[32] = { 0 }; - unsigned long long msglen = 32; + unsigned char *msg = malloc(in_msglen); + unsigned char *msg_open = malloc(in_msglen); - randombytes_init(seed, NULL, 256); + unsigned long long msglen = in_msglen; + + randombytes(msg, in_msglen); + randombytes(msg_open, in_msglen); printf("Testing Keygen, Sign, Open: %s\n", CRYPTO_ALGNAME); @@ -57,9 +63,9 @@ static int test_sqisign() { VALGRIND_MAKE_MEM_DEFINED(pk, CRYPTO_PUBLICKEYBYTES); #endif - unsigned long long smlen = CRYPTO_BYTES + 32; + unsigned long long smlen = CRYPTO_BYTES + in_msglen; - res = sqisign_sign(sig, &smlen, msg, 32, sk); + res = sqisign_sign(sig, &smlen, msg, in_msglen, sk); if (res != 0) { res = -1; goto err; @@ -76,14 +82,16 @@ static int test_sqisign() { VALGRIND_MAKE_MEM_DEFINED(sig, smlen); #endif - res = sqisign_open(msg, &msglen, sig, smlen, pk); - if (res != 0) { + res = sqisign_open(msg_open, &msglen, sig, smlen, pk); + if (res != 0 || msglen != in_msglen || memcmp(msg_open, msg, msglen)) { res = -1; goto err; } + randombytes(msg_open, in_msglen); + sig[0] = ~sig[0]; - res = sqisign_open(msg, &msglen, sig, smlen, pk); + res = sqisign_open(msg_open, &msglen, sig, smlen, pk); if (res != 1) { res = -1; goto err; @@ -91,20 +99,87 @@ static int test_sqisign() { res = 0; } + // Test with `sm` and `m` as the same buffer + msglen = in_msglen; + randombytes(msg, in_msglen); + memcpy(sig, msg, msglen); + + res = sqisign_sign(sig, &smlen, sig, in_msglen, sk); + if (res != 0) { + res = -1; + goto err; + } + + randombytes(msg_open, in_msglen); + + res = sqisign_open(msg_open, &msglen, sig, smlen, pk); + if (res != 0 || msglen != in_msglen || memcmp(msg_open, msg, msglen)) { + res = -1; + goto err; + } + + err: free(pk); free(sk); free(sig); + free(msg); + free(msg_open); return res; } int main(int argc, char *argv[]) { - int rc = 0; + uint32_t seed[12] = { 0 }; + int help = 0; + int seed_set = 0; + int msglen_set = 0; + int res = 0; + unsigned long long msglen = 32; - rc = test_sqisign(); + for (int i = 1; i < argc; i++) { + unsigned int _msglen; - if (rc != 0) { + if (!help && strcmp(argv[i], "--help") == 0) { + help = 1; + continue; + } + + if (!seed_set && !parse_seed(argv[i], seed)) { + seed_set = 1; + continue; + } + + if (!msglen_set && sscanf(argv[i], "--msglen=%u", &_msglen) == 1) { + msglen = (unsigned long long) _msglen; + msglen_set = 1; + } + } + + if (help) { + printf("Usage: %s [--seed=]\n", argv[0]); + printf("Where is the random seed to be used; if not present, a random seed is " + "generated\n"); + return 1; + } + + if (!seed_set) { + randombytes_select((unsigned char *)seed, sizeof(seed)); + } + + print_seed(seed); + +#if defined(TARGET_BIG_ENDIAN) + for (int i = 0; i < 12; i++) { + seed[i] = BSWAP32(seed[i]); + } +#endif + + randombytes_init((unsigned char *)seed, NULL, 256); + + res = test_sqisign(msglen); + + if (res != 0) { printf("test failed for %s\n", argv[1]); } - return rc; + return res; } diff --git a/test/test_sqisign_prof.c b/test/test_sqisign_prof.c deleted file mode 100644 index 4112b5d..0000000 --- a/test/test_sqisign_prof.c +++ /dev/null @@ -1,102 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include -#include -#include -#include -#include -#include -#include - -// Some hardcoded vectors for profiling - -#if CRYPTO_PUBLICKEYBYTES == 64 -const unsigned char pk[] = {0x9C,0xD1,0x15,0x09,0x55,0x1D,0x64,0x17,0x07,0xA4,0xD8,0x96,0x58,0x60,0xCD,0x0F,0xD7,0x82,0xCC,0x1C,0x87,0x25,0xB5,0x42,0xC4,0xDC,0x78,0x5D,0xEE,0xCA,0x56,0x24,0x2E,0xC6,0x7D,0x92,0x45,0xCD,0x46,0x4B,0x83,0x85,0x54,0xD3,0xA7,0xFA,0x4F,0x1D,0x90,0xC1,0x47,0x36,0xF8,0x24,0x4E,0x21,0x1D,0x6E,0x31,0xBD,0xB9,0x8D,0x50,0x0C}; -const unsigned char sk[] = {0x9C,0xD1,0x15,0x09,0x55,0x1D,0x64,0x17,0x07,0xA4,0xD8,0x96,0x58,0x60,0xCD,0x0F,0xD7,0x82,0xCC,0x1C,0x87,0x25,0xB5,0x42,0xC4,0xDC,0x78,0x5D,0xEE,0xCA,0x56,0x24,0x2E,0xC6,0x7D,0x92,0x45,0xCD,0x46,0x4B,0x83,0x85,0x54,0xD3,0xA7,0xFA,0x4F,0x1D,0x90,0xC1,0x47,0x36,0xF8,0x24,0x4E,0x21,0x1D,0x6E,0x31,0xBD,0xB9,0x8D,0x50,0x0C,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAF,0x71,0x87,0xCD,0xA3,0x13,0xF3,0x7F,0xF9,0xF3,0xFD,0xAB,0xC6,0x25,0x48,0xF9,0x69,0xF2,0x5C,0xAB,0x3B,0xF9,0xAD,0x2C,0x79,0x07,0x22,0x7C,0xA6,0xAD,0x10,0xF3,0x64,0x9A,0xD7,0xF3,0x68,0xB6,0xCD,0x97,0xD7,0x6F,0xF5,0x67,0x29,0xE9,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFA,0xB3,0x43,0xC8,0x0E,0xF4,0x16,0xB8,0xBE,0x87,0x4E,0x2F,0x6D,0x2D,0xA7,0x38,0x00,0x81,0x24,0x17,0x38,0x44,0xDB,0x60,0x19,0xB7,0xB8,0x23,0xC4,0x9E,0xB7,0xD1,0x1B,0x46,0x6C,0x99,0xDC,0xCD,0xF9,0xBD,0x34,0x1F,0x73,0x0E,0x92,0x32,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0x8D,0x38,0xC1,0x1F,0xF3,0xB5,0x0E,0x8B,0xED,0x00,0x09,0x48,0xC0,0x60,0x4D,0x63,0xCB,0xC8,0x94,0x3C,0xAD,0x5A,0x0F,0xCD,0x1A,0xBF,0x81,0x30,0x81,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xC9,0x2E,0x58,0x2C,0xC3,0x50,0x79,0xFA,0x93,0x64,0x3B,0x1F,0x12,0xB3,0xF0,0x86,0x43,0xF6,0xBB,0xAA,0x1B,0xB4,0x3E,0xBB,0x60,0x1D,0x25,0x4D,0x03,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8E,0xF4,0xD1,0x0A,0x6D,0x33,0x6B,0x5F,0x52,0xCD,0x54,0x9A,0x2E,0x38,0x48,0xD1,0xDA,0xE6,0xDF,0x6D,0x25,0x78,0x1D,0x0F,0x22,0x06,0x23,0x25,0xD7,0xB5,0xCA,0x17,0x00,0xF2,0xDC,0xC3,0x7B,0x1C,0x21,0x2B,0x00,0x3D,0xD8,0x58,0x66,0x36,0xBE,0x3A,0x87,0x89,0xA4,0x05,0x11,0x67,0x93,0xCA,0xBE,0x12,0xD7,0xE5,0xB2,0x6B,0xCC,0x21,0x7C,0x1D,0x15,0x74,0x80,0x36,0xC1,0x80,0x65,0xAD,0x55,0x16,0x20,0xEF,0xA2,0x34,0xF6,0x54,0x76,0xEE,0x48,0xC3,0xA5,0x04,0x81,0x18,0x96,0x63,0x36,0x3D,0x44,0x11,0xE7,0xED,0xD0,0xB9,0xBA,0xC2,0xC9,0x3B,0xD5,0xB3,0x49,0x40,0x96,0xB7,0xD0,0xEF,0xF8,0xF1,0xF3,0xE3,0x48,0x1F,0x38,0x69,0xBB,0xBB,0x51,0xE2,0x4B,0x16,0x1C,0x24,0x20,0x12,0xF7,0x9E,0x4A,0x62,0x50,0xFE,0x4C,0xD6,0x69,0x9D,0x7E,0x38,0x24,0xD3,0x5E,0x48,0x47,0xE7,0x43,0xA0,0x7B,0x09,0x14,0x04,0xA6,0xBD,0x71,0xD7,0x5D,0x2D,0x7D,0x09,0x62,0xC9,0xF5,0x1B,0x1C,0xFE,0x30,0x0A,0xA1,0xFA,0xD4,0xC0,0x13,0x1E,0x69,0x06,0x6D,0x83,0x2E,0x3D,0x5E,0x46,0x20,0x30,0xDD,0x90,0xE7,0xD2,0x5A,0x28,0x19,0x07,0x47,0x5E,0x62,0xA3,0xDE,0x15,0x71,0xCA,0x21,0x57,0xC7,0x1E,0xE3,0x7F,0xC1,0x94,0x5A,0x84,0x04,0x08,0xE6,0xC6,0xDB,0x4C,0x4D,0x50,0x6A,0x27,0xEB,0x24,0xEF,0x8E,0x23,0x96,0x66,0xA6,0x63,0xF6,0x33,0xA6,0xF7,0x66,0xDF,0xE1,0x27,0xB3,0x27,0x80,0xAF,0xC0,0x6E,0x2E,0x5A,0x86,0xD8,0x6F,0xB9,0xA2,0x53,0xDD,0xD5,0x31,0xA3,0x8E,0x64,0x16,0xE4,0xFD,0x5F,0x12,0x39,0x99,0x57,0xCC,0x87,0x29,0x24,0x6C,0xB1,0xD5,0xD5,0x72,0x19,0xA5,0xAA,0x35,0xBE,0x69,0xA8,0x21,0x33,0x8D,0x0D,0x14,0xE5,0xAA,0x83,0xE6,0x3F,0x84,0x3C,0x0E,0x5C,0x4F,0xAB,0x40,0xFB,0xAB,0x31,0x5D,0x01,0x9A,0xDC,0x0D,0x29,0xA2,0x7B,0xB5,0xD9,0x8E,0x39,0x77,0xC5,0x16,0x31,0x0A,0xE2,0x1D,0x41,0xBD,0x0D,0xAC,0xCC,0x99,0x40,0xA4,0xCF,0x2A,0x36,0x33,0xE5,0x3A,0xF5,0x34,0xA7,0xA4,0x6E,0xA3,0x9A,0x2D,0x75,0xAB,0xBB,0x41,0x70,0xA3,0x99,0x0F,0xCD,0xA5,0xF7,0x97,0x91,0x85,0x25,0x2A,0xAB,0x38,0xA9,0x27,0x08,0x6D,0xFD,0x3C,0x0C,0x96,0x04,0x0F,0xA6,0xA8,0xC8,0x77,0x69,0xD6,0xDF,0xD4,0xBC,0x47,0xBE,0x0D,0x38,0x37,0x2C,0xE5,0x9B,0xCD,0x4C,0xDD,0xE3,0x24,0xDA,0x73,0x17,0x65,0xEB,0x43,0x0F,0x85,0x84,0xD7,0x4D,0x83,0x98,0xC7,0x3C,0xB8,0x75,0x4E,0x91,0x8C,0x37,0x07,0x61,0x28,0xC2,0xC8,0x92,0x62,0xA1,0xA2,0xBE,0x43,0x62,0xCF,0xF1,0x95,0xD4,0xA2,0x76,0xBE,0x74,0x7E,0x57,0x27,0xFF,0x58,0xA7,0xFE,0xB0,0xB4,0xCF,0x24,0x7F,0x1B}; -const unsigned char sm[] = {0xB2,0x9C,0xA1,0x76,0x40,0xDD,0x8D,0x78,0xA0,0x01,0xD6,0xF9,0x9D,0x80,0x69,0x9D,0x24,0xDB,0xB1,0x04,0xDF,0xD7,0x05,0x6D,0xA5,0x6F,0x2D,0xBF,0xD7,0x04,0xF7,0x56,0x18,0xFC,0x79,0x6B,0xEA,0x04,0x0E,0x06,0x12,0x45,0x0C,0xB5,0x88,0x55,0x3B,0x93,0x65,0x02,0x1A,0x3E,0x7B,0xC1,0xD5,0xCB,0x83,0xC8,0x25,0x05,0x6C,0xC7,0xE8,0xB2,0x03,0x85,0xB1,0x69,0xBA,0x04,0x79,0xA1,0x58,0xDB,0x7F,0x6F,0xE2,0x29,0x28,0x00,0xAE,0xBE,0xED,0x83,0xCC,0x6F,0x77,0x5C,0x9D,0x02,0xFE,0x2F,0x3C,0xFC,0xFE,0x3A,0x78,0x9E,0x89,0x05,0x1B,0xBE,0x86,0xD0,0xE2,0x94,0xA2,0xE3,0xAE,0x04,0xF0,0xAE,0x5A,0xE4,0x81,0x8C,0x5F,0xEA,0x17,0x02,0x6F,0xC9,0x04,0xC8,0x70,0x7B,0x07,0x8C,0xD5,0x06,0x2C,0xBF,0xB0,0x01,0x9E,0x51,0x39,0xB8,0xE3,0x07,0x00,0x73,0x64,0x1A,0xF4,0x20,0x36,0x39,0xA9,0xE6,0x35,0xDD,0x31,0x2C,0x16,0x9C,0x5B,0x0A,0x00,0xC6,0x22,0x3B,0xC7,0x4D,0xE2,0x8D,0x76,0xF1,0x04,0x06,0x4E,0x28,0x00,0xA8,0xAC,0xF7,0x00,0xD8,0x1C,0x4D,0x8D,0x73,0x4F,0xCB,0xFB,0xEA,0xDE,0x3D,0x3F,0x8A,0x03,0x9F,0xAA,0x2A,0x2C,0x99,0x57,0xE8,0x35,0xAD,0x55,0xB2,0x2E,0x75,0xBF,0x57,0xBB,0x55,0x6A,0xC8}; -const unsigned char msg[] = {0xD8,0x1C,0x4D,0x8D,0x73,0x4F,0xCB,0xFB,0xEA,0xDE,0x3D,0x3F,0x8A,0x03,0x9F,0xAA,0x2A,0x2C,0x99,0x57,0xE8,0x35,0xAD,0x55,0xB2,0x2E,0x75,0xBF,0x57,0xBB,0x55,0x6A,0xC8}; -const unsigned long long mlen = 33; -#elif CRYPTO_PUBLICKEYBYTES == 96 -const unsigned char pk[] = {0xC5,0xCD,0x57,0x1D,0xF8,0x66,0x30,0xA9,0x3C,0x72,0xB4,0x15,0x95,0xD1,0xFC,0x20,0xD2,0x58,0x09,0x55,0x88,0xCB,0x64,0x09,0xFE,0xA9,0xA4,0xE1,0x83,0xB8,0x66,0xC7,0x7D,0x2F,0x42,0x3A,0x75,0x59,0xFB,0x3D,0x6E,0x1A,0xDF,0x06,0x04,0xB3,0x68,0x02,0xDD,0xC5,0xC9,0x42,0x0E,0x8E,0xC5,0x5D,0x54,0x7F,0xB0,0x2B,0x83,0x34,0x6D,0xC9,0xCC,0x18,0x57,0xEB,0x58,0x9E,0xE9,0x4E,0x66,0x6B,0x37,0xD8,0xC5,0xF2,0xDF,0x6B,0xBB,0xD3,0xEA,0xE8,0xE2,0x80,0x78,0xD5,0x46,0x59,0x76,0x5E,0x2F,0xCF,0xCD,0x00}; -const unsigned char sk[] = {0xC5,0xCD,0x57,0x1D,0xF8,0x66,0x30,0xA9,0x3C,0x72,0xB4,0x15,0x95,0xD1,0xFC,0x20,0xD2,0x58,0x09,0x55,0x88,0xCB,0x64,0x09,0xFE,0xA9,0xA4,0xE1,0x83,0xB8,0x66,0xC7,0x7D,0x2F,0x42,0x3A,0x75,0x59,0xFB,0x3D,0x6E,0x1A,0xDF,0x06,0x04,0xB3,0x68,0x02,0xDD,0xC5,0xC9,0x42,0x0E,0x8E,0xC5,0x5D,0x54,0x7F,0xB0,0x2B,0x83,0x34,0x6D,0xC9,0xCC,0x18,0x57,0xEB,0x58,0x9E,0xE9,0x4E,0x66,0x6B,0x37,0xD8,0xC5,0xF2,0xDF,0x6B,0xBB,0xD3,0xEA,0xE8,0xE2,0x80,0x78,0xD5,0x46,0x59,0x76,0x5E,0x2F,0xCF,0xCD,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA6,0x25,0xA3,0xE9,0x72,0x58,0x8F,0xA8,0x1D,0xF7,0x63,0x37,0x83,0xA0,0x7C,0x17,0x06,0x82,0x14,0x32,0xC9,0x75,0xD2,0x7F,0x15,0xA3,0x4F,0xA6,0x7B,0x9D,0x22,0x5A,0xDA,0xCE,0xD4,0xDE,0x4B,0x43,0xD8,0xFC,0x47,0xCE,0x7D,0x27,0xED,0x46,0x91,0x5D,0x23,0xB7,0xC4,0x24,0x09,0x7C,0x49,0xDA,0xF3,0x08,0x3D,0x63,0x80,0x19,0xA4,0x08,0xE2,0x60,0x0D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x08,0x56,0xD9,0x6E,0xDE,0x15,0xB6,0x89,0xCE,0x0A,0xAC,0x09,0xEB,0xD7,0x57,0x79,0xA4,0xC3,0xE7,0x81,0x6D,0x66,0x39,0x2E,0xF0,0x0A,0xCA,0x5A,0x17,0x4C,0x39,0x1A,0xBB,0x6D,0xF1,0x70,0x6D,0x1A,0xCE,0x4E,0xC4,0x56,0xC7,0x17,0x03,0xE7,0x33,0x45,0x8A,0x34,0xE4,0xA6,0x5E,0xE8,0xBD,0x4A,0x59,0x0E,0x8F,0xB7,0x6B,0xDC,0x3F,0xA5,0x1A,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x1F,0x15,0xE0,0x2A,0xF5,0xA3,0x79,0x65,0x77,0xD5,0x10,0x00,0xD0,0xAE,0xDA,0xAD,0x34,0x4F,0xB7,0xBD,0x70,0xCE,0x10,0x69,0x0A,0x93,0xBF,0xE3,0xEB,0xFE,0x10,0x66,0xB1,0x7B,0x6B,0x9F,0x8B,0x19,0x76,0xEC,0x07,0x4A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD6,0x0B,0x88,0x66,0xD7,0xE3,0x4F,0x7D,0xC0,0x7F,0xD5,0xB3,0x84,0xEA,0x6C,0xDA,0xD7,0xE5,0xC3,0x3C,0xAC,0x15,0xB2,0x03,0x5B,0xB1,0x1F,0x6B,0x63,0x7C,0x4B,0x61,0xC0,0xC1,0x9B,0xF3,0xC2,0xBB,0xD7,0x2A,0x14,0x1F,0xDC,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,0x50,0x94,0x18,0xE5,0xDA,0xBD,0x77,0x87,0xAF,0x06,0xC1,0x41,0x85,0x3A,0x09,0x7D,0xBC,0x38,0x49,0x98,0xA7,0x71,0x36,0xB9,0x94,0x4C,0x83,0x98,0xB0,0x9C,0x49,0x58,0x70,0x37,0xD8,0x99,0x9B,0x47,0xA5,0x76,0x22,0xEA,0xF2,0x3A,0xDF,0x63,0x4F,0x01,0x14,0x2E,0xA3,0x26,0x36,0x17,0x90,0x4D,0xD6,0x1C,0xA2,0x9F,0x8C,0x0A,0xE5,0x47,0x14,0x3E,0x5A,0x59,0xF4,0x35,0x7E,0xBE,0x87,0xE5,0xC6,0x7A,0x3F,0xE2,0x8F,0x49,0xAC,0x8B,0xC6,0x1C,0xE6,0x93,0x8A,0x29,0x76,0x08,0x85,0x58,0xAD,0x7E,0xFA,0x02,0x5B,0xFC,0x8F,0xB9,0x40,0x46,0x58,0x00,0xFB,0x71,0xD1,0x34,0x70,0x90,0xAD,0x23,0xEE,0xC7,0xF1,0x9B,0x60,0x99,0xC5,0xCF,0xC3,0x07,0xF2,0x71,0xE3,0x58,0x30,0xA7,0x20,0x81,0xFD,0xDF,0x66,0xE6,0x5C,0x39,0x8B,0x68,0x44,0xD2,0x00,0x8D,0xFF,0x02,0xBC,0x76,0x0C,0xD8,0x96,0x16,0x96,0xC1,0xC7,0x53,0x86,0xB5,0x2F,0x81,0x4D,0x0B,0x1C,0xBE,0x51,0x01,0xAA,0x66,0x8E,0x9E,0x0F,0x8C,0xDB,0xB8,0x51,0x5F,0xC4,0x43,0xCB,0x82,0x64,0x7F,0xDE,0x4D,0xCD,0x0C,0xDF,0x7F,0x59,0xE6,0xA3,0x76,0x9B,0x01,0x78,0xF1,0x32,0x76,0x84,0x44,0x5B,0x4C,0x4C,0xFC,0xD1,0x15,0xDA,0x53,0xDA,0x7B,0xE2,0x9A,0x03,0xFB,0x45,0x4A,0x61,0xDF,0x6C,0x40,0x62,0xE2,0x49,0xF6,0xB4,0x49,0xDE,0x28,0xC1,0x28,0xCF,0x03,0xF1,0x5B,0x2B,0x0A,0x50,0xDB,0xBB,0x1D,0x88,0x02,0x10,0x6C,0x70,0x86,0x57,0x0F,0x99,0xC3,0x84,0xEB,0x11,0x5D,0xB6,0xC6,0x1C,0x70,0xCD,0xBD,0xC6,0x8C,0xCA,0x2D,0x8C,0xA3,0xE0,0xBB,0x0E,0xD7,0x11,0x22,0x4F,0x33,0x6F,0xDB,0x39,0x6E,0xAA,0x9D,0xEC,0xD1,0xF4,0xAD,0xF7,0xB4,0xE7,0x1C,0x08,0x00,0x38,0x62,0xE5,0x99,0x8B,0x4E,0x64,0x17,0xE9,0xB9,0xE8,0xD1,0xBA,0xAA,0x8C,0x9D,0x57,0xD9,0x22,0xD5,0x2B,0xFC,0x7B,0x86,0x59,0x33,0xE3,0x15,0xF3,0x53,0x67,0xA1,0x6A,0x6C,0xA8,0x47,0x47,0x37,0x3F,0xF1,0xF3,0x43,0xEF,0xC2,0x50,0xE6,0xE3,0x01,0x0A,0x3A,0x30,0x3E,0x4C,0x74,0x68,0xD7,0xCD,0x5A,0x44,0x73,0xE2,0xD8,0x9D,0x86,0x80,0x27,0xB2,0x0F,0xF8,0xA6,0x5F,0xC2,0x8E,0x56,0x3B,0x1F,0x90,0x83,0xBB,0xF8,0xAD,0xC8,0xA2,0x55,0x87,0xAC,0x84,0x64,0xA9,0xCF,0x2A,0x30,0x64,0x15,0x56,0x00,0x49,0x5A,0xDE,0x62,0x54,0x2A,0x87,0x8A,0x3B,0x51,0xE7,0x5B,0xA0,0x24,0x46,0x79,0x13,0x2F,0xCD,0x7C,0x22,0x3B,0x3C,0x52,0x29,0x2A,0x24,0x2C,0x0F,0x83,0x47,0x49,0xB3,0x0F,0x0F,0xD7,0xC8,0x82,0xF1,0x48,0x22,0xD7,0x13,0xF8,0x7F,0xF2,0x4D,0x01,0xA2,0x17,0x89,0x9B,0xD7,0xC7,0x1D,0x24,0xDD,0xA2,0xAD,0x2E,0x30,0x7A,0xCF,0x65,0x09,0x78,0x82,0xD6,0x7D,0xE5,0x56,0xBB,0xFB,0x89,0xDD,0x32,0x91,0x55,0xB8,0xDA,0x34,0xE7,0xF7,0x6E,0x8C,0x7D,0xF7,0x85,0x0D,0x0F,0x8F,0x0D,0xE6,0x67,0xC5,0x03,0xEF,0x71,0x08,0x25,0xA9,0xE7,0x0D,0x2B,0xCF,0x08,0xA2,0x30,0x8F,0x2B,0x13,0xDE,0xE2,0x44,0x7A,0xE1,0xE8,0x22,0x99,0xA8,0xE2,0xDD,0x7D,0x1F,0xE8,0x32,0x6A,0x87,0x52,0xFF,0xCD,0xB6,0x3F,0xD2,0x65,0xCA,0xDE,0xF4,0xC3,0x60,0x11,0x98,0x7D,0x00,0x54,0x33,0x09,0xDA,0x51,0xAC,0x69,0x8E,0x8E,0xFA,0x3C,0x9E,0x4C,0x42,0x5E,0xB7,0xD2,0x8F,0x6E,0x89,0x09,0x07,0x14,0x53,0x01,0x9C,0xB5,0xF1,0x5F,0x0F,0xE1,0x15,0x2E,0x56,0x5E,0x94,0xB4,0x8E,0x35,0x12,0x9D,0x68,0x4C,0x72,0xAF,0x23,0x51,0x01,0x08,0x81,0xE4,0xCA,0x2F,0xB8,0x63,0x95,0x94,0x90,0x73,0x7D,0xF9,0x6A,0x3A,0xF8,0x51,0x23,0xCC,0x5F,0x91,0x8B,0xA0,0x9B,0x35,0x38,0xC2,0x5F,0x8F,0x18,0x6B,0x1D,0x29,0xA3,0x3E,0x2B,0x24,0xD3,0x20,0x41,0x1D,0x42,0xE3,0x8A,0x79,0xC4,0xDD,0x00,0x09,0x33,0x53,0x3C,0xBF,0xA2,0xEC,0x69,0x70,0xE8,0xE2,0x3E,0xB5,0xE4,0xBE,0x7C,0xAA,0x3C,0x06,0xE4,0x35,0x08,0xF0,0xA8,0xF4,0xD1,0xB6,0x37,0x4D,0x3F,0x76,0x22,0xB1,0x64,0x91,0x8A,0x85,0xE8,0x1D,0x90,0xB2,0x3A,0x72,0x13,0xEF,0x53,0x25,0x02}; -const unsigned char sm[] = {0x30,0x6C,0xE5,0xF3,0x2F,0x45,0x82,0xC3,0x50,0x0A,0xF2,0x62,0x01,0x55,0xD3,0xE3,0x71,0xA3,0xF8,0xF8,0xE9,0x7F,0xC2,0xB1,0x22,0x01,0xEF,0x74,0x1C,0x2E,0xDB,0x2A,0xA4,0x06,0xE7,0xE8,0xE5,0x50,0x00,0x16,0x6D,0x17,0x79,0x12,0x3B,0xBD,0xA1,0xEA,0xC9,0x4E,0x37,0x01,0x5C,0xA5,0xA4,0xEB,0xFF,0x19,0xE4,0xC1,0xA4,0xBF,0x97,0x30,0x01,0xB5,0x1F,0x41,0x47,0x5C,0x42,0x45,0x88,0x83,0xDC,0xF7,0x0C,0x00,0x0F,0xD5,0x0A,0x8A,0x81,0x7E,0x14,0xEC,0xD7,0xD1,0x9C,0x53,0x01,0xF2,0xC0,0x58,0x9E,0x87,0xA2,0x26,0xD1,0x25,0x4C,0x3C,0xB2,0x00,0x9E,0xBF,0x2C,0x4A,0xE9,0x90,0x0B,0xA1,0x51,0xFE,0xB4,0x79,0x00,0x5B,0x2C,0xBB,0xE9,0x30,0x71,0xBB,0x4E,0x3F,0xAC,0x2B,0x3C,0x01,0xE7,0x50,0x29,0x4D,0x05,0xCC,0x03,0xDA,0x2E,0xC8,0xF2,0x0F,0x00,0x13,0xE0,0x28,0xCA,0xC0,0x64,0x88,0xDD,0xD5,0xBE,0xF3,0xBD,0x00,0x5D,0xA9,0xBA,0x82,0xD8,0xF2,0xA2,0x14,0xE0,0x87,0x84,0x4C,0x00,0x65,0x80,0x66,0xAA,0x9B,0x23,0x8B,0x33,0x9B,0x36,0x55,0x6B,0x01,0x5F,0x87,0x87,0xBE,0x49,0x32,0xE2,0x8B,0x70,0xEF,0x69,0x47,0x00,0x1A,0xF5,0xC0,0xDF,0x52,0xE4,0x13,0x21,0x86,0x2E,0x81,0x36,0x00,0x00,0x69,0x01,0x8C,0x3F,0xEB,0x9F,0xAC,0x4D,0xCF,0x6F,0x4B,0x85,0x2C,0x8D,0x42,0xF7,0xA6,0xF0,0xB8,0xA6,0x22,0xFE,0xBC,0x42,0x22,0x00,0x01,0xB0,0x74,0x5E,0x9F,0x8D,0x6E,0x8A,0x54,0xCE,0x67,0x03,0x08,0x01,0xF5,0x6F,0xA9,0xFE,0x51,0xB5,0x12,0xAF,0x06,0xFC,0x50,0xF9,0xEC,0x0A,0xD8,0x1C,0x4D,0x8D,0x73,0x4F,0xCB,0xFB,0xEA,0xDE,0x3D,0x3F,0x8A,0x03,0x9F,0xAA,0x2A,0x2C,0x99,0x57,0xE8,0x35,0xAD,0x55,0xB2,0x2E,0x75,0xBF,0x57,0xBB,0x55,0x6A,0xC8}; -const unsigned char msg[] = {0xD8,0x1C,0x4D,0x8D,0x73,0x4F,0xCB,0xFB,0xEA,0xDE,0x3D,0x3F,0x8A,0x03,0x9F,0xAA,0x2A,0x2C,0x99,0x57,0xE8,0x35,0xAD,0x55,0xB2,0x2E,0x75,0xBF,0x57,0xBB,0x55,0x6A,0xC8}; -const unsigned long long mlen = 33; -#elif CRYPTO_PUBLICKEYBYTES == 128 -const unsigned char pk[] = {0x6A,0x93,0x02,0xB5,0x1F,0x65,0xAC,0x67,0xC5,0x74,0xA0,0x5E,0x95,0x98,0x60,0x4D,0x95,0xAA,0x6E,0x3C,0x61,0xB9,0x3C,0xBA,0x98,0xEE,0xFE,0x80,0x89,0x05,0x65,0x2D,0x43,0x93,0x3D,0xC0,0xEC,0xEF,0x7B,0xE2,0x67,0x37,0x3E,0xB1,0xAC,0x61,0xD4,0xA9,0x11,0x38,0xD2,0x35,0xF7,0xBA,0x19,0xDD,0x12,0xE5,0x5F,0x48,0xD6,0xFE,0x1E,0x00,0x0A,0xAC,0xB9,0x0A,0xB4,0xFF,0xC3,0xD9,0x0D,0x79,0x3F,0x2A,0x12,0x91,0xDC,0x63,0x8F,0x80,0x28,0xE3,0x1F,0x7D,0xA9,0xFE,0x49,0x76,0x71,0xDB,0x2D,0xBA,0xC7,0x89,0x48,0x6A,0x61,0xC9,0x4B,0xCB,0xE9,0xA8,0xDD,0xD7,0x86,0x70,0x95,0x5C,0xFC,0x3A,0x10,0x4D,0x21,0x41,0x18,0x89,0x12,0x5A,0x96,0x68,0x59,0x1B,0x16,0xD4,0x04,0x00}; -const unsigned char sk[] = {0x6A,0x93,0x02,0xB5,0x1F,0x65,0xAC,0x67,0xC5,0x74,0xA0,0x5E,0x95,0x98,0x60,0x4D,0x95,0xAA,0x6E,0x3C,0x61,0xB9,0x3C,0xBA,0x98,0xEE,0xFE,0x80,0x89,0x05,0x65,0x2D,0x43,0x93,0x3D,0xC0,0xEC,0xEF,0x7B,0xE2,0x67,0x37,0x3E,0xB1,0xAC,0x61,0xD4,0xA9,0x11,0x38,0xD2,0x35,0xF7,0xBA,0x19,0xDD,0x12,0xE5,0x5F,0x48,0xD6,0xFE,0x1E,0x00,0x0A,0xAC,0xB9,0x0A,0xB4,0xFF,0xC3,0xD9,0x0D,0x79,0x3F,0x2A,0x12,0x91,0xDC,0x63,0x8F,0x80,0x28,0xE3,0x1F,0x7D,0xA9,0xFE,0x49,0x76,0x71,0xDB,0x2D,0xBA,0xC7,0x89,0x48,0x6A,0x61,0xC9,0x4B,0xCB,0xE9,0xA8,0xDD,0xD7,0x86,0x70,0x95,0x5C,0xFC,0x3A,0x10,0x4D,0x21,0x41,0x18,0x89,0x12,0x5A,0x96,0x68,0x59,0x1B,0x16,0xD4,0x04,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0xCB,0x52,0xB5,0x61,0x25,0x56,0xF9,0x2A,0x5E,0x3D,0x5D,0xBF,0x4D,0xF3,0x3E,0xA4,0xB3,0x78,0x5A,0x6A,0xA6,0xF7,0xDA,0xF7,0x9F,0x5C,0x5F,0xC8,0x63,0x27,0x5D,0x2F,0xBC,0xFE,0x4A,0x88,0x32,0x3B,0x0F,0x24,0xF8,0x48,0x0C,0x93,0x8F,0xA7,0xDD,0x40,0x3F,0xDA,0x74,0xF7,0x86,0x4F,0x3A,0x3E,0xE6,0xF7,0x87,0x05,0x12,0x78,0xB5,0xFD,0x7E,0x2E,0xF1,0xA9,0xC4,0xD6,0x4C,0x8B,0x5F,0x8A,0x9A,0x99,0x09,0x6A,0x1E,0xF1,0x68,0x32,0x6C,0xE8,0xE1,0x12,0x21,0x44,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC3,0x39,0xA9,0xC8,0x3E,0xB9,0x6D,0x9C,0xC2,0xD7,0x7A,0xE8,0x33,0xB3,0x01,0x26,0x7C,0x3E,0x8E,0x59,0x2C,0x19,0x65,0x92,0x35,0x84,0xF9,0x50,0x04,0x95,0x2E,0x69,0xD6,0x34,0x30,0x5E,0x4F,0x50,0xCE,0x7F,0xBD,0x89,0xE4,0x93,0x18,0x98,0x6B,0x0F,0x1F,0xA1,0xDB,0xBA,0xE1,0x7C,0x59,0x22,0x29,0x87,0x00,0x8A,0x1F,0x67,0x94,0x27,0xDA,0x64,0x5B,0xFC,0xE9,0x00,0x6C,0x68,0x15,0xE1,0x90,0x38,0xE6,0x10,0x3B,0x81,0x13,0xC2,0x58,0x7D,0xD4,0x21,0x15,0x32,0x91,0xE8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDB,0xE8,0xB4,0x7E,0xF0,0x4B,0x4E,0x0C,0x60,0x64,0x91,0x4B,0x85,0x8D,0xAC,0x47,0x56,0xAA,0x2C,0x89,0xD6,0x28,0xFD,0x56,0xAA,0x84,0xDD,0xBB,0xDD,0x33,0xB7,0xA8,0x48,0x5E,0xAA,0x43,0x6B,0x20,0x1A,0xFC,0x1B,0x9F,0x8A,0xEB,0xDE,0x42,0xD3,0xD8,0x96,0x20,0xB0,0x3D,0xC4,0x30,0x81,0x91,0xED,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x9F,0xA7,0xFA,0xCE,0xC9,0x8A,0xC6,0xFB,0x9E,0x4E,0x6A,0x3B,0x49,0xC4,0x4E,0xB8,0x29,0x29,0x61,0x5C,0xBA,0x18,0xD3,0xEF,0x33,0x51,0xE0,0xDA,0x72,0x0E,0xCB,0x37,0x6E,0xE1,0x4A,0x5E,0x86,0x88,0xB5,0x76,0x5E,0x24,0x1D,0xD1,0xC0,0x8A,0xC7,0x60,0x8D,0xCA,0x19,0xFB,0xB2,0x6B,0x58,0x9C,0x42,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA7,0x8B,0x0B,0xD3,0xAE,0x6D,0xBE,0x94,0x79,0x68,0x7E,0x49,0x6A,0x2F,0x81,0x52,0x79,0x1D,0xFD,0x83,0x4E,0xE2,0x59,0xEA,0x6A,0xE9,0x46,0xFE,0x37,0x2A,0xD2,0x82,0xA4,0xCA,0xCF,0x7B,0x22,0x13,0xBC,0x3D,0x86,0x1D,0x57,0x8E,0x89,0xE4,0x15,0xFD,0xF0,0x72,0x42,0x02,0x29,0x47,0x29,0x45,0xF2,0x03,0x6D,0x07,0x23,0xE4,0x23,0x00,0x66,0x7E,0x8A,0xA1,0xD7,0x6A,0x14,0x20,0x5A,0xAA,0x1D,0x62,0x18,0xCC,0x6C,0xD6,0x77,0x50,0x92,0xFB,0x13,0x66,0x80,0x42,0x84,0xC1,0x15,0x57,0x1E,0xAD,0x08,0x8E,0xAB,0xC5,0x3F,0xA7,0xA8,0x05,0x90,0x1F,0x97,0x9D,0x71,0x7F,0x0D,0xD8,0xF3,0x14,0x5B,0xCB,0xD1,0x71,0x2D,0xF5,0x03,0x9E,0xB4,0xED,0x56,0xCD,0xBD,0x53,0x04,0x00,0x45,0xFC,0x83,0x04,0x9C,0x31,0xB1,0x34,0x6A,0x7F,0xA5,0x4B,0x2D,0x82,0x00,0xE0,0x95,0xAA,0x80,0x89,0x2F,0xB9,0xA3,0x97,0xA6,0xE2,0x1B,0xCD,0x3C,0x66,0x21,0x33,0x1B,0x7E,0x56,0x0B,0xA4,0x6F,0x25,0xB0,0xB3,0x55,0x69,0x7F,0xF1,0x99,0x02,0xF1,0xB6,0xA1,0x9C,0x3C,0xC3,0x0E,0x58,0x3A,0x21,0x15,0xFB,0x5B,0x1C,0xBC,0x05,0x00,0x9A,0xB6,0x21,0x59,0x26,0xF0,0x90,0x69,0x5A,0x9D,0x14,0xB0,0xCC,0x49,0x53,0x82,0x49,0xCE,0xF9,0x8A,0x79,0x47,0x1B,0xA4,0x1D,0xA0,0x45,0xCA,0xD2,0x7C,0x88,0xC8,0xFD,0x13,0x25,0x16,0x37,0x5F,0xAF,0xAD,0x91,0x13,0x76,0x11,0x75,0xF5,0x0F,0xA2,0x5E,0x1A,0x1C,0x47,0x3C,0xD3,0x3A,0xC8,0x43,0x26,0x8C,0x51,0x5E,0x25,0x20,0x00,0x11,0x70,0x1B,0x05,0x0A,0x20,0x1A,0x78,0x62,0x9D,0x43,0x43,0xBE,0x85,0x74,0x32,0x67,0x58,0x07,0x2C,0xBA,0xDA,0x17,0x14,0xA2,0x17,0x94,0x50,0x2A,0xE7,0x84,0x6A,0xF7,0x3F,0x1C,0x6B,0xD7,0x61,0x81,0x89,0xF6,0x8E,0xBE,0x5C,0x60,0x2E,0x44,0x67,0xDD,0x19,0xA7,0x75,0x13,0x01,0x99,0x38,0x10,0x3A,0x96,0x30,0xBC,0x0A,0x17,0x00,0x1E,0xBA,0x74,0x17,0xCC,0x5E,0x4F,0xAC,0x4A,0x5D,0xBD,0x52,0xAC,0x5A,0x22,0x63,0xBB,0x5F,0xF5,0x5F,0xE2,0xDA,0x2F,0x4E,0x6D,0xC4,0xB3,0xE9,0x24,0x46,0x9F,0x33,0x45,0x63,0xB2,0x4C,0x5F,0xF0,0xC5,0x20,0x7A,0x57,0xA6,0xF2,0x69,0x88,0x46,0x9B,0x09,0xD4,0xBD,0x75,0x83,0xA3,0xB1,0x36,0x95,0xB7,0x9A,0xCC,0x75,0xDE,0x09,0x00,0xC6,0x16,0xAA,0xC1,0x53,0x2A,0x88,0xD9,0x61,0xA1,0x70,0x29,0xE8,0xD5,0x1E,0xB6,0x6A,0x64,0x31,0x41,0x1B,0xA3,0x83,0x6F,0xF7,0x75,0x27,0x75,0xF4,0xCE,0xB1,0x41,0xAA,0x99,0x0E,0xDD,0xA2,0xCC,0x84,0x30,0x16,0x5D,0x27,0x21,0x6A,0x40,0x62,0x48,0xAA,0x94,0x6A,0x17,0xDF,0x85,0x06,0xDE,0x49,0xC4,0xF6,0x15,0x56,0xD2,0x21,0x00,0x79,0x52,0xC2,0x4E,0x3F,0xAC,0x50,0xCD,0x59,0x04,0x36,0x6B,0x4B,0x6B,0xA5,0x7E,0x17,0xC5,0xF1,0xCA,0x5E,0x31,0x37,0x50,0xCE,0x09,0x1D,0xF1,0x6B,0xEE,0x1C,0x3C,0xA5,0x99,0x8B,0xE1,0xBD,0x26,0xE2,0x68,0x79,0x38,0x31,0x2B,0xCC,0xD3,0x01,0xFB,0xA2,0x71,0x6E,0xB9,0x31,0x71,0x53,0x65,0x19,0x9A,0xA0,0xE0,0x73,0xB0,0x04,0x00,0x85,0xF5,0xA3,0x51,0xDE,0x09,0xC6,0xE4,0x74,0xF3,0x1A,0x90,0xBB,0x35,0xE8,0x2A,0xD3,0xCB,0x80,0x2C,0x86,0x30,0xD8,0x74,0xE0,0x70,0x9D,0xD6,0x63,0x22,0x9C,0xC6,0x6E,0xCA,0x49,0x7E,0x33,0x2B,0x56,0xAB,0xAA,0x96,0xB1,0xD7,0x02,0x64,0xFF,0xF1,0xEC,0x0A,0xF6,0x69,0x1E,0x60,0x0B,0xB6,0x1F,0x75,0x6E,0x78,0xE0,0x76,0x0D,0x00,0x0E,0x0E,0x36,0x04,0x04,0x7C,0x33,0x89,0x8F,0xC3,0x92,0xEF,0x55,0x03,0x30,0xF6,0x4C,0x40,0x08,0x57,0x96,0xEB,0x6E,0x8C,0x94,0x2F,0xDF,0xBE,0xC1,0xEB,0x86,0x7E,0x4B,0xCB,0x3D,0x65,0xF7,0x92,0xC4,0xE5,0x02,0x23,0xBB,0x3F,0x55,0xCE,0x81,0x9A,0xED,0xA9,0x7D,0xC4,0x83,0xB0,0x14,0xA2,0x2E,0xE5,0xC7,0x6D,0xA4,0xB8,0x13,0x00,0x84,0xAB,0x87,0xD6,0xFF,0xC5,0x9A,0xA0,0x7A,0x38,0x8E,0xA4,0xD0,0xF8,0x61,0x9D,0xD1,0x21,0x8A,0xF2,0xC3,0xDD,0xA9,0xBF,0x2F,0x0C,0x70,0x47,0x31,0x8B,0x64,0x8E,0xF0,0x80,0x1C,0x42,0x5D,0x47,0x6C,0xF3,0xB5,0x7F,0xE7,0xD6,0x5D,0x94,0x5D,0xA1,0xB4,0x4F,0xC1,0xE3,0x14,0xC9,0xFF,0x1C,0x42,0x9D,0x64,0x3E,0x2F,0x23,0x10,0x00,0x57,0xF1,0x12,0xB3,0xF5,0xEC,0x14,0x0F,0x7D,0x2E,0x15,0x08,0x6E,0x81,0xD0,0x8A,0x1B,0xD9,0x95,0x6C,0xCE,0xEC,0x69,0xA4,0x36,0x5D,0xAF,0x0A,0x63,0xA6,0x80,0x77,0xB4,0xEC,0xD9,0x11,0xC0,0x05,0x65,0x10,0xB4,0xB2,0xBC,0x92,0x45,0x9E,0x77,0xCF,0x7D,0xDD,0x63,0x22,0xC0,0xA9,0x12,0x82,0xAF,0x30,0x9A,0x1B,0xE0,0xE7,0x0E,0x00,0xA8,0xD4,0x22,0x94,0x17,0x36,0x34,0xD0,0x69,0x84,0x14,0x08,0xEE,0x4C,0x5C,0x3B,0x35,0xBE,0xE5,0x12,0xBC,0x56,0xCF,0x7C,0x41,0x8C,0xFF,0x86,0x17,0xC8,0x46,0x39,0xB0,0x3D,0x57,0xD0,0x29,0xC3,0xE8,0xD6,0x17,0xCF,0x19,0x82,0x46,0xE0,0xF5,0x13,0xDC,0x5E,0x66,0x7D,0x9B,0xCC,0x90,0xF2,0x0F,0x9F,0xB7,0x21,0x41,0xCC,0x0C,0x00,0x90,0xF2,0x4B,0xD2,0xA9,0x00,0xD2,0x5D,0x90,0x13,0xA3,0x70,0x19,0x1F,0xA8,0x8D,0x18,0xA1,0x3A,0x90,0xD1,0x34,0x46,0x88,0xD3,0xAB,0xE4,0x5D,0xE6,0xA6,0xC0,0x64,0x7F,0x92,0xDE,0x0E,0xF0,0x43,0x46,0x00,0x02,0x64,0xA5,0x46,0x34,0x54,0xF6,0x59,0xCC,0x41,0xD8,0x42,0x78,0x23,0x36,0x37,0x26,0x95,0x9A,0x96,0xD5,0x91,0x15,0x00}; -const unsigned char sm[] = {0xD3,0x3B,0xF0,0xF0,0x83,0xFF,0x80,0xC0,0x02,0x1E,0xBB,0x85,0xF0,0xAA,0x03,0x4D,0x1A,0x5F,0x00,0xFD,0xE6,0xB7,0x50,0x2C,0x9B,0x50,0x00,0x15,0xAD,0x7D,0x75,0x2B,0x3E,0x47,0xD2,0x4A,0x45,0x01,0xD4,0xAC,0x85,0x0B,0xB4,0x3C,0xA4,0xA9,0x85,0x76,0x6D,0x48,0x56,0x9D,0xD2,0x68,0x1C,0x51,0x00,0x09,0xF5,0x73,0xE2,0xD4,0x6A,0x85,0x89,0xE6,0x06,0x95,0x09,0x79,0x9D,0x16,0xC2,0xA4,0xF1,0x01,0xEE,0x26,0x0B,0x7B,0xE5,0x5D,0x11,0x1F,0x7E,0xA7,0x08,0x75,0xA9,0x1D,0x05,0xC4,0x8B,0x13,0x00,0x75,0xE4,0x61,0x77,0x99,0x1D,0x74,0x6C,0x20,0xC2,0xFB,0x27,0xF8,0x99,0xA9,0xD4,0x04,0x5A,0x01,0x64,0xC7,0x68,0x2B,0x46,0x5F,0x4A,0x7B,0x53,0xAD,0xF1,0xF1,0xF4,0xBC,0x91,0x9E,0xF0,0x3E,0x00,0x62,0x54,0xCC,0xF4,0x1B,0x5F,0x6D,0x67,0x8E,0x17,0x65,0x2C,0xD6,0x3E,0xA6,0xC1,0x83,0xF3,0x01,0xBC,0x58,0xFC,0x44,0xC2,0x4A,0x70,0x79,0x9F,0x3A,0xFF,0xF2,0xF6,0x29,0x70,0xBA,0x7E,0x6F,0x01,0xD0,0x5A,0x2A,0x85,0x83,0x68,0x5B,0x7C,0xD7,0x55,0x6E,0x46,0xC3,0x89,0x93,0x36,0x1E,0xA2,0x01,0x91,0x78,0x7E,0x26,0x07,0x81,0x05,0xC0,0xBD,0x3B,0x54,0x09,0xFF,0xDA,0x68,0x42,0x40,0x14,0x01,0x97,0x22,0x89,0x58,0xA0,0x75,0x00,0x09,0xD5,0x48,0x21,0x59,0xA4,0x53,0x58,0x59,0x4F,0xFF,0x01,0xE9,0x2C,0x17,0xD5,0xF6,0x47,0xB3,0xE2,0x70,0xA3,0xCD,0x06,0xCB,0x0E,0xCD,0x2B,0x53,0x18,0x00,0x86,0xAE,0xFA,0x2B,0x45,0x41,0xDA,0xDF,0x76,0x50,0xD1,0x17,0x45,0x55,0x4B,0x5E,0xA2,0x28,0x00,0x01,0x1B,0x9E,0xFD,0xCE,0xAB,0x91,0x43,0xF9,0xF6,0x27,0x9E,0x01,0xFF,0x54,0x17,0xA4,0x76,0x66,0x85,0x7B,0x98,0x59,0xD7,0x31,0x64,0x04,0xC0,0x24,0xBF,0x26,0x8A,0x88,0x08,0x03,0x41,0x5B,0x47,0x97,0xE9,0x69,0x08,0x8E,0xD5,0xB3,0x46,0x53,0x09,0xBD,0xA6,0xDC,0xBC,0x5F,0x00,0x7E,0xD0,0xA3,0x2B,0xA4,0x3A,0xFA,0xB0,0x51,0x47,0x2F,0x3F,0xF0,0x79,0x03,0xD8,0x1C,0x4D,0x8D,0x73,0x4F,0xCB,0xFB,0xEA,0xDE,0x3D,0x3F,0x8A,0x03,0x9F,0xAA,0x2A,0x2C,0x99,0x57,0xE8,0x35,0xAD,0x55,0xB2,0x2E,0x75,0xBF,0x57,0xBB,0x55,0x6A,0xC8}; -const unsigned char msg[] = {0xD8,0x1C,0x4D,0x8D,0x73,0x4F,0xCB,0xFB,0xEA,0xDE,0x3D,0x3F,0x8A,0x03,0x9F,0xAA,0x2A,0x2C,0x99,0x57,0xE8,0x35,0xAD,0x55,0xB2,0x2E,0x75,0xBF,0x57,0xBB,0x55,0x6A,0xC8}; -const unsigned long long mlen = 33; -#else -#error "Not supported" -#endif - -static int test_sqisign_keygen() { - int res = 0; - unsigned char *pk = calloc(CRYPTO_PUBLICKEYBYTES, 1); - unsigned char *sk = calloc(CRYPTO_SECRETKEYBYTES, 1); - - res = sqisign_keypair(pk, sk); - if (res != 0) { - res = -1; - } - - free(pk); - free(sk); - return 0; -} - -static int test_sqisign_sign(int mlen) { - int res = 0; - unsigned char *sig = calloc(CRYPTO_BYTES + mlen, 1); - unsigned long long smlen = CRYPTO_BYTES + mlen; - - res = sqisign_sign(sig, &smlen, msg, mlen, sk); - if (res != 0) { - res = -1; - } - - free(sig); - return res; -} - - -static int test_sqisign_open(int mlen) { - int res = 0; - unsigned long long msglen = mlen; - unsigned char *msg = calloc(mlen, 1); - - unsigned long long smlen = CRYPTO_BYTES + mlen; - - res = sqisign_open(msg, &msglen, sm, smlen, pk); - if (res != 0) { - res = -1; - } - - - free(msg); - return res; -} - - -int main(int argc, char *argv[]) { - int rc = 0; - - if (argc <= 1) { - printf("Usage: <0(keygen)/1(sign)/2(open)>\n"); - exit(0); - } - - int ar = atoi(argv[1]); - - if (ar == 0) - return test_sqisign_keygen(); - else if (ar == 1) - return test_sqisign_sign(mlen); - else if (ar == 2) - return test_sqisign_open(mlen); - - printf("Usage: <1(keygen)/2(sign)/3(open)>\n"); - return 0; -}